struts动态form:Struts 的动态复选框

  Struts Recipes 合著者 Danilo Gurovich 从 George Franciscus 停止地方开始介绍了易于使用创建动态选择复选框 Struts 诀窍

  在用户界面设计中复选框组不如它同类 —— 多行选择框那样流行它们基本上做是同件事即选择映射到单 name 属性组选项当在组中使用时复选框执行功能实际和多行选择框但是它们占据屏幕空间更多当希望用户在选择个或多个选项的前能够看到所有选项时候这会很有好处

  虽然在选项不多时候多行选择框通常提供更好观感但是当选择框必须动态呈现而且包含预选功能时对企业应用来说复选框组会是更好选择幸运使用 Struts 框架可以很容易地创建动态复选框组

  在这篇文章中我将介绍个简单诀窍:用 Struts <html:multibox/> 和 <logic:iterate/> 标记在应用视图层呈现大量条目在本例中是 Java? Server Page(JSP)

  我先从使用复选框元素显示简单 String 开始中包含喜玛拉雅山顶峰高度然后我将创建另外个 String 包含 selectedMountains 代表已经选中复选框复选框预选情况会在两个交叉中产生如果 selectedMountains 为空那么所有复选框最初都会显示为未选中

  请参阅 下载 获得完整举例源代码应当拥有跟随本文所需要每样东西如果需要下载 Struts 框架请参阅 参考资料

  创建动态复选框

  创建动态复选框诀窍包含 3个主要部分:

  个表单 bean容纳复选框 String 和表示选中复选框 String

  个 JSP带有个表单在需要时候显示复选框

  个简单 Action 类从表单页面转到显示页面

  请注意 “Himalayas” 举例非常简单用来填充复选框字段应当来自更复杂模型比如这样模型它能够标识用户并选择要显示字段然后把业务对象认为需要选项预先选中我采用简单模型是为了更好地演示 Struts 用户界面功能代码举例使用 JSP 脚本语言是为了表示清楚

  第 1 步. 创建表单 bean

  我先从创建 Struts 表单 bean 开始它包含填充复选框所需要信息请注意清单 1 中 TestForm.java 包含了两个举例 String 变量 getter 和 ter mountains 代表举例复选框 全部选项 selectedMountains 代表预选在浏览器中显示为选中元素

  除了代表选中复选框selectedMountains 还代表处理表单时由用户选中复选框(它只代表最终选中元素)当请求页面时会显示复选框当我在它们的间迭代时和 selectedMountains 匹配复选框元素就是选中元素

  清单 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 CheckboxTestForm
  extends ActionForm {
  // Instance Variables
  /*Mountains "pre-selected"...*/
  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 {
   this.selectedMountains;
  }
  /*Setter for selectedMountains*/
  public void SelectedMountains(String selectedMountains) {
  this.selectedMountains = selectedMountains;
  }
  /*Getter for the mountains*/
  public String getMountains {
   this.mountains;
  }
  /*Setter for the mountains*/
  public void Mountains(String mountains) {
  this.mountains = mountains;
  }
  }


  第 2 步. 编写 JSP 代码

  接下来我要编写页面 JSP 代码把 TestForm.java 信息传递给视图层在编写这个代码时关键是要把对应 Struts 标记库导入 JSP清单 2 JSP 代码表示个简单表单显示复选框中相应框已经选中:

  清单 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:re/>
  </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 就是选中

  第 3 步. 编写 Action 类

  最后步是编写 Action 类清单 3 比起其他清单事并不多我做只是得到 selectedMountains String 并使它可以用于页面:

  清单 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.HttpSession;
  /**
  * A simple Action for Checkbox test.
  *
  * @author Danilo Gurovich
  */
  public final CheckboxTestAction
  extends Action {
  // -------------------------- OTHER METHODS --------------------------
  /**
  * The execute method
  *
  * @param mapping ActionMapping
  * @param form CheckboxTestForm
  * @param request HttpServletRequest
  * @param response HttpServletRespons
  * @ 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
  ;
  .out.prln("htmlString RETURNED*n" +
  selectedMountains.toString);
  //Save the htmlString in the session for later...
  HttpSession session = request.getSession;
  session.Attribute(CheckboxConstants.MOUNTAINS, selectedMountains);
   (mapping.findForward("success"));
  }
  }


  扩充 Himalayas

  有了这个代码工作就完成了差不多可以展示成果了!用户现在可以提交 JSP 表单并在 Action 类引用对应页面中查看结果清单 4 中代码段显示了用户在简单 JSP 页面表单中选中复选框列表:

  清单 4. 复选框选择结果

  <%@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 中字段被传递到页面查看相关 JSP 代码有助于澄清这点旦表单 bean 被例子化:

  <html:form action="/FormAction"
  name="testForm"
  type=" com.strutsrecipes.CheckboxTestForm">


  下步为 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 类进行处理这个迭代中第 2个 <bean:write/> 标记创建该标记使用标签后面跟着 <br/> 标记让视图在长列中显示这些标记

  扩展这个诀窍

  通过使用 Struts LabelValueBean 类代替简单 String 可以对动态复选框这个诀窍进行扩展从而为复选框创建区别标签先从添加 LabelValueBeans 到 java.util.List 开始然后对列表进行迭代把 LabelValueBeans 标签和值释放到适当位置这个略微复杂诀窍和动态复选框诀窍效果相同但是它结果更适合实际用户界面设计清单 5 显示了扩展动态复选框诀窍:

  清单 5. 添加标签到动态复选框

  <logic:iterate id="mountainlb"
  property="mountainslb"
  name="testForm">
  <bean: 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:/> 在迭代时候创建 LabelValueBean然后用 <bean:write/> 输出每个 mountainbean 属性(即 org.apache.struts.util.LabelValueBean 类 getLabel 和 getValue 思路方法)

  结束语

  Struts 对于复选框动态呈现和预选提供了优秀支持这个诀窍是我合著 Struts Recipes 原因 —— 那时我已经发现许多和 Struts 框架相关理论和服务器端信息但是用户界面编程多数被忽略了或者被掩盖了在上上下下找了圈使用 Struts 创建复选框诀窍的后我放弃了并自己写了通过把区别部分组合起来我可以创建适合我动态复选框系统

  您会注意到代码举例被设置为适合用作区别用户界面小Control控件和布局想法测试温床实际上我在书中大多数用户界面举例中都使用了它只需要调整 Action 类和我模型去适合诀窍需求而已我还把它用在测试区别想法上这样就不用在我正在处理应用内部花太多时间为某些东西编码了



Tags:  struts2.0 struts2 struts struts动态form

延伸阅读

最新评论

发表评论