绑定POJO类型
在使用简单数据类型绑定时,可以很容易的根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较繁琐。此时就可以使用POJO类型进行数据绑定。
POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
接下来通过一个用户注册案例,来演示POJO类型数据的绑定,具体实现步骤如下。
(1)在src目录下,创建一个com.itheima.po包,在该包下创建一个User类来封装用户注册的信息参数,编辑后如文件1所示。
文件1 User.java
1 package com.itheima.po;
2 /**
3 * 用户POJO类
4 */
5 public class User {
6 private Integer id; //用户id
7 private String username; //用户
8 private Integer password;//用户密码
9 public Integer getId() {
10 return id;
11 }
12 public void setId(Integer id) {
13 this.id = id;
14 }
15 public String getUsername() {
16 return username;
17 }
18 public void setUsername(String username) {
19 this.username = username;
20 }
21 public Integer getPassword() {
22 return password;
23 }
24 public void setPassword(Integer password) {
25 this.password = password;
26 }
27 }
(2)在控制器UserController类中,编写接收用户注册信息和向注册页面跳转的方法,代码如下所示。
/**
* 向用户注册页面跳转
*/
@RequestMapping("/toRegister")
public String toRegister( ) {
return "register";
}
/**
* 接收用户注册信息
*/
@RequestMapping("/registerUser")
public String registerUser(User user) {
String username = user.getUsername();
Integer password = user.getPassword();
System.out.println("username="+username);
System.out.println("password="+password);
return "success";
}
(3)在/WEB-INF/jsp目录下,创建一个用户注册页面register.jsp,在该界面中编写用户注册表单,表单需要以POST方式提交,并且在提交时会发送一条以“/registerUser”结尾的请求消息,如文件2所示。
文件2 register.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <html>
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
6 <title>注册</title>
7 </head>
8 <body>
9 <form action="${pageContext.request.contextPath }/registerUser"
10 method="post">
11 用户名:<input type="text" name="username" /><br />
12 密 码:<input type="text" name="password" /><br />
13 <input type="submit" value="注册"/>
14 </form>
15 </body>
16 </html>
注意:
在使用POJO类型数据绑定时,前端请求的参数名(本例中指form表单内各元素的name属性值)必须与要绑定的POJO类中的属性名一样,这样才会自动将请求数据绑定到POJO对象中,否则后台接收的参数值为null。
(4)将项目发布到Tomcat服务器并启动,在浏览器中访问地址http://localhost:8080/chapter13/toRegister
,就会跳转到用户注册页面register.jsp,如图1所示。
图1 register.jsp注册页面
在图1中,填写对应的用户名和密码,然后单击“注册”按钮即可完成模拟注册功能。这里假设用户注册的用户名和密码分别为“tom”和“123”,当单击“注册”按钮后,浏览器会跳转到结果页面,此时控制台的输出结果如图2所示。
图2 运行结果
从图2可以看出,使用POJO类型同样可以获取前端请求传递过来的数据信息,这就是POJO类型的数据绑定。
多学一招:解决请求参数中的中文乱码问题
在前端请求中,难免会有中文信息传递,例如在图13-6中的用户名和密码输入框中输入用户名“小雪”和密码“123”时,虽然浏览器可以正确跳转到结果页面,但是在控制台中输出的中文信息却出现了乱码,如图3所示。
图3 运行结果
从图3可以看到,密码信息已正确显示,但用户名却显示为“?°?é??”。
为了防止前端传入的中文数据出现乱码问题,我们可以使用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>
上述代码中,通过<filter-mapping>元素的配置会拦截前端页面中的所有请求,并交由名称为CharacterEncodingFilter的编码过滤器类进行处理;在<filter>元素中,首先配置了编码过滤器类org.springframework.web.filter.CharacterEncodingFilter,然后通过初始化参数设置统一的编码为UTF-8。这样所有的请求信息内容都会以UTF-8的编码格式进行解析。
配置完成后,再次在页面中输入中文用户名“小雪”以及密码“123”,此时控制台的打印信息如图4所示。
图4 运行结果
从图4可以看出,控制台中已经正确显示出了中文数据,这说明编码过滤器配置成功。