﻿<?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-铁手剑谱-随笔分类-Struts系列</title><link>http://www.blogjava.net/steelhand/category/1170.html</link><description>&lt;strong&gt;上善若水&lt;/strong&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:49:24 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:49:24 GMT</pubDate><ttl>60</ttl><item><title>Struts Classic 的变迁（下），从1.1到1.2</title><link>http://www.blogjava.net/SteelHand/archive/2005/12/28/25731.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 28 Dec 2005 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/12/28/25731.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/25731.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/12/28/25731.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/25731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/25731.html</trackback:ping><description><![CDATA[


<meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>Untitled Document</title>


<h1>Struts1.2.4</h1>
<h2>新特征</h2>
<h3>主要修改：</h3>
<p><strong>不赞成特征</strong><strong> </strong><br>
  Struts1.1中已经有很多构造不再赞成使用。许多已经被删除了。所以在升级到1.2.4时，请clean-compile 你的应用，并且使deprecation warnings 被打开。在升级到1.2.4之前强烈建议解决所有decprecated 的用法。最可能应用开发人员的用法是： </p>
<ol>
  <ol>
    <li>org.apache.struts.Action  statics: 如今使用org.apache.struts.Global statics </li>
    <li>Action.perform:  如今使用Action.execute</li>
  </ol>
</ol>
<p>虽然没有被删除也没有被标明为不赞成使用，最好还是将ActionErrors 替换为ActionMessages 以确保正确的操作。 <br>
    <strong>TagUtils </strong><strong>和</strong><strong>ModuleUtils</strong><br>
  许多以前在org.apache.struts.utils.RequestUtils中找到的工具方法如今移动到了org.apache.struts.taglibs.TagUtils 或org.apache.struts.utils.ModuleUtils包中。 <br>
  <strong>GenericDataSource  / GenericConnection </strong><strong>实现被删除</strong><strong> </strong><br>
  datasources  manager 仍然支持，但是我们自己的datasource <em>implementation</em>is 并不被支持。很欢迎你插入自己的DataSource 实现，但是我们没有资源来维护我们自己的实现。如果你的容器不支持DataSource实现，推荐使用Jakarta Commons的 DBCP package。 <br>
  <strong>Validator </strong><strong>增强</strong><strong> </strong></p>
<ol>
  <li>ValidWhen </li>
</ol>
<p>Struts Validator 如今支持ValidWhen  规则，以便一个验证可以依赖于另一个验证。</p>
<ol>
  <li>IntRange  现在可以检测select-one 和radio 字段。比如：这使得我们可以使用一些有效的选项加上一个具有诸如"Choose one" 标题并且值为"-1"的附加选项来组装一个组合框。那么当用户试图提交一个表单时，你可以检测值是否为-1，从而决定是否没有选择选项。 </li>
  <li>你现在可以强制进行客户端Javascript  验证来检测所有约束，而不是停留在第一个错误之处。方法是设置Validator PlugIn上的一个新的属性stopOnFirstError为false。<a href="http://struts.apache.org/struts-doc-1.2.4/userGuide/dev_validator.html#stopOnFirstError"></a> </li>
  <li>"required"  验证现在可以检测checkboxes, radio,select-one, 和 select-multiple 字段类型。参见修改后的Validator 示例来看如何使用这些新的特征。 </li>
  <li>一个标准的validateUrl 规则可以让你能够检测某一个属性是否包含一个格式正确的URL。 </li>
</ol>
<p><strong>DigestingPlugIn</strong><br>
  一个新的标准PlugIn 可以帮助你在application范围内创建你自己的对象图（object graph）。这是创建供Action调用的业务对象的快捷方式。请参见最新的MailReader 示例来看如何使用DigestingPlugin。 <br>
  <strong>ModuleConfigVerifier</strong><br>
  虽然不是全新的，一个标准类，用来验证模块配置，位于PlugIn 包。ModuleConfigVerifier  主要确认Struts对象图的各中组件被载入。但是，开发人员可扩展此类来检查确保Struts 配置文件的内部一致性。 <br>
  <strong>提供了支持Maven的项目文件</strong>.<br>
  <strong>新的配置</strong><strong>DTD</strong><br>
  推荐使用<a href="http://struts.apache.org/dtds/struts-config_1_2.dtd">struts-config_1_2.dtd</a>。新的DTD 添加了两个新的元素&lt;display-name&gt;  和 &lt;description&gt; 到struts-config 元素中。这些元素可用于struts配置文件工具和文档产生工具。在Struts 1.2.x 中，已有的Struts 配置文件可以使用两个版本的DTD 都可载入。 <br>
  <strong>新的</strong><strong>Taglib URIs</strong><br>
  标签库的URI已经被修改已反映Struts从Jakarta 移到了Apache  的顶级项目。为了兼容，使用旧的URI的TLD仍然有效，但是鼓励使用新的URI。 <br>
  <strong>Struts-Chain</strong> <br>
  试验性的，这个新的"contrib" package 使用了Jakarta Sandbox中的Responsibilty  package 的Chainin 来创建一个新的RequestProcessor的Breed。未来版本可能会成为默认实现。.<br>
  <strong>MappingDispatchAction</strong><br>
  一个新的标准Action，将控制转发到ActionMapping 参数命名的一个方法。 <br>
  <strong>Cancel  handlers</strong><br>
  DispatchAction,  LookupDispatchAction, 和  MappingDispatchAction ，如今提供了默认的可以覆写的cancel  handler。也可以指定默认的handler name。 <br>
  <strong>Session-scoped  ActionMessages</strong><br>
  现在你可以将ActionMessages 保存在session 中and  have them cleaned up after the first use。现在除了Action.saveMessages() 将消息保存在session中还有了另外一种选择。在消息已经被访问过一次之后ActionMessages.isAccessed() 返回true。RequestProcessor.processCachedMessages()  查询isAccessed() 已决定是否应该将消息从session中删除。 <br>
  <strong>JA Mailreader</strong><br>
  Struts  Mailreader Example 应用现在包含Japanese 资源文件。 <br>
  <strong>Tiles EL</strong><br>
  Tiles tags 如今可以通过Struts EL taglib使用EL，后者基于JSTL。 <br>
  <strong>Wildcard  Mappings</strong><br>
  现在可以在actiponMapping中使用通配符。详细信息参见Struts Mailreader Example application。 <br>
  <strong>Action  attributes</strong><br>
  html img tag 添加了Action 属性，以匹配html link tag。 <br>
  <strong>Module  attribute</strong><br>
  Forward元素以及多个核心标签中新增一个"module" 属性。这个属性允许你通过名称（或者前缀）指定另一个模块来创建模块间的直接链接。新的module 属性优于contextRelative属性，并且可以常用于"SwitchAction"中。 </p>
<h1>Struts 1.2.7</h1>
<h2>主要修改</h2>
<h3>依赖性</h3>
<p>Struts 对下列组件的依赖性发生了改变： </p>
<table border="1" cellpadding="0" cellspacing="0">
  <tbody><tr>
    <td valign="top" width="340"><br>
      依赖性 </td>
    <td valign="top" width="340"><p>新的版本</p></td>
  </tr>
  <tr>
    <td valign="top" width="340"><p>Commons BeanUtils</p></td>
    <td valign="top" width="340"><p>Version 1.7.0</p></td>
  </tr>
  <tr>
    <td valign="top" width="340"><p>Commons Digester</p></td>
    <td valign="top" width="340"><p>Version 1.6</p></td>
  </tr>
  <tr>
    <td valign="top" width="340"><p>Commons Validator</p></td>
    <td valign="top" width="340"><p>Version 1.1.4</p></td>
  </tr>
  <tr>
    <td valign="top" width="340"><p>Commons Collections</p></td>
    <td valign="top" width="340"><p>removed</p></td>
  </tr>
  <tr>
    <td valign="top" width="340"><p>Commons Lang</p></td>
    <td valign="top" width="340"><p>removed</p></td>
  </tr>
</tbody></table>
<h3>Core Struts</h3>
<h4>Saving Messages in the Session</h4>
<p>在action也新增了一个方法[saveErrors(HttpSession, ActionMessages)]来将<em>errors</em> 保存在Session 中，并且在其第一次被访问之后被自动从Session中删除。这是等同于1.2.4 中message上新增的功能。 </p>
<h4>Re-directing ActionForward</h4>
<p><em>ActionRedirect</em> 是ActionForward  的一个子类，其设计来用于重定向请求，支持在运行时添加参数。 </p>
<h4>Download Action</h4>
<p><em>DownloadAction</em> 是一个提供了下载文件的具体细节的抽象Action。 </p>
<h4>Dispatch Helper</h4>
<p><em>ActionDispatcher</em> 是一个提供<em>DispatchAction</em> 类型的行为但是不必继承自<em>DispatchAction</em>。 </p>
<h4><em>Lazy</em> Validator Form</h4>
<p><em>DynaBean</em> 风格的ActionForm，它不需要其属性被定义，并提供<em>Lazy List</em> 和<em>Lazy Map</em> 行为。 </p>
<h4>jars 中的配置文件 </h4>
<p>配置文件(如. Struts config, Validator config 和 Tiles 配置文件)现在可以被保存在jars。Struts 会像以前一样检查servlet context，但是如果没找到， Struts 会尝试classloader 去查找。 </p>
<h3>Tag Library 改变</h3>
<h4>Highlighting Errors</h4>
<p>Struts现在可以使用HTML Input Tags上的<em> errorKey</em>, <em>errorStyle</em>, <em>errorStyleClass</em> 和 <em>errorStyleId</em> 属性自动高亮错误字段。 </p>
<h4>Readonly / Disabled Forms</h4>
<p>现在可以使用&lt;html:form&gt;  tag的<em>readonly</em> 和<em>disabled</em>属性来禁止或者使全部的字段只读。<br>
    <strong>N.B. </strong><em>readonly</em> 属性只影响&lt;html:text&gt;,  &lt;html:textarea&gt; 和 &lt;html:password&gt; as per the HTML 4 specification。 </p>
<h4>HTML Tag Refactoring</h4>
<p>许多<em>HTML</em>标签都被重构了，以便更易使用。</p>
<ol>
  <li><strong>添加了prepareOtherAttributes()</strong> 方法- 刚好在关闭元素之前调用，提供一个地方来渲染额外的属性。</li>
  <li><em>name</em> 属性渲染如今在<strong>prepareName()</strong> 方法中，以便更易提供定制行为。</li>
  <li><em>value</em> 属性如今在<strong>prepareValue()</strong> 方法中以便更易提供定制行为。</li>
  <li>当渲染一个属性时，这些标签现在使用属性的<em>getter</em> 而不是直接使用实际的属性，这意味着如果你想，比如覆盖TextTag的 <em>styleClass</em> ，那么一个选择是覆盖getStyleClass()方法。</li>
  <li>属性的渲染现在使用一个简单的 <strong>prepareAttribute()</strong> 方法来产生<em>name="attribute"</em> 格式，使多数属性渲染一个一行语句。</li>
