本文共 4841 字,大约阅读时间需要 16 分钟。
这阶段又学习了一下springmvc,做了一个简单的例子。放到下载里面,这样下次看的时候就方便多了。
1.Springmvc是spring的web框架围绕DispatcherServlet设计的。DispatchServlet的作用是将请求分发到不同的处理器。Spring的web框架可以包括可配置的处理器(Handlder)映射,视图(view)解析,本地化(local)解析,主题(theme)解析以及对文件上传的支持等。
2.springmvc的请求模式:
3.其实,每个MVC 框架的执行过程都是大同小异的;
①当一个request过来时,它通过一个servelet来响应request;
②再根据request的路径名和配置将这个request dispatch 给一个controller执行;
③最后将之返回配置文件里对应的页面。
在springmvc中,这个servelet的名字叫:Dispatchservlet
4.Spring的Controller是singleton的,或者是线程不安全的说明。
分析:和Struts一样,Spring的Controller是singleton的!这意味着每个request过来,系统都会用原来的instance去处理,这样就导致了两个结果:①我们不用每次创建Controller,减少了对象创建和垃圾回收的时间。②由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
这也是webworks吹嘘的地方,它的每个Action都是线程安全的。因为每过来一个request,它就会创建一个Action对象。由于现代JDK垃圾收集动能的效率已经不成问题了,所以这种创建完一个对象就扔掉的模式也得到很多人的认可。
5.
不错的文章可以参考:
6.转发与重定向
可以通过redirect/forward:url方式转到另一个Action进行连续的处理。
可以通过redirect:url 防止表单重复提交 。
写法如下:
return "forward:/order/add";
return "redirect:/index.jsp";
带参数重定向--RedirectAttributes
用户保存或修改后,为了防止用户刷新浏览器(F5)导致表单重复提交,一般在保存或修改操作之后会redirect到一个结果页面(不是forward),同时携带参数,如操作成功的提示信息。因为是Redirect,Request里的attribute不会传递过去。Spring在3.1才提供了这个能力--RedirectAttributes。 反复按F5,操作成功的提示信息也不会再次出来(总共只出现一次),效果很理想。
7.ajax-springmvc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /** 1.登陆 */ $( "#login" ).bind( "click" , function (){ console.log( "-------------begin.........." ); var url = basePath + "/user/login_1" ; var username = $( '#username' ).val(); var password = $( '#password' ).val(); $.ajax({ async : false , //修改为同步,默认是异步。同步时会锁定页面,异步不会锁定页面。 //type : "POST", //timeout : 10000,// 设置请求超时时间(毫秒)。此设置将覆盖全局设置。 url : url, //cache : false, dataType : "json" , //后台返回的数据格式,可以为text 也可以为json data : { "username" :$( '#username' ).val(), password:$( '#password' ).val()}, //key值可以加双引号也可以不加! success : function (data) { //console.log(" dataType:text时返回值为:" + data //+ ", result: " + data.result); //{"result":"ok"}, result: undefined console.log( " dataType:json时返回值为:" + data + ",result:" + data.result); //[object Object ],reuslt:ok }, error : function (data) { alert( "超时或者后台抛出异常了,此处都会收到的!" ); console.log( "data :" + data.result); } }); console.log( "end..异步处理时,没有等ajax返回值,就已经执行这句话了!.." ); console.log( "end..同步处理时,必须等ajax返回值,才执行这句话了!." ); }); |
说明:
1.IE下页面首次加载时调用了异步请求,而第二次加载页面时则不会调用异步请求(FireFox下正常), 上网查了一下是缓存的问题,在方法里面加上cache:false就行了。默认下是true。
2.ie下面只会建立一次 ajax 请求,将响应结果放在浏览器缓存里 下次调用该ajax请求时 从缓存里读取,火狐下面 每次激活事件 都会重新建立一次ajax请求,所以 ie 不能保证ajax数据的实时性 解决方式就是 cache:false
总结:
在IE下用Ajax请求某一页面,通常会因为缓存的原因而返回上一次的结果,造成混乱,
[即get方式时,获取数据,因发送参数和地址都一致,故IE浏览器会从缓存中取,而不会去请求服务器端, 而post方式因为参数的不同,不会产生这个问题]而FF下不会出现这种情况。为了不受缓存影响,可以这样做:
IE访问策略:Internet选项--浏览历史记录--设置-- Internet 临时文件的选项改为每次访问网页时也可以
1:
在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数,
在javascript发送的URL后加上t=Math.random()
例如这样:URL+"&"+"t="+Math.random();或者new Date();
2:
在 URL 参数后加上 "?timestamp=" + new Date().getTime();
最好的方法:
$.ajaxSetup({cache:false})
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $.ajaxSetup({ cache : false //, //global : false }); $( "#login1" ).bind( "click" , function (){ var url = basePath + "/user/login_1" ; $.get(url,{ "username" :$( '#username' ).val(), password:$( '#password' ).val() }, function (data){ alert( "result : " + data.result); console.log( "result : " + data.result); }); }); |
$("form").serialize()的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /** 1.登陆 */ $( "#login" ).bind( "click" , function (){ var url = basePath + "/user/login_2" ; console.log( "serialize: " + $( "form" ).serialize()); /** 默认设置下,所有请求均为异步请求。如果需要发送同步请求, 请将此选项设置为 false。 注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行 */ $.ajax({ async : false , //修改为同步 //type : "POST", url : url, cache : false , dataType : "json" , //后台返回的数据格式,可以为text 也可以为json data : $( "form" ).serialize() + "&" + "demo1=demo1&demo2=demo2" , //可以是$("form").serialize() + "&" + $("form1").serialize() success : function (data) { //console.log(" dataType:text时返回值为:" + data // + ", result: " + data.result); //{"result":"ok"}, result: undefined console.log( " dataType:json时返回值为:" + data + ",result:" + data.result); //[object Object ],reuslt:ok } }); }); |
1 2 3 4 5 6 7 | $.ajaxSetup({cache: false }); $( "#login1" ).bind( "click" , function (){ var url = basePath + "/user/login_2" ; $.get(url,$( "form" ).serialize(), function (data){ alert(data.result); }); }); |
8.注意:Map集合的使用,返回值,以及参数等都可以是用Map,利于扩展。
eg.当Map集合的key为一个对象时,我们应该如何去取值:
1 2 3 4 5 6 7 8 9 10 11 12 | Map<String, Object> map = new HashMap<String, Object>(); map.put( "key" , "xiweiyuan" ); User user = new User(); user.setUsername( "key" ); model.addAttribute( "user" , user); model.addAttribute( "map" , map); 取值: ${user.username } //key ${map[user.username]} //xiweiyuan |
Maven版本的例子可以在github上看到:https://github.com/windhan2100/windhan