一、绑定机制
表单中请求参数都是基于 key=value 的。 SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定。处理器适配器调用SpringMVC提供参数绑定组件将key/value数据转成controller方法的形参。
例如:
<a href="springmvc/user?username=zhangsan&age=11">查询用户</a>
@RequestMapping("/user")
public String user(String username, Integer age){
System.out.println("username:" + username+ ",age:" + age);
return "success";
}
注意:提交表单的name和参数的名称是相同的
二、支持的数据类型
- 基本类型参数:包括基本类型和String 类型
- 提交表单的name和参数的名称是相同的
- 区分大小写
- POJO 类型参数:包括实体类,以及关联的实体类
- 提交表单的name和JavaBean中的属性名称需要一致
- 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如: address.name
- 数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)
- 要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
- 给 List 集合中的元素赋值,使用下标。如:list[0].属性
- 给 Map 集合中的元素赋值,使用键值对。
- 接收的请求参数是 json 格式数据。需要借助一个注解实现。@ResponseBody
- SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
三、使用实例
一、基本类型和String类型作为参数
jsp代码:
<a href="springmvc/user?username=zhangsan&age=11">查询用户</a>
控制器代码:
@RequestMapping("/user")
public String user(String username, Integer age){
System.out.println("username:" + username+ ",age:" + age);
return "success";
}
运行结果:
二、POJO类型作为参数
编写Adress.java:
public class Address {
private String province;
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
}
编写user.java:
public class User {
private Integer id;
private String username;
private String password;
private String email;
private int age;
private Address address;
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
编写jsp代码:
<form action="/springmvc/testPojo" method="post">
username:<input type="text" name="username">
<br/>
password:<input type="password" name="password">
<br/>
email:<input type="text" name="email">
<br/>
age:<input type="text" name="age">
<br/>
city:<input type="text" name="address.city">
<br/>
province:<input type="text" name="address.province">
<br/>
<input type="submit" value="提交">
</form>
控制器代码:
@RequestMapping("/testPojo")
public String testPojo(User user){
System.out.println("testPojo:" + user);
return "success";
}
运行结果如下:
由结果可见,当输入中文时,出现了乱码情况,那么如何解决,待我们继续学完集合类型参数再解决这个问题。
三、 POJO 类中包含集合类型参数
实现类代码:
public class User {
private String username;
private String password;
private Integer age;
private List<Account> accounts;
private Map<String,Account> accountMap;
@Override
public String toString() {
return "User [username=" +
username + ", password=" +
password + ", age=" +
age + ",\n accounts=" +
accounts + ",\n accountMap=" + accountMap + "]";
在此处,getter和setter方法省略,请自行补全。
编写jsp代码:
<form action="account/updateAccount" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/> <input type="submit" value=" 保存 "> </form>
控制器代码:
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
System.out.println("更新了账户。。。。" + user);
return "success";
}
三、请求参数乱码问题
在web.xml中配置Spring提供的过滤器类:
<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filterclass>org.springframework.web.filter.CharacterEncodingFilter</filterclass>
<!-- 指定字符集 -->
<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>
----------------------------------------------------------纸上得来终觉浅,绝知此事要躬行---------------------------------------------------------