访问静态资源
在web.xml中,<url-pattern>/</url-pattern>
表示 设置所有,不包括jsp,拦截静态资源。但是包含js png css 建议使用,/*表示拦截所有 比如jsp,js , png,css (不建议使用),
*.action *.do:拦截以do action 结尾的请求
url-pattern为/时访问静态资源:
方式1-mvc:default-servlet-handler/
方式2- 采用spring自带mvc:resources方法
<mvc:annotation-driven />
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
location元素表示webapp目录下的static包下的所有文件;
mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b;
该配置的作用是:DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源
交由Servlet处理。
JSON处理
当前端使用Ajax发送请求时,服务器要以JSON的数据格式响应给浏览器
使用方式:@ResponseBody来实现;注解方式
@ResponseBody使用:
1.添加json处理相关jar包
<form id="myform">
user:<input type="text" name="username"><br>
age:<input type="text" name="age" ><br>
爱好:<input type="checkbox" name="hobby" value="篮球"> 篮球
<input type="checkbox" name="hobby" value="乒乓球"> 乒乓球
<input type="checkbox" name="hobby" value="足球"> 足球
</form>
2.在配置文件当中写上mvc:annotation-driven/
3.设置映射方法的返回值为@ResponseBody
方式1-直接返回一个对象
参照上图
方式2-返回一个List集合
与方式1 2相同
方式3-返回一个Map集合
表单序列化
通过一个插件,使表单转化为json格式,用在“script标签”中
(function($){
$.fn.serializeJson=function(){
var serializeObj={};
var array=this.serializeArray();
var str=this.serialize();
$(array).each(function(){
if(serializeObj[this.name]){
if($.isArray(serializeObj[this.name])){
serializeObj[this.name].push(this.value);
}else{
serializeObj[this.name]=[serializeObj[this.name],this.value];
}
}else{
serializeObj[this.name]=this.value;
}
});
return serializeObj;
};
})(jQuery);
发现采用post传递复杂类型时传递不了,检查Request Headers 里面的Content-Type为application/x-www-form-urlencoded,这种只能传递key-value的形式,所以采用以下方式$.ajax的方法:
$("#formbtn").click(function () {
//获取表单当中所有的参数 发送给服务器
var serialize = $("#myform").serializeJson();
console.log(serialize);
console.log(JSON.stringify(serialize));//转换为一个 JSON字符串
if (typeof serialize.hobby=="string"){
serialize.hobby= new Array(serialize.hobby);
}
$.ajax({
type:"post",
url:"${pageContext.request.contextPath}/formJson",
dataType:'json',//返回的数据data的类型
data:JSON.stringify(serialize),//转化为string后发送到服务器的数据 向服务器发送数据时一般是字符串。
contentType:'application/json',//发送信息至服务器时内容编码类型
success:function (data) {
alert("success");
console.log(data);
},
error:function (data) {
alert("shibai");
console.log(data);
}
});
/*$.post("${pageContext.request.contextPath}/formJson",serialize,function (data) {
console.log(data);
});*/
});
把contentType改成json格式接收时,服务器端又接受不了了
默认情况下我们发送的都是Content-Type: application/x-www-form-urlencoded,可直接使用@RequestParam接收参数
如果Content-Type:不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;则使用@RequestBody接收
然而若只选择传递至服务器端时,若hobby选择了一个,则默认以key-value的形式传,则只选一个时,该值为string,而服务器端hobby为数组,所以出现了问题,解决:
if (typeof serialize.hobby=="string"){
serialize.hobby= new Array(serialize.hobby);
}
@requestBody作用:接收Content-Type:不是application/x-www-form-urlencoded编码的内容 例如application/json,application/xml就可以用
视图解析器执行disapatcherServlet流程
1.获取mapping映射
2.获取适配器
3.调用处理器,执行映射方法,返回MV
4.处理转发页面
5.在方法内部渲染页面
6.创建视图对象
7.调用View对象渲染页面
8.在render内部解析数据
这个就是把model存进request域中
9.转发到jsp页面