注:这篇博客主要讲的是 SpringMVC 中请求参数的绑定,里面涉及的 环境搭建以及代码 已经在上一篇博客中给出(SpringMVC环境搭建)。
一、请求参数绑定概念
1. 绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的;
- 要求:提交表单的name和参数的名称是相同的;
2. 支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等)
二、请求参数绑定基本数据类型
1. 编写页面代码 param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--请求参数的绑定--%>
<a href="param/testParam?username=haha">请求参数绑定</a>
</body>
</html>
2. 编写控制器代码 ParamController.java
/**
* 请求参数绑定
*/
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 请求参数绑定入门(基本类型)
* @return
*/
@RequestMapping("/testParam")
public String testParam(String username){
System.out.println("执行了。。。");
System.out.println("用户名:" + username);
return "success";
}
}
三、请求参数绑定实体类型(JavaBean)
1. 编写页面代码 param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--把数据封装到 Account 类中--%>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/><%--name和Account中的属性名相同--%>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
用户姓名:<input type="text" name="user.uname"/><br/>
用户年龄:<input type="text" name="user.age"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
2. 编写控制器代码 ParamController.java
/**
* 请求参数绑定
*/
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 请求参数绑定_把数据封装到 JavaBean 的类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了。。。");
System.out.println(account);
return "success";
}
}
3. 编写实体类代码 Account.java 和 User.java
Account.java 代码如下:
package cn.zjw.domain;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
public class Account implements Serializable {
private String username;
private String password;
private Double money;
private User user;
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;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", uname=" + uname +
", age=" + age +
'}';
}
}
User.java 代码如下:
package cn.zjw.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private String uname;
private Integer age;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", age=" + age +
'}';
}
}
四、解决中文乱码问题
在 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>
五、请求参数绑定集合类型
1. 编写页面代码 param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--把数据封装到 Account 类中,类中存在 list 和 map 集合--%>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
<%--数据封装到 User 对象,再封装到 list 集合--%>
用户姓名:<input type="text" name="list[0].uname"/><br/>
用户年龄:<input type="text" name="list[0].age"/><br/>
<%--数据封装到 User 对象,再封装到 map 集合--%>
用户姓名:<input type="text" name="map['one'].uname"/><br/>
用户年龄:<input type="text" name="map['one'].age"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
2. 编写控制器代码 ParamController.java
/**
* 请求参数绑定
*/
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 请求参数绑定_把数据封装到 JavaBean 的类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了。。。");
System.out.println(account);
return "success";
}
}
3. 编写实体类代码 Account.java 和 User.java
User.java 代码同上;
Account.java 代码如下:
package cn.zjw.domain;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
public class Account implements Serializable {
private String username;
private String password;
private Double money;
// private User user;
private List<User> list;
private Map<String, User> map;
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;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", list=" + list +
", map=" + map +
'}';
}
}
六、自定义类型转换器
1. 编写工具类代码 StringToDateConverter.java
package cn.zjw.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 字符串转换成日期类型
*/
public class StringToDateConverter implements Converter<String, Date> {
/**
* String s 传入进来的字符串
* @param s
* @return
*/
@Override
public Date convert(String s) {
//判断
if (s == null){
throw new RuntimeException("请传入数据");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
//把字符串转换成日期
return df.parse(s);
} catch (ParseException e) {
throw new RuntimeException("数据类型转换错误");
}
}
}
2. 配置自定义类型转换器
在 springmvc.xml 中进行如下配置:
代码如下:
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.zjw.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--开启 SpringMVC 框架注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
3. 编写页面代码 param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--自定义类型转换器--%>
<form action="param/saveUser" method="post">
用户姓名:<input type="text" name="uname"/><br/>
用户年龄:<input type="text" name="age"/><br/>
用户生日:<input type="text" name="date"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
4. 编写控制器代码 ParamController.java
package cn.zjw.controller;
import cn.zjw.domain.Account;
import cn.zjw.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 请求参数绑定
*/
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 自定义类型转换器
* @return
*/
@RequestMapping("/saveUser")
public String saveUser(User user){
System.out.println("执行了。。。");
System.out.println(user);
return "success";
}
}
5. 编写实体类代码 User.java
User.java 代码如下:
package cn.zjw.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private String uname;
private Integer age;
private Date date;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", age=" + age +
", date=" + date +
'}';
}
}