且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

springmvc的学习

更新时间:2022-09-28 22:18:20

 这阶段又学习了一下springmvc,做了一个简单的例子。放到下载里面,这样下次看的时候就方便多了。

 

springmvc的学习

下载名称:springmvc_han


Springmvc3的简单学习

1.Springmvc是spring的web框架围绕DispatcherServlet设计的。DispatchServlet的作用是将请求分发到不同的处理器。Spring的web框架可以包括可配置的处理器(Handlder)映射,视图(view)解析,本地化(local)解析,主题(theme)解析以及对文件上传的支持等。

2.springmvc的请求模式:

springmvc的学习

3.其实,每个MVC 框架的执行过程都是大同小异的;

  ①当一个request过来时,它通过一个servelet来响应request

  ②再根据request的路径名和配置将这个request dispatch 给一个controller执行;

  ③最后将之返回配置文件里对应的页面。

springmvc中,这个servelet的名字叫:Dispatchservlet

 

 

4.SpringControllersingleton的,或者是线程不安全的说明。

 

分析:和Struts一样,SpringControllersingleton的!这意味着每个request过来,系统都会用原来的instance去处理,这样就导致了两个结果:①我们不用每次创建Controller,减少了对象创建和垃圾回收的时间。②由于只有一个Controllerinstance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。

 

这也是webworks吹嘘的地方,它的每个Action都是线程安全的。因为每过来一个request,它就会创建一个Action对象。由于现代JDK垃圾收集动能的效率已经不成问题了,所以这种创建完一个对象就扔掉的模式也得到很多人的认可。

 

5.

不错的文章可以参考:http://elf8848.iteye.com/blog/875830/ 

 

http://www.open-open.com/lib/view/open1338338587698.html 

 

http://www.iteye.com/blogs/subjects/kaitao-springmvc 

 

 

 

6.转发与重定向

可以通过redirect/forward:url方式转到另一个Action进行连续的处理。

可以通过redirect:url 防止表单重复提交 

写法如下:

return "forward:/order/add";

return "redirect:/index.jsp";

 

带参数重定向--RedirectAttributes

用户保存或修改后,为了防止用户刷新浏览器(F5)导致表单重复提交,一般在保存或修改操作之后会redirect到一个结果页面(不是forward),同时携带参数,如操作成功的提示信息。因为是RedirectRequest里的attribute不会传递过去。Spring3.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




     本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/1148050,如需转载请自行联系原作者