Java笔记之SpringMVC(八):ajax发送json数据和返回json数据
0.说在前面
1.在原项目的基础上再导入需要的jar包,并Build Path
2.新建包com.springmvc.demo.bean,并新建People类
package com.springmvc.demo.bean; public class People { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "People [name=" + name + ", age=" + age + "]"; } }
3.新建JsonController类
package com.springmvc.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.springmvc.demo.bean.People; @Controller public class JsonController { @RequestMapping("/initJson.action") public String init(){ return "json"; } /** * @RequestBody: 注解用于将json字符串信息映射到People类的字段上进行转换 * @ResponseBody: 注解用于将实体对象转换成json格式 * @param people * @return */ @RequestMapping(value="/json.action") public @ResponseBody People jsonTest(@RequestBody People people){ System.out.println(people); return people; } }
4.新建json.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.12.4.min.js"></script> </head> <body> 姓名:<input type="text" id="name"/><br/> 年龄:<input type="text" id="age"/><br/> <button type="button" onclick="doPost();">发送</button> </body> <script type="text/javascript"> function doPost(){ var name=document.getElementById("name").value; var age=document.getElementById("age").value; $.ajax({ url:"json.action", type:"post", //请求信息是严格的json字符串形式 data:JSON.stringify({"name":name,"age":age}), //设置请求参数为json字符串,编码为UTF-8 contentType:"application/json;charset=utf-8", //设置返回值为json格式,也可以不设置 dataType:"json", success:function(data){ alert(data.name+"---"+data.age); } }); } </script> </html>
5.由于原来的项目配置了拦截器,里面的postHandle方法中对controller返回的ModelAndView对象中设置了新的信息,这对返回json数据的请求是不合适的,因为这里的ModelAndView对象是null,会报空指针异常,所以把设置信息的那一块注释掉
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle在Controller被调用返回ModelAndView之后被调用......"); //在返回的ModelAndView对象中新加一个数据对象 //modelAndView.addObject("currentDate", new Date()); }
6.访问http://localhost:8080/springmvc_demo/initJson.action,跳转到json.jsp页面,输入信息点击发送按钮
从页面信息和后台打印信息可以看出ajax发送json数据和返回json数据都得到实现.
7.踩坑
以本例来说:
(1). ajax请求
data属性的值要是严格的Json字符串形式,不能写成{"name":name,"age":age}这种形式,要是双引号包围的字符串,可以使用JSON.stringify({"name":name,"age":age})进行转换;
contentType属性值要设置成"application/json;charset=utf-8";
(2). jar包
新导入的三个jar包是必须的.这一块填坑花了好一段时间,搜了好些教程有说部分jar包不需要的,自己试的死活不行,不知道为啥,这三个jar包都导入了请求就通过了;
(3). springmvc.xml
这里面要添加<mvc:annotation-driven></mvc:annotation-driven>标签项,添加这个不仅会添加上注解形式的处理器映射器和处理器适配器,还会添加一系列的消息转换器,其中就包括json格式的消息转换器
如果不添加这个标签,需要声明注解适配器以及为配置json格式的消息转换器:spring3与spring4及以上配置稍微不同,就是消息转换器名称里Jackson后面多了一个2
spring4以及以上
<!-- 声明注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <!-- 添加json格式的消息转换器 --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> </list> </property> </bean>
spring3
<!-- 声明注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <!-- 添加json格式的消息转换器 --> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> </list> </property> </bean>
从工作量上来说还是添加<mvc:annotation-driven></mvc:annotation-driven>标签项比较容易.
(4).Controller中的方法上
将json字符串映射到实体类属性上要使用注解@RequestBody;
返回值类型为实体类,要转化成json格式,需要在方法上或者方法的返回值类型之前使用注解@ResponseBody.