熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

利用 Struts 實現動態控制表格大小(1)

2013-11-23 20:22:51  來源: Java開源技術 

  在Succeeding with Struts的前面安裝部分我間接提到了DynaForms在運行期內可以動態的控制表格大小換句話說就是能夠根據需要得到或者或者行長的表格可能有點不明智我把這種策略的實際實現作為一種練習留給了讀者自己在接下來的幾個月內我收到了幾十個讀者的請求他們請求給出詳細的實現細節所以這個月我將用兩種不同的方法來實現動態調整的表格
  第一個方法就是我在前面的欄目中提到的那個方法將尺寸參數留給DynaForm 的formproperty 屬性來實現為了演示詳細過程我們來看看一個非常簡單的應用添加關於不同Star Wars 演員的注釋在這個應用中我們感興趣的關鍵事實是演員的數量在表格配置中動態設定而不是在strutsconfigxml文件中動態設定
  首先我們先來看看strutsconfigxml 文件
  
  <?xml version= encoding=UTF?>
  <!DOCTYPE strutsconfig PUBLIC //Apache Software Foundation//DTD Struts Configuration //EN
                  config__dtd;>
  <strutsconfig>
    <formbeans>
      <formbean name=dynamicArrayForm type=orgapachestrutsvalidatorDynaValidatorForm>
        <formproperty name=people type=demoPerson[]/>
      </formbean>
    </formbeans>
  
  
  <actionmappings>
    <action path=/setupForm type=demoSetupFormAction name=dynamicArrayForm scope=session
  
     validate=false>
      <forward name=success path=/displayFormjsp/>
    </action>
    
  <action path=/processActorComments
  type=demoProcessFormAction
      name=dynamicArrayForm scope=session
  validate=false>
      <forward name=success path=/displayFormjsp/>
    </action>
  </actionmappings>
  </strutsconfig>
  
  如你所見這是一個相當簡單的配置文件只定義了一個表格和兩個動作第一個動作/setupForm用來在初始顯示之前配置表格另一個動作/processActorComments 用來處理用戶輸入的注釋
  在這個文件中有兩個重要的事情需要注意它們對於事態的發展很關鍵
   people 表格屬性定義為demoPerson[] 類型(即demoPerson的一個排列)但不給出任何size 參數這就為要創建的排列產生了一個占位符但是沒有任何例示的實排列
   這兩個動作將表格定義在會話期范圍內這是很關鍵的因為用戶在填寫數值之後提交表格時數值在動作執行之前已經填充到表格內了這就意味著沒有機會手動創建具有恰當空位數的排列正如你在表格顯示之前在SetupFormAction 類中看到的情況一樣換句話說當表格提交時必須已經有恰當的空位來接受表格值唯一能保證這個的方法就是在會話期范圍內就已經有了這個表格
  基本上在Person bean 中是沒有值的他只是一個具有lastName firstName dateOfBirthgender 和comment字段的普通bean源文件包括在WAR 文件內
  現在我們來看看SetupFormAction 類它在表格第一次顯示之前調用
  
  package demo;
  
  /**
   * Copyright James M Turner
   * All Rights Reserved
   *
   * A Struts action that sets up a DynaForm which is globally scoped
   */
  
  import javaioIOException;
  import javaxservletServletException;
  import javaxservlethttp*;
  
  import orgapachestrutsaction*;
  import orgapachestrutsvalidatorDynaValidatorForm;
  
  public class SetupFormAction extends Action {
    public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request
                   HttpServletResponse response)
        throws ServletException IOException {
  
      DynaValidatorForm df = (DynaValidatorForm) form;
      Person[] p = new Person[];
      p[] = new Person();
      p[]setDateOfBirth(//);
      p[]setLastName(Ford);
      p[]setFirstName(Harrison);
      p[]setGender(M);
      p[] = new Person();
      p[]setDateOfBirth(//);
      p[]setLastName(Fisher);
      p[]setFirstName(Carrie);
      p[]setGender(F);
      p[] = new Person();
      p[]setDateOfBirth(//);
      p[]setLastName(Hamill);
      p[]setFirstName(Mark);
      p[]setGender(M);
  
      dfset(people p);
  
      return mappingfindForward(success);
    }
  }
  
  這一次也沒有許多東西要看的execute 方法要做的第一件事情和任何基於DynaForm的動作所做的一樣就是將泛型ActionForm 類放到DynaValidatorForm內這就使得我們可以在表格上使用get和set 方法第二件事情就是創建一個具有三個元素的類型Person 的排列在這個方法中尺寸是硬布線的在實際應用中可以從數據庫中選擇一個尺寸我們需要考慮的重要事情是排列應該在代碼中創建而不是由Struts引擎自己創建這樣行數可根據應用要求由代碼隨意指定
  一旦排列已經確定方法將創建三個Person 類實例並賦與數值同樣在實際的應用中可通過一個循環來實現這個循環不斷地從數據庫中讀取行和填充表格行最後動作返回成功導致Struts轉移控制到displayFormjsp 頁
  
  <!
    Copyright James M Turner
    All Rights Reserved
    
    >
  
  <%@ taglib uri=/WEBINF/strutshtmltld prefix=html %>
  <%@ taglib uri=/WEBINF/ctld prefix=c %>
  
  <head>
  <title>Star Wars Actor Fact Page</title>
  </head>
  <H><center>Start Wars Actor Fact Page</title>
  <html:form action=/processActorComments >
    <table border= width=%>
      <tr><th>Last Name</th><th>First Name</th><th>Date of Birth</th><th>Comment</th></tr>
      <c:forEach var=people items=${dynamicArrayFormmappeople}>
        <tr><td><c:out value=${peoplelastName}/></td>
          <td><c:out value=${peoplefirstName}/></td>
          <td><c:out value=${peopledateOfBirth}/></td>
          <td><html:text name=people indexed=true property=comment/></td>
        </tr>
      </c:forEach>
    </table>
    <P/>
    <html:submit value=Update Comments/>
  </html:form>
  
  同樣這裡也沒有很多東西要看的他與我們上一篇文章查看固定長度的行時的代碼完全一樣該頁迭代行(記住在JSTL中我們必須使用map 屬性來獲得到DynaForm 屬性的訪問)顯示演員的姓名和出生日期並提供文本域以便輸入注釋
  當我們聚焦我們的浏覽器合請求時 (假設你把strutswar 文件放在你本地機器的Tomcat 內)將會出現下列頁面
  
  Start Wars Actor Fact Page Last Name First Name Date of Birth Comment
  Ford Harrison // 
  Fisher Carrie // 
  Hamill Mark //
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28402.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.