<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    在我早前的文章《轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師》(以下簡稱為《轉(zhuǎn)》)中,提及在Struts 1.x中實現(xiàn)批量封裝對象,并不是一件容易的事,這需要一些技巧。昨天,有一位同事又和我討論起這個問題,所以鑒于此場景(scenario)較為普遍,我決定寫一篇有關(guān)的文章。

    應(yīng)用場景

    本文使用《轉(zhuǎn)》中的最后一個例子作為應(yīng)用場景,即是批量發(fā)布產(chǎn)品信息。頁面輸出如下圖所示:

    圖1 發(fā)布產(chǎn)品
    圖1 發(fā)布產(chǎn)品

    圖2 查看產(chǎn)品
    圖2 查看產(chǎn)品

    具體實現(xiàn)

    首先創(chuàng)建代表產(chǎn)品的類tipsAndTricks.Product,代碼如下:

    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;
       }
       
    }

    與《轉(zhuǎn)》例中的Product不同的是,本例子中的dateOfProduction屬性使用了java.sql.Date,而不是java.util.Date。這是因為Struts 1.x不支持請求參數(shù)到j(luò)ava.util.Date的轉(zhuǎn)換,歸根到底是由于org.apache.commons.beanutils.ConvertUtilsBean.convert()不支持關(guān)于java.util.Date的轉(zhuǎn)換。另外,值得注意的是common-beanutils是通過java.sql.Date.valueOf()方法工作的,所以在頁面輸入的字符串的格式必須為“yyyy-MM-dd”。

    實現(xiàn)上述功能大概有三種方法,下面我會分別對這三種方法進(jìn)行詳細(xì)的講述。

    方法一、動態(tài)表單(Dynamic Actoin Form)+ 數(shù)組

    首先,讓我們來看一下Struts的配置文件WEB-INF/struts-config.xml,內(nèi)容如下:

    <? 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 >

    我想這些配置應(yīng)該用不著怎么解釋了,有Struts 1.x驗證的朋友對此都不會陌生。因此,接下來創(chuàng)建/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,建議大家去看看相關(guān)文章。上面的<c:forEach />的作用是到dynaProductsForm的map屬性中取出products數(shù)組,并對其進(jìn)行遍歷,再依靠<html:text />標(biāo)志將products的元素的屬性以輸入框的形式輸出。<html:text />標(biāo)志的屬性indexed="true"則表示在輸出HTML時,將<input>的命名為類似products[0].name的名字。

    然后,再創(chuàng)建/viewProducts.jsp頁面,內(nèi)容如下:

    <% @ 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還支持一定的運算符和函數(shù)操作。

    最后是建立Action文件tipsAndTricks.BatchWrappingWithArrayAction,代碼如下:

    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將動態(tài)表單傳過來的products數(shù)組放到request中,轉(zhuǎn)到/viewProducts.jsp。發(fā)布運行應(yīng)用程序,在瀏覽器的地址欄中輸入:http://localhost:8080/Struts1_Batch/addProducts.jsp。效果請參考如圖1、圖2。

    在/addProducts.jsp的“Date of production”必須以(yyyy-MM-dd)的形式正確填寫,且不能為空。

    方法二、表單(Actoin Form)+ 列表(List)

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

    首先,我們要創(chuàng)建類tipsAndTricks.AutoInitArrayList,代碼如下:

    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框架調(diào)用這個方法時,如果index超出列表大小,則會實例化新項放到列表中,避免出現(xiàn)(IndexOutOfBoundsException)異常。

    接著,讓我們看Struts的配置,內(nèi)容如下:

    <? 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 >

    然后,創(chuàng)建表單類tipsAndTricks.NormalProductsForm,代碼如下:

    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類tipsAndTricks.BatchWrappingNormalAction,代碼如下:

    /*
    * 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,內(nèi)容如下:

    <% @ 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”的請求,會進(jìn)行封裝。發(fā)布運行應(yīng)用程序,在瀏覽器的地址欄中輸入:http://localhost:8080/Struts1_Batch/addProducts2.jsp。效果請參考如圖1、圖2。

    總結(jié)

    兩種方法各有優(yōu)缺點,選擇原則是如果不需要動態(tài)設(shè)置元素個數(shù),則使用方法一,否則請使用方法二。

    posted on 2008-03-04 09:19 蘆葦 閱讀(516) 評論(0)  編輯  收藏 所屬分類: Struts
    主站蜘蛛池模板: 97精品免费视频| 亚洲成人免费在线观看| 久久av免费天堂小草播放| 国产精品偷伦视频观看免费| 91免费在线播放| 永久黄网站色视频免费| 国产亚洲精品激情都市| 亚洲日韩在线视频| 国产亚洲欧美日韩亚洲中文色| jizz在线免费播放| 日日麻批免费40分钟无码| 好男人看视频免费2019中文 | 最近新韩国日本免费观看| 中文字幕无码不卡免费视频| 亚洲狠狠爱综合影院婷婷| 亚洲av色福利天堂| 一区二区亚洲精品精华液| 一区二区三区免费电影| 2020因为爱你带字幕免费观看全集| 成在人线AV无码免费| 国产综合精品久久亚洲| 亚洲综合色丁香麻豆| 污视频网站免费观看| 最近免费中文字幕大全高清大全1| 日本免费一二区在线电影| 久久99国产亚洲精品观看| 亚洲AV无码一区二区一二区 | 日本永久免费a∨在线视频| 99久久久国产精品免费蜜臀| 国产又大又粗又硬又长免费| 亚洲av日韩av不卡在线观看 | 亚洲偷偷自拍高清| GOGOGO免费观看国语| 天堂在线免费观看中文版| 亚洲精品二区国产综合野狼 | 亚洲一区二区三区免费视频| 成人a毛片视频免费看| ww4545四虎永久免费地址| 亚洲天堂免费在线视频| 国产精品亚洲精品青青青| 色www永久免费网站|