1. 程式人生 > 實用技巧 >04-SpringMVC之請求引數繫結

04-SpringMVC之請求引數繫結

請求引數繫結

1、繫結說明

一、繫結機制

  1. 表單提交的資料都是key=value格式的(username=root&password=root)
  2. SpringMVC的引數繫結過程就是把表單提交的請求引數,作為控制器中方法的引數進行繫結的
  3. 要求:提交表單的name屬性和引數的名稱最好相同

二、 支援的資料型別

  1. 基本的資料型別和字串型別
  2. 實體類型別(JavaBean)
  3. 集合資料型別(List、map集合等)

2、基本資料型別和字串型別

  1. 提交表單的name屬性和引數的名稱相同
  2. 區分大小寫
JSP:
<form class="form" action="${pageContext.request.contextPath}/user/login" method="post">
    <input name="username" type="text" placeholder="使用者名稱">
    <input name="password" type="password" placeholder="密碼">
    <input type="submit" value="登入"/>
</form>
Controller:
引數繫結方法一:
@RequestMapping("/user/login")
public String Login(String username,String password){
    System.out.println(username+password);
    return "success";
}
// 如果表單的name屬性與引數名稱不同
@RequestMapping("/user/login")
public String Login(String username,String password){
    System.out.println(username+password);
    return "success";
}

表單的name屬性和引數的名稱不同,使用@RequestParam註解

@RequestParam
作用:
	引數繫結,將Request中的引數(通過request.getParameter()獲取到的)繫結給一個變數
	注:如果我們使用普通的servlet時,我們使用(HttpServletRequest)request.getParameter(String)來獲取request引數(經常是form表單中的一些引數)
屬性:
	name/value:引數名字,request中的引數名(在form表單中就是name屬性);
	required:是否必須,預設是true,表示請求中一定要有相應的引數,否則將報404錯誤碼;
	defaultValue:預設值,如果沒有傳遞引數,則使用該值。
使用(將request.getParameter("uname")繫結給username,實際上就是將表單中name屬性為uname的值賦值給形參username):
controller:
public String findAll(@RequestParam(name="uname") String username){
    System.out.println(username);
    return "success";
}

3、實體類型別(JavaBean)

  1. 提交表單的name屬性和JavaBean中的屬性需要一致
  2. 如果一個JavaBean類中包含其它的應用類,那麼表單的name屬性需要編寫成:物件.屬性。如:adress.name
JSP:
<form class="form" action="${pageContext.request.contextPath}/user/login" method="post">
    <input name="username" type="text" placeholder="使用者名稱">
    <input name="password" type="password" placeholder="密碼">
    <input type="submit" value="登入"/>
</form>
引數繫結方法二(將資料封裝到JaveBean的類中,注意:form表單中的input標籤的name屬性需要和JavaBean的類的屬性相同):
public class User implements Serializable {
    private String username;
    private String password;
    ...set...
}
Controller:
@RequestMapping("/user/login")
public String Login(User user){
    System.out.println(user);
    return "success";
}
JSP:
<form class="form" action="${pageContext.request.contextPath}/car" method="post">
    <input name="carNum" type="text" placeholder="車牌號">
    <input name="user.username" type="text">
    <input name="user.password" type="password">
    <input type="submit" value="登入"/>
</form>
引數繫結方法三(如果一個實體類引用了另一個類做屬性):
實體類(實體類Car使用了另外一個實體類User),注意此處需要有set方法,因為此處是通過反射建立物件,之後再通過set方法進行值的注入:
public class Car implements Serializable {
    private int carNum;
    private User user;
    ...set...
}
Controller:
@RequestMapping("car")
public String save(Car car) {
    System.out.println(user);
    return "success";
}

4、給集合屬性的資料封裝

  1. JSP頁面便攜方式;list[0].屬性
JSP:
<form class="form" action="${pageContext.request.contextPath}/car" method="post">
    <input name="list[0].username" type="text">
    <input name="list[0].password" type="password">
    <input name="map['one'].username" type="text">
    <input name="map['one'].password" type="password">
    <input type="submit" value="登入"/>
</form>
引數繫結方法四(如果一個實體類使用了集合屬性):
實體類(實體類Car使用了List或者Map),注意此處需要有set方法,因為此處是通過反射建立物件,之後再通過set方法進行值的注入:
public class Car implements Serializable {
    private List<User> list;
    private Map<String,User> map;
    ...set...
}
Controller:
@RequestMapping("car")
public String save(Car car) {
    System.out.println(car);
    return "success";
}

5、請求引數中文亂碼的解決

在web.xml中配置Spring提供的過濾類

<!--解決中文亂碼的過濾器-->
<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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

6、在控制器中使用原生的ServletAPI物件(HttpServletRequest、HttpServletResponse)

使用方法同普通的Servlet
controller:
@RequestMapping("/user/findAll")
public String findAll(HttpServletRequest request, HttpServletResponse response){
    String username = request.getParameter("username");
    return null;
}