文章目录
请求参数类型介绍
客户端请求参数的格式:
name=value&name2=value2...
服务器要获取请求的参数的时候要进行类型转换,有时还需要进行数据的封装。
SpringMVC可以接收如下类型的参数:
- 基本类型参数
- 对象类型参数
- 数组类型参数
- 集合类型参数
获取基本类型参数
Controller
中的业务方法的参数名称要与请求参数的name
一致,参数值会自动映射匹配。并且自动做类型转换。
自动的类型转换是指从String
向其他类型的转换。
<a href="${pageContext.request.contextPath}/user/simpleParam?id=1&username=杰克">
基本类型
</a>
@RequestMapping("/simpleParam")
public String simpleParam(Integer id, String username) {
System.out.println(id);
System.out.println(username);
return "success";
}
获取对象类型参数
Controller
中的业务方法参数的POJO
属性名与请求参数的name
一致,参数值会自动映射匹配。
<form action="${pageContext.request.contextPath}/user/pojoParam" method="post">
编号:<input type="text" name="id"><br>
用户名:<input type="text" name="username"><br>
<input type="submit" value="对象类型">
</form>
public class User {
Integer id;
String username;
// setter getter略过...
}
@RequestMapping("/pojoParam")
public String pojoParam(User user) {
System.out.println(user);
return "success";
}
中文乱码过滤器
当进行
post
请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
<!--配置全局过滤的filter-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 将编码方式设置为UTF-8 -->
<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>
获取数组类型参数
Controller
中的业务方法数组名称与请求参数的name
一致,参数值会自动映射匹配。
<form action="${pageContext.request.contextPath}/user/arrayParam">
编号:<br>
<input type="checkbox" name="ids" value="1">1<br>
<input type="checkbox" name="ids" value="2">2<br>
<input type="checkbox" name="ids" value="3">3<br>
<input type="checkbox" name="ids" value="4">4<br>
<input type="checkbox" name="ids" value="5">5<br>
<input type="submit" value="数组类型">
</form>
@RequestMapping("/arrayParam")
public String arrayParam(Integer[] ids) {
System.out.println(Arrays.toString(ids));
return "success";
}
获取集合(复杂)类型参数
获取集合参数时,需要将集合参数封装到一个
POJO
中。
<form action="${pageContext.request.contextPath}/user/queryParam" method="post">
搜索关键字:
<input type="text" name="keyword"><br>
user对象:
<input type="text" name="user.id" placeholder="编号">
<input type="text" name="user.username" placeholder="姓名"><br>
list集合<br>
第一个元素:
<input type="text" name="userList[0].id" placeholder="编号">
<input type="text" name="userList[0].username" placeholder="姓名"><br>
第二个元素:
<input type="text" name="userList[1].id" placeholder="编号">
<input type="text" name="userList[1].username" placeholder="姓名"><br>
map集合<br>
第一个元素:
<input type="text" name="userMap['u1'].id" placeholder="编号">
<input type="text" name="userMap['u1'].username" placeholder="姓名"><br>
第二个元素:
<input type="text" name="userMap['u2'].id" placeholder="编号">
<input type="text" name="userMap['u2'].username" placeholder="姓名"><br>
<input type="submit" value="复杂类型">
</form>
public class QueryVo {
private String keyword;
private User user;
private List<User> userList;
private Map<String, User> userMap;
}
@RequestMapping("/queryParam")
public String queryParam(QueryVo queryVo) {
System.out.println(queryVo);
return "success";
}
自定义类型转换器
SpringMVC 默认已经提供了一些常用的类型转换器。
例如:客户端提交的字符串转换成int
型进行参数设置,日期格式类型的要求:yyyy/MM/dd
,否则会报错。
而对于特有的行为,SpringMVC提供了自定义类型转换器便于开发者自定义处理。
<form action="${pageContext.request.contextPath}/user/converterParam">
生日:
<input type="text" name="birthday">
<input type="submit" value="自定义类型转换器">
</form>
public class DateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
// 将日期字符串转换成日期对象返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
<!--处理器映射器和适配器增强-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--自定义转换器配置-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="converter.DateConverter"/>
</set>
</property>
</bean>
@RequestMapping("/converterParam")
public String converterParam(Date birthday) {
System.out.println(birthday);
return "success";
}
相关注解
@RequestParam
当请求的参数
name
名称与Controller
的业务方法参数名称不一致时,就需要通过@RequestParam
注解显示的绑定
<a href="${pageContext.request.contextPath}/user/findByPage?pageNo=2">
分页查询
</a>
// @RequestParam()注解的参数说明:
// defaultValue 设置参数默认值
// name 匹配页面传递参数的名称
// required 设置是否必须传递参数,默认值为true;如果设置了默认值,值自动改为false
@RequestMapping("/findByPage")
public String findByPage(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) {
System.out.println(pageNum);
System.out.println(pageSize);
return "success";
}
@RequestHeader
用于获取请求头的数据。
@RequestMapping("/requestHead")
public String requestHead(@RequestHeader("cookie") String cookie) {
System.out.println(cookie);
return "success";
}
@CookieValue
用于获取Cookie中的数据。
@RequestMapping("/cookieValue")
public String cookieValue(@CookieValue("JSESSIONID") String jesessionId) {
System.out.println(jesessionId);
return "success";
}
获取Servlet相关API
SpringMVC支持使用原始
ServletAPI
对象作为控制器方法的参数进行注入,常用的对象如下:
@RequestMapping("/servletAPI")
public String servletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
System.out.println(request);
System.out.println(response);
System.out.println(session);
return "success";
}