SpringMVC中請求參數的獲取方式

SpringMVC請求參數獲取方式

一、通過 ServletAPI 獲取

可以使用原生 Servlet 獲取請求參數,將 HttpServletRequest 作為控制器方法的形參,此時 HttpServletRequest 類型的參數表示封裝瞭當前請求的請求報文的對象。

有兩種常用的方法。

使用 getParameter()方法獲取指定字段的值,如果有重名的字段,隻獲取第一個。

@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username:"+username+",password:"+password);
    return "success";
}

如果要獲取同字段的多個值,使用request.getParameterValues()方法,比如:

<form name="checkform" method="post" action="getvalue.jsp">    
    你希望學習哪些程式語言:<br>    
    <input type="checkbox" name="langtype" value="JSP">JSP     
    <input type="checkbox" name="langtype" value="PHP">PHP     
    <input type="checkbox" name="langtype" value="PERL">PERL    
    <input type="submit" name="b1" value="送出">    
    </form>

這個 form 表單中,幾個 input type 的 name 都叫做 langtype,用getParameterValues("langtype"),得到字符串類型的數組。

二、通過控制器方法的形參獲取

在控制器方法的形參位置,設置和請求參數同名的形參。

當瀏覽器發送請求,匹配到請求映射時,在 DispatcherServlet 中就會將請求參數賦值給相應的形參。

@RequestMapping("/testParam")
    public String testParam(String username, String password){
        System.out.println("username:" + username + ",password:" + password);
        return "success";
    }

在頁面中發起請求:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>測試請求參數</title>
</head>
<body>
    <h1>測試請求參數</h1>
    <a th:href="@{/testParam(username='admin',password=123456)}">測試獲取請求參數-->/testParam</a><br>
</body>
</html>

查看 idea 的控制器輸出日志,可以看到成功獲取到瞭形參對應位置的請參數。

處理多個同名的請求參數

使用 springmvc 也會遇到多個參數同名的請求,還是用一個表單來說明,裡面有一個復選框:

<form th:action="@{/testParam}" method="post">
        用戶名:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        愛好:<input type="checkbox" name="hobby" value="a">a
        <input type="checkbox" name="hobby" value="b">b
        <input type="checkbox" name="hobby" value="c">c<br>
        <input type="submit" value="提交">
    </form>

對應的在後端代碼裡,增加這個新參數 hobby :

@RequestMapping("/testParam")
    public String testParam(String username, String password, String hobby){
        System.out.println("username:" + username + ",password:" + password + "hobby:" + hobby);
        return "success";
    }

現在勾選上3個復選框,提交請求,看下 hobby的值是什麼。

可以看到,a,b,c是用逗號拼接在一起的。其實這種也可以用,隻不過不太方便。

這裡還可以使用另一種方法,在控制器方法的形參中設置字符串數組,這裡就是String[] hobby:

@RequestMapping("/testParam")
    public String testParam(String username, String password, String[] hobby){
        System.out.println("username:" + username + ",password:" + password + ",hobby:" + Arrays.toString(hobby));
        return "success";
    }

重新提交下請求,取到的參數就是數組瞭,這樣取裡面的單個值就方便瞭。

三、通過 @RequestParam 註解

在上面的控制器方法的形參獲取中,形參和請求的參數名需要一致才行,那如果不一致的情況怎麼處理,那就是使用 @RequestParam 註解。

@RequestParam 是將請求參數和控制器方法的形參創建映射關系。

修改下上面的 form 表單,把參數名從 username 改成 username:

<form th:action="@{/testParam}" method="post">
        用戶名:<input type="text" name="user_name"><br>
        密碼:<input type="password" name="password"><br>
        愛好:<input type="checkbox" name="hobby" value="a">a
        <input type="checkbox" name="hobby" value="b">b
        <input type="checkbox" name="hobby" value="c">c<br>
        <input type="submit" value="提交">
    </form>

這時候發送請求,控制器是中的形參 username 就拿不到值瞭。

修改後端代碼,加上 @RequestParam註解:

@RequestMapping("/testParam")
    public String testParam(@RequestParam("user_name") String username, String password, String[] hobby){
        System.out.println("username:" + username + ",password:" + password + ",hobby:" + Arrays.toString(hobby));
        return "success";
    }

重新部署執行請求,username 可以拿到值。

在 @RequestParam 註解中有三個屬性:

value:指定為形參賦值的請求參數的參數名

required:設置是否必須傳輸此請求參數,默認值為true。

