04-SpringMVC之請求引數繫結
阿新 • • 發佈:2020-12-20
請求引數繫結
1、繫結說明
一、繫結機制
- 表單提交的資料都是key=value格式的(username=root&password=root)
- SpringMVC的引數繫結過程就是把表單提交的請求引數,作為控制器中方法的引數進行繫結的
- 要求:提交表單的name屬性和引數的名稱最好相同
二、 支援的資料型別
- 基本的資料型別和字串型別
- 實體類型別(JavaBean)
- 集合資料型別(List、map集合等)
2、基本資料型別和字串型別
- 提交表單的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>
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)
- 提交表單的name屬性和JavaBean中的屬性需要一致
- 如果一個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、給集合屬性的資料封裝
- 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;
}