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>
相关推荐
P.H. Infinity30 分钟前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天34 分钟前
java的threadlocal为何内存泄漏
java
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋31 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络
Wx-bishekaifayuan1 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
全栈开发圈1 小时前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