SpringMVC中的参数绑定过程使把表单提交的请求参数,作为控制器中方法的参数进行绑定的,要求提交表单的“name”属性和方法参数名称相符,支持的数据类型有:
- 基本数据类型和字符串类型;
- 实体类型(JavaBean);
- 集合数据类型(List、Map集合等);
1、绑定基本数据类型和字符串类型
提交表单的“name”属性和方法参数的名称一致,注意区分大小写。
- 请求网页:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入门程序</title>
</head>
<body>
<h3>程序入口</h3>
<a href="param/saveData?name=LiHua&age=20">saveUser</a>
</body>
</html>
- 控制器:ParamController.java
@Controller
@RequestMapping(path = "/param")
public class ParamController {
@RequestMapping(path = "/saveData")
public String saveUser(String name, Integer age){
System.out.println("name: " + name + "\n" + "age: " + age);
return "success";
}
}
- 运行结果:
2、绑定实体类型
提交表单的“name”要和JavaBean中的属性名称一致,如果JavaBean类中包含其他的引用类型,则表单的“name”属性需要编写成:对象.属性。
2.1 普通JavaBean类
- JavaBean类:User.java,需要实现 Serializable 接口,且需有 set()、get() 方法。
public class User implements Serializable {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 控制器中的方法:直接在方法中传入JavaBean类对象
@RequestMapping(path = "/saveUser")
public String saveUser(User user){
System.out.println(user);
return "success";
}
- 测试 form 表单:
<form action="param/saveUser" method="post">
姓名:<input type="text" name="name" /><br/>
年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交"><br/><br/>
</form>
- 运行结果:
2.2 含引用类型的JavaBean类
- JavaBean类:Account.java,有引用类型作为属性。
public class Account {
private Integer money;
private User user;
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Account{" +
"money=" + money +
", user=" + user +
'}';
}
}
- 控制器中的方法:也是直接在方法中传入JavaBean类对象
@RequestMapping(path = "/saveAccount")
public String saveAccount(Account account){
System.out.println(account);
return "success";
}
- 测试 form 表单:
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="user.name" /><br/>
年龄:<input type="text" name="user.age" /><br/>
金额:<input type="text" name="money" /><br/>
<input type="submit" value="提交"><br/><br/>
</form>
- 运行结果:
3、绑定集合类型
在jsp页面中,以 集合名[index].属性 的方式编写。
- 测试JavaBean类:
public class MyAccount {
private List<User> userList;
private Map<String, User> userMap;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public Map<String, User> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, User> userMap) {
this.userMap = userMap;
}
@Override
public String toString() {
return "MyAccount{" +
"userList=" + userList +
", userMap=" + userMap +
'}';
}
}
- 测试控制器类:
@RequestMapping(path = "/saveMyAccount")
public String saveMyAccount(MyAccount myAccount){
System.out.println(myAccount);
return "success";
}
- 测试 form 表单:
<form action="param/saveMyAccount" method="post">
姓名1:<input type="text" name="userList[0].name" /><br/>
年龄1:<input type="text" name="userList[0].age" /><br/>
姓名2:<input type="text" name="userMap['one'].name" /><br/>
年龄2:<input type="text" name="userMap['one'].age" /><br/>
<input type="submit" value="提交"><br/><br/>
</form>
- 运行结果:
4、自定义类型转换器
在SpringMVC中,框架会自动将请求参数(String类型)转换为我们接收的对应类型,例如,会自动将字符串 “2020/4/7” 转换为 Date 类型,但是,如果传入的日期字符串格式为 “2020-4-7” 时,则会转换失败,这时候就需要我们自定义类型转换器了。
- 自定义类型转换器,需要实现 Converter 接口:
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
try{
return new SimpleDateFormat("yyyy-MM-dd").parse(s);
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
- 在spring配置文件(springmvc.xml)中配置:
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.lyj.param.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>
- 控制器方法:
@RequestMapping(path = "/saveDate")
public String saveDate(Date date){
System.out.println(date);
return "success";
}
- 测试 form 表单:
<form action="param/saveDate" method="post">
日期:<input type="text" name="date" /><br/>
<input type="submit" value="提交"><br/><br/>
</form>
- 测试结果:覆盖了原来的 StringToDateConverter 转换器(因为存储各种String转换器的是一个set集合),默认的日期转换器可以转换字符串 “2020/4/7” 这种格式。
5、获取Servlet原生API
直接在控制器的方法中,定义想要调用的对象即可。
@RequestMapping(path = "/save")
public String save(HttpServletRequest request, HttpServletResponse response){
System.out.println(request);
System.out.println(response);
return "success";
}
6、配置解决中文乱码的过滤器
在 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>