目录
一.简单数据绑定
二.绑定POJO类型
三.绑定包装POJO
四.绑定数组
五.绑定集合
一.简单数据绑定
1.先用Eclipse创建一个动态web项目,导入Spring MVC依赖的包,jre设置为JavaSE-15(需要用到注解,否则会出现版本错误)
2.在WEB-INF目录下创建web.xml,配置Spring MVC的前端控制器等信息
<?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"
id="WebApp_ID" 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>
3.在src目录下创建Spring MVC的核心配置文件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="controller" />
<!--视图解析器 -->
<bean id="viewResoler"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
4.创建一个包命名为controller,在类中创建UserController类用于用户操作
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@RequestMapping(value = "/selectUser")
public String selectUser(HttpServletRequest request) {
String idString=request.getParameter("id");
System.out.println("id="+idString);
return "success";
}
}
由于标注在类上的@RequestMapping注解的value值为"/selectUser",因此,类中所有请求方法的路径都需要加上"/selectUser"
return "success"表示返回的是一个名为success的jsp
5.创建一个视图success.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>ok,thank you!!!</h1>
</body>
</html>
6.运行:localhost:8848/chapter12/selectUser?id=1
视图界面:
从后台我们可以看到我们已经通过HttpServletRequest获取的id
这就是绑定默认数据类型。
7.绑定简单数据类型
简单数据类型的绑定,就是指Java中几种基本数据类型的绑定,如int、String、Double等类型。
给UserController类添加addUser方法
@RequestMapping(value = "/addUser")
public String addUser(Integer id) {
System.out.println("id="+id);
return "success";
//访问:http://localhost:8848/chapter12/selectUser?id=1
}
有时候,前端请求中参数名和后台控制器类方法中的形参名不一样,就会导致后台无法正确绑定并接收不到前端请求的参数,为此,SpringMVC提供了@RequestParam注解来进行间接数据绑定。
例如:
@RequestMapping(value = "/addUser")
public String addUser(@RequestParam(value = "user_id") Integer id) {
System.out.println("id="+id);
return "success";
//访问:http://localhost:8848/chapter12/selectUser?user_id=1
}
运行结果与上图一致。
二.绑定POJO类型
在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较烦琐。此时就可以使用POJO类型进行数据绑定。
POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
1.在src目录下创建一个包命名为po,在包内创建User类
package 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;
}
}
2.在控制器UserController类中编写向注册页面跳转和接受用户注册信息的方法
@RequestMapping("/toRegister")
public String toRegister() {
//访问http://localhost:8848/chapter12/toRegister跳转到register.jsp
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";
}
3.在webapp目录下创建register.jsp该界面编写用户注册表单,表单以POST方式提交
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">
用户名:<input type="text" name="username" /> <br />
密 码:<input type="password" name="password" /> <br />
<input type="submit" value="注册" />
</form>
</body>
</html>
4.运行查看效果
可以看到访问http://localhost:8848/chapter12/toRegister跳转到register.jsp
输入用户名和密码后跳转到了success.jsp
Eclipse的控制台上也会显示我们输入的信息
由此可知,使用POJO类型同样可以获取前端请求传递过来的数据信息。
在前端请求中,难免有中文信息传递,虽然浏览器显示中文信息,但是控制台上会出现中文乱码。可以使用Spring提供的编码过滤器来统一编码,只需要在web.xml中添加以下代码:
<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>
三.绑定包装POJO
所谓的包装POJO,就是在一个POJO中包含另一个简单POJO。例如,在学生对象中包含班级对象。这样在使用时,就可以通过学生查询到班级信息。
1.在po包下创建Banji和Student类
package 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 po;
public class Student {
private Integer stu_id;
private String stu_name;
private Banji banji;
public Banji getBanji() {
return 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 void setBanji(Banji banji) {
this.banji = banji;
}
}
2.在controller包下创建一个StudentController类
package controller;
import org.springframework.web.bind.annotation.RequestMapping;
import po.Banji;
import po.Student;
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";
}
}
3.在webapp目录下创建student.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<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>
4.运行结果
访问:http://localhost:8848/chapter12/tofindStudentWithBanji跳转到student.jsp
输入信息点击查询后跳转到success.jsp
控制台可以收到前端输入的内容
四.绑定数组
实际项目开发中,除了简单数据类型,还会经常遇到一些比较复杂的数据绑定问题,比如数组的绑定、集合的绑定。
在实际开发时,可能会遇到前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),此时不合适采用简单数据绑定,而可以使用绑定数组的方式。
1.在webapp目录下创建course.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<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 name="ids" value="1" type="checkbox"></td>
<td>JAVA程序设计</td>
</tr>
<tr>
<td><input name="ids" value="2" type="checkbox"></td>
<td>MySQL数据库</td>
</tr>
<tr>
<td><input name="ids" value="3" type="checkbox"></td>
<td>JavaEE应用开发</td>
</tr>
</table>
<input type="submit" value="删除"/>
</form>
</body>
</html>
2.在controller包下创建CourseController类
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class CourseController {
@RequestMapping("/toCourse")
public String toCourse(){
//访问http://localhost:8848/chapter12/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";
}
}
3.运行结果
访问http://localhost:8848/chapter12/toCourse跳转到course.jsp
选择课程删除后,跳转到success.jsp,同时eclipse的控制台可以打印出删除的课程
五.绑定集合
在项目中,前端请求传递过来的数据可能就会批量包含各种类型的数据,如 Integer、String等。这种情况使用数组绑定是无法实现的。针对这种情况,可以使用集合数据绑定,即在包装类中定义一个包含对象类的集合,然后在接收方法中将参数类型定义为该包装类的集合。
1.在src目录下创建vo包,在包内创建UserVo类
package vo;
import java.util.List;
import po.User;
public class UserVo {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
2.在UserController类中添加批量修改用户的方法
@RequestMapping("/toUserEdit")
public String toUserEdit() {
//访问:http://localhost:8848/chapter12/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";
}
3.在webapp目录下创建user_edit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<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 name="users[0].id" value="1" type="checkbox"></td>
<td><input name="users[0].username" value="zhangsan" type="text"></td>
</tr>
<tr>
<td><input name="users[1].id" value="2" type="checkbox"></td>
<td><input name="users[1].username" value="lisi" type="text"></td>
</tr>
</table>
<input type="submit" value="修改"/>
</form>
</body>
</html>
4.运行结果
访问:http://localhost:8848/chapter12/toUserEdit
点击修改后,跳转到success.jsp并在控制台上可以获取前端修改的信息