SpringMVC獲取請(qǐng)求參數(shù)的方法詳解
本篇文章的項(xiàng)目配置是在這篇文章的基礎(chǔ)上實(shí)現(xiàn)的
通過(guò)ServletAPI獲取
將HttpServletRequest作為控制器方法的形參,此時(shí)HttpServletRequest類(lèi)型的參數(shù)表示封裝了當(dāng)前請(qǐng)求的請(qǐng)求報(bào)文的對(duì)象
舉例如下:
第一步:在html文件中創(chuàng)建表單,如下所示:
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁(yè)</title>
</head>
<body>
<h1>歡迎進(jìn)入首頁(yè)!</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ā)送的請(qǐng)求被DispatcherServlet處理后,DispatcherServlet會(huì)將得到的請(qǐng)求信息和當(dāng)前控制器中的@RequestMapping的信息進(jìn)行匹配,如果匹配成功,則調(diào)用當(dāng)前的方法處理當(dāng)前的請(qǐ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提供的一個(gè)接口,用于封裝HTTP請(qǐng)求的信息,而request即為當(dāng)前要處理的請(qǐng)求對(duì)象
public String getParamTesting(HttpServletRequest request){
String username=request.getParameter("用戶名");
String password=request.getParameter("密碼");
System.out.println("username:"+username+",password:"+password);
return "success" ;
}
}重新部署項(xiàng)目,測(cè)試結(jié)果如下:
表單填寫(xiě)完成后,點(diǎn)擊登錄

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

返回控制臺(tái),表單信息也被成功獲取

通過(guò)控制器方法的形參獲取請(qǐng)求參數(shù)
在控制器方法的形參位置,設(shè)置和請(qǐng)求參數(shù)同名的形參,當(dāng)瀏覽器發(fā)送請(qǐng)求,匹配到請(qǐng)求映射時(shí),在DispatcherServlet中就會(huì)將請(qǐng)求參數(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";
}
}第二步:將變量的值動(dòng)態(tài)的渲染到form表單中
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁(yè)</title>
</head>
<body>
<h1>歡迎進(jìn)入首頁(yè)!</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>重新部署項(xiàng)目,將瀏覽器中的表單填寫(xiě)

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

打開(kāi)控制臺(tái),獲取到的表單中的信息如下所示:

我們會(huì)發(fā)現(xiàn)username,我們?cè)诒韱翁顚?xiě)時(shí)的值為小明,而出現(xiàn)在控制臺(tái)卻是亂碼的,解決方法如下所示:
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前端傳過(guò)來(lái)的字符串改變編碼
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";
}
}此時(shí)重新部署項(xiàng)目,測(cè)試結(jié)果如下所示:
亂碼問(wèn)題被解決

上述我們是通過(guò)設(shè)置和請(qǐng)求參數(shù)同名的形參,但是在實(shí)際開(kāi)發(fā)中往往都是前后端分離,可能會(huì)出現(xiàn)前端命名不規(guī)范,或者后端變量名沖突,此時(shí)后端獲取到的有可能為null,對(duì)此我們可手動(dòng)創(chuàng)建請(qǐ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框架中的一個(gè)注解,用于綁定請(qǐng)求參數(shù)到方法的參數(shù)上。它的作用是將HTTP請(qǐng)求中的參數(shù)值映射到方法的參數(shù)上,以便在方法中使用這些參數(shù)值。
具體來(lái)說(shuō),@RequestParam注解可以用于以下幾個(gè)方面:
1:綁定請(qǐng)求參數(shù)的名稱:通過(guò)@RequestParam注解,可以指定請(qǐng)求參數(shù)的名稱,將請(qǐng)求中對(duì)應(yīng)名稱的參數(shù)值綁定到方法的參數(shù)上

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

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

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


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

@RequestHeader注解的使用
將請(qǐng)求頭信息和控制器方法進(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)在向獲取請(qǐng)求頭信息中的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注解,注解值為請(qǐng)求頭信息的參數(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";
}
}測(cè)試后,控制臺(tái)輸出如下所示:

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

@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";
}通過(guò)之前的學(xué)習(xí),我們都知道cookie是鍵值對(duì),因此,當(dāng)我們想要獲取cookie就比較麻煩,首先通過(guò)getcookies()方法獲取一個(gè)類(lèi)型為cookie的數(shù)組,再通過(guò)getName和getValue方法進(jìn)行獲取其鍵名和值,如果我們想獲取一個(gè)指定的cookie,那么還需要判斷它是否屬于某個(gè)類(lèi),屬于我們才能獲取其值,但在SpringMVC中,我們不需要如此麻煩,我們可以直接通過(guò)@CookieValue注解,如下所示:

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

測(cè)試結(jié)果如下所示,控制臺(tái)輸出:

通過(guò)pojo獲取請(qǐng)求參數(shù)
假設(shè)我們通過(guò)瀏覽器向服務(wù)器傳輸?shù)臄?shù)據(jù)很復(fù)雜,包括姓名,年齡,性別,愛(ài)好,郵箱,家庭住址等等,如果我們還是按照上述的方法在控制器方法的參數(shù)部分創(chuàng)建形參來(lái)接受,這樣就會(huì)非常麻煩,對(duì)此SpringMVC為我們提供了一種簡(jiǎn)單的方法:只需要在控制器方法的形參位置設(shè)置實(shí)體類(lèi)形參,但是需要保證實(shí)體類(lèi)中的屬性和請(qǐng)求參數(shù)中的名稱一致,那么我們才可以直接將請(qǐng)求參數(shù)中的值封裝到實(shí)體類(lèi)類(lèi)型的形參中。
舉例如下所示:
第一步首先創(chuàng)建實(shí)體類(lèi):
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è)置實(shí)體類(lèi)形參
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>首頁(yè)</title>
</head>
<body>
<h1>歡迎進(jìn)入首頁(yè)!</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>在瀏覽器中填寫(xiě)表單:

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

以上就是SpringMVC獲取請(qǐng)求參數(shù)的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC獲取請(qǐng)求參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何通過(guò)idea實(shí)現(xiàn)springboot集成mybatis
這篇文章主要介紹了如何通過(guò)idea實(shí)現(xiàn)springboot集成mybatis,使用springboot 集成 mybatis后,通過(guò)http請(qǐng)求接口,使得通過(guò)http請(qǐng)求可以直接操作數(shù)據(jù)庫(kù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中
這篇文章主要為大家介紹了如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
Spring事務(wù)失效場(chǎng)景的詳細(xì)整理
Spring 事務(wù)的傳播特性說(shuō)的是,當(dāng)多個(gè)事務(wù)同時(shí)存在的時(shí)候,Spring 如何處理這些事務(wù)的特性,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2022-02-02
Flink入門(mén)級(jí)應(yīng)用域名處理示例
這篇文章主要介紹了一個(gè)比較簡(jiǎn)單的入門(mén)級(jí)Flink應(yīng)用,代碼很容易寫(xiě),主要用到的算子有FlatMap、KeyBy、Reduce,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
如何解決java.util.zip.ZipFile解壓后被java占用問(wèn)題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

