分享
 
 
 

Struts中用动态选择的元素创建复选框

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

在用户界面设计中,复选框组不如它的同类 —— 多行选择框那样流行。它们基本上做的是同一件事,即选择映射到单一 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 的完整代码:

清单 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;

}

}

第 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: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[] 数组,并使它可以用于页面:

清单 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"));

}

}

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

扩展这个诀窍

通过使用 Struts LabelVa

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有