国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java框架:Struts 的動態(tài)復(fù)選框

2019-11-18 15:54:59
字體:
供稿:網(wǎng)友

  Struts Recipes 的合著者 Danilo Gurovich 從 George Franciscus 停止的地方開始,介紹了易于使用的創(chuàng)建動態(tài)選擇復(fù)選框的 Struts 訣竅。
  
  在用戶界面設(shè)計(jì)中,復(fù)選框組不如它的同類 —— 多行選擇框那樣流行。它們基本上做的是同一件事,即選擇映射到單一 name 屬性的一組選項(xiàng)。當(dāng)在組中使用時,復(fù)選框執(zhí)行的功能實(shí)際與多行選擇框一樣,但是它們占據(jù)的屏幕空間更多。當(dāng)希望用戶在選擇一個或多個選項(xiàng)之前能夠看到所有選項(xiàng)的時候,這會很有好處。
  
  雖然在選項(xiàng)不多的時候,多行選擇框通常提供更好的觀感,但是當(dāng)選擇框必須動態(tài)呈現(xiàn)而且包含預(yù)選功能時,對企業(yè)應(yīng)用程序來說復(fù)選框組會是更好的選擇。幸運(yùn)的是,使用 Struts 框架可以很輕易地創(chuàng)建動態(tài)復(fù)選框組。
  
  在這篇文章中,我將介紹一個簡單的訣竅:用 Struts 的 <Html:multibox/> 和 <logic:iterate/> 標(biāo)記在應(yīng)用程序的視圖層呈現(xiàn)大量條目,在本例中是 java? Server Page(jsp)。
  
  我先從使用復(fù)選框元素顯示簡單的 String[] 數(shù)組開始,數(shù)組中包含喜瑪拉雅山的頂峰高度。然后,我將創(chuàng)建另外一個 String[] 數(shù)組,包含 selectedMountains ,代表已經(jīng)選中的復(fù)選框。復(fù)選框的預(yù)選情況會在兩個數(shù)組的交叉中產(chǎn)生。假如 selectedMountains 的初始數(shù)組為空,那么所有復(fù)選框最初都會顯示為未選中。
  
  請參閱 下載 獲得完整的示例源代碼。應(yīng)當(dāng)擁有跟隨本文所需要的每樣?xùn)|西。假如需要下載 Struts 框架,請參閱 參考資料。
  
  創(chuàng)建動態(tài)復(fù)選框
  
  創(chuàng)建動態(tài)復(fù)選框的訣竅包含三個主要部分:
  
  一個表單 bean,容納復(fù)選框的 String[] 數(shù)組和表示選中復(fù)選框的 String[] 數(shù)組。
  
  一個 JSP,帶有一個表單,在需要的時候顯示復(fù)選框。
  
  一個簡單的 Action 類,從表單頁面轉(zhuǎn)到顯示頁面。
  
  請注重 “Himalayas” 示例非常簡單。用來填充復(fù)選框的字段應(yīng)當(dāng)來自更復(fù)雜的模型,比如這樣的模型,它能夠標(biāo)識用戶,并選擇要顯示的字段,然后把業(yè)務(wù)對象認(rèn)為需要的選項(xiàng)預(yù)先選中。我采用簡單的模型是為了更好地演示 Struts 的用戶界面功能。代碼示例使用 JSP 腳本語言是為了表示清楚。
  
  第 1 步. 創(chuàng)建表單 bean
  
  我先從創(chuàng)建 Struts 表單 bean 開始,它包含填充復(fù)選框所需要的信息。請注重清單 1 中的 TestForm.java 包含了兩個示例 String[] 數(shù)組變量的 getter 和 setter。數(shù)組 mountains 代表示例復(fù)選框的 全部選項(xiàng),數(shù)組 selectedMountains 代表預(yù)選的在瀏覽器中顯示為選中的元素。
  
  除了代表初始選中的復(fù)選框,selectedMountains 還代表處理表單時,由用戶選中的復(fù)選框。(它只代表最終選中的元素。)當(dāng)請求頁面時,會顯示復(fù)選框。當(dāng)我在它們之間迭代時,與 selectedMountains 匹配的復(fù)選框元素就是選中的元素。
  
  清單 1 顯示了 TestForm.java 的完整代碼:
  
  清單 1. TestForm.java
  
  package com.strutsrecipes;
  
  import javax.servlet.http.HttpServletRequest;
  import org.apache.struts.action.ActionError;
  import org.apache.struts.action.ActionErrors;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionMapping;
  
  public final class CheckboxTestForm
  extends ActionForm {
  
  // Instance Variables
  
  /*Mountains "  private String[]
  selectedMountains
  =
  {"Everest","K2","Lhotse"};
  
  /*the ten tallest Mountains to iterate through*/
  private String[]
  mountains
  =
  {"Everest","K2","Kangchenjunga","Lhotse",
  "Makalu","Kangchenjunga South",
  "Lhotse Middle","Kangchenjunga West",
  "Lhotse Shar","Cho Oyu"};
  
  /*Getter for selectedMountains*/
  public String[] getSelectedMountains() {
  return this.selectedMountains;
  }
  
  /*Setter for selectedMountains*/
  public void setSelectedMountains(String[] selectedMountains) {
  this.selectedMountains = selectedMountains;
  }
  
  /*Getter for the mountains*/
  public String[] getMountains() {
  return this.mountains;
  }
  
  /*Setter for the mountains*/
  public void setMountains(String[] mountains) {
  this.mountains = mountains;
  }
  }
  
  第 2 步. 編寫 JSP 代碼
  
  接下來,我要編寫頁面的 JSP 代碼,把 TestForm.java 的信息傳遞給視圖層。在編寫這個代碼時,要害是要把對應(yīng)的 Struts 標(biāo)記庫導(dǎo)入 JSP。清單 2 的 JSP 代碼表示的是一個簡單的表單,顯示復(fù)選框中相應(yīng)的框已經(jīng)選中:
  
  清單 2. 帶有表單的 JSP
  
  <%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
  <%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
  <%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
  
  <%-- html code, etc... -->
  
  <html:form
  action="/FormAction"
  name="testForm"
  type="com.strutsrecipes.CheckboxTestForm">
  
  <h4><bean:message key="testForm.instrUCtion"/></h4>
  
  <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/> 標(biāo)記表示文本,用 <html:multibox/> 表示 HTML 復(fù)選框,用 <logic:iterate/> 標(biāo)記在數(shù)組中迭代并創(chuàng)建相應(yīng)內(nèi)容。我的表單在 JSP 中通過 <html:form/> 標(biāo)記被實(shí)例化。
  
  下一步是對 <logic:iterate/> 標(biāo)記中的 mountains 字段進(jìn)行迭代。在這么做的時候,我創(chuàng)建了一個變量(mountain),用它來填充復(fù)選框,并用 <bean:write/> 標(biāo)記給它一個標(biāo)簽。要在復(fù)選框中創(chuàng)建 selected 屬性,我要再次使用 <logic:iterate/> 和 <html:multibox/> 標(biāo)記。<html:multibox/> 標(biāo)記中的 property 屬性由 selectedMountains 字段填充。當(dāng) selectedMountains 等于 mountain 時,selectBox 就是選中的。
  
  第 3 步. 編寫 Action 類
  
  最后一步是編寫 Action 類。清單 3 比起其他清單,做的事并不多。我做的只是得到 selectedMountains 的 String[] 數(shù)組,并使它可以用于頁面:
  
  清單 3. 表單的 Action
  
  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 javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.Http
