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>
相关推荐
先睡1 小时前
Redis的缓存击穿和缓存雪崩
redis·spring·缓存
pianmian12 小时前
类(JavaBean类)和对象
java
我叫小白菜3 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
Albert Edison3 小时前
【最新版】IntelliJ IDEA 2025 创建 SpringBoot 项目
java·spring boot·intellij-idea
超级小忍4 小时前
JVM 中的垃圾回收算法及垃圾回收器详解
java·jvm
weixin_446122464 小时前
JAVA内存区域划分
java·开发语言·redis
勤奋的小王同学~4 小时前
(javaEE初阶)计算机是如何组成的:CPU基本工作流程 CPU介绍 CPU执行指令的流程 寄存器 程序 进程 进程控制块 线程 线程的执行
java·java-ee
TT哇4 小时前
JavaEE==网站开发
java·redis·java-ee
2401_826097624 小时前
JavaEE-Linux环境部署
java·linux·java-ee
缘来是庄5 小时前
设计模式之访问者模式
java·设计模式·访问者模式