请求参数的绑定
众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springmvc中如何接收前台页面的参数,即springmvc中的参数绑定问题。
总结:
绑定机制:
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的。
- 要求:提交表单的name和参数的名称是相同的。
支持的数据类型:
- 基本数据类型和字符串类型。
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等等)
基本数据类型和字符串类型:
- 提交表单的name和参数的名称一定要相等。
- 区分大小写。
实体类型(JavaBean):
- 提交表单的name和JavaBean中的属性名称需要一致。
- 如果一个JavaBean类中包含其他的应用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
给集合属性数据封装:
- JSP页面编写方式:list[0].属性
请求参数中文乱码的解决:
- 在web.xml中配置Spring提供的过滤器类。
<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>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>
案例:
1、利用a标签进行数据的传输。
jsp代码块
<a href="param/testParam?username=hehe">请求参数绑定</a>
控制器代码块
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/testParam")
public String testParam(String username){
System.out.println(username+"执行了。。。");
return "success";
}
}
运行结果
2、利用JavaBean的方式对数据进行封装和传输。
首先要创建一个类来存储数据。Account,让其序列化。
package cn.itcast.domain;
import java.io.Serializable;
public class Account implements Serializable {
private String username;
private String password;
private Double money;
private User user;
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", user=" + user +
'}';
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.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;
}
}
其次因为类里面包含了其他的类的情况,所以还需要在准备一个类 User
package cn.itcast.domain;
import java.io.Serializable;
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 +
'}';
}
}
再者编写jsp页面,界面上输入的内容是JavaBean封装的Accout类里面的属性。
因为Account里面还封装了另外一个User类,所以在调用的时候的name要使用 user.属性的方式。
<center>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密码:<input type="password" 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>
</center>
接下来在编写控制器代码。
其实和原来的代码也没什么区别就是在类型上面将常见的类型写成我们自己编写的类型。
/**
* 请求参数绑定把数据封装到JavaBean的类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了...");
System.out.println(account);
return "success";
}
最后运行结果
以上的程序是将数据通过类进行封装使用Javabean的方式进行传输,如果封装的类里面有其他的类的话 在jsp的name属性里面填写 类名.属性名的方式进行数据的传输。
把数据封装到Account类中,类中存在list和map的集合。
首先改写封装Javabean的类,添加list和map集合。 Account
package cn.itcast.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 List<User> list;
private Map<String,User> map;
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", list=" + list +
", map=" + map +
'}';
}
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;
}
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;
}
}
因为,list的集合里面写的是我们自己编写的类User的类型,所以要准备里面包含的类 User
package cn.itcast.domain;
import java.io.Serializable;
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 +
'}';
}
}
之后编写jsp页面,因为Account里面有User的list以及Map的集合类型,所以我们再使用的时候要注意以下的格式list集合要使用 list[0].属性名,map集合要使用map[‘one’].属性名,因为map里面使用的是键值对的方式,所以我我们就是用了,one这个键。
<center>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
金额: <input type="text" name="money" /><br/>
用户姓名:<input type="text" name="list[0].uname" /><br/>
用户年龄: <input type="text" name="list[0].age" /><br/>
用户姓名:<input type="text" name="map['one'].uname" /><br/>
用户年龄: <input type="text" name="map['one'].age" /><br/>
<input type="submit" value="提交">
</form>
</center>
编写控制器代码
/**
* 请求参数绑定把数据封装到JavaBean的类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了...");
System.out.println(account);
return "success";
}
运行结果
以上的程序是使用了list集合以及map集合,以及在类里面包含了另外一个类,所以在jsp页面填写name的时候 填写list集合的时候要填写 list[0].属性名 填写map集合的时候要填写 map[‘名称’].属性名。如此就可将jsp中的数据全部提交到Controller中。
项目链接
提取码: qqcz