若沒有傳輸該請求參數,且沒有設置 defaultValue 屬性,則頁面報錯400:Required String parameter 'xxx' is not present;

若設置為 false,則當前請求不是必須傳輸 value 所指定的請求參數,若沒有傳輸,則註解所標識的形參的值為 null。

defaultValue:不管 required 屬性值為 true 還是 false,當 value 所指定的請求參數沒有傳輸或傳輸的值為""時,則使用默認值為形參賦值。

四、@RequestHeader 註解

@RequestHeader是將請求頭信息和控制器方法的形參創建映射關系。

有著與@RequestParam一樣的三個屬性:value、required、defaultValue,用法也一樣。

比如,現在要接受 Header 裡的 Host 值,修改控制器代碼:

@RequestMapping("/testParam")
    public String testParam(@RequestParam("user_name") String username,
                                String password,
                                String[] hobby,
                            @RequestHeader("Host") String host){
        System.out.println("username:" + username +
                        ",password:" + password +
                        ",hobby:" + Arrays.toString(hobby) +
                        "host: " + host);
        return "success";

這裡使用@RequestHeader("Host") String host,將 Host 與 形參 host 綁定,成功獲取 Header 裡 Host 的值。

五、@CookieValue 註解

@CookieValue是將 cookie 數據和控制器方法的形參創建映射關系。

有著與@RequestParam一樣的三個屬性:value、required、defaultValue,用法也一樣。

我在另一個請求控制器裡使用 HttpSession,設置 session:

@GetMapping("/test3")
    public String testGetMapping(HttpServletRequest request) {
        HttpSession session =  request.getSession();
        return "success";
    }

當第一次訪問/test3的時候,響應報文裡就會返回 JSESSIONID,key 就是 JSESSIONID,value 就是後面的隨機序列。

當不關閉瀏覽器,繼續訪問這個頁面或者其他頁面時,JSESSIONID 就會出現在請求頭信息裡瞭,比如現在訪問/param:

ok,繼續修改後端控制器的代碼,使用@CookieValue來獲取 cookie:

@RequestMapping("/testParam")
    public String testParam(@RequestParam("user_name") String username,
                                String password,
                                String[] hobby,
                            @RequestHeader("Host") String host,
                            @CookieValue("JSESSIONID") String jsessionid){
        System.out.println("username:" + username +
                        ",password:" + password +
                        ",hobby:" + Arrays.toString(hobby) +
                        ",host: " + host +
                        ",JSESSIONID: " + jsessionid);
        return "success";
    }

重新部署,發送請求。

查看控制臺獲取成功。

六、通過 POJO 獲取請求參數

在具體開發的時候,可能需要實現某些功能,比如添加,涉及到的字段就非常的多,再像上面那樣添加就不現實瞭。

那麼,我們可以在控制器方法的形參位置設置一個實體類類型的形參,此時若瀏覽器傳輸的請求參數的參數名和實體類中的屬性名一致,那麼請求參數就會為此屬性賦值。

現在有個新的 form 表單:

<form th:action="@{/testpojo}" method="post">
    用戶名:<input type="text" name="username"><br>
    密碼:<input type="password" name="password"><br>
    性別:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>
    年齡:<input type="text" name="age"><br>
    郵箱:<input type="text" name="email"><br>
    <input type="submit">
</form>

接著新建個實體類 User:

public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;
... ...

後面 加上構造方法、get和set方法、toString方法。

不需要手寫,idea中右擊,再點擊 Generate,然後就可以選擇你要統一生成的代碼瞭。

繼續,再寫一個接收/testpojo請求的控制器:

@RequestMapping("/testpojo")
    public String testPOJO(User user){
        System.out.println(user);
        return "success";
    }

註意,這裡就直接使用瞭實體類對象 user 作為形參。

部署提交表單請求。

查看結果。

七、解決獲取請求參數的亂碼問題

在上面獲取 sex 值的時候出現瞭亂碼,因為字符編碼不一致。

可以使用 SpringMVC 提供的編碼過濾器CharacterEncodingFilter,但是必須在 web.xml中進行註冊才可以使用。

<!--配置 springMVC 的編碼過濾器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

重試看下效果。

不再亂碼瞭。

感謝《尚矽谷》的學習資源。

以上就是SpringMVC中請求參數的獲取方式的詳細內容,更多關於SpringMVC請求參數獲取的資料請關註WalkonNet其它相關文章!

推薦閱讀: