SpringMVC-获取请求参数

1. 通过ServletAPI获取请求参数

     /**
     *
     * @param request HttpServletRequest对象,直接作为形参传入方法,前端处理器就是一个Servlet
     *                所以前端处理器可以获得HttpServletRequest对象,并根据控制器方法的形参将对象传递给方法
     * @return 返回视图名称给thymeleaf渲染
     */
    @RequestMapping("/servletAPI")
    public String servletAPI(HttpServletRequest request){
        String id = request.getParameter("id");
        String username = request.getParameter("username");
        System.out.println("id = "+id+"  "+"username = "+username);
        return "testServletAPI";
    }

在这里插入图片描述

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

    /**
     * 这种方法通过控制器方法的形参来获得请求参数,要注意形参的参数名必须与请求参数的参数名一致
     * 如果某个请求参数有多个值,可以使用字符串或者字符串数组来接收
     * @param id
     * @param username
     * @param hobby
     * @return
     */
    @RequestMapping("/methodParams")
    public String methodParams(String id,String username,String hobby,String[] sport){
        System.out.println("id = "+id);
        System.out.println("username = "+username);
        System.out.println("hobby = "+hobby);
        System.out.println("sport = "+ Arrays.toString(sport));
        return "testMethodParams";
    }

SpringMVC-获取请求参数_第1张图片

3. 通过@RequestParam注解获取请求参数

    /**
     * @RequestParam源码
     * 修饰的目标是形参
     * @Target({ElementType.PARAMETER})
     * @Retention(RetentionPolicy.RUNTIME)
     * @Documented
     * public @interface RequestParam {
     *     value是name的别名
     *     @AliasFor("name")
     *     String value() default "";
     *
     *     name是value的别名
     *     @AliasFor("value")
     *     String name() default "";
     *
     *     为true时表示必须传输value所指定的请求参数,如果没有该参数会报错
     *     为false表示没有该参数就不传参,修饰的形参为其原本的值
     *     boolean required() default true;
     *
     *     默认值指不论required为true或false,没有传参或传的空值,就使用默认值赋值
     *     String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
     * }
     * @param id
     * @param username
     * @return
     */
    @RequestMapping("/testRequestParam")
    public String testRequestParam(
            String id,
            @RequestParam("user_name")String username,
            @RequestParam(value="name",defaultValue = "asd")String name,
            @RequestParam(value="age",required = false)String age
    ){
        System.out.println("id = "+id);
        System.out.println("username = "+username);
        System.out.println("name = "+name);
        System.out.println("age = "+age);
        return "testRequestParam";
    }

不指定defaultValue:
SpringMVC-获取请求参数_第2张图片
SpringMVC-获取请求参数_第3张图片

4. 通过@RequestHeader注解获取请求参数

    /**
     * 此注解使用方式与@RequestParam一致,都有value、required和defaultValue属性,此注解用于获取请求头信心
     * @param host
     * @return
     */
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(
            @RequestHeader("Host")String host
    ){
        System.out.println("host = "+host);
        return "testRequestHeader";
    }

在这里插入图片描述

5. 通过@CookieValue注解获取请求参数

    /**
     * 此注解使用方式与@RequestParam一致,都有value、required和defaultValue属性,此注解用于获取cookie信息
     * @param JSESSIONID
     * @return
     */
    @RequestMapping("/testCookieValue")
    public String testCookieValue(
            @CookieValue("JSESSIONID")final String JSESSIONID
    ){
        System.out.println("JSESSIONID = "+JSESSIONID);
        return "testCookieValue";
    }

在这里插入图片描述

6. 通过POJO获取请求参数

    /**
     * 如果一个POJO类中有属性与请求参数同名,那么就会将请求参数封装到POJO类的对象中
     * 只要形参中的对象满足要求,就会被赋值
     * @param user
     * @param user2
     * @return
     */
    @RequestMapping("/testPOJO")
    public String testPOJO(User user,User user2){
        System.out.println(user);
        System.out.println(user2);
        return "testPOJO";
    }

在这里插入图片描述

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

如果请求参数使用的字符集与服务器解析请求参数使用的字符集不同,那么就有可能出现乱码问题。使用原生servlet时,可以通过设置解析请求参数使用的字符集来解决乱码问题,但是在SpringMVC框架中,在控制器中请求参数已经被解析了,也就是说我们无法通过编程来解决乱码问题。由于DispatcherServlet在我们处理之前已经获得了请求参数,所以要解决乱码问题,就必须在DispatcherServlet之前,也就可以通过过滤器来解决。GET请求方式的乱码问题可以通过设置URIEncoding的方式一次性解决。而POST方式的乱码就需要使用过滤器解决。
SpringMVC-获取请求参数_第4张图片

	//这是CharacterEncodingFilter中设置编码的逻辑
       //encoding、forceRequestEncoding和forceResponseEncoding都是该类的属性
       if (encoding != null) {
           //如果没有设置request的编码,就会进入下面的逻辑,将request的编码设置为encoding
           if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {
               request.setCharacterEncoding(encoding);
           }
           //如果forceResponseEncoding为true,那么也会为响应设置编码
           if (this.isForceResponseEncoding()) {
               response.setCharacterEncoding(encoding);
           }
       }
    
    <filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        <init-param>
            
            <param-name>forceResponseEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>
        
        <url-pattern>/*url-pattern>
    filter-mapping>

SpringMVC-获取请求参数_第5张图片

你可能感兴趣的:(tomcat,java,spring)