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>
相关推荐
明洞日记2 分钟前
【设计模式手册014】解释器模式 - 语言解释的优雅实现
java·设计模式·解释器模式
lichong95115 分钟前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
xu_yule30 分钟前
Linux_14(多线程)线程控制+C++多线程
java·开发语言·jvm
合作小小程序员小小店41 分钟前
网页开发,在线%新版本旅游管理%系统,基于eclipse,html,css,jquery,servlet,jsp,mysql数据库
java·数据库·eclipse·html·intellij-idea·旅游·jsp
组合缺一1 小时前
Spring Boot 国产化替代方案。Solon v3.7.2, v3.6.5, v3.5.9 发布(支持 LTS)
java·后端·spring·ai·web·solon·mcp
s***11701 小时前
常见的 Spring 项目目录结构
java·后端·spring
8***a8151 小时前
从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
hive·servlet·tomcat
O***P5711 小时前
记录 idea 启动 tomcat 控制台输出乱码问题解决
java·tomcat·intellij-idea
7***47711 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端