你想要在表單中創建對應于一個Bean中的索引屬性的一套輸入字段。
在Struts html標簽庫的標簽中使用indexed屬性來產生屬性值:
如第3.3時所示,訪問索引值以供顯示是很容易的。但是,在表單中使用索引屬性則有些麻煩。如果所產生的輸入字段的名稱沒有正確的格式化,在HTML表單被提交后, Apache Struts Web Framework 便不能正確的裝配ActionForm。Struts 要使用Jakarta Commons BeanUtils 包來從HTTP請求中的值組裝ActionForm。特別地,BeanUtils.populate( )方法是從表單提交時從HTTP請求數據發送的數據中裝載ActionForm的。
對于索引值,BeanUtils.populate( )使用請求參數來決定適當的setter 方法以調用ActionForm。表3-3 列出了不同的表單輸入字段是如何處理的。表中列出了HTML 標簽,對應的HTTP 請求響應對,以及在請求被處理時在ActionForm之上調用的方法。
HTML form 輸入標記
產生的請求對
導致的方法調用
<input type="text" name="bar">
bar=someValue
Form.setBar("someValue")
<input type="text" name="sna.fug">
sna.fug=blah
Form.getSna( ).setFug("blah");
<input type="text" name="baz[0]">
baz[0]=someValue
Form.setBaz(0,"firstVal");
<input type="text" name="glub[1].waf">
glub[1].waf=halb
Form.getGlub(1).setWaf("halb");
<input type="text" name="dog.leg[2]">
dog.leg[2]=lame
Form.getDog( ).setLeg(2, "lame");
考慮一個允許用戶輸入最喜愛列表,比如顏色和網站,的表單。持有這些數據的ActionForm包含一個表示用戶名稱的String屬性,表示用戶喜好顏色的String數組,以及一個表示用戶喜好網站的WebLink對象的List。WebLink類如Example 3-5所示,它定義了一個簡單的JavaBean,具有表示站點名稱和URL的屬性。
form bean, FavoritesForm, 則包含了用戶名稱,喜愛顏色,以及喜好網站。如Example 3-6所示:
現在你可以創建一個JSP 頁面 (favorites.jsp) ,通過它用戶可以輸入表單中的相應數據,其代碼如Example 3-7所示.
因為Example 3-7 中的索引值是硬編碼,不是動態的,html:text標簽的property值便很容易構造,所以產生的HTML 標簽便具有適當的name屬性值。然而,假設你想要使用logic:iterate標簽來產生重復的輸入字段。比如,為了對color屬性這樣做,你可能想要嘗試以下的JSP 代碼:
但是這段代碼不會產生需要的HTML 標記。indexed屬性對為特定的Struts html標簽(這里是html:text)的name屬性所指定的值應用一個索引(即, [n]) 。如果你使用上面的片斷部署了一個JSP ,所產生的HTML可能是下面的樣子:
索引并沒有應用到屬性的值。相反,卻被應用到了Form Bean的內部internal Apache Struts Web Framework 名稱。另外,value包含了對數組調用toString( )方法的結果,而不是數組中特定的元素。.
說到底,意思就是當你需要設置一個本身是復雜對象,比如一個JavaBean 的索引屬性的嵌套的簡單屬性時,indexed屬性時很有用的。你可以在logic:iterate標簽中為一個非嵌套屬性產生輸入字段,但是你卻必須借助scriptlet 來產生數組索引:
假設你想要使用logic:iterate標簽來為喜好鏈接(WebLink對象)產生輸入字段。這種情況下,indexed的行為則正如你愿:
在html標簽中使用indexed屬性多少有點使人混淆。混淆之處主要來自于name屬性的不同意義。大多數情況下,在使用html標簽時,name都可以忽略因為值將基于action mapping 中聲明的form-bean。然而,在使用indexed屬性時,name卻引用到對應的ActionForm的嵌套的索引屬性。
我們回去看color屬性的問題,你可以選擇使用scriptlet之外的方式。可以使用Struts html-el標簽或者JSTL。它們都可以做一些和scriptlet相同的基本事情,但是它們是通過EL 表達式來進行的。最簡潔的方法是使用html-el標簽:
如你喜歡JSTL,你也可以直接產生需要的輸入標簽而不是使用Struts html標簽:
這個JSTL 版本幾乎和原來使用scriptlet的版本一樣丑陋。另外,因為Struts html:text和html-el:text標簽都沒使用, HTML input標簽的value屬性必須是顯式編碼的。如果你使用Struts html:text標簽,這個值就是自動設置的。
第3.3式討論了在表單之外顯示索引屬性所用的技術。
第3.5式討論如何在JSTL c:forEach循環中使用索引屬性。
Jakarta Commons項目的BeanUtils包定義了索引屬性如何解析。相關信息可訪問:http://jakarta.apache.org/commons/beanutils/api/org/apache/commons/beanutils/package-summary.html#package_description.
posted on 2005-05-31 13:46 鐵手 閱讀(1865) 評論(1) 編輯 收藏 所屬分類: Java 、Struts系列