【SpringMVC】获取 -请求参数- 的多种方式

2023-10-17 17:34:37 浏览数 (1)

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~

SpringMVC获取请求参数

一、通过原生ServletAPI获取


  • HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
代码语言:javascript复制
/**
 * @author .29.
 * @create 2023-03-05 10:13
 */
@Controller
public class ParamController {

    //通过原生ServletAPI方式获取请求参数
    @RequestMapping(value = "testServletAPI")
    //形参位置的request表示当前请求
    public String testServletAPI(HttpServletRequest request){
        //通过当前请求对象request获取请求路径中传递的参数
        String user = request.getParameter("user");
        String ageStr = request.getParameter("age");
        //字符串 转 整形
        int age = Integer.parseInt(ageStr);
        System.out.println("user:" user ",age:" age);
        return "success";
    }
}

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


  • 在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。
代码语言:javascript复制
/**
 * @author .29.
 * @create 2023-03-05 10:13
 */
@Controller
public class ParamController {

    //SpringMVC方式:通过控制器方法的形参获取请求参数
    @RequestMapping(value = "/testParam")
    /*
    * 当前形参的参数名 与 请求路径传递参数的参数名保持一致,就会自动获取到参数值(如果参数名不一致,将无法获取)
    * 当然,若参数名不一致,依旧可以借助 @RequestParam("对应参数名")注解来建立映射关系,获取请求路径中传递参数的值
    * 当标识了注解 @RequestParam("对应参数名"),这个参数就必须要被传输,否则报400错误
    * 必须传输参数的设定,可通过required = false 参数使其失效 :@RequestParam("对应参数名",required = false)
    * 若required = false,则会赋默认值,默认值可修改:defaultValue = "设定的默认值"
    */
    //注:当请求路径传递参数有多个重名参数,这里的形参即可使用String[]类型接收,也可使用String类型接收(接收的结果自动用','隔开)
    public String testParam(@RequestParam("username") String user, String password,
                            @RequestHeader(value = "Host",required = false) String host){
        System.out.println("user:" user ",password:" password);
        return "success";
    }


}

  • @RequestParam 注解:@RequestParam是将请求参数和控制器方法的形参创建映射关系
  • @RequestHeader 注解:@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
  • @CookieValue 注解:@CookieValue是将cookie数据和控制器方法的形参创建映射关系

三个属性及其用法(属性对上述注解通用)

  1. value:指定为形参赋值的请求参数的参数名
  2. required:设置是否必须传输此请求参数,默认值为true

若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter ‘xxx’ is not present; —— 若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null

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

三、通过 实体类(POJO) 获取请求参数


  • 可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值
代码语言:javascript复制
/**
 * @author .29.
 * @create 2023-03-05 10:13
 */
@Controller
public class ParamController {

    //SpringMVC方式:通过POJO获取请求参数
    @RequestMapping(value = "/testpojo")
    //只需要实体类的属性名 与 请求参数的参数名一致,SpringMVC就能自动获取映射,读取请求参数为属性赋值
    public String POJO(User user){
        /*
        * 处理乱码问题:
        * GET请求方式的乱码:来源于TomCat,需要设置Tomcat配置文件,设置UTF-8;
        * Post请求方式的乱码:需要在获取请求参数之前,设置编码字符集
         */

        System.out.println(user);
        return "success";
    }
    
}

请求参数

代码语言:javascript复制
<form th:action="@{/testpojo}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>
    年龄:<input type="text" name="age"><br>
    邮箱:<input type="text" name="email"><br>
    <input type="submit" value="使用pojo获取请求参数">
</form>

实体类

代码语言:javascript复制
/**
 * @author .29.
 * @create 2023-03-05 14:28
 */
public class User {
    String username;
    String password;
    String sex;
    String age;
    String email;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{"  
                "username='"   username   '''  
                ", password='"   password   '''  
                ", sex='"   sex   '''  
                ", age='"   age   '''  
                ", email='"   email   '''  
                '}';
    }
}

0 人点赞