欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC獲取請(qǐng)求參數(shù)的方法詳解

 更新時(shí)間:2023年07月21日 10:38:09   作者:從未止步..  
這篇文章主要為大家詳細(xì)介紹了SpringMVC中獲取請(qǐng)求參數(shù)的方法,例如通過ServletAPI獲取和通過控制器方法的形參獲取請(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

    這篇文章主要介紹了如何通過idea實(shí)現(xiàn)springboot集成mybatis,使用springboot 集成 mybatis后,通過http請(qǐng)求接口,使得通過http請(qǐng)求可以直接操作數(shù)據(jù)庫(kù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • java中的匿名內(nèi)部類總結(jié)

    java中的匿名內(nèi)部類總結(jié)

    這篇文章主要介紹了 java中的匿名內(nèi)部類總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • SpringBoot整合微信小程序支付V3(支付退款)

    SpringBoot整合微信小程序支付V3(支付退款)

    小程序支付在很多項(xiàng)目都會(huì)使用,本文主要介紹了SpringBoot整合微信小程序支付V3,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中

    如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中

    這篇文章主要為大家介紹了如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java多線程之哲學(xué)家就餐問題詳解

    Java多線程之哲學(xué)家就餐問題詳解

    這篇文章主要介紹了Java多線程之哲學(xué)家就餐問題詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java解析Excel文件的方法實(shí)例詳解

    java解析Excel文件的方法實(shí)例詳解

    在日常工作中,我們常常會(huì)進(jìn)行文件讀寫操作,除去我們最常用的純文本文件讀寫,更多時(shí)候我們需要對(duì)Excel中的數(shù)據(jù)進(jìn)行讀取操作,下面這篇文章主要給大家介紹了關(guān)于java解析Excel文件的方法,需要的朋友可以參考下
    2022-06-06
  • java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例

    java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄猨ava反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Spring事務(wù)失效場(chǎng)景的詳細(xì)整理

    Spring事務(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
  • Flink入門級(jí)應(yīng)用域名處理示例

    Flink入門級(jí)應(yīng)用域名處理示例

    這篇文章主要介紹了一個(gè)比較簡(jiǎn)單的入門級(jí)Flink應(yīng)用,代碼很容易寫,主要用到的算子有FlatMap、KeyBy、Reduce,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 如何解決java.util.zip.ZipFile解壓后被java占用問題

    如何解決java.util.zip.ZipFile解壓后被java占用問題

    這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論