SpringMVC的資料獲取問題

BLBALDMAN發表於2024-07-01

在傳統的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:

ublic 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";
}

問題三:在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";
    }

相關文章