用過Jakarta Struts的兄弟都知道ActionForm的使用方法和她在Struts架構中所起的作用,但是您是否在為要給ActionForm編寫一大堆setter和getter方法而感到厭倦和疲憊呢?的確,我是厭倦了,所以我要尋求新的方法。我第一反映就是想使用Map介面,將所有的表單參數全部放進HashMap中,然後在Action中get出這個Map,並進行商務邏輯的操作。有了想法當然要去實驗了,實踐才是檢驗真理的唯一標準。
首先要編寫一個擴充ActionForm的類。代碼如下(由於篇幅,我只列出了代碼的關鍵區段):
12 package com.jacktan.struts.formbean; 34 import java.util.*; 5 import javax.servlet.http.*; 6 import org.apache.struts.action.*; 8 public class CustomForm extends ActionForm { 10 private Map formvalueMap = new HashMap(); 12 public void setFormvalueMap(Map p_FormvalueMap){ 14 this.formvalueMap = p_FormvalueMap; 15 } 16 public Map getFormvalueMap(){ 18 return this.formvalueMap; 19 } 20 public void setFormvalue(String key,Object value){ 22 formvalueMap.put(key,value); 23 } 24 public Object getFormvalue(String key){ 26 return formvalueMap.get(key); 27 } 28 } |
下面對上面的代碼一一做解釋:
第11行定義了一個HashMap類的執行個體變數,這個Map用於存放表單遞交上來的參數值,作為索引值對存在;
第13行的setFormvalueMap()方法用於設定執行個體變數formvalueMap;
第17行的getFormvalueMap()方法用於擷取執行個體變數formvalueMap,這個方法將在Action類中調用,替代了以前在Action類中調用大量的(CustomForm)form.getXXX()方法;
第21行是關鍵的方法,setFormvalue()這個方法就是取代以前在ActionForm中大量的setXXX()方法,用於接受表單傳遞上來的輸入值。注意這個方法的參數,key是一個String類型的,用作Map的key,value是Object類型的,這個參數就是表示表單傳送過來的各個輸入值。
第25行是getFormvalue()方法,用於從Map中根據key返回一個value對象。
好了,ActionForm的任務完成了,不過離目標還有好大一段距離,目前只完成了三分之一的工作。我們繼續幹!
有了ActionForm接下來就是要編寫Action類了,代碼如下(由於篇幅,我只列出了代碼的關鍵區段):
12 package com.jacktan.struts.action; 34 import java.util.*; 5 import javax.servlet.http.*; 6 import org.apache.struts.action.*; 8 import com.jacktan.struts.formbean.CustomForm 10 public class CustomAction extends Action { 12 public ActionForward execute(ActionMapping p_Mapping, 15 ActionForm p_Form, 16 HttpServletRequest p_Request, 17 HttpServletResponse p_Response) 18 throws Exception{ 21 Map formvalues =((CustomForm)p_Form).getFormvalueMap(); 23 return p_Mapping.findForward("Success"); 25 } 26 } |
CustomAction類的關鍵行在第21-22行,使用在CustomForm類中定義的 getFormvalueMap()方法一次就將表單中所有的提交參數收集完畢,省掉了以前要使用很多getXXX()方法從ActionForm中擷取表單值的做法。
好了,接下來是要編寫JSP頁面了,因為我們的ActionForm使用特殊的方法接受參數值,所以在寫表單頁面的時候也要使用特殊的簽名。代碼如下:
<html:form action="login"> <table width="100%" border="0"> <tr> <td width="3%"> ;</td> <td width="31%"> ;</td> <td width="66%" rowspan="6" valign="top"> <html:errors/> </td> </tr> <tr> <td> ;</td> <td height="25">使用者名稱</td> </tr> <tr> <td> ;</td> <td height="25"> <html:text property="formvalue(username)" size="12" maxlength="12"/></td> </tr> <tr> <td> ;</td> <td height="25">密碼</td> </tr> <tr> <td> ;</td> <td height="25"> <html:password property="formvalue(password)" size="12" maxlength="12" redisplay="false"/> </td> </tr> <tr> <td> ;</td> <td height="25"> <html:submit value="登入"/> <html:button property="close" value="關閉" onclick="Close()"/> </td> </tr> </table>
|
上面是一個使用者登入的介面,注意紅色的部分,這個簽名要和CustomForm類中的setFormvalue()簽名保持一致,注意大小寫,Struts會利用Java的反射機制尋找到合適的方法調用。formvalue(username)圓括弧中的字串可以是表示該輸入欄位在資料庫中欄位的映射,也可以是自己自訂的字串,這個字串將作為Map的key儲存。
好了,終於要完成了,最後要做的就是設定struts的設定檔了,開啟struts-config.xml檔案,
在<form-beans>段輸入以下代碼:
<form-beans> <form-bean name="CustomForm" type="com.jacktan.struts.formbean.CustomForm"/> </form-beans> |
在<action-mappings>段輸入以下代碼:
<action path="/login" type="com.jacktan.struts.action.CustomAction" name="addDeviceForm" scope="request"> <forward name="login" path="main.jsp"/> </action> |
大功告成,所有的任務都完成了。為了檢測是否可以正確運行,我在Action類中加入如下測試代碼:
1 Set set = formvalues.entrySet(); 2 Iterator it = set.iterator(); 3 while( it.hasNext() ){ 4 Map.Entry me = (Map.Entry)it.next(); 5 System.out.println((String)me.getKey); 6 System.out.println((String)me.getvalue); 7 } |
以上代碼將在Tomcat的控制台中列印出所有表單提交的參數值,你也可以使用Struts中log4j組件在記錄檔中輸入。好了,就寫到這裡吧,以上就是使用Map將表單提交的資料一次性擷取,並在Action中調用的全部工作內容,希望對大家使用Struts做開發的兄弟有所提示和啟發。