</ol>
<h4>Bundle Attribute</h4>
<p><em>bundle</em> 属性被添加到了下列标签：ButtonTag, CancelTag,  CheckboxTag, FileTag, FrameTag, HiddenTag, LinkTag, MultiboxTag, PasswordTag,  RadioTag, ResetTag, SelectTag, SubmitTag, TextTag, TextareaTag。 </p>
<h4>ErrorTag</h4>
<p>现在新增了<strong>header</strong>, <strong>footer</strong>, <strong>prefix</strong>, <strong>suffix</strong><strong>属性。</strong> </p>
<h3>Validator</h3>
<h4>Resource Bundle Support</h4>
<p>Validator 配置文件中(e.g. <em>validation.xml</em>)的&lt;msg&gt; 和 &lt;arg&gt; 元素的<em>bundle</em> 属性现在随同&lt;msg&gt; 的<em>resource</em> 属性一起得到支持。 <br>
    <em>struts-examples</em> webapp 中添加了新的页面来展示对<em>Resource Bundle </em><em>的支持。</em> </p>
<h1>Struts1.2.8</h1>
<h2>主要改变</h2>
<p>Struts 1.2.8 的主要改变是修正了<em>Cross Site Scripting</em> (XSS) 弱点。 </p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/SteelHand/aggbug/25731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-12-28 15:41 <a href="http://www.blogjava.net/SteelHand/archive/2005/12/28/25731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts Classic 的变迁（上），从1.0到1.1</title><link>http://www.blogjava.net/SteelHand/archive/2005/12/28/25728.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 28 Dec 2005 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/12/28/25728.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/25728.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/12/28/25728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/25728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/25728.html</trackback:ping><description><![CDATA[

<u><font color="#ff0000"><i>最近在编写Struts教程的时候，把Struts1.1到1.2的个版本变化总结了一下，希望能够从整体上把握它的变迁脉络，在开发和维护的时候也可以参考参考</i>。</font></u><br><br><br><br>


<h1>Struts1.1的修改</h1>
<h2>新特征</h2>
<h3>引入新的配置DTD</h3>
<p>Struts 1.0 的配置DTD 已经不赞成使用，引入了新的struts-config_1_1.dtd。在Struts 1.1 中，已有的Struts 配置文件可以使用这两个版本的DTD载入。 </p>
<h3>新的Commons 包依赖性</h3>
<p>在Struts中使用了多个Apache Jarkarta commons的组件，而Commons组件并不仅仅可以用来构建Struts应用。在Struts1.1中，所使用的Commons组件已经重构来外部依赖于Jarkarta Commons项目，而不是1.0中的内部版本。 <br>
  下面的Commons包包括了对相应的Struts 1.0 中的类的替代： </p>
<ol>
  <li><strong>BeanUtils </strong>[org.apache.commons.beanutils]： </li>
  <ol>
    <li>org.apache.struts.utils.BeanUtils</li>
    <li>org.apache.struts.utils.ConvertUtils</li>
    <li>org.apache.struts.utils.PropertyUtils.</li>
  </ol>
  <li><strong>Collections </strong>[org.apache.commons.collections]</li>
  <ol>
    <li>org.apache.struts.util.ArrayStack</li>
    <li>org.apache.struts.util.FastArrayList</li>
    <li>org.apache.struts.util.FastHashMap</li>
    <li>org.apache.struts.util.FastTreeMap.</li>
  </ol>
  <li><strong>Digester </strong>[org.apache.commons.digester]</li>
  <ol>
    <li>org.apache.struts.digester.*.</li>
  </ol>
</ol>
<p>下面这几个包现在仍然被Struts框架的各种组件使用： </p>
<ol>
  <li><strong>FileUpload </strong>[org.apache.commons.fileupload]</li>
  <li><strong>Logging </strong>[org.apache.commons.logging]</li>
  <li><strong>Validator </strong>[org.apache.commons.validator]</li>
</ol>
<h3>XML解析器</h3>
<p><strong>另外，</strong>Struts 1.1 需要符合JAXP/1.1 (而不是JAXP/1.0)  API的XML解析器，比如JAXP/1.1 参考实现和Xerces 1.3.1+。 </p>
<h3>源代码</h3>
<p>如果需要从源代码开始构建Struts，请使用Ant  1.4 以上版本。 </p>
<h3>集成Struts Validator</h3>
<p>一个新的Commons Validator组件被集成到Struts 1.1中，包含在新的Validator包中。 </p>
<h3>Tiles </h3>
<p>引入了一个新的JSP模板组装机制Tiles，通过标签库提供集成。 </p>
<h3>Nested </h3>
<p>Nested taglib 绑定到了Struts1.1中，增强了现有Struts标签的功能。 </p>
<h3>新的示例应用</h3>
<p>Struts1.1发布包中包括了针对Validator 和Tiles的新的示例。 </p>
<h3>新的可选组件</h3>
<p>CVS源代码库中新增了一个目录contrib，包含了很有用的，但是没有集成到标准代码基中的扩展。 </p>
<ol>
  <li>Scaffold  – 一个对Commons Scaffold 工具包扩展，旨在提供可重用的构建Web应用的类 </li>
  <li>Struts-EL  – 可选的Struts-EL taglib 使得在Struts 中使用JSTL更加容易。(需要Servlet 2.3 +容器支持)</li>
</ol>
<h3>Action 包的增加</h3>
<p>基本的控制器框架 [org.apache.struts.action]新增了一下特征： </p>
<ol>
  <li>ActionServlet  现在提供了对模块化应用的支持，并且新增了多个扩展点。 </li>
  <li>新增了一个ActionMessages 类，支持ActionErrors功能的一个超集，可以用于通用的消息收集传递，不仅仅针对errors。 </li>
</ol>
<h3>Upload 包</h3>
<p>文件上传类[org.apache.struts.upload]新增了一下特征： </p>
<ol>
  <li>CommonsMultipartRequestHandler：这个新类使用Jakarta Commons FileUpload 包实现了文件上传。这也是Struts的默认文件上传实现。 </li>
</ol>
<h3>Util 包</h3>
<p>工具（utility）类  [org.apache.struts.util]新增了以下特征： </p>
<ol>
  <li>LocalStrings:  修正了与可替换参数相关的消息，以便它不会添加一个外来的无关的字符。 </li>
  <li>LabelValueBean:  一个新类，定义了一个名值对的集合，可以用在&lt;html:options&gt; 和&lt;html:optionsCollection&gt;标签，或者其它地方。 </li>
  <li>MessageResources:  转移包含在特定消息字符串中的单引号。 </li>
  <li>computeParameters:  允许事务令牌是唯一的参数。 </li>
  <li>RequestUtils:  在构建一个查询字符串时，修改来编码一个&amp;号。 </li>
</ol>
<h3>Bean Taglib </h3>
<p><em>struts-bean</em> 标签库[org.apache.struts.taglib.bean]中新增了以下特征： </p>
<ol>
  <li>&lt;bean:write&gt;：加入了format, locale 和  bundle 属性以支持根据用户当前场所进行格式化的功能，格式化来自属性或者来自字符串资源的字符串。 </li>
  <li>&lt;bean:cookie&gt;,  &lt;bean:header&gt;, 或&lt;bean:parameter&gt;：纠正了在标签使用"multiple"属性时，所产生的脚本变量类型。 </li>
  <li>&lt;bean:message&gt;：加入了name, property, 和scope  属性，以便消息资源key 可以动态地从一个bean 或者bean 属性获得。 </li>
</ol>
<h3>HTML Taglib</h3>
<p><em>struts-html</em> [org.apache.struts.taglib.html]加入了如下新特征： </p>
<ol>
  <li>&lt;html:link&gt;:  添加了'action' 属性 </li>
  <li>&lt;html:options&gt;:  如果'property' 属性制定的属性（property）返回null，现在标签将抛出一个错误消息指名实际问题而不是造成NPE。 </li>
  <li>&lt;html:option&gt;  和 &lt;html:options&gt;：添加了'style' 和'styleClass'  属性。 </li>
  <li>&lt;html:optionsCollection&gt;：新标签。提供了一个更清晰的方式来从集合组装HTML options。 </li>
  <li>&lt;bean:message&gt;：添加了'name', 'property' 和'scope'  属性，以便消息资源key 可以动态地从bean获得。 </li>
  <li>&lt;html:messages&gt;：新标签。可以通过新的ActionMessages 类中的一个消息集合进行迭代。 </li>
  <li>ActionForm：现在，此标签在它初始化ActionForm Bean的时候会调用reset() 方法。它也要求被标签所实例化的bean 是ActionForm  的一个子类。 </li>
  <li>&lt;html:image&gt;：添加了'align' attribute。 </li>
  <li>&lt;html:img&gt;：添加了mouse 事件属性('onclick',  'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove',  'onmouseout')。 </li>
  <li>SubmitTag,  SelectTag, LinkTag.java, CheckboxTag, ButtonTag, ImageTag, RadioTag, 和TextArea 标签： 添加了indexed 属性。 </li>
</ol>
<h3>Logic Taglib</h3>
<p><em>struts-logic</em> 标签库[org.apache.struts.taglib.logic]加入了如下新特征： </p>
<ol>
  <li>&lt;logic:empty&gt;  和&lt;logic:notEmpty&gt;：新标签。类似于&lt;logic:present&gt; 和&lt;logic:notPresent&gt;，但对空字符串的处理不同。 </li>
</ol>
<h3>Template Taglib </h3>
<p>无变化，但无赞成使用。推荐使用Tiles.<strong> </strong></p>
<h2>运性层面的改变</h2>
<h3>加入了Config Package</h3>
<ol>
  <li>ControllerConfig：添加了inputForward 属性以指示ActionMapping.input是一个forward 而不是URI。 </li>
  <li>ControllerConfig：添加了forwardPattern 和inputPattern  到help 应用面模块的管理页面目录 </li>
  <li>添加了一个新的包以提供更多的灵活性来支持控制器配置和多模块应用的支持。 </li>
