点滴记载,点滴进步,愿自己更上一层楼。
继续上篇参数绑定问题,这次叙述springmvc的json传自动绑定到对应的vo,即不需要在自己去做json的转换,框架帮你实现。
进入正题。
如果要让框架自动绑定将前台传过来的json数据自动给你封装到自己的pojo中去,需要两个jar。
jackson-core-asl-1.9.13.jar
jackson-mapper-asl-1.9.13.jar
springmvc使用jackson包进行json数据的转换。
将对应的依赖添加到pom.xml中去。
<!-- json转换jar包 start -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- json转换jar包 end -->
其他的配置不需要了,因为用的<mvc:annotation-driven/>已经将json要用到的解析器加载了。
1 用jquery的ajax提交json数据。
首先要将jquery相关的js引用到jsp中。注意json串,里面必须是双引号。contentType同样必须要写,因为默认是key/value方式提交。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ 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">
<%@ page isELIgnored="false"%>
<html>
<head>
<title>Title</title>
<%-- 引入jquery库--%>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<%-- 对应的ajax提交请求 --%>
<script type="text/javascript">
function ajaxSubimt(){
$.ajax({
type:'post',
url:'${pageContext.request.contextPath }/testJsonParam01',
data:'{"name":"tom","age":500,"hobby":"movie"}',
contentType:'application/json;charset=utf-8',
success:function (data) {
$('#jsonHtml').html(data.name)
}
});
}
</script>
</head>
<body>
<input type="button" value="提交" οnclick="ajaxSubimt();">
<div id="jsonHtml"></div>
</body>
</html>
后台action代码。这里面虽然注释已经写得清楚了,但是还是要再说一下。如果想自动将json串的数据绑定到vo的属性中,
必须要在对应的vo前面写@RequestBody注解,否则无效。@ResponseBody 用于将对应的vo转换成json数据返回前台,不在需要程序员手动转换。
package com.soft.controller;
import com.soft.po.JsonParamVo;
import com.soft.po.ParamVo;
import com.soft.po.Student;
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 org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@Controller
public class TestJsonParamController {
/**
* 跳转到json提交页面
* @return ModelAndView
*/
@RequestMapping(value="/toJsonParamJsp")
public ModelAndView toMapJsp(){
ModelAndView model = new ModelAndView();
model.setViewName("test/testJsonParam");
return model;
}
/**
* 1 json数据直接绑定到vo
* @RequestBody springmvc 会将json数据直接绑定到vo对应的属性中
* @ResponseBody JsonParamVo springmvc看到@ResponseBody
* 会直接将对应的vo中的数据转换成json串
* @return ModelAndView
*/
@RequestMapping(value="/testJsonParam01")
public @ResponseBody JsonParamVo testJsonParam01(@RequestBody JsonParamVo jsonParamVo){
return jsonParamVo;
}
}
json数据对应的vo
package com.soft.po;
/**
* Created by xuweiwei on 2017/8/19.
*/
public class JsonParamVo {
private String name;
private Integer age;
private String hobby;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
开始测试。
点击页面提交按钮将json数据传入后台。
可以看到红框中的数据,显示已经将json中的数据绑定到vo中的属性中了,而代码并没有做什么多余的转化操作,仅仅是加了个@RequestBody注解,springmvc就帮我们自动转化了。而@ResponseBody将vo再次转化为json返回给前台页面。
如红框中显示,已经转换成json串。最后拿到json串中的数据显示到页面。
这里讲的是springmvc自带的功能。省去了程序员的一下工作。但是这样做有些局限,因为程序不可能总是这样的json串。所以真正项目中先通过vo接收前台数据,最后在返回给前台json串,比较常见。
其实具体实现就是后台接收数据的时候不再用json,而用普通的接收方法,只不过最后返回给前台的还是一样的。
具体实现
1 后台测试action
/**
* 1 json数据直接绑定到vo
* @ResponseBody JsonParamVo springmvc看到@ResponseBody
* 会直接将对应的vo中的数据转换成json串
* @return ModelAndView
*/
@RequestMapping(value="/testJsonParam02")
public @ResponseBody JsonParamVo testJsonParam02(JsonParamVo jsonParamVo){
return jsonParamVo;
}
jsp ajax 请求方法,注意参数部分。参数部分写了两种形式,两种形式都可以使用,看你个人想法了。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ 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">
<%@ page isELIgnored="false"%>
<html>
<head>
<title>Title</title>
<%-- 引入jquery库--%>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<%-- 对应的ajax提交请求 --%>
<script type="text/javascript">
<%--function ajaxSubimt(){--%>
<%--$.ajax({--%>
<%--type:'post',--%>
<%--url:'${pageContext.request.contextPath }/testJsonParam01',--%>
<%--data:'{"name":"tom","age":500,"hobby":"movie"}',--%>
<%--contentType:'application/json;charset=utf-8',--%>
<%--success:function (data) {--%>
<%--$('#jsonHtml').html(data.name)--%>
<%--}--%>
<%--});--%>
<%--}--%>
function ajaxSubimt(){
$.ajax({
type:'post',
url:'${pageContext.request.contextPath }/testJsonParam02',
// key/value形式的两种方式,正常用第一种,因为看着舒服。这是第一种
// data:{"name":"tom","age":500,"hobby":"movie"},
// 这是第二种
data:"name=tom&age=500&hobby=movie",
// 因为默认就是key/value'方式,所以这里不用在指定
// contentType:'application/json;charset=utf-8',
success:function (data) {
$('#jsonHtml').html(data.name)
}
});
}
</script>
</head>
<body>
<input type="button" value="提交" οnclick="ajaxSubimt();">
<div id="jsonHtml"></div>
</body>
</html>
开始测试:
点击页面提交按钮,触发ajax请求后台action。
可以看到ajax提交的参数,已经绑定到vo中了。
返回前台结果:
可以看到红框中的数据就是后台返回的springmvc转化的json数据。
将数据显示到页面:
json交互,参数绑定到此告一段落。论可扩展性,第二种扩展性比较好,推荐使用。
接下来要写的是参数校验部分。
点滴记载,点滴进步,愿自己更上一层楼。加油!!!