SpringMVC获取请求参数

472 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

SpringMVC获取请求参数

通过ServletAPI获取参数

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

@Controller
public class TestParamController {
    @RequestMapping("/param/servletAPI")
    public String getParamByServletAPI(HttpServletRequest request){
        String uname = request.getParameter("uname");
        String password = request.getParameter("password");
        System.out.println("uname:"+uname+",password:"+password);
        return "success";
    }
}

@RequestParam注解

默认情况下其实只需要设置形参就可以匹配请求的参数

@RequestMapping("/test")
public String getParamByRequestParam(String uname , int password){
    System.out.println("uname:"+uname+",password:"+password);
    return "success";
}

但若形参设置的和请求参数不一致时,就会匹配不到,此时就可以用@RequestParam注解,即:

public String getParamByRequestParam(
        @RequestParam("uname") String uname, 
        @RequestParam("password") int password)

注解有三个属性:value、required、defaultValue

  • value:参数名
  • required:设置是否必须传输value对应的请求参数,默认值为true(必须传),若没传则报错:400
  • defaultValue:设置value的默认值,设置该属性后required属性无论为true或false,都不会报错

@RequestHeader和@CookieValue注解

通过@RequestHeader获取referer头,@CookieValue获取XDEBUG_SESSION(Cookie中发现有之前配置的xdebug直接用了)

@RequestMapping("/test")
public String getParamByRequestParam(
        @RequestParam(value = "uname",required = true,defaultValue = "hello") String uname,
        @RequestParam("password") int password,
        @RequestHeader("referer") String referer,
        @CookieValue("XDEBUG_SESSION") String session
){
    System.out.println("referer:"+referer);
    System.out.println("XDEBUG_SESSION:"+session);
    System.out.println("uname:"+uname+",password:"+password);
    return "success";
}

image-20221011233934308

通过pojo获取请求参数

前边提到可以通过注解获取请求参数,但是如果请求参数过多那么注解就会显得比较繁琐,这时候就可以通过pojo方式来进行管理,只需要请求参数名与pojo的属性名一致即可。

@RequestMapping("/test/pojo")
public String getParamByPojo(User user){
    System.out.println(user);
    return "success";
}

POJO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String uname;
    private String password;
}

请求参数乱码问题

在/conf/server.xml中设置URLEncoding="UTF-8"可解决乱码问题,但该种方式只针对于GET传参,若用POST传参仍会出现乱码,这是就可以通过配置filter解决 (注:filter应放在其他配置之前,因为配置文件是按顺序执行的)

<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>ForceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

encoding代表请求编码,ForceEncoding代表响应编码

看下CharacterEncodingFilter的继承关系

Filter接口的doFilter()方法由OncePerRequestFilter类实现,而在该类的doFilter方法中,最后的过滤是通过doFilterInternal实现的

try {
   doFilterInternal(httpRequest, httpResponse, filterChain);
}

doFilterInternal()写在CharacterEncodingFilter类中,

①:获取encoding参数即:UTF-8

②:if判断,后或运算后边的,request.getCharacterEncoding()默认值为空,所以无论涉不设置ForceEncoding,都会执行if中的语句

③:判断isForceResponseEncoding的值,如果为真则为response设置编码,而我们传入的就是true,所以会执行

通过②、③可以看出,ForceEncoding可以控制request和response的编码方式,而request中由于是或运算默认就会执行if中的语

句,所以可以浅显的理解为ForceEncoding是控制response编码问题的参数