</ol>
<h3>Action 包<br></h3>
<p>基本框架(org.apache.struts.action)进行了如下修改或者修正： </p>
<ol>
  <li>Action  类中的所有常数：不赞成使用。提取到新的Globals类中。 </li>
  <li>ActionMapping：如果模块的ControllerConfig bean  [org.apache.struts.config.ControllerConfig]的inputForward  设置为true，input  属性将引用一个ActionForward 而不是模块相对的路径。 </li>
  <li>ActionServlet：添加了convertNull 参数以在组装Form时仿真Struts 1.0 行为。如果设置为true，数值numeric Java  wrapper 类类型 (如java.lang.Integer)  将默认为null (而不是0)。 </li>
  <li>ActionServlet：添加了"config/$foo" 参数，不赞成使用包中的其他参数。 </li>
  <li>ActionForms  和相关类：为了保存资源，现在在响应toString请求的时候使用一个StringBuffer。 </li>
  <li>LookupDispatchAction：添加的新的标准Action，以帮助在国际化的按钮之间进行选择。 </li>
  <li>ActionForm  类：修改来使用ActionServletWrapper 而不是暴露ActionServlet。 </li>
  <li>ActionServletWrapper  类：添加的新类，用于ActionForm，以防止ActionServlet 的公开字符串属性被通过查询字符串改写。 </li>
  <li>Action.MAPPING_KEY的 request 属性： 如果没有指定form bean，无条件地将选择的mapping 传递为请求属性("org.apache.struts.action.mapping.instance")。 </li>
  <li>ActionServlet:避免了在初始化Servlet失败的时候导致的NullPointerException。 </li>
  <li>ActionForm  类：现在是真正的serializable，因为两个非serializable 的实例变量(servlet 和multipartRequestHandler) 已经成为transient。但是，如果你的确需要序列化和解序列化这个实例，你要自己负责重设这两个属性。 </li>
  <li>ActionMessages  和ActionErrors：The initial order a property/key is added in is  now retained.</li>
  <li>processActionForward():  不赞成，推荐使用processForwardConfig</li>
</ol>
<h3>Upload包</h3>文件上传 (package org.apache.struts.upload) [ Upload 应用的一部分]作了如下修改和修正： 
<ol>
  <li>CommonsMultipartRequestHandler：基于Jakarta Commons FileUpload 包的文件上传的新实现。这个新实现如今是默认实现。 </li>
  <li>BufferedMultipartInputStream：解决了丢失字节的问题。 </li>
  <li>ArrayIndexOutOfBoundsException：解决了已知的错误。 </li>
  <li>Multipart  requests：Better reporting for premature closing  of input streams while reading multipart requests.</li>
  <li>新行字符（New line  characters）：解决了上传和新换行字符时导致的文件损坏问题。 </li>
</ol>
<h3>Utility包</h3><p>utilities  (package org.apache.struts.util)发生如下修改和修正： </p>
<ol>
  <li>RequestUtils：添加了对ControllerConfig 的forwardPattern,  pagePattern, 和inputForward 属性的支持。 </li>
  <li>GenericDataSource：不赞成。修改为作为[org.apache.commons.dbpc.BasicDataSource]的一个薄的Wrapper。建议直接使用BasicDataSource 或其它兼容组件。 </li>
  <li>RequestUtils  类：修改为使用ActionServletWrapper而不是暴露 ActionServlet。 </li>
  <li>为getActionErrors 和 getActionMessages 方法添加了错误消息。 </li>
  <li>getActionErrors  和 getActionMessages：添加了根据基于传入的消息关键字从Request范围获取的对象来产生正确的相应对象的方法。 </li>
  <li>ActionErrors  或 ActionMessages：创建一个这种对象的逻辑被移到了RequestUtils中的一个工具方法。.</li>
  <li>JspException  消息：现在在RequestUtils中生成。 </li>
  <li>ConvertUtils.convertCharacter()：现在将检测空字符串并返回默认值。 </li>
</ol>
<h3>Bean Taglib包</h3><em>struts-bean</em> c标签库  [org.apache.struts.taglib.bean]发生了如下修改和修正： 
<ol>
  <li>&lt;html:errors&gt;：当指定了属性标签时，如果指定的属性没有发生错误，则不会输出错误。而前面的错误将总是会被输出。未来的增强版本将包括额外的属性来关闭header 或  footer。 </li>
  <li>将helper 方法从"private"改为  "protected" 。 </li>
</ol>
<h3>HTML Taglib 包</h3>
<p><em>struts-html</em> 标签库(package  org.apache.struts.taglib.html)发生了如下修改和修正： </p>
<ol>
  <li>FormTag：修正为，当指定了action mapping的名称时，要排除查询字符串。 </li>
  <li>ImgTag：如果只有一个参数，能正确地URLEncode 查询字符串参数。 </li>
  <li>MultiboxTag.doAfterBody():：修正为返回SKIP_BODY 而不是SKIP_PAGE。 </li>
  <li>Errortag：不赞成使用defaultLocale方法。 </li>
</ol>
<h3>Documentation 示例应用</h3>
<p>Struts  Documentation 应用(对应Struts  网站的内容)发生了如下修改： </p>
<ol>
  <li>重新组织了资源到单独的页面中。 </li>
  <li>在Tag Developers Guide中，添加了更详细的文件上传要求。 </li>
  <li>在Building View  Components，澄清了额外的i18n 支持可以由浏览器提供，并且超出了框架的范围。 </li>
  <li>在Building Controller  Components一节，文档 'validating' init-param，添加了各种参数的默认值，澄清了某些web.xml 设置不是Struts特定的。 </li>
  <li>Tag  library 文档：移到User's Guide下。 </li>
</ol>
<h3>MailReader 示例应用</h3>
<p>Struts  MailReader Example Application 发生如下修改和修正： </p>
<ol>
  <li>添加了应用资源的 Russian 和Japanese 翻译，并且设置JSP的字符集为"UTF-8"以便其可以显示English 或Japanese。 </li>
  <li>在Struts配置文件中交换了Edit mappings的"attribute"  属性的"name" 。 </li>
  <li>删除了对"tour"文档中的保存的数据库数据的引用，因为这个功能已经被删除。 </li>
</ol>
<h3>Exercise Taglib 示例应用</h3>
<p>Struts Exercise  Taglib Example Application 发生了如下修改和修正： </p>
<ol>
  <li>添加了针对使用了"action"属性的&lt;html:link&gt; 的test  case 。 </li>
  <li>添加了针对基于保存在page上下文中的集合使用&lt;html:options&gt; 和 &lt;html:optionsCollection&gt;的&lt;html:select&gt; 的test  case。 </li>
</ol>
<h2>不同之处</h2>
<p>这里列出1.0到1.1中新增的类和已经不赞成使用的类： </p>
<h3>1.0中不赞成使用，1.1中已经删除的类。</h3>
<ol>
  <li>删除：org.apache.struts.utils.BeanUtils,  org.apache.struts.utils.ConvertUtils, and org.apache.struts.utils.PropertyUtils  – 替换为org.apache.commons.beanutils </li>
  <li>删除：org.apache.struts.util.ArrayStack,  org.apache.struts.util.FastArrayList, org.apache.struts.util.FastHashMap,  org.apache.struts.util.FastTreeMap – 替换为org.apache.commons.collections </li>
  <li>删除：  org.apache.struts.digester.* - 替换为org.apache.commons.digester </li>
  <li>删除：struts-config.dtd –  替换为struts-config_1_1.dtd.</li>
  <li>删除：omnibus  "struts" taglib 和其相应的TLD – 替换为bean, logic, 和html  taglib。 </li>
  <li>删除："form"  taglib 和其相应的TLD – 替换为html  taglib.</li>
</ol>
<h3>Struts 1.1新增的包</h3>
<ol>
  <li>config</li>
  <li>taglib.nested</li>
  <li>taglib.nested.bean</li>
  <li>taglib.nested.html</li>
  <li>taglib.nested.logic</li>
  <li>validator</li>
</ol>
<h3>Struts 1.1新增的类</h3>
<p><strong>action</strong></p>
<ol>
  <li>ActionMessage</li>
  <li>ActionMessages</li>
  <li>DynaActionForm</li>
  <li>DynaActionFormClass</li>
  <li>ExceptionHandler</li>
  <li>RequestProcessor</li>
</ol>
<p><strong>actions</strong></p>
<ol>
  <li>LookupDispatchAction</li>
</ol>
<p><strong>taglib.html</strong></p>
<ol>
  <li>FrameTag</li>
  <li>JavascriptValidatorTag</li>
  <li>MessagesTag</li>
  <li>OptionsCollectionTag</li>
</ol>
<p><strong>taglib.logic</strong></p>
<ol>
  <li>EmptTag</li>
  <li>MessagesNotPresentTag</li>
  <li>MessagesPresentTag</li>
  <li>NotEmptyTag</li>
</ol>
<p><strong>upload</strong></p>
<ol>
  <li>CommonsMultipartRequestHandler</li>
</ol>
<p><strong>util</strong></p>
<ol>
  <li>LabelValueBean</li>
</ol>
<h3>Struts 1.1中新增的类成员</h3>
<p><strong>action.Action</strong></p>
<ol>
  <li>ACTION_SERVLET_KEY</li>
  <li>APPLICATION_KEY</li>
  <li>MESSAGE_KEY</li>
  <li>PLUG_INS_KEY</li>
  <li>REQUEST_PROCESSOR_KEY</li>
  <li>execute</li>
  <li>getResources(javax.servlet.http.HttpServletRequest)</li>
  <li>saveMessages</li>
</ol>
<p><strong>action.A<u>ctionServlet</u></strong></p>
<ol>
  <li>configDigester</li>
  <li>convertHack</li>
  <li>log</li>
  <li>processor</li>
  <li>getInternal</li>
  <li>destroyApplications</li>
  <li>destroyConfigDigester</li>
  <li>getApplicationConfig</li>
  <li>getRequestProcessor</li>
  <li>initApplicationConfig</li>
  <li>initApplicationDataSources</li>
  <li>initApplicationPlugIns</li>
  <li>initApplicationMessageResources</li>
  <li>initConfigDigester</li>
  <li>methods  created for backward-compatiblity only </li>
  <ol>
    <li>defaultControllerConfig</li>
    <li>defaultFormBeansConfig</li>
    <li>defaultForwardsConfig</li>
    <li>defaultMappingsConfig</li>
    <li>defaultMessageResourcesConfig</li>
  </ol>
</ol>
<p><strong><u>taglib.html.BaseHandlerTag</u></strong><strong> </strong></p>
<ol>
  <li>indexed</li>
  <li>setIndexed</li>
  <li>getIndexed</li>
</ol>
<h3>Struts 1.0 到Struts 1.1不赞成的类</h3>
<p><strong>action</strong></p>
<ol>
  <li>ActionException</li>
  <li>ActionFormBeans</li>
  <li>ActionForwards</li>
  <li>ActionMappings</li>
</ol>
<h3>Struts 1.0 不赞成的类成员</h3>
<p><strong>action.Action</strong></p>
<ol>
  <li>FORM_BEANS_KEY</li>
  <li>FORWARDS_KEY</li>
  <li>MAPPINGS_KEY</li>
  <li>getResources()</li>
  <li>perform</li>
