数据绑定
获取用户提交的参数,绑定到入参的参数中,就叫做数据绑定。
在Controller中获取Servlet的内置对象(Request、Response、Session)是非常简单的,如下:
@RequestParam
作用:获取请求中的参数,问号后面的请求参数。如果是POST请求,则为请求体中的kv数据。
有三个参数:
1、value:参数名
2、required:是否必须,默认为true,表示请求参数中必须包含该参数,如果不包含则抛出异常。
3、defaultValue:默认参数值,如果设置了该值,则自动将required的值设置为false,如果参数中没有包含该参数,则使用默认值。
例:@RquestParam(value="userId",required=false,defaultValue="1001")
@CookieValue:获取请求参数中的Cookie值
@CookieValue:获取请求参数中的Cookie值
POJO对象绑定参数
SpringMVC会将请求过来的参数名和POJO实体中的属性名进行匹配,如果名称一致,将把值填充到对象中。
package com.its.springmvc.pojo;
public class User {
private Long userId;
private String username;
private String password;
private String realName;
private int sex;
private int age;
private String birthday;
private String phone;
// setter、getter方法略...
@Override
public String toString() {
return "User [userId=" + userId + ", username=" + username + ", password=" + password + ", realName=" + realName
+ ", sex=" + sex + ", age=" + age + ", birthday=" + birthday + ", phone=" + phone + "]";
}
}
使用工具构建POST请求:Advanced Rest Client
响应结果:
Java的基本数据类型绑定:
Spring对Java的基本数据类型的转换支持的非常多,基本能满足日常开发需要,默认支持的数据类型在
org.springframework.beans.PropertyEditorRegistrySupport
中定义。
示例:
register.jsp
<div>
<form action="/its/test12.action" method="post">
用户名:<input type="text" name="username" id="username" /><br/>
密码:<input type="password" name="password" id="password" /><br/>
性别:<input type="radio" name="sex" value="1" />男
<input type="radio" name="sex" value="0" />女<br/>
年龄:<input type="text" name="age" id="age" /><br/>
收入:<input type="text" name="income" id="income" /><br/>
是否结婚:<input type="radio" name="isMarried" value="1" />是
<input type="radio" name="isMarried" value="0" />否<br/>
兴趣爱好:<input type="checkbox" name="hobby" value="swimming" />游泳
<input type="checkbox" name="hobby" value="reading" />阅读
<input type="checkbox" name="hobby" value="singing" />唱歌<br/>
<input type="submit" value="立即注册" />
<input type="reset" value="重置" />
</form>
</div>
Controller
@RequestMapping(value = "test12")
// 无需跳转页面,直接返回状态码200
@ResponseStatus(value = HttpStatus.OK)
public void test12(@RequestParam("username") String username, @RequestParam("password") String password,
@RequestParam("age") Integer age, @RequestParam("sex") Integer sex, @RequestParam("income") Double income,
@RequestParam("isMarried") Boolean isMarried, @RequestParam("hobby") String[] hobby) {
System.out.println("=====基本数据类型======");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
System.out.println("年龄:" + age);
System.out.println("性别:" + sex);
System.out.println("收入:" + income);
System.out.println("是否结婚:" + isMarried);
for (String h : hobby) {
System.out.println(h);
}
System.out.println("====================");
}
测试结果:
绑定List集合
注意:List的绑定需要先将List对象包装到一个类中的才能绑定。
示例:
users.jsp
<div>
<form action="/its/test13.action" method="post">
<div>用户1:</div>
<div><input type="text" name="users[0].username" value="zhangsan" /></div>
<div>用户2:</div>
<div><input type="text" name="users[1].username" value="lisi" /></div>
<div>用户3:</div>
<div><input type="text" name="users[2].username" value="wangwu" /></div>
<div><input type="submit" value="提交表单" /></div>
</form>
</div>
UserForm.java
package com.its.springmvc.pojo;
import java.util.ArrayList;
import java.util.List;
public class UserForm {
private List<User> users = new ArrayList<User>(); // 需要将List集合包装成对象
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String toString() {
return "UserForm [users=" + users + "]";
}
}
Controller
测试:控制台打印结果
UserForm [users=[User [userId=null, username=zhangsan, password=null, realName=null, sex=0, age=0, birthday=null, phone=null], User [userId=null, username=lisi, password=null, realName=null, sex=0, age=0, birthday=null, phone=null], User [userId=null, username=wangwu, password=null, realName=null, sex=0, age=0, birthday=null, phone=null]]]
SpringMVC和Struts2的区别:
1、入口不同。SpringMVC的入口是一个Servlet,Struts2的入口是一个过滤器Filter,两者的实现机制不同。
2、设计方式不同。SpringMVC基于方法设计,传递的参数是通过方法形参,其实现是单例模式(也可以改为单例,推荐使用单例),Struts2基于类设计,传递参数是通过类的属性,只能是多实例,性能上SpringMVC更高一些。
3、参数传递方面。Struts2是用类的属性接收的,也就是在多个方法间共享,而SpringMVC是基于方法的,多个方法之间不能共享。