Springmvc之接受請求參數
Springmvc之接受請求參數
準備工作
- 新建一個表單提交
- 請求地址:
http://localhost:8080/ProjectName/user/login.do
<form action="<%=request.getContextPath()%>/user/login.do" method="post"> username:<input type="text" name="username"> <br> password:<input type="text" name="password"> <br> age:<input type="text" name="age"> <input type="submit" value="提交"></form>
【不推薦】HttpServletRequest
- 直接使用
HttpServeletRequest
作為方法參數,spring
會自動為其注入 - 需要手動轉換參數的類型
@RequestMapping(value="/login.do") public String login(HttpServletRequest request,HttpServletResponse response){ String username=request.getParameter("username"); String password=request.getParameter("password"); int age=Integer.parseInt(request.getParameter("age")); //轉換類型 System.out.println(username+"--->"+password); return "success"; }
直接在方法中聲明對應的參數(name的屬性必須和方法參數一致)
- 表單中的
name
屬性要和方法中的參數一致 - 涉及到類型轉換,直接在方法中申明不同類型的參數即可
- 優點: 方便,並且可以使Springmvc自動處理數據類型
@RequestMapping(value = "/login.do") public String login(String username,String password,Integer age) { System.out.println(username + "--->" + password+"----->"+age); return "success"; }
【推薦】@RequestParam
- 使用該註解可以獲取請求參數,方法中的參數可以與表單中的
name
屬性不一致 - 使用
@RequestParam
這個獲取的值必須包含在請求參數中,否則報錯,除非設置required
屬性為false
/** * 使用@RequestParam獲取請求參數 * @RequestParam()中的value屬性為form表單中對應的name屬性 * 自動轉換數據類型,只需要定義方法參數為所需的數據類型即可,spring會為我們自動轉換 */ @RequestMapping(value = "/login.do") public String login(@RequestParam(value = "username") String name, @RequestParam("password") String pwd,@RequestParam("age") Integer age) { System.out.println(name + "--->" + pwd+"----->"+age); return "success"; }
屬性
value
指定請求中對應的屬性名稱,這個就像表單中定義的name屬性required
指定是否這個參數必須包含在請求地址中,默認是true
,即是如果不包含這個參數那麼就會報錯。defaultValue
指定默認的值,如果設置了required=false
,並且沒有設置這個值,那麼默認的是null
,但是也是可以使用這個屬性來設置參數默認的值。當然對於設置了int類型的參數,那麼並沒有指定其值,那麼將會報錯,因為int
類型沒有null
,只有Integer
類型的才有,因此需要設置成Integer
/* * 這裡的獲取請求參數中的username,age的值 * 其中username的這個註解默認的是required=true,因此這個是不可以沒有的 * age的這個註解設置了required=false,表示可以沒有這個參數,但是如果沒有這個參數,那麼默認的是null,但是int類型的沒有null,因此也會是報錯的,有兩種解決方式: * 1) 通過defalutValue設置其默認的值 * 2) 如果我們就想要設其為null,可以使用封裝類Integer類型即可 */ @RequestMapping(value = "/testRequestParams") public String testRequestParams(@RequestParam(value="username") String username,@RequestParam(value="age",required=false) int age) { System.out.println("username,age "+ username+" , "+age); return SUCCESS; }
【推薦】使用自定義數據類型(JavaBean)
- 如果傳過來的請求參數很多,那麼我們使用上面的方法獲取請求參數,需要申明很多的方法參數。但是我們可以將傳遞過來的請求參數封裝成一個
JavaBean
,那麼我們直接傳入一個JavaBean對象即可接收全部的請求參數。 - 聲明一個User類,其中必須為每一個屬性添加
set
方法,並且其中的變數名要和表單中的name
屬性一致
public class User { private String username; private String password; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } 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; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; }}
- 那麼我們此時的
UserController
中的login
方法如下:
@RequestMapping(value = "/login.do") public String login(User user) { System.out.println(user); return "success"; }
總結
- 以上的所有方法並不衝突,可以混合使用
/** * 混合使用案例 */ @RequestMapping(value = "/login.do") public String login(User user,@RequestParam("gender")String gender) { System.out.println(user); return "success"; }
- 不建議使用
HttpServletRequest
方法獲取,另外兩種方法都是非常好用的方法,根據實際情況進行選取即可
推薦閱讀: