一、数据绑定概述
具体的信息处理过程的步骤如下。
- 步骤01 Spring MVC将ServletRequest对象传递给DataBinder。
- 步骤02 将处理方法的入参对象传递给DataBinder。
- 步骤03 DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,并将ServletRequest对象中的消息填充到参数对象中。
- 步骤04 调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验。
- 步骤05 校验完成后会生成数据绑定结果BindingResult对象,SpringMVC会将BindingResult对象中的内容赋给处理方法的相应参数。
二、简单数据绑定
1. 绑定默认数据类型
- HttpServletRequest:通过request对象获取请求信息。
- HttpServletResponse:通过response对象处理响应信息。
- HttpSession:通过session对象得到session中存储的对象。
- Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将Model数据填充到request域。
示例2-1
- 创建项目,添加jar包
- 配置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">
<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:springmvc-config.xml</param-value>
</init-param>
<!-- 表示容器在启动时立即加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 创建springmvc-config.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"
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
">
<context:component-scan base-package="com.ssm.controller"/>
<bean id="ViewResolve" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 创建com.ssm.controller,创建UserController
package com.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
public class UserController {
//注解在方法上
@RequestMapping(value = "/selectUser")
public String selectUser(HttpServletRequest request){
String id=request.getParameter("id");
System.out.println("id="+id);
return "success";
}
}
- 在WEB-INF下创建jsp文件夹,创建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入门程序</title>
</head>
<body>
执行!
</body>
</html>
- 执行程序
2.绑定简单数据类型
示例2-2
修改控制器类
@RequestMapping(value="/selectUser")
public String selectUser(Integer id){
System.out.println("id="+id);
return "success";
}
与默认数据类型案例中的selectUser方法相比,此方法只是将HttpServletRequest参数类型替换为Integer类型。
@RequestParam注解的属性及说明
3.绑定POJO类型
示例2-3
- 创建com.ssm.po包,创建User类来封装
package com.ssm.po;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
}
- 在UserController中编写向注册页面跳转和接收用户注册信息的方法
// 向注册页面跳转
@RequestMapping("/toRegister")
public String toRegister(){
return "register";
}
// 接收用户注册信息
@RequestMapping("/registerUser")
public String registerUser(User user){
String username=user.getUsername();
String password=user.getPassword();
System.out.println("username="+username);
System.out.println("password="+password);
return "success";
}
- 创建register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="注册">
</form>
</body>
</html>
- 启动项目
- 中文编码
<!-- 编码过滤器-->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.绑定包装POJO
示例2-4
- 创建Banji和Student类,封装信息
package com.ssm.po;
public class Banji {
private Integer banji_id;
private String banji_name;
public Integer getBanji_id() {
return banji_id;
}
public void setBanji_id(Integer banji_id) {
this.banji_id = banji_id;
}
public String getBanji_name() {
return banji_name;
}
public void setBanji_name(String banji_name) {
this.banji_name = banji_name;
}
}
package com.ssm.po;
public class Student {
private Integer stu_id;
private String stu_name;
private Banji banji;
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public Banji getBanji() {
return banji;
}
public void setBanji(Banji banji) {
this.banji = banji;
}
}
- 创建一个StudentController,编写一个跳转到学生查询页面的方法和一个查询学生及班级信息的方法
package com.ssm.controller;
import com.ssm.po.Banji;
import com.ssm.po.Student;
import org.springframework.web.bind.annotation.RequestMapping;
public class StudentController {
// 向学生查询页面跳转
@RequestMapping("/tofindStudentWithBanji")
public String tofindStudentWithBanji(){
return "student";
}
// 查询学生和班级信息
@RequestMapping("/findStudentWithBanji")
public String findStudentWithBanji(Student student){
Integer stu_id=student.getStu_id();
Banji banji=student.getBanji();
String banji_name=banji.getBanji_name();
System.out.println("stu_id="+stu_id);
System.out.println("banji_name="+banji_name);
return "success";
}
}
通过访问页面跳转方法即可跳转到student.jsp,而通过查询学生和班级信息方法,即可通过传递的参数条件调用service中的相应方法来查询数据。
- 在WEB-INF/jsp目录下创建一个班级学生查询页面student.jsp,在页面中编写通过学生编号和所属班级作为查询条件来查询学生信息的代码。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生查询</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/findStudentWithBanji" method="post">
学生编号:
<input type="text" name="stu_id"/><br>
所属班级:
<input type="text" name="banji.banji_name"/><br>
<input type="submit" value="查询">
</form>
</body>
</html>
- 如果查询条件参数是包装类的直接基本属性,参数名就直接用对应的属性名
- 如果查询条件参数是包装类中的POJO的子属性,参数名就必须为【对象.属性】,其中【对象】要和包装POJO中的对象属性名称一致,【属性】要和包装POJO中的对象子属性一致
- 启动项目
三、复杂数据绑定
1.绑定数据
示例2-5
- 创建course.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>课程列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/delecteCourse" method="post">
<table>
<tr>
<td>选择</td>
<td>课程名</td>
</tr>
<tr>
<td><input type="checkbox" id="ids" value="1"></td>
<td>java程序设计</td>
</tr>
<tr>
<td><input type="checkbox" id="ids" value="2"></td>
<td>mysql数据库</td>
</tr>
<tr>
<td><input type="checkbox" id="ids" value="3"></td>
<td>javaEE应用开发</td>
</tr>
</table>
<input type="submit" value="删除"/>
</form>
</body>
</html>
- 在CourseController中编写接收批量删除课程的方法
package com.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class CourseController {
@RequestMapping("/toCourse")
public String toCourse(){
return "course";
}
@RequestMapping("/deleteCourse")
public String deleteCourse(Integer[] ids){
if(ids!=null){
for (Integer id:ids){
System.out.println("删除了id为"+id+"的课程");
}
}else{
System.out.println("ids=null");
}
return "success";
}
}
- 启动项目
2.绑定集合
示例2-6
- 创建一个com.ssm.vo包,在包中创建UserVo
package com.ssm.vo;
import com.ssm.po.User;
import java.util.List;
public class UserVo {
private List<User> users;
public List<User> getUsers(){
return users;
}
public void setUsers(List<User> users){
this.users=users;
}
}
- 在UserController中编写接收批量修改用户的方法
@RequestMapping("toUserEdit")
public String toUserEdit(){
return "user_edit";
}
@RequestMapping("/editUsers")
public String editUsers(UserVo userList){
List<User> users=userList.getUsers();
for(User user:users){
if(user.getId()!=null){
System.out.println("删除了id为"+user.getId()+"的用户名为"+user.getUsername());
}
}
return "success";
}
- 创建user_edit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改用户</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/editUsers" method="post">
<table>
<tr>
<td>选择</td>
<td>用户名</td>
</tr>
<tr>
<td><input type="checkbox" name="users[0].id" value="1"></td>
<td><input type="checkbox" name="users[0].username" value="zhangsan"></td>
</tr>
<tr>
<td><input type="checkbox" name="users[1].id" value="2"></td>
<td><input type="checkbox" name="users[1].username" value="lisi"></td>
</tr>
</table>
<input type="submit" value="修改"/>
</form>
</body>
</html>
- 启动项目