目录
请求参数的绑定
绑定机制说明
- 绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
- 要求:提交表单的name和参数的名称是相同的
- 支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等)
使用要求
- 如果是基本类型或者 String 类型:
- 要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
@RequestMapping("test1")
public String test1(String username,String password){
System.out.println(username+": "+password);
return "success";
}
- 页面.jsp:
<a href="test1?username='haha'&&password='123'">传递参数</a>
- 如果是 POJO 类型 ,或者它的关联对象 :
- 要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
//实体类
public class User implements Serializable{
private String username;
private String password;
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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
//方法
// pojo传参
@RequestMapping("test2")
public String test2(User user){
System.out.println(user);
return "success";
}
<form action="/test2" method="post">
用户:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
- 如果是集合类型, 有两种方式 :
- 第一种:要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
- 给 List 集合中的元素赋值,使用下标。
- 给 Map 集合中的元素赋值,使用键值对。
- 第二种:接收的请求参数是 json 格式数据。需要借助一个注解实现。
- 第一种:要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
public class User implements Serializable{
private String username;
private String password;
List<Account> list;
Map<String,Account> map;
public List<Account> getList() {
return list;
}
public void setList(List<Account> list) {
this.list = list;
}
public Map<String, Account> getMap() {
return map;
}
public void setMap(Map<String, Account> 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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", list=" + list +
", map=" + map +
'}';
}
}
public class Account implements Serializable {
private String aname;
private Integer money;
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"aname='" + aname + '\'' +
", money=" + money +
'}';
}
}
// 集合传参
@RequestMapping("test3")
public String test3(User user){
System.out.println(user);
return "success";
}
<form action="/test3" method="post">
用户:<input type="text" name="username">
密码:<input type="password" name="password">
<%--list集合--%>
账户:<input type="text" name="list[0].aname">
余额:<input type="text" name="list[0].money">
<%--map集合--%>
账户:<input type="text" name="map['school'].aname">
余额:<input type="text" name="map['school'].money">
<input type="submit" value="提交">
</form>
- SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:HttpServletRequest,HttpServletResponse,HttpSession,java.security.Principal,Locale,InputStream,OutputStream,Reader,Writer
@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request,HttpServletResponse response,HttpSession session) {
System.out.println(request);
System.out.println(response);
System.out.println(session);
return "success";
}
请求乱码问题
- post 请求方式:在 web.xml 中配置一个过滤器
<!-- 配置 springMVC 编码过滤器 -->
<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>
<!-- 启动过滤器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>
自定义转码器
- 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。(S:表示接受的类型,T:表示目标类型)
public class StringToDateConverter implements Converter<String, Date> {
/**
* 用于把 String 类型转成日期类型
*/
@Override
public Date convert(String source) {
DateFormat format = null;
try {
if(StringUtils.isEmpty(source)) {
throw new NullPointerException("请输入要转换的日期");
}
format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(source);
return date;
} catch (Exception e) {
throw new RuntimeException("输入日期有误");
}
}
}
- 第二步:在 spring 配置文件中配置类型转换器。spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。
<!-- 配置类型转换器工厂 -->
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
<property name="converters">
<array>
<!-- 配置自定义类型转换器 -->
<bean class="com.lwb.web.converter.StringToDateConverter"></bean>
</array>
</property>
</bean
- 第三步:在 annotation-driven 标签中引用配置的类型转换服务
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven
conversion-service="converterService">
</mvc:annotation-driven>
常用注解
Request注解
- 作用:用于建立请求 URL 和处理请求方法之间的对应关系。
- 出现位置:
- 类上:
- 请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理:
- 方法上:请求 URL 的第二级访问目录。
- 类上:
- 属性:
- value:用于指定请求的 URL。它和 path 属性的作用是一样的。
- method:用于指定请求的方式。
- params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
- 例如:
- params = {“accountName”},表示请求参数必须有 accountName
- params = {“moeny!100”},表示请求参数中 money 不能是 100。
- 例如:
- headers:用于指定限制请求消息头的条件。
- 注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
RequestParam
- 作用:
- 把请求中指定名称的参数给控制器中的形参赋值。
- 属性:
- value:请求参数中的名称。
- required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,@RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success";
}
RequestBody
- 作用:
- 用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。(get 请求方式不适用。)
- 属性:
- required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。
@RequestMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required=false) String body){
System.out.println(body);
return "success";
}
PathVaribale
- 作用:
- 用于绑定 url 中的占位符。例如:请求 url 中 /findById/{id},这个{id}就是 url 占位符。
- url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
- 属性:
- value:用于指定 url 中占位符名称。
- required:是否必须提供占位符。
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{aid}")
public String usePathVariable(@PathVariable("aid") Integer id){
System.out.println(id);
return "success";
}
RequestHeader
- 作用:用于获取请求消息头。
- 属性:
- value:提供消息头名称
- required:是否必须有此消息头
@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",required=false)String requestHeader){
System.out.println(requestHeader);
return "success";
}
CookieValue
- 作用:
- 用于把指定 cookie 名称的值传入控制器方法参数。
- 属性:
- value:指定 cookie 的名称。
- required:是否必须有此 cookie。
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)
String cookieValue){
System.out.println(cookieValue);
return "success";
}
ModelAttribute
- 作用:
- 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
- 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
- 出现在参数上,获取指定的数据给参数赋值。
- 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
- 属性:
- value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
@ModelAttribute
public void showModel(User user) {
System.out.println("执行了 showModel 方法"+user.getUsername());
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("执行了控制器的方法"+user.getUsername());
return "success";
}
SessionAttribute
- 作用:
- 用于多次执行控制器方法间的参数共享。
- 属性:
- value:用于指定存入的属性名称
- type:用于指定存入的数据类型。
<!-- SessionAttribute 注解的使用 -->
<a href="springmvc/testPut">存入 SessionAttribute</a>
<hr/>
<a href="springmvc/testGet">取出 SessionAttribute</a>
<hr/>
<a href="springmvc/testClean">清除 SessionAttribute</a>
@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
@RequestMapping("/testPut")
public String testPut(Model model){
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
//跳转之前将数据保存到 username、password 和 age 中,因为注解@SessionAttribute 中有
这几个参数
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}