概述
Spring MVC在数据绑定的过程中需要对传递数据的格式和类型进行转换,它既可以转换String等类型的数据,也可以转换JSON等其他类型的数据。
为实现浏览器与控制器类之间的JSON数据交互,SpringMVC提供了MappingJackson2HttpMessageConverter实现类默认处理JSON格式请求响应。该实现类利用Jackson开源包读写JSON数据,将Java对象转换为JSON对象和XML文档,同时也可以将JSON对象和XML文档转换为Java对象。
Jackson开源包及其描述如下:
- jackson-annotations-2.9.4.jar:JSON转换注解包。
- jackson-core-2.9.4.jar:JSON转换核心包。
- jackson-databind-2.9.4.jar:JSON转换的数据绑定包。
可以访问https://mvnrepository.com/search?q=jackson下载。
故所需的jar包
在使用注解开发时需要用到JSON格式转换注解,分别是@RequestBody和@ResponseBody。
- @RequestBody:用于将请求体中的数据绑定到方法的形参中,该注解应用在方法的形参上。
- @ResponseBody:用于直接返回return对象,该注解用在方法上。
实例
创建springmvc项目并按照下图创建文件夹及文件:
各文件内容如下:
StudentController.java
package springmvcdemo.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 springmvcdemo.pojo.Student;
@Controller
@RequestMapping("/student")
public class StudentController {
/**
* 接收JSP页面请求的JSON数据,并返回JSON格式的结果
* 方法中的@RequestBody注解用于将前端请求体中的JSON格式数据绑定到形参student上
* 而@ResponseBody注解用于直接返回Student对象,当访问POJO对象时默认转换为JSON格式数据进行响应
*/
@RequestMapping("json")
@ResponseBody
public Student json(@RequestBody Student student) {
// 打印接收的JSON数据
System.out.println(student);
// 返回JSON格式的响应
return student;
}
}
Student.java
package springmvcdemo.pojo;
public class Student {
private String username;
private String password;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
<context:component-scan base-package="springmvcdemo.controller"/>
<!--配置静态资源,允许js文件夹下的所有文件可见-->
<mvc:annotation-driven/>
<mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
<!--配置视图解析器-->
<!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--部署DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--配置文件的位置-->
<param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
</init-param>
<!--表示容器在启动时立即加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--处理所有URL-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--避免中文乱码-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
index.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加学生</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
</head>
<body>
<form action="#">
姓名:<input type="text" name="username" id="username"><br>
密码:<input type="password" name="password" id="password"><br>
年龄:<input type="text" name="age" id="age"><br>
<input type="button" value="提交" onclick="submitForm()">
</form>
</body>
<script>
<%--使用jQuery的Ajax提交JSON数据--%>
function submitForm() {
var username = $("#username").val();
var password = $("#password").val();
var age = $("#age").val();
$.ajax({
// 请求路径
url: "/student/json",
//请求类型
type: "post",
// 要发送的数据,转换成字符串格式
data: JSON.stringify({
username: username,
password: password,
age: age
}),
//定义发送请求的数据格式为JSON字符串
contentType: "application/json;character:utf-8",
// 定义回调相应的数据格式为JSON字符串
dataType: "json",
// 响应成功
success: function (data) {
if (data != null) {
alert("姓名:" + data.username + ";密码:" + data.password + ";年龄:" + data.age);
}
}
});
}
</script>
</html>
运行效果如下:
控制台输出:
如果对完整源码有兴趣。
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【CSDN201911161135】可获取本节源码。