SpringMVC-获取请求参数

1. 通过ServletAPI获取请求参数

java 复制代码
     /**
     *
     * @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. 通过控制器方法的形参获取请求参数

java 复制代码
    /**
     * 这种方法通过控制器方法的形参来获得请求参数,要注意形参的参数名必须与请求参数的参数名一致
     * 如果某个请求参数有多个值,可以使用字符串或者字符串数组来接收
     * @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";
    }

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

java 复制代码
    /**
     * @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:

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

java 复制代码
    /**
     * 此注解使用方式与@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注解获取请求参数

java 复制代码
    /**
     * 此注解使用方式与@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获取请求参数

java 复制代码
    /**
     * 如果一个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方式的乱码就需要使用过滤器解决。

java 复制代码
	//这是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);
           }
       }
xml 复制代码
    <!--配置编码过滤器来解决乱码问题-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <!--设置encoding属性的值-->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <!--设置forceResponseEncoding属性的值-->
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--表示对所有的请求都进行编码设置,包括jsp-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
相关推荐
luckywuxn6 分钟前
EurekaServer 工作原理
java·eureka
壹米饭9 分钟前
Java程序员学Python学习笔记一:学习python的动机与思考
java·后端·python
java金融11 分钟前
Java 锁升级机制详解
java
Young556615 分钟前
还不了解工作流吗(基础篇)?
java·workflow·工作流引擎
让我上个超影吧16 分钟前
黑马点评【缓存】
java·redis·缓存
ajassi200025 分钟前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
YuTaoShao38 分钟前
Java八股文——MySQL「存储引擎篇」
java·开发语言·mysql
crud44 分钟前
Java 中的 synchronized 与 Lock:深度对比、使用场景及高级用法
java
王德博客1 小时前
【Java课堂笔记】Java 入门基础语法与面向对象三大特性详解
java·开发语言
seventeennnnn1 小时前
Java大厂面试真题:谢飞机的技术挑战
java·spring boot·面试·aigc·技术挑战·电商场景·内容社区