文章目录
一、为什么使用它
在执行程序的时候,SpringMVC根据客户端请求参数的不同将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中,这种将请求消息数据与后台方法参数建立连接的过程就是SpringMVC中的数据绑定。
二、如何使用
1、默认数据类型
当前端请求的参数比较简单的时候,可以在后台方法的形参中直接使用SpringMVC提供的默认参数类型进行数据绑定
常用的默认参数类型如下:
- HttpServletRequest:通过request对象获取请求信息
- HttpServletResponse:通过response对象处理响应信息
- HttpSession:通过session对象得到session中存储的对象
- Model/ModelMap:Model是一个接口,Model是一个接口实现,作用是将Model数据填充到request域
简单的使用HttpServletRequest类型
①、导包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
②、在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>
<!--初始化时加载springmvc配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!--在启动的时候就执行-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<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>utf8</param-value>
</init-param>
</filter>
<!--/*表示所有网页都会被过滤-->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
③、创建springmvc配置文件
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--注解扫描包-->
<context:component-scan base-package="controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
④、创建controller类
@Controller
public class UserController {
//绑定默认数据类型
@RequestMapping("getInfo1")
public String getInfo1(HttpServletRequest req) {
String id = req.getParameter("id");
System.out.println(id);
return "success";//去jsp中寻找success.jsp页面
}
}
⑤、创建success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
执行成功!
</body>
</html>
⑥、启动tomcat服务器
后台的控制台输出,第一次未传参的时候输出null,第二次传入id=2的时候输出2
2、简单数据类型
简单数据类型就是指java中几种基本数据类型,如int,String,Double等类型
修改UserController类
@Controller
public class UserController {
//绑定默认数据类型
@RequestMapping("getInfo1")
public String getInfo1(HttpServletRequest req) {
String id = req.getParameter("id");
System.out.println(id);
return "success";
}
//绑定简单数据类型
//@RequestParam("user_id")表示http://localhost:8080/getInfo1?user_id=2,然后将user_id的值传入给id,输出到控制台
@RequestMapping("getInfo2")
public String getInfo2(@RequestParam("user_id") Integer id) {
System.out.println(id);
return "success";
}
结果和刚才一致!
分析一下@RequestParam注解
属性 | 说明 |
---|---|
value | name属性的别名,这里指参数的名字,即入参的请求参数名字。如果只使用value属性,就可以省略value属性名 |
name | 指定请求头绑定的名称 |
required | 指定参数是否必须,默认是true,表示请求中一定要有相应的参数 |
defaultValue | 默认值,表示如果请求中没有同名参数的默认值 |
3、绑定pojo类型
①、在pojo中创建User实体类
@Data//导入lombok包
public class User {
private Integer id;
private String username;
private String password;
}
②、修改Usercontroller类
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import pojo.User;
import pojo.UserVo;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
public class UserController {
//绑定pojo类型,制作一个简单的注册操作,并且返回注册的账号密码
//如果username中存在中文,就会出现乱码问题,我们可以在web.xml中配置过滤器解决
@RequestMapping("toRegister")
public String toRegister() {
return "register";
}
@RequestMapping("toRegisterUser")
public String toRegisterUser(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}/toRegisterUser" method="post">
用户名:<input type="text" name="username"><br/>
密 码:<input type="password" name="password"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
④、启动Tomcat服务器
后端控制台输出为
注意中文乱码问题,在最上面web.xml中已经写出解决方案了
4、包装pojo
①、创建班级实体类和学生实体类
@Data
public class StudentClass {
private Integer class_id;
private String class_name;
}
@Data
public class Student {
private Integer stu_id;
private String stu_name;
private StudentClass stu_class;
}
②、创建StudentController
//绑定包装pojo
@Controller
public class StudentController {
//向学生查询页面跳转
@RequestMapping("to")
public String to() {
return "student";
}
/*
必须要注意的是参数名的问题!
*/
//查询学生和班级信息
@RequestMapping("getInformation")
public String getInformation(Student student) {
int stu_id = student.getStu_id();
String stu_name = student.getStu_name();
StudentClass stu_class = student.getStu_class();
String class_name = stu_class.getClass_name();
System.out.println("学生的学号是" + stu_id);
System.out.println("学生的姓名是" + stu_name);
System.out.println("学生的班级是" + class_name);
return "success";
}
}
③、student.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生查询</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/getInformation" method="post">
学生编号:<input type="text" name="stu_id"/><br>
学生姓名:<input type="text" name="stu_name"/><br>
所属班级:<input type="text" name="stu_class.class_name"/><br>
<input type="submit" value="查询">
</form>
</body>
</html>
④、启动Tomcat服务器
后台控制台输出
参数名的问题的分析!
- 如果查询条件参数是包装类的直接基本属性,参数名就直接用对应的属性名,如上述代码中的stu_id
- 如果查询条件参数是包装类中的pojo的子属性,参数名就必须为[对象.属性],其中对象要和包装类pojo中的对象属性名称一致,属性要和包装类pojo中的对象子属性一直,如上述代码的stu_class.class_name
5、复杂数据
在实际开发中,可能会遇到前端请求需要传递到后台一个或多个相同名称参数的情况,此时不适合采用简单数据绑定,可以采用绑定数组的方式
简单的使用数组来批量删除用户信息的例子
①、course.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="content-type" content="text/html" charset="UTF-8">
<title>课程列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/deleteCourse" method="post">
<table>
<tr>
<td>选择</td>
<td>课程名</td>
</tr>
<tr>
<td><input type="checkbox" name="ids" value="1"></td>
<td>java</td>
</tr>
<tr>
<td><input type="checkbox" name="ids" value="2"></td>
<td>mysql数据库</td>
</tr>
<tr>
<td><input type="checkbox" name="ids" value="3"></td>
<td>c</td>
</tr>
<tr>
<td><input type="checkbox" name="ids" value="4"></td>
<td>web程序开发</td>
</tr>
</table>
<input type="submit" value="删除"/>
</form>
</body>
</html>
②、CourseController类
@Controller
public class CourseController {
//向课程页面跳转
@RequestMapping("toCourse")
public String toCourse() {
return "course";
}
//删除课程
@RequestMapping("deleteCourse")
public String deleteCourse(int[] ids) {
if (ids != null) {
for (int id:ids) {
System.out.println("删除了id为"+id+"的课程");
}
}else {
System.out.println("ids=null");
}
return "success";
}
}
③、启动Tomcat服务器
后台控制器的输出
用集合来修改多个相同类型的信息
①、创建UserVo类
@Data
public class UserVo {
private List<User> users;
}
②、修改UserController类
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import pojo.User;
import pojo.UserVo;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
public class UserController {
//批量修改用户的方法
//向网页跳转到用户批量修改
@RequestMapping("toUserEdit")
public String toUserEdit(){
return "useredit";
}
//接受批量修改用户的方法
@RequestMapping("editUsers")
public String editUser(UserVo userVo) {
List<User> users = userVo.getUsers();
for (User user:users) {
if (user.getId() != null) {
System.out.println("修改了id为"+user.getId()+"的用户名为"+user.getUsername());
}
}
return "success";
}
}
③、useredit.jsp
<html>
<head>
<meta http-equiv="content-type" content="text/html" charset="UTF-8">
<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="text" name="users[0].username" value="zhangsan"></td>
</tr>
<tr>
<td><input type="checkbox" name="users[1].id" value="2"></td>
<td><input type="text" name="users[1].username" value="lisi"></td>
</tr>
</table>
<input type="submit" value="修改">
</form>
</body>
</html>
④、启动Tmocat服务器
后端控制台输出:
这里可以发现,如果不勾选前面,就无法进行修改,只有勾选了才可以批量修改