博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc的学习
阅读量:5755 次
发布时间:2019-06-18

本文共 4841 字,大约阅读时间需要 16 分钟。

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

 

下载名称:springmvc_han

Springmvc3的简单学习

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的Controllersingleton的,或者是线程不安全的说明。

 

分析:和Struts一样,SpringControllersingleton的!这意味着每个request过来,系统都会用原来的instance去处理,这样就导致了两个结果:①我们不用每次创建Controller,减少了对象创建和垃圾回收的时间。②由于只有一个Controllerinstance,当多个线程调用它的时候,它里面的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),同时携带参数,如操作成功的提示信息。因为是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,如需转载请自行联系原作者
你可能感兴趣的文章
spring.net 继承
查看>>
ES6:模块简单解释
查看>>
JavaScript indexOf() 方法
查看>>
ZJU PAT 1023
查看>>
WMI远程访问问题解决方法
查看>>
Android开发历程_15(AppWidget的使用)
查看>>
阿花宝宝 Java 笔记 之 初识java
查看>>
Linux下的C编程实战
查看>>
[32期] html中部分代码与英语单词关系
查看>>
PHP安装环境,服务器不支持curl_exec的解决办法
查看>>
jQuery|元素遍历
查看>>
用 ThreadLocal 管理用户session
查看>>
setprecision后是要四舍五入吗?
查看>>
上云就是这么简单——阿里云10分钟快速入门
查看>>
MFC多线程的创建,包括工作线程和用户界面线程
查看>>
我的友情链接
查看>>
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>