SpringMVC的数据获取问题

在传统的javaweb中我们获取数据是通过HttpServletRequest中的getParameter或者getHeader等方法来获取相关的信息。由此我们引出了以下问题:

在SpringMVC中应该如何获取请求提交的数据呢?
在SpringMVC中又应该如何获取请求头信息呢?
在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?

接下来我们将逐一解释上面的三个问题。我们使用idea进行开发。在进行解释之前我们需要准备一个`Register.html`的页面。方便进行表单的提交。`Register.html`代码如下:



问题1 如何获取请求提交的数据?

1.1使用Servlet原生api获取

 //方式一采用原生请求方式
    @PostMapping(value = "/register")
    public String register(HttpServletRequest req){
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username: "+username+" send a request");
        return "success";
    }

如果 System.out.println("username: "+username+" send a request");语句输出成功,并且浏览器跳转到success.html页面即为测试成功。

测试结果:



页面跳转:



控制台输出:

1.2采用RequestMapping的Param参数

1.2.1基本使用:
   //采用params参数
    @PostMapping(value = "/register")
    public String register(
            @RequestParam("username")
            String Username,
            @RequestParam("password")
            String password){
        System.out.println("Username: "+Username+" Password: "+password);
        return "success";
    }


##### 测试结果:


1.2.2 添加require属性

在注解中添加required属性并且设置为true表示请求必须携带该参数,否则无法使用

   //采用params参数
    @PostMapping(value = "/register")
    public String register(
            @RequestParam(value = "username" ,required = false)
            String Username,
            @RequestParam("password")
            String password,
            @RequestParam("sex",required = true)
            String sex){
        System.out.println("Username: "+Username+" Password: "+password);
        return "success";
    }
1.2.3 defaultValue属性

defaultValue属性用来设置形参的默认值,当没有提供对应的请求参数或者请求参数的值是空字符串""的时候,方法的形参会采用默认值。

@PostMapping(value = "/register")
    public String register(
            @RequestParam(value = "username" ,required = false)
            String Username,
            @RequestParam("password")
            String password,
            @RequestParam("sex")
            String sex,
            @RequestParam(value = "hobby" ,required = false ,defaultValue = "未知")
            String hobby){
        System.out.println("Username: "+Username+" Password: "+password);
        return "success";
    }

1.3 依靠控制器方法上的形参名来接收

@RequestParam 这个注解是可以省略的,如果方法形参的名字和提交数据时的name相同,则 @RequestParam 可以省略。但有一个前提:如果你采用的是Spring6版本,你需要在pom.xml文件中指定编译参数'-parameter',配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.12.1</version>
            <configuration>
                <source>21</source>
                <target>21</target>
                <compilerArgs>
                    <arg>-parameters</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

注意:如果你使用的是Spring5的版本,以上的配置是不需要的。

Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!

@PostMapping(value="/register")
public String register(String username, String password, String sex, ){
    System.out.println(username + "," + password + "," + sex  );
    return "success";
}

1.4 POJO类/JavaBean接收请求参数(重要)

在我之前的《SpringMVC框架和Servlet开发有啥子区别?》一文中我提到了 SpringMVC架构相对于传统原生的Servlet多了一个使用POJO类/JavaBean接收请求参数。为我们开发提供极大的简便。


当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名必须和请求参数的参数名保持一致。SpringMvC底层会使用反射机制创建对象并且调用对象的set方法给User对象的属性赋值。提供以下的JavaBean:

public class User {
    private Long id;
    private String username;
    private String password;
    private String sex;
    private String[] hobby;
    private String intro;

    public User() {
    }

    public User(Long id, String username, String password, String sex, String[] hobby, String intro) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.sex = sex;
        this.hobby = hobby;
        this.intro = intro;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                ", intro='" + intro + '\'' +
                '}';
    }
}

问题二:在SpringMVC中又应该如何获取请求头信息呢?

通过RequestHeader注解可以拿到请求头信息。请求头信息的形式也是key:value的键值对形式。该注解的作用是:将请求头信息映射到方法的形参上。和RequestParam注解功能相似,RequestParam注解的作用:将请求参数映射到方法的形参上。当然,对于RequestHeader注解来说,也有三个属性:value、required、defaultValue,和RequestParam一样。

@PostMapping("/register")
public String register(User user, 
                       @RequestHeader(value="Referer", required = false, defaultValue = "") 
                       String referer){
    System.out.println(user);
    System.out.println(referer);
    return "success";
}

在控制器方法的形参位置上使用javabean来接收请求参数:

@PostMapping("/register")
public String register(User user){
    System.out.println(user);
    return "success";
}

问题三:在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?

我们可以通过CookieValue注解来获取Cookie信息。该注解的作用:将请求提交的Cookie数据映射到方法形参上。该注解同样是有三个属性:value、required、defaultValue。

前端代码:

<script type="text/javascript">
    function sendCookie(){
        document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
        document.location = "/springmvc/register";
    }
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>

后端接收代码

    @GetMapping("/register")
    public String register(User user,
                           @RequestHeader(value="Referer", required = false, defaultValue = "")
                           String referer,
                           @CookieValue(value="id", required = false, defaultValue = "2222222222")
                           String id){
        System.out.println(user);
        System.out.println(referer);
        System.out.println(id);
        return "success";
    }
posted @ 2024-07-01 16:52  BLBALDMAN  阅读(6)  评论(0编辑  收藏  举报