﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java部落-文章分类-Struts</title><link>http://www.blogjava.net/ljm983/category/10027.html</link><description>广西百色地区Java部落</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:04:33 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:04:33 GMT</pubDate><ttl>60</ttl><item><title>Struts 的动态复选框  </title><link>http://www.blogjava.net/ljm983/articles/41125.html</link><dc:creator>罗罗</dc:creator><author>罗罗</author><pubDate>Fri, 14 Apr 2006 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/ljm983/articles/41125.html</guid><wfw:comment>http://www.blogjava.net/ljm983/comments/41125.html</wfw:comment><comments>http://www.blogjava.net/ljm983/articles/41125.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ljm983/comments/commentRss/41125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljm983/services/trackbacks/41125.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> 
<p><a href="http://www-128.ibm.com/developerworks/cn/java/j-sr3.html#author"><font color="#996699">Danilo Gurovich </font></a>, 首席工程师, Earthlink Inc.<br /></p><p>2005 年 11 月 28 日</p><p>在用户界面设计中，复选框组不如它的同类 —— 多行选择框那样流行。它们基本上做的是同一件事，即选择映射到单一 <i>name</i> 属性的一组选项。当在组中使用时，复选框执行的功能实际与多行选择框一样，但是它们占据的屏幕空间更多。当希望用户在选择一个或多个选项之前能够看到所有选项的时候，这会很有好处。</p><p>虽然在选项不多的时候，多行选择框通常提供更好的观感，但是当选择框必须动态呈现而且包含预选功能时，对企业应用程序来说复选框组会是更好的选择。幸运的是，使用 Struts 框架可以很容易地创建动态复选框组。</p><p>在这篇文章中，我将介绍一个简单的诀窍：用 Struts 的 <code>&lt;html:multibox/&gt;</code> 和 <code>&lt;logic:iterate/&gt;</code> 标记在应用程序的视图层呈现大量条目，在本例中是 Java™ Server Page（JSP）。</p><p>我先从使用复选框元素显示简单的 <code>String[]</code> 数组开始，数组中包含喜玛拉雅山的顶峰高度。然后，我将创建另外一个 <code>String[]</code> 数组，包含 <code>selectedMountains</code> ，代表已经选中的复选框。复选框的预选情况会在两个数组的交叉中产生。如果 <code>selectedMountains</code> 的初始数组为空，那么所有复选框最初都会显示为未选中。</p><p>请参阅 <a href="http://www-128.ibm.com/developerworks/cn/java/j-sr3.html#download"><font color="#996699">下载</font></a> 获得完整的示例源代码。应当拥有跟随本文所需要的每样东西。如果需要下载 Struts 框架，请参阅 <a href="http://www-128.ibm.com/developerworks/cn/java/j-sr3.html#resources"><font color="#996699">参考资料</font></a>。</p><p><a name="IDAHEAX"><span class="atitle"><font size="4">创建动态复选框</font></span></a></p><p>创建动态复选框的诀窍包含三个主要部分：</p><ul><li>一个表单 bean，容纳复选框的 <code>String[]</code> 数组和表示选中复选框的 <code>String[]</code> 数组。<br /><br /></li><li>一个 JSP，带有一个表单，在需要的时候显示复选框。<br /><br /></li><li>一个简单的 <code>Action</code> 类，从表单页面转到显示页面。</li></ul><p>请注意 “Himalayas” 示例非常简单。用来填充复选框的字段应当来自更复杂的模型，比如这样的模型，它能够标识用户，并选择要显示的字段，然后把业务对象认为需要的选项预先选中。我采用简单的模型是为了更好地演示 Struts 的用户界面功能。代码示例使用 JSP 脚本语言是为了表示清楚。</p><p><a name="IDAFFAX"><span class="atitle"><font size="4">第 1 步. 创建表单 bean</font></span></a></p><p>我先从创建 Struts 表单 bean 开始，它包含填充复选框所需要的信息。请注意清单 1 中的 TestForm.java 包含了两个示例 <code>String[]</code> 数组变量的 getter 和 setter。数组 <code>mountains</code> 代表示例复选框的 <i>全部选项</i>，数组 <code>selectedMountains</code> 代表预选的在浏览器中显示为选中的元素。</p><p>除了代表初始选中的复选框，<code>selectedMountains</code> 还代表处理表单时，由用户选中的复选框。（它只代表最终选中的元素。）当请求页面时，会显示复选框。当我在它们之间迭代时，与 <code>selectedMountains</code> 匹配的复选框元素就是选中的元素。 </p><p>清单 1 显示了 TestForm.java 的完整代码： </p><p><br /><a name="IDAIGAX"><b>清单 1. TestForm.java</b></a><br /></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">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[]
<span class="boldcode"><strong>selectedMountains</strong></span>
=
{"Everest","K2","Lhotse"};

