Struts 实现动态单选按钮
2008-09-10 14:31
281 查看
在用户界面设计中,复选框组不如它的同类 —— 多行选择框那样流行。它们基本上做的是同一件事,即选择映射到单一 name 属性的一组选项。当在组中使用时,复选框执行的功能实际与多行选择框一样,但是它们占据的屏幕空间更多。当希望用户在选择一个或多个选项之前能够看到所有选项的时候,这会很有好处。
虽然在选项不多的时候,多行选择框通常提供更好的观感,但是当选择框必须动态呈现而且包含预选功能时,对企业应用程序来说复选框组会是更好的选择。幸运的是,使用 Struts 框架可以很容易地创建动态复选框组。
在这篇文章中,我将介绍一个简单的诀窍:用 Struts 的
我先从使用复选框元素显示简单的
请参阅 下载 获得完整的示例源代码。应当拥有跟随本文所需要的每样东西。如果需要下载 Struts 框架,请参阅 参考资料。
创建动态复选框
创建动态复选框的诀窍包含三个主要部分:
一个表单 bean,容纳复选框的
一个 JSP,带有一个表单,在需要的时候显示复选框。
一个简单的
请注意 “Himalayas” 示例非常简单。用来填充复选框的字段应当来自更复杂的模型,比如这样的模型,它能够标识用户,并选择要显示的字段,然后把业务对象认为需要的选项预先选中。我采用简单的模型是为了更好地演示 Struts 的用户界面功能。代码示例使用 JSP 脚本语言是为了表示清楚。
第 1 步. 创建表单 bean
我先从创建 Struts 表单 bean 开始,它包含填充复选框所需要的信息。请注意清单 1 中的 TestForm.java 包含了两个示例
除了代表初始选中的复选框,
清单 1 显示了 TestForm.java 的完整代码:
清单 1. TestForm.java
第 2 步. 编写 JSP 代码
接下来,我要编写页面的 JSP 代码,把 TestForm.java 的信息传递给视图层。在编写这个代码时,关键是要把对应的 Struts 标记库导入 JSP。清单 2 的 JSP 代码表示的是一个简单的表单,显示复选框中相应的框已经选中:
清单 2. 带有表单的 JSP
注意,我用 Struts
下一步是对
第 3 步. 编写 Action 类
最后一步是编写
清单 3. 表单的 Action
扩充 Himalayas
有了这个代码,工作就完成了,差不多可以展示成果了!用户现在可以提交 JSP 表单并在
清单 4. 复选框选择的结果
这个诀窍的工作方式
这个诀窍的关键是表单 bean 中的字段被传递到页面。查看相关 JSP 代码有助于澄清这点。一旦表单 bean 被实例化:
下一步为 Java 类的
使用
在这里可以看到
注意
扩展这个诀窍
通过使用 Struts
清单 5. 添加标签到动态复选框
注意,这里大的变化是用
结束语
Struts 对于复选框的动态呈现和预选提供了优秀的支持。这个诀窍是我合著 Struts Recipes 的原因 —— 那时我已经发现许多与 Struts 框架相关的理论和服务器端信息,但是用户界面编程多数被忽略了,或者被掩盖了。在上上下下找了一圈使用 Struts 创建复选框的诀窍之后,我放弃了,并自己写了一个。通过把不同的部分组合起来,我可以创建适合我的动态复选框系统。
您会注意到,代码示例被设置为适合用作不同用户界面小控件和布局想法的测试温床。实际上,我在书中的大多数用户界面示例中都使用了它,只需要调整
http://blog.csdn.net/baggio785/archive/2005/12/21/558760.aspx
虽然在选项不多的时候,多行选择框通常提供更好的观感,但是当选择框必须动态呈现而且包含预选功能时,对企业应用程序来说复选框组会是更好的选择。幸运的是,使用 Struts 框架可以很容易地创建动态复选框组。
在这篇文章中,我将介绍一个简单的诀窍:用 Struts 的
<html:multibox/>和
<logic:iterate/>标记在应用程序的视图层呈现大量条目,在本例中是 Java™ Server Page(JSP)。
我先从使用复选框元素显示简单的
String[]数组开始,数组中包含喜玛拉雅山的顶峰高度。然后,我将创建另外一个
String[]数组,包含
selectedMountains,代表已经选中的复选框。复选框的预选情况会在两个数组的交叉中产生。如果
selectedMountains的初始数组为空,那么所有复选框最初都会显示为未选中。
请参阅 下载 获得完整的示例源代码。应当拥有跟随本文所需要的每样东西。如果需要下载 Struts 框架,请参阅 参考资料。
创建动态复选框
创建动态复选框的诀窍包含三个主要部分:
一个表单 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 的完整代码:
清单 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 "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; } } |
接下来,我要编写页面的 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:reset/> </html:form> <%-- some more html code, etc... --> |
<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 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")); } } |
有了这个代码,工作就完成了,差不多可以展示成果了!用户现在可以提交 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"> |
mountains变量中的每个
mountain创建一个复选框。要做到这一点,我必须像下面这样在
String[]数组中迭代:
<logic:iterate id="mountain" property="mountains" name="testForm"> |
<logic:iterate>标记,我调用了
testFormbean 中的
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 显示了扩展的动态复选框诀窍:
清单 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类和我的模型去适合诀窍的需求而已。我还把它用在测试不同的想法上,这样就不用在我正在处理的应用程序内部花太多时间为某些东西编码了
http://blog.csdn.net/baggio785/archive/2005/12/21/558760.aspx
相关文章推荐
- 用 Struts 实现动态单选按钮
- 用 Struts 实现动态单选按钮
- 用 Struts 实现动态单选按钮
- 用Struts实现动态单选按钮
- JSP动态选择单选按钮(男或女),通过JSTL实现
- RadioButton单选按钮实现RadioGroup.OnCheckedChangeListener
- Struts实现多个文件上传(动态添加数量、前台仿163邮箱)
- javascript实现复选框实现单选按钮功能
- atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js
- 一步一步地实现菜单栏(JMenuBar)工具栏(JPopupMenu)组合框(JComboBox)复选框(JCheckBox)单选按钮(JRadioButton)文本域的综合应用(二)
- MFC中动态创建多个按钮并实现其消息响应
- IOS开发:单选按钮选择实现(存在多个按钮)
- Struts结合梅花雪实现动态生成树
- c#的动态按钮数组的添加与功能实现
- 【前端】vue.js实现按钮的动态绑定
- 【MFC动态创建按钮,并在按钮上实现位图的切换显示】
- android Button 切换背景,实现动态按钮和按钮颜色渐变
- onload实现动态控制页面按钮
- js jquery分别实现动态的文件上传操作按钮的添加和删除
- EXT2.3.0实现按钮动态改变tooltip