session;
  
  /**
  * 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()
  ;
  
  System.out.println("htmlString RETURNED*/n" +
  selectedMountains.toString());
  
  //Save the htmlString in the session for later...
  HttpSession session = request.getSession();
  session.setAttribute(CheckboxConstants.MOUNTAINS, selectedMountains);
  
  return (mapping.findForward("success"));
  }
  }
  
  擴(kuò)充 Himalayas
  
  有了這個代碼,工作就完成了,差不多可以展示成果了!用戶現(xiàn)在可以提交 JSP 表單并在 Action 類引用的對應(yīng)頁面中查看結(jié)果。清單 4 中的代碼段顯示了用戶在簡單 JSP 頁面的表單中選中的復(fù)選框列表:
  
  清單 4. 復(fù)選框選擇的結(jié)果
  
  <%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
  <%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
  <%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
  
  <%-- html code, etc... -->
  
  <logic:iterate id="mountain" property="mountains" name="testForm">
  <bean:write name="mountain"/><br/>
  </logic:iterate>
  <hr size=5 color="black"/>
  
  <%-- some more html code, etc... -->
  
  這個訣竅的工作方式
  
  這個訣竅的要害是表單 bean 中的字段被傳遞到頁面。查看相關(guān) JSP 代碼有助于澄清這點(diǎn)。一旦表單 bean 被實(shí)例化:
  
  <html:form action="/FormAction"
  name="testForm"
  type=" com.strutsrecipes.CheckboxTestForm">
  
  下一步為 Java 類的 mountains 變量中的每個 mountain 創(chuàng)建一個復(fù)選框。要做到這一點(diǎn),我必須像下面這樣在 String[] 數(shù)組中迭代:
  
  <logic:iterate id="mountain"
  property="mountains"
  name="testForm">
  
  使用 <logic:iterate> 標(biāo)記,我調(diào)用了 testForm bean 中的 getMountains() 方法。它在這個數(shù)組中迭代,并把每個值作為已經(jīng)命名的 pageContext() 級的 String mountain[] 數(shù)組變量返回(即 id="mountain")。
  
  在這里可以看到 <html:multibox/> 標(biāo)記的效果以及如何顯示它:
  
  <html:multibox property="selectedMountains">
  <bean:write name="mountain"/>
  </html:multibox>
  <bean:write name="mountain"/><br/>
  
  注重 property 屬性被 selectedMountains 填充,這是我選中的變量。當(dāng)這個變量與 <html:multibox/> 值(即 multibox 標(biāo)記中的 <bean:write/>)對應(yīng)時,在呈現(xiàn)表單的時候它就表現(xiàn)為選中。假如用戶選中表單或取消選中,那么新的 selectedMountains 值就被發(fā)送給 Action 類進(jìn)行處理。這個迭代中的第二個 <bean:write/> 標(biāo)記創(chuàng)建該標(biāo)記使用的標(biāo)簽,后面跟著 <br/> 標(biāo)記,讓視圖在一長列中顯示這些標(biāo)記。
  
  擴(kuò)展這個訣竅
  
  通過使用 Struts LabelValueBean 類代替簡單的 String[] 數(shù)組,可以對動態(tài)復(fù)選框這個訣竅進(jìn)行擴(kuò)展,從而為復(fù)選框創(chuàng)建不同的標(biāo)簽。先從添加 LabelValueBeans 到 java.util.List 開始。然后對列表進(jìn)行迭代,把 LabelValueBeans 標(biāo)簽和值釋放到適當(dāng)?shù)奈恢谩_@個略微復(fù)雜的訣竅與動態(tài)復(fù)選框訣竅的效果相同,但是它的結(jié)果更適合實(shí)際的用戶界面設(shè)計(jì)。清單 5 顯示了擴(kuò)展的動態(tài)復(fù)選框訣竅:
  
  清單 5. 添加標(biāo)簽到動態(tài)復(fù)選框
  
  <logic:iterate id="mountainlb"
  property="mountainslb"
  name="testForm">
  
  <bean:define id="mountainbean"
  name="mountainlb
  "type="org.apache.struts.util.LabelValueBean"/>
  
  <html:multibox property="selectedMountains">
  <bean:write name="mountainbean"
  property="value"/>
  </html:multibox>
  <bean:write name="mountainbean"
  property="label"/><br/>
  
  </logic:iterate>
  
  注重,這里大的變化是用 <bean:define/> 在迭代的時候創(chuàng)建 LabelValueBean。然后用 <bean:write/> 輸出每個 mountainbean 的屬性(即 org.apache.struts.util.LabelValueBean 類的 getLabel() 和 getValue() 方法)。
  
  結(jié)束語
  
  Struts 對于復(fù)選框的動態(tài)呈現(xiàn)和預(yù)選提供了優(yōu)秀的支持。這個訣竅是我合著 Struts Recipes 的原因 —— 那時我已經(jīng)發(fā)現(xiàn)許多與 Struts 框架相關(guān)的理論和服務(wù)器端信息,但是用戶界面編程多數(shù)被忽略了,或者被掩蓋了。在上上下下找了一圈使用 Struts 創(chuàng)建復(fù)選框的訣竅之后,我放棄了,并自己寫了一個。通過把不同的部分組合起來,我可以創(chuàng)建適合我的動態(tài)復(fù)選框系統(tǒng)。
  
  您會注重到,代碼示例被設(shè)置為適合用作不同用戶界面小控件和布局想法的測試溫床。實(shí)際上,我在書中的大多數(shù)用戶界面示例中都使用了它,只需要調(diào)整 Action 類和我的模型去適合訣竅的需求而已。我還把它用在測試不同的想法上,這樣就不用在我正在處理的應(yīng)用程序內(nèi)部花太多時間為某些東西編碼了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 油尖旺区| 城固县| 胶南市| 青冈县| 石楼县| 平顺县| 深圳市| 株洲市| 红桥区| 荥阳市| 彭州市| 大港区| 西畴县| 安龙县| 中卫市| 临沧市| 平顶山市| 宜都市| 花垣县| 甘谷县| 疏附县| 乌海市| 邹平县| 古丈县| 凭祥市| 山阴县| 龙游县| 衡东县| 宣恩县| 抚远县| 浮山县| 海宁市| 万盛区| 东阿县| 阜城县| 南江县| 迁西县| 辽中县| 蓝山县| 札达县| 孝义市|