隨筆-179  評論-666  文章-29  trackbacks-0
          阿里云服務(wù)器優(yōu)惠券
          概述
              在低版本的Spring中,你必須通過JSTL或<spring:bind>將表單對象綁定到HTML表單頁面中,對于習(xí)慣了Struts表單標(biāo)簽的開發(fā)者來說,Spring MVC的這一表現(xiàn)確實(shí)讓人失望。不過這一情況已經(jīng)一去不復(fù)返了,從Spring 2.0開始,Spring MVC開始全面支持表單標(biāo)簽,通過Spring MVC表單標(biāo)簽,我們可以很容易地將控制器相關(guān)的表單對象綁定到HTML表單元素中。
          在上一篇文章《Spring MVC的表單控制器》中(http://tech.it168.com/j/2007-07-26/200707261434046.shtml)我們已經(jīng)使用到了部分的Spring MVC表單標(biāo)簽,在本文中我們將對Spring MVC表單標(biāo)簽進(jìn)行全面的介紹,讓我們首先從<form:form>標(biāo)簽開始吧。

          form標(biāo)簽
              和使用任何JSP擴(kuò)展標(biāo)簽一樣,在使用Spring表單標(biāo)簽之前,你必須在JSP頁面中添加一行引用Spring表單標(biāo)簽的聲明,如下所示:
          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> ①引入標(biāo)簽的聲明 <html> … ②聲明后,在頁面中就可以使用任意Spring表單標(biāo)簽了 </html>
              一般情況下,我們使用“form”作為Spring MVC表單標(biāo)簽的前綴,當(dāng)然只要愿意,你可以調(diào)整為其它的前綴名。在聲明好標(biāo)簽引用后,就可以在該JSP文件中使用所有Spring MVC的表單標(biāo)簽了。下面是一個(gè)使用<form:form>表單標(biāo)簽的示例,它將最終生成一個(gè)HTML的 form表單:  
          <form:form> 用戶名:<form:input path="userName" /> <br> 密 碼:<form:password path="password" /><br> Email:<form:input path="email" /><br> <input type="submit" value="注冊" name="testSubmit"/> <input type="reset" value="重置" /> </form:form>
               
                回憶一下我們在《Spring MVC的表單控制器》(http://tech.it168.com/j/2007-07-26/200707261434046.shtml)文章中介紹的用戶注冊表單控制器,用戶通過GET請求調(diào)用表單控制器時(shí),表單控制器生成一個(gè)新的表單對象,然后重定向到表單輸入頁面。正因?yàn)楸韱雾撁媸峭ㄟ^訪問表單控制器導(dǎo)向過來的,所以<form:form>標(biāo)簽本身無需做額外的設(shè)置就可以達(dá)到以下兩個(gè)目標(biāo):
              1) 它不需要象HTML的<form>標(biāo)簽或Struts的表單標(biāo)簽一樣通過action屬性指定表單提交的地址。假設(shè)和<form:form>標(biāo)簽對應(yīng)的控制器的URL是“/registerUser.html”,應(yīng)用部署目錄為“baobaotao”,則最后產(chǎn)生的HTML代碼自動包含表單提交地址:
          <form id="command" method="post" action="/baobaotao//registerUser.html">…</form>
              2) <form:form>標(biāo)簽內(nèi)部的組件標(biāo)簽(如<form:input>、<form:password>等)可以直接和表單控制器所對應(yīng)的表單對象進(jìn)行值綁定。

              默認(rèn)情況下,表單控制器將表單對象以“command”為名放到PageContext中,你可以通過表單控制器commandName屬性的設(shè)置使用其它的名字(假設(shè)設(shè)置為“user”),這時(shí)你必須通過<form:form commandName="user">顯式指定綁定的表單對象名稱。

              除了commandName屬性外,Spring表單標(biāo)簽擁有豐富的可設(shè)置屬性,這些屬性大都是HTML表單標(biāo)簽屬性的鏡像,如onclick、ondblclick、tabindex等等。需要注意的一點(diǎn)是這些屬性都是小寫的,而對應(yīng)的HTML標(biāo)簽的屬性則沒有這個(gè)限制。但是有幾個(gè)和HTML標(biāo)簽有區(qū)別的屬性,我們通過表 1進(jìn)行說明:
              表 1 表單元素標(biāo)簽特殊屬性
          目錄
          說明
          cssClass
          使用該屬性指定表單元素CSS樣式名,相當(dāng)于HTML元素的class屬性。示例:<form:input path="userName" cssClass="inputStyle"/>。
          cssStyle
          直接通過該屬性指定樣式,相當(dāng)于HTML元素的style屬性。示例:
          <form:input path="userName" cssStyle="width:100px"/>。
          cssErrorClass
          cssClass表示表單元素未發(fā)生錯(cuò)誤時(shí)對應(yīng)的樣式,而cssErrorClass表示表單元素發(fā)生錯(cuò)誤時(shí)對應(yīng)的樣式,示例:
          輸入組件標(biāo)簽
              表單中有一些用于接受輸入值的組件,如單行文本框、多行文本框以及密碼框,Spring為它們提供了對應(yīng)的表單標(biāo)簽,請看下面的例子:
          代碼清單 1 使用輸入組件標(biāo)簽的表單
          <form:form> 用戶名:<form:input path="userName" /> <br> ①單行文件框標(biāo)簽 密 碼:<form:password path="password" /><br> ②密碼框標(biāo)簽 描 述:<form:textarea path="desc" cols="20" rows="3"/><br> ③多行文件框標(biāo)簽 <form:hidden path="times"/> ④隱藏組件的值 <input type="submit" value="注冊" name="testSubmit"/> <input type="reset" value="重置" /> </form:form>

              正如你看到的,所有表單組件標(biāo)簽都通過path屬性綁定表單對象的屬性值,它支持級聯(lián)屬性,比如path="user.userName"將調(diào)用表單對象getUser.getUserName()綁定表單對象的屬性值。這些表單組件標(biāo)簽擁有大多數(shù)HTML組件標(biāo)簽的鏡像屬性,如③處的<form:textarea>就使用了cols和rows屬性設(shè)定列數(shù)和行數(shù)。

          以上使用表單標(biāo)簽的頁面的對應(yīng)HTML頁面如下所示:

          <form id="command" method="post" action="/baobaotao//registerUser.html"> 用戶名:<input id="userName" name="userName" type="text" value=""/><br> 密 碼: <input id="password" name="password" type="password" value=""/><br> 描 述:<textarea id="desc" name="desc" rows="3" cols="20"></textarea><br> <input id="times" name="times" type="hidden" value="0"/> <input type="submit" value="注冊" name="testSubmit"/> <input type="reset" value="重置" /> </form>

          單選框和復(fù)選框組件標(biāo)簽
              單選框和復(fù)選框組件雖然在HTML中都對應(yīng)<input>元素標(biāo)簽,但在Spring MVC表單標(biāo)簽中,它們分別對應(yīng)兩個(gè)更達(dá)意的標(biāo)簽:    

          <form:radiobutton><form:checkbox>。 radiobutton 單選框組件由兩個(gè)同名的標(biāo)簽組件組成,當(dāng)表單對象對應(yīng)屬性值和value值相等時(shí),單選框選中。下面是一個(gè)代表性別的單選框: <form:form> 性 別:<form:radiobutton path="sex" value="0"/><form:radiobutton path="sex" value="1"/></form:form> 當(dāng)表單對象的sex屬性為0時(shí)(可以是String、int等可以自動轉(zhuǎn)換為String的類型),所生成的HTML代碼如下所示: <form id="command" method="post" action="/baobaotao//registerUser.html"> 性 別:<input id="sex1" name="sex" type="radio" value="0" checked="checked"/><input id="sex2" name="sex" type="radio" value="1"/></form>
          checkbox
              復(fù)選框組件標(biāo)簽相對來說復(fù)雜一些,復(fù)選框組件對應(yīng)的表單屬性不但可以boolean類型,還可以是String[]、Collection,Enum等類型。針對不同屬性類型,復(fù)選框的選中狀態(tài)的判斷條件是不一樣的:
          ? boolean類型:當(dāng)對應(yīng)屬性為true時(shí),該復(fù)選框選中(一個(gè)屬性僅對應(yīng)一個(gè)復(fù)選框);
          ? String[]、Collection或Enum類型:復(fù)選框?qū)?yīng)值出現(xiàn)在對應(yīng)屬性列表中,該復(fù)選框選中;
          ? 其它類型:當(dāng)復(fù)選框?qū)?yīng)的值可以轉(zhuǎn)換為對應(yīng)屬性值,該復(fù)選框選中。
          假設(shè)用戶注冊的User表單對象包含了一個(gè)List類型的favorites屬性:
          import java.util.List;
          public class User {
          private List favorites;
          public List getFavorites() {
          return favorites;
          }
          public void setFavorites(List favorites) {
          this.favorites = favorites;
          }
          }
          我們希望將其在頁面中使用一個(gè)復(fù)選框組件綁定這個(gè)屬性,則可以使用以下的代碼:
          代碼清單 2 復(fù)選框標(biāo)簽的使用
          <form:form>
          興趣愛好:
          <form:checkbox path="favorites" value="1"/>computer
          <form:checkbox path="favorites" value="2"/>sport
          <form:checkbox path="favorites" value="3"/>entertainment
          <form:checkbox path="favorites" value="4"/>literature
          </form:form>
          除了正常的path屬性名外,還必須提供一個(gè)value屬性,假設(shè)User表單對象的favorites屬性包括了1和3的值,那么產(chǎn)生的HTML頁面為:
          <form id="command" method="post" action="/baobaotao//registerUser.html">
          興趣愛好:<input id="favorites1" name="favorites" type="checkbox" value="1" checked="checked"/>
          <input type="hidden" value="1" name="_favorites"/>computer
          <input id="favorites2" name="favorites" type="checkbox" value="2" />
          <input type="hidden" value="1" name="_favorites"/>sport
          <input id="favorites3" name="favorites" type="checkbox" value="3" checked="checked"/>
          <input type="hidden" value="1" name="_favorites"/>entertainment
          <input id="favorites4" name="favorites" type="checkbox" value="4"/>
          <input type="hidden" value="1" name="_favorites"/>literature
          </form>
          大家可能已經(jīng)注意到每個(gè)復(fù)選框組件的后臺都跟著一個(gè)隱藏組件,這是因?yàn)楫?dāng)HTML頁面中的復(fù)選框沒有被選中時(shí),這個(gè)復(fù)選框的值不會在表單提交時(shí)作為HTTP請求參數(shù)發(fā)送到服務(wù)器端,這給Spring的表單數(shù)據(jù)綁定造成了麻煩——因?yàn)闊o法觸發(fā)setFavorites()方法的調(diào)用(如果原來已經(jīng)有值,這個(gè)值不會被設(shè)置為空)。解決方法就是在每個(gè)復(fù)選框后面加一個(gè)隱藏組件,并且將對應(yīng)的復(fù)選框名字前添加一個(gè)下劃線("_")作為隱藏組件的名字。這樣一來,你相當(dāng)于告訴Spring“這個(gè)表單中存在這樣一個(gè)復(fù)選框,我希望表單對象中對應(yīng)的屬性和這個(gè)checkbox的狀態(tài)保持一致”。
          假設(shè)復(fù)選框?qū)?yīng)的選項(xiàng)在數(shù)據(jù)庫或配置文件中定義,那么頁面復(fù)選框標(biāo)簽就不能通過硬編碼的方式指定,相反必須根據(jù)配置的選項(xiàng)數(shù)據(jù)動態(tài)產(chǎn)生。對于這樣的需求,代碼清單 2的編寫方式顯然不能滿足需求。回憶一下表單控制器的工作流程,我們知道可以通過復(fù)寫referenceData()方法在表單顯示前準(zhǔn)備一些需要的數(shù)據(jù),現(xiàn)在終于派上用場了,來看一下具體的實(shí)現(xiàn):

          代碼清單 3 UserRegisterController:準(zhǔn)備表單顯示數(shù)據(jù)
          package com.baobaotao.web.user; … import org.springframework.ui.ModelMap; public class UserRegisterController extends SimpleFormController { private BbtForum bbtForum; ①創(chuàng)建初始表單對象 protected Object formBackingObject(HttpServletRequest request) throws Exception { int userId = ServletRequestUtils.getIntParameter(request, "userId",-1); User user = bbtForum.getUser(userId); user.setUserName("tom"); List favorites = new ArrayList();①-1默認(rèn)選中值為1和3的選項(xiàng) favorites.add("1"); favorites.add("3"); user.setFavorites(favorites); return user; } @Override ②準(zhǔn)備表單顯示時(shí)需要的數(shù)據(jù) protected Map referenceData(HttpServletRequest request) throws Exception { Map favoriteMap = new LinkedHashMap(); favoriteMap.put("1", "computer"); favoriteMap.put("2", "sport"); favoriteMap.put("3", "entertainment"); favoriteMap.put("4", "literature"); ②-1將表單頁面需要的對象以ModelMap返回,最終將以屬性名值對方式出現(xiàn)在請求屬性中 return new ModelMap().addObject("favoriteMap", favoriteMap); } @Override protected ModelAndView onSubmit(Object command, BindException errors) throws Exception { User user = (User) command; bbtForum.registerUser(user); return new ModelAndView(getSuccessView(), "user", user); } }

             

          阿里云服務(wù)器優(yōu)惠券
          posted on 2009-06-26 11:01 Alpha 閱讀(23981) 評論(4)  編輯  收藏 所屬分類: Spring

          評論:
          # re: 使用Spring MVC表單標(biāo)簽 2013-08-20 11:57 | tt
          # re: 使用Spring MVC表單標(biāo)簽 2013-08-20 11:58 | tt
          # re: 使用Spring MVC表單標(biāo)簽 2014-05-16 21:30 | zuidaima
          # re: 使用Spring MVC表單標(biāo)簽 2016-05-18 20:24 | 低調(diào)
          水電費(fèi)  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 龙里县| 河北区| 天长市| 五大连池市| 界首市| 肥东县| 温泉县| 赤城县| 淳化县| 龙南县| 长沙市| 乌兰察布市| 连州市| 兴安县| 延安市| 平陆县| 晋城| 隆尧县| 大冶市| 开平市| 阳东县| 永兴县| 云安县| 南昌市| 体育| 锦州市| 汉中市| 荆州市| 根河市| 藁城市| 綦江县| 喀喇沁旗| 镇赉县| 天等县| 石林| 双峰县| 白河县| 厦门市| 普宁市| 司法| 平陆县|