更新时间:2022-09-28 22:18:20
这阶段又学习了一下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.
不错的文章可以参考: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),同时携带参数,如操作成功的提示信息。因为是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