java springMVC之获取请求参数

Posted 知道什么是码怪吗?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java springMVC之获取请求参数相关的知识,希望对你有一定的参考价值。

目录

原生方式获取请求参数

控制器方法形参获取请求参数

@RequestParam注解

@RequestHeader注解

@CookieValue注解

通过POJO获取请求参数


原生方式获取请求参数

html代码

<a th:href="@/testServlet(username='admin',password=123456)">测试原生Servlet获取请求参数</a><br>

接收参数代码

@RequestMapping(value = "/testServlet")
//形参位置的request表示当前请求
public String testServlet(HttpServletRequest request) 
    System.out.println(request.getParameter("username"));
    System.out.println(request.getParameter("password"));
    return "test";

这种方式当然可以接收到传递过来的参数,但是方式略显繁琐。

控制器方法形参获取请求参数

html代码

<a th:href="@/testParam(username='admin',password=123456)">测试使用控制器的形参获取请求参数</a><br>

接收代码,直接将传递过来的参数名写成函数形参来获取对应的值。

@RequestMapping(value = "/testParam")
public String testParam(String username, String password) 
    System.out.println("username = " + username + ", passwprd = " + password);
    return "test";

输出内容

 当然通过控制器方法形参获取请求参数还有几个我们需要注意的地方。

@RequestParam注解

使用这一个注解,可以在请求参数和形参之间建立映射关系,大致意思就是获取到传递过来的这一参数然后赋值给形参。@RequestParam注解有三个属性:

value属性:设置指定的请求参数名。

required属性:设置是否必须传输此参数,默认值为true,如果设置为true但是没有接收到这一个参数,那么将会报错。

defaultValue属性:设置参数的默认值,不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为空字符串时,则使用默认值为形参赋值。

例如我们修改传递过来的参数,下面只传递了参数名为username007的用户名,并且没有传递密码。

<a th:href="@/testParam(username007='admin')">测试使用控制器的形参获取请求参数</a><br>

接收参数代码 

@RequestMapping(value = "/testParam")
    public String testParam(@RequestParam(value = "username007", required = false, defaultValue = "默认username") String username,
                            @RequestParam(value = "password007", required = false, defaultValue = "默认password") String password) 
        System.out.println("username = " + username + ", passwprd = " + password);
        return "test";
    

 输出结果

 从输出结果可以看出,由于我们传递了username007,@RequestParam注解讲其内容传递给了形参username,但是我们并没有传递password007,所以使用的是默认值。

@RequestHeader注解

使用这一个注解,可以将请求头信息和控制器方法的形参创建映射关系,@RequestHeader注解也有三个属性:value属性,required属性,defaultValue属性,用法同@RequestParam。

首先查看请求标头的信息如下

html代码

<a th:href="@/testParam(username='admin',password='123456')">测试使用控制器的形参获取请求参数</a><br>

 接收参数代码

@RequestMapping(value = "/testParam")
public String testParam(
        @RequestHeader(value = "Host", required = false, defaultValue = "默认Host") String host,
        @RequestHeader(value = "Cookie", required = false, defaultValue = "默认Cookie") String cookie,
        String username, String password) 
    System.out.println("username = " + username + ", passwprd = " + password);
    System.out.println("Host = " + host + ", Cookie = " + cookie);
    return "test";

输出结果 

 从输出结果我们可以看出,程序获取到了请求头的Host和Cookie信息,并且传递给了形参。相比于原生的ServletAPI获取请求头的信息,这种方式更加高效简便。

@CookieValue注解

使用这一个注解,可以将cookie数据和控制器方法的形参创建映射关系, @CookieValue注解一共有三个属性:value属性、required属性、defaultValue属性,用法同@RequestParam。

通过查看请求头的信息,我们可以看到Cookie数据如下

html代码

<a th:href="@/testParam(username='admin',password='123456')">测试使用控制器的形参获取请求参数</a><br>

接收参数代码

@RequestMapping(value = "/testParam")
    public String testParam(
            @CookieValue("JSESSIONID") String JSESSIONID,
            String username, String password) 
        System.out.println("username = " + username + ", passwprd = " + password);
        System.out.println("JSESSIONID = " + JSESSIONID);
        return "test";
    

输出结果

相当于获取到了Cookie中的JSESSIONID属性下的信息。

通过POJO获取请求参数

想一想,要是我们提交的是一个表单,并且表单的提交内容十分的多,那我们岂不是要写很多个形参,而且也不方便维护,所以当参数很多时,我们可以用一个实体类来接收数据并进行操作。当浏览器传输的请求参数的参数名和实体类中的属性名一致时,请求参数就会为此属性赋值。其底层原理是通过反射set方法进行属性注入。

如果通过POJO获取请求参数出现了乱码问题,可以先在web.xml文件当中配置过滤器设置编码。

 web.xml文件配置过滤器代码

<!--配置过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--设置获取时的编码-->
    <init-param>
        <!--在springMVC源码当中有一个encoding属性表示编码方式,可以通过初始化这一参数来设置编码方式-->
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <!--获取响应时的编码-->
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<!--设置过滤器作用的范围-->
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

html代码

<form th:action="@/testBean" method="get">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>
    年龄:<input type="text" name="age"><br>
    地址:<input type="text" name="location"><br>
    电话:<input type="text" name="phoneNumber"><br>
    邮箱:<input type="text" name="email"><br>
    <input type="submit" value="使用实体类接收请求参数">
</form>

实体类代码,就相当于根据表单设置了对应的属性,然后生成了属性的set和get方法,创建了对应的构造方法和空构造方法。

package com.mvc.bean;

public class User 

    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String location;
    private String phoneNumber;
    private String sex;
    private String email;

    public User() 
    

    public User(Integer id, String username, String password, Integer age, String location, String phoneNumber, String sex, String email) 
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.location = location;
        this.phoneNumber = phoneNumber;
        this.sex = sex;
        this.email = email;
    

    //属性的get和set方法这里写出,太占篇幅了。

    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                ", age=" + age +
                ", location='" + location + '\\'' +
                ", phoneNumber='" + phoneNumber + '\\'' +
                ", sex='" + sex + '\\'' +
                ", email='" + email + '\\'' +
                '';
    

接收代码

@RequestMapping(value = "/testBean")
public String testBean(User user) 
    System.out.println(user);
    return "test";

测试

输出结果

 这种方式可以很方便的接收数据并且进行相对于的数据库操作。

以上是关于java springMVC之获取请求参数的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2从入门到入坟 | 请求参数处理篇:常用参数注解之@PathVariable

SpringMVC无法获取请求中的参数的问题的调查与解决

Java学习路线分享SpringMVC之请求和响应

SpringMVC 之POST 和GET 获取参数总结

Java--SpringMVC之RequestMapping请求映射和处理器方法参数

springmvc——请求参数获取的几种方法