SpringMVC 的数据绑定
1、数据自动绑定
SpringMVC 框架支持不需要任何数据绑定的注解直接将表单参数绑定到我们的执行方法的参数上。
表单参数:包括 POST 以及 GET 发送过来的参数
就是以内容类型为:enctype="application/x-www-form-urlencoded"的参数
参数变量绑定:
前台代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 用户登录<br/> 11 <form action="${pageContext.request.contextPath }/user/login.mvc" method="post"> 12 用户名:<input name="username" type="text"> 13 密码:<input name="password" type="text"> 14 <input type="submit" value="登录"> 15 </form> 16 </body> 17 </html>
后台代码:
1 package cn.mgy.controller; 2 3 import javax.servlet.http.HttpSession; 4 5 import org.springframework.stereotype.Controller; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RequestMethod; 8 9 @Controller 10 @RequestMapping(value="user") 11 public class UserController { 12 13 /** 14 * 接收的请求,必须是POST 15 * @return 16 */ 17 @RequestMapping(value="login",method=RequestMethod.POST) 18 public String login(HttpSession session,String password,String username){ 19 20 System.out.println("-登录-user"+username); 21 System.out.println("用户名:"+username); 22 System.out.println("密码:"+password); 23 session.setAttribute("username", username); 24 session.setAttribute("password", password); 25 return "/hello.jsp"; 26 } 27 }
2、将数据自动绑定到 JavaBean
注意:请求界面的参数名与JavaBean的字段要一致
请求页面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 用户注册1<br/> 11 <form action="${pageContext.request.contextPath }/user/register.mvc" method="post"> 12 用户名:<input name="username" type="text"> 13 密码:<input name="password" type="text"> 14 性别:<input name="sex" type="text"> 15 年龄 <input name="age" type="text"> 16 <input type="submit" value="注册"> 17 </form> 18 </body> 19 </html>
实体类(JavaBean):
1 package cn.mgy.entity; 2 /** 3 * SpringMVC会自动的将 4 * <input name="username" type="text"> 5 * 的name属性绑定JavaBean的getUsername方法和setUsername 6 * @author ranger 7 * 8 */ 9 public class User { 10 11 private String password; 12 private String username; 13 private int age; 14 private String sex; 15 16 public String getPassword() { 17 return password; 18 } 19 public void setPassword(String password) { 20 this.password = password; 21 } 22 public String getUsername() { 23 return username; 24 } 25 public void setUsername(String username) { 26 System.out.println("--"+username); 27 this.username = username; 28 } 29 public int getAge() { 30 return age; 31 } 32 public void setAge(int age) { 33 this.age = age; 34 } 35 public String getSex() { 36 return sex; 37 } 38 public void setSex(String sex) { 39 this.sex = sex; 40 } 41 }
后台代码:
1 package cn.mgy.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 import cn.mgy.pojo.User; 8 9 @Controller 10 @RequestMapping(value="/user") 11 public class UserController { 12 13 /** 14 * 接收的请求,必须是POST 15 * @return 16 */ 17 @RequestMapping(value="register",method=RequestMethod.POST) 18 public String register(User user){ 19 20 System.out.println("-注册-user"); 21 System.out.println("用户名:"+user.getUsername()); 22 System.out.println("密码:"+user.getPassword()); 23 System.out.println("年龄"+user.getAge()); 24 System.out.println("性别:"+user.getSex()); 25 26 return "/hello.jsp"; 27 } 28 29 }
3、自动绑定数据到数组
注意事项:
(1)数组的类型只能是 Spring 内置已经实现的类型(如:MultipartFile)以及标量类型。
标量类型 = String + 基础数据类型 + 基础数据类型包装类
(2)页面的参数必须要同名
请求页面:
1 <p>发送一组用户名</p> <br/> 2 <form action="${pageContext.request.contextPath }/user/listuser.mvc" method="post"> 3 用户名1:<input name="username" type="text"> 4 用户名2:<input name="username" type="text"> 5 用户名3:<input name="username" type="text"> 6 用户名4 :<input name="username" type="text"> 7 <input type="submit" value="发送"> 8 </form>
后台代码:
1 @RequestMapping(value="listuser",method=RequestMethod.POST) 2 public String listuser(String[] username){ 3 4 for(String uname:username){ 5 System.out.println(uname); 6 } 7 8 return "/hello.jsp"; 9 }
4、集合的自动封装
SpringMVC 的执行方法的参数不支持集合数据直接自动绑定的。需要将集合转换成一个 JavaBean 的类型,把集合作为 JavaBean 的一个属性来实现。
请求页面代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <p>需求,使用一个集合来接收这个数据,而且每一组分别存在不同的实体里面发送一组用户名</p> 11 <form action="${pageContext.request.contextPath }/user/listuser2.mvc" method="post"> 12 <!-- users表示是UsersModel的属性,setUsers [0],表示放在集合的第一元素--> 13 用户名1:<input name="users[0].username" type="text"> <br/> 14 密码1:<input name="users[0].password" type="text"> <br/> 15 16 用户名2:<input name="users[1].username" type="text"><br/> 17 密码2:<input name="users[1].password" type="text"> <br/> 18 19 用户名3:<input name="users[2].username" type="text"><br/> 20 密码3:<input name="users[2].password" type="text"> <br/> 21 22 用户名4 :<input name="users[3].username" type="text"><br/> 23 密码4:<input name="users[3].password" type="text"> <br/> 24 <input type="submit" value="发送"> 25 </form> 26 </body> 27 </html>
实体类(JavaBean):
1 package cn.mgy.entity; 2 /** 3 * SpringMVC会自动的将 4 * <input name="username" type="text"> 5 * 的name属性绑定JavaBean的getUsername方法和setUsername 6 * @author ranger 7 * 8 */ 9 public class User { 10 11 private String password; 12 private String username; 13 private int age; 14 private String sex; 15 16 public String getPassword() { 17 return password; 18 } 19 public void setPassword(String password) { 20 this.password = password; 21 } 22 public String getUsername() { 23 return username; 24 } 25 public void setUsername(String username) { 26 System.out.println("--"+username); 27 this.username = username; 28 } 29 public int getAge() { 30 return age; 31 } 32 public void setAge(int age) { 33 this.age = age; 34 } 35 public String getSex() { 36 return sex; 37 } 38 public void setSex(String sex) { 39 this.sex = sex; 40 } 41 }
1 package cn.mgy.entity; 2 3 import java.util.List; 4 5 public class UsersModel { 6 private List<User> users; 7 8 public List<User> getUsers() { 9 return users; 10 } 11 12 public void setUsers(List<User> users) { 13 this.users = users; 14 } 15 }
后台代码:
1 /** 2 * 集合类型,需要转成JavaBean类型 3 * @param userModel 4 * @return 5 */ 6 @RequestMapping(value="listuser2",method=RequestMethod.POST) 7 public String listuser2(UsersModel userModel){ 8 9 for(User user:userModel.getUsers()){ 10 System.out.println("用户名:"+user.getUsername()+"密码:"+user.getPassword()); 11 } 12 13 return "/hello.jsp"; 14 }
5、数据的强制绑定
SpringMVC 有一些数据是不能自动绑定,需要我们使用它提供的注解强制绑定。
遇到需要强制绑定的几种情况:
(1)默认参数自动绑定的是表单数据,如果数据不是来自表单,那么需要强制绑定
(2)数据是来自表单的,但是参数名不匹配,那么也需要强制绑定
(3)数据是来自表单的,但是需要将数据绑定在 Map 对象里面,需要强制绑定
5.1、 @PathVariable:绑定路径参数
后台代码:
1 /** 2 * 获得路径的变量 3 * ${pageContext.request.contextPath }/zhangsan/say2.mvc 4 * 如何让执行方法获得请求路径的zhangsan 5 * @param name 6 * @return 7 */ 8 @RequestMapping(value="{name}/say2") 9 public ModelAndView say2(@PathVariable String name){ 10 System.out.println("-你好世界!-"+name); 11 ModelAndView mv=new ModelAndView(); 12 //设置返回的视图 13 mv.setViewName("/hello.jsp"); 14 mv.addObject("msg", "张三"); 15 return mv; 16 }
5.2、@CookieValue 获得 Cookie 值的注解
后台代码:
1 package cn.mgy.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.CookieValue; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 7 @Controller 8 public class CookieController { 9 10 /** 11 * 获得JSP 页面,JSESSIOINID这个Cookie值 12 * @param cookevalue 13 */ 14 @RequestMapping(value="getcookie") 15 public void getcookie(@CookieValue(value="JSESSIONID") String cookevalue){ 16 //输出Cookie 17 System.out.println(cookevalue); 18 } 19 20 }
5.3、通过 @RequestParam 绑定表单数据
(1)接收的参数的变量名与表单的 name 属性不一样
1 @RequestMapping(value="login",method=RequestMethod.POST) 2 public String login(HttpSession session,String password,@RequestParam(value="username") String uname){ 3 4 System.out.println("-登录-user"+uname); 5 System.out.println("用户名:"+uname); 6 System.out.println("密码:"+password); 7 session.setAttribute("username", uname); 8 session.setAttribute("password", password); 9 return "/hello.jsp"; 10 }
(2)将表单数据绑定到 Map 里面
默认情况下,表单是不能自动绑定数据到 Map 里面的,如果要绑定数据到 Map,需要加上 @RequestParam 强制绑定
1 @RequestMapping(value="register1",method=RequestMethod.POST) 2 public String register1(@RequestParam Map<String,Object> entity){ 3 4 System.out.println("-注册-user"); 5 System.out.println("用户名:"+entity.get("username")); 6 System.out.println("密码:"+entity.get("password")); 7 System.out.println("年龄"+entity.get("age")); 8 System.out.println("性别:"+entity.get("sex")); 9 10 return "/hello.jsp"; 11 }
6、JSON 的支持
所谓的对 JSON 的支持,就是 SpringMVC 支持自动将 JSON 对象转换成 JAVA 对象,也支持将 JAVA 对象自动转成 JSON 对象。
配置步骤:
(1)导入包
SpringMVC 本身没有对 JSON 数据处理的类库,要支持 JSON 的自动转换必须导入 JSON 的支持包
(2)必须在配置文件增加这个标签,即启动注解的默认配置
<mvc:annotation-driven></mvc:annotation-driven>
需求:请求发送一个 JSON 的对象给执行方法,执行方法根据 @RequestBody 这个注解强制将请求发送过来的 JSON 转换成 Java 对象
前台代码:
1 <!-- 使用jQuery构建一个JSON对象 --> 2 <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.0.min.js"></script> 3 <script type="text/javascript"> 4 $(function(){ 5 $.ajax({ 6 type:"POST", 7 url: "${pageContext.request.contextPath}/user/get-user.mvc", 8 //构建一个发送JSON的请求 9 contentType:"application/json", 10 data:"{\"username\":\"张三\",\"password\":\"123456\"}", 11 success: function(data){ 12 13 } 14 }); 15 }); 16 </script>
后台代码:
1 package cn.gzsxt.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestBody; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestMethod; 7 8 import cn.gzsxt.entity.User; 9 10 @Controller 11 @RequestMapping(value="user") 12 public class UserController { 13 14 /** 15 * 创建一个执行方法 16 * 请求的JSON数据必须要使用@RequestBody,强制绑定 17 */ 18 @RequestMapping(value="get-user",method=RequestMethod.POST) 19 public void getUser(@RequestBody User user){ 20 System.out.println("用户名:"+user.getUsername()); 21 System.out.println("密码:"+user.getPassword()); 22 System.out.println("-获得用户数据-"); 23 } 24 }
数据返回到页面,自动将 Java 对象转成 JSON
前台代码:
1 <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.0.min.js"></script> 2 <script type="text/javascript"> 3 $(function(){ 4 $.ajax({ 5 type:"POST", 6 url: "${pageContext.request.contextPath}/user/get-user.mvc", 7 //构建一个发送JSON的请求 8 contentType:"application/json", 9 data:"{\"username\":\"张三\",\"password\":\"123456\"}", 10 // 成功返回的 JSON 对象 11 success: function(data){ 12 console.log(data); 13 window.alert(data.username); 14 } 15 }); 16 17 }); 18 </script> 19
后台代码:
1 package cn.mgy.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestBody; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestMethod; 7 import org.springframework.web.bind.annotation.ResponseBody; 8 9 import cn.mgy.pojo.User; 10 11 @Controller 12 @RequestMapping(value="user") 13 public class UserController { 14 15 /** 16 * 创建一个执行方法 17 * 请求的JSON数据必须要使用@RequestBody,强制绑定 18 *返回一个实体类对象,使用 @ResponseBody转成JSON对象 19 */ 20 @RequestMapping(value="get-user",method=RequestMethod.POST) 21 @ResponseBody 22 public Object getUser(@RequestBody User user){ 23 System.out.println("用户名:"+user.getUsername()); 24 System.out.println("密码:"+user.getPassword()); 25 System.out.println("-获得用户数据-"); 26 //返回对象, 默认返回的是路径,如果返回的是数据,必须增加一个注解@ResponseBody 27 return user; 28 } 29 }
将 Map 对象转成 JSON 对象
前台代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <!-- 使用jQuery构建一个JSON对象 --> 10 <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.0.min.js"></script> 11 <script type="text/javascript"> 12 $(function(){ 13 $.ajax({ 14 type:"POST", 15 url: "${pageContext.request.contextPath}/user/get-user-map.mvc", 16 success: function(data){ 17 console.log(data); 18 window.alert(data.username); 19 } 20 }); 21 }); 22 </script> 23 24 <body> 25 用户登录 26 </body> 27 </html>
后台代码:
1 /** 2 * SpringMVC也支持将Map转成JOSN对象 3 *返回一个Map对象,使用 @ResponseBody转成JSON对象 4 * @return 5 */ 6 @RequestMapping(value="get-user-map",method=RequestMethod.POST) 7 @ResponseBody 8 public Object getUserMap(){ 9 Map<String,Object> datamap=new HashMap<>(); 10 System.out.println("-获得用户数据-"); 11 //返回对象, 默认返回的是路径,如果返回的是数据,必须增加一个注解@ResponseBody 12 datamap.put("username", "李四"); 13 datamap.put("password", "123"); 14 datamap.put("age", 12); 15 return datamap; 16 }