SpringMVC獲取請求參數(shù)的方法詳解
本篇文章的項目配置是在這篇文章的基礎(chǔ)上實現(xiàn)的
通過ServletAPI獲取
將HttpServletRequest作為控制器方法的形參,此時HttpServletRequest類型的參數(shù)表示封裝了當(dāng)前請求的請求報文的對象
舉例如下:
第一步:在html文件中創(chuàng)建表單,如下所示:
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h1>歡迎進(jìn)入首頁!</h1>
<form th:action="@{/param/ServletAPI}" method="post">
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
登錄:<input type="submit" value="登錄">
</form>
</body>
</html>第二步:創(chuàng)建控制器方法,如下所示:
瀏覽器發(fā)送的請求被DispatcherServlet處理后,DispatcherServlet會將得到的請求信息和當(dāng)前控制器中的@RequestMapping的信息進(jìn)行匹配,如果匹配成功,則調(diào)用當(dāng)前的方法處理當(dāng)前的請求
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
@Controller
public class ServletAPIController {
@RequestMapping( value = "/param/ServletAPI",method = RequestMethod.POST)
//HttpServletRequest是Servlet API提供的一個接口,用于封裝HTTP請求的信息,而request即為當(dāng)前要處理的請求對象
public String getParamTesting(HttpServletRequest request){
String username=request.getParameter("用戶名");
String password=request.getParameter("密碼");
System.out.println("username:"+username+",password:"+password);
return "success" ;
}
}重新部署項目,測試結(jié)果如下:
表單填寫完成后,點擊登錄

成功跳轉(zhuǎn)到success頁面

返回控制臺,表單信息也被成功獲取

通過控制器方法的形參獲取請求參數(shù)
在控制器方法的形參位置,設(shè)置和請求參數(shù)同名的形參,當(dāng)瀏覽器發(fā)送請求,匹配到請求映射時,在DispatcherServlet中就會將請求參數(shù)賦值給相應(yīng)的形參
舉例如下:
第一步:創(chuàng)建新的控制器和控制器方法,如下所示:
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class paramTesting {
@RequestMapping("/param")
public String getParamTesting(String username,String password){//注意這里的形參名必須與表單中的name相一致
System.out.println("username:"+username+",password:"+password);
return "success";
}
}第二步:將變量的值動態(tài)的渲染到form表單中
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h1>歡迎進(jìn)入首頁!</h1>
<form th:action="@{/param}" method="post">
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
登錄:<input type="submit" value="登錄">
</form>
</body>
</html>重新部署項目,將瀏覽器中的表單填寫

跳轉(zhuǎn)到如下所示成功的登錄頁面:

打開控制臺,獲取到的表單中的信息如下所示:

我們會發(fā)現(xiàn)username,我們在表單填寫時的值為小明,而出現(xiàn)在控制臺卻是亂碼的,解決方法如下所示:
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
@RequestMapping("/param")
public String getParamTesting(String username,String password) throws UnsupportedEncodingException {
//在controller層添加這句話,把jsp前端傳過來的字符串改變編碼
username= new String(username.getBytes("ISO8859-1"),"UTF-8");
password= new String(password.getBytes("ISO8859-1"),"UTF-8");
System.out.println("username:"+username+",password:"+password);
return "success";
}
}此時重新部署項目,測試結(jié)果如下所示:
亂碼問題被解決

上述我們是通過設(shè)置和請求參數(shù)同名的形參,但是在實際開發(fā)中往往都是前后端分離,可能會出現(xiàn)前端命名不規(guī)范,或者后端變量名沖突,此時后端獲取到的有可能為null,對此我們可手動創(chuàng)建請求參數(shù)和形參的關(guān)系:
@RequestParam注解的使用
@RequestParam注解源碼,如下所示:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}@RequestParam注解是Spring MVC框架中的一個注解,用于綁定請求參數(shù)到方法的參數(shù)上。它的作用是將HTTP請求中的參數(shù)值映射到方法的參數(shù)上,以便在方法中使用這些參數(shù)值。
具體來說,@RequestParam注解可以用于以下幾個方面:
1:綁定請求參數(shù)的名稱:通過@RequestParam注解,可以指定請求參數(shù)的名稱,將請求中對應(yīng)名稱的參數(shù)值綁定到方法的參數(shù)上

2:設(shè)置參數(shù)的默認(rèn)值:通過@RequestParam注解的defaultValue屬性,可以設(shè)置參數(shù)的默認(rèn)值。如果請求中沒有傳遞對應(yīng)名稱的參數(shù),那么方法的參數(shù)將使用默認(rèn)值。

