標籤:

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方法獲取,另外兩種方法都是非常好用的方法,根據實際情況進行選取即可

推薦閱讀:

TAG:Spring | SpringMVC |