﻿<?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-bob-文章分类-struts 2</title><link>http://www.blogjava.net/keweibo/category/26339.html</link><description>一专  Java 多能  Delphi,Powerbuilder ... </description><language>zh-cn</language><lastBuildDate>Tue, 06 Sep 2011 02:28:58 GMT</lastBuildDate><pubDate>Tue, 06 Sep 2011 02:28:58 GMT</pubDate><ttl>60</ttl><item><title>struts2 + spring, 使用session範圍的Bean的配置事項</title><link>http://www.blogjava.net/keweibo/articles/358063.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 06 Sep 2011 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/358063.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/358063.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/358063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/358063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/358063.html</trackback:ping><description><![CDATA[<div>異常信息:<br />Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.</div><br />解決方法:<br /><br />1. 在web.xml文件中添加listener<br /><br /><div>&lt;listener&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;<br />&lt;/listener&gt;<br /></div>2. 相應的spring bean配置中應加入<strong><span style="color: red;">&lt;aop:scoped-proxy/&gt;</span></strong>此行代碼<br /><br /><div>&lt;bean id="userAction" class="org.gecs.mes.common.action.UserAction" autowire="byName" <strong><span style="color: red;">scope="session"&gt;</span></strong><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <strong><span style="color: red;">&nbsp;&lt;aop:scoped-proxy/&gt;</span></strong><br />&lt;/bean&gt;<br /><br /></div><img src ="http://www.blogjava.net/keweibo/aggbug/358063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-09-06 10:22 <a href="http://www.blogjava.net/keweibo/articles/358063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2解决No configuration found for the specified action 异常</title><link>http://www.blogjava.net/keweibo/articles/357973.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 05 Sep 2011 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/357973.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/357973.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/357973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/357973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/357973.html</trackback:ping><description><![CDATA[<div>错误信息：<br />2011-09-05 09:55:23,010 WARN&nbsp; [http-80-1] components.Form (Form.java:308) - No configuration found for the specified action: '/feeder/excelToolList.action' in namespace: '/feeder'. Form action defaulting to 'action' attribute's literal value.</div><br />出错的写法<br /><div>&lt;@s.form&nbsp; action="/feeder/excelToolList.action"&nbsp; &gt;</div><br />更正后如下<br /><div>&lt;@s.form&nbsp; action="excelToolList" namespace="/feeder" &gt;<br /><br />即可解决.</div><img src ="http://www.blogjava.net/keweibo/aggbug/357973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-09-05 10:16 <a href="http://www.blogjava.net/keweibo/articles/357973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 + JSON 問題</title><link>http://www.blogjava.net/keweibo/articles/355606.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 02 Aug 2011 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/355606.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/355606.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/355606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/355606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/355606.html</trackback:ping><description><![CDATA[<div><p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <strong>异常形式：</strong></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span><span style="font-family: 'Times new roman'">Class org.apache.struts2.json.JSONWriter can not access a member of *&nbsp;<wbr></span></span>或是<span style="font-family: 'Times new roman'">&nbsp;<wbr><span>Class com.googlecode.jsonplugin.JSONWriter can not access a member of class*</span></span></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> 第一种是<span style="font-family: 'Times new roman'">struct2.1.8</span>与<span style="font-family: 'Times new roman'">json</span>结合时的异常，第二种是<span style="font-family: 'Times new roman'">struct2.1.6</span>与<span style="font-family: 'Times new roman'">json</span>结合的异常。</p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span style="font-family: 'Times new roman'">&nbsp;<wbr></span></p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <strong>具体：</strong></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span><span style="font-family: 'Times new roman'">Class org.apache.struts2.json.JSONWriter can not access a member of class oracle.jdbc.driver.BaseResultSet with modifiers "public"</span></span></p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span style="font-family: 'Times new roman'">&nbsp;<wbr></span></p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <strong>解释：</strong></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> 不能把程序中的某种数据结构串行化成<span style="font-family: 'Times new roman'">json</span>格式。</p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span style="font-family: 'Times new roman'">&nbsp;<wbr></span></p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <strong>原因：</strong></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span style="font-family: 'Times new roman'">struts2</span>的<span style="font-family: 'Times new roman'">action</span>里面的数据转换成<span style="font-family: 'Times new roman'">json</span>数据时，会将提供了<span style="font-family: 'Times new roman'">get</span>方法的属性都串行化输出<span style="font-family: 'Times new roman'">JSON</span>到客户端。有的时候，很多属性并不能串行化成<span style="font-family: 'Times new roman'">json</span>数据，比如这里的<span style="font-family: 'Times new roman'">oracle.jdbc.driver.BaseResultSet</span>。这时还进行强行转换就会出现这样的异常。</p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span style="font-family: 'Times new roman'">&nbsp;<wbr></span></p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <strong>解决方法：</strong></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> 在不能串行化到<span style="font-family: 'Times new roman'">json</span>的属性相应的<span style="font-family: 'Times new roman'">get</span>方法前加一条<span style="font-family: 'Times new roman'">json</span>标记<span style="font-family: 'Times new roman'">&nbsp;<wbr>@JSON(serialize=false)</span>。告诉<span style="font-family: 'Times new roman'">json</span>不需要转化这个属性。或者根本不写这个<span style="font-family: 'Times new roman'">get</span>方法。</p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <span style="font-family: 'Times new roman'">&nbsp;<wbr></span></p> <p style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"> <strong>后记：</strong></p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> 对于不需要在前台输出的<span style="font-family: 'Times new roman'">json</span>数据，也可以用同样的方法进行处理，从而减少服务器和客户端间交互的信息量。</p> <p style="padding-bottom: 0px; text-indent: 21pt; padding-left: 0px; padding-right: 0px; padding-top: 0px"> 可在需要在前台输出的属性的<span style="font-family: 'Times new roman'">get</span>方法前加上@JSON(name="status")标识，从而为该属性起了一个别名，在前台就可以通过<span style="font-family: 'Times new roman'">status</span>作为属性名来读取其值。</p></div><img src ="http://www.blogjava.net/keweibo/aggbug/355606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-08-02 17:01 <a href="http://www.blogjava.net/keweibo/articles/355606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2+spring+hibernate 懒加载异常：org.hibernate.LazyInitializationException: failed to lazily initialize</title><link>http://www.blogjava.net/keweibo/articles/354252.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 13 Jul 2011 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/354252.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/354252.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/354252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/354252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/354252.html</trackback:ping><description><![CDATA[<div>两种处理方法：<br />一、在映射文件中设置lazy=false。<br />二、用OpenSessionInViewFilter过滤器，<strong>注意hibernateFilter过滤器和struts2过滤器在映射时的先后顺序</strong>。同时要配置事物处理，否则会导致session处于只读状态而不能做修改、删除的动作。<br />即在web.xml文件中如下配置：</div><br /><div>&lt;!-- OpenSessionInView --&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;</div><img src ="http://www.blogjava.net/keweibo/aggbug/354252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2011-07-13 13:55 <a href="http://www.blogjava.net/keweibo/articles/354252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Cannot serialize session attribute--问题的解决</title><link>http://www.blogjava.net/keweibo/articles/308804.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 09 Jan 2010 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/308804.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/308804.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/308804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/308804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/308804.html</trackback:ping><description><![CDATA[<p>java.io.NotSerializableException.</p>
<p>在重启Tomcat 6时发现报此错误.</p>
<p>查阅后发现tomcat 5之后重启服务后tomcat会尝试恢复session.</p>
<p>下面是方法一(通过配置,使tomcat重启后不重新恢复session):</p>
<p>&nbsp;</p>
<br />
<font color="#56662d">Tomcat 问题: Cannot serialize session attribute
XXX for ..的解决办法</font>
<br />
<p>在关闭和重启Tomcat 5时, tomcat 会试图 serialize存在的session资源.
如果&nbsp;sessions中相关的对象没有实现&nbsp;serializable 接口, 就会出现Cannot serialize session
attribute XXX&nbsp; for&nbsp; 异常.</p>
<p>如果你不想看到该异常, 也不想保存session. 那么你可以在项目部署描述文件中(如. test.xml,)(instead of
just exploding the war)&nbsp; 的 &nbsp;&lt;Context&gt; tags中间 加上&nbsp;:<br />
&lt;Manager
className="org.apache.catalina.session.PersistentManager" <br />
saveOnRestart="false"/&gt;<br />
这
样 tomcat 在关闭的时候就不会保存session资源了.</p>
<p><br />
你也可以在server.xml中指定上面的值. 这也所有的程序都使用这个设置了.</p>
<p>&nbsp;</p>
<p>试试看. </p>
<p>(引自http://www.blogjava.net/51AOP/archive/2006/09/27/71662.html)&nbsp;</p>
<p>&nbsp;</p>
<p>方法二:</p>
<p>既然报没有序列化的错误,那我们就把我们的对象序列化了就是了,实现起来也很简单,就是把要放入session的对象序列化即可</p>
<p>public class YourClassName implements java.io.Serializable{</p>
<p>}</p>
<p>其他内容都完全不需要变.</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/308804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2010-01-09 10:22 <a href="http://www.blogjava.net/keweibo/articles/308804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中的单Form多图片提交按钮(Submit)的使用 （轉）</title><link>http://www.blogjava.net/keweibo/articles/208402.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 16 Jun 2008 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/208402.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/208402.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/208402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/208402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/208402.html</trackback:ping><description><![CDATA[<div class="postTitle"><span style="color: red">文章來源：http://www.blogjava.net/bukebushuo/archive/2008/06/15/208012.html</span><br />
在Struts2里面一个Form中如果有多个提交按钮，比如添加，更新，保存等，<br />
这些按钮使用一个Action，调用不同的方法，并且在调用前要执行一个JavaScript的检查。<br />
怎么用这个提交按钮？<br />
经过总结如下：<br />
先在form标签头指定Action的命名空间：<br />
&lt;s:form namespace="/system/usermanager" &gt;<br />
然后如下调用：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:submit type="image" id="FIND" value="FIND" label="按指定条件检索用户信息" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src="/issframe/images/btn/btn_find.jpg" cssClass="button_image"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onclick="return CheckInputForRequired();" action="user" method="doSearch"/&gt;<br />
上面是一个图片提交按钮的示例，因为一般在项目中都是使用图片按钮:)<br />
在onclick中执行javascript，记得不要漏掉return。<br />
action就是你要调用的Action在Struts2的配置文件中定义的那个name<br />
例如：&lt;action name="user_*" class="com.system.action.ManagerUserAction" method="{1}"&gt;</div>
注意不包括通配符("_"或者"!"等)。<br />
mothed就是Action类中定义的对应的方法了。<br />
<br />
测试环境：Struts2.1.2 Tomcat 5.5.26 MyEclipse 6 
<img src ="http://www.blogjava.net/keweibo/aggbug/208402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2008-06-16 18:41 <a href="http://www.blogjava.net/keweibo/articles/208402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（轉）NetBeans 6 和 Struts2 </title><link>http://www.blogjava.net/keweibo/articles/191337.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 07 Apr 2008 11:06:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/191337.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/191337.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/191337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/191337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/191337.html</trackback:ping><description><![CDATA[<h1 style="margin: 17pt 0cm 16.5pt"><span style="font-family: 宋体">文章來源：http://blog.csdn.net/xhinker/archive/2008/04/04/2252100.aspx<br />
<br />
让</span><font face="Times New Roman">Struts2 </font><span style="font-family: 宋体">在</span><font face="Times New Roman">NetBeans 6</font><span style="font-family: 宋体">中安家</span></h1>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体">——</span></font><strong><span style="font-size: 16pt; font-family: 黑体">在</span><span style="font-size: 16pt"> NetBeans 6 </span><span style="font-size: 16pt; font-family: 黑体">中使用</span><span style="font-size: 16pt"> Struts2</span></strong></p>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">前言：</span><font face="Times New Roman">NetBeans 6 </font><span style="font-family: 宋体">和</span><font face="Times New Roman"> Struts2 </font></font></h3>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">每次使用一种</span><font face="Times New Roman">java</font><span style="font-family: 宋体">编辑器或</span><font face="Times New Roman">IDE</font><span style="font-family: 宋体">（如</span><font face="Times New Roman">eclipse</font><span style="font-family: 宋体">）一个多小时后，总是发现自己已经在</span><font face="Times New Roman">NetBeans</font><span style="font-family: 宋体">里敲代码了。至于</span><font face="Times New Roman">Struts2,</font><span style="font-family: 宋体">这是一个融合了</span><font face="Times New Roman">WebWork </font><span style="font-family: 宋体">和</span><font face="Times New Roman">Struts1.X </font><span style="font-family: 宋体">的基于</span><font face="Times New Roman">MVC</font><span style="font-family: 宋体">的</span><font face="Times New Roman">Web</font><span style="font-family: 宋体">开发框架，使用相当广泛。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">在当前的</span><font face="Times New Roman">NetBeans6.1</font><span style="font-family: 宋体">中你还找不到</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的影子（至少我所使用的版本里没有，据说已经有人在开发插件了）。不过，这一点也不会妨碍</span><font face="Times New Roman">NetBean 6 </font><span style="font-family: 宋体">和</span><font face="Times New Roman"> Struts2</font><span style="font-family: 宋体">走在一起。在后面你会发现，他们俩配合的还是相当默契的。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">本篇文章就是为了告诉您，如何将</span><font face="Times New Roman">NetBeans</font><span style="font-family: 宋体">和</span><font face="Times New Roman"> Struts2</font><span style="font-family: 宋体">撮合在一起（在这里</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">甚至还可以和</span><font face="Times New Roman">JSF</font><span style="font-family: 宋体">和</span><font face="Times New Roman">Visual Web Pack</font><span style="font-family: 宋体">一起使用）</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">准备工作：</font></span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">1.</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font size="3">JDK 5.0 </font></font><span style="font-family: 宋体"><font size="3">（或更高版本）；</font></span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">2.</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font size="3">NetBeans 6 </font></font><font size="3"><span style="font-family: 宋体">或者</span><font face="Times New Roman"> NetBeans 6.1 Beta(</font><span style="font-family: 宋体">本文使用的是</span><font face="Times New Roman">NetBeans 6.1 Beta)</font><span style="font-family: 宋体">；</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">3.</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font size="3">Struts2 </font></font><span style="font-family: 宋体"><font size="3">开发包；</font></span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">4.</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font size="3">Tomcat 5.5 </font></font><span style="font-family: 宋体"><font size="3">（或更高版本）。</font></span></p>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">一．启动</span><font face="Times New Roman">NetBeans 6.1 </font><span style="font-family: 宋体">创建一个</span><font face="Times New Roman">Web </font><span style="font-family: 宋体">工程</span></font></h3>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体"><font size="3"><img style="width: 731px; height: 436px" height="436" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/11.JPG" width="731" /></font></span></p>
&nbsp;
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">创建一个</span><font face="Times New Roman"> Web Project</font><span style="font-family: 宋体">：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">点击</span><font face="Times New Roman">File </font><span style="font-family: Wingdings">&#224;</span><font face="Times New Roman"> New Project;</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">选择</span><font face="Times New Roman">Categories </font><span style="font-family: 宋体">中的</span><font face="Times New Roman">Web</font><span style="font-family: 宋体">，再选择</span><font face="Times New Roman">Projects</font><span style="font-family: 宋体">中的</span><font face="Times New Roman"> Web Application;</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">点击</span><font face="Times New Roman">Next.</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/12.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">如下图填写，这里的</span><font face="Times New Roman">Server</font><span style="font-family: 宋体">也可以是</span><font face="Times New Roman">NetBeans</font><span style="font-family: 宋体">绑定的</span><font face="Times New Roman"> Tomcat 6</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/13.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">点击</span><font face="Times New Roman">Next,</font><span style="font-family: 宋体">然后再点击</span><font face="Times New Roman">Next </font><span style="font-family: 宋体">看到如下界面：</span></font></p>
<p><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/14.JPG" /></span></p>
<p><span style="font-size: 10.5pt; font-family: 宋体">什么都不要选点击</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Finish. &nbsp;</span><span style="font-size: 10.5pt; font-family: 宋体">工程创建完毕，进入下一部分。</span> </p>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">二．创建</span><font face="Times New Roman">Struts2 Library </font><span style="font-family: 宋体">并导入</span><font face="Times New Roman">Struts2 </font><span style="font-family: 宋体">开发包</span></font></h3>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">点击</span><font face="Times New Roman"> Tools </font><span style="font-family: Wingdings">&#224;</span><font face="Times New Roman"> Libraries </font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/21.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">点击</span><font face="Times New Roman">New Library...</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; Library Name: Struts2</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; Library Type : Class Library</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">点击</span><font face="Times New Roman">OK</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">选择图中所示的</span><font face="Times New Roman">struts2 java</font><span style="font-family: 宋体">包</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/22.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">点击</span><font face="Times New Roman">ok </font><span style="font-family: 宋体">回到主界面。右键点击</span><font face="Times New Roman">Libraries&nbsp;</font><span style="font-family: 宋体">然后选择</span><font face="Times New Roman">Add Library...</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/23.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/24.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">点击</span><font face="Times New Roman">Add Library </font><span style="font-family: 宋体">基本</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的开发包已经导入完毕。</span></font></p>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">三．配置</span><font face="Times New Roman">Web.xml </font></font></h3>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">如图所示；单击</span><font face="Times New Roman">web.xml </font><span style="font-family: 宋体">然后点击右侧的</span><font face="Times New Roman">Filters </font><span style="font-family: 宋体">单击</span><font face="Times New Roman">Add Filter Element</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/31.JPG" /></font></p>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3">Filter Name: <span style="font-family: 宋体">可以任意填写</span> <span style="font-family: 宋体">不过那一串长长的</span>Filter Class <span style="font-family: 宋体">可不太容易记住。只可惜点开</span>Browse...<span style="font-family: 宋体">之后也无法选择</span>Libraries<span style="font-family: 宋体">里面的包，不能不说是一个遗憾。希望下一个版本的</span>NetBeans <span style="font-family: 宋体">会修正这一小小的不足。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3">&nbsp;&nbsp; Filter Name:Struts2 Filter;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3">&nbsp;&nbsp; Filter Class:org.apache.struts2.dispatcher.FilterDispatcher</font></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/32.JPG" /></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">接下来就是M</span><font face="Times New Roman">apping Filter</font><span style="font-family: 宋体">了，点击</span><font face="Times New Roman">Add...</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/33.JPG" /></font></p>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">如图填写，</span>Struts2 Filter <span style="font-family: 宋体">要和上面的保持一致。</span>URL Pattern<span style="font-family: 宋体">里面填写</span> *.action <span style="font-family: 宋体">即可</span></font></p>
</span></font>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/34.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">事实上，在其他</span><font face="Times New Roman">IDE</font><span style="font-family: 宋体">里面配置</span><font face="Times New Roman">Web.xml</font><span style="font-family: 宋体">的时候，你可能要自己动手写</span><font face="Times New Roman">xml(</font><span style="font-family: 宋体">相信大多数程序员都很讨厌写又长又臭的</span><font face="Times New Roman">xml. </font><span style="font-family: 宋体">而且稍微一出错，能把眼睛看痛</span><font face="Times New Roman">)</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">以上的几步操作，</span><font face="Times New Roman">NetBeans</font><span style="font-family: 宋体">为我们自动生成了以下代码，您也可以去看看。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/35.JPG" /></font></p>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">现在你可以暂时不用管</span>web.xml<span style="font-family: 宋体">了。</span></font></p>
</span></font><font size="3"><span>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">四．编写</span>struts.xml</font></h3>
<p style="margin: 0cm 0cm 0pt">struts.xml <span style="font-family: 宋体">可以说是整个</span>struts2<span style="font-family: 宋体">框架的中心。大多数配置错误也出现在</span>struts.xml<span style="font-family: 宋体">上。一个</span>jsp<span style="font-family: 宋体">页面提交后不是像传统的做法那样直接传给另一个页面，而是交由</span>struts.xml<span style="font-family: 宋体">进行处理。</span>struts.xml<span style="font-family: 宋体">调用后台</span>action <span style="font-family: 宋体">类</span> <span style="font-family: 宋体">进行处理后，决定转向那个页面</span>.<span style="font-family: 宋体">那么我们如何编写以及在哪里放置</span>struts.xml<span style="font-family: 宋体">呢？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">我们要将</span>struts.xml<span style="font-family: 宋体">放置在</span>Source Packages<span style="font-family: 宋体">的</span>default package<span style="font-family: 宋体">包下。如图</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/41.JPG" /></span></p>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">给文件命名为</span>struts</font></p>
</span></font>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/42.JPG" /></font></p>
<p><span style="font-size: 10.5pt; font-family: 宋体">接下来点击</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">进行编写，之前我们要在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">xml</span><span style="font-size: 10.5pt; font-family: 宋体">文档的头部加入</span> </p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/43.JPG" /></font></p>
<font size="3"><span>
<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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">把原来的</span>&lt;root&gt;&lt;/root&gt;<span style="font-family: 宋体">删除。换成</span>&lt;struts&gt;&lt;/struts&gt;&nbsp;&nbsp; <span style="font-family: 宋体">输入</span>&#8221;&lt;p&#8221; <span style="font-family: 宋体">然后</span> <span style="font-family: 宋体">按</span>&nbsp;Ctrl+Space </font></p>
</span></font>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/44.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">这个时候</span><font face="Times New Roman"> NetBeans</font><span style="font-family: 宋体">已经完全认识了</span><font face="Times New Roman">Struts2(</font><span style="font-family: 宋体">估计它们已经成为好伙伴了</span><font face="Times New Roman">)</font><span style="font-family: 宋体">。继续编写，如果你怕出错，或者不愿意太麻烦，按</span><font face="Times New Roman"> Ctrl+Space. Netbeans 6.1 </font><span style="font-family: 宋体">会为你解决很多问题。（不得不说的是，</span><font face="Times New Roman">NetBean6.0</font><span style="font-family: 宋体">以后的版本在代码完成方面有了一个很大的提高，速度和智能两方面都值得称赞）一路编写下来。以下是编好的代码：</span></font></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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="xhinker"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span>&nbsp;<span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hello"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="cn.xhinker.struts2.HelloAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/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">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/helloPage.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<span style="font-family: 宋体">
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">文档中</span><font face="Times New Roman"> action </font><span style="font-family: 宋体">标签中的</span><font face="Times New Roman">name</font><span style="font-family: 宋体">属性要特别注意，因为这个是用来标识这个</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的。</span><font face="Times New Roman">class</font><span style="font-family: 宋体">属性里的是，</span><font face="Times New Roman">action</font><span style="font-family: 宋体">类。当点击一个</span><font face="Times New Roman">jsp</font><span style="font-family: 宋体">页面里的</span><font face="Times New Roman">&lt;a href=&#8221;hello.action&#8221;&gt;enter&lt;/a&gt;</font><span style="font-family: 宋体">的时候。</span><span style="font-family: 宋体">程序会根据</span><font face="Times New Roman">hello.action </font><span style="font-family: 宋体">在</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">里找到</span><font face="Times New Roman">name=&#8221;hello&#8221;</font><span style="font-family: 宋体">的标签。继而找到后台的</span><font face="Times New Roman"> HelloAction </font><span style="font-family: 宋体">类。然后根据</span><font face="Times New Roman">HelloAction </font><span style="font-family: 宋体">实例的返回值，找到</span><font face="Times New Roman">result</font><span style="font-family: 宋体">标签中对应的页面，实现页面的转移。</span><font face="Times New Roman">result</font><span style="font-family: 宋体">标签有一个</span><font face="Times New Roman">name</font><span style="font-family: 宋体">属性如</span><font face="Times New Roman"> &lt;result name=&#8221;success&#8221;&gt;/helloPage.jsp&lt;/result&gt;</font><span style="font-family: 宋体">如果不写</span><font face="Times New Roman"> name</font><span style="font-family: 宋体">属性，则默认为</span><font face="Times New Roman"> name=&#8221;success&#8221;.</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">保存，关闭这个页面，接下来我们来编写</span><font face="Times New Roman">HelloAction</font></font></p>
<font size="3"><span>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">五，编写</span>HelloAction类</font></h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">右键单击</span>Source Package <span style="font-family: 宋体">创建一个</span>java<span style="font-family: 宋体">类。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/51.JPG" /></span></p>
</span></font>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">如下填写：</font></span></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/52.JPG" /></font></p>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">让</span>HelloAction <span style="font-family: 宋体">继承</span>ActionSupport</font></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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;cn.xhinker.struts2;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<img id="_120_122_Open_Image" onclick="this.style.display='none'; document.getElementById('_120_122_Open_Text').style.display='none'; document.getElementById('_120_122_Closed_Image').style.display='inline'; document.getElementById('_120_122_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="_120_122_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_120_122_Closed_Text').style.display='none'; document.getElementById('_120_122_Open_Image').style.display='inline'; document.getElementById('_120_122_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport</span><span id="_120_122_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
</span></font><font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">这个时候有人会问，我如何让</span>NetBeans <span style="font-family: 宋体">帮我</span>override(<span style="font-family: 宋体">重写</span>)<span style="font-family: 宋体">父类的方法啊？没有这样的按钮啊？不用找了。</span>Ctrl+Space. <span style="font-family: 宋体">您要的重写的方法，八九不离十已经显示在你的面前了：</span></font></p>
</span></font>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/53.JPG" /></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-size: 10.5pt; font-family: 宋体">我们要的就是这个<span style="font-size: 10.5pt; font-family: 'Times New Roman'">execute()</span><span style="font-size: 10.5pt; font-family: 宋体">方法。稍微改变一下代码如下所示：</span></span></font></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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img id="_42_73_Open_Image" onclick="this.style.display='none'; document.getElementById('_42_73_Open_Text').style.display='none'; document.getElementById('_42_73_Closed_Image').style.display='inline'; document.getElementById('_42_73_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="_42_73_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_42_73_Closed_Text').style.display='none'; document.getElementById('_42_73_Open_Image').style.display='inline'; document.getElementById('_42_73_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="_42_73_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span>&nbsp;<span style="color: #0000ff">this</span><span style="color: #000000">.SUCCESS;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">添加一个字符串变量</span><font face="Times New Roman">msg </font><span style="font-family: 宋体">然后让</span><font face="Times New Roman">NetBeans </font><span style="font-family: 宋体">自动生成</span><font face="Times New Roman"> setter </font><span style="font-family: 宋体">和</span><font face="Times New Roman"> getter</font><span style="font-family: 宋体">方法。如图在弹出的菜单中选择</span><font face="Times New Roman">Encapsulate Field...</font><span style="font-family: 宋体">即可</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/54.JPG" /></span></font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">生成完毕，这个类就编好了，完整的代码为：</font></span></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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;cn.xhinker.struts2;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<img id="_120_366_Open_Image" onclick="this.style.display='none'; document.getElementById('_120_366_Open_Text').style.display='none'; document.getElementById('_120_366_Closed_Image').style.display='inline'; document.getElementById('_120_366_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="_120_366_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_120_366_Closed_Text').style.display='none'; document.getElementById('_120_366_Open_Image').style.display='inline'; document.getElementById('_120_366_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport</span><span id="_120_366_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;msg</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img id="_205_240_Open_Image" onclick="this.style.display='none'; document.getElementById('_205_240_Open_Text').style.display='none'; document.getElementById('_205_240_Closed_Image').style.display='inline'; document.getElementById('_205_240_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_205_240_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_205_240_Closed_Text').style.display='none'; document.getElementById('_205_240_Open_Image').style.display='inline'; document.getElementById('_205_240_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="_205_240_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span>&nbsp;<span style="color: #0000ff">this</span><span style="color: #000000">.SUCCESS;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="_270_296_Open_Image" onclick="this.style.display='none'; document.getElementById('_270_296_Open_Text').style.display='none'; document.getElementById('_270_296_Closed_Image').style.display='inline'; document.getElementById('_270_296_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_270_296_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_270_296_Closed_Text').style.display='none'; document.getElementById('_270_296_Open_Image').style.display='inline'; document.getElementById('_270_296_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMsg()&nbsp;</span><span id="_270_296_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;msg;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="_334_364_Open_Image" onclick="this.style.display='none'; document.getElementById('_334_364_Open_Text').style.display='none'; document.getElementById('_334_364_Closed_Image').style.display='inline'; document.getElementById('_334_364_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_334_364_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_334_364_Closed_Text').style.display='none'; document.getElementById('_334_364_Open_Image').style.display='inline'; document.getElementById('_334_364_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMsg(String&nbsp;msg)&nbsp;</span><span id="_334_364_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msg;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">进入下一部分。</span></p>
</span></font><font size="3"><span>
<h3 style="margin: 13pt 0cm"><font size="5"><span style="font-family: 宋体">六．编写</span>jsp<span style="font-family: 宋体">页面</span></font></h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span>index.jsp<span style="font-family: 宋体">中的</span>body<span style="font-family: 宋体">标签内加入</span>&lt;a href="hello.action"&gt;hello&lt;/a&gt;</p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/61.JPG" /></font></p>
<font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">新建一个</span>hello.jsp<span style="font-family: 宋体">页面</span> <span style="font-family: 宋体">添加如图所示的代码：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xhinker/62.JPG" /></span></font></p>
</span></font><font size="3"><span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">到此为止，你也该启动那只大花猫</span> Tomcat<span style="font-family: 宋体">了。</span>Build <span style="font-family: Wingdings">&#224;</span> run&nbsp;&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">但愿你没有遇到麻烦:-）</font></span></span></font></span></font></span></span></font></span></font></p>
 <img src ="http://www.blogjava.net/keweibo/aggbug/191337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2008-04-07 19:06 <a href="http://www.blogjava.net/keweibo/articles/191337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&amp;lt;s:actionmessage/&amp;gt;标签显示Action信息</title><link>http://www.blogjava.net/keweibo/articles/176142.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Fri, 18 Jan 2008 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/176142.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/176142.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/176142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/176142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/176142.html</trackback:ping><description><![CDATA[使用&lt;s:actionmessage/&gt;标签显示Action信息时,有一个要注意的地方,<br />
就是相应Action的配置<br />
&lt;!-- 修改帐号密码 --&gt;<br />
&nbsp;&nbsp;&lt;action name="updatePassword" class="userAction" method="updatePassword"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;result name="input"&gt;/account/updatePassword.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;result name="success" <span style="color: #ff0000">type="redirect" <span style="color: #000000">&gt;/</span></span>account/updatePassword.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&lt;/action&gt;<br />
<strong><em style="color: #ff0000">注意:</em></strong><br />
如果将result标签的type属性设置为redirect则在Action即使使用了<br />
<br />
<span style="color: #3366ff"><strong>addActionMessage(getText("updatePassword.success")); <br />
<br />
<span style="color: #000000">在JSP页面也不能显示相应的信息</span></strong></span>
 <img src ="http://www.blogjava.net/keweibo/aggbug/176142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2008-01-18 11:23 <a href="http://www.blogjava.net/keweibo/articles/176142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork/struts2中格式化输出数字和日期的方法</title><link>http://www.blogjava.net/keweibo/articles/174997.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 13 Jan 2008 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/174997.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/174997.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/174997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/174997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/174997.html</trackback:ping><description><![CDATA[<span style="color: red">转:&nbsp; http://www.blogjava.net/aoxj/archive/2006/08/14/63461.html</span><br />
前言：大概在去年6月的时候，我们团队开始使用webwork来替代struts，刚开始大家都没有经验，为了格式化输出时间和数字，想出了很多现在看来笨笨的傻傻的方法。后来俺找到了这个方法，试验了一下之后发了下面这个email给了team member, 今天一位同事问起这个问题，俺从数以千计的已发送邮件中找到了这个东西，想想决定整理出来。给大家分享一下，顺便给我自己做个备份，呵呵，后者基本上是俺写blog的一个重要用途。<br />
<br />
&nbsp;&nbsp;&nbsp; 分享一个在WebWork中如何格式化显示数字和日期的方法：
<p><br />
具体的做法这里有详细的说明：<br />
<a href="http://wiki.opensymphony.com/display/WW1/How+to+format+dates+and+numbers?showComments=true">http://wiki.opensymphony.com/display/WW1/How+to+format+dates+and+numbers?showComments=true</a></p>
<p><br />
&nbsp;&nbsp; 下面是项目中推荐使用的时间格式:<br />
#format<br />
global.format.date={0,date,yyyy-MM-dd}<br />
global.format.time={0,date,HH:mm:ss}<br />
global.format.datetime={0,date,yyyy-MM-dd HH:mm:ss}</p>
<p>注意的是如果使用Carlender来保存时间,因为上面要求传入的是Data对象，因此需要使用Carlender.getTime()方法<br />
从Carlender中获取Date:</p>
<p>&lt;ww:text name="'global.format.date'"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ww:param value="'birthday.time()'"/&gt;<br />
&lt;/ww:text&gt;</p>
<p>这里使用的是&lt;ww:param/&gt;标签来传递参数，虽然也可以使用 &lt;ww:text name="'format.date'" value0= "'birthday.time()'"/&gt;<br />
但是后面的这个方法在webwork的新版本中已经被要求不要使用，大家还是尽量使用 &lt;ww:param/&gt;标签</p>
<p>禁用value0属性的说明：<br />
大家可以找到text标签的源代码,在com.opensymphony.webwork.views.jsp.ui.TextTag中：<br />
public void setValue0(String aName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG.warn("The value attributes of TextTag are deprecated.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value1Attr = aName;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p><br />
对于数字的格式化，这里有两个参考：<br />
global.format.percent = {0,number,##0.00'%'}<br />
global.format.money = {0,number,$##0.00}</p>
<p>考虑目前在项目中使用最多的是显示附件大小,定义以下格式:<br />
global.format.size.k={0,number,##0.00'K'}<br />
global.format.size.m={0,number,##0.00'M'}<br />
global.format.size.g={0,number,##0.00'G'}</p>
<p>如action有方法<br />
public long getFilesize();&nbsp; 返回的大小是以byte为单位，在显示时通常是以k或M显示<br />
则显示时:<br />
&lt;ww:text name="'global.format.size.k'"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ww:param value="filesize/1024"/&gt;<br />
&lt;/ww:text&gt;<br />
&lt;ww:text name="'global.format.size.m'"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ww:param value="filesize/1048576"/&gt;<br />
&lt;/ww:text&gt;<br />
&lt;ww:text name="'global.format.size.g'"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ww:param value="filesize/1073741824"/&gt;<br />
&lt;/ww:text&gt;</p>
<p>比较遗憾的是似乎没有办法在资源文件中进行这个/1024的运算，试过{0/1024,number,##0.00'K'} 无法解析。只好在jsp里面用 value="filesize/1024"来计算实际值。不知道这里有没有别的更好的实现方式？<br />
<br />
恩，顺便再介绍一下当时俺们team想出来的笨笨的方法，不要见笑啊，以上面的显示文件大小为例，想到的方法大致有以下几种：<br />
1. 直接输出字符串的结果<br />
&nbsp;&nbsp;&nbsp;getFileSizeString(), 在里面用java代码判断大小并生成诸如"1.2k", "31.2M"的结果返回<br />
2. 提供多个函数<br />
&nbsp; getFileSizeByte(), getFileSizeK(), getFileSizeM(), getFileSizeG()<br />
3.使用javascript在client端格式化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type = "text/javascript"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultNum = &lt;ww:property value="fileSize" /&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultNum = format(resultNum);//类似的函数&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(resultNum);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />
4.使用自定义标签</p>
--------------------------------------------------------------------------------------------------------------<br />
<strong>struts2中格式化输出数字和日期的方法<br />
<br />
<u>资源文件<br />
</u></strong>......<br />
#格式化数字或时间输出<br />
global.format.date={0,date,yyyy-MM-dd}<br />
global.format.money={0,number,￥##0.00 '元'}<br />
......<br />
<strong><u>JSP文件</u></strong><br />
格式化时间:&nbsp; &lt;s:text name="global.format.date"&gt;&lt;s:param value="publishTime"&gt;&lt;/s:param&gt;&lt;/s:text&gt;<br />
格式化数字:&nbsp;&nbsp;&lt;s:text name="global.format.money"&gt;&lt;s:param value="price"/&gt;&lt;/s:text&gt;<br />
<br />
<img src ="http://www.blogjava.net/keweibo/aggbug/174997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2008-01-13 17:46 <a href="http://www.blogjava.net/keweibo/articles/174997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第三部分）</title><link>http://www.blogjava.net/keweibo/articles/162756.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Fri, 23 Nov 2007 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/162756.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/162756.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/162756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/162756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/162756.html</trackback:ping><description><![CDATA[<p><span style="color: red">文章来源:http://www.javaeye.com/topic/128976</span><br />
很久没有更新BLOG了，前一段时间公司的项目比较忙，另外我还和一位出版社的朋友谈写书的事情，所以一直没有时间，完成《Struts 2与AJAX》。后来写书的事情吹了，趁今天有点空闲就把它完成。</p>
<p>在大家看这部分文章之前，我想对于写书的事情说两句，或者应该叫发牢骚才对。通过这次写书失败的经历，我明白为什么国内的IT书籍多数是滥于充数、粗制滥造、缺乏经典。其实说白了就是一个&#8220;钱&#8221;字作怪。为了市场，很多编辑可能会&#8220;建议&#8221;你去&#8220;抄考&#8221;一些国内相对畅销的同类书籍，例如写Struts就一定要按所谓的MVC进行目录分类，美其名曰&#8220;容易入门&#8221;。我认为&#8220;MVC&#8221;的概念虽然重要，但对初学者而言，需要对编程有一定的了解才容易明白此概念。另外，为了&#8220;实用&#8221;，不惜使用相同的技术重复编写不同的范例。可能是我不太了解读者的心理吧。</p>
<p>言归正传，在上两部分的《Struts 2与AJAX》中我介绍了Struts 2与DOJO结合实现AJAX的知识，本文将介绍在Struts 2中使用DWR实现AJAX表单校验。</p>
<h2>什么是DWR</h2>
<p>DWR（Direct Web Remoting）是在Java EE中较流行的AJAX框架，它的最大优势就是可以像使用本地的Javascript函数一样，调用服务器上的Java方法。如下图所示：</p>
<p><img alt="DWR工作原理" src="http://www.blogjava.net/images/blogjava_net/max/24995/r_howitworks.png" /> <br />
<span>图1 DWR工作原理</span> </p>
<p>其实DWR原理也不复杂，它先在web.xml中配置一个Servlet，映射到特定的路径（通常是%CONTEXT_PATH%/dwr/*）。这个Servlet的作用就是初始化要暴露给Javascript调用的Java类（通过dwr.xml进行配置），并生成相应的代理的Javascript类代码。在XHR请求到来的时候，Servlet负责将请求的参数变成对应的Java对象，并以其为参数调用目标Java方法，并将返回值转化为Javascript代码。详情请参考：<a href="http://getahead.ltd.uk/dwr/">http://getahead.ltd.uk/dwr/</a></p>
<h2>Struts 2与DWR</h2>
<p>在Struts 2.0.x中使用DWR实现AJAX表单校验。在大家掌握了DWR的原理后，下面我想详细介绍一下实现的步骤。</p>
<p>首先，到以下站点<a href="https://dwr.dev.java.net/files/documents/2427/47455/dwr.jar">https://dwr.dev.java.net/files/documents/2427/47455/dwr.jar</a>下载DWR的1.1.4版本的JAR包。需要注意的是，DWR虽然已经发布2.0版本，但它与1.1.4有很大的区别，所以请大家不要使用2.0版本，否则会出现异常的；</p>
<p>接着，新建WEB工程，将下图所示的JAR包加入到工程的&#8220;Build Path&#8221;中；</p>
<p><img alt="依赖的JAR包" src="http://www.blogjava.net/images/blogjava_net/max/24995/r_img_1.gif" /> <br />
<span>图2 依赖的JAR包</span> </p>
<p>接下来，配置web.xml文件，内容如下：</p>
<div><span style="color: #0000ff">&lt;?</span><span>xml version="1.0" encoding="UTF-8"</span><span>?&gt;</span><span><br />
</span><span>&lt;</span><span>web-app </span><span>id</span><span>="WebApp_9"</span><span> version</span><span>="2.4"</span><span><br />
&nbsp; &nbsp; xmlns</span><span>="http://java.sun.com/xml/ns/j2ee"</span><span><br />
&nbsp; &nbsp; xmlns:xsi</span><span>="http://www.w3.org/2001/XMLSchema-instance"</span><span><br />
&nbsp; &nbsp; xsi:schemaLocation</span><span>="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>display-name</span><span>&gt;</span><span>Struts 2 AJAX Part 3</span><span>&lt;/</span><span>display-name</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>filter</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>filter-name</span><span>&gt;</span><span>struts-cleanup</span><span>&lt;/</span><span>filter-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>filter-class</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>filter-class</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>filter</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>filter-mapping</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>filter-name</span><span>&gt;</span><span>struts-cleanup</span><span>&lt;/</span><span>filter-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>url-pattern</span><span>&gt;</span><span>/*</span><span>&lt;/</span><span>url-pattern</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>filter-mapping</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>filter</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>filter-name</span><span>&gt;</span><span>struts2</span><span>&lt;/</span><span>filter-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>filter-class</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>filter-class</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>filter</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>filter-mapping</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>filter-name</span><span>&gt;</span><span>struts2</span><span>&lt;/</span><span>filter-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>url-pattern</span><span>&gt;</span><span>/*</span><span>&lt;/</span><span>url-pattern</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>filter-mapping</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;!--&lt;/span&gt;&lt;span style="COLOR: #008000"&gt; 开始DWR配置 &lt;/span&gt;&lt;span style="COLOR: #008000"&gt;--&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>servlet</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>dwr</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>servlet-class</span><span>&gt;</span><span>uk.ltd.getahead.dwr.DWRServlet</span><span>&lt;/</span><span>servlet-class</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>init-param</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>debug</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>init-param</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>servlet</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>servlet-mapping</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>dwr</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>url-pattern</span><span>&gt;</span><span>/dwr/*</span><span>&lt;/</span><span>url-pattern</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>servlet-mapping</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;!--&lt;/span&gt;&lt;span style="COLOR: #008000"&gt; 结束DWR配置 &lt;/span&gt;&lt;span style="COLOR: #008000"&gt;--&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>welcome-file-list</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>welcome-file</span><span>&gt;</span><span>index.html</span><span>&lt;/</span><span>welcome-file</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>welcome-file-list</span><span>&gt;</span><span><br />
<br />
</span><span>&lt;/</span><span>web-app</span><span>&gt;</span></div>
<span>清单1 WebContent/WEB-INF/web.xml</span>
<p>然后是DWR的配置文件：</p>
<div><span style="color: #0000ff">&lt;?</span><span>xml version="1.0" encoding="UTF-8"</span><span>?&gt;</span><span><br />
<br />
</span><span>&lt;!--&lt;/span&gt;&lt;span style="COLOR: #008000"&gt; START SNIPPET: dwr &lt;/span&gt;&lt;span style="COLOR: #008000"&gt;--&gt;</span><span><br />
</span><span>&lt;!</span><span>DOCTYPE dwr PUBLIC&nbsp;<br />
&nbsp; &nbsp; "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"&nbsp;<br />
&nbsp; &nbsp; "http://www.getahead.ltd.uk/dwr/dwr10.dtd"</span><span>&gt;</span><span><br />
<br />
</span><span>&lt;</span><span>dwr</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>allow</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>create </span><span>creator</span><span>="new"</span><span> javascript</span><span>="validator"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param </span><span>name</span><span>="class"</span><span> value</span><span>="org.apache.struts2.validators.DWRValidator"</span><span>/&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>create</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>convert </span><span>converter</span><span>="bean"</span><span> match</span><span>="com.opensymphony.xwork2.ValidationAwareSupport"</span><span>/&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>allow</span><span>&gt;</span><span><br />
<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>signatures</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;![CDATA[&lt;/span&gt;&lt;span style="COLOR: #808080"&gt;&lt;br /&gt; &nbsp; &nbsp; &nbsp; &nbsp; import java.util.Map;&lt;br /&gt; &nbsp; &nbsp; &nbsp; &nbsp; import org.apache.struts2.validators.DWRValidator;&lt;br /&gt; &lt;br /&gt; &nbsp; &nbsp; &nbsp; &nbsp; DWRValidator.doPost(String, String, Map&lt;String, String&gt;);&lt;br /&gt; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;]&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>signatures</span><span>&gt;</span><span><br />
</span><span>&lt;/</span><span>dwr</span><span>&gt;</span><span><br />
</span><span>&lt;!--&lt;/span&gt;&lt;span style="COLOR: #008000"&gt; END SNIPPET: dwr &lt;/span&gt;&lt;span style="COLOR: #008000"&gt;--&gt;</span></div>
<span>清单2 WebContent/WEB-INF/dwr.xml</span>
<p>通过以上配置，我们可以将DWRValidator中的方法暴露为Javascript可以调用的远程接口。</p>
<p>在正确完成以上步骤之后，我们发布运行一下应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_Ajax3/dwr/">http://localhost:8080/Struts2_Ajax3/dwr/</a>，应该会出现如下页面：</p>
<p><img alt="DWR Servlet默认输出页面" src="http://www.blogjava.net/images/blogjava_net/max/24995/r_img_2.gif" /> <br />
<span>图3 DWR Servlet默认输出页面</span> </p>
<p>&nbsp;接下来，我们要开始编写Action类了，代码如下：</p>
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span>package</span><span> tutorial;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span>import</span><span> com.opensymphony.xwork2.ActionSupport;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_116_653_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_116_653_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span>public</span><span> </span><span>class</span><span> AjaxValidation </span><span>extends</span><span> ActionSupport </span><span id="Codehighlighter1_116_653_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_116_653_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>private</span><span> </span><span>static</span><span> </span><span>final</span><span> </span><span>long</span><span> serialVersionUID </span><span>=</span><span> </span><span>-</span><span>7901311649275887920L</span><span>;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>private</span><span> String name;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>private</span><span> String password;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>private</span><span> </span><span>int</span><span> age;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_277_294_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_277_294_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> </span><span>int</span><span> getAge() </span><span id="Codehighlighter1_277_294_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_277_294_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>return</span><span> age;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_327_348_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_327_348_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> </span><span>void</span><span> setAge(</span><span>int</span><span> age) </span><span id="Codehighlighter1_327_348_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_327_348_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>this</span><span>.age </span><span>=</span><span> age;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_377_395_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_377_395_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> String getName() </span><span id="Codehighlighter1_377_395_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_377_395_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>return</span><span> name;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_433_456_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_433_456_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> </span><span>void</span><span> setName(String name) </span><span id="Codehighlighter1_433_456_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_433_456_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>this</span><span>.name </span><span>=</span><span> name;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_489_511_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_489_511_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> String getPassword() </span><span id="Codehighlighter1_489_511_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_489_511_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>return</span><span> password;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_557_588_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_557_588_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> </span><span>void</span><span> setPassword(String password) </span><span id="Codehighlighter1_557_588_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_557_588_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>this</span><span>.password </span><span>=</span><span> password;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_628_651_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_628_651_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> String execute() </span><span id="Codehighlighter1_628_651_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_628_651_Open_Text"><span>{ &nbsp; &nbsp; &nbsp; &nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span>return</span><span> SUCCESS;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> &nbsp; &nbsp;}</span></span><span><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<span>清单3 src/tutorial/AjaxValidation.java</span>
<p>上述代码一目了然，相信大家已经很熟悉了。下面，我们再来看看表单校验的配置代码：</p>
<div><span style="color: #0000ff">&lt;!</span><span>DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"</span><span>&gt;</span><span><br />
</span><span>&lt;</span><span>validators</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>validator </span><span>type</span><span>="regex"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param </span><span>name</span><span>="fieldName"</span><span>&gt;</span><span>password</span><span>&lt;/</span><span>param</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param </span><span>name</span><span>="expression"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;![CDATA[&lt;/span&gt;&lt;span style="COLOR: #808080"&gt;(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;]&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>param</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>message</span><span>&gt;</span><span>Password must be between 8 and 10 characters, contain at least one digit and one alphabetic character, and must not contain special characters</span><span>&lt;/</span><span>message</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>validator</span><span>&gt;</span><span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span>&lt;</span><span>field </span><span>name</span><span>="name"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>field-validator </span><span>type</span><span>="requiredstring"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>message</span><span>&gt;</span><span>You must enter a name</span><span>&lt;/</span><span>message</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>field-validator</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>field</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>field </span><span>name</span><span>="age"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>field-validator </span><span>type</span><span>="int"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param </span><span>name</span><span>="min"</span><span>&gt;</span><span>18</span><span>&lt;/</span><span>param</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>param </span><span>name</span><span>="max"</span><span>&gt;</span><span>127</span><span>&lt;/</span><span>param</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>message</span><span>&gt;</span><span>Age must be between 18 and 127</span><span>&lt;/</span><span>message</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>field-validator</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>field</span><span>&gt;</span><span><br />
</span><span>&lt;/</span><span>validators</span><span>&gt;</span></div>
<span>清单4 src/tutorial/AjaxValidation-validation.xml</span>
<p>对于AjaxValidation类的name、password和age三个字段，我分别用了非空、正规表达式和范围验证。正规表达式<span>(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$</span>的作用是保证密码由至少包括一个数字和一个字母，且不能含有符号的长度为8到10的字符串组成。它也是所谓强密码（Strong Password）的普通实现。</p>
<p>接下来的是JSP的代码，内容如下：</p>
<div><span style="color: #000000; background-color: #ffff00">&lt;%</span><span>@ page language</span><span>=</span><span>"</span><span>java</span><span>"</span><span> contentType</span><span>=</span><span>"</span><span>text/html; charset=utf-8</span><span>"</span><span><br />
&nbsp; &nbsp; pageEncoding</span><span>=</span><span>"</span><span>utf-8</span><span>"</span><span>%&gt;</span><span><br />
</span><span>&lt;%</span><span>@ taglib prefix</span><span>=</span><span>"</span><span>s</span><span>"</span><span> uri</span><span>=</span><span>"</span><span>/struts-tags</span><span>"</span><span>%&gt;</span><span><br />
<br />
</span><span>&lt;!</span><span>DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span>&gt;</span><span><br />
</span><span>&lt;</span><span>html </span><span>xmlns</span><span>="http://www.w3.org/1999/xhtml"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>head</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>title</span><span>&gt;</span><span>Struts 2 AJAX - Validation</span><span>&lt;/</span><span>title</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>s:head </span><span>theme</span><span>="ajax"</span><span> </span><span>/&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>head</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>body</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>h2</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AJAX Validation Using DWR<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>h2</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>s:form </span><span>method</span><span>="post"</span><span> validate</span><span>="true"</span><span> theme</span><span>="ajax"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>s:textfield </span><span>label</span><span>="Name"</span><span> name</span><span>="name"</span><span> </span><span>/&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>s:password </span><span>label</span><span>="Password"</span><span> name</span><span>="password"</span><span> </span><span>/&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>s:textfield </span><span>label</span><span>="Age"</span><span> name</span><span>="age"</span><span> </span><span>/&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>s:submit </span><span>/&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>s:form</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>body</span><span>&gt;</span><span><br />
</span><span>&lt;/</span><span>html</span><span>&gt;</span></div>
<span>清单5 WebContent/AjaxValidation.jsp</span>
<p>以上代码也不复杂，不过需要的是注意的是除了要加入<S:HEAD theme="ajax"></S:HEAD>外，<S:FORM></S:FORM>也必须加入validate="true" theme="ajax"的属性。</p>
<p>最后是Struts 2的配置文件，内容如下所示：</p>
<div><span style="color: #0000ff">&lt;?</span><span>xml version="1.0" encoding="UTF-8"</span><span>?&gt;</span><span><br />
<br />
</span><span>&lt;!</span><span>DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span>&gt;</span><span><br />
<br />
</span><span>&lt;</span><span>struts</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;</span><span>package </span><span>name</span><span>="Struts2_AJAX_DEMO"</span><span> extends</span><span>="struts-default"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>action </span><span>name</span><span>="AjaxValidation"</span><span> class</span><span>="tutorial.AjaxValidation"</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>result </span><span>name</span><span>="input"</span><span>&gt;</span><span>AjaxValidation.jsp</span><span>&lt;/</span><span>result</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;</span><span>result</span><span>&gt;</span><span>AjaxValidation.jsp</span><span>&lt;/</span><span>result</span><span>&gt;</span><span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span>&lt;/</span><span>action</span><span>&gt;</span><span><br />
&nbsp; &nbsp; </span><span>&lt;/</span><span>package</span><span>&gt;</span><span><br />
</span><span>&lt;/</span><span>struts</span><span>&gt;</span></div>
<span>清单6 src/struts.xml</span>
<p>最后发布运应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action">http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action</a>出现如下图所示页面：</p>
<p><img alt="AjaxValidation页面输出" src="http://www.blogjava.net/images/blogjava_net/max/24995/r_img_3.gif" /> <br />
<span>图4 AjaxValidation页面输出</span> </p>
<p>在文本框中输入错误的值使页面出现错误提示信息，如下图所示：</p>
<p><img alt="AjaxValidation页面错误提示" src="http://www.blogjava.net/images/blogjava_net/max/24995/r_img_4.gif" /> <br />
<span>图5 AjaxValidation页面错误提示</span> </p>
<p>可能有朋友会问怎么知道这是通过AJAX进行校验的呢？在这里我向大家推荐一个AJAX开发必备的工具——Firebug。Firebug是Firefox的一个功能强大的插件，它可以准确地输出和定位Javascript的错误、通过直观的方式查看HTML文档的DOM及其样式、所见即所得的编辑方式，更值得一赞的是它可以方便地对Javascript进行跟踪和调试，如果你希望这进一步了解这个工具，请安装Firefox 2.0以上版本，并使用它浏览以下网址<a href="http://www.getfirebug.com/">http://www.getfirebug.com</a>。</p>
<p>在安装完成Firebug之后，在Firefox中打开<a href="http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action">http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action</a>，按&#8220;F12&#8221;键找开Firebug窗口，如果你第一次使用Firebug，请点击其窗口中的链接&#8220;Enable Firebug&#8221;激活插件。之后，点击&#8220;Net&#8221;，并在出现的菜单中点击选中&#8220;XHR&#8221;。然后将光标移入文本框，再将光标移出使文本框失去焦点，你可以看到Firebug窗口会多出一项记录，如下图所示：</p>
<p><img alt="Firebug中查看XHR请求" src="http://www.blogjava.net/images/blogjava_net/max/24995/r_img_5.gif" /> <br />
<span>图6 Firebug中查看XHR请求</span> </p>
<p>这就证明你在文本框失去焦出时，Struts 2会发送XHR请求到服务器以对该文本框值进行校验。有兴趣的朋友可以通过Firebug，研究XHR的请求与响应，这样可以加深对DWR工作原理的理解。</p>
<h2>何时使用AJAX表单校验</h2>
<p>虽然在Struts 2实现AJAX表单校验是一件非常简单的事，但我建议大家不要在所有的场合都使用这个功能，原因可以分为以下几个方面：</p>
<ol>
    <li>AJAX校验在服务器上进行数据校验，可能会比较耗时；
    <li>AJAX校验可能会过于频繁，加重服务器的负载；
    <li>一些普通的校验，只需要使用纯Javascript便可以实现。 </li>
</ol>
<p>读到这里，有的朋友可能会问：&#8220;那么什么时候才应该使用AJAX表单校验呢？&#8221;答案其实很简单，当我们的校验在页面加载时还不能够确定的情况下，就应该使用这个功能。例如，注册用户时，校验用户名是否已经存在；或者校验涉及过多的页务逻辑等。</p>
<p>现在让我们来改造一下上述例子，对于name我们可以使用AJAX校验，但对于其它的字段应该使用纯Javascript的校验。</p>
<p>在tutorial.AjaxValidation类加入如下方法：</p>
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_35_216_Open_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_35_216_Closed_Image" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /> &nbsp; &nbsp;</span><span>public</span><span> </span><span>void</span><span> validate() </span><span id="Codehighlighter1_35_216_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_35_216_Open_Text"><span>{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;Set</span><span>&lt;</span><span>String</span><span>&gt;</span><span> users </span><span>=</span><span> </span><span>new</span><span> HashSet</span><span>&lt;</span><span>String</span><span>&gt;</span><span>();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span><span>"</span><span>max</span><span>"</span><span>);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span><span>"</span><span>scott</span><span>"</span><span>);<br />
<img id="Codehighlighter1_151_213_Open_Image" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=" src_cetemp="  ? />http://www.blogjav</span></span></div>
<img src ="http://www.blogjava.net/keweibo/aggbug/162756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-24 00:05 <a href="http://www.blogjava.net/keweibo/articles/162756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2拦截器的使用</title><link>http://www.blogjava.net/keweibo/articles/162558.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Fri, 23 Nov 2007 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/162558.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/162558.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/162558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/162558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/162558.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何使用struts2拦截器，或者自定义拦截器。特别注意，在使用拦截器的时候，在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器)：                        &lt;interceptor-ref name="checkbox"&gt;           ...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/162558.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/162558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-23 10:35 <a href="http://www.blogjava.net/keweibo/articles/162558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表单标志使用小技巧</title><link>http://www.blogjava.net/keweibo/articles/162555.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Fri, 23 Nov 2007 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/162555.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/162555.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/162555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/162555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/162555.html</trackback:ping><description><![CDATA[<p>Struts 2为大家提供了不少常用的很酷的表单标志，简化了我们程序员的工作。不过，由于这些都是新标志，大家可能在使用上还存在不少疑问。本文将就朋友们的回复、留言或Email上的问题，分别对这些酷标志进行讲述。<br />
下面我将分别对这些标志进行讲述：<br />
</p>
<h2>&nbsp;&nbsp;&nbsp;Struts 2的表单标志在输出（render）HTML时，使用了模板的概念，增加了复杂性（因为它不像Struts 1.x的表单标志，它通常都是一个标志对应HTML的一个元素），因此大家在使用时，需要一些技巧：
<ol>
    <li>Struts 2的UI标志的表单标志默认是以表格布局，按钮是右对齐的。如果你不喜欢此风格，你可以简单地将&lt;s:form /&gt;标志的&#8220;theme&#8221;属性设为&#8220;simple&#8221;，然后用以往的做法自已布局表单元素（注意：此法有利有弊，弊就是当你将&#8220;theme&#8221;属性设为&#8220;simple&#8221;时，表单标志以最简单方式输出HTML，所以你可能失去一些默认输出提供的便利，如：友好的错误信息的显示，或客户端的表单验证等）。当然更好的做法是通过CSS或自定义主题（theme）然后应用到整个应用程序，这样可以获得一致的页面风格，加强用户体验（我会在以后的文章对此进行讲解）；
    <li>当你在页面上加入某些标志（如：&lt;s:doubleselect /&gt;等）时，应该通过action来访问页面，而不是通过*.jsp的URL直接访问。</li>
</ol>
</h2>
<h2>1、&lt;s:checkboxlist /&gt;</h2>
<p>大家对&lt;s:checkboxlist /&gt;的最大的疑问可能是：&#8220;如何在默认情况下，选中某些checkbox？&#8221;</p>
<p>答案其实很简单，只需要将其&#8220;value&#8221;属性设为你的要选中的值，如以代码所示：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:checkboxlist/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:checkboxlist/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:checkboxlist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="skills1"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Skills 1"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="{ 'Java', '.Net', 'RoR', 'PHP' }"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="{ 'Java', '.Net' }"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:checkboxlist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="skills2"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Skills 2"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listKey</span><span style="color: #0000ff">="key"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listValue</span><span style="color: #0000ff">="value"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="{ 1, 2, 3 }"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单1 WebContent/checkboxlist.jsp</span>
<p>分布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp">http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp</a>，出现如下图所示页面：</p>
<p><img height="257" alt="checkboxlist.jsp页面" src="http://www.java3z.com/cwbwebhome/article/article2/img3/r_checkboxlist.gif" width="359" /><br />
<span style="font-size: smaller; font-style: italic">清单2 checkboxlist.jsp页面</span></p>
<h2>2、&lt;s:doubleselect /&gt;</h2>
<p>大家看Struts 2的showcase的例子，&lt;s:doubleselect /&gt;的用法如下所示：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:doubleselect<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">tooltip</span><span style="color: #0000ff">="Choose Your State"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="State"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="region"</span><span style="color: #ff0000"> list</span><span style="color: #0000ff">="{'North', 'South'}"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="'South'"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleValue</span><span style="color: #0000ff">="'Florida'"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="top == 'North' ? {'Oregon', 'Washington'} : {'Texas', 'Florida'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="state"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="---------- Please Select ----------"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单3 Showcase中&lt;s:doubleselect /&gt;</span>
<p>很多朋友问：&#8220;上面的&#8216;list&#8217;属性只有两个值，如果我有三个或更多的值，&#8216;doublelist&#8217;属性应该如何设定呢？&#8221;</p>
<p>我建议的做法是先定义一个Map类型的对象，键为&#8220;list&#8221;的集合，值则为&#8220;doubleList&#8221;的集合，然后&#8220;doubleList&#8221;的OGNL写成&#8220;#myMap[top]&#8221;，如以下代码所示：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:doubeselect/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:doubleselect/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:set </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="foobar"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;value</span><span style="color: #0000ff">="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:doubleselect </span><span style="color: #ff0000">list</span><span style="color: #0000ff">="#foobar.keySet()"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="technology"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="#foobar[top]"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Technology"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单4 WebContent/doubleselect.jsp</span>
<p>分布运行应用程序，在浏览器中键入：http://localhost:8080/Struts2_CoolTags/doubleselect.action，出现如下图所示页面：</p>
<p><img height="257" alt="doubleselect.jsp页面" src="http://www.java3z.com/cwbwebhome/article/article2/img3/r_doubleselect.gif" width="259" /><br />
<span style="font-size: smaller; font-style: italic">清单5 doubleselect.jsp页面</span></p>
<h2>3、&lt;s: token /&gt;</h2>
<p>这个标志可能大家不常用，不过本人认为它还是挺有用的。在使用Struts 1.x时，因为跳转通常是用Forward（而不是Redirect）实现的，所以当用户完成请求后，按&#8220;F5&#8221;刷新页面时，就会重新提交上次的请求，这样经常会出错。要解决这个问题，&lt;s:token /&gt;可以帮你忙。</p>
<h3>实现原理</h3>
<p>在页面加载时，&lt;s: token /&gt;产生一个GUID（Globally Unique Identifier，全局唯一标识符）值的隐藏输入框如：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="hidden"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="struts.token.name"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="struts.token"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="hidden"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="struts.token"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"</span><span style="color: #0000ff">/&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单6 &lt;s:token /&gt;的HTML输出</span>
<p>同时，将GUID放到会话（session）中；在执行action之前，&#8220;token&#8221;拦截器将会话token与请求token比较，如果两者相同，则将会话中的token删除并往下执行，否则向actionErrors加入错误信息。如此一来，如果用户通过某种手段提交了两次相同的请求，两个token就会不同。</p>
<h3>具体实现</h3>
<p>首先看一下Action的代码：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.java3z.com/cwbwebhome/article/article2/img/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> tutorial;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/None.gif" align="top"  alt="" /><br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> com.opensymphony.xwork2.ActionSupport;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_115_471_Open_Image" onclick="this.style.display='none'; Codehighlighter1_115_471_Open_Text.style.display='none'; Codehighlighter1_115_471_Closed_Image.style.display='inline'; Codehighlighter1_115_471_Closed_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_115_471_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_115_471_Closed_Text.style.display='none'; Codehighlighter1_115_471_Open_Image.style.display='inline'; Codehighlighter1_115_471_Open_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> CoolTagAction </span><span style="color: #0000ff">extends</span><span style="color: #000000"> ActionSupport </span><span id="Codehighlighter1_115_471_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.java3z.com/cwbwebhome/article/article2/img/dot.gif"  alt="" /></span><span id="Codehighlighter1_115_471_Open_Text"><span style="color: #000000">{ &nbsp; &nbsp;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">final</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span><span style="color: #000000"> serialVersionUID </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">6820659617470261780L</span><span style="color: #000000">;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> String message;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;<br />
<img id="Codehighlighter1_244_265_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_265_Open_Text.style.display='none'; Codehighlighter1_244_265_Closed_Image.style.display='inline'; Codehighlighter1_244_265_Closed_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_244_265_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_265_Closed_Text.style.display='none'; Codehighlighter1_244_265_Open_Image.style.display='inline'; Codehighlighter1_244_265_Open_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getMessage() </span><span id="Codehighlighter1_244_265_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.java3z.com/cwbwebhome/article/article2/img/dot.gif"  alt="" /></span><span id="Codehighlighter1_244_265_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> message;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_308_337_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_337_Open_Text.style.display='none'; Codehighlighter1_308_337_Closed_Image.style.display='inline'; Codehighlighter1_308_337_Closed_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_308_337_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_308_337_Closed_Text.style.display='none'; Codehighlighter1_308_337_Open_Image.style.display='inline'; Codehighlighter1_308_337_Open_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setMessage(String message) </span><span id="Codehighlighter1_308_337_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.java3z.com/cwbwebhome/article/article2/img/dot.gif"  alt="" /></span><span id="Codehighlighter1_308_337_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message </span><span style="color: #000000">=</span><span style="color: #000000"> message;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_377_468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_468_Open_Text.style.display='none'; Codehighlighter1_377_468_Closed_Image.style.display='inline'; Codehighlighter1_377_468_Closed_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_468_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_468_Closed_Text.style.display='none'; Codehighlighter1_377_468_Open_Image.style.display='inline'; Codehighlighter1_377_468_Open_Text.style.display='inline';" src="http://www.java3z.com/cwbwebhome/article/article2/img/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> String execute() </span><span id="Codehighlighter1_377_468_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.java3z.com/cwbwebhome/article/article2/img/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_468_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Executing action, your message is </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> message);<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> SUCCESS;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"> &nbsp; &nbsp;<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/img/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<span style="font-size: smaller; font-style: italic">清单7 src/tutorial/CoolTagAction.java</span>
<p>以上代码一目了然，再看看JSP的写法：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %&gt;<br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:token/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:token/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:actionerror </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Token"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="message"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="Message"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:token </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单8 WebContent/token.jsp</span>
<p>JSP也很简单，就是加入&lt;s:token /&gt;标志。接下来是Actoin配置的XML片段：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Struts2_COOL_TAGS_DEMO"</span><span style="color: #ff0000"> extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Token"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="tutorial.CoolTagAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="token"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="invalid.token"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/token.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/token.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/{1}.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单9 src/struts.xml</span>
<p>以上XML片段值注意的是加入了&#8220;token&#8221;拦截器和&#8220;invalid.token&#8221;结果，因为&#8220;token&#8221;拦截器在会话token与请求token不一致时，将会直接返回&#8220;invalid.token&#8221;结果。</p>
<p>发布运行应用程序，在浏览器中键入：http://localhost:8080/Struts2_CoolTags/token.jsp，出现如下图所示页面：</p>
<p><img height="265" alt="正常显示的token.jsp页面" src="http://www.java3z.com/cwbwebhome/article/article2/img3/r_token1.gif" width="297" /><br />
<span style="font-size: smaller; font-style: italic">清单10 正常显示的token.jsp页面</span></p>
<p>随便填点东西并提交页面，一切正常返回以上页面，然后按&#8220;F5&#8221;刷新页面，在弹出的对话框中点击&#8220;Retry&#8221;，出现如下图所示页面：</p>
<p><img height="321" alt="重复提交出错显示" src="http://www.java3z.com/cwbwebhome/article/article2/img3/r_token2.gif" width="434" /><br />
<span style="font-size: smaller; font-style: italic">清单11 重复提交出错显示</span></p>
<h2>4、&lt;s:datetimepicker /&gt;、&lt;s:optiontransferselect /&gt;和&lt;s:updownselect /&gt;</h2>
<p>这几个标志的使用相对简单，所以我想小举一例即可，以下是JSP的代码：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - Others</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Others</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:datetimepicker </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="birthday"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="Birthday"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:updownselect<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">label </span><span style="color: #0000ff">= "Favourite Countries"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#{'england':'England', 'america':'America', 'germany':'Germany'}"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="prioritisedFavouriteCountries"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="--- Please Order Them Accordingly ---"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:optiontransferselect &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Favourite Cartoons Characters"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="leftSideCartoonCharacters"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; leftTitle</span><span style="color: #0000ff">="Left Title"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rightTitle</span><span style="color: #0000ff">="Right Title"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="{'Popeye', 'He-Man', 'Spiderman'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; multiple</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="headerKey"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="--- Please Select ---"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="{'Superman', 'Mickey Mouse', 'Donald Duck'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="rightSideCartoonCharacters"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleHeaderKey</span><span style="color: #0000ff">="doubleHeaderKey"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleHeaderValue</span><span style="color: #0000ff">="--- Please Select ---"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleEmptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleMultiple</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单12 WebContent\others.jsp页面</span>
<p>发布运行应用程序，在浏览器中键入：http://localhost:8080/Struts2_CoolTags/others.jsp，出现如下图所示页面：</p>
<p><img height="480" alt="点击查看大图" src="http://www.java3z.com/cwbwebhome/article/article2/img3/r_others.gif" width="410" /><br />
<span style="font-size: smaller; font-style: italic">清单13 其它表单标志页面</span></p>
<h2>总结</h2>
<p>Struts 2在标志上的确比Struts 1.x丰富了许多，同时模板机制也给程序员带来不少方便（如果你不太喜欢个性化的风格）。另外，Struts 2还有一些AJAX（如&lt;s: autocompleter /&gt;等）的标志和非表单的UI标志（如&lt;s: tree /&gt;等），我会在以后的文章中讲述其使用。</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/162555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-23 10:33 <a href="http://www.blogjava.net/keweibo/articles/162555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中使用displayTags的问题(ParametersInterceptor - [setParameters]: Unexpected Exception)</title><link>http://www.blogjava.net/keweibo/articles/161226.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 17 Nov 2007 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/161226.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/161226.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/161226.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/161226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/161226.html</trackback:ping><description><![CDATA[今天在struts2中使用了displayTags,没想到控制台却输出以下错误信息:<br />
<span style="color: red;">ERROR - ParametersInterceptor - [setParameters]: Unexpected Exception caught setting 'd-49653-p' on 'class dgut.ke.actions.SubjectAction: Error setting expression 'd-49653-p' with value '[Ljava.lang.String;@d73256'<br />
<span style="color: #060000;"><br />
在网上的搜了一下,在一些中文网页上几乎都找不到相关的信息,结果在一个英语网站上看到了以下信息:<br />
</span></span><br />
I use struts2.0.9 and displaytag,xwork-2.0.4.jar,when I click next page of
<br />
displaytag,it will raise flowing warning:
<br />
<br />
Warn: ParametersInterceptor - [setParameters]: Unexpected Exception caught
<br />
setting 'd-1332698-p' on 'class Test.TestAction: Error setting expression
<br />
'd-1332698-p' with value '[Ljava.lang.String;@14bf534'
<br />
RE:<br />
<span style="color: #ff0000;">It's a warning that occurs because you're using displaytags.
</span><br />
<br />
Don't worry about it, it won't hurt you, and messing with it will just make
<br />
bad things happen (you know the kind of thing, long nights trying to work
<br />
out things like why table sorting isn't working, why data isn't being
<br />
displayed, and why the world is so unfair).
<br />
<br />
In the words of a nice policeman; "Move along, there's nothing to see here"
<br />
<br />
-----Original Message-----
<br />
From: red phoenix [mailto:<a href="http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=12905032&amp;i=0" target="_top" rel="nofollow">rodphoenix@...</a>]
<br />
Sent: 26 September 2007 16:29
<br />
To: Struts Users Mailing List
<br />
Subject: Error: ParametersInterceptor - [setParameters]
<br />
<br />
<br />
I use struts2.0.9 and displaytag,xwork-2.0.4.jar,when I click next page of
<br />
displaytag,it will raise flowing warning:
<br />
<br />
Warn: ParametersInterceptor - [setParameters]: Unexpected Exception caught
<br />
setting 'd-1332698-p' on 'class Test.TestAction: Error setting expression
<br />
'd-1332698-p' with value '[Ljava.lang.String;@14bf534'
<br />
<br />
Why raise above waring? <span style="color: #ff0000;">How to solve it</span>?
<br />
Thanks!
<br />
Add the following line to your struts.xml file.
<br />
d-.*-p
<br />
<br />
Example:
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-stack name="creditDefaultStack"&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="creditException" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="alias" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="servlet-config" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="prepare" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="i18n" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="chain" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="debugging" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="profiling" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="scoped-model-driven" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="model-driven" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="checkbox" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="static-params" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="params"&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dojo\..*
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d-.*-p		&lt;/interceptor-ref&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="conversionError" /&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="validation"&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<br />
&nbsp;		cancel,execute,delete,edit,list,start
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/interceptor-ref&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;interceptor-ref name="workflow"&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; input,back,cancel,browse
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/interceptor-ref&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/interceptor-stack&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/interceptors&gt;
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;default-interceptor-ref name="creditDefaultStack" /&gt;
<br />
照上面的说法去做,由于本人能力有限,还是未能解决.去下个高点的版本试试看,期待能解决!<br />
<br />
<img src ="http://www.blogjava.net/keweibo/aggbug/161226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-17 15:21 <a href="http://www.blogjava.net/keweibo/articles/161226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中的OGNL</title><link>http://www.blogjava.net/keweibo/articles/159957.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 12 Nov 2007 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/159957.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/159957.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/159957.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/159957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/159957.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本人是一个EL（Expression Language，以下译为表达式语言）的支持者。因为我对&lt;%%&gt;写法极为反感，忘记了在那本书上看到的一句话——&#8220;使用标志（Tag）的一个目的就是避免在JSP页面中出现过多的&lt;%%&gt;的语句，使页面与后台代码分离。&#8221;表达式语言主要有以下几大好处：    避免(MyType) request.g...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/159957.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/159957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-11-12 14:08 <a href="http://www.blogjava.net/keweibo/articles/159957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts 2.0 中一些重要tag的用法及常用属性介绍</title><link>http://www.blogjava.net/keweibo/articles/150838.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 07 Oct 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/150838.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/150838.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/150838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/150838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/150838.html</trackback:ping><description><![CDATA[<table class="center_tdbgall" style="word-break: break-all" cellspacing="0" cellpadding="0" width="760" align="center" border="0">
    <tbody>
        <tr valign="middle" align="center">
            <td class="main_ArticleTitle" style="word-break: break-all" colspan="2" height="50">struts 2.0 中一些重要tag的用法及常用属性介绍</td>
        </tr>
        <tr valign="middle" align="center">
            <td class="main_ArticleSubheading" style="word-break: break-all" colspan="2"></td>
        </tr>
        <tr align="center">
            <td class="Article_tdbgall" colspan="2">作者：lijie250&nbsp;&nbsp;&nbsp;&nbsp;文章来源：http://www.wangmeng.cn/Article/SOFTDEVELOP/JAVA/200705/2672.html</td>
        </tr>
        <tr>
            <td class="main_tdbg_760" id="fontzoom" style="word-break: break-all" valign="top" colspan="2" height="300">
            <table cellspacing="0" cellpadding="10" align="left" border="0">
                <tbody>
                    <tr>
                        <td style="width: 23px; height: 41px"><!--插入广告js代码--></td>
                    </tr>
                </tbody>
            </table>
            <div class="content">
            <p>首先 要注意的是<br />
            struts2中tag支持jsp,freeMarker ,velocity</p>
            <p>因此，tag也有三种形式<br />
            例如：<br />
            JSP下的form标签： &lt;s:form action="example"&gt;<br />
            velocity的form标签： #sform ("action=example")<br />
            freeMarker下的form标签： &lt;@s.form action="example"&gt;</p>
            <p>下面以JSP使用的标签为例：<br />
            1<span style="color: red">&nbsp;&lt;s:head&gt;<br />
            </span>&nbsp;这个标签用在&lt;head&gt;&lt;/head&gt;中，<br />
            将会引入struts tag用到的一些css和js文件<br />
            &nbsp;需要注意的是，如果任何ui tag或者ajax tag的theme属性值是ajax<br />
            &nbsp;那么&lt;s:head&gt;必须有theme属性 并且它的值是ajax<br />
            &nbsp;这将会额外地引入与ajax相关的js文件，比如dojo.js<br />
            <br />
            2 <span style="color: red">&lt;s:form&gt;<br />
            </span>&nbsp;类似于struts 1.x 的&lt;html:form&gt;<br />
            &nbsp;validate属性：默认是false <br />
            如果设为true 那么struts2框架会自动生成一个javascript的验证方法，<br />
            &nbsp;并且根据validation.xml的配置客户端验证。<br />
            如果这个页面没有&lt;s:head&gt;标签将会产生js错误<br />
            &nbsp;namespace属性：指定这个form需要提交到哪个namespace<br />
            <br />
            3&nbsp; <span style="color: red">&lt;s:submit&gt;</span><br />
            &nbsp;theme属性：指明theme="ajax" 会使用ajax功能,通过异步方式传输数据<br />
            &nbsp;targets属性：指定异步方式返回的数据显示的位置 ，<br />
            &nbsp;例如&lt;div id="div1"&gt;&lt;/div&gt;....<br />
            &lt;s:submit theme="ajax" targets="div1" name="nn"/&gt;<br />
            &nbsp;formId属性：允许远程提交表单，<br />
            即&lt;s:submit&gt;标签的位置并不在&lt;s:form&gt;&lt;/s:form&gt;范围内<br />
            &nbsp;indicator属性：指定一个indicator，例如&lt;img id="indicator" src=...<br />
            &nbsp;在使用异步方式的时候，会产生一个表示正在loading的小图片<br />
            <br />
            4 <span style="color: red">&lt;s:autocompleter&gt;</span>自动填充器<br />
            &nbsp;theme属性：如果theme值是simple，表示使用普通方式。<br />
            如果是ajax表示使用异步方式<br />
            &nbsp;list属性：指定使用的数据集合。<br />
            它的值可以是action中的一个属性，直接在标签中指定<br />
            &nbsp;&nbsp;例如：list="{'apple','banana','grape','pear'}"<br />
            &nbsp;indicator属性：&nbsp;指定一个indicator，theme属性必须是ajax,否则没有意义<br />
            &nbsp;href属性：使用的数据集合从url中获取，<br />
            例如href="%{exampleList}"表示使用了一个&lt;s:url&gt;已经定义过的url：<br />
            &lt;s:url id="exampleList"&gt;&nbsp;<br />
            &nbsp;searchType属性：默认是startstring，也可以指定为startword或者substring，<br />
            表示自动填充的查询方式<br />
            &nbsp;delay属性：指定动作等待多少毫秒<br />
            &nbsp;loadMinimumCount属性：当loadOnTextChange为true时，<br />
            &nbsp;loadMinimumCount表示输入了多少个字符后，才开始重新加载数据集合，<br />
            &nbsp;&nbsp;这时theme属性必须是ajax,否则没有意义<br />
            <br />
            5<span style="color: red">&nbsp;&lt;s:actionerror /&gt;<br />
            </span>&nbsp;&nbsp;&nbsp;&nbsp;作用大致相当于struts 1.x中的 &lt;html:errors/&gt;<br />
            &nbsp;&nbsp;类似的还有&lt;s:actionmessage /&gt;<br />
            <br />
            6 <span style="color: red">&lt;s:fielderror&gt;<br />
            </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段验证错误的报错信息<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:fielderror&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;s:param&gt;field1&lt;/s:param&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;s:param&gt;field2&lt;/s:param&gt;<br />
            &nbsp; &nbsp; &lt;/s:fielderror&gt;<br />
            &nbsp; &nbsp; 表示只显示field1，field2的错误信息，<br />
            如果没有&lt;s:param/&gt;表示显示全部<br />
            &nbsp; &nbsp; 错误信息的内容由action的.properties文件指定<br />
            <br />
            7<span style="color: red">&nbsp;&lt;s:textfield/&gt;<br />
            </span>&nbsp; 输入框<br />
            &nbsp; label属性：显示一段文字，<br />
            例如&lt;s:textfield label="find"/&gt;会自动生成HTML代码：find:&lt;input type="text"/&gt;<br />
            &nbsp; labelposition属性：top/left，显示label的位置,<br />
            可以使用top将文字显示在输入框的上面<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认是left<br />
            <br />
            8 <span style="color: red">&lt;s:token /&gt;<br />
            </span>&nbsp; 生成一个令牌 ，防止用户重复提交表单</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/keweibo/aggbug/150838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-07 14:33 <a href="http://www.blogjava.net/keweibo/articles/150838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 interceptor 问题(请教高手)</title><link>http://www.blogjava.net/keweibo/articles/150747.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 06 Oct 2007 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/150747.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/150747.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/150747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/150747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/150747.html</trackback:ping><description><![CDATA[<p>今天写了一个自定义拦截器.却遇到了以下问题</p>
<p>package dgut.ke.interceptors;</p>
<p>import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import javax.servlet.http.HttpServletRequest;</p>
<p>import org.apache.struts2.ServletActionContext;</p>
<p>import com.opensymphony.xwork2.Action;<br />
import com.opensymphony.xwork2.ActionContext;<br />
import com.opensymphony.xwork2.ActionInvocation;<br />
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;</p>
<p>import dgut.ke.model.Catalog;<br />
import dgut.ke.model.Publish;<br />
import dgut.ke.model.Subject;<br />
import dgut.ke.service.ICatalogService;<br />
import dgut.ke.service.IPublishService;<br />
import dgut.ke.service.ISubjectService;</p>
<p>public class AddBookInterceptor extends MethodFilterInterceptor {</p>
<p>&nbsp;/**<br />
&nbsp; * <br />
&nbsp; */<br />
&nbsp;private static final long serialVersionUID = 1135497226250835266L;</p>
<p>&nbsp;private ISubjectService subjectService ;<br />
&nbsp;private ICatalogService catalogService ;<br />
&nbsp;private IPublishService publishService ;</p>
<p>&nbsp;public ICatalogService getCatalogService() {<br />
&nbsp;&nbsp;return catalogService;<br />
&nbsp;}</p>
<p>&nbsp;public IPublishService getPublishService() {<br />
&nbsp;&nbsp;return publishService;<br />
&nbsp;}</p>
<p>&nbsp;public ISubjectService getSubjectService() {<br />
&nbsp;&nbsp;return subjectService;<br />
&nbsp;}</p>
<p>&nbsp;public void setCatalogService(ICatalogService catalogService) {<br />
&nbsp;&nbsp;this.catalogService = catalogService;<br />
&nbsp;}</p>
<p>&nbsp;public void setPublishService(IPublishService publishService) {<br />
&nbsp;&nbsp;this.publishService = publishService;<br />
&nbsp;}</p>
<p>&nbsp;public void setSubjectService(ISubjectService subjectService) {<br />
&nbsp;&nbsp;this.subjectService = subjectService;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;protected String doIntercept(ActionInvocation invoation) throws Exception {<br />
&nbsp;&nbsp;// TODO 自动生成方法存根<br />
&nbsp;&nbsp;System.out.println("-------- 拦截器开始执行 ----------");<br />
&nbsp;&nbsp;List&lt;Subject&gt; subject_list = (ArrayList&lt;Subject&gt;)subjectService.findAll();<br />
&nbsp;&nbsp;List&lt;Catalog&gt; catalog_list = (ArrayList&lt;Catalog&gt;)catalogService.findAll();<br />
&nbsp;&nbsp;List&lt;Publish&gt; pubish_list =&nbsp; (ArrayList&lt;Publish&gt;)publishService.findAll();<br />
<br />
&nbsp;&nbsp;//ActionContext act = ActionContext.getContext() ;<br />
&nbsp;&nbsp;ActionContext act = invocation.getInvocationContext() ;<br />
&nbsp;&nbsp;HttpServletRequest request = (HttpServletRequest) act.get(ServletActionContext.HTTP_REQUEST) ;<br />
&nbsp;&nbsp;request.setAttribute("subject_list", subject_list) ;<br />
&nbsp;&nbsp;request.setAttribute("catalog_list", catalog_list) ;<br />
&nbsp;&nbsp;request.setAttribute("publish_list", pubish_list) ;<br />
&nbsp;&nbsp;System.out.println("-------- 拦截器执行结束 ----------");<br />
&nbsp;&nbsp;return Action.INPUT;<br />
&nbsp;}</p>
<p>}<br />
为了实现request.setAttribute(String str, Object obj) ;.最先是让上面的类实现<a title="interface in org.apache.struts2.interceptor" href="http://struts.apache.org/2.0.9/struts2-core/apidocs/org/apache/struts2/interceptor/ServletRequestAware.html" target="classFrame"><em>ServletRequestAware</em></a> 接口.<br />
但是在运行的时候却出现了空指针异常。后来改成以上的代码就可以正常运行，但是还是<br />
不太明白<br />
曾经在一本书上看到一段话：构建interceptor最重要的原则：<span style="color: red">interceptor必须是无状态的，并且不能<br />
够使用任何ActionInvocation提供范围以外的API <br />
</span></p>
   <img src ="http://www.blogjava.net/keweibo/aggbug/150747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-06 21:54 <a href="http://www.blogjava.net/keweibo/articles/150747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的struts.properties配置文件详解</title><link>http://www.blogjava.net/keweibo/articles/150352.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 04 Oct 2007 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/150352.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/150352.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/150352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/150352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/150352.html</trackback:ping><description><![CDATA[&nbsp;struts.action.extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;URL&nbsp;extension&nbsp;to&nbsp;use&nbsp;to&nbsp;determine&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;meant&nbsp;for&nbsp;a&nbsp;Struts&nbsp;action&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用URL扩展名来确定是否这个请求是被用作Struts&nbsp;action，其实也就是设置&nbsp;action的后缀，例如login.do的'do'字。<br />
<br />
struts.configuration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.config.Configuration&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.config.Configuration接口名<br />
<br />
struts.configuration.files<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;list&nbsp;of&nbsp;configuration&nbsp;files&nbsp;automatically&nbsp;loaded&nbsp;by&nbsp;Struts&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struts自动加载的一个配置文件列表<br />
<br />
struts.configuration.xml.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;reload&nbsp;the&nbsp;XML&nbsp;configuration&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否加载xml配置(true,false)<br />
<br />
struts.continuations.package<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;package&nbsp;containing&nbsp;actions&nbsp;that&nbsp;use&nbsp;Rife&nbsp;continuations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含有actions的完整连续的package名称<br />
<br />
struts.custom.i18n.resources<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;localization&nbsp;properties&nbsp;files&nbsp;to&nbsp;load&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的国际化属性文件（不包含.properties后缀）<br />
<br />
struts.custom.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;configuration&nbsp;properties&nbsp;files&nbsp;to&nbsp;load<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的配置文件的位置<br />
<br />
<br />
struts.devMode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Struts&nbsp;is&nbsp;in&nbsp;development&nbsp;mode&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否为struts开发模式<br />
<br />
struts.dispatcher.parametersWorkaround<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;a&nbsp;Servlet&nbsp;request&nbsp;parameter&nbsp;workaround&nbsp;necessary&nbsp;for&nbsp;some&nbsp;versions&nbsp;of&nbsp;WebLogic<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）<br />
<br />
struts.enable.DynamicMethodInvocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Allows&nbsp;one&nbsp;to&nbsp;disable&nbsp;dynamic&nbsp;method&nbsp;invocation&nbsp;from&nbsp;the&nbsp;URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许动态方法调用<br />
<br />
struts.freemarker.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager&nbsp;implementation&nbsp;class&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager接口名<br />
<br />
struts.i18n.encoding<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;encoding&nbsp;to&nbsp;use&nbsp;for&nbsp;localization&nbsp;messages<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;国际化信息内码<br />
<br />
struts.i18n.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;localization&nbsp;messages&nbsp;should&nbsp;automatically&nbsp;be&nbsp;reloaded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否国际化信息自动加载&nbsp;<br />
<br />
struts.locale<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;locale&nbsp;for&nbsp;the&nbsp;Struts&nbsp;application<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的国际化地区信息<br />
<br />
struts.mapper.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper接口<br />
<br />
struts.multipart.maxSize<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;maximize&nbsp;size&nbsp;of&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart请求信息的最大尺寸（文件上传用）&nbsp;<br />
<br />
struts.multipart.parser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.dispatcher.multipart.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiPartRequest&nbsp;parser&nbsp;implementation&nbsp;for&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）<br />
<br />
<br />
struts.multipart.saveDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;to&nbsp;use&nbsp;for&nbsp;storing&nbsp;uploaded&nbsp;files&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置存储上传文件的目录夹<br />
<br />
struts.objectFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.ObjectFactory&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.ObjectFactory接口（spring）<br />
<br />
struts.objectFactory.spring.autoWire<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;autoWire&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否自动绑定Spring<br />
<br />
struts.objectFactory.spring.useClassCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;use&nbsp;its&nbsp;class&nbsp;cache&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否spring应该使用自身的cache&nbsp;<br />
<br />
struts.objectTypeDeterminer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer接口<br />
<br />
struts.serve.static.browserCache<br />
&nbsp;&nbsp;If&nbsp;static&nbsp;content&nbsp;served&nbsp;by&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;set&nbsp;browser&nbsp;caching&nbsp;header&nbsp;properties&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中<br />
<br />
struts.serve.static<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;serve&nbsp;static&nbsp;content&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否struts过滤器应该提供静态内容<br />
<br />
struts.tag.altSyntax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;the&nbsp;alterative&nbsp;syntax&nbsp;for&nbsp;the&nbsp;tags&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否可以用替代的语法替代tags<br />
<br />
struts.ui.templateDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;containing&nbsp;UI&nbsp;templates<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI&nbsp;templates的目录夹&nbsp;<br />
<br />
struts.ui.theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;UI&nbsp;template&nbsp;theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的UI&nbsp;template主题<br />
<br />
struts.url.http.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTP&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置http端口<br />
<br />
struts.url.https.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTPS&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置https端口<br />
<br />
struts.url.includeParams<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;includeParams&nbsp;method&nbsp;to&nbsp;generate&nbsp;Struts&nbsp;URLs&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在url中产生&nbsp;默认的includeParams<br />
<br />
<br />
struts.velocity.configfile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;Velocity&nbsp;configuration&nbsp;file&nbsp;path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity配置文件路径<br />
<br />
struts.velocity.contexts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;Velocity&nbsp;context&nbsp;names<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity的context列表<br />
<br />
<br />
struts.velocity.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.velocity.VelocityManager&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.velocity.VelocityManager接口名<br />
<br />
struts.velocity.toolboxlocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;location&nbsp;of&nbsp;the&nbsp;Velocity&nbsp;toolbox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity工具盒的位置&nbsp;<br />
struts.xslt.nocache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;or&nbsp;not&nbsp;XSLT&nbsp;templates&nbsp;should&nbsp;not&nbsp;be&nbsp;cached<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否XSLT模版应该被缓存
<img src ="http://www.blogjava.net/keweibo/aggbug/150352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-10-04 13:47 <a href="http://www.blogjava.net/keweibo/articles/150352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts2中实现文件上传(二)</title><link>http://www.blogjava.net/keweibo/articles/146616.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 19 Sep 2007 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/146616.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/146616.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/146616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/146616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/146616.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
    <tbody>
        <tr>
            <td align="center" colspan="2" height="40">
            <h1>在Struts2中实现文件上传(二)</h1>
            </td>
        </tr>
        <tr align="center">
            <td colspan="2" height="40"><script type="text/javascript"><!-- google_ad_client="pub-8263014661871932" ; google_ad_width="468;
google_ad_height" = 60; google_ad_format="468x60_as" ; google_ad_type="text_image" ;
//2007-02-14: 新闻内容页面上面 google_ad_channel="8423241514" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="333333" ; google_color_text="333333" ; google_color_url="003366" ;
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
              </script></td>
        </tr>
        <tr>
            <td colspan="2" height="40">&nbsp;发布者：[<a href="http://www.mldn.cn/florilegium.jtml?a_name=IT电子教育门户&amp;a_id=0" target="_blank" rel="external">IT电子教育门户</a>]&nbsp;&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td colspan="2"><span class="STYLE2">
            <div id="article">
            <p><font face="Times New Roman">发布运行应用程序，在浏览器地址栏中键入：http://localhost:8080/Struts2_Fileupload/FileUpload.jsp，出现图示页面：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831318.gif"  alt="" />&nbsp;<br />
            清单7 FileUpload页面 </font></p>
            <p><font face="Times New Roman">选择图片文件，填写Caption并按下Submit按钮提交，出现图示页面：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831580.gif"  alt="" />&nbsp;<br />
            清单8 上传成功页面 </font></p>
            <p><font face="Times New Roman">更多配置<br />
            在运行上述例子，如果您留心一点的话，应该会发现服务器控制台有如下输出：</font></p>
            <p><font face="Times New Roman">Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.dispatcher.Dispatcher getSaveDir<br />
            INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir<br />
            Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.interceptor.FileUploadInterceptor intercept<br />
            INFO: Removing file myFile C:\Program Files\Tomcat 5.5 \work\Catalina\localhost\Struts2_Fileupload\upload_251447c2_1116e355841__7ff7_00000006.tmp 清单9 服务器控制台输出 <br />
            上述信息告诉我们，struts.multipart.saveDir没有配置。struts.multipart.saveDir用于指定存放临时文件的文件夹，该配置写在struts.properties文件中。例如，如果在struts.properties文件加入如下代码：</font></p>
            <p><font face="Times New Roman">struts.multipart.saveDir = /tmp 清单10 struts配置 <br />
            这样上传的文件就会临时保存到你根目录下的tmp文件夹中（一般为c:\tmp），如果此文件夹不存在，Struts 2会自动创建一个。</font></p>
            <p><font face="Times New Roman">错误处理<br />
            上述例子实现的图片上传的功能，所以应该阻止用户上传非图片类型的文件。在Struts 2中如何实现这点呢？其实这也很简单，对上述例子作如下修改即可。</font></p>
            <p><font face="Times New Roman">首先修改FileUpload.jsp，在&lt;body&gt;与&lt;s:form&gt;之间加入&#8220;&lt;s:fielderror /&gt;&#8221;，用于在页面上输出错误信息。</font></p>
            <p><font face="Times New Roman">然后修改struts.xml文件，将Action fileUpload的定义改为如下所示：</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; action name ="fileUpload" class ="tutorial.FileUploadAction" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; interceptor-ref name ="fileUpload" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; param name ="allowedTypes" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image/bmp,image/png,image/gif,image/jpeg<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ param &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ interceptor-ref &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; interceptor-ref name ="defaultStack" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; result name ="input" &gt; /FileUpload.jsp &lt;/ result &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; result name ="success" &gt; /ShowUpload.jsp &lt;/ result &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ action &gt; 清单11 修改后的配置文件 <br />
            显而易见，起作用就是fileUpload拦截器的allowTypes参数。另外，配置还引入defaultStack它会帮我们添加验证等功能，所以在出错之后会跳转到名称为&#8220;input&#8221;的结果，也即是FileUpload.jsp。</font></p>
            <p><font face="Times New Roman">发布运行应用程序，出错时，页面如下图所示：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831494.gif"  alt="" />&nbsp;<br />
            清单12 出错提示页面 </font></p>
            <p><font face="Times New Roman">上面的出错提示是Struts 2默认的，大多数情况下，我们都需要自定义和国际化这些信息。通过在全局的国际资源文件中加入&#8220;struts.messages.error.content.type.not.allowed=The file you uploaded is not a image&#8221;，可以实现以上提及的需求。对此有疑问的朋友可以参考我之前的文章《在Struts 2.0中国际化(i18n)您的应用程序》。</font></p>
            <p><font face="Times New Roman">实现之后的出错页面如下图所示：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831230.gif"  alt="" />&nbsp;<br />
            清单13 自定义出错提示页面 </font></p>
            <p><font face="Times New Roman">同样的做法，你可以使用参数&#8220;maximumSize&#8221;来限制上传文件的大小，它对应的字符资源名为：&#8220;struts.messages.error.file.too.large&#8221;。</font></p>
            <p><font face="Times New Roman">字符资源&#8220;struts.messages.error.uploading&#8221;用提示一般的上传出错信息。</font></p>
            <p><font face="Times New Roman">多文件上传<br />
            与单文件上传相似，Struts 2实现多文件上传也很简单。你可以将多个&lt;s:file /&gt;绑定Action的数组或列表。如下例所示。</font></p>
            <p><font face="Times New Roman">&lt; s:form action ="doMultipleUploadUsingList" method ="POST" enctype ="multipart/form-data" &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:file label ="File (1)" name ="upload" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:file label ="File (2)" name ="upload" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:file label ="FIle (3)" name ="upload" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:submit /&gt; <br />
            &lt;/ s:form &gt; 清单14 多文件上传JSP代码片段 <br />
            如果你希望绑定到数组，Action的代码应类似：</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; private File[] uploads;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String[] uploadFileNames;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String[] uploadContentTypes;</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; public File[] getUpload()&nbsp; { return this .uploads; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUpload(File[] upload)&nbsp; { this .uploads = upload; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String[] getUploadFileName()&nbsp; { return this .uploadFileNames; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadFileName(String[] uploadFileName)&nbsp; { this .uploadFileNames = uploadFileName; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String[] getUploadContentType()&nbsp; { return this .uploadContentTypes; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadContentType(String[] uploadContentType)&nbsp; { this .uploadContentTypes = uploadContentType; } 清单15 多文件上传数组绑定Action代码片段 <br />
            如果你想绑定到列表，则应类似：</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; private List &lt; File &gt; uploads = new ArrayList &lt; File &gt; ();<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private List &lt; String &gt; uploadFileNames = new ArrayList &lt; String &gt; ();<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private List &lt; String &gt; uploadContentTypes = new ArrayList &lt; String &gt; ();</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; public List &lt; File &gt; getUpload()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this .uploads;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUpload(List &lt; File &gt; uploads)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .uploads = uploads;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List &lt; String &gt; getUploadFileName()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this .uploadFileNames;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadFileName(List &lt; String &gt; uploadFileNames)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .uploadFileNames = uploadFileNames;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List &lt; String &gt; getUploadContentType()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this .uploadContentTypes;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadContentType(List &lt; String &gt; contentTypes)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .uploadContentTypes = contentTypes;<br />
            &nbsp;&nbsp;&nbsp; } 清单16 多文件上传列表绑定Action代码片段 <br />
            总结<br />
            在Struts 2中实现文件上传的确是轻而易举，您要做的只是使用&lt;s:file /&gt;与Action的属性绑定。这又一次有力地证明了Struts 2的简单易用。</font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
 <img src ="http://www.blogjava.net/keweibo/aggbug/146616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-09-19 22:14 <a href="http://www.blogjava.net/keweibo/articles/146616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts2中实现文件上传(一)</title><link>http://www.blogjava.net/keweibo/articles/146615.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 19 Sep 2007 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/146615.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/146615.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/146615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/146615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/146615.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
    <tbody>
        <tr>
            <td align="center" colspan="2" height="40">
            <h1>在Struts2中实现文件上传(一)</h1>
            </td>
        </tr>
        <tr align="center">
            <td colspan="2" height="40"><script type="text/javascript"><!-- google_ad_client="pub-8263014661871932" ; google_ad_width="468;
google_ad_height" = 60; google_ad_format="468x60_as" ; google_ad_type="text_image" ;
//2007-02-14: 新闻内容页面上面 google_ad_channel="8423241514" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="333333" ; google_color_text="333333" ; google_color_url="003366" ;
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
              </script></td>
        </tr>
        <tr>
            <td colspan="2" height="40">转自:http://www.mldn.cn/articleview/2007-8-22/article_view_2245.htm</td>
        </tr>
        <tr>
            <td colspan="2"><span class="STYLE2">
            <div id="article">
            <p><font face="Times New Roman">前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题， 所以今天我们就来讨论一下这个问题。</font></p>
            <p><font face="Times New Roman">实现原理<br />
            Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹，然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。</font></p>
            <p><font face="Times New Roman">具体实现<br />
            前段时间Apache发布了Struts 2.0.6 GA，所以本文的实现是以该版本的Struts作为框架的。以下是例子所依赖类包的列表：</font></p>
            <p><font face="Times New Roman"><img alt="依赖类包的列表" src="http://www.mldn.cn/UserFiles/2007-8/3/200783135852260.gif" />&nbsp;<br />
            清单1 依赖类包的列表</font></p>
            <p><font face="Times New Roman">首先，创建文件上传页面FileUpload.jsp，内容如下：</font></p>
            <p><font face="Times New Roman">&lt;% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %&gt; <br />
            &lt;% @ taglib prefix = " s " uri = " /struts-tags " %&gt; </font></p>
            <p><font face="Times New Roman">&lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" &gt; <br />
            &lt; html xmlns ="http://www.w3.org/1999/xhtml" &gt; <br />
            &lt; head &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; title &gt; Struts 2 File Upload &lt;/ title &gt; <br />
            &lt;/ head &gt; <br />
            &lt; body &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:file name ="myFile" label ="Image File" /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:textfield name ="caption" label ="Caption" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:submit /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ s:form &gt; <br />
            &lt;/ body &gt; <br />
            &lt;/ html &gt; 清单2 FileUpload.jsp <br />
            在FileUpload.jsp中，先将表单的提交方式设为POST，然后将enctype设为multipart/form-data，这并没有什么特别之处。接下来，&lt;s:file/&gt;标志将文件上传控件绑定到Action的myFile属性。</font></p>
            <p><font face="Times New Roman">其次是FileUploadAction.java代码：</font></p>
            <p><font face="Times New Roman">&nbsp;package tutorial;</font></p>
            <p><font face="Times New Roman">&nbsp;import java.io.BufferedInputStream;<br />
            &nbsp;import java.io.BufferedOutputStream;<br />
            &nbsp;import java.io.File;<br />
            &nbsp;import java.io.FileInputStream;<br />
            &nbsp;import java.io.FileOutputStream;<br />
            &nbsp;import java.io.InputStream;<br />
            &nbsp;import java.io.OutputStream;<br />
            &nbsp;import java.util.Date;</font></p>
            <p><font face="Times New Roman">&nbsp;import org.apache.struts2.ServletActionContext;</font></p>
            <p><font face="Times New Roman">&nbsp;import com.opensymphony.xwork2.ActionSupport;</font></p>
            <p><font face="Times New Roman">&nbsp;public class FileUploadAction extends ActionSupport&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = 572146812454l ;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static final int BUFFER_SIZE = 16 * 1024 ;<br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; private File myFile;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String contentType;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String fileName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String imageFileName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String caption;<br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public void setMyFileContentType(String contentType)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .contentType = contentType;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public void setMyFileFileName(String fileName)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .fileName = fileName;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public void setMyFile(File myFile)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .myFile = myFile;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public String getImageFileName()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return imageFileName;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public String getCaption()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return caption;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setCaption(String caption)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .caption = caption;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static void copy(File src, File dst)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream in = null ;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream out = null ;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte [] buffer = new byte [BUFFER_SIZE];<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (in.read(buffer) &gt; 0 )&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(buffer);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( null != in)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( null != out)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static String getExtention(String fileName)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pos = fileName.lastIndexOf( " . " );<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(pos);<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp; @Override<br />
            &nbsp;&nbsp;&nbsp;&nbsp; public String execute()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageFileName = new Date().getTime() + getExtention(fileName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File imageFile = new File(ServletActionContext.getServletContext().getRealPath( " /UploadImages " ) + " / " + imageFileName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy(myFile, imageFile);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            } 清单3 tutorial/FileUploadAction.java <br />
            在FileUploadAction中我分别写了setMyFileContentType、setMyFileFileName、setMyFile和setCaption四个Setter方法，后两者很容易明白，分别对应FileUpload.jsp中的&lt;s:file/&gt;和&lt;s:textfield/&gt;标志。但是前两者并没有显式地与任何的页面标志绑定，那么它们的值又是从何而来的呢？其实，&lt;s:file/&gt;标志不仅仅是绑定到myFile，还有myFileContentType（上传文件的MIME类型）和myFileFileName（上传文件的文件名，该文件名不包括文件的路径）。因此，&lt;s:file name="xxx" /&gt;对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。</font></p>
            <p><font face="Times New Roman">FileUploadAction作用是将浏览器上传的文件拷贝到WEB应用程序的UploadImages文件夹下，新文件的名称是由系统时间与上传文件的后缀组成，该名称将被赋给imageFileName属性，以便上传成功的跳转页面使用。</font></p>
            <p><font face="Times New Roman">下面我们就来看看上传成功的页面：</font></p>
            <p><font face="Times New Roman">&lt;% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %&gt; <br />
            &lt;% @ taglib prefix = " s " uri = " /struts-tags " %&gt; </font></p>
            <p><font face="Times New Roman">&lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" &gt; <br />
            &lt; html xmlns ="http://www.w3.org/1999/xhtml" &gt; <br />
            &lt; head &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; title &gt; Struts 2 File Upload &lt;/ title &gt; <br />
            &lt;/ head &gt; <br />
            &lt; body &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; img src ='UploadImages/&lt;s:property value ="imageFileName" /&gt; ' /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; br /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:property value ="caption" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ div &gt; <br />
            &lt;/ body &gt; <br />
            &lt;/ html &gt; 清单4 ShowUpload.jsp <br />
            ShowUpload.jsp获得imageFileName，将其UploadImages组成URL，从而将上传的图像显示出来。</font></p>
            <p><font face="Times New Roman">然后是Action的配置文件：</font></p>
            <p><font face="Times New Roman">&lt;? xml version="1.0" encoding="UTF-8" ?&gt; </font></p>
            <p><font face="Times New Roman">&lt;! DOCTYPE struts PUBLIC<br />
            &nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
            &nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd" &gt; </font></p>
            <p><font face="Times New Roman">&lt; struts &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; package name ="fileUploadDemo" extends ="struts-default" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; action name ="fileUpload" class ="tutorial.FileUploadAction" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; interceptor-ref name ="fileUploadStack" /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; result name ="success" &gt; /ShowUpload.jsp &lt;/ result &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ action &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ package &gt; <br />
            &lt;/ struts &gt; 清单5 struts.xml <br />
            fileUpload Action显式地应用fileUploadStack的拦截器。</font></p>
            <p><font face="Times New Roman">最后是web.xml配置文件：</font></p>
            <p><font face="Times New Roman">&lt;? xml version="1.0" encoding="UTF-8" ?&gt; <br />
            &lt; web-app id ="WebApp_9" version ="2.4" <br />
            &nbsp;&nbsp;&nbsp; xmlns ="http://java.sun.com/xml/ns/j2ee" <br />
            &nbsp;&nbsp;&nbsp; xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" <br />
            &nbsp;&nbsp;&nbsp; xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; display-name &gt; Struts 2 Fileupload &lt;/ display-name &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; filter &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts-cleanup &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter &gt; <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; &lt; filter &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts2 &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter &gt; <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; &lt; filter-mapping &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts-cleanup &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; url-pattern &gt; /* &lt;/ url-pattern &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter-mapping &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; filter-mapping &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts2 &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; url-pattern &gt; /* &lt;/ url-pattern &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter-mapping &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; welcome-file-list &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; welcome-file &gt; index.html &lt;/ welcome-file &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ welcome-file-list &gt; </font></p>
            <p><font face="Times New Roman">&lt;/ web-app &gt; </font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
 <img src ="http://www.blogjava.net/keweibo/aggbug/146615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2007-09-19 22:11 <a href="http://www.blogjava.net/keweibo/articles/146615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>