SpringMVC獲取請(qǐng)求參數(shù)的方法詳解
本篇文章的項(xiàng)目配置是在這篇文章的基礎(chǔ)上實(shí)現(xiàn)的
通過ServletAPI獲取
將HttpServletRequest作為控制器方法的形參,此時(shí)HttpServletRequest類型的參數(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>首頁</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ā)送的請(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é)果如下:
表單填寫完成后,點(diǎn)擊登錄
成功跳轉(zhuǎn)到success頁面
返回控制臺(tái),表單信息也被成功獲取
通過控制器方法的形參獲取請(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>首頁</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>
重新部署項(xiàng)目,將瀏覽器中的表單填寫
跳轉(zhuǎn)到如下所示成功的登錄頁面:
打開控制臺(tái),獲取到的表單中的信息如下所示:
我們會(huì)發(fā)現(xiàn)username,我們?cè)诒韱翁顚憰r(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前端傳過來的字符串改變編碼 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é)果如下所示:
亂碼問題被解決
上述我們是通過設(shè)置和請(qǐng)求參數(shù)同名的形參,但是在實(shí)際開發(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ù)值。
具體來說,@RequestParam注解
可以用于以下幾個(gè)方面:
1:綁定請(qǐng)求參數(shù)的名稱:通過@RequestParam注解,可以指定請(qǐng)求參數(shù)的名稱,將請(qǐng)求中對(duì)應(yīng)名稱的參數(shù)值綁定到方法的參數(shù)上
2:設(shè)置參數(shù)的默認(rèn)值:通過@RequestParam注解的defaultValue屬性
,可以設(shè)置參數(shù)的默認(rèn)值。如果請(qǐng)求中沒有傳遞對(duì)應(yīng)名稱的參數(shù),那么方法的參數(shù)將使用默認(rèn)值。
3:設(shè)置參數(shù)的必需性:通過@RequestParam注解的required屬性
,可以指定參數(shù)是否為必需的。如果將required屬性設(shè)置為true(默認(rèn)值為true),而請(qǐng)求中沒有傳遞對(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)求沒有來源地址時(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ù)制在新的瀏覽器地址欄中打開,控制臺(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"; }
通過之前的學(xué)習(xí),我們都知道cookie是鍵值對(duì),因此,當(dāng)我們想要獲取cookie就比較麻煩,首先通過getcookies()方法獲取一個(gè)類型為cookie的數(shù)組,再通過getName和getValue方法進(jìn)行獲取其鍵名和值,如果我們想獲取一個(gè)指定的cookie,那么還需要判斷它是否屬于某個(gè)類,屬于我們才能獲取其值,但在SpringMVC中,我們不需要如此麻煩,我們可以直接通過@CookieValue注解,如下所示:
假設(shè)我們想獲取該cookie,方法如下:
測(cè)試結(jié)果如下所示,控制臺(tái)輸出:
通過pojo獲取請(qǐng)求參數(shù)
假設(shè)我們通過瀏覽器向服務(wù)器傳輸?shù)臄?shù)據(jù)很復(fù)雜,包括姓名,年齡,性別,愛好,郵箱,家庭住址等等,如果我們還是按照上述的方法在控制器方法的參數(shù)部分創(chuàng)建形參來接受,這樣就會(huì)非常麻煩,對(duì)此SpringMVC為我們提供了一種簡(jiǎn)單的方法:只需要在控制器方法的形參位置設(shè)置實(shí)體類形參,但是需要保證實(shí)體類中的屬性和請(qǐng)求參數(shù)中的名稱一致
,那么我們才可以直接將請(qǐng)求參數(shù)中的值封裝到實(shí)體類類型的形參中
。
舉例如下所示:
第一步首先創(chuàng)建實(shí)體類:
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í)體類形參 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)成功后,控制臺(tái)輸出如下所示:
以上就是SpringMVC獲取請(qǐng)求參數(shù)的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC獲取請(qǐng)求參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何通過idea實(shí)現(xiàn)springboot集成mybatis
這篇文章主要介紹了如何通過idea實(shí)現(xiàn)springboot集成mybatis,使用springboot 集成 mybatis后,通過http請(qǐng)求接口,使得通過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-07java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄猨ava反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06Spring事務(wù)失效場(chǎng)景的詳細(xì)整理
Spring 事務(wù)的傳播特性說的是,當(dāng)多個(gè)事務(wù)同時(shí)存在的時(shí)候,Spring 如何處理這些事務(wù)的特性,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2022-02-02如何解決java.util.zip.ZipFile解壓后被java占用問題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06