初見(jiàn)SpringMVC之?dāng)?shù)據(jù)綁定

初見(jiàn)SpringMVC之?dāng)?shù)據(jù)綁定

數(shù)據(jù)綁定的內(nèi)容非常通俗易懂温技,后臺(tái)受理網(wǎng)絡(luò)請(qǐng)求的方法獲取http請(qǐng)求參數(shù)的過(guò)程就是數(shù)據(jù)綁定。Spring提供了多種數(shù)據(jù)綁定的方法:

  1. 綁定默認(rèn)數(shù)據(jù)類型:

SpringMVC中常用的默認(rèn)數(shù)據(jù)類型包括入愧,HttpServletRequest贬堵,HttpServletResponse划纽,HttpSession拗窃。下面通過(guò)一個(gè)例子介紹瞎领,如何通過(guò)默認(rèn)數(shù)據(jù)類型綁定泌辫,獲取請(qǐng)求參數(shù)。

  • 導(dǎo)入SpringMVC相關(guān)包九默,在web.xml中配置DsipatcherServlet

  • 編寫Handler,處理具體的網(wǎng)絡(luò)請(qǐng)求震放,在此處是通過(guò)Controll注解標(biāo)識(shí)一個(gè)Handller,通過(guò)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”結(jié)尾的網(wǎng)絡(luò)請(qǐng)求的方法澜搅,通過(guò)默認(rèn)參數(shù)HttpServletRequest完成數(shù)據(jù)綁定伍俘,而http請(qǐng)求提交的參數(shù)均通過(guò) 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">
         <!--設(shè)置前綴 -->
         <propertyname="prefix" value="/WEB-INF/" />
         <!--設(shè)置后綴 -->
         <propertyname="suffix" value=".jsp" />
    </bean>
</beans>
  • 測(cè)試結(jié)果:
    在瀏覽器輸入如下網(wǎng)址 http://localhost:8080/HelloSpringMV/defaultDataBinding?id=1
    可以看見(jiàn)上述通過(guò)Get方式提交一個(gè)名為id的參數(shù)癌瘾,參數(shù)值為1觅丰。在控制臺(tái)可以看見(jiàn)如下輸出:
    圖1.1默認(rèn)參數(shù)的數(shù)據(jù)綁定
  1. 綁定簡(jiǎn)單數(shù)據(jù)類型

簡(jiǎn)單數(shù)據(jù)類型是指java中的基本數(shù)據(jù)類型以及String類型,假如提交的參數(shù)僅僅只是一個(gè)id妨退,可以采用綁定簡(jiǎn)答數(shù)據(jù)類型的方法妇萄,而不用通過(guò)綁定request后再獲取id數(shù)據(jù)。在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";
   }

在上述代碼中咬荷,新增了一個(gè)參數(shù)int id冠句。id直接可以獲取http請(qǐng)求中對(duì)應(yīng)的id字段。

圖2.1 綁定簡(jiǎn)答數(shù)據(jù)類型

從測(cè)試結(jié)果中可以發(fā)現(xiàn)懦底,方法中id參數(shù)可以字節(jié)獲取http請(qǐng)求中攜帶的id字段,同時(shí)還可以綁定HttpServletRequest的方法獲取請(qǐng)求參數(shù)罕扎。這里需要特別注意的是,http請(qǐng)求中的字段名稱必須和方法中參數(shù)名稱保持一致。假如不一致是不能綁定參數(shù)的怒见。

  1. 綁定POJO數(shù)據(jù)類型

??當(dāng)http請(qǐng)求攜帶的參數(shù)很多的時(shí)候搂抒,采用綁定簡(jiǎn)單數(shù)據(jù)類型的方法就需要設(shè)置過(guò)多的方法形參,此時(shí)可以利用一個(gè)POJO對(duì)象充當(dāng)方法形參臀蛛,獲取http請(qǐng)求中的參數(shù)亲桦。下面通過(guò)一個(gè)驗(yàn)證用戶登錄的例子來(lái)介紹綁定POJO數(shù)據(jù)類型的方式。
??用戶登錄時(shí)候需要提交用戶名(userName)和密碼(password)給服務(wù)器去驗(yàn)證浊仆,此時(shí)如果采用綁定簡(jiǎn)單數(shù)據(jù)類型的方法時(shí)客峭,需要兩個(gè)形參來(lái)完成數(shù)據(jù)綁定。此時(shí)就可以采用綁定POJO類型的方法獲取請(qǐng)求參數(shù)

  • 在服務(wù)器一端創(chuàng)建一個(gè)POJO類
