無為

          無為則可為,無為則至深!

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

          package tutorial;

          import java.util.List;

          import com.opensymphony.xwork2.ActionSupport;

          public class ProductConfirm extends ActionSupport {
          ? ?
          public List < Product > products;

          ? ?
          public List < Product > getProducts() {
          ? ? ? ?
          return products;
          ? ?}


          ? ?
          public void setProducts(List < Product > products) {
          ? ? ? ?
          this .products = products;
          ? ?}

          ? ?
          ? ?@Override
          ? ?
          public String execute() {
          ? ? ? ?
          for (Product p : products) {
          ? ? ? ? ? ?System.out.println(p.getName()
          + " | " + p.getPrice() + " | " + p.getDateOfProduction());
          ? ? ? ?}

          ? ? ? ?
          return SUCCESS;
          ? ?}

          }

          接看,在同上的包中加入ProductConfirm-conversion.properties,代碼如下:

          Element_products = tutorial.Product

          再在struts.xml文件中配置ProductConfirm Action,代碼片段如下:

          < action name ="ProductConfirm" class ="tutorial.ProductConfirm" >
          ? ?
          < result > /ShowProducts.jsp </ result >
          </ action >

          在WEB文件夾下新建AddProducts.jsp,內(nèi)容如下:

          <% @ page ?contentType = " text/html; charset=UTF-8 " %>
          <% @taglib prefix = " s " uri = " /struts-tags " %>
          < html >
          < head >
          ? ?
          < title > Hello World </ title >
          </ head >
          < body >
          ? ?
          < s:form action ="ProductConfirm" theme ="simple" > ? ? ? ? ? ?
          ? ? ? ?
          < table >
          ? ? ? ? ? ?
          < tr style ="background-color:powderblue; font-weight:bold;" >
          ? ? ? ? ? ? ? ?
          < td > Product Name </ td >
          ? ? ? ? ? ? ? ?
          < td > Price </ td >
          ? ? ? ? ? ? ? ?
          < td > Date of production </ td >
          ? ? ? ? ? ?
          </ tr >
          ? ? ? ? ? ?
          < s:iterator value ="new int[3]" status ="stat" >
          ? ? ? ? ? ? ? ?
          < tr >
          ? ? ? ? ? ? ? ? ? ?
          < td >< s:textfield name ="%{'products['+#stat.index+'].name'}" /></ td >
          ? ? ? ? ? ? ? ? ? ?
          < td >< s:textfield name ="%{'products['+#stat.index+'].price'}" /></ td >
          ? ? ? ? ? ? ? ? ? ?
          < td >< s:textfield name ="%{'products['+#stat.index+'].dateOfProduction'}" /></ td >
          ? ? ? ? ? ? ? ?
          </ tr >
          ? ? ? ? ? ?
          </ s:iterator >
          ? ? ? ? ? ?
          < tr >
          ? ? ? ? ? ? ? ?
          < td colspan ="3" >< s:submit /></ td >
          ? ? ? ? ? ?
          </ tr >
          ? ? ? ?
          </ table >
          ? ?
          </ s:form > ? ?
          </ body >
          </ html >

          在同樣的文件夾下創(chuàng)建ShowProducts.jsp,內(nèi)容如下:

          <% @ page ?contentType = " text/html; charset=UTF-8 " %>
          <% @taglib prefix = " s " uri = " /struts-tags " %>
          < html >
          < head >
          ? ?
          < title > Hello World </ title >
          </ head >
          < body > ? ?
          ? ?
          < table >
          ? ? ? ?
          < tr style ="background-color:powderblue; font-weight:bold;" >
          ? ? ? ? ? ?
          < td > Product Name </ td >
          ? ? ? ? ? ?
          < td > Price </ td >
          ? ? ? ? ? ?
          < td > Date of production </ td >
          ? ? ? ?
          </ tr >
          ? ? ? ?
          < s:iterator value ="products" status ="stat" >
          ? ? ? ? ? ?
          < tr >
          ? ? ? ? ? ? ? ?
          < td >< s:property value ="name" /></ td >
          ? ? ? ? ? ? ? ?
          < td > $ < s:property value ="price" /></ td >
          ? ? ? ? ? ? ? ?
          < td >< s:property value ="dateOfProduction" /></ td >
          ? ? ? ? ? ?
          </ tr >
          ? ? ? ?
          </ s:iterator >
          ? ?
          </ table >
          </ body >
          </ html >

          發(fā)布運(yùn)行應(yīng)用程序,在瀏覽器中鍵入http://localhost:8080/Struts2_Converter/AddProducts.jsp,出現(xiàn)如圖4所示頁面:
          圖4 添加產(chǎn)品頁面
          圖4 添加產(chǎn)品頁面

          按圖4所示,填寫表單,按“Submit”提交,出現(xiàn)圖5所示頁面:
          圖5 查看產(chǎn)品頁面
          圖5 查看產(chǎn)品頁面

          查看服務(wù)器的控制臺,有如下輸出:

          Expert One-on-One J2EE Development without EJB | 39.99 | Mon Jun 21 00 : 00 : 00 CST 2004
          Pro Spring |
          32.99 | Mon Jan 31 00 : 00 : 00 CST 2005
          Core J2EE Patterns: Best Practices and Design Strategies
          , Second Edition | 34.64 | Sat May 10 00 : 00 : 00 CST 2003

          上面的代碼并不復(fù)雜,但有幾點(diǎn)需要說明:

          1. ProductConfirm文件中的for(Product p : productes)的寫法是J2SE 5.0中的新特性,作用遍歷products列表;
          2. List<Product>也是J2SE 5.0的才有的泛型(Generic);
          3. ProductConfirm-conversion.properties中“Element_products=tutorial.Product”是告訴Struts 2.0列表products的元素的類型為Product,而不是定義轉(zhuǎn)換器;
          4. 在AddProducts.jsp的<s:textfield>的name為“%{'products['+#stat.index+'].name'}”,%{exp}格式表示使用OGNL表達(dá)式,上述表達(dá)式的相當(dāng)于<%= "products[" + stat.index + "].name" %>,至于<s:iterator>標(biāo)志的用法可以參考我之前的文章《常用的Struts 2.0的標(biāo)志(Tag)介紹》。

          轉(zhuǎn)換錯誤處理

          不知道大家在運(yùn)行上面的例子時,有沒有填錯日期或數(shù)字情況,又或者您有沒有思考過這種情況?如果還沒有嘗試的朋友可以試一下,在第一行的Price和Date of production中輸入英文字母,然后按“Submit”提交。你會看到頁面為空白,再看一下服務(wù)器的控制臺輸出,有如下語句: 警告: No result defined for action tutorial.ProductConfirm and result input,它提示我們沒有為Action定義輸入結(jié)果,所以,我們應(yīng)該在源代碼文件夾下的struts.xml中的ProductConfirm Action中加入以下代碼:

          < result name ="input" > /AddProducts.jsp </ result >

          重新加載應(yīng)用程序,刷新瀏覽器重新提交請求,這時頁面返回AddProducts.jsp,格式錯誤的輸入框的值被保留,如下圖6所示:
          圖6 沒有提示的錯返回頁面
          圖6 沒有提示的錯返回頁面

          當(dāng)然,我們還可以在頁面上加上錯誤提示信息,通過在AddProducts.jsp的“<body>”后,加入下面代碼可以實(shí)現(xiàn):

          < div style ="color:red" >
          ? ?
          < s:fielderror />
          </ div >

          刷新瀏覽器,重新提交請求,出現(xiàn)如圖7所示頁面:
          圖7 帶提示的錯返回頁面
          圖7 帶提示的錯返回頁面

          以上的功能的都是通過Struts 2.0里的一個名為conversionError的攔截器(interceptor)工作,它被注冊到默認(rèn)攔截器棧(default interceptor stack)中。Struts 2.0在轉(zhuǎn)換出錯后,會將錯誤放到ActionContext中,在conversionError的作用是將這些錯誤封裝為對應(yīng)的項(xiàng)錯誤(field error),因此我們可以通過<s:fielderror />來將其在頁面上顯示出來。另外,大家看第二和第三行的Price都被賦為0.0的值,而第一行則保留其錯誤值。這同樣是conversionError的功勞——沒有出錯的行調(diào)用的products[index].price(默認(rèn)值為0.0),而出錯的行則會被賦為頁面所提交的錯誤值,這樣可以提供更好的用戶體驗(yàn)。

          總結(jié)

          Struts 2.0的轉(zhuǎn)換器簡化的WEB應(yīng)用程序的模型,為我們的編程帶來極大的方便。

          posted on 2006-11-07 14:26 Max 閱讀(571) 評論(2) ?編輯?收藏引用收藏至365Key 所屬分類: Struts 2.0系列


          凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
          、轉(zhuǎn)載請注明來處和原文作者。非常感謝。

          posted on 2006-11-08 22:57 草兒 閱讀(302) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 桂林市| 绥阳县| 新邵县| 庆安县| 玛曲县| 南乐县| 德兴市| 都匀市| 射洪县| 马关县| 赞皇县| 左云县| 玉环县| 德江县| 华宁县| 天峻县| 斗六市| 涿州市| 前郭尔| 六盘水市| 琼结县| 墨脱县| 双峰县| 南乐县| 财经| 浮山县| 新乡市| 台中县| 高青县| 麻栗坡县| 博兴县| 乌恰县| 磴口县| 山阳县| 广平县| 铜山县| 衢州市| 泰顺县| 石首市| 琼结县| 育儿|