Struts 1.x中批量封裝對象

來源:互聯網
上載者:User
文章目錄
  • 方法一、動態表單(Dynamic Actoin Form)+ 數組
  • 方法二、表單(Actoin Form)+ 列表(List)
應用情境

批量發布產品資訊。頁面輸出如所示:

圖1 發布產品

圖2 查看產品

具體實現

首先建立代表產品的類 Product.java,代碼如下:

package tipsAndTricks; import java.sql.Date; public class Product  {     private String name;     private double price;     private Date dateOfProduction;         public Date getDateOfProduction()  {         return dateOfProduction;    }          public void setDateOfProduction(Date dateOfProduction)  {         this .dateOfProduction = dateOfProduction;    }          public String getName()  {         return name;    }          public void setName(String name)  {         this .name = name;    }          public double getPrice()  {         return price;    }          public void setPrice( double price)  {         this .price = price;    }    } 

 

本例子中的dateOfProduction屬性使用了java.sql.Date,而不是java.util.Date。這是因為Struts 1.x不支援要求參數到java.util.Date的轉換,歸根到底是由於org.apache.commons.beanutils.ConvertUtilsBean.convert()不支援關於java.util.Date的轉換。另外,值得注意的是common-beanutils是通過java.sql.Date.valueOf()方法工作的,所以在頁面輸入的字串的格式必須為“yyyy-MM-dd”。

實現上述功能大概有三種方法,下面我會分別對兩種方法進行詳細的講述。

方法一、動態表單(Dynamic Actoin Form)+ 數組

首先,讓我們來看一下Struts的設定檔WEB-INF/struts-config.xml,內容如下:

<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" > < struts-config >     < data-sources />     < form-beans >         < form-bean name ="dynaProductsForm"             type ="org.apache.struts.action.DynaActionForm" >             < form-property name ="products"                 type ="tipsAndTricks.Product[]" size ="3" />         </ form-bean >     </ form-beans >     < global-exceptions />     < global-forwards />     < action-mappings >         < action attribute ="dynaProductsForm" input ="/addProducts.jsp"             name ="dynaProductsForm" path ="/batchWrappingWithArray"             scope ="request" type ="tipsAndTricks.BatchWrappingWithArrayAction"             validate ="false" >             < forward name ="success" path ="/viewProducts.jsp" />         </ action >     </ action-mappings >     < message-resources parameter ="tipsAndTricks.ApplicationResources" /> </ struts-config > 

我想這些配置應該用不著怎麼解釋了,有Struts 1.x驗證的朋友對此都不會陌生。因此,接下來建立/addProducts.jsp檔案,代碼如下:

<% @ page language = " java " pageEncoding = " utf-8 " %> <% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %> <% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > < html > < head > < title > Add Products </ title > </ head > < body > < html:form action ="/batchWrappingWithArray" method ="post" >     < table border ="0" >         < tr style ="background-color:powderblue; font-weight:bold;" >             < td > Product Name </ td >             < td > Price </ td >             < td > Date of production </ td >         </ tr >         < c:forEach var ="products" items ="${dynaProductsForm.map.products}" >             < tr >                 < td >< html:text indexed ="true" name ="products" property ="name" /></ td >                 < td >< html:text indexed ="true" name ="products" property ="price" /></ td >                 < td >< html:text indexed ="true" name ="products" property ="dateOfProduction" /></ td >             </ tr >         </ c:forEach >         < tr >             < td colspan ="3" >< html:submit /></ td >         </ tr >     </ table > </ html:form > </ body > </ html > 

例中,我使用了JSTL 1.1,如果大家還沒有嘗試過使用JSP 2.0的JSTL和EL,建議大家去看看相關文章。上面的<c:forEach />的作用是到dynaProductsForm的map屬性中取出products數組,並對其進行遍曆,再依靠<html:text />標誌將products的元素的屬性以輸入框的形式輸出。<html:text />標誌的屬性indexed="true"則表示在輸出HTML時,將<input>的命名為類似products[0].name的名字。

然後,再建立/viewProducts.jsp頁面,內容如下:

<% @ page language = " java " pageEncoding = " utf-8 " %> <% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > < html > < head > < title > View Products </ title > </ head > < body > < table border ="0" >     < tr style ="background-color:powderblue; font-weight:bold;" >         < td > Product Name </ td >         < td > Price </ td >         < td > Date of production </ td >     </ tr >     < c:forEach var ="product" items ="${products}" >         < tr >             < td > ${product.name} </ td >             < td > ${product.price} </ td >             < td > ${product.dateOfProduction} </ td >         </ tr >     </ c:forEach > </ table > </ body > </ html > 

我想這份也不多作說明。不過大家可以通過上述代碼看出使用JSTL + EL的確比Struts 1.x的logic + bean要方便和簡潔。不僅如此,EL還支援一定的運算子和函數操作。

最後是建立Action檔案 BatchWrappingWithArrayAction.java,代碼如下:

package tipsAndTricks; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; public class BatchWrappingWithArrayAction extends Action  {     public ActionForward execute(ActionMapping mapping, ActionForm form,                  HttpServletRequest request, HttpServletResponse response)  {            DynaActionForm dynaProductsForm = (DynaActionForm) form;            request.setAttribute( " products " , dynaProductsForm.get( " products " ));         return mapping.findForward( " success " );    } } 