public class User {
    //POJO類的屬性名要和http請(qǐng)求的字段名保持一致
    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中添加接收請(qǐng)求的方法:
 @RequestMapping("/POJODataBinding")
    publicString POJODataBinding(User user){
       System.out.println("username="+user.getUserName());
       System.out.println("password="+user.getPassword());
       return"success";
    }
  • 在WebConten目錄下氧卧,創(chuàng)建一個(gè)user.html文件桃笙,顯示一個(gè)簡(jiǎn)單的登錄頁(yè)面
<!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不攔截靜態(tài)資源-->
    <mvc:default-servlet-handler/>
圖3.2 服務(wù)器控制臺(tái)輸出結(jié)果
  1. 自定義數(shù)據(jù)綁定

??自定義數(shù)據(jù)綁定搏明,是一種比較冷門的數(shù)據(jù)綁定方法鼠锈,假設(shè)存在這樣一種情景:請(qǐng)求攜帶的參數(shù)類型為A,后臺(tái)接收方法的形參類型為B星著,比如http請(qǐng)求攜帶的參數(shù)是日期字符串”2017-11-20 4:15:30”,而后臺(tái)接收方法的形參類型是Date,在這樣一種參數(shù)不匹配的情況下购笆,就需要用到自定義數(shù)據(jù)綁定。
??完成自定義數(shù)據(jù)綁定虚循,最主要的工作就是設(shè)計(jì)一個(gè)類型轉(zhuǎn)化器同欠,通過(guò)日期轉(zhuǎn)換的例子介紹自定義數(shù)據(jù)綁定。

  • 構(gòu)建一個(gè)數(shù)據(jù)類型轉(zhuǎn)換器横缔,創(chuàng)建一個(gè)名為DateConverter的類铺遂,繼承Converter接口。
    第一個(gè)泛型參數(shù)代表待轉(zhuǎn)換類型茎刚,第二個(gè)泛型參數(shù)代表目標(biāo)轉(zhuǎn)換類型襟锐,所有的轉(zhuǎn)換工作均只在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("無(wú)效日期格式,請(qǐng)使用如下格式:"+datePattern);
       }
    }
}
  • 在Spring-config.xml文件中配置類型轉(zhuǎn)換器
<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" /> 
    <!-- 配置注解驅(qū)動(dòng) -->
    <!-- <mvc:annotation-driven />-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    <!--dispatcherServelet不攔截靜態(tài)資源-->
    <mvc:default-servlet-handler/>
    <!-- 定義視圖解析器 -->
    <bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!--設(shè)置前綴 -->
         <propertyname="prefix" value="/WEB-INF/" />
         <!--設(shè)置后綴 -->
         <propertyname="suffix" value=".jsp" />
    </bean>
    <!-- 自定義類型轉(zhuǎn)換器配置 -->
    <bean id="conversionService"class=
     "org.springframework.context.support.ConversionServiceFactoryBean">
       <property name="converters">
           <set>
              <bean class="com.bupt.converter.DateConverter"/>
           </set>
       </property>
    </bean></pre>
  • 在Handler中添加處理網(wǎng)絡(luò)請(qǐng)求的方法
 @RequestMapping(value="/ConverterDateBinding")
    publicString ConverterDateBinding(Date date){
       System.out.println(date.toString());
       return"success";
    }
  1. 綁定數(shù)組類型
    ??假如前端發(fā)送的Http請(qǐng)求攜帶了同名的多個(gè)參數(shù)時(shí),就會(huì)用到綁定數(shù)組類型的情況初狰,比如前端使用復(fù)選框來(lái)完成選定操作的情景莫杈。
  • 在Handler中添加處理網(wǎng)絡(luò)請(qǐng)求的方法
 @RequestMapping(value="/arrayDateBinding")
    publicString  arrayDateBinding(String[] users){
       for(int i=0;i<users.length;i++){
           System.out.println("刪除user="+users[i]);
       }
       return"success";
   }
  • 在WebConten下創(chuàng)建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>
  • 測(cè)試
圖 5.1 復(fù)選框選擇情況

點(diǎn)擊提交按鈕看,觀察服務(wù)器控制臺(tái)輸出

圖5.2服務(wù)器控制臺(tái)輸出情況

Reference:
[1] Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā)教程 2017.黑馬程序員編著
[2] csdn博客原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奢入,一起剝皮案震驚了整個(gè)濱河市筝闹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俊马,老刑警劉巖丁存,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柴我,居然都是意外死亡解寝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門艘儒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)聋伦,“玉大人,你說(shuō)我怎么就攤上這事界睁【踉觯” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵翻斟,是天一觀的道長(zhǎng)逾礁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)访惜,這世上最難降的妖魔是什么嘹履? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任腻扇,我火速辦了婚禮,結(jié)果婚禮上砾嫉,老公的妹妹穿的比我還像新娘幼苛。我一直安慰自己,他們只是感情好焕刮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布舶沿。 她就那樣靜靜地躺著,像睡著了一般配并。 火紅的嫁衣襯著肌膚如雪括荡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天荐绝,我揣著相機(jī)與錄音一汽,去河邊找鬼。 笑死低滩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岩喷。 我是一名探鬼主播恕沫,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纱意!你這毒婦竟也來(lái)了婶溯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偷霉,失蹤者是張志新(化名)和其女友劉穎迄委,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體类少,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叙身,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硫狞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信轿。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖残吩,靈堂內(nèi)的尸體忽然破棺而出财忽,到底是詐尸還是另有隱情,我是刑警寧澤泣侮,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布即彪,位于F島的核電站,受9級(jí)特大地震影響活尊,放射性物質(zhì)發(fā)生泄漏隶校。R本人自食惡果不足惜琼蚯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠况。 院中可真熱鬧遭庶,春花似錦、人聲如沸稠屠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)权埠。三九已至榨了,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攘蔽,已是汗流浹背龙屉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留满俗,地道東北人转捕。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像唆垃,于是被迫代替她去往敵國(guó)和親五芝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344