Spring MVC中POJO绑定是怎么做的

164 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天

POJO绑定

在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果我们仍然使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较繁琐。为解决这个问题,我们使用POJO类型进行数据绑定。

POJO类型的绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用POJO作为形参来完成数据绑定。

例:

比如我们创建一个User类用来封装用户信息(这里的User类就是POJO):

public class User{
    private String username;
    private String password;
    //setter、getter
}

处理器:

@RequestMapping("/registerUser")
//接收user
public void registerUser(User user){
    String username = user.getUsername();
    String password = user.getPassword();
    System.out.println("username = " + username + ", password = " + password);
}

用户注册表单:

<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>

注意:POJO类型数据绑定时,客户端请求的参数名称(本例中指form表单内各元素name的属性值)必须与要绑定的POJO类中的属性名称保持一致。这样客户端发送请求时,请求数据才会自动绑定到处理器形参POJO对象中,否则处理器参数接收的值为null。

POST请求乱码问题

为了防止客户端传入的中文数据出现乱码,可以使用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>
GET请求乱码问题

对于get请求中文参数出现乱码,可以在使用参数之前重新编码。

String usernmae = new String(user.getUsername().getBytes("ISO8859-1"),"UTF-8");

其中ISO8859-1是Tomcat默认编码,需要将Tomcat编码后的内容再按UTF-8编码。