3:設(shè)置參數(shù)的必需性:通過@RequestParam注解的required屬性,可以指定參數(shù)是否為必需的。如果將required屬性設(shè)置為true(默認(rèn)值為true),而請求中沒有傳遞對應(yīng)名稱的參數(shù),那么將拋出MissingServletRequestParameterException異常。例如:

但由于我們是表單提交的方式,因此表單中的每個參數(shù)名都會被傳遞,所以為了測試該屬性的效果,我們可以手動在地址欄將username刪除,只保留password,如下所示:


但是當(dāng)我們將required的值設(shè)置為false時,即使我們手動的在地址欄將請求參數(shù)名username刪除,只保留password,也不會報錯,如下所示:

@RequestHeader注解的使用
將請求頭信息和控制器方法進(jìn)行綁定
@RequestHeader注解源碼如下所示:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}舉例如下:
假設(shè)我們現(xiàn)在向獲取請求頭信息中的referer,如下所示:

獲取方法如下所示:
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
@RequestMapping(value = "/param")
public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader("referer") String referer) throws UnsupportedEncodingException {//在控制器方法的形參處創(chuàng)建新的形參名referer,并且給該形參名添加@RequestHeader注解,注解值為請求頭信息的參數(shù)名
username= new String(username.getBytes("ISO8859-1"),"GBK");
password= new String(password.getBytes("ISO8859-1"),"GBK");
System.out.println("referer:"+referer);
System.out.println("username:"+username+",password:"+password);
return "success";
}
}測試后,控制臺輸出如下所示:

@RequestHeader注解中的defaultvalue屬性,當(dāng)該請求的請求頭信息中包含@RequestHeader注解中的value時,那么如上所示,它會直接獲取該值,否則,將輸出defaultvalue中的值,舉例如下所示:
我們將defaultvalue的值設(shè)置為"No referer",因此當(dāng)該請求沒有來源地址時,會輸出該值
public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader(value = "referer",defaultValue = "No referer") String referer)
測試方法為:將http://localhost:8080/ServletAPI/param?username=zhangsan&password=123復(fù)制在新的瀏覽器地址欄中打開,控制臺輸出如下所示:

@CookieValue注解的使用
將cookie數(shù)據(jù)和控制器方法進(jìn)行綁定
@CookieValue注解源碼如下所示:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}通過之前的學(xué)習(xí),我們都知道cookie是鍵值對,因此,當(dāng)我們想要獲取cookie就比較麻煩,首先通過getcookies()方法獲取一個類型為cookie的數(shù)組,再通過getName和getValue方法進(jìn)行獲取其鍵名和值,如果我們想獲取一個指定的cookie,那么還需要判斷它是否屬于某個類,屬于我們才能獲取其值,但在SpringMVC中,我們不需要如此麻煩,我們可以直接通過@CookieValue注解,如下所示:

假設(shè)我們想獲取該cookie,方法如下:

測試結(jié)果如下所示,控制臺輸出:

通過pojo獲取請求參數(shù)
假設(shè)我們通過瀏覽器向服務(wù)器傳輸?shù)臄?shù)據(jù)很復(fù)雜,包括姓名,年齡,性別,愛好,郵箱,家庭住址等等,如果我們還是按照上述的方法在控制器方法的參數(shù)部分創(chuàng)建形參來接受,這樣就會非常麻煩,對此SpringMVC為我們提供了一種簡單的方法:只需要在控制器方法的形參位置設(shè)置實體類形參,但是需要保證實體類中的屬性和請求參數(shù)中的名稱一致,那么我們才可以直接將請求參數(shù)中的值封裝到實體類類型的形參中。
舉例如下所示:
第一步首先創(chuàng)建實體類:
package Controller.pojo;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer 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 User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}第二步:創(chuàng)建控制器方法
package Controller.pojo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class pojoController {
@RequestMapping("/param/pojo")
public String pojoTesting(User user){//在控制器方法的形參位置設(shè)置實體類形參
System.out.println("用戶信息為如下所示:");
System.out.println(user);
return "success";
}
}第三步修改index.html文件
如下所示:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h1>歡迎進(jìn)入首頁!</h1>
<form th:action="@{/param/pojo}">
id:<input type="text" name="id"><br>
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
登錄:<input type="submit" value="登錄">
</form>
</body>
</html>在瀏覽器中填寫表單:

頁面跳轉(zhuǎn)成功后,控制臺輸出如下所示:

以上就是SpringMVC獲取請求參數(shù)的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC獲取請求參數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何通過idea實現(xiàn)springboot集成mybatis
這篇文章主要介紹了如何通過idea實現(xiàn)springboot集成mybatis,使用springboot 集成 mybatis后,通過http請求接口,使得通過http請求可以直接操作數(shù)據(jù)庫,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
如何解決java.util.zip.ZipFile解壓后被java占用問題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

