• (续)SSM整合之springmvc笔记(SpringMVC获取请求参数)(P131-135)


    目录

    一   通过ServletAPI获取

    1 . 新建TestParamController类

     2 . index.html

     3 .  在TestParamController类里面写getParamByServletAPI

    4. 测试 重新部暑 

    二 通过控制器方法的形参获取请求参数

    1 .  index.html

    2 .  TestParamController

    3. 测试

    三    @RequestParam

    1 .如果当前请求参数的名字 和形参的名字不一样  

    2. 解决办法  加@RequestParam注解

    3 .测试

    4 .  @RequestMapping注解的其他属性之required = true

     5 .  @RequestMapping注解的其他属性之defaultValue = "hello"

    四  @RequestHeader

    五 @CookieValue

    六  通过POJO获取请求参数

    1.创建实体类

    2. index.html

    3 在TestParamController类中写getParamByPojo方法

    4  测试

    七   解决获取请求参数的乱码问题

    1 .配置springMVC的编码过滤器

    2 .测试

    全部总结


    一   通过ServletAPI获取

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

    1 . 新建TestParamController类

     

    1. package com.atguigu.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpSession;
    6. /*1.通过servletAPI获取
    7. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    8. * 就可以在控制器方法中使用request对象获取请求参数
    9. *
    10. *
    11. * */
    12. @Controller
    13. public class TestParamController {
    14. @RequestMapping("/param/servletAPI")
    15. public String getParamByServletAPI(HttpServletRequest request){
    16. HttpSession session = request.getSession();
    17. String username = request.getParameter("username");
    18. String password = request.getParameter("password");
    19. System.out.println("username:"+username+",password:"+password);
    20. return "success";
    21. }
    22. }

     

     2 . index.html

    1. 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. <h1>index.htmlh1>
    9. <a th:href="@{/hello}">测试@RequestMapping注解所标识的位置a><br>
    10. <a th:href="@{/abc}">测试@RequestMapping注解的value属性a><br>
    11. <form th:action="@{/hello}" method="post">
    12. <input type="submit" value="测试@RequestMapping注解的method属性">
    13. form>
    14. <a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性a><br>
    15. <a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性a><br>
    16. <a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径a><br>
    17. <a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符a><br>
    18. <hr>
    19. <form th:action="@{/param/servletAPI}" method="post">
    20. 用户名:<input type="text" name="username"><br>
    21. 密码: <input type="password" name="password"><br>
    22. <input type="submit" value="登录"><br>
    23. form>
    24. <hr>
    25. body>
    26. html>
     
     

     3 .  在TestParamController类里面写getParamByServletAPI

    用得不多  因为我们已经用了springmvc  就不用在用原生来获取

    springmvc封装的是Servlet,然后我们现在作为控制层 就是一个pojo 就是一个普通的java类  我们并没有让他去实现任何的接口  也没有让他去继承任何的类  所以在getParamByServletAPI这个方法里面要获取请求参数的话,如果按照之前Servlet的思路  必须得有请求对象   也就是要有requset对象,可是现在这里面没有  因为目前这个类是一个普通的java类  没有任何的继承和没有任何的实现 

    当我们的浏览器发送请求 让DispatcherServlet处理之后  他会拿着请求信息和控制层的@RequestMapping里面的信息进行匹配  如果匹配成功,则调用getParamByServletAPI,处理当前的请求   所以在调用getParamByServletAPI方法的时候也要查看参数的类型   如果我们设置一个 HttpServletRequest request类型的参数    那么在调用getParamByServletAPI方法的时候就会为参数request进行赋值

    也就是说我们这里的request表示的是当前要处理的请求对象  换句话说  如果你想用Servlet的API 

    那我们直接在的控制器方法getParamByServletAPI里面去设置就可以 

     

    1. package com.atguigu.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpSession;
    6. @Controller
    7. public class TestParamController {
    8. @RequestMapping("/param/servletAPI")
    9. public String getParamByServletAPI(HttpServletRequest request){
    10. HttpSession session = request.getSession();
    11. String username = request.getParameter("username");
    12. String password = request.getParameter("password");
    13. System.out.println("username:"+username+",password:"+password);
    14. return "success";
    15. }
    16. }

    4. 测试 重新部暑 

     

     

     

     总结:

    通过servletAPI获取
    * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    * 就可以在控制器方法中使用request对象获取请求参数

    通过控制器方法的形参获取请求参数

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

    1 .  index.html

     

    1. 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. <h1>index.htmlh1>
    9. <a th:href="@{/hello}">测试@RequestMapping注解所标识的位置a><br>
    10. <a th:href="@{/abc}">测试@RequestMapping注解的value属性a><br>
    11. <form th:action="@{/hello}" method="post">
    12. <input type="submit" value="测试@RequestMapping注解的method属性">
    13. form>
    14. <a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性a><br>
    15. <a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性a><br>
    16. <a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径a><br>
    17. <a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符a><br>
    18. <hr>
    19. <form th:action="@{/param}" method="post">
    20. 用户名:<input type="text" name="username"><br>
    21. 密码: <input type="password" name="password"><br>
    22. <input type="submit" value="登录"><br>
    23. form>
    24. <hr>
    25. body>
    26. html>

    2 .  TestParamController

    1. package com.atguigu.controller;
    2. /* * 获取请求参数的方式:
    3. * 1、通过servletAPI获取
    4. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    5. * 就可以在控制器方法中使用request对象获取请求参数
    6. * 2、通过控制器方法的形参获取
    7. * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
    8. *
    9. * */
    10. @Controller
    11. public class TestParamController {
    12. @RequestMapping("/param/servletAPI")
    13. public String getParamByServletAPI(HttpServletRequest request){
    14. HttpSession session = request.getSession();
    15. String username = request.getParameter("username");
    16. String password = request.getParameter("password");
    17. System.out.println("username:"+username+",password:"+password);
    18. return "success";
    19. }
    20. @RequestMapping("/param")
    21. public String getparam(String username,String password){
    22. System.out.println("username:"+username+",password:"+password);
    23. return "success";
    24. }
    25. }

    3. 测试

     

     

     

     

     

    三    @RequestParam

    @RequestParam 是将请求参数和控制器方法的形参创建映射关系
    @RequestParam 注解一共有三个属性:
    value :指定为形参赋值的请求参数的参数名
    required :设置是否必须传输此请求参数,默认值为 true
    若设置为 true 时,则当前请求必须传输 value 所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue 属性,则页面报错 400 Required String parameter 'xxx' is not present ;若设置为
    false ,则当前请求不是必须传输 value 所指定的请求参数,若没有传输,则注解所标识的形参的值为 null
    defaultValue :不管 required 属性值为 true false ,当 value 所指定的请求参数没有传输或传输的值
    "" 时,则使用默认值为形参赋值

    1 .如果当前请求参数的名字 和形参的名字不一样  

    比如下图

    1. 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. <h1>index.htmlh1>
    9. <a th:href="@{/hello}">测试@RequestMapping注解所标识的位置a><br>
    10. <a th:href="@{/abc}">测试@RequestMapping注解的value属性a><br>
    11. <form th:action="@{/hello}" method="post">
    12. <input type="submit" value="测试@RequestMapping注解的method属性">
    13. form>
    14. <a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性a><br>
    15. <a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性a><br>
    16. <a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径a><br>
    17. <a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符a><br>
    18. <hr>
    19. <form th:action="@{/param}" method="post">
    20. 用户名:<input type="text" name="userName"><br>
    21. 密码: <input type="password" name="password"><br>
    22. <input type="submit" value="登录"><br>
    23. form>
    24. <hr>
    25. body>
    26. html>

    2. 解决办法  加@RequestParam注解

    @RequestParam解释

    专门用来设置请求参数和控制器方法的形参 的映射关系的

    @RequestParam里面的属性  

    1. @Target(ElementType.PARAMETER)
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. public @interface RequestParam {
    5. @AliasFor("name")
    6. String value() default "";
    7. @AliasFor("value")
    8. String name() default "";
    9. boolean required() default true;
    10. String defaultValue() default ValueConstants.DEFAULT_NONE;
    11. }
    加上注解后
    

     

    1. /* * 获取请求参数的方式:
    2. * 1、通过servletAPI获取
    3. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    4. * 就可以在控制器方法中使用request对象获取请求参数
    5. * 2、通过控制器方法的形参获取
    6. * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
    7. *3、@RequestParam:将请求参数和控制器方法的形参绑定
    8. * @RequestParam注解的三个属性:value、required、defaultValue
    9. * value:设置和形参绑定的请求参数的名字
    10. * required:设置是否必须传输value所对应的请求参数
    11. * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
    12. * 400 - Required String parameter 'xxx' is not present
    13. * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
    14. * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
    15. *
    16. * */
    17. @Controller
    18. public class TestParamController {
    19. @RequestMapping("/param/servletAPI")
    20. public String getParamByServletAPI(HttpServletRequest request){
    21. HttpSession session = request.getSession();
    22. String username = request.getParameter("username");
    23. String password = request.getParameter("password");
    24. System.out.println("username:"+username+",password:"+password);
    25. return "success";
    26. }
    27. @RequestMapping("/param")
    28. public String getparam(
    29. @RequestParam("userName") String username,String password
    30. ){
    31. System.out.println("username:"+username+",password:"+password);
    32. return "success";
    33. }
    34. }

    3 .测试

     

     

    4 .  @RequestMapping注解的其他属性之required = true

    required = true  默认值是 true   是否必须传出value所对应的请求参数   如果不传  则直接报错

    1. /* * 获取请求参数的方式:
    2. * 1、通过servletAPI获取
    3. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    4. * 就可以在控制器方法中使用request对象获取请求参数
    5. * 2、通过控制器方法的形参获取
    6. * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
    7. *3、@RequestParam:将请求参数和控制器方法的形参绑定
    8. * @RequestParam注解的三个属性:value、required、defaultValue
    9. * value:设置和形参绑定的请求参数的名字
    10. * required:设置是否必须传输value所对应的请求参数
    11. * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
    12. * 400 - Required String parameter 'xxx' is not present
    13. * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
    14. * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
    15. *
    16. * */
    17. @Controller
    18. public class TestParamController {
    19. @RequestMapping("/param/servletAPI")
    20. public String getParamByServletAPI(HttpServletRequest request){
    21. HttpSession session = request.getSession();
    22. String username = request.getParameter("username");
    23. String password = request.getParameter("password");
    24. System.out.println("username:"+username+",password:"+password);
    25. return "success";
    26. }
    27. @RequestMapping("/param")
    28. public String getparam(
    29. @RequestParam(value = "userName",required = true) String username,String password
    30. ){
    31. System.out.println("username:"+username+",password:"+password);
    32. return "success";
    33. }
    34. }

     

    required:设置是否必须传输此请求参数,默认值为true

    若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null

     

     

    5 .  @RequestMapping注解的其他属性之defaultValue = "hello"

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

     

    required属性值为true   无传输

     

    自己总结:

    required :设置是否必须传输此请求参数,默认值为 true
    若设置为 true 时,则当前请求必须传输 value 所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue 属性,则页面报错 400 Required String parameter 'xxx' is not present
    若设置为 true 时,则当前请求必须传输 value 所指定的请求参数,若没有传输该请求参数,但是有设置defaultValue属性,则会输出defaultValue 属性值
    若设置为 false ,则当前请求不是必须传输 value 所指定的请求参数,若没有传输,则注解所标识的形参的值为 null
    defaultValue :不管 required 属性值为 true false ,当 value所指定的请求参数有传输 则有值  如果没有传输  则使用默认值为形参赋值
    总结:
    @RequestParam:将请求参数和控制器方法的形参绑定
    * @RequestParam注解的三个属性:value、required、defaultValue
    * value:设置和形参绑定的请求参数的名字
    * required:设置是否必须传输value所对应的请求参数
    * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
    * 400 - Required String parameter 'xxx' is not present
    * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
    * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关

     

    注:
    若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串
    数组或者字符串类型的形参接收此请求参数
    若使用字符串数组类型的形参,此参数的数组中包含了每一个数据
    若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果
    @RequestParam 是将请求参数和控制器方法的形参创建映射关系
    @RequestParam 注解一共有三个属性:
    value :指定为形参赋值的请求参数的参数名
    required :设置是否必须传输此请求参数,默认值为 true
    若设置为 true 时,则当前请求必须传输 value 所指定的请求参数,若没有传输该请求参数,且没有设置
    defaultValue 属性,则页面报错 400 Required String parameter 'xxx' is not present ;若设置为
    false ,则当前请求不是必须传输 value 所指定的请求参数,若没有传输,则注解所标识的形参的值为null
    defaultValue :不管 required 属性值为 true false ,当 value 所指定的请求参数没有传输或传输的值
    "" 时,则使用默认值为形参赋值

    四  @RequestHeader

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

     

    1. /* * 获取请求参数的方式:
    2. * 1、通过servletAPI获取
    3. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    4. * 就可以在控制器方法中使用request对象获取请求参数
    5. * 2、通过控制器方法的形参获取
    6. * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
    7. *3、@RequestParam:将请求参数和控制器方法的形参绑定
    8. * @RequestParam注解的三个属性:value、required、defaultValue
    9. * value:设置和形参绑定的请求参数的名字
    10. * required:设置是否必须传输value所对应的请求参数
    11. * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
    12. * 400 - Required String parameter 'xxx' is not present
    13. * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
    14. * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值 无关
    15. *4、@RequestHeader:将请求头信息和控制器方法的形参绑定
    16. * 5、@CookieValue:将cookie数据和控制器方法的形参绑定
    17. * */
    18. @Controller
    19. public class TestParamController {
    20. @RequestMapping("/param/servletAPI")
    21. public String getParamByServletAPI(HttpServletRequest request){
    22. HttpSession session = request.getSession();
    23. String username = request.getParameter("username");
    24. String password = request.getParameter("password");
    25. System.out.println("username:"+username+",password:"+password);
    26. return "success";
    27. }
    28. @RequestMapping("/param")
    29. public String getparam(
    30. @RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,
    31. @RequestHeader("referer") String referer
    32. ){
    33. System.out.println("referer:"+referer);
    34. System.out.println("username:"+username+",password:"+password);
    35. return "success";
    36. }
    37. }

     

     

     

    @CookieValue

    @CookieValue 是将 cookie 数据和控制器方法的形参创建映射关系
    @CookieValue 注解一共有三个属性: value required defaultValue ,用法同 @RequestParam
    1. /* * 获取请求参数的方式:
    2. * 1、通过servletAPI获取
    3. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    4. * 就可以在控制器方法中使用request对象获取请求参数
    5. * 2、通过控制器方法的形参获取
    6. * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
    7. *3、@RequestParam:将请求参数和控制器方法的形参绑定
    8. * @RequestParam注解的三个属性:value、required、defaultValue
    9. * value:设置和形参绑定的请求参数的名字
    10. * required:设置是否必须传输value所对应的请求参数
    11. * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
    12. * 400 - Required String parameter 'xxx' is not present
    13. * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
    14. * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
    15. *4、@RequestHeader:将请求头信息和控制器方法的形参绑定
    16. * 5、@CookieValue:将cookie数据和控制器方法的形参绑定
    17. * */
    18. @Controller
    19. public class TestParamController {
    20. @RequestMapping("/param/servletAPI")
    21. public String getParamByServletAPI(HttpServletRequest request){
    22. HttpSession session = request.getSession();
    23. String username = request.getParameter("username");
    24. String password = request.getParameter("password");
    25. System.out.println("username:"+username+",password:"+password);
    26. return "success";
    27. }
    28. @RequestMapping("/param")
    29. public String getparam(
    30. @RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,
    31. @RequestHeader("referer") String referer,
    32. @CookieValue("JSESSIONID") String jsessionId
    33. ){
    34. System.out.println("referer:"+referer);
    35. System.out.println("jsessionId:"+jsessionId);
    36. System.out.println("username:"+username+",password:"+password);
    37. return "success";
    38. }
    39. }

     

     

     

    Path=/springMVC; HttpOnly   有效路径

     

     

    总结:

    @RequestHeader:将请求头信息和控制器方法的形参绑定
    @CookieValue:将cookie数据和控制器方法的形参绑定

    六  通过POJO获取请求参数

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

    1.创建实体类

    1. package com.atguigu.pojo;
    2. public class User {
    3. private Integer id;
    4. private String username;
    5. private String password;
    6. public User() {
    7. }
    8. public User(Integer id, String username, String password) {
    9. this.id = id;
    10. this.username = username;
    11. this.password = password;
    12. }
    13. public Integer getId() {
    14. return id;
    15. }
    16. public void setId(Integer id) {
    17. this.id = id;
    18. }
    19. public String getUsername() {
    20. return username;
    21. }
    22. public void setUsername(String username) {
    23. this.username = username;
    24. }
    25. public String getPassword() {
    26. return password;
    27. }
    28. public void setPassword(String password) {
    29. this.password = password;
    30. }
    31. @Override
    32. public String toString() {
    33. return "User{" +
    34. "id=" + id +
    35. ", username='" + username + '\'' +
    36. ", password='" + password + '\'' +
    37. '}';
    38. }
    39. }

    2. index.html

    1. 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. <h1>index.htmlh1>
    9. <a th:href="@{/hello}">测试@RequestMapping注解所标识的位置a><br>
    10. <a th:href="@{/abc}">测试@RequestMapping注解的value属性a><br>
    11. <form th:action="@{/hello}" method="post">
    12. <input type="submit" value="测试@RequestMapping注解的method属性">
    13. form>
    14. <a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性a><br>
    15. <a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性a><br>
    16. <a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径a><br>
    17. <a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符a><br>
    18. <hr>
    19. <form th:action="@{/param/pojo}" method="post">
    20. 用户名:<input type="text" name="username"><br>
    21. 密码:<input type="password" name="password"><br>
    22. <input type="submit" value="登录"><br>
    23. form>
    24. <hr>
    25. body>
    26. html>

    3 在TestParamController类中写getParamByPojo方法

    1. /* * 获取请求参数的方式:
    2. * 1、通过servletAPI获取
    3. * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
    4. * 就可以在控制器方法中使用request对象获取请求参数
    5. * 2、通过控制器方法的形参获取
    6. * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
    7. *3、@RequestParam:将请求参数和控制器方法的形参绑定
    8. * @RequestParam注解的三个属性:value、required、defaultValue
    9. * value:设置和形参绑定的请求参数的名字
    10. * required:设置是否必须传输value所对应的请求参数
    11. * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
    12. * 400 - Required String parameter 'xxx' is not present
    13. * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
    14. * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
    15. *4、@RequestHeader:将请求头信息和控制器方法的形参绑定
    16. 5、@CookieValue:将cookie数据和控制器方法的形参绑定
    17. 6、通过控制器方法的实体类类型的形参获取请求参数
    18. * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致
    19. * 可以通过实体类类型的形参获取请求参数
    20. * */
    21. @Controller
    22. public class TestParamController {
    23. @RequestMapping("/param/servletAPI")
    24. public String getParamByServletAPI(HttpServletRequest request){
    25. HttpSession session = request.getSession();
    26. String username = request.getParameter("username");
    27. String password = request.getParameter("password");
    28. System.out.println("username:"+username+",password:"+password);
    29. return "success";
    30. }
    31. @RequestMapping("/param")
    32. public String getparam(
    33. @RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,
    34. @RequestHeader("referer") String referer,
    35. @CookieValue("JSESSIONID") String jsessionId
    36. ){
    37. System.out.println("referer:"+referer);
    38. System.out.println("jsessionId:"+jsessionId);
    39. System.out.println("username:"+username+",password:"+password);
    40. return "success";
    41. }
    42. @RequestMapping("/param/pojo")
    43. public String getParamByPojo(User user){
    44. System.out.println(user);
    45. return "success";
    46. }
    47. }

    4  测试

     

    总结

    通过控制器方法的实体类类型的形参获取请求参数
    * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致
    * 可以通过实体类类型的形参获取请求参数

    七   解决获取请求参数的乱码问题

    解决获取请求参数的乱码问题,可以使用 SpringMVC 提供的编码过滤器 CharacterEncodingFilter ,但是必须在 web.xml 中进行注册

    1 .配置springMVC的编码过滤器

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <filter>
    7. <filter-name>CharacterEncodingFilterfilter-name>
    8. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    9. <init-param>
    10. <param-name>encodingparam-name>
    11. <param-value>UTF-8param-value>
    12. init-param>
    13. <init-param>
    14. <param-name>forceEncodingparam-name>
    15. <param-value>trueparam-value>
    16. init-param>
    17. filter>
    18. <filter-mapping>
    19. <filter-name>CharacterEncodingFilterfilter-name>
    20. <url-pattern>/*url-pattern>
    21. filter-mapping>
    22. <servlet>
    23. <servlet-name>SpringMVCservlet-name>
    24. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    25. <init-param>
    26. <param-name>contextConfigLocationparam-name>
    27. <param-value>classpath:springmvc.xmlparam-value>
    28. init-param>
    29. <load-on-startup>1load-on-startup>
    30. servlet>
    31. <servlet-mapping>
    32. <servlet-name>SpringMVCservlet-name>
    33. <url-pattern>/url-pattern>
    34. servlet-mapping>
    35. web-app>

    过滤器CharacterEncodingFilter的源码

    CharacterEncodingFilter extends OncePerRequestFilter

    OncePerRequestFilter extends GenericFilterBean

    GenericFilterBean implements Filter

    整合

    CharacterEncodingFilter extends OncePerRequestFilter

    OncePerRequestFilter extends GenericFilterBean

    GenericFilterBean implements Filter

    Alt + 7   查看类中结构  源码问题这里面不讲

    2 .测试

     

     

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

     总结:

    解决获取请求此参数的乱码问题
    * 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter

    全部总结

    /**
     * 获取请求参数的方式:
     * 1、通过servletAPI获取
     * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
     * 就可以在控制器方法中使用request对象获取请求参数
     * 2、通过控制器方法的形参获取
     * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
     * 3、@RequestParam:将请求参数和控制器方法的形参绑定
     * @RequestParam注解的三个属性:value、required、defaultValue
     * value:设置和形参绑定的请求参数的名字
     * required:设置是否必须传输value所对应的请求参数
     * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
     * 400 - Required String parameter 'xxx' is not present
     * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
     * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
     * 4、@RequestHeader:将请求头信息和控制器方法的形参绑定
     * 5、@CookieValue:将cookie数据和控制器方法的形参绑定
     * 6、通过控制器方法的实体类类型的形参获取请求参数
     * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致
     * 可以通过实体类类型的形参获取请求参数
     * 7、解决获取请求此参数的乱码问题
     * 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter
     */

     

     
    
  • 相关阅读:
    初探词法分析实验
    Linux教程:Centos如何使用MiniKube从零开始部署Kubernetes集群服务
    MySQL性能分析工具的使用
    加权循环仲裁WRR特性对NVME SSD性能有什么影响?
    ESMapping字段
    算法解析:LeetCode——机器人碰撞和最低票价
    蓝桥杯 子矩阵 (找大小为a*b的矩阵的最大最小值的乘积,queue)
    嵌入式(Linux内核的安装与加载)
    算法: 求数幂n次方50. Pow(x, n)
    Rust解决Bug错误“error: future cannot be sent between threads safely”
  • 原文地址:https://blog.csdn.net/m0_59281987/article/details/127874026