spring3 mvc使用注解@RequestBody、@responseBody传输json数据
2014-07-25 15:05
671 查看
一、了解spring注解@ResponseBody,@RequestBody和HttpMessageConverter
@RequestBodyi) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
简单说就是前台只需要向 Controller 提交一段符合格式的 JSON,Spring 会自动将其拼装成 bean。
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
即可以将返回的对象(带有数据的javabean的集合List或Map)转换成JSON。
HttpMessageConverter接口,需要配置<mvc:annotation-driven
/>,就默认配置了RequestMappingHandlerAdapter。
二、代码实现
2.1 导入包2.2 创建实体类Person,命名为Person.java
2.3 创建控制器,命名为PersonController.java,代码如下
<span style="font-family:SimSun;">@Controller public class PersonController { @RequestMapping(value="/person/query/{id}/{name}/{status}",method=RequestMethod.GET) public @ResponseBody Person query(@PathVariable int id,@PathVariable String name,@PathVariable boolean status){ return new Person(id,name,status); } @RequestMapping(value="/person/login",method=RequestMethod.POST) public @ResponseBody Person login(@RequestBody Person person){ return person; } }</span></span>
2.4 前台测试页面,代码如下
<span style="font-family:SimSun;"><%@ 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"> <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script> <title>首页</title> </head> <body> <table align="center"> <tr> <td>id</td> <td><input id="id" value="001" /></td> </tr> <tr> <td>name</td> <td><input id="name" value="molly" /></td> </tr> <tr> <td>status</td> <td><input id="status" value="true" /></td> </tr> <tr> <td><input type="button" id="query" value="get" /></td> <td><input type="button" id="login" value="post" /></td> </tr> </table> </body> <script type="text/javascript"> $(document).ready(function() { $("#query").click(function() { query(); }); $("#login").click(function() { login(); }); }); function query() { var url = 'person/query/'; var query = $('#id').val() + '/' + $('#name').val() + '/' + $('#status').val(); url += query; alert(url); $.getJSON(url, function(data) { alert("id: " + data.id + "\nname: " + data.name + "\nstatus: " + data.status); }); } function login() { var mydata = '{"name":"' + $('#name').val() + '","id":"' + $('#id').val() + '","status":"' + $('#status').val() + '"}'; alert(mydata); $.ajax({ type : 'POST', contentType : 'application/json', url : 'person/login', processData : false, dataType : 'json', data : mydata, success : function(data) { alert("id: " + data.id + "\nname: " + data.name + "\nstatus: " + data.status); }, error : function() { alert('Error...'); } }); } </script> </html></span>
三、测试结果
四、总结
我在做这个实验的时候遇到的问题:4.1 调试js页面没反应,也没有错误提示。Java控制台输出:WARN [PageNotFound] No mapping found for HTTP request with URI##
原因是在web.xml配置了
<span style="font-family:SimSun;"><span style="font-family:SimSun;font-size:14px;"><span style="color:#333333;"><servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> </span><span style="color:#ff0000;"><url-pattern>/</url-pattern></span><span style="color:#333333;"> </servlet-mapping></span></span></span>
通过<url-pattern>/</url-pattern>将所有请求都交给spring去处理了,而所有的请求都是在Controller里用注解@RequestMapping("/login")配置的,这样的话对js/css/jpg/gif等静态资源就访问不到。
解决的方法有几种:
1. web.xml里加上配置
<span style="font-family:SimSun;"><span style="font-family:SimSun;font-size:14px;"><servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping></span></span>
2. spring 3.0.5以上版本,在spring的配置文件中加上
<mvc:default-servlet-handler />
4.2 参照网上的demo,之前写成url='http://localhost:8080/smvc/person/query/'的形式,用火狐Firebug进行调试,出现惊叹号提示:
已阻止交叉源请求:同源策略不允许读取 http://localhost:8080/smvc/person/query/001/molly/true 上的远程资源。可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题。
这个涉及到跨域请求的知识了,后续再学习~
jackson jar包下载
相关文章推荐
- springmvc @ResponseBody 返回json数据错误
- springmvc @ResponseBody 返回json数据错误
- 前台怎么接收spring @ResponseBody返回的json数据 map
- SpringMVC @ResponseBody返回json数据 浏览器406 error 解析
- springmvc中@ReuqestBody和@ResponseBody传输json数据
- Spring 4.x 中使用注解 @ResponseBody 返回json数据的配置
- spring mvc@Responsebody注解 对返回json格式数据的支持
- spring注解@ResponseBody处理ajax请求,json数据类型
- springmvc @ResponseBody 返回json数据错误
- springmvc @ResponseBody 返回json数据错误
- spring mvc @responsebody返回json数据 ie浏览器弹出下载页面 解决方案
- spring4.1.5 @ResponseBody返回JSON数据406
- SpringMVC @RequestBody接收Json对象字符串 @ResponseBody处理json数据类型
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- Spring mvc @ResponseBody返回JSON前台JSP乱码解决
- springmvc @responseBody自动打包json出现错误(外键查询死循环)问题
- SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)
- @ResponseBody 返回json数据 在IE浏览器提示保存文件,但是在firefox中却可以正常的实现功能。
- 解决spring-mvc @responseBody注解返回json 乱码问题
- SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(上)