• Spring MVC JSON交互


    Spring MVC JSON交互

    1.配置

    在Spring MVC的处理流程中的HandlerAdapter部分增加了对JSON格式的转换。需要在HandlerAdapter中配置对应的messageConverters。将配置添加到Spring MVC的配置文件中,代码:

    <!--注解适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    	<property name="messageConverters">
    	<list>
    	<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    	</bean>
    	</list>
    	</property>
    </bean>
    

    使用<mvc:annotation-driven />则不需要配置。(此标签默认加载了一系列的默认配置,不只是HandlerMapper、和HandlerAdapter.我们这么懒当然使用这个喽)

    Spring MVC提供的这个messageConverters内部使用的是jackson的类库。所以这里需要加入jar包:jackson-core-asl-1.9.11.jar、jackson-mapper-asl-1.9.11.jar

    2.格式

    Spring MVC中处理JSON使用的是两个注解。@RequestBody@ResponseBody。他们均加在对象前面,将JAVA对象与JSON对象自动转换。

    @RequestBody - 将请求转换成JAVA对象。
    @ResponseBody - 将JAVA对象转换成JSON对象。

    所以,在请求数据为JSON数据的时候使用@RequestBody,在响应数据为JSON的时候使用@ResponseBody

    典型用法:

    JSON请求,JSON响应(已删去不必要的部分)

    //前台代码
    function loadMore() {
    	$.ajax({
    		type:"post",
    		url:"/blog/loadMore.action",
    		contentType:"application/json;charset=utf-8;", 
    		data:'{"pageIndex":10}',
    		error: function(request) {},
    		success : function(data){
    			if(null!=data && data.length>0){
    			}else{}
    		}
    	});
    }
    
    //后台代码
    @RequestMapping("/loadMore")
    public @ResponseBody List<Blog> loadMore(@RequestBody BlogJsonVO json,HttpSession session) throws Exception {
    	List<Blog> blogList = blogService.getBlogList(1, json.getPageIndex());
    	return blogList;
    }
    

    FORM请求,JSON响应

    //前台代码
    function save(){
    	 $.ajax({
    	 	type: "POST",
    	 	url:contextPath + '/blog/save.action',
    		data:'content=some&uid=1',
    	    error: function(request) {
    	        alert(" 发生未知错误 ");
    	    },
    	    success: function(data) {
    	    	if(data){
    			}
    	    }
    	}); 
    }
    //后台代码
    @RequestMapping("/save")
    public @ResponseBody Blog save(Blog blog,HttpServletRequest req) throws Exception {
    	String content = blog.getContent();
    	if(StringUtils.isNoneBlank(content)){
    		blogService.addBlog(blog);
    		return blog;
    	}
    	return null;
    }
    

    3.注意:

    • contentType:"application/json;charset=utf-8;",表明了提交的数据是JSON格式的,此时后台的接收对象前需要加@RequestBody。JQuery的AJAX请求默认使用的是application/x-www-form-urlencoded;charset=utf-8此时使用@RequestBody会报415。

    • 在上面的基础上,data的格式需要做对应调整。参照上面代码

    • 浏览器报415,因为jar包没有加或者后台没有加接收的注解@RequestBody

    • 浏览器报400,JSON格式错误。

      • JSON的名值对中的字符串需要是双引号。写成:data:"{'pageIndex':10}"就是错误的。
      • JSON数据中不可以有回车。最开始我使用JSON.stringify()这个方法处理,但是在IE下各种问题。不是方法行为不一致就是JSON对象不支持等等。后来直接引用了jquery.json.js,使用了他的$.toJSON()方法。

      var jquery_content = $.toJSON(blog_content);

    • 如果使用data:'content=some&uid=1'方式提交数据,需要注意提交内容中是否包含不合适的符号,比如'&'。

  • 相关阅读:
    深入浅出Java三大框架SSH与MVC的设计模式
    excel 日期/数字格式不生效需要但双击才会生效的解决办法
    如何隐藏DIV对象
    使用 Arrays 类操作 Java 中的数组
    Java常量的应用
    Windows操作系统下tomcat安装版图文教程
    命名sql数据集
    【转载】如何写一个框架:步骤(下)
    【转载】如何写一个框架:步骤(上)
    C++Builder实现二分查找法
  • 原文地址:https://www.cnblogs.com/zhuani21/p/5376690.html
Copyright © 2020-2023  润新知