当前位置:   article > 正文

SpringMVC 获取请求参数_springmvc拦截器获取请求参数

springmvc拦截器获取请求参数

一、通过 ServletAPI 获取

        将 HttpServletRequest 作为控制器方法的形参,此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象。

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <a th:href="@{/test?userName=zhangSan&password=123456}">测试传值使用问号方式</a><br>
  9. <a th:href="@{/test(userName='admin',password=123456)}">测试传值使用括号方式</a><br>
  10. </body>
  11. </html>
  1. @Controller
  2. public class RequestMappingController {
  3. @RequestMapping("/test")
  4. public String testParam(HttpServletRequest request){
  5. String username = request.getParameter("userName");
  6. String password = request.getParameter("password");
  7. System.out.println("username:"+username+",password:"+password);
  8. return "success";
  9. }
  10. }

二、通过控制器方法的形参获取

        在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet 中就会将请求参数赋值给相应的形参。

        若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数。

        若使用字符串数组类型的形参,此参数的数组中包含了每一个数据。

        若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <a th:href="@{/testTwo?userName=zhangSan&password=123456}">测试传值使用问号方式</a><br>
  9. <a th:href="@{/testTwo(userName='admin',password=123456)}">测试传值使用括号方式</a><br>
  10. <form th:action="@{/test}" method="post">
  11. 用户名:<input type="text" name="userName"><br>
  12. 密码:<input type="password" name="password"><br>
  13. 爱好:<input type="checkbox" name="hobby" value="a">a
  14. <input type="checkbox" name="hobby" value="b">b
  15. <input type="checkbox" name="hobby" value="c">c
  16. <input type="submit">
  17. </form>
  18. </body>
  19. </html>
  1. @Controller
  2. public class RequestMappingController {
  3. @RequestMapping("/testTwo")
  4. public String testParam(String userName, String password){
  5. System.out.println("username:"+userName+",password:"+password);
  6. return "success";
  7. }
  8. @RequestMapping("/test")
  9. public String testParam(String userName, String password,String [] hobby){
  10. System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby));
  11. return "success";
  12. }
  13. }

三、@RequestParam

        @RequestParam 是将请求参数和控制器方法的形参创建映射关系,当前端传输的参数名称和后端接收的参数名称不一样的时候使用这个注解。这个注解一共有三个属性值,如下所示:

        1、value:指定为形参赋值的请求参数的参数名。

        2、required:设置是否必须传输此请求参数,默认值为 true,若设置为 true 时,则当前请求必须传输 value 所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue 属性,则页面报错 400。若设置为 false,则当前请求不是必须传输 value 所指定的请求参数,若没有传输,则注解所标识的形参的值为 null

        3、defaultValue:不管 required 属性值为 true false,当 value 所指定的请求参数没有传输或传输的值为 "" 时,则使用默认值为形参赋值。

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <a th:href="@{/testTwo?user_Name=zhangSan&password=123456}">测试传值使用问号方式</a><br>
  9. <a th:href="@{/testTwo(user_Name='admin',password=123456)}">测试传值使用括号方式</a><br>
  10. <form th:action="@{/test}" method="post">
  11. 用户名:<input type="text" name="user_Name"><br>
  12. 密码:<input type="password" name="password"><br>
  13. 爱好:<input type="checkbox" name="hobby" value="a">a
  14. <input type="checkbox" name="hobby" value="b">b
  15. <input type="checkbox" name="hobby" value="c">c
  16. <input type="submit">
  17. </form>
  18. </body>
  19. </html>
  1. @Controller
  2. public class RequestMappingController {
  3. @RequestMapping("/testTwo")
  4. public String testParam(@RequestParam("user_Name") String userName, String password){
  5. System.out.println("username:"+userName+",password:"+password);
  6. return "success";
  7. }
  8. @RequestMapping("/test")
  9. public String testParam(@RequestParam("user_Name") String userName, String password,String [] hobby){
  10. System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby));
  11. return "success";
  12. }
  13. }