/*the ten tallest Mountains to iterate through*/
private String[]
<span class="boldcode"><strong>mountains</strong></span>
=
{"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;
}
}
</font></code></pre></td></tr></tbody></table><p><a name="IDARGAX"><span class="atitle"><font size="4">第 2 步. 编写 JSP 代码</font></span></a></p><p>接下来，我要编写页面的 JSP 代码，把 TestForm.java 的信息传递给视图层。在编写这个代码时，关键是要把对应的 Struts 标记库导入 JSP。清单 2 的 JSP 代码表示的是一个简单的表单，显示复选框中相应的框已经选中：</p><p><br /><a name="IDA0GAX"><b>清单 2. 带有表单的 JSP </b></a><br /></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%&gt;
&lt;%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%&gt;
&lt;%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%&gt;

&lt;%-- html code, etc... --&gt;

&lt;<span class="boldcode"><strong>html:form</strong></span>
action="/FormAction" 
name="testForm"
type="com.strutsrecipes.CheckboxTestForm"&gt;

<span class="boldcode"><strong>&lt;h4&gt;&lt;bean:message key="testForm.instruction"/&gt;&lt;/h4&gt;</strong></span>

&lt;logic:iterate name="testForm" 
property="<span class="boldcode"><strong>mountains</strong></span>" 
id="<span class="boldcode"><strong>mountain</strong></span>"&gt;

&lt;%-- create the checkbox and selected attribute --&gt;
&lt;html:multibox property="<span class="boldcode"><strong>selectedMountains</strong></span>"&gt;
&lt;bean:write name="<span class="boldcode"><strong>mountain</strong></span>"/&gt;
&lt;/html:multibox&gt;

&lt;%-- create the label, note that "br" tag will format it vertically --&gt;
&lt;bean:write name="<span class="boldcode"><strong>mountain</strong></span>"/&gt;&lt;br/&gt;

&lt;/logic:iterate&gt;

&lt;br/&gt;
&lt;html:submit/&gt;&lt;html:reset/&gt;

&lt;/html:form&gt;

&lt;%-- some more html code, etc... --&gt;
</font></code></pre></td></tr></tbody></table><br /><p>注意，我用 Struts <code>&lt;bean:message/&gt;</code> 标记表示文本，用 <code>&lt;html:multibox/&gt;</code> 表示 HTML 复选框，用 <code>&lt;logic:iterate/&gt;</code> 标记在数组中迭代并创建相应内容。我的表单在 JSP 中通过 <code>&lt;html:form/&gt;</code> 标记被实例化。 </p><p>下一步是对 <code>&lt;logic:iterate/&gt;</code> 标记中的 <code>mountains</code> 字段进行迭代。在这么做的时候，我创建了一个变量（<code>mountain</code>），用它来填充复选框，并用 <code>&lt;bean:write/&gt;</code> 标记给它一个标签。要在复选框中创建 <code>selected</code> 属性，我要再次使用 <code>&lt;logic:iterate/&gt;</code> 和 <code>&lt;html:multibox/&gt;</code> 标记。<code>&lt;html:multibox/&gt;</code> 标记中的 <code>property</code> 属性由 <code>selectedMountains</code> 字段填充。当 <code>selectedMountains</code> 等于 <code>mountain</code> 时，<code>selectBox</code> 就是选中的。</p><p><a name="IDAYBIX"><span class="atitle"><font size="4">第 3 步. 编写 Action 类</font></span></a></p><p>最后一步是编写 <code>Action</code> 类。清单 3 比起其他清单，做的事并不多。我做的只是得到 <code>selectedMountains</code> 的 <code>String[]</code> 数组，并使它可以用于页面： </p><p><br /><a name="IDAOCIX"><b>清单 3. 表单的 Action</b></a><br /></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">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 =
<span class="boldcode"><strong>((CheckboxTestForm) form).getSelectedMountains()</strong></span>
;

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"));
}
}
</font></code></pre></td></tr></tbody></table><p><a name="IDAVCIX"><span class="atitle"><font size="4">扩充 Himalayas</font></span></a></p><p>有了这个代码，工作就完成了，差不多可以展示成果了！用户现在可以提交 JSP 表单并在 <code>Action</code> 类引用的对应页面中查看结果。清单 4 中的代码段显示了用户在简单 JSP 页面的表单中选中的复选框列表：</p><p><br /><a name="IDADDIX"><b>清单 4. 复选框选择的结果</b></a><br /></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%&gt;
&lt;%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%&gt;
&lt;%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%&gt;