</ol>
<p><strong>ActionServlet</strong></p>
<ol>
  <li>findDataSource</li>
  <li>findFormBean</li>
  <li>findForward</li>
  <li>findMapping</li>
  <li>initDataSources</li>
  <li>methods  created for backward-compatiblity only </li>
  <ol>
    <li>defaultControllerConfig</li>
    <li>defaultFormBeansConfig</li>
    <li>defaultForwardsConfig</li>
    <li>defaultMappingsConfig</li>
    <li>defaultMessageResourcesConfig</li>
  </ol>
</ol>
<img src ="http://www.blogjava.net/SteelHand/aggbug/25728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-12-28 15:23 <a href="http://www.blogjava.net/SteelHand/archive/2005/12/28/25728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WW与Struts的合并</title><link>http://www.blogjava.net/SteelHand/archive/2005/11/29/21789.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 29 Nov 2005 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/11/29/21789.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/21789.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/11/29/21789.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/21789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/21789.html</trackback:ping><description><![CDATA[<P>近两天WW并入Struts的事情也可算是比较激烈的一件事情了。从TSS上的讨论来说，90%以上的人还是认为是好事情的。<BR>其实，不久前，Struts规划的路线中，1.2.8可能是最后一个Classic的版本了，并且改版本比1.2.7之前的变化还分出了Struts <BR>Core和扩展， 象 EL， Tag， Tiles, Validation等等几乎都已经是独立模块了。<BR><BR>至于下一代的走向，原来规划的是2个方向&nbsp;， Action Framework和Shale. 其中Shale相对独立，即以JSF为中心，补充和完善JSF框架之不足，我看倒是有些与ADF Faces在有些地方相似，当然是指前端。<BR><BR>只是，ActionFramework的核心原来是<!--StartFragment --> COR 模式为基础，并且可能还未决断。如今，WW带着Xwork加入，可算是解决了这个问题。从Struts Wiki中，这两个项目还是分开的，从Ted的邮件和WW的消息看来，新项目已经决定是Struts Ti了， 可能会合并成Action Framework,成一个东西。是啊，搞那么多干吗？<BR><BR>说到Struts Ti，我才想起来，原来有一个项目是Struts Ti，是从BaseBean的BasicPortals发展起来的，今天再去看看，那个项目已经不能访问了，Sf上的BasciPortal也不能下载了。纳闷！我还没研究这个这个Ti有什么关系。<BR><BR>直接影响我的一个问题是，我一本以Struts 1.2.X为基础的书是继续写还是不写？下一版变化太大了。<BR><BR></P><img src ="http://www.blogjava.net/SteelHand/aggbug/21789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-11-29 10:38 <a href="http://www.blogjava.net/SteelHand/archive/2005/11/29/21789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 秘籍（CookBook）索引</title><link>http://www.blogjava.net/SteelHand/archive/2005/10/18/15825.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 18 Oct 2005 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/10/18/15825.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/15825.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/10/18/15825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/15825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/15825.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>应<A href="/calvin/">白衣</A>之请，将以前发的所谓Struts秘籍作了个索引在此。本系列源改编自O'Reily的Strus Cookbook，后因时间关系没再进行。如果以后有时间还需继续，可能会更简化一些&nbsp;。<A href="/SteelHand/archive/2005/05/10/4132.html"><BR><BR></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/10/4132.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：配置</SPAN></SPAN>Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>应用</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/04/26/3825.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：部署</SPAN></SPAN>Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>示例应用</SPAN></SPAN></A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/04/27/3835.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.3<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：迁移至</SPAN></SPAN>Struts 1.1</A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/04/28/3876.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.4<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：升级至</SPAN></SPAN>Struts 1.2</A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/04/29/3930.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.5<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式</SPAN></SPAN>:<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>将</SPAN></SPAN>JSP <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>应用转到</SPAN></SPAN>Struts</A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/04/30/3960.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.6<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：管理</SPAN></SPAN>Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>配置文件</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/08/4077.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.7<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：使用</SPAN></SPAN>Ant<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>进行构建和部署</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/09/4110.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之起式：第</SPAN></SPAN>1.8<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：用</SPAN></SPAN>XDoclet <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>产生</SPAN></SPAN>Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>配置文件</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/25/5148.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：</SPAN></SPAN>UI</A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/10/4136.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：用插件来进行应用初始化</SPAN></SPAN></A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/11/4159.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：关于标签库声明</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/12/4211.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.3<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：在</SPAN></SPAN>JSP<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>中使用常数</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/13/4247.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.4<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：多配置文件</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/17/4423.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.5<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式</SPAN></SPAN>. <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>将应用重构为模块</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/17/4426.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.6<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式</SPAN></SPAN>. <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>使用多个资源束</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/18/4474.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.7<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式</SPAN></SPAN>. <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>访问来自于数据库中的消息资源</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/19/4867.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>2.8<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式</SPAN></SPAN>. <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>有选择地禁止</SPAN></SPAN>Action</A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/27/5265.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.1<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US> </SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>使用</SPAN></SPAN>JSTL</A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/27/5266.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：使用</SPAN></SPAN>Struts-EL <SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>标签</SPAN></SPAN></A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/30/5324.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.3<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：显示索引属性</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/05/31/5368.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.4<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：在表单中使用索引属性</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/06/01/5413.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.5<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US> </SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>在</SPAN></SPAN>JSTL<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>循环中使用索引属性</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/06/03/5506.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.6<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US> </SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>从图像提交表单</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/06/07/5654.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.7<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US> </SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>动态产生</SPAN></SPAN>JavaScript</A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/06/08/5723.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.8<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式：使用</SPAN></SPAN>JavaScript<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>动态改变选择项</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/06/29/6861.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段，第</SPAN></SPAN> 3.9<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式，产生动态选择列表项目</SPAN></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A HREF="/SteelHand/archive/2005/07/01/6974.html">Struts<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>秘籍之第</SPAN></SPAN>2<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>段：第</SPAN></SPAN>3.10<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>式</SPAN></SPAN>:<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>过滤文本输入</SPAN></SPAN></A> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P></P><img src ="http://www.blogjava.net/SteelHand/aggbug/15825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-10-18 16:50 <a href="http://www.blogjava.net/SteelHand/archive/2005/10/18/15825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action中文版》完整版</title><link>http://www.blogjava.net/SteelHand/archive/2005/10/12/15329.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 12 Oct 2005 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/10/12/15329.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/15329.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/10/12/15329.html#Feedback</comments><slash:comments>164</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/15329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/15329.html</trackback:ping><description><![CDATA[分卷压缩后，终于上传完了。<BR>下载地址分别是：<BR><A href="/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part01.rar">Part1</A>&nbsp;<BR><A href="/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part02.rar">Part2</A><BR><A href="/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part03.rar">Part3</A><BR><A href="/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part04.rar">Part4</A><BR><A href="/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part05.rar">Part5</A><BR><A href="/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part06.rar">Part6</A><BR><BR><BR><EM><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000>下载是正常的，如果不能请检查你的网络。解压时需要全部下载完成后进行。</FONT></EM><img src ="http://www.blogjava.net/SteelHand/aggbug/15329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-10-12 15:00 <a href="http://www.blogjava.net/SteelHand/archive/2005/10/12/15329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Struts in Action 完整版</title><link>http://www.blogjava.net/SteelHand/archive/2005/10/11/15264.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 11 Oct 2005 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/10/11/15264.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/15264.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/10/11/15264.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/15264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/15264.html</trackback:ping><description><![CDATA[<a title="" href="http://struts.apache.org" >Struts</a> in Action 终于整理完了。并且我根据这里的朋友们提供的意见和指出的错误进行了修改，也根据原书的勘误作了修改。<br>
我将原来的分章节的文章删除了，准备上传完整版。可是文件太大，而且系统将Size限制在2M.又是一阵忙活，压缩了，减小PDF文件的大小了....最后的压缩包到1.8M左右。可是网络太慢，还是上传不成功。郁闷！<br>
只好等网络不忙的时候再上传，分开打包总不太好。<br>
<br>
<br>
昨天到学校报到了。拿到课表，居然本学期每周居然1-4晚上，周六全天上课，又郁闷！那里忙得过来！看来得好好盘算一下怎么办了？<br>
<br>
而且，以后可能到这里的时间少了，我准备的一些文档的推出速度则更加慢了。<br>
<br>
<br><img src ="http://www.blogjava.net/SteelHand/aggbug/15264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-10-11 16:27 <a href="http://www.blogjava.net/SteelHand/archive/2005/10/11/15264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文版 第15章</title><link>http://www.blogjava.net/SteelHand/archive/2005/09/27/14211.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 27 Sep 2005 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/09/27/14211.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/14211.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/09/27/14211.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/14211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/14211.html</trackback:ping><description><![CDATA[最近简直没有时间，可能笔误和错误颇多。请在这里指出来，一并在完整版中改正。谢谢！<BR><A href="http://www.blogjava.net/SteelHand/SteelHand/Files/SteelHand/StrutsInAction_Chinese(15).rar">这里下载</A></A>。<BR><BR><EM><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000><STRONG>&nbsp;不知为什么提交后连接地址的上下文根会变。如果上面连接不行，请直接使用这个地址：<BR></STRONG></FONT></EM><EM><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000><STRONG>http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(15).rar</STRONG></FONT></EM><img src ="http://www.blogjava.net/SteelHand/aggbug/14211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-09-27 15:56 <a href="http://www.blogjava.net/SteelHand/archive/2005/09/27/14211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOP 10 Resesons to Perfer JSF on Struts</title><link>http://www.blogjava.net/SteelHand/archive/2005/08/24/10856.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 24 Aug 2005 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/08/24/10856.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/10856.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/08/24/10856.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/10856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/10856.html</trackback:ping><description><![CDATA[&nbsp;David Geary （何许人也？Core JSF的作者之一）有一篇BLog，建议新项目都最好采用JSF而不是Struts，并且列出了10大理由，分别是：<BR><BR><!--StartFragment -->&nbsp; 
<LI>Components </LI>
<P><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组件组件，JAVA一直希望有.NET和Delphi的RAD和拖放式开发，虽然现在和那两种还有差距，但毕竟已经是开始了。第3方组件厂商也开始出现萌芽的态势。另外一个值得注意的趋势就是，Apple，这个艺术与技术的完美缔造者，其WebObject，作为Web的组建式框架的祖宗，也准备开放了。而且，按照Apple也转向Intel平台的介绍来看，也许不久的一天，它就可以完美地运行在WinTel架构下了。</EM><BR>&nbsp;&nbsp;&nbsp;</P>
<LI>Render Kits </LI>
<P><EM>&nbsp;&nbsp; 支持渲染包可以是一个非常重要的特征，这样可以支持不同的显示技术。移植性很好。针对XML， PDF， VML等等。不需要改动其它的东西。</EM></P>
<LI>Renderers </LI>
<LI>Value Binding Expressions </LI>
<P><EM>&nbsp;&nbsp; 其实比较特色的是Method Binding,这点在其他EL或者类似的技术上还没有。</EM></P>
<LI>Event Model </LI>
<LI>Extensibility </LI>
<LI>Managed Beans (Dependency Injection) </LI>
<P><EM>&nbsp; 只有Spring 才IoC吗？不是的，其实现在IoC无处不在。</EM></P>
<LI>POJO Action Methods </LI>
<LI>JSF is the standard Java-based web app framework </LI>
<LI>There's only one <a title="" href="http://struts.apache.org" >Struts</a></LI>
<P><EM>&nbsp;&nbsp;&nbsp;Struts是一个产品，而JSF是一个标准。二者层面不一样。有很多优秀的实现会出现的。</EM></P>
<P>甚以为是，故摘录于此。原文见：<A href="http://jroller.com/page/dgeary?entry=top_ten_reasons_to_prefer">http://jroller.com/page/dgeary?entry=top_ten_reasons_to_prefer</A><BR><BR>其实，JSF的学习曲线非常之低，呵呵。<BR></P><img src ="http://www.blogjava.net/SteelHand/aggbug/10856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-08-24 09:47 <a href="http://www.blogjava.net/SteelHand/archive/2005/08/24/10856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第14章</title><link>http://www.blogjava.net/SteelHand/archive/2005/08/17/10360.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 17 Aug 2005 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/08/17/10360.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/10360.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/08/17/10360.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/10360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/10360.html</trackback:ping><description><![CDATA[<font color="#006400"><em><strong>最近忙于修订《Javaserver Faces in Action》，都没有时间来修改这个文档了。我发现校对文稿真的是一个非常辛苦的事情，比起写来，要麻烦得多。何况我又不是一个细致的人。真是有些痛苦。今天抽点时间来继续将这部分发点出来。</strong></em><br><br></font>很多人都问，Struts中用什么处理模型和数据。<br><br>
我以前总说，这和Struts有什么关系？<br>从实际上来说，这的确和他没什么关系，因为他是M中立的。你可以使用你自己喜欢的任何M实现。但是正因如此，其实也还是和她有关系的，那就是它本质上的MVC的分层设计。<br>
<br>对Struts本身来说，作为最成功的一个MVC框架，实际上其最成功之处和精彩之处就是其中的C，即它是一个比较好的Front
Controller 模式的实现。&nbsp;很多地方，特别是其它利用了它的大型框架，都利用了他的这个优点。比如Oracle 的ADF。<br>
<br>但是对小型应用来说，很多人在争论，Action到底是M还是C。其实这并不重要，如果应用小型，你尽管可以在其中实现你的Biz Logic。这样的话，它就是M。否则，稍大型一些的应用，最好还是作为一个C来使用，至少是C的一个helper。<br>
<br>那么，具体的M怎么办呢？常规的做法是委托给POJO或者EJB。但是基于分层的目的，这中间通常是需要一个缓冲，那就是Facade。SUN的
官方Facade实现原来推荐的是Session
EJB，这感情好，如果你能搞定它，业务和实体也可以尽管使用EJB。如果你不能负担EJB之痛，你可以使用POJO
Facade来访问你的POJO实现的逻辑。<br>
<br>那么你的POJO生长在哪里？目前的Spring 等IoC容器正是一个好地方。实际上我想将Spring 成为是“框架之框架”。<br>OK，那么数据层又如何？嘿嘿，实际上离Struts太远啦，严格说起来他不想知道，也不用知道。你可以使用任何需要的持久实现，关键是作为DTO传递给C和V的结果，以及它们之间的转换。<br><br>本书中的ProcessBean是早期的一个POJO Facade，非常不错。但是不知为和这个包一直在Apache Commons的沙坑中跳不出来。而且如今有些陈旧了。<br>不过，本章其中的RSS和Lucene的讲述倒是不错。值得参考。<br><br><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese%2814%29.rar">这里下载</a>。<br><br><img src ="http://www.blogjava.net/SteelHand/aggbug/10360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-08-17 17:24 <a href="http://www.blogjava.net/SteelHand/archive/2005/08/17/10360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第13章</title><link>http://www.blogjava.net/SteelHand/archive/2005/08/04/9199.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Thu, 04 Aug 2005 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/08/04/9199.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/9199.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/08/04/9199.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/9199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/9199.html</trackback:ping><description><![CDATA[一直以为，国际化是个问题，本地化不是问题。<BR>但是，老是有人层出不穷地问中文的问题，真是生生被他们气死。<BR><BR>有时间的时候准备写一篇文档，彻彻底底的描述一下Java的文字处理问题。不过这里先说几点最重要的：<BR><BR>1 先要搞清除字符集（CharacterSet）和编码方案(Encoding Schema)的意思；<BR>2 Java系统内置Unicode的问题处理方式，这点是最基本的前提，不要忘了；<BR>3 操作系统的代码页（CodePage）和字符集的关系；<BR>4 JSP中，注意page指令的charset不是字符集的意思，实际上是一中Java内置的字符集和编码方案结合的编码；<BR>5 不知道为什么总有人喜欢GB2312，记住：<FONT face=Arial><STRONG>早过时了</STRONG></FONT>；<BR>6 解决编码问题的方法就是尽量统一到Java系统的编码上；<BR>7 只有国际化才能彻底解决中文化的问题。尽量不要强行转码，如果每一个字符都转码，效率如何不用说了吧？<BR>8 学会使用Local<BR><BR>好了，先说这么多。<BR><BR><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(13).rar">下载这一章</A>。<img src ="http://www.blogjava.net/SteelHand/aggbug/9199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-08-04 14:01 <a href="http://www.blogjava.net/SteelHand/archive/2005/08/04/9199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第12章</title><link>http://www.blogjava.net/SteelHand/archive/2005/08/02/8985.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 02 Aug 2005 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/08/02/8985.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/8985.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/08/02/8985.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/8985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/8985.html</trackback:ping><description><![CDATA[<P>据Struts声称， Validator是从Struts0.5就开始使用了。从Struts1.1开始，Validator就成为Jarkarta Commons的一个组件。从而成为一个非常有用的通用工具。<BR>关于Commons Validator的地址，可以访问：<A href="http://jakarta.apache.org/commons/validator/">http://jakarta.apache.org/commons/validator/</A>&nbsp; 。Struts发行包中带有这个包，也可以单独在此处进行下载。<BR><BR>Validator应用的Struts官方指南参见：<A href="http://struts.apache.org/userGuide/dev_validator.html">http://struts.apache.org/userGuide/dev_validator.html</A>&nbsp;其中也有几个相关资源。</P>
<UL>使用中要注意的有几点：<BR><BR>
<LI>注意DynaValidator的使用与常规ActionForm的校验</LI>
<LI>注意mapping中validate的配置</LI>
<LI>注意action中validate方法与validator的关系</LI></UL>
<P>Validator是一个同用框架，你可以使用在很多地方，包括最近流行的Spring 之中。<BR><BR><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(12).rar">本章下载</A>。<BR></P>
<P></P><img src ="http://www.blogjava.net/SteelHand/aggbug/8985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-08-02 09:39 <a href="http://www.blogjava.net/SteelHand/archive/2005/08/02/8985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第11章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/29/8718.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 29 Jul 2005 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/29/8718.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/8718.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/29/8718.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/8718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/8718.html</trackback:ping><description><![CDATA[<P>我一直认为tiles应该从Struts中独立出来，成为一个单独的项目。至少也应该放入Commons之中。不过，到Struts1.2版本中仍然没有动静。Shale对此也没有明确的说法。<BR><BR>两大主要的布局工具，相比而言，我还是觉得Tiles要好用一些，而且方式优雅。对此，Struts分发包所带的例子tiles-Document就是一个非常有用的学习例子。（很多人来消息说，想要通过例子学习Struts，那么朋友，你可曾研究过Struts的自带例子？如果没有，那就好好看一看吧。关于Struts中的示例程序，大家可以参考我前面所写的“Struts秘籍”中的一篇。）。Tiles不仅是对布局，而且本身还自带对菜单的支持。而且，著名的开源门户项目 <A href="www.liferay.com">liferay&nbsp; </A>就是使用的Tiles作为布局工具，实现了portlet的表现，甚是了得。（另一个很好的portal <A href="http://www.exoplatform.org">ExoPlatform</A>则是使用了JSF。）<BR>当然，<A href="http://www.opensymphony.com/sitemesh/">Sitemesh</A>也非常不错，而且由于使用了装饰器模式和Servlet Filter，灵活性更高。你可以用它做你爱做的事情，做你想做的事情。不过，似乎因为Sitemesh是<!--StartFragment --><A href="www.opensymphony.com"> <FONT size=-1><FONT color=#008000>opensymphony</FONT></FONT> </A>的项目，好像大家就以为它只能与<A href="http://www.opensymphony.com/webwork">WebWork</A>配对使用，或者心存这种假设。其实不然，呵呵，这种假设不成立。它们两个都是中立的。完全可以根据你的需要选择使用。SiteMesh也完全可以用于Struts项目。<BR>还有一个项目是<A href="http://struts.application-servers.com"><A title="" href="http://struts.apache.org"><A title="" href="http://struts.apache.org"><A title="" href="http://struts.apache.org"><a title="" href="http://struts.apache.org" >Struts</a></A></A></A>-Layout,</A>这个项目则主要偏重于细微的表现，比如树型，面板之类的。较少用于总体布局。不过这些对JSF来说都是小Case了。<BR><BR>IBM WSAD本身支持一种模板的布局处理方式，大家可以参考。它实际上是一套可以由IDE管理的代码复制和重用机制。对整体布局和网站基础，比如导航、菜单、面包屑、SiteMap等支持也非常不错。大家也可以研究一下。<BR><BR>开发工具来说，最好的Struts开发工具还是<A href="http://www.m7.com">M7</A>的Nitrox，对Tiles的支持也非常之棒。可惜不是免费的。也鲜见破解版本。另外就是<A href="http://www.exadel.com">Exadel Studio</A>，也非常不错，这方面好像是在学习M7。而且它前些时候刚推出免费版本。<BR>当然，各个商业IDE还是对其支持的不错。<BR><BR>这一章感觉并为把Tiles讲解够深。至于Tiles的高级应用，在Tiles-Document示例应用中，可以找到一个相关的链接。<BR><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(11).rar"><BR>在这里下载</A>这一章。</P><img src ="http://www.blogjava.net/SteelHand/aggbug/8718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-29 10:30 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/29/8718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《struts in Action》中文修订版 第10章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/25/8400.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 25 Jul 2005 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/25/8400.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/8400.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/25/8400.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/8400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/8400.html</trackback:ping><description><![CDATA[<A title="" href="http://struts.apache.org"><A title="" href="http://struts.apache.org"><a title="" href="http://struts.apache.org" >Struts</a></A></A>&nbsp;标签库很多人都说难用。既然难用，干脆就用JSTL代替好了。一般来说，JSTL至少可以完成95%的Struts Tag的功能。&nbsp;&nbsp;而且JSTL还有很多Struts Tag所不能的标签。<BR>当然，我们建议，除非JSTL不能解决的问题使用Struts Tag，大多数情况还是推荐使用JSTL为好。<BR>第10章没有涉及Struts EL，其实这也没什么关系。大多数时候你还是不需要用它。毕竟，对于EL来说，我们推荐JSTL的EL也最好转到JSP EL上面。毕竟，这是标准。JSP 2.0可以直接支持JSP EL，对于以前的版本，比如1.3， 可以使用一个指令打开它。<BR><BR>好了，第10章在<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(10).rar">这里下载。</A><img src ="http://www.blogjava.net/SteelHand/aggbug/8400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-25 12:36 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/25/8400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第9章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/23/8234.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Sat, 23 Jul 2005 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/23/8234.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/8234.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/23/8234.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/8234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/8234.html</trackback:ping><description><![CDATA[<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(9).rar">这里下载</A>。<img src ="http://www.blogjava.net/SteelHand/aggbug/8234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-23 12:08 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/23/8234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第8章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/21/8148.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Thu, 21 Jul 2005 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/21/8148.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/8148.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/21/8148.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/8148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/8148.html</trackback:ping><description><![CDATA[继续发布，这一章内容较多。大家注意，本章介绍了很多Apache Scafold包对Struts的扩展，目前这个包已经成为Apache Jakarta的 Commons项目的一个组件，但是发生了变化。如果需要参考，可以去Sourceforge下载原来的版本。<BR><BR>第8章 文档在<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(8).rar">这里下载</A>。<img src ="http://www.blogjava.net/SteelHand/aggbug/8148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-21 21:06 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/21/8148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第7章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/20/8022.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 20 Jul 2005 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/20/8022.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/8022.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/20/8022.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/8022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/8022.html</trackback:ping><description><![CDATA[<SCRIPT type=text/javascript><!--
google_ad_client = "pub-4944223532337363";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "A8DDA0";
google_color_bg = "EBFFED";
google_color_link = "0000CC";
google_color_url = "008000";
google_color_text = "6F6F6F";
//--></SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>

