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

Java框架:Struts 的動態復選框

2013-11-23 20:10:36  來源: Java開源技術 

  Struts Recipes 的合著者 Danilo Gurovich 從 George Franciscus 停止的地方開始介紹了易於使用的創建動態選擇復選框的 Struts 訣竅
  
  在用戶界面設計中復選框組不如它的同類 —— 多行選擇框那樣流行它們基本上做的是同一件事即選擇映射到單一 name 屬性的一組選項當在組中使用時復選框執行的功能實際與多行選擇框一樣但是它們占據的屏幕空間更多當希望用戶在選擇一個或多個選項之前能夠看到所有選項的時候這會很有好處
  
  雖然在選項不多的時候多行選擇框通常提供更好的觀感但是當選擇框必須動態呈現而且包含預選功能時對企業應用程序來說復選框組會是更好的選擇幸運的是使用 Struts 框架可以很容易地創建動態復選框組
  
  在這篇文章中我將介紹一個簡單的訣竅用 Struts 的 <html:multibox/> 和 <logic:iterate/> 標記在應用程序的視圖層呈現大量條目在本例中是 Java? Server Page(JSP)
  
  我先從使用復選框元素顯示簡單的 String[] 數組開始數組中包含喜瑪拉雅山的頂峰高度然後我將創建另外一個 String[] 數組包含 selectedMountains 代表已經選中的復選框復選框的預選情況會在兩個數組的交叉中產生如果 selectedMountains 的初始數組為空那麼所有復選框最初都會顯示為未選中
  
  請參閱 下載 獲得完整的示例源代碼應當擁有跟隨本文所需要的每樣東西如果需要下載 Struts 框架請參閱 參考資料
  
  創建動態復選框
  
  創建動態復選框的訣竅包含三個主要部分
  
  一個表單 bean容納復選框的 String[] 數組和表示選中復選框的 String[] 數組
  
  一個 JSP帶有一個表單在需要的時候顯示復選框
  
  一個簡單的 Action 類從表單頁面轉到顯示頁面
  
  請注意 Himalayas 示例非常簡單用來填充復選框的字段應當來自更復雜的模型比如這樣的模型它能夠標識用戶並選擇要顯示的字段然後把業務對象認為需要的選項預先選中我采用簡單的模型是為了更好地演示 Struts 的用戶界面功能代碼示例使用 JSP 腳本語言是為了表示清楚
  
  第 創建表單 bean
  
  我先從創建 Struts 表單 bean 開始它包含填充復選框所需要的信息請注意清單 中的 TestFormjava 包含了兩個示例 String[] 數組變量的 getter 和 setter數組 mountains 代表示例復選框的 全部選項數組 selectedMountains 代表預選的在浏覽器中顯示為選中的元素
  
  除了代表初始選中的復選框selectedMountains 還代表處理表單時由用戶選中的復選框(它只代表最終選中的元素)當請求頁面時會顯示復選框當我在它們之間迭代時與 selectedMountains 匹配的復選框元素就是選中的元素
  
  清單 顯示了 TestFormjava 的完整代碼
  
  清單 TestFormjava
  
  package comstrutsrecipes;
  
  import javaxservlethttpHttpServletRequest;
  import orgapachestrutsactionActionError;
  import orgapachestrutsactionActionErrors;
  import orgapachestrutsactionActionForm;
  import orgapachestrutsactionActionMapping;
  
  public final class CheckboxTestForm
  extends ActionForm {
  
  // Instance Variables
  
  /*Mountains preselected*/
  private String[]
  selectedMountains
  =
  {EverestKLhotse};
  
  /*the ten tallest Mountains to iterate through*/
  private String[]
  mountains
  =
  {EverestKKangchenjungaLhotse
  MakaluKangchenjunga South
  Lhotse MiddleKangchenjunga West
  Lhotse SharCho Oyu};
  
  /*Getter for selectedMountains*/
  public String[] getSelectedMountains() {
  return thisselectedMountains;
  }
  
  /*Setter for selectedMountains*/
  public void setSelectedMountains(String[] selectedMountains) {
  thisselectedMountains = selectedMountains;
  }
  
  /*Getter for the mountains*/
  public String[] getMountains() {
  return thismountains;
  }
  
  /*Setter for the mountains*/
  public void setMountains(String[] mountains) {
  thismountains = mountains;
  }
  }
  
  第 編寫 JSP 代碼
  
  接下來我要編寫頁面的 JSP 代碼把 TestFormjava 的信息傳遞給視圖層在編寫這個代碼時關鍵是要把對應的 Struts 標記庫導入 JSP清單 的 JSP 代碼表示的是一個簡單的表單顯示復選框中相應的框已經選中
  
  清單 帶有表單的 JSP
  
  <%@taglib uri=html prefix=html%>
  <%@taglib uri=bean prefix=bean%>
  <%@taglib uri=logic prefix=logic%>
  
  <% html code etc >
  
  <html:form
  action=/FormAction
  name=testForm
  type=comstrutsrecipesCheckboxTestForm>
  
  <h><bean:message key=testForminstruction/></h>
  
  <logic:iterate name=testForm
  property=mountains
  id=mountain>
  
  <% create the checkbox and selected attribute >
  <html:multibox property=selectedMountains>
  <bean:write name=mountain/>
  </html:multibox>
  
  <% create the label note that br tag will format it vertically >
  <bean:write name=mountain/><br/>
  
  </logic:iterate>
  
  <br/>
  <html:submit/><html:reset/>
  
  </html:form>
  
  <% some more html code etc >
  
  注意我用 Struts <bean:message/> 標記表示文本用 <html:multibox/> 表示 HTML 復選框用 <logic:iterate/> 標記在數組中迭代並創建相應內容我的表單在 JSP 中通過 <html:form/> 標記被實例化
  
  下一步是對 <logic:iterate/> 標記中的 mountains 字段進行迭代在這麼做的時候我創建了一個變量(mountain)用它來填充復選框並用 <bean:write/> 標記給它一個標簽要在復選框中創建 selected 屬性我要再次使用 <logic:iterate/> 和 <html:multibox/> 標記<html:multibox/> 標記中的 property 屬性由 selectedMountains 字段填充當 selectedMountains 等於 mountain 時selectBox 就是選中的
  
  第 編寫 Action 類
  
  最後一步是編寫 Action 類清單 比起其他清單做的事並不多我做的只是得到 selectedMountains 的 String[] 數組並使它可以用於頁面
  
  清單 表單的 Action
  
  import orgapachestrutsactionAction;
  import orgapachestrutsactionActionForm;
  import orgapachestrutsactionActionForward;
  import orgapachestrutsactionActionMapping;
  
  import javaxservletServletException;
  import javaxservlethttpHttpServletRequest;
  import javaxservlethttpHttpServletResponse;
  import javaxservlethttpHttpSession;
  
  /**
  * A simple Action for Checkbox test
  *
  * @author Danilo Gurovich
  */
  public final class CheckboxTestAction
  extends Action {
  // OTHER METHODS
  
  /**
  * The execute method
  *
  * @param mapping ActionMapping
  * @param form CheckboxTestForm
  * @param request HttpServletRequest
  * @param response HttpServletRespons
  * @return success to the confirmation page
  * @throws ServletException not thrown but could be!
  * @throws Exception ditto
  */
  public ActionForward execute(ActionMapping mapping
  ActionForm form
  HttpServletRequest request
  HttpServletResponse response)
  throws ServletException Exception {
  
  // Extract attributes needed
  String[] selectedMountains =
  ((CheckboxTestForm) form)getSelectedMountains()
  ;
  
  Systemoutprintln(htmlString RETURNED*\n +
  selectedMountainstoString());
  
  //Save the htmlString in the session for later
  HttpSession session = requestgetSession();
  sessionsetAttribute(CheckboxConstantsMOUNTAINS selectedMountains);
  
  return (mappingfindForward(success));
  }
  }
  
  擴充 Himalayas
  
  有了這個代碼工作就完成了差不多可以展示成果了!用戶現在可以提交 JSP 表單並在 Action 類引用的對應頁面中查看結果清單 中的代碼段顯示了用戶在簡單 JSP 頁面的表單中選中的復選框列表
  
  清單 復選框選擇的結果
  
  <%@taglib uri=html prefix=html%>
  <%@taglib uri=bean prefix=bean%>
  <%@taglib uri=logic prefix=logic%>
  
  <% html code etc >
  
  <logic:iterate id=mountain property=mountains name=testForm>
  <bean:write name=mountain/><br/>
  </logic:iterate>
  <hr size= color=black/>
  
  <% some more html code etc >
  
  這個訣竅的工作方式
  
  這個訣竅的關鍵是表單 bean 中的字段被傳遞到頁面查看相關 JSP 代碼有助於澄清這點一旦表單 bean 被實例化
  
  <html:form action=/FormAction
  name=testForm
  type= comstrutsrecipesCheckboxTestForm>
  
  下一步為 Java 類的 mountains 變量中的每個 mountain 創建一個復選框要做到這一點我必須像下面這樣在 String[] 數組中迭代
  
  <logic:iterate id=mountain
  property=mountains
  name=testForm>
  
  使用 <logic:iterate> 標記我調用了 testForm bean 中的 getMountains() 方法它在這個數組中迭代並把每個值作為已經命名的 pageContext() 級的 String mountain[] 數組變量返回(即 id=mountain
  
  在這裡可以看到 <html:multibox/> 標記的效果以及如何顯示它
  
  <html:multibox property=selectedMountains>
  <bean:write name=mountain/>
  </html:multibox>
  <bean:write name=mountain/><br/>
  
  注意 property 屬性被 selectedMountains 填充這是我選中的變量當這個變量與 <html:multibox/> 值(即 multibox 標記中的 <bean:write/>)對應時在呈現表單的時候它就表現為選中如果用戶選中表單或取消選中那麼新的 selectedMountains 值就被發送給 Action 類進行處理這個迭代中的第二個 <bean:write/> 標記創建該標記使用的標簽後面跟著 <br/> 標記讓視圖在一長列中顯示這些標記
  
  擴展這個訣竅
  
  通過使用 Struts LabelValueBean 類代替簡單的 String[] 數組可以對動態復選框這個訣竅進行擴展從而為復選框創建不同的標簽先從添加 LabelValueBeans 到 javautilList 開始然後對列表進行迭代把 LabelValueBeans 標簽和值釋放到適當的位置這個略微復雜的訣竅與動態復選框訣竅的效果相同但是它的結果更適合實際的用戶界面設計清單 顯示了擴展的動態復選框訣竅
  
  清單 添加標簽到動態復選框
  
  <logic:iterate id=mountainlb
  property=mountainslb
  name=testForm>
  
  <bean:define id=mountainbean
  name=mountainlb
  type=orgapachestrutsutilLabelValueBean/>
  
  <html:multibox property=selectedMountains>
  <bean:write name=mountainbean
  property=value/>
  </html:multibox>
  <bean:write name=mountainbean
  property=label/><br/>
  
  </logic:iterate>
  
  注意這裡大的變化是用 <bean:define/> 在迭代的時候創建 LabelValueBean然後用 <bean:write/> 輸出每個 mountainbean 的屬性(即 orgapachestrutsutilLabelValueBean 類的 getLabel() 和 getValue() 方法)
  
  結束語
  
  Struts 對於復選框的動態呈現和預選提供了優秀的支持這個訣竅是我合著 Struts Recipes 的原因 —— 那時我已經發現許多與 Struts 框架相關的理論和服務器端信息但是用戶界面編程多數被忽略了或者被掩蓋了在上上下下找了一圈使用 Struts 創建復選框的訣竅之後我放棄了並自己寫了一個通過把不同的部分組合起來我可以創建適合我的動態復選框系統
  
  您會注意到代碼示例被設置為適合用作不同用戶界面小控件和布局想法的測試溫床實際上我在書中的大多數用戶界面示例中都使用了它只需要調整 Action 類和我的模型去適合訣竅的需求而已我還把它用在測試不同的想法上這樣就不用在我正在處理的應用程序內部花太多時間為某些東西編碼了
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28066.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.