此Action將動態表單傳過來的products數組放到request中,轉到/viewProducts.jsp。發布運行應用程式,在瀏覽器的地址欄中輸入:http://localhost:8080/Struts1_Batch/addProducts.jsp。效果請參考1、圖2。

在/addProducts.jsp的“Date of production”必須以(yyyy-MM-dd)的形式正確填寫,且不可為空。
方法二、表單(Actoin Form)+ 列表(List)

方法一雖然簡單,但是有一個明顯的缺點——數組的長度已經固定,故我們不能在運行時通過程式設定對象數量。下面將要介紹的方法可以很好地解決這個問題。

首先,我們要建立類 AutoInitArrayList.java,代碼如下:

package tipsAndTricks; import java.util.ArrayList; public class AutoInitArrayList < T > extends ArrayList < T >  {     private static final long serialVersionUID = 1L ;          private Class < T > t = null ;         public AutoInitArrayList(Class < T > t)  {         this .t = t;    }         @Override     public T get( int index)  {         try  {             while (index >= size())  {                add(t.newInstance());            }          } catch (Exception e)  {            e.printStackTrace();        }          return super .get(index);    }    } 

AutoInitArrayList繼承ArrayList並重載get()方法,作用就是在Struts 1.x架構調用這個方法時,如果index超出列表大小,則會執行個體化新項放到列表中,避免出現(IndexOutOfBoundsException)異常。

接著,讓我們看Struts的配置,內容如下:

<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" > < struts-config >     < data-sources />     < form-beans >         < form-bean name ="dynaProductsForm"             type ="org.apache.struts.action.DynaActionForm" >             < form-property name ="products"                 type ="tipsAndTricks.Product[]" size ="3" />         </ form-bean >         < form-bean name ="normalProductsForm"             type ="tipsAndTricks.NormalProductsForm" />     </ form-beans >     < global-exceptions />     < global-forwards />     < action-mappings >         < action attribute ="dynaProductsForm" input ="/addProducts.jsp"             name ="dynaProductsForm" path ="/batchWrappingWithArray"             scope ="request" type ="tipsAndTricks.BatchWrappingWithArrayAction"             validate ="false" >             < forward name ="success" path ="/viewProducts.jsp" />         </ action >         < action attribute ="normalProductsForm" input ="/addProducts.jsp"             name ="normalProductsForm" path ="/batchWrappingNormal" scope ="request"             type ="tipsAndTricks.BatchWrappingNormalAction" validate ="false" >             < forward name ="success" path ="/viewProducts.jsp" />         </ action >     </ action-mappings >     < message-resources parameter ="tipsAndTricks.ApplicationResources" /> </ struts-config > 

然後,建立表單類 NormalProductsForm.java,代碼如下:

 package tipsAndTricks; import java.util.List; import org.apache.struts.action.ActionForm; public class NormalProductsForm extends ActionForm  {     private List products = new AutoInitArrayList < Product > (Product. class );     public List getProducts()  {         return products;    }        public void setProducts(List products)  {         this .products = products;    }    } 

接下來是Action類 BatchWrappingNormalAction.java,代碼如下:

  /**/ /*  * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */  package tipsAndTricks; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class BatchWrappingNormalAction extends Action  {     public ActionForward execute(ActionMapping mapping, ActionForm form,            HttpServletRequest request, HttpServletResponse response)  {        NormalProductsForm normalProductsForm = (NormalProductsForm) form;        request.setAttribute( " products " , normalProductsForm.getProducts());         return mapping.findForward( " success " );    } } 

基本上與方法一的Action一樣。下面,再看看新的輸入檔案/addProducts2.jsp,內容如下:

<% @ page language = " java " pageEncoding = " utf-8 " %> <% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %> <% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > < html > < head > < title > Add Products </ title > </ head > < body > < html:form action ="/batchWrappingNormal" method ="post" >     < table border ="0" >         < tr style ="background-color:powderblue; font-weight:bold;" >             < td > Product Name </ td >             < td > Price </ td >             < td > Date of production </ td >         </ tr >         < c:forEach begin ="0" end ="2" var ="i" >             < tr >                 < td >< input name ="products[${i}].name" /></ td >                                < td >< input name ="products[${i}].price" /></ td >                 < td >< input name ="products[${i}].dateOfProduction" /></ td >             </ tr >         </ c:forEach >         < tr >             < td colspan ="3" >< html:submit /></ td >         </ tr >     </ table > </ html:form > </ body > </ html > 

/addProducts2.jsp主要作用組裝<input>的元素名稱,Struts 1.x對名稱格式類似“xxx[9].xx”的請求,會進行封裝。發布運行應用程式,在瀏覽器的地址欄中輸入:http://localhost:8080/Struts1_Batch/addProducts2.jsp。效果請參考1、圖2。

總結

兩種方法各有優缺點,選擇原則是如果不需要動態設定元素個數,則使用方法一,否則請使用方法二。

文章來源:http://www.blogjava.net/max/archive/2006/12/08/86439.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.