<P>第7章已经完成。可以在<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(7).rar">此处下载</A>。<BR><BR>查看了一下下载统计，发现了很有趣的现象。如下图：<BR><BR><IMG height=213 alt=dlcounter.jpg src="http://www.blogjava.net/images/blogjava_net/steelhand/dlcounter.jpg" width=560 border=0><BR><BR><BR>为什么第4章这么少？下载两这么不平衡？奇怪？！！<IMG height=19 src="http://www.blogjava.net/Emoticons/omg_smile.gif" width=19 border=0><BR><BR></P><img src ="http://www.blogjava.net/SteelHand/aggbug/8022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-20 09:27 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/20/8022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action 》中文修订版 第6章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/16/7825.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Sat, 16 Jul 2005 10:51:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/16/7825.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7825.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/16/7825.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7825.html</trackback:ping><description><![CDATA[<P>第6章也完成了。本章内容较少，但是ActionForward仍旧很重要，不过好多人在Struts中都没好好用它来组织URI，大多直接请求到Action。这样也没什么不好，它毕竟提供了一种包装和组织手段。<BR><BR><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(6).rar">这里下载</A>。</P><img src ="http://www.blogjava.net/SteelHand/aggbug/7825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-16 18:51 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/16/7825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第5章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/15/7787.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 15 Jul 2005 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/15/7787.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7787.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/15/7787.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7787.html</trackback:ping><description><![CDATA[<P>&nbsp;这一章终于修改完毕，这一章的毛病比较多，错别字也多。看得我眼花。<BR>再次说明，如果发现错误，一定让我知道。谢谢。<BR><BR><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(5).rar">这里下载</A>。<BR></P><img src ="http://www.blogjava.net/SteelHand/aggbug/7787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-15 18:00 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/15/7787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版第4章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/14/7687.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Thu, 14 Jul 2005 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/14/7687.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7687.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/14/7687.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7687.html</trackback:ping><description><![CDATA[地址：<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(4).rar">http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(4).rar</A><BR><BR><img src ="http://www.blogjava.net/SteelHand/aggbug/7687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-14 14:03 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/14/7687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》的源代码下载</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/11/7491.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 11 Jul 2005 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/11/7491.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7491.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/11/7491.html#Feedback</comments><slash:comments>42</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7491.html</trackback:ping><description><![CDATA[你可以在本书的网站处下载：<br>地址是：<a href="http://www.manning.com/books/husted/source">http://www.manning.com/books/husted/source</a><br><span style="color: rgb(255, 20, 147); font-style: italic; font-weight: bold;">很多人说此连接不能下载，其实可以的。如不能，可能是你的网络连接的问题。（20050714）</span><br>
<br>
<br>你也可以在Sourceforge上面下载：<br>地址是：<a href="http://sourceforge.net/project/showfiles.php?group_id=49385&amp;package_id=64603">http://sourceforge.net/project/showfiles.php?group_id=49385&amp;package_id=64603</a><br>这里面包括本书所有的代码部分。<br><br><img src ="http://www.blogjava.net/SteelHand/aggbug/7491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-11 11:19 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/11/7491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action中文修订版》第3章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/11/7490.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 11 Jul 2005 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/11/7490.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7490.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/11/7490.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7490.html</trackback:ping><description><![CDATA[在<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(3).rar">这里</A>下载。<img src ="http://www.blogjava.net/SteelHand/aggbug/7490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-11 10:57 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/11/7490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版 第2章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/08/7340.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 08 Jul 2005 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/08/7340.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7340.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/08/7340.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7340.html</trackback:ping><description><![CDATA[老规矩，欢迎找出错误哈。<br>另外，请不要要求我单独发送。<br>在<A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese%282%29.rar">这里下载</a>。<br>
<br>
另外，本书又根据原书的勘误表，进行了仔细的校对和更新。修改了一些细微的错误。<br>
修改之后，我会同时修改此处的下载源，请仔细检查所下载文档修订日期。<br><img src ="http://www.blogjava.net/SteelHand/aggbug/7340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-08 11:24 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/08/7340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》中文修订版，第1章</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/06/7169.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 06 Jul 2005 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/06/7169.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7169.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/06/7169.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7169.html</trackback:ping><description><![CDATA[本书已经出版了，但是不是我的版本。那本书如果有问题，我不负责的哦。<IMG height=19 src="http://www.blogjava.net/Emoticons/shades_smile.gif" width=19 border=0><BR><BR>经过修改后，现在发布陆续发布。会将全书都发布在这里。如果还有错别字或者其他错误指出，请大家指出来。在这里留言也行，邮件亦可。我没那么多时间在仔细校对了。非常感谢。！<BR><BR>第1章的下载地址是：<BR><BR><BR><A href="http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(1).rar">http://www.blogjava.net/Files/SteelHand/StrutsInAction_Chinese(1).rar</A><img src ="http://www.blogjava.net/SteelHand/aggbug/7169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-06 10:06 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/06/7169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段：第3.10式:过滤文本输入</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/01/6974.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 01 Jul 2005 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/01/6974.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/6974.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/01/6974.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/6974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/6974.html</trackback:ping><description><![CDATA[<H3>第3.10式. 过滤文本输入</H3>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-10.1></A>问题</H4>
<P>你想要渲染包含HTML标记的数据，并且希望该数据被浏览器当作HTML标记解释和处理。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-10.2></A>动作要</H4>
<P>很简单，可以使用：</P>&lt;bean:write name="myForm" property="freeText" filtered="false"/&gt; 
<P>&nbsp;</P>
<P>在使用JSTL时，你也可以使用未过滤的值：</P>&lt;c:out value="${myForm.freeText}" escapeXml="false"/&gt; 
<P><A name=jakartastrutsckbk-CHP-3-SECT-10.3></A>&nbsp;</P>
<H4>动作变化</H4>
<P>在你使用Struts <A name=jakartastrutsckbk-CHP-3-ITERM-1587></A><A name=jakartastrutsckbk-CHP-3-ITERM-1588></A>bean:write标签来产生文本时，默认情况下任何对HTML处理敏感的字符都要被它们的对等实体代替。例如，大于号字符(&gt;) 将被替代为&amp;gt;字符实体。这种特征称为是响应过滤（ response filtering），默认情况下是激活的。在大多数情况下，过滤正是希望的行为，因为未经过滤的文本可能被浏览器误解释。Table 3-4 列出了被bean:write标签过滤的字符和它们的对应实体。</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD colSpan=3>
<H5><A name=jakartastrutsckbk-CHP-3-TABLE-4></A>Table 3-4. 被过滤的字符</H5></TD></TR>
<TR>
<TD>
<P align=center><STRONG>字符名称</STRONG></P></TD>
<TD>
<P align=center><STRONG>字符值</STRONG></P></TD>
<TD>
<P align=center><STRONG>替代实体<A name=jakartastrutsckbk-CHP-3-ITERM-1591></A></STRONG></P></TD></TR>
<TR>
<TD>
<P>大于</P></TD>
<TD>
<P>&lt;&nbsp;</P></TD>
<TD>
<P>&amp;lt;</P></TD></TR>
<TR>
<TD>
<P>小于</P></TD>
<TD>
<P>&gt;&nbsp;</P></TD>
<TD>
<P>&amp;gt;</P></TD></TR>
<TR>
<TD>
<P>&amp;符号</P></TD>
<TD>
<P>&amp;</P></TD>
<TD>
<P>&amp;amp;</P></TD></TR>
<TR>
<TD>
<P>双引号</P></TD>
<TD>
<P>"</P></TD>
<TD>
<P>&amp;quot;</P></TD></TR>
<TR>
<TD>
<P>反斜杠</P></TD>
<TD>
<P>\</P></TD>
<TD>
<P>&amp;#39;</P></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P>但是有时候，你希望被渲染的文本中包括HTML 标签。假设你有一个在线日志应用，允许用户输入将要显示在一个页面中的文本。允许使用HTML 标签将使得用户可以那些可以格式化文本的标记。文本中可能包含超链接，不同的字体，以及图像等等。在其他情形下，你的应用可能可能还会从其他来源，比如另一个URL，一个XML文件，一个Web Service或者数据库中，获得HTML模板文本。</P>
<P>通过将bean:write标签的filtered属性设置为false，你就可以告诉Struts标签不要使用相应的实体替换 tag not to 特殊字符。首先，我们来看一下过滤是如何工作的。假设一个用户在表单中输入了下面的文本：</P>Apache <a title="" href="http://struts.apache.org" >Struts</a> Web Framework &lt;b&gt;rocks&lt;/b&gt;! 
<P>&nbsp;</P>
<P>现在这个文本将被bean:write标签来渲染显示。当filtered 属性设施为true时，特殊字符将被其对等物替换，这样文本看起来就会是：</P>Apache <a title="" href="http://struts.apache.org" >Struts</a> Web Framework &amp;lt;b&amp;gt;rocks&amp;lt;/b&amp;gt;! 
<P>这很有可能不是用户所想要的。他想要的是"Apache <a title="" href="http://struts.apache.org" >Struts</a> Web Framework <STRONG>rocks</STRONG><STRONG>!</STRONG>"。但是，因为意图是想要允许用户输入装饰文本的HTML标签，那么将filtered属性设置为false 就会得到正确的渲染：</P>Apache <a title="" href="http://struts.apache.org" >Struts</a> Web Framework &lt;b&gt;rocks&lt;/b&gt;! 
<P>&nbsp;</P>
<P>浏览器将认识这个标签，并且按其所愿正确的应用HTML 标记。</P>
<P>这在渲染一个Web页面时式一个有用的机制。但是，在使用这个方法时必须足够小心。如果数据是没有过滤的，那么就可能会危及渲染后的 HTML页面的布局，整个页面可能会看起来遭到破坏。例如，假定下面的文本被输入：</P>Apache <a title="" href="http://struts.apache.org" >Struts</a> Web Framework &lt;b&gt;rocks&lt;b&gt;! 
<P>&nbsp;</P>
<P>咋看起来，这没什么问题。但是，注意到b元素的后面一个关闭标签的斜杠缺失了。这个错误很容易发生，而且这可能会使得页面中后面的所有文本都是粗体。</P>
<P>不幸的是，要避免这类错误是很困难的。最好还是试图确保输入的数据都是正确有效的HTML。还有个选择就是通过<A name=jakartastrutsckbk-CHP-3-ITERM-1592></A>XML 解析器来处理输出。它会检测诸如标记不匹配之类的问题。你还可以通过一些能够试图纠正问题的解析器来完成，比如Jtidy。最后，如果数据是来自于非受控的来源，你可以选择完全不允许HTML。如果你还想使用一些文本装饰功能的话，还可以考虑使用WikiText 或者UBB Code之类的格式表示来替代。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-10.4></A>相关动作</H4>
<P>JTidy 提供了一个命令行接口和Java API 来解析和整理HTML。关于<A name=jakartastrutsckbk-CHP-3-ITERM-1594></A>JTidy 的细节请访问<A href="http://jtidy.sourceforge.net/">http://jtidy.sourceforge.net</A>。</P>
<P>UBBCode 是PHP本身支持的一种标记格式。也可以在Java中处理UBBCode。一个解析<A name=jakartastrutsckbk-CHP-3-ITERM-1595></A><A name=jakartastrutsckbk-CHP-3-ITERM-1596></A>UBBCode 的PHP函数，有人在Java中重写了，地址可见：<A href="http://www.firegemsoftware.com/other/tutorials/ubb.php">http://www.firegemsoftware.com/other/tutorials/ubb.php</A>.<A name=jakartastrutsckbk-CHP-3-ITERM-1597></A><A name=jakartastrutsckbk-CHP-3-ITERM-1598></A></P><img src ="http://www.blogjava.net/SteelHand/aggbug/6974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-01 09:57 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/01/6974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段，第 3.9式，产生动态选择列表项目</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/29/6861.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 29 Jun 2005 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/29/6861.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/6861.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/29/6861.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/6861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/6861.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近忙，好久没来这里写东西了。今天抽点时间继续。上周去北京，坐火车去，在火车上阅读《Core J2EE Patern》,想起再上一次去北京，也是坐火车，也是阅读这本书，不过那次是第1版。还有巧的是，去时铺位是16车16号，来时居然又买到16车16号，不过是上铺。真是有点意思。&nbsp;&nbsp;Recipe 3.9. 产生动态选择列表项目问题你想要基于同一个表单中的另一个字...&nbsp;&nbsp;<a href='http://www.blogjava.net/SteelHand/archive/2005/06/29/6861.html'>阅读全文</a><img src ="http://www.blogjava.net/SteelHand/aggbug/6861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-29 10:05 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/29/6861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段：第3.8式：使用JavaScript动态改变选择项</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/08/5723.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 08 Jun 2005 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/08/5723.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5723.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/08/5723.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第3.8式. 使用JavaScript动态改变选择项问题你希望使用JavaScript 来根据从应用模型中获得的数据来动态设置显示在一个HTML select元素中的条目。动作要领使用Struts logic:iterate标签来为不同的选项集创建JavaScript 数组。然后使用JavaScript 的onchange事件句柄来在运行时修改options集。Example 3-...&nbsp;&nbsp;<a href='http://www.blogjava.net/SteelHand/archive/2005/06/08/5723.html'>阅读全文</a><img src ="http://www.blogjava.net/SteelHand/aggbug/5723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-08 12:34 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/08/5723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段：第3.7式： 动态产生JavaScript</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 07 Jun 2005 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5654.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5654.html</trackback:ping><description><![CDATA[<H3>第3.7式. 动态产生JavaScript</H3>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-7.1></A>问题</H4>
<P>你想要根据从应用模型获得的数据动态产生JavaScript。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-7.2></A>动作要领</H4>
<P>使用Struts 标签在你想要包含在HTML中的JavaScript 代码中渲染数据：<BR><BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_30_139_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_139_Open_Text.style.display='none'; Codehighlighter1_30_139_Closed_Image.style.display='inline'; Codehighlighter1_30_139_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_30_139_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_139_Closed_Text.style.display='none'; Codehighlighter1_30_139_Open_Image.style.display='inline'; Codehighlighter1_30_139_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">script&nbsp;</SPAN><SPAN style="COLOR: #ff0000">language</SPAN><SPAN style="COLOR: #0000ff">="JavaScript"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN id=Codehighlighter1_30_139_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_30_139_Open_Text><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><BR><IMG id=Codehighlighter1_60_138_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_138_Open_Text.style.display='none'; Codehighlighter1_60_138_Closed_Image.style.display='inline'; Codehighlighter1_60_138_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_60_138_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_138_Closed_Text.style.display='none'; Codehighlighter1_60_138_Open_Image.style.display='inline'; Codehighlighter1_60_138_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;showMessage(&nbsp;&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_60_138_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_60_138_Open_Text><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&nbsp;</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">Hello,&nbsp;&lt;bean:write&nbsp;name='myForm'&nbsp;property='name'/&gt;!</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">script</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><A name=jakartastrutsckbk-CHP-3-SECT-7.3></A>&nbsp;</P>
<H4>动作变化</H4>
<P>上述方案产生了一个JavaScript 函数，弹出一个消息框，消息文本为"Hello, name!" <EM>name</EM>的值是使用<A name=jakartastrutsckbk-CHP-3-ITERM-1545></A><A name=jakartastrutsckbk-CHP-3-ITERM-1546></A>bean:write标签产生的。此方案展示了使用Struts 标签创建JavaScript 和它们创建HTML一样的容易。</P>
<P>JSTL也可以按这种方式使用。</P>
<P>虽然这种方法很明显，但是很奇怪很多人都在问这个问题。通常问题还可能是："我如何才能从Struts中调用HTML中的<A name=jakartastrutsckbk-CHP-3-ITERM-1547></A>JavaScript 函数？" 技术上讲，你并不能从Struts调用一个HTML页面中的JavaScript 函数。Struts 和JSP 技术都运行在服务器端。相反，JavaScript确是在客户端的浏览器中处理的。但是，通过这里所述的动态产生JS的能力，基本上还是相当于所需的这个行为。</P>
<P>这个方法的一个重要基础是JSP的转换过程。JSP 页面由JSP 声明，标准JSP 标签 (比如jsp:useBean), 定制JSP 标签(比如Struts 和JSTP 标签), 运行是表达式，以及脚本小程序（scriptlets）组成。除此之外的其他东西都是模板文本（<A name=jakartastrutsckbk-CHP-3-ITERM-1548></A><A name=jakartastrutsckbk-CHP-3-ITERM-1549></A><EM>template text</EM><EM>）。</EM>模板文本可以是任何不会被JSP转换处理的内容。人们通常会认为模板文本就是HTML 标记，但是它其实是JavaScript 或者其他非JSP 处理的文本。JSP 翻译器并不关心模板文本采用何种形式。因此，你可以象在HTML元素中产生文本一样容易地在JavaScript 函数中产生文本。</P>
<P>如果你使用JSP 来产生良构的（well-formed）<A name=jakartastrutsckbk-CHP-3-ITERM-1550></A>XHTML, 那么动态JavaScript 模版文本必须使用jsp:text元素和CDATA section的方式结合来指定。具体信息参见Hans Bergsten的ONJava 文章：<A href="http://www.onjava.com/pub/a/onjava/2004/04/21/JSP2part3.html">http://www.onjava.com/pub/a/onjava/2004/04/21/JSP2part3.html</A>。</P>
<P>这里的例子仅仅列出了很简单的使用场景。如果要访问的模型数据需要使用复杂的JavaScript数据结构，比如，数组，你可以使用迭代标签，比如<A name=jakartastrutsckbk-CHP-3-ITERM-1552></A><A name=jakartastrutsckbk-CHP-3-ITERM-1553></A>logic:iterate和<A name=jakartastrutsckbk-CHP-3-ITERM-1554></A><A name=jakartastrutsckbk-CHP-3-ITERM-1555></A>c:forEach来组装这些结构。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-7.4></A>相关动作</H4>
<P>下一动3.8或会使用迭代标签来产生客户端的JavaScript 数组。</P><img src ="http://www.blogjava.net/SteelHand/aggbug/5654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-07 12:32 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Struts in Action》还是需要修改一下了</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/06/5622.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 06 Jun 2005 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/06/5622.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5622.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/06/5622.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5622.html</trackback:ping><description><![CDATA[去年闹着玩的《Struts in Action》译本，想不到网上流传的还是比较广泛了。不过去年草稿发出后，再也没有修改过了。前<br>
几天翻出来看，倒是有不少错误，包括错别字和翻译错误。<br>
<br>
觉得这样很不好，搞不好误人子弟。于是决定近日将其重新修改整理，发一个完整半出来。<br>
<br>
感兴趣的，可以关注我这里的相关信息。我将在这里提供下载链接。<br>
<br><img src ="http://www.blogjava.net/SteelHand/aggbug/5622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-06 17:35 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/06/5622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段：第3.6式： 从图像提交表单</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/03/5506.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 03 Jun 2005 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/03/5506.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5506.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/03/5506.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5506.html</trackback:ping><description><![CDATA[<H3>第3.6式. 从图像提交表单</H3>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-6.1></A>问题</H4>
<P>你想要使用户能够通过点击一个不在HTML表单标签中的图像来提交表单。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-6.2></A>动作要领</H4>
<P>适应一个对JavaScript URL 的链接来提交表单：<BR></P><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:link&nbsp;</SPAN><SPAN style="COLOR: #ff0000">href</SPAN><SPAN style="COLOR: #0000ff">="javascript:document.myform.submit(&nbsp;&nbsp;)"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:img&nbsp;</SPAN><SPAN style="COLOR: #ff0000">page</SPAN><SPAN style="COLOR: #0000ff">="/submit-form.gif"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alt</SPAN><SPAN style="COLOR: #0000ff">="Submit"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;border</SPAN><SPAN style="COLOR: #0000ff">="0"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">html:link</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>
<P><A name=jakartastrutsckbk-CHP-3-SECT-6.3></A>&nbsp;</P>
<H4>动作变化</H4>
<P>Web 应用经常使用可点击的图像来提交表单而不是仅仅通过表单按钮。Struts <A name=jakartastrutsckbk-CHP-3-ITERM-1540></A><A name=jakartastrutsckbk-CHP-3-ITERM-1541></A><A name=jakartastrutsckbk-CHP-3-ITERM-1542></A>的html:image标签可以用来产生一个显示图像的HTML input type="image" 标签。但是，对于复杂的 HTML 布局，并不总是能够将图像嵌入在表单&lt;form&gt; . . . &lt;/form&gt;标签之中。有些时候，一个 HTML 页面可能在页面的某一段可能有多个表单，而提交页面的图像则在页面的另一个区域。比如，工具条风格的图像按钮。</P>
<P>上面的方法可以用于从表单之外的图像提交表单。所显示的图像嵌套在html:link标签中。该链接通过执行一行JavaScript来提交表单。在上面的代码中，JavaScript 将提交名为MyForm 的表单。表单名称必须匹配struts-config.xml文件中所配置的action元素的name属性。下面是这种方法产生的HTML 代码：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">a&nbsp;</SPAN><SPAN style="COLOR: #ff0000">href</SPAN><SPAN style="COLOR: #0000ff">="javascript:document.myform.submit(&nbsp;&nbsp;)"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">img&nbsp;</SPAN><SPAN style="COLOR: #ff0000">src</SPAN><SPAN style="COLOR: #0000ff">="/myapp/struts-power.gif"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border</SPAN><SPAN style="COLOR: #0000ff">="0"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;alt</SPAN><SPAN style="COLOR: #0000ff">="Submit"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">a</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>虽然你可以直接使用上述HTML标记而不是Struts html标签，如果那样的话你将失去那些标签所提供的特征。通过使用Struts tag，你就不是必须要指定context 名称，并且你可以使图像名称和替换文本来自于资源束 (如果你需要的话)。</P>
<P>另一个办法是使用html:img 标签的onclick属性：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:img&nbsp;</SPAN><SPAN style="COLOR: #ff0000">page</SPAN><SPAN style="COLOR: #0000ff">="/submit-form.gif"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick</SPAN><SPAN style="COLOR: #0000ff">="document.MyForm.submit(&nbsp;);"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alt</SPAN><SPAN style="COLOR: #0000ff">="Submit"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;border</SPAN><SPAN style="COLOR: #0000ff">="0"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>这种方式的缺点是，有些浏览器并不提供图像是可以点击的一些可视提示线索。因为图像嵌入到一个链接中，大多数浏览器都会在改变鼠标指针以提示该图像是可以点击的。</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#cccccc>
<TBODY>
<TR>
<TD vAlign=top width="100%">
<P><FONT style="BACKGROUND-COLOR: #ffffff"><FONT color=#ff0000><EM><TT>如果你想要你的应用在浏览器禁止JavaScript</TT></EM><TT><EM>的情况下也能够进行，还应该在表单中的某处提供一个常规的提交按钮。</EM></TT></FONT></FONT></P></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<H4>相关招式</H4>
<P>第3.9式会描述如何在表单的action属性中指定的地方将表单提交到另外一个URL。</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/SteelHand/aggbug/5506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-03 10:36 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/03/5506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段：第3.5式： 在JSTL循环中使用索引属性</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/01/5413.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 01 Jun 2005 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/01/5413.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5413.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/01/5413.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5413.html</trackback:ping><description><![CDATA[<H3>第3.5式. 在JSTL循环中使用索引属性</H3>
<H4>问题</H4>
<P>你想要在在JSTL c:forEach循环而不是Struts logic:iterate循环中通过Struts html标签使用索引属性。</P>
<H4>动作要领</H4>
<P>为了创建一个简单索引属性的字段，可使用bean:define标签将循环计数暴露为一个可用于运行时表达式的脚本变量：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="theItem"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${MyForm.myItems}"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;varStatus</SPAN><SPAN style="COLOR: #0000ff">="loopStatus"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">bean:define&nbsp;</SPAN><SPAN style="COLOR: #ff0000">id</SPAN><SPAN style="COLOR: #0000ff">="itemIndex"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:out&nbsp;</SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="${loopStatus.index}"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">bean:define</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">br</SPAN><SPAN style="COLOR: #0000ff">/&gt;&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">property</SPAN><SPAN style="COLOR: #0000ff">='&lt;%="myItem["+itemIndex+"]"%&gt;'/&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #ff0000">&lt;/c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>如果索引属性是一个嵌套的bean 并且你使用的是indexed="true" 属性，那么可以将Struts logic:iterate标签替换为JSTL c:forEach:</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="theNestedItem"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${MyForm.myNestedItems}"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">br</SPAN><SPAN style="COLOR: #0000ff">/&gt;&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="theNestedItem"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property</SPAN><SPAN style="COLOR: #0000ff">="nestedProperty"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexed</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<H4>动作变化</H4>
<P>JSTL的c:forEach标签提供了一些额外的功能并且比logic:iterate更加易用。需要循环遍历的条目可以通过使用EL来指定。JSTL 标签允许对集合的子集上进行更多的控制，并且循环状态的细节也很容易获得。然而，如同所有JSTL标签一样，没有脚本变量被创建。我们在其他招式中所过，在处理索引属性时，不得不使用脚本变量。特别是如果你没有使用struts-el标签库更是如此。</P>
<P>bean:define标签从JSTL创建的范围变量中创建一个基本变量。这个bean:define标签基于取自value属性或者标签体的值创建了一个新的范围变量和对应的脚本变量。后一种方式在JSTL和Struts标签之间建立了一个桥。在这一招中，bean:define标签用于创建一个包含可用于访问索引属性的索引的变量。你可以在第3.4式中的选择喜好颜色的标但中使用这种技术。</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">What&nbsp;are&nbsp;your&nbsp;three&nbsp;favorite&nbsp;colors:<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="theColor"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${FavoritesForm.color}"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varStatus</SPAN><SPAN style="COLOR: #0000ff">="loopStatus"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">bean:define&nbsp;</SPAN><SPAN style="COLOR: #ff0000">id</SPAN><SPAN style="COLOR: #0000ff">="ctr"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:out&nbsp;</SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="${loopStatus.index}"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">bean:define</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">br</SPAN><SPAN style="COLOR: #0000ff">/&gt;&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">property</SPAN><SPAN style="COLOR: #0000ff">='&lt;%="color["+ctr+"]"%&gt;'/&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #ff0000">&lt;/c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>根据第3.4式，你可以使用Struts-El标签来消除scriptlet：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">What&nbsp;are&nbsp;your&nbsp;three&nbsp;favorite&nbsp;colors:<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="theColor"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${FavoritesForm.color}"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>varStatus</SPAN><SPAN style="COLOR: #0000ff">="loopStatus"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">br</SPAN><SPAN style="COLOR: #0000ff">/&gt;&lt;</SPAN><SPAN style="COLOR: #800000">html-el:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">property</SPAN><SPAN style="COLOR: #0000ff">='color[${ctr}]'/&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #ff0000">&lt;/c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>如果需要为一个对象的嵌套属性创建一个HTML 输入字段，而该对象是一个索引属性，那么请在Struts html 标签中指定indexed="true" 属性。indexed属性的用法在使用JSTL c:forEach循环和使用logic:iterate循环时是一样的。下面是这种技术如何使用在第3.4式中的表单的喜好链接部分：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">What&nbsp;are&nbsp;your&nbsp;favorite&nbsp;links?<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">table</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">th</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Name</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">th</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">th</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">URL</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">th</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="webLink"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${FavoritesForm.webLinks}"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="webLink"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property</SPAN><SPAN style="COLOR: #0000ff">="name"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;indexed</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="webLink"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property</SPAN><SPAN style="COLOR: #0000ff">="url"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;indexed</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">table</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>渲染后的索引值被正确产生，哪怕是使用了begin, end, 和step属性来控制循环。下面的c:forEach用法演示了如何为集合的第1个和第3个元素产生输入字段：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="webLink"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${FavoritesForm.webLinks}"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin</SPAN><SPAN style="COLOR: #0000ff">="1"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;end</SPAN><SPAN style="COLOR: #0000ff">="3"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;step</SPAN><SPAN style="COLOR: #0000ff">="2"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="webLink"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;property</SPAN><SPAN style="COLOR: #0000ff">="name"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;indexed</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">html:text&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="webLink"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;property</SPAN><SPAN style="COLOR: #0000ff">="url"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;indexed</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>这将产生下面的HTML:</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">input&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="text"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;name</SPAN><SPAN style="COLOR: #0000ff">="webLink[1].name"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">=""</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">input&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="text"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;name</SPAN><SPAN style="COLOR: #0000ff">="webLink[1].url"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">=""</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">input&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="text"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;name</SPAN><SPAN style="COLOR: #0000ff">="webLink[3].name"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">=""</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">input&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="text"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;name</SPAN><SPAN style="COLOR: #0000ff">="webLink[3].url"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">=""</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>为了在循环中渲染动态数据以供显示，JSTL 工作的很好，并且比对赢得Struts 标签更易使用。你可以看到，JSTL 在访问索引属性方面比Struts 标签支持的更好。例如，下面的代码就展示了喜好颜色可以如何显示：</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">c:forEach&nbsp;</SPAN><SPAN style="COLOR: #ff0000">var</SPAN><SPAN style="COLOR: #0000ff">="color"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;items</SPAN><SPAN style="COLOR: #0000ff">="${favs.color}"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">li</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">c:out&nbsp;</SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="${color}"</SPAN><SPAN style="COLOR: #0000ff">/&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">li</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">c:forEach</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<H4>相关招式</H4>
<P>第3.4式演示了索引属性的类似用法。</P>
<P>你可以参考JSTL 的相关文档和信息，以及书籍。JSTL规范参见<A href="http://java.sun.com/jsp/jstl">http://java.sun.com/jsp/jstl</A>.</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/SteelHand/aggbug/5413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-01 14:43 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/01/5413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>