SpringMVC获取请求参数

123 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

1、通过ServletAPI获取

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

 /**
  * @author rop
  * @since 2022/7/31 11:36
  */
 @Controller
 public class TestParamController {
     @RequestMapping("/param/servletAPI")
     public String getParameterServletAPI(HttpServletRequest request){
         String username = request.getParameter("username");
         String password = request.getParameter("password");
         if ("admin".equals(username) && "admin".equals(password)){
             return "success";
         }
         return "index";
     }
 }

这里的success是通过验证则跳转的页面,因为在视图解析器中配置中已经配置了跳转的前缀和后缀,所以这里只需要直接输入文件名即可跳转,index同理也是。上述的例子还只是用的JavaEE的servlet的API,比较简单。

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

只要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一样即可。

 @RequestMapping("/param")
 public String getParameter(String username,String password){
     if ("admin".equals(username) && "admin".equals(password)){
         return "success";
     }
     return "index";
 }

第二种方式则是SpringMVC中的用法,将前端页面的传递的参数对应的参数名写在方法的形参列表中,在运行的过程中,方法即可通过参数列表来获取前端传递的参数。

3、@RequestParam

将请求参数和控制器方法的形参绑定

三个属性:

  • value
  • required
  • defaultValue

value:设置和形参绑定的请求参数的名字

required:设置是否必须传输value所对应的请求参数。

默认值为true,表示value所对应的请求参数必须传输,否则页面报错。

若设置为false,则表示value所对应的请求参数不是必须传输,若未传输,则形参值为null

defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关

4、@RequestHeader

将请求头信息和控制器方法的形参绑定

 @RequestMapping("/param3")
 public String getParameter3(
         @RequestParam("userName") String username,
         String password,
         @RequestHeader("referer") String referer) {
     if ("admin".equals(username) && "admin".equals(password)) {
         System.out.println("referer = " + referer);
         return "success";
     }
     return "index";
 }

这个referer可以获取中header中的referer的信息。

5、@CookieValue

将cookie数据和控制器方法的形参绑定

 @RequestMapping("/param4")
 public String getParameter4(
         @RequestParam("userName") String username,
         String password,
         @CookieValue("JSESSIONID") String jSessionId) {
     if ("admin".equals(username) && "admin".equals(password)) {
         System.out.println("jSessionId = " + jSessionId);
         return "success";
     }
     return "index";
 }

这个cookie可以看做是JavaEE中的cookie,作用差不多一样。

6、通过POJO获取请求参数

 package com.rop.pojo;
 ​
 /**
  * @author rop
  * @since 2022/7/31 14:27
  */
 public class User {
     private Integer id;
     private String username;
     private String password;
 ​
     public User(Integer id, String username, String password) {
         this.id = id;
         this.username = username;
         this.password = password;
     }
 ​
     public User() {
     }
 ​
     public Integer getId() {
         return id;
     }
 ​
     public void setId(Integer id) {
         this.id = id;
     }
 ​
     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;
     }
 ​
     @Override
     public String toString() {
         return "User{" +
                 "id=" + id +
                 ", username='" + username + ''' +
                 ", password='" + password + ''' +
                 '}';
     }
 }
 @RequestMapping("/param5/pojo")
 public String getParameter5(User user) {
     System.out.println("user = " + user);
     return "success";
 }
 <form th:action="@{/param5/pojo}" method="post">
     用户名:<input type="text" name="username"><br>
     密  码:<input type="password" name="password"><br>
     <input type="submit" value="提交">
 </form>

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

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

 <!--设置字符编码过滤器-->
 <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>
     <!--设置这个可以使响应的编码也是UTF-8-->
     <init-param>
         <param-name>forceEncoding</param-name>
         <param-value>true</param-value>
     </init-param>
 </filter>
 <filter-mapping>
     <filter-name>CharacterEncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

这个的源码已通透。