SSM学习之6:数据格式处理 视图解析器源码分析

本文介绍在Spring MVC中如何配置静态资源处理,避免被DispatcherServlet拦截,确保图片、JS、CSS等正常加载。同时,深入探讨如何使用@ResponseBody注解处理JSON数据,实现Ajax请求的响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问静态资源
在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页面
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值