在傳統的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";
}