四、@RequestHeader

        @RequestHeader 是将请求头信息和控制器方法的形参创建映射关系。这个注解一共有三个属性:valuerequireddefaultValue,用法同 @RequestParam 注解。

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <a th:href="@{/testTwo?user_Name=zhangSan&password=123456}">测试传值使用问号方式</a><br>
  9. <a th:href="@{/testTwo(user_Name='admin',password=123456)}">测试传值使用括号方式</a><br>
  10. <form th:action="@{/test}" method="post">
  11. 用户名:<input type="text" name="user_Name"><br>
  12. 密码:<input type="password" name="password"><br>
  13. 爱好:<input type="checkbox" name="hobby" value="a">a
  14. <input type="checkbox" name="hobby" value="b">b
  15. <input type="checkbox" name="hobby" value="c">c
  16. <input type="submit">
  17. </form>
  18. </body>
  19. </html>
  1. @Controller
  2. public class RequestMappingController {
  3. @RequestMapping("/testTwo")
  4. public String testParam(@RequestParam("user_Name") String userName, String password,@RequestHeader("Host") String host){
  5. System.out.println("username:"+userName+",password:"+password+",host:"+host);
  6. return "success";
  7. }
  8. @RequestMapping("/test")
  9. public String testParam(@RequestParam("user_Name") String userName, String password,String [] hobby,@RequestHeader("Host") String host){
  10. System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby)+",host:"+host);
  11. return "success";
  12. }
  13. }

五、@CookieValue

        @CookieValue 是将 cookie 数据和控制器方法的形参创建映射关系,这个注解一共有三个属性:valuerequireddefaultValue,用法同 @RequestParam 注解。

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <a th:href="@{/testTwo?user_Name=zhangSan&password=123456}">测试传值使用问号方式</a><br>
  9. <a th:href="@{/testTwo(user_Name='admin',password=123456)}">测试传值使用括号方式</a><br>
  10. <form th:action="@{/test}" method="post">
  11. 用户名:<input type="text" name="user_Name"><br>
  12. 密码:<input type="password" name="password"><br>
  13. 爱好:<input type="checkbox" name="hobby" value="a">a
  14. <input type="checkbox" name="hobby" value="b">b
  15. <input type="checkbox" name="hobby" value="c">c
  16. <input type="submit">
  17. </form>
  18. </body>
  19. </html>
  1. @Controller
  2. public class RequestMappingController {
  3. @RequestMapping("/testTwo")
  4. public String testParam(@RequestParam("user_Name") String userName, String password,@RequestHeader("Host") String host,
  5. @CookieValue("JSESSIONID") String JSESSIONID){
  6. System.out.println("username:"+userName+",password:"+password+",host:"+host+",JSESSIONID"+JSESSIONID);
  7. return "success";
  8. }
  9. @RequestMapping("/test")
  10. public String testParam(@RequestParam("user_Name") String userName, String password,String [] hobby,
  11. @RequestHeader("Host") String host,
  12. @CookieValue("JSESSIONID") String JSESSIONID){
  13. System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby)+",host:"+host+",JSESSIONID"+JSESSIONID);
  14. return "success";
  15. }
  16. }

六、通过 POJO 获取请求参数

        可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <form th:action="@{/testpojo}" method="post">
  9. 用户名:<input type="text" name="username"><br>
  10. 密码:<input type="password" name="password"><br>
  11. 性别:<input type="radio" name="sex" value="男"><input type="radio"
  12. name="sex" value="女">女<br>
  13. 年龄:<input type="text" name="age"><br>
  14. 邮箱:<input type="text" name="email"><br>
  15. <input type="submit">
  16. </form>
  17. </body>
  18. </html>
  1. @Controller
  2. public class RequestMappingController {
  3. @RequestMapping("/testpojo")
  4. public String testPOJO(User user){
  5. System.out.println(user);
  6. return "success";
  7. }
  8. }
  1. public class User {
  2. private String username;
  3. private String password;
  4. private String sex;
  5. private Integer age;
  6. private String email;
  7. // setter、getter、toString
  8. }

        可以看到,成功的接受了前台传过来的参数,只不过出现了中文乱码问题。 

七、解决请求参数乱码问题

        想要解决获取请求参数的乱码问题,可以使用 SpringMVC 提供的编码过滤器 CharacterEncodingFilter,但是必须在 web.xml 中进行注册,即需要在 web.xml 文件中添加如下的内容:

  1. <!--配置springMVC的编码过滤器-->
  2. <filter>
  3. <filter-name>CharacterEncodingFilter</filter-name>
  4. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  5. <init-param>
  6. <param-name>encoding</param-name>
  7. <param-value>UTF-8</param-value>
  8. </init-param>
  9. <init-param>
  10. <param-name>forceResponseEncoding</param-name>
  11. <param-value>true</param-value>
  12. </init-param>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>CharacterEncodingFilter</filter-name>
  16. <url-pattern>/*</url-pattern>
  17. </filter-mapping>

        需要注意的是:SpringMVC 中处理编码的过滤器一定要配置到其他过滤器之前,否则无效。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/791719
推荐阅读
相关标签
  

闽ICP备14008679号