1.通过ServletAPI获取
- 将
HttpServletRequest
作为控制器方法的形参,此时HttpServletRequest
类型的参数表示封装了当前请求的请求报文的对象:<body> <h1>测试请求参数</h1> <a th:href="@{/testServletAPI(username='psj', password='123456')}">测试使用ServletAPI获取请求参数</a><br> </body>
@RequestMapping("/testServletAPI") // 前端控制器检测到参数为HttpServletRequest类,就会把当前请求的request对象赋值给该参数(不需要自己额外传入) public String testServletAPI(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("username:"+username+",password:"+password); return "success"; }
2.通过控制器方法的形参获取请求参数
- 在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在
DispatcherServlet
中就会将请求参数赋值给相应的形参:<body> <h1>测试请求参数</h1> <a th:href="@{/testServletAPI(username='psj', password='123456')}">测试使用ServletAPI获取请求参数</a><br> </body>
@RequestMapping("/testParam") // 保证形参和请求参数名一致 public String testParam(String username, String password){ System.out.println("username:"+username+",password:"+password); return "success"; }
tips:
- 若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数:
// 多选框中的name都是一样的 <form th:action="@{/testParam}" method="post"> 用户名: <input type="text" name="username"><br> 密 码: <input type="password" name="password"><br> 爱 好: <input type="checkbox" name="hobby" value="a">a <input type="checkbox" name="hobby" value="b">b <input type="checkbox" name="hobby" value="c">c <input type="submit" value="测试使用控制器形参获取请求参数"> </form>
@RequestMapping("/testParam") // 保证形参和请求参数名一致,还可以使用String[] hobby接收 public String testParam(String username, String password, String hobby) { System.out.println("username:" + username + ",password:" + password + "hobby:" + hobby); return "success"; }
3.@RequestParam
- 将请求参数和控制器方法的形参创建映射关系
- 该注解一共有三个属性:
value
:指定为形参赋值的请求参数的参数名(也可以使用name
)required
:设置是否必须传输此请求参数,默认值为true
- 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置
defaultValue
属性,则页面报错400- 若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为
null
defaultValue
:不管required
属性值为true或false,当value
所指定的请求参数没有传输或传输的值为""
时,则使用默认值为形参赋值<form th:action="@{/testParam}" method="get"> 用户名: <input type="text" name="user_name"><br> 密 码: <input type="password" name="password"><br> 爱 好: <input type="checkbox" name="hobby" value="a">a <input type="checkbox" name="hobby" value="b">b <input type="checkbox" name="hobby" value="c">c <input type="submit" value="测试使用控制器形参获取请求参数"> </form>
@RequestMapping("/testParam") public String testParam( @RequestParam(value = "user_name", required = false, defaultValue = "psw") String username, String password, String hobby) { // 如果文本框中没有输入用户名,就会输出username:psw System.out.println("username:" + username + ",password:" + password + "hobby:" + hobby); return "success"; }
4.@RequestHeader
- 将请求头信息和控制器方法的形参创建映射关系
- 一共有三个属性:value、required、defaultValue,用法同
@RequestParam
@RequestMapping("/testParam") public String testParam( @RequestParam(value = "user_name", required = false, defaultValue = "psw") String username, String password, String hobby, @RequestHeader("Host") String host) { // 打印Host:localhost:8080 System.out.println("username:" + username + ",password:" + password + "hobby:" + hobby + "Host:" + host); return "success"; }
5.@CookieValue
- 将cookie数据和控制器方法的形参创建映射关系
- 一共有三个属性:value、required、defaultValue,用法同
@RequestParam
@RequestMapping("/testParam") public String testParam( @RequestParam(value = "user_name", required = false, defaultValue = "psw") String username, String password, String hobby, @CookieValue("JSESSIONID") String JSESSIONID) { System.out.println("username:" + username + ",password:" + password + "hobby:" + hobby + "JSESSIONID:" + JSESSIONID); return "success"; }
6.通过POJO获取请求参数
- 可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值:
<form th:action="@{/testPojo}" method="post"> 用户名: <input type="text" name="username"><br> 密 码: <input type="password" name="password"><br> <input type="submit" value="测试使用实体类获取请求参数"> </form>
// User类 public class User { private String username; private String password; // 构造器、setter、getter方法 } ----------------------------- @RequestMapping("/testPojo") public String testPojo(User user) { System.out.println(user); return "success"; }
7.解决获取请求参数的乱码问题
- 之前解请求决乱码问题是通过
request.setCharacterEncoding()
,但是在控制器方法中没有request
对象,即使有参数,设置了也没有用,因为前端控制器已经获取过请求参数。基于上述原因,则需要在前端控制器前设置编码,因为过滤器的加载要先于servlet
(即前端控制器),所以可以使用SpringMVC
提供的编码过滤器CharacterEncodingFilter
,但是必须在web.xml
中进行注册:// 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>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>