初見SpringMVC之資料綁定
資料綁定的内容非常通俗易懂,背景受理網絡請求的方法擷取http請求參數的過程就是資料綁定。Spring提供了多種資料綁定的方法:
1.綁定預設資料類型:SpringMVC中常用的預設資料類型包括,HttpServletRequest,HttpServletResponse,HttpSession。下面通過一個例子介紹,如何通過預設資料類型綁定,擷取請求參數。
(1)導入SpringMVC相關包,在web.xml中配置DsipatcherServlet
(2)編寫Handler,處理具體的網絡請求,在此處是通過Controll注解辨別一個Handller,通過RequestMapping完成Handler和url之間的映射。
@Controller
public class DataBinding {
@RequestMapping(value="/defaultDataBinding")
public String defaultDataBinding(HttpServletRequest request){
Stringid = request.getParameter("id");
System.out.println("id="+id);
return "success";
}
}
defaultDataBinding是受理以”/DefaultDataBinging”結尾的網絡請求的方法,通過預設參數HttpServletRequest完成資料綁定,而http請求送出的參數均通過 request.getParameter()方法擷取。
(3)Spring-cofig.xml檔案配置
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 定義元件掃描器,指定需要掃描的包 -->
<context:component-scan base-package="com.bupt.controller"/>
<!-- 定義視圖解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--設定字首 -->
<propertyname="prefix" value="/WEB-INF/" />
<!--設定字尾 -->
<propertyname="suffix" value=".jsp" />
</bean>
</beans>
(4)測試結果:在浏覽器輸入如下網址http://localhost:8080/HelloSpringMV/defaultDataBinding?id=1
可以看見上述通過Get方式送出一個名為id的參數,參數值為1。
在控制台可以看見如下輸出:
圖1.1預設參數的資料綁定
2.綁定簡單資料類型
簡單資料類型是指java中的基本資料類型以及String類型,假如送出的參數僅僅隻是一個id,可以采用綁定簡答資料類型的方法,而不用通過綁定request後再擷取id資料。在DataBinding類中添加如方法:
(1)在Handler中添加方法
@RequestMapping(value="/SimpleDataBinding")
publicString simpleDataBinding(HttpServletRequestrequest,int id){
System.out.println("request中擷取id="+request.getParameter("id"));
System.out.println("id="+id);
return"success";
}
在上述代碼中,新增了一個參數int id。id直接可以擷取http請求中對應的id字段。
(2)測試,在浏覽器中輸入如下url:http://localhost:8080/HelloSpringMV/SimpleDataBinding?id=1
圖2.1 綁定簡答資料類型
從測試結果中可以發現,方法中id參數可以位元組擷取http請求中攜帶的id字段,同時還可以綁定HttpServletRequest的方法擷取請求參數。這裡需要特别注意的是,http請求中的字段名稱必須和方法中參數名稱保持一緻。假如不一緻是不能綁定參數的。
3.綁定POJO資料類型
當http請求攜帶的參數很多的時候,采用綁定簡單資料類型的方法就需要設定過多的方法形參,此時可以利用一個POJO對象充當方法形參,擷取http請求中的參數。下面通過一個驗證使用者登入的例子來介紹綁定POJO資料類型的方式。
使用者登入時候需要送出使用者名(userName)和密碼(password)給伺服器去驗證,此時如果采用綁定簡單資料類型的方法時,需要兩個形參來完成資料綁定。此時就可以采用綁定POJO類型的方法擷取請求參數
(1)在伺服器一端建立一個POJO類
public class User {
//POJO類的屬性名要和http請求的字段名保持一緻
publicString userName;
publicString password;
publicStringgetUserName() {
return userName;
}
publicvoid setUserName(String userName){
this.userName= userName;
}
publicString getPassword() {
returnpassword;
}
publicvoid setPassword(String password){
this.password= password;
}
}
(2)在Handler中添加接收請求的方法:
@RequestMapping("/POJODataBinding")
publicString POJODataBinding(User user){
System.out.println("username="+user.getUserName());
System.out.println("password="+user.getPassword());
return"success";
}
(3)在WebConten目錄下,建立一個user.html檔案,顯示一個簡單的登入頁面
<!DOCTYPEhtml>
<html>
<head>
<metacharset="UTF-8">
<title>helloSpringMVC</title>
</head>
<body>
<form action="http://localhost:8080/HelloSpringMV/POJODataBinding"
method="post">
使用者名<input type="text" name="userName"></input><br>
密碼<input type="password" name="password"></input><br>
<input type="submit"name="submit" value="登入"></input><br>
</form>
</body>
</html>
(4)在Springmvc-config.xml檔案中添加一行配置:
<!--dispatcherServelet不攔截靜态資源-->
<mvc:default-servlet-handler/>
(5)測試,在浏覽器中通路url:http://localhost:8080/HelloSpringMV/user.html
圖3.1 登入頁面
點選送出後,觀察伺服器控制台輸出:
圖3.2 伺服器控制台輸出結果
4.自定義資料綁定
自定義資料綁定,是一種比較冷門的資料綁定方法,假設存在這樣一種情景:
http請求攜帶的參數類型為A,背景接收方法的形參類型為B,比如http請求攜帶的參數是日期字元串”2017-11-20 4:15:30”,而背景接收方法的形參類型是Date,在這樣一種參數不比對的情況下,就需要用到自定義資料綁定。
完成自定義資料綁定,最主要的工作就是設計一個類型轉化器,通過日期轉換的例子介紹自定義資料綁定。
(1)建構一個資料類型轉換器,建立一個名為DateConverter的類,繼承Converter接口。第一個泛型參數代表待轉換類型,第二個泛型參數代表目标轉換類型,所有的轉換工作均隻在convert方法中完成。
public class DateConverter implementsConverter<String,Date>{
privateString datePattern="yyyy-mm-dd HH:mm:ss";
@Override
publicDate convert(String source) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
try{
return sdf.parse(source);
} catch(ParseException e) {
// TODO Auto-generated catch block
throw newIllegalArgumentException("無效日期格式,請使用如下格式:"+datePattern);
}
}
}
(2)在Spring-config.xml檔案中配置類型轉換器
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 定義元件掃描器,指定需要掃描的包 -->
<context:component-scan base-package="com.bupt.controller" />
<!-- 配置注解驅動 -->
<!-- <mvc:annotation-driven />-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--dispatcherServelet不攔截靜态資源-->
<mvc:default-servlet-handler/>
<!-- 定義視圖解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--設定字首 -->
<propertyname="prefix" value="/WEB-INF/" />
<!--設定字尾 -->
<propertyname="suffix" value=".jsp" />
</bean>
<!-- 自定義類型轉換器配置 -->
<bean id="conversionService"class=
"org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.bupt.converter.DateConverter"/>
</set>
</property>
</bean>
(3)在Handler中添加處理網絡請求的方法
@RequestMapping(value="/ConverterDateBinding")
publicString ConverterDateBinding(Date date){
System.out.println(date.toString());
return"success";
}
(4)測試,在浏覽器中輸入如下url http://localhost:8080/HelloSpringMV/ConverterDateBinding?date=2017-11-20%2017:13:02
服務端控制台輸出結果:
圖4.1服務端輸出結果
5.綁定數組類型
假如前端發送的Http請求攜帶了同名的多個參數時,就會用到綁定數組類型的情況,比如前端使用複選框來完成標明操作的情景。
(1)在Handler中添加處理網絡請求的方法
@RequestMapping(value="/arrayDateBinding")
publicString arrayDateBinding(String[] users){
for(int i=0;i<users.length;i++){
System.out.println("删除user="+users[i]);
}
return"success";
}
(2)在WebConten下建立array.html檔案
<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<title>Inserttitle here</title>
</head>
<body>
<form action="http://localhost:8080/HelloSpringMV/arrayDateBinding"
method="POST">
<table width="20%"border=1>
<tr>
<td>選擇</td>
<td>使用者名稱</td>
</tr>
<tr>
<td> <input type="checkbox"name="users" value="SmartTu"></input></td>
<td>SmartTu</td>
</tr>
<td> <input type="checkbox"name="users" value="SmartTu1"></input></td>
<td>SmartTu1</td>
</tr>
<td> <input type="checkbox"name="users" value="SmartTu2"></input></td>
<td>SmartTu2</td>
</tr>
</table>
<input type="submit" value="送出">
</form>
</body>
</html>
(3)測試
圖 5.1 複選框選擇情況
點選送出按鈕看,觀察伺服器控制台輸出
圖5.2伺服器控制台輸出情況