&lt;%-- html code, etc... --&gt;

&lt;logic:iterate id="mountain" property="mountains" name="testForm"&gt;
&lt;bean:write name="mountain"/&gt;&lt;br/&gt;
&lt;/logic:iterate&gt;
&lt;hr size=5 color="black"/&gt;

&lt;%-- some more html code, etc... --&gt;
</font></code></pre></td></tr></tbody></table><p></p><p><a name="IDAIDIX"><span class="atitle"><font size="4">这个诀窍的工作方式</font></span></a></p><p>这个诀窍的关键是表单 bean 中的字段被传递到页面。查看相关 JSP 代码有助于澄清这点。一旦表单 bean 被实例化：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;html:form action="/FormAction" 
name="<span class="boldcode"><strong>testForm</strong></span>"
type=" <span class="boldcode"><strong>com.strutsrecipes.CheckboxTestForm</strong></span>"&gt;
</font></code></pre></td></tr></tbody></table><br /><p>下一步为 Java 类的 <code>mountains</code> 变量中的每个 <code>mountain</code> 创建一个复选框。要做到这一点，我必须像下面这样在 <code>String[]</code> 数组中迭代：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;logic:iterate id="<span class="boldcode"><strong>mountain</strong></span>"
property="<span class="boldcode"><strong>mountains</strong></span>" 
name="<span class="boldcode"><strong>testForm</strong></span>"&gt;
</font></code></pre></td></tr></tbody></table><br /><p>使用 <code>&lt;logic:iterate&gt;</code> 标记，我调用了 <code>testForm</code> bean 中的 <code>getMountains()</code> 方法。它在这个数组中迭代，并把每个值作为已经命名的 <code>pageContext()</code> 级的 String <code>mountain[]</code> 数组变量返回（即 <code>id="mountain"</code>）。 </p><p>在这里可以看到 <code>&lt;html:multibox/&gt;</code> 标记的效果以及如何显示它：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;html:multibox property="selectedMountains"&gt;
&lt;bean:write name="mountain"/&gt;
&lt;/html:multibox&gt;
&lt;bean:write name="mountain"/&gt;&lt;br/&gt;
</font></code></pre></td></tr></tbody></table><br /><p>注意 <code>property</code> 属性被 <code>selectedMountains</code> 填充，这是我选中的变量。当这个变量与 <code>&lt;html:multibox/&gt;</code> 值（即 multibox 标记中的 <code>&lt;bean:write/&gt;</code>）对应时，在呈现表单的时候它就表现为选中。如果用户选中表单或取消选中，那么新的 <code>selectedMountains</code> 值就被发送给 <code>Action</code> 类进行处理。这个迭代中的第二个 <code>&lt;bean:write/&gt;</code> 标记创建该标记使用的标签，后面跟着 <code>&lt;br/&gt;</code> 标记，让视图在一长列中显示这些标记。 </p><p><a name="IDAUGIX"><span class="atitle"><font size="4">扩展这个诀窍</font></span></a></p><p>通过使用 Struts <code>LabelValueBean</code> 类代替简单的 <code>String[]</code> 数组，可以对动态复选框这个诀窍进行扩展，从而为复选框创建不同的标签。先从添加 <code>LabelValueBeans</code> 到 <code>java.util.List</code> 开始。然后对列表进行迭代，把 <code>LabelValueBeans</code> 标签和值释放到适当的位置。这个略微复杂的诀窍与动态复选框诀窍的效果相同，但是它的结果更适合实际的用户界面设计。清单 5 显示了扩展的动态复选框诀窍：</p><p><br /><a name="IDASHIX"><b>清单 5. 添加标签到动态复选框</b></a><br /></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;logic:iterate id="<span class="boldcode"><strong>mountainlb</strong></span>" 
property="mountainslb" 
name="testForm"&gt;

&lt;bean:define id="<span class="boldcode"><strong>mountainbean</strong></span>" 
name="<span class="boldcode"><strong>mountainlb</strong></span>
"type="<span class="boldcode"><strong>org.apache.struts.util.LabelValueBean</strong></span>"/&gt;

&lt;html:multibox property="selectedMountains"&gt;
&lt;bean:write name="mountainbean" 
property="<span class="boldcode"><strong>value</strong></span>"/&gt;
&lt;/html:multibox&gt;
&lt;bean:write name="mountainbean" 
property="<span class="boldcode"><strong>label</strong></span>"/&gt;&lt;br/&gt;

&lt;/logic:iterate&gt;
</font></code></pre></td></tr></tbody></table><br /><p>注意，这里大的变化是用 <code>&lt;bean:define/&gt;</code> 在迭代的时候创建 <code>LabelValueBean</code>。然后用 <code>&lt;bean:write/&gt;</code> 输出每个 <code>mountainbean</code> 的属性（即 <code>org.apache.struts.util.LabelValueBean</code> 类的 <code>getLabel()</code> 和 <code>getValue()</code> 方法）。 </p><p><a name="IDAEJIX"><span class="atitle"><font size="4">结束语</font></span></a></p><p>Struts 对于复选框的动态呈现和预选提供了优秀的支持。这个诀窍是我合著 <i>Struts Recipes</i> 的原因 —— 那时我已经发现许多与 Struts 框架相关的理论和服务器端信息，但是用户界面编程多数被忽略了，或者被掩盖了。在上上下下找了一圈使用 Struts 创建复选框的诀窍之后，我放弃了，并自己写了一个。通过把不同的部分组合起来，我可以创建适合我的动态复选框系统。</p><p>您会注意到，代码示例被设置为适合用作不同用户界面小控件和布局想法的测试温床。实际上，我在书中的大多数用户界面示例中都使用了它，只需要调整 <code>Action</code> 类和我的模型去适合诀窍的需求而已。我还把它用在测试不同的想法上，这样就不用在我正在处理的应用程序内部花太多时间为某些东西编码了</p><p><span class="atitle"><a name="download"><font size="4">下载</font></a></span></p><p></p><table class="data-table-1" cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><th>描述</th><th>名字</th><th style="TEXT-ALIGN: right">大小</th><th> 下载方法</th></tr><tr><td class="tb-row">Sample code</td><td nowrap="">j-sr3-source.zip</td><td style="TEXT-ALIGN: right" nowrap="">3249 KB             </td><td nowrap=""><p> <a class="fbox" href="ftp://www6.software.ibm.com/software/developer/library/j-sr3-source.zip"><b><font color="#5c81a7">FTP</font></b></a></p></td></tr></tbody></table><p></p><p>相关信息：<a href="http://blog.csdn.net/baggio785/archive/2005/12/21/558770.aspx"><font color="#000080">用 Struts 实现动态单选按钮</font></a></p></span>
<img src ="http://www.blogjava.net/ljm983/aggbug/41125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljm983/" target="_blank">罗罗</a> 2006-04-14 16:54 <a href="http://www.blogjava.net/ljm983/articles/41125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>