初見SpringMVC之資料繫結

weixin_33859844發表於2018-04-12
初見SpringMVC之資料繫結

資料繫結的內容非常通俗易懂,後臺受理網路請求的方法獲取http請求引數的過程就是資料繫結。Spring提供了多種資料繫結的方法:

  1. 繫結預設資料型別:

SpringMVC中常用的預設資料型別包括,HttpServletRequest,HttpServletResponse,HttpSession。下面通過一個例子介紹,如何通過預設資料型別繫結,獲取請求引數。

  • 匯入SpringMVC相關包,在web.xml中配置DsipatcherServlet

  • 編寫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()方法獲取。

  • 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>
  1. 繫結簡單資料型別

簡單資料型別是指java中的基本資料型別以及String型別,假如提交的引數僅僅只是一個id,可以採用繫結簡答資料型別的方法,而不用通過繫結request後再獲取id資料。在DataBinding類中新增如方法:

  • 在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欄位。

6255308-0ce23ba51671afc6
圖2.1 繫結簡答資料型別

從測試結果中可以發現,方法中id引數可以位元組獲取http請求中攜帶的id欄位,同時還可以繫結HttpServletRequest的方法獲取請求引數。這裡需要特別注意的是,http請求中的欄位名稱必須和方法中引數名稱保持一致。假如不一致是不能繫結引數的。

  1. 繫結POJO資料型別

  當http請求攜帶的引數很多的時候,採用繫結簡單資料型別的方法就需要設定過多的方法形參,此時可以利用一個POJO物件充當方法形參,獲取http請求中的引數。下面通過一個驗證使用者登入的例子來介紹繫結POJO資料型別的方式。
  使用者登入時候需要提交使用者名稱(userName)和密碼(password)給伺服器去驗證,此時如果採用繫結簡單資料型別的方法時,需要兩個形參來完成資料繫結。此時就可以採用繫結POJO型別的方法獲取請求引數

  • 在伺服器一端建立一個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;
    }
}
  • 在Handler中新增接收請求的方法:
 @RequestMapping("/POJODataBinding")
    publicString POJODataBinding(User user){
       System.out.println("username="+user.getUserName());
       System.out.println("password="+user.getPassword());
       return"success";
    }
  • 在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>
  • 在Springmvc-config.xml檔案中新增一行配置:
<!--dispatcherServelet不攔截靜態資源-->
    <mvc:default-servlet-handler/>
6255308-d2ab5f6e2dd9420a
圖3.2 伺服器控制檯輸出結果
  1. 自定義資料繫結

  自定義資料繫結,是一種比較冷門的資料繫結方法,假設存在這樣一種情景:請求攜帶的引數型別為A,後臺接收方法的形參型別為B,比如http請求攜帶的引數是日期字串”2017-11-20 4:15:30”,而後臺接收方法的形參型別是Date,在這樣一種引數不匹配的情況下,就需要用到自定義資料繫結。
  完成自定義資料繫結,最主要的工作就是設計一個型別轉化器,通過日期轉換的例子介紹自定義資料繫結。

  • 構建一個資料型別轉換器,建立一個名為DateConverter的類,繼承Converter介面。
    第一個泛型引數代表待轉換型別,第二個泛型引數代表目標轉換型別,所有的轉換工作均只在convert方法中完成。
public class DateConverter implements Converter<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);
       }
    }
}
  • 在Spring-config.xml檔案中配置型別轉換器
<pre name="code" class="html" style="box-sizing: border-box; margin: 0px 0px 24px; padding: 0px 16px; overflow-x: auto; background-color: rgb(240, 240, 240); font-family: Consolas, Inconsolata, Courier, monospace; font-size: 12px; line-height: 20px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><?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></pre>
  • 在Handler中新增處理網路請求的方法
 @RequestMapping(value="/ConverterDateBinding")
    publicString ConverterDateBinding(Date date){
       System.out.println(date.toString());
       return"success";
    }
  1. 繫結陣列型別
      假如前端傳送的Http請求攜帶了同名的多個引數時,就會用到繫結陣列型別的情況,比如前端使用核取方塊來完成選定操作的情景。
  • 在Handler中新增處理網路請求的方法
 @RequestMapping(value="/arrayDateBinding")
    publicString  arrayDateBinding(String[] users){
       for(int i=0;i<users.length;i++){
           System.out.println("刪除user="+users[i]);
       }
       return"success";
   }
  • 在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>
  • 測試
6255308-702717a862096bde
圖 5.1 核取方塊選擇情況

點選提交按鈕看,觀察伺服器控制檯輸出

6255308-33aade0c11f7bb30
圖5.2伺服器控制檯輸出情況

Reference:
[1] Java企業級應用開發教程 2017.黑馬程式設計師編著
[2] csdn部落格原文

相關文章