Java技術專區--Hilly

          http://blog.duyouyou.com
             :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理
          通常情況下,我們要在ActionForm中為相應表單定義對應的私有屬性,再通過Getter和Setter設置和獲得表單的數據。

          但如果表單數據域比較多,那么就需要在ActionForm中為每個表單域定義一個私有屬性并定義相應的Getter、Setter方法。

          解決方法有兩種,一種是在ActionForm中定義一個Map私有屬性,動態產生表單提交的數據域;另一種是使用DynaActionForm。

          這里,我想以一個例子介紹一下第一種方法。

          首先創建ActionForm類:TestForm
          ?1package?form;
          ?2
          ?3import?org.apache.struts.action.ActionForm;
          ?4import?java.util.HashMap;
          ?5
          ?6public?class?TestForm?extends?ActionForm?{
          ?7??private?HashMap<String,Object>?map?=?new?HashMap<String,Object>();
          ?8
          ?9??public?Object?getValue(String?key)?{
          10????return?map.get(key);
          11??}

          12
          13??public?void?setValue(String?key,Object?value)?{
          14????map.put(key,value);
          15??}

          16
          17}

          請注意第7行,這里定義了一個私有變量,該變量是一個Map類。
          第9、13行分別定義了Getter和Setter方法,這里,Getter方法需要一個參數,用于傳遞表單域(即動態屬性)的名稱,Setter方法需要兩個參數,分別是表單域名稱和對應的值,這和傳統的ActionForm的Getter和Setter有很大分別。

          然后創建Action類:TestAction

          ?1package?action;
          ?2
          ?3import?org.apache.struts.action.Action;
          ?4import?org.apache.struts.action.ActionMapping;
          ?5import?org.apache.struts.action.ActionForm;
          ?6import?org.apache.struts.action.ActionForward;
          ?7import?java.util.HashMap;
          ?8import?javax.servlet.http.*;
          ?9
          10public?class?TestAction?extends?Action?{
          11??public?ActionForward?execute(ActionMapping?mapping,ActionForm?form,HttpServletRequest?request,HttpServletResponse?response)?throws?Exception?{
          12????return?mapping.findForward("success");
          13??}

          14}

          第8行,鑒于這是一個例子為了簡便起見使用了“*”代替了具體的類,編寫程序時還是需要培養良好的習慣引入相應的類,避免出現沖突。
          這個類很簡單,只是把請求傳遞到一個在Struts中命名為“success”的forward對應的頁面,具體請看下面列出的struts-config.xml當中的配置。

          然后是輸入表單的JSP頁面:input.jsp

          1<%@?taglib?uri="/tags/struts-html"?prefix="html"?%>
          2
          3<html:form?action="/Test.do"?method="post">
          4???<html:text?property="value(a)"/>
          5???<html:text?property="value(b)"/>
          6???<html:submit>Submit</html:submit>
          7</html:form>


          第1行引入了Struts的html標簽庫
          請注意第4、5行,如果使用傳統的ActionForm,property的值應該與ActionForm里面的一個私有屬性的名稱對應,但在這里,請回憶上述ActionForm中的Getter和Setter方法,分別帶有一個參數和兩個參數,這里的property會通過反射機制自動調用Setter方法,“value(a)”中的“value”就是ActionForm中Map的名稱,而括號當中的“a”,就是我們動態產生的表單域的名稱,它對應Getter方法中的第一個參數“key”,而用戶在表單輸入的值就對應Setter方法中的第二個參數“value”。

          這里,我們分別動態創建了兩個名為“a”和“b”的表單域,存放到Map中。

          然后,我們看看success.jsp即Action轉發到的頁面

          1<%@?taglib?uri="/tags/struts-bean"?prefix="bean"?%>
          2
          3<bean:write?name="test"?property="value(a)"/>
          4<bean:write?name="test"?property="value(b)"/>


          第1行引入了Struts的bean標簽庫。
          請注意第2行,引用了名為“test”的ActionForm(詳細設置請看struts-config.xml)。這標簽的作用是顯示輸出ActionForm的指定屬性值。請注意property,“value”就是ActionForm中Map的名稱,它通過反射機制自動調用ActionForm的Getter方法,請回憶上述ActionForm中的Getter方法,帶有一個參數“key”,這里的“a”,“b”實際上是對應剛才輸入頁面動態產生的兩個表單域屬性名。這里實際是要顯示名為“test”的ActionForm的名為“value”的Map類屬性中的“key”分別為“a”和“b”的對應的“value”。

          通過這樣的設計,我們就完成了動態產生表單域屬性的功能,這個設計的好處是你并不需要修改ActionForm,就能隨意設計你的表單域屬性,也大大減少了ActionForm的編碼量。

          最后,讓我們來看看struts-config.xml中的相應配置(只列出相關配置片斷):

          ?

          ?1<struts-config>
          ?2??
          ?3??<form-beans>
          ?4????<form-bean?name="test"?type="form.TestForm"/>
          ?5??</form-beans>
          ?6??
          ?7??<action-mappings>
          ?8?????<action?name="test"?path="/Test"?type="action.TestAction">
          ?9????????<forward?name="success"?path="/pages/success.jsp"/>
          10??????</action>
          11???</action-mappings>
          12???
          13</struts-config>

          ?


          評論

          # re: [Struts]應用Map作為ActionForm的屬性,動態增加ActionForm的“屬性” (轉)  回復  更多評論   

          2007-06-29 15:08 by 蔫嘟
          Struts 很簡單也很靈活
          Hold住
          主站蜘蛛池模板: 建瓯市| 苏尼特左旗| 织金县| 中卫市| 武汉市| 苏尼特右旗| 高雄县| 中江县| 浑源县| 聊城市| 河曲县| 宁陵县| 仁布县| 霍州市| 章丘市| 毕节市| 开远市| 中阳县| 淳安县| 青冈县| 勃利县| 仙居县| 阿拉善盟| 沙河市| 长治县| 临夏县| 海原县| 佛冈县| 建瓯市| 武清区| 南充市| 五华县| 阿巴嘎旗| 黔西县| 博兴县| 洛川县| 尉氏县| 夏河县| 泰来县| 林州市| 灵山县|