您的位置:首页 > 编程语言 > Java开发

spring3 mvc使用注解@RequestBody、@responseBody传输json数据

2014-07-25 15:05 671 查看

一、了解spring注解@ResponseBody,@RequestBody和HttpMessageConverter

@RequestBody

i) 该注解用于读取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包下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: