Strut ActionForm 結合map 實現批量更新

我們知道Struts的ActionForm一直被大家視爲缺陷,覺得多餘,但我個人認爲ActionForm還是有它存在的理由。我們建立ActionForm通常和Web頁面的Form元素綁定,用於數據的收集和校驗等。ActionForm的屬性必須聲明,然後才能用於和Web頁面中,我們經常遇到一些屬性不需要全部聲明,如查詢條件等,而且ActionForm的屬性太多時管理也是個問題,再另一些情況下,如採購單,使用master/detail方式,ActionForm的創建變的困難,好多屬性均不確定,如採購明細爲對條記錄,這樣處理比較麻煩,在這篇文章中,我們將向你講述如何使用Struts的MapForm機制實現這樣的功能。  
  我們希望ActionForm能夠接收Map數據,這樣我們的管理就變的容易多啦,在Struts   1.1以後版本這樣的處理變得非常簡單,我們在ActionForm中聲明一個Map變量。  
   
   
  public   class   MapForm   extends   ActionForm  
  {  
  private   Map   map   =   null;  
  public   void   setMap(Map   map)   {  
  this.map   =   map;  
  }  
  public   Map   getMap()   {  
  return   this.map;  
  }  
  同時增加一個屬性方法去設置和獲取Map中的數據。  
  public   void   setAttribute(String   attributeKey,   Object   attributeValue)  
  {  
  getMap().put(attributeKey,   attributeValue);  
  }  
  public   Object   getAttribute(String   attributeKey)  
  {  
  Object   keyValue   =   getMap().get(attributeKey);  
  return   keyValue;  
  }  
  這樣我們在jsp頁面中,我們就可以使用Struts的標籤接觸這些Map數據。  
  <html:text   property="attribute(key)"/>  
  這樣這些數據就可維護啦,這對查詢條件較多的情況非常適用,你無需在維護這些查詢信息在各個頁面的過渡,Struts幫您完成了一切。  
   
  下面我們就看一下如何用MapForm組織master/detail方式的數據,我們將以一個訂單做爲樣例。  
   
  1   首先建立一個Form對象,繼承MapForm,同時聲明主要的屬性,如訂單編碼、定購人等。  
  public   class   OrderForm   extends   MapForm  
  {  
  private   Integer   id;  
  private   String   orderMan;  
   
  2   我們擬定以Map方式保存採購項信息,同一採購項採用統一前綴,可選擇行編碼,如row123_   productCode,row123_   productId,row123_   amount等,這樣某一採購項信息將被輸入到Map中,不同的採購項的前綴不一樣,前綴由row+行編碼組成,同時編寫可獲取行編碼的函數,這樣可取得某一採購項的所有信息,參數rowPrefix爲某一字符串,如“row”、“item”等,不包含數字編碼信息,同時你可以編寫Comparator,進行排序。    
  public   Collection   getRowIdList(String   rowPrefix)  
  {  
  if   (map.isEmpty())   return   new   ArrayList();  
  Collection   allRowId   =   new   TreeSet(new   RowIdComparator(rowPrefix));  
  Iterator   allKey   =   map.keySet().iterator();  
  while   (allKey.hasNext())  
  {  
  String   key   =   (String)   allKey.next();  
  if   (key.indexOf(rowPrefix)   !=   -1)  
  {  
  key   =   key.substring(0,   key.indexOf('_'));  
  allRowId.add(key);  
  }  
  }  
  return   allRowId;  
  }  
   
  3   在jsp頁面中你可以通過jstl,就可以完成採購明細的顯示。  
  <c:forEach   var="rowId"   items="${OrderForm.getRowIdList('row')}">  
  <tr   align="center"   id="${rowId}"   οnclick="clickRow()">  
  <td   ><html:text   property="attribute(${rowId}_productCode)"   size="8"   οnkeydοwn="fillProductInfoWithKeyDown('${rowId}',this)"   /><html:hidden   property="attribute(${rowId}_productId)"/>   &nbsp;<a   href="javascript:selectproduct('${rowId}')">選擇</a></td>  
  <td   ><html:text   property="attribute(${rowId}_productQty)"   size="8"   />   </td>  
  <td   ><html:text   property="attribute(${rowId}_productPrice)"   size="8"   /></td>  
  <td   ><html:text   property="attribute(${rowId}_productName)"   readonly="true"   size="16"   /></td>  
  <td   ><html:text   property="attribute(${rowId}_productPackaging)"   readonly="true"   size="12"/></td>  
  <td   ><html:text   property="attribute(${rowId}_productUnit)"   size="6"   readonly="true"   /></td>  
  </tr>  
  </c:forEach>  
   
  4   這樣Struts幫你完成了所有的信息處理,你需要完成你的保存就可以啦。  
   
  提示:Map中的數據值默認都是String類型的,如果你想轉換成你想要的類型,可以在你的Form編寫一個工具方法,完成類型的轉換。  
  public   Map   getTypedMap()   {  
  Map   map   =   this.getMap();  
  String   keyString   =   (String)   map.get("key");  
  Integer   keyInteger   =   new   Integer(keyString);  
  map.put("key",keyInteger);  
  return   map;  
  }  
   
  總結:MapForm各個功能很少被開發人員使用,如果使用得當,功能非常強大。ActionForm個人認爲並非是個設計缺陷,結合BeanUtils等工具包,轉換和信息處理非常方便。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章