请求处理方法签名
- Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。
- 必要时可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)、
- Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。
@RequestParam注解
- 在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
- value:参数名
- required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
- defaultValue: 默认值,当没有传递参数时使用该值
实验代码
- 增加控制方法
1
2
3
4
5@RequestMapping("testRequestParam")
public String testRequestParam(@RequestParam(value="username")String username, @RequestParam(value="age")Integer age) {
System.out.println("testRequestParam---username:"+username+",age:"+age);
return "success";
} - 页面链接代码
1
<a href="testRequestParam?username=atguigu&age=10">testRequestParam</a>
@RequestHeader注解
- 使用 @RequestHeader 绑定请求报头的属性值
- 请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
- 也有三个参数value、defaultValue、required
实验代码
- 控制器代码
1
2
3
4
5@RequestMapping("testRequestHeader")
public String testRequestHeader(@RequestHeader(value="User-Agent")String aa) {
System.out.println("testRequestHeader---UserAgent" + aa);
return "success";
} - 页面链接
1
<a href="testRequestHeader">testRequestHeader</a>
@CookieValue注解
- 使用 @CookieValue 绑定请求中的 Cookie 值
- @CookieValue 可让处理方法入参绑定某个 Cookie 值
- 控制器代理
1
2
3
4
5@RequestMapping("testCookieMethod")
private String testCookieMethod(@CookieValue(value="JSESSIONID")String sessionID) {
System.out.println("Cookie:JSESSIONID="+sessionID);
return "success";
} - 页面链接
1
<a href="testCookieMethod">testCookieMethod</a>
使用POJO作为参数
- 使用 POJO 对象绑定请求参数值
- Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等
控制器方法
1
2
3
4
5@RequestMapping("testPOJO")
public String testPOJO(Person person) {
System.out.println(person);
return "success";
}表单页面代码
1
2
3
4
5
6
7
8<form action=" testPOJO" method="POST">
username: <input type="text" name="name"/><br>
password: <input type="password" name="pwd"/><br>
email: <input type="text" name="email"/><br>
gender: <input type="text" name="gender"/><br>
<input type="submit" value="Submit"/>
</form>增加实体类
1
2
3
4
5
6
7
8public class Person {
private String name;
private String pwd;
private String gender;
private String email;
//getter/setter
}
使用POJO出现乱码如何解决?
- 如果中文有乱码,需要配置字符编码过滤器,且配置其他过滤器之前,
如(HiddenHttpMethodFilter),否则不起作用。(思考method=”get”请求的乱码问题怎么解决的)1
2
3
4
5
6
7
8请求乱码:
GET请求: 改server.xml,在8080端口处URIEncoding=”UTF-8”
POST请求: 在第一次请求参数之前设置
Request.setCharacterEncoding(“UTF-8”)
自定义Filter, SpringMVC
封装有org.springframework.web.filter.CharacterEncodingFilter
响应乱码:
Response.setContentType(“text/html;charset=utf-8”)
过滤器配置
1 | <filter> |
使用Servlet原生API作为参数
MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数
1) HttpServletRequest
2) HttpServletResponse
3) HttpSession
4) java.security.Principal
5) Locale
6) InputStream
7) OutputStream
8) Reader
9) Writer源码参考:AnnotationMethodHandlerAdapter L866

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48@Override
protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
if (ServletRequest.class.isAssignableFrom(parameterType) ||
MultipartRequest.class.isAssignableFrom(parameterType)) {
Object nativeRequest = webRequest.getNativeRequest(parameterType);
if (nativeRequest == null) {
throw new IllegalStateException(
"Current request is not of type [" + parameterType.getName() + "]: " + request);
}
return nativeRequest;
}
else if (ServletResponse.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true;
Object nativeResponse = webRequest.getNativeResponse(parameterType);
if (nativeResponse == null) {
throw new IllegalStateException(
"Current response is not of type [" + parameterType.getName() + "]: " + response);
}
return nativeResponse;
}
else if (HttpSession.class.isAssignableFrom(parameterType)) {
return request.getSession();
}
else if (Principal.class.isAssignableFrom(parameterType)) {
return request.getUserPrincipal();
}
else if (Locale.class.equals(parameterType)) {
return RequestContextUtils.getLocale(request);
}
else if (InputStream.class.isAssignableFrom(parameterType)) {
return request.getInputStream();
}
else if (Reader.class.isAssignableFrom(parameterType)) {
return request.getReader();
}
else if (OutputStream.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true;
return response.getOutputStream();
}
else if (Writer.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true;
return response.getWriter();
}
return super.resolveStandardArgument(parameterType, webRequest);
}