`

Struts 的动态复选框

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

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

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

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

创建动态复选框

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

一个表单 bean,容纳复选框的 String[] 数组和表示选中复选框的 String[] 数组。


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


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

第 1 步. 创建表单 bean

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

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

清单 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 CheckboxTestFormextends 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() 
{
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 的信息传递给视图层。在编写这个代码时,关键是要把对应的 Struts 标记库导入 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:formaction="/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/> 标记表示文本,用 <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[] 数组,并使它可以用于页面:

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 class CheckboxTestActionextends 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"));}}

扩充 Himalayas

有了这个代码,工作就完成了,差不多可以展示成果了!用户现在可以提交 JSP 表单并在 Action 类引用的对应页面中查看结果。清单 4 中的代码段显示了用户在简单 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... -->
<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 类进行处理。这个迭代中的第二个 <bean:write/> 标记创建该标记使用的标签,后面跟着 <br/> 标记,让视图在一长列中显示这些标记。
通过使用 Struts LabelValueBean 类代替简单的 String[] 数组,可以对动态复选框这个诀窍进行扩展,从而为复选框创建不同的标签。先从添加 LabelValueBeans 到 java.util.List 开始。然后对列表进行迭代,把 LabelValueBeans 标签和值释放到适当的位置。这个略微复杂的诀窍与动态复选框诀窍的效果相同,但是它的结果更适合实际的用户界面设计。清单 5 显示了扩展的动态复选框诀窍:

<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/> 在迭代的时候创建 LabelValueBean。然后用 <bean:write/> 输出每个 mountainbean 的属性(即 org.apache.struts.util.LabelValueBean 类的 getLabel() 和 getValue() 方法)。
Struts 对于复选框的动态呈现和预选提供了优秀的支持。这个诀窍是我合著 Struts Recipes 的原因 —— 那时我已经发现许多与 Struts 框架相关的理论和服务器端信息,但是用户界面编程多数被忽略了,或者被掩盖了。在上上下下找了一圈使用 Struts 创建复选框的诀窍之后,我放弃了,并自己写了一个。通过把不同的部分组合起来,我可以创建适合我的动态复选框系统。

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

分享到:
评论
2 楼 shugyin 2011-11-18  
看你这个不错,想问一下如果复选框的value值和后面显示到页面的值不一样并且都是动态的怎么办?
1 楼 shugyin 2011-11-18  
看你这个不错,想问一下

相关推荐

    Struts 的动态复选框和单选框处理

    Struts 的动态复选框和单选框处理

    对 Struts 2 的 s: iterator tag 中嵌套的所有 s: checkbox 进行全选、反选操作

    NULL 博文链接:https://shupili141005.iteye.com/blog/667446

    checkbox:React的Material复选框实现

    道具Struts类型必需的默认描述checked 布尔不不明确的复选框是否被选中className 细绳不不明确的要添加的其他className disabled 布尔不错误的复选框是否被禁用id 细绳不uuidv1() 要添加到标签和复选框的ID label ...

    Struts html:checkbox框初始默认是选中的解决方法

    在使用struts标签html:checkbox 的时候,如何让checkbox框默认是选中的,一般情况下都是当Formbean里面该Property的值和标签上value给定的值相等的时候,生成的jsp页面上才是选中的。 在Struts中几种情况可以使标签...

    ZTree+Struts2+ajax+json实现checkbox权限树

    关键代码都在里面 资源是工程中的一部分 暂不能运行 原来用的是Java实现Json串 考虑到频繁访问数据库 就改成了存储过程

    复选框和Struts2后台交互代码详解

    主要介绍了复选框和Struts2后台交互代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Struts开发实例.rar

     7、Struts复选框的实现;  8、Struts下拉框的实现;  9、如何实现Struts 数据库应用程序;  10、如何在Struts 数据库应用程序中实现分页显示;  11、如何在Struts 数据库应用程序中实现记录的删除、更新及...

    struts2.0.jar

    · 状态复选框: Struts 2框架可自动跟踪复选框,如果缺少了某复选框,就会采用默认值false。因而,不像在Struts 1中,复选框不需要对false值进行特殊处理。 · 易于测试: Struts 2 Actions独立于HTTP,因而与框架...

    Struts开发实例

    7、Struts复选框的实现 8、Struts下拉框的实现 9、如何实现Struts 数据库应用程序 10、如何在Struts 数据库应用程序中实现分页显示 11、如何在Struts 数据库应用程序中实现记录的删除、更新及链接 12、如何在Struts ...

    extjs开发的权限系统(树形菜单复选框可级联选择)

    使用extjs+ibatis+spring+struts开发的权限系统 数据库mysql 数据库文件在开发文档目录下 动态树形菜单的加载 ,用户角色权限菜单的维护 jar文件删了一些,需要用的自己加包

    Struts2 实现部门员工管理

    使用Struts2实现部门员工两张表的增删改查 ,里面包含了对复选框,单选按钮,下拉框,密码框,文本域的操作。

    struts高级实战进阶

    传智播客的struts高级实战进阶 MVC模式的回顾 回顾Struts的请求处理时序图 ...使用复选框的技巧 使用下拉列表框的技巧 文件上传 DispatchAction的应用 Validator框架 Struts请求处理过程的源码分析与digester

    ParadiseTree

    因一个项目中用到了树结构的东西,所以自己写的一棵树,用struts做的,支持多种显示方式,如是否使用复选框,使用图片复选框还是网页复选框,树结点是否带连接,是否支持右健等等. 因为只是项目涉及到,所以树的通用性和...

    svelte-checkbox:Svelte的复选框组件(酷动画,可自定义)

    精巧的复选框 Svelte的复选框组件(酷动画,可自定义)。 安装 yarn add svelte-checkbox 用法 &lt; script &gt; import Checkbox from "svelte-checkbox" ; let checked = false ; &lt;/ script &gt; ...

    Struts中文手册[文字版][中文]

    e) 检查框和复选框标记.23 f) 文件标记.23 g) 单选钮标记.23 h) 隐藏标记.24 i) 密码标记.24 j) 选择标记.24 k) 选项标记 (这个元素需要嵌套在标记里)24 2.3.2. 显示错误信息的标记.25 2.3.3. 其他 HTML标记.26 2.4....

    Struts2入门教程(全新完整版)

    2.单选按钮和复选框: 41 3.三种方式实现下拉列表 41 4.二级联动 42 5.其它表单标签 44 6.其它常用标签的使用(代码参名为“补充”的文件夹下的tag.jsp) 45 七、国际化 47 1.action级别下的国际化 47 2.配置package...

    struts2与hibernate的整合实现数据的crud

    struts2与hibernate的整合实现数据的crud操作,还有复选框删除的实例,运用了Jquery的技术。 里面有使用需知,欢迎大家下载。

    非常好的struts2教程

    MVC模式的回顾 回顾Struts的请求处理时序图 使用超连接的技巧 封装Formbean数据时的...使用复选框的技巧 使用下拉列表框的技巧 文件上传 DispatchAction的应用 Validator框架 Struts请求处理过程的源码分析与digester

    react-toggle:用于React的美观,易用的切换组件。 还有一个美化的复选框

    还有一个美化的复选框。 请参阅。 道具 该组件具有以下道具。 Struts 类型 描述 checked 布尔值 如果为true ,则检查切换。 如果为false ,则未选中切换。 如果要将切换视为受控组件,请使用此选项 ...

Global site tag (gtag.js) - Google Analytics