Spring MVC在数据绑定的过程中,需要对传递数据的格式和类型进行转换,它既可以转换String登类型的数据,也可以转换JSON等其他类型的数据。
JSON数据结构
JSON(JavaScript Object Notation JS对象标记)是一种轻量级的数据交换格式,与XML一样,JSON也是基于纯文本的数据格式 它有以下两种数据结构
1:对象结构
对象结构以{开始 }结束,中间部分由0个或多个以英文,分割的key/value对构成,key和value之间以英文:分割,语法结构如下
{
key1:value1,
key2:value2,
...
}
2:数组结构
数组结构以[开始以]结束,中间部分由0个活多个以英文,分割的值的列表组成 语法结构如下
[
value1,
value2.
...
]
JSON数据转换
为实现浏览器与控制器类之间的JSON数据交互,Spring MVC提供了MappingJackson2HttpMessageConverter实现类默认处理JSON格式请求响应。该实现类利用Jackson开源包读取JSON数据,将Java对象转换为JSON对象和XML文档,同时也可以将JSON对象和XML文档转换为Java对象
在使用注解开发时,需要用到两个重要的JSON格式转换注解
1:@RequestBody
用于将请求体的数据绑定到方法的形参上,该注解应用在方法的形参上
2:@ResponseBody
用于直接返回JSON对象 该注解应用在方法上
下面通过一个实例来演示JSON数据交互过程
1:创建Web应用ch2_5并导入JAR包
2:创建Web和Spring MVC配置类
Webconfig类代码如下
package config; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; public class WebConfig implements WebApplicationInitializer{ @Override public void onStartup(ServletContext arg0) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMVCConfig.class);//注册Spring MVC的Java配置类SpringMVCConfig ctx.setServletContext(arg0);//和当前ServletContext关联 /** * 注册Spring MVC的DispatcherServlet */ Dynamic servlet = arg0.addServlet("dispatcher", new DispatcherServlet(ctx)); servlet.addMapping("/"); servlet.setLoadOnStartup(1); } }
SpringMVCConfig类代码如下
package config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan("controller") public class SpringMVCConfig implements WebMvcConfigurer { /** * 配置视图解析器 */ @Bean public InternalResourceViewResolver getViewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/jsp/"); viewResolver.setSuffix(".jsp"); return viewResolver; } /** * 配置静态资源 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/js/**").addResourceLocations("/js/"); } }
3:创建JSP页面 并引入jQuery
首先去官方网站http://jquery.com/download/下载jQuery插件 然后复制到WebContent目录下
创建JSP文件index.jsp 代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.2.1.min.js"></script> <script type="text/javascript"> function testJson() { //获取输入的值pname为id var pname = $("#pname").val(); var password = $("#password").val(); var page = $("#page").val(); $.ajax({ //请求路径 url : "${pageContext.request.contextPath }/testJson", //请求类型 type : "post", //data表示发送的数据 data : JSON.stringify({pname:pname,password:password,page:page}), //定义发送请求的数据格式为JSON字符串 contentType : "application/json;charset=utf-8", //定义回调响应的数据格式为JSON字符串,该属性可以省略 dataType : "json", //成功响应的结果 success : function(data){ if(data != null){ //返回一个Person对象 //alert("输入的用户名:" + data.pname + ",密码:" + data.password + ",年龄:" + data.page); //ArrayList<Person>对象 /**for(var i = 0; i < data.length; i++){ alert(data[i].pname); }**/ //返回一个Map<String, Object>对象 //alert(data.pname);//pname为key //返回一个List<Map<String, Object>>对象 for(var i = 0; i < data.length; i++){ alert(data[i].pname); } } } }); } </script> </head> <body> <form action=""> 用户名:<input type="text" name="pname" id="pname"/><br> 密码:<input type="password" name="password" id="password"/><br> 年龄:<input type="text" name="page" id="page"/><br> <input type="button" value="测试" onclick="testJson()"/> </form> </body> </html>
4:创建实体类
在src目录上创建pojo包并创建Person实体类
package pojo; public class Person { private String pname; private String password; private Integer page; public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getPage() { return page; } public void setPage(Integer page) { this.page = page; } }
5:创建控制器类
TestController类代码如下
package controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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 pojo.Person; @Controller public class TestController { /** * 接收页面请求的JSON数据,并返回JSON格式结果 */ @RequestMapping("/testJson") @ResponseBody public List<Map<String, Object>> testJson(@RequestBody Person user) { //打印接收的JSON格式数据 System.out.println("pname=" + user.getPname() + ", password=" + user.getPassword() + ",page=" + user.getPage()); //返回Person对象 //return user; /**ArrayList<Person> allp = new ArrayList<Person>(); Person p1 = new Person(); p1.setPname("陈恒1"); p1.setPassword("123456"); p1.setPage(80); allp.add(p1); Person p2 = new Person(); p2.setPname("陈恒2"); p2.setPassword("78910"); p2.setPage(90); allp.add(p2); //返回ArrayList<Person>对象 return allp; **/ Map<String, Object> map = new HashMap<String, Object>(); map.put("pname", "陈恒2"); map.put("password", "123456"); map.put("page", 25); //返回一个Map<String, Object>对象 //return map; //返回一个List<Map<String, Object>>对象 List<Map<String, Object>> allp = new ArrayList<Map<String, Object>>(); allp.add(map); Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("pname", "陈恒3"); map1.put("password", "54321"); map1.put("page", 55); allp.add(map1); return allp; } }
6:测试应用
选择Run命令发布并运行应用即可