﻿<?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-默了默</title><link>http://www.blogjava.net/feicer/</link><description>java hibernate struts2 spring</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 17:27:13 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 17:27:13 GMT</pubDate><ttl>60</ttl><item><title>MzTree2.0梅花雪树单击Node页面跳动问题解决及单击展开字节点</title><link>http://www.blogjava.net/feicer/articles/MzTree2_0.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 11 Dec 2009 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/MzTree2_0.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/305507.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/MzTree2_0.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/305507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/305507.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/MzTree2_0.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/305507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-12-11 09:45 <a href="http://www.blogjava.net/feicer/articles/MzTree2_0.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JavaScript创建随机数与随机图片</title><link>http://www.blogjava.net/feicer/articles/random1.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Nov 2009 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/random1.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/301454.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/random1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/301454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/301454.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/random1.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/301454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-11-06 15:59 <a href="http://www.blogjava.net/feicer/articles/random1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中使用Fckeditor 2.6.5 +  fckeditor-java-2.5-bin</title><link>http://www.blogjava.net/feicer/articles/300867.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Tue, 03 Nov 2009 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/300867.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/300867.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/300867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/300867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/300867.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/300867.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/300867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-11-03 11:48 <a href="http://www.blogjava.net/feicer/articles/300867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2的properties配置文件详解</title><link>http://www.blogjava.net/feicer/articles/Struts2_properties.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Mon, 02 Nov 2009 00:14:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/Struts2_properties.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/300626.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/Struts2_properties.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/300626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/300626.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/Struts2_properties.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/300626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-11-02 08:14 <a href="http://www.blogjava.net/feicer/articles/Struts2_properties.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate SQLQuery 原生SQL 查询及返回结果集处理-2</title><link>http://www.blogjava.net/feicer/articles/SQLQuery_2.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 25 Sep 2009 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/SQLQuery_2.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/296435.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/SQLQuery_2.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/296435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/296435.html</trackback:ping><description><![CDATA[<span twffan="done"><span style="color: #ff0000" twffan="done"><span twffan="done">第二篇：个人方法</span></span>：<br />
<br />
1.<br />
返回List，<br />
.setResultTransformer(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transformers.ALIAS_TO_ENTITY_MAP);将结果转为Map，存放到list中，即list中为若干map对象；<br />
获取可按此方法：<br />
<br />
<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" twffan="done"><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">for</span><span style="color: #000000" twffan="done">&nbsp;(</span><span style="color: #0000ff" twffan="done">int</span><span style="color: #000000" twffan="done">&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">0</span><span style="color: #000000" twffan="done">;&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">&lt;</span><span style="color: #000000" twffan="done">&nbsp;list.size();&nbsp;i</span><span style="color: #000000" twffan="done">++</span><span style="color: #000000" twffan="done">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;(Map)&nbsp;list.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(map.get(</span><span style="color: #000000" twffan="done">"table_colum_name</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
在jsp页面，可用S标签获取<br />
&lt;s:property value="table_colum_name" /&gt;<br />
<br />
<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" twffan="done"><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">public</span><span style="color: #000000" twffan="done">&nbsp;List&nbsp;&nbsp;getDamTestType(Integer&nbsp;damId)&nbsp;</span><span style="color: #0000ff" twffan="done">throws</span><span style="color: #000000" twffan="done">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #0000ff" twffan="done">new</span><span style="color: #000000" twffan="done">&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #0000ff" twffan="done">null</span><span style="color: #000000" twffan="done">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #0000ff" twffan="done">null</span><span style="color: #000000" twffan="done">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strSql1&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">""</span><span style="color: #000000" twffan="done">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strSql1&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">select&nbsp;distinct&nbsp;testType.id,testType.mc&nbsp;from&nbsp;[</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;damId&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">_lb]&nbsp;as&nbsp;testType&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">inner&nbsp;join&nbsp;[</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;damId&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">_jcxm]&nbsp;as&nbsp;testObj&nbsp;on&nbsp;testObj.lbgl_id=testType.id&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">inner&nbsp;join&nbsp;[</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;damId&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">_cd]&nbsp;as&nbsp;testSite&nbsp;on&nbsp;testSite.jcxm_id=testObj.id&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">inner&nbsp;join&nbsp;[</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;damId&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">_sctj]&nbsp;as&nbsp;upLoadCond&nbsp;on&nbsp;upLoadCond.cd_id=testSite.id&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">try</span><span style="color: #000000" twffan="done">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;HibernateSessionFactory.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;session.createSQLQuery(strSql1).setResultTransformer(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transformers.ALIAS_TO_ENTITY_MAP);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;query.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff" twffan="done">catch</span><span style="color: #000000" twffan="done">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.rollback();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">throw</span><span style="color: #000000" twffan="done">&nbsp;e;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff" twffan="done">finally</span><span style="color: #000000" twffan="done">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">return</span><span style="color: #000000" twffan="done">&nbsp;list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</span><br />
<br />
下次再写。。。<br />
<br />
<img src ="http://www.blogjava.net/feicer/aggbug/296435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-09-25 15:47 <a href="http://www.blogjava.net/feicer/articles/SQLQuery_2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate  SQLQuery 原生SQL 查询及返回结果集处理-1</title><link>http://www.blogjava.net/feicer/articles/SQLQuery_1.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 25 Sep 2009 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/SQLQuery_1.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/296430.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/SQLQuery_1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/296430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/296430.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/SQLQuery_1.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/296430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-09-25 15:37 <a href="http://www.blogjava.net/feicer/articles/SQLQuery_1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 的Web 应用-监听器方式调用</title><link>http://www.blogjava.net/feicer/articles/QuartzInitializerListener_1.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Mon, 07 Sep 2009 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/QuartzInitializerListener_1.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/294198.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/QuartzInitializerListener_1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/294198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/294198.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: A ServletContextListner that can be used to initialize Quartz.配置和集成 Quartz 到 Web 应用的一种方式。从 2.3 版本的 Servlet API 开始，能创建监听器，由容器在其生命周期中的某个特定时间回调。其中的一个监听器接口叫做 java.servlet.ServletContextListener，它包括有两个方法...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/QuartzInitializerListener_1.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/294198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-09-07 17:13 <a href="http://www.blogjava.net/feicer/articles/QuartzInitializerListener_1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 在Java Web Application中使用</title><link>http://www.blogjava.net/feicer/articles/Quartz_2.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 04 Sep 2009 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/Quartz_2.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/293911.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/Quartz_2.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/293911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/293911.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/Quartz_2.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/293911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-09-04 17:10 <a href="http://www.blogjava.net/feicer/articles/Quartz_2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 项目应用</title><link>http://www.blogjava.net/feicer/articles/Quartz_1.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 04 Sep 2009 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/Quartz_1.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/293897.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/Quartz_1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/293897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/293897.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/Quartz_1.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/293897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-09-04 16:22 <a href="http://www.blogjava.net/feicer/articles/Quartz_1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个E-R图的例子</title><link>http://www.blogjava.net/feicer/articles/E-R.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Tue, 26 May 2009 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/E-R.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/278017.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/E-R.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/278017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/278017.html</trackback:ping><description><![CDATA[<font style="background-color: #c7edcc">一个E-R图的例子</font><br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/feicer/55.jpg" twffan="done" /><br />
<img src ="http://www.blogjava.net/feicer/aggbug/278017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-05-26 15:41 <a href="http://www.blogjava.net/feicer/articles/E-R.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第三部分） </title><link>http://www.blogjava.net/feicer/articles/258262.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258262.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258262.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258262.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/maxStruts 2与AJAX（第三部分） 很久没有更新BLOG了，前一段时间公司的项目比较忙，另外我还和一位出版社的朋友谈写书的事情，所以一直没有时间，完成《Struts 2与AJAX》。后来写书的事情吹了，趁今天有点空闲就把它完成。在大家看这部分文章之前，我想对于写书的事情说两句，或者应该叫发牢骚才对。通过这次写书失败的经历...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258262.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:55 <a href="http://www.blogjava.net/feicer/articles/258262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第二部分） </title><link>http://www.blogjava.net/feicer/articles/258260.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258260.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258260.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/maxStruts 2与AJAX（第二部分） 在上一篇文章《Struts 2与AJAX（第一部分）》，我已经简单地介绍了&lt;s:tree /&gt;的一些用法，接下来我将继续深入讲解&lt;s:tree /&gt;的使用和通过DWR实现AJAX校验。更多&lt;s:tree /&gt;在Struts 2的showcase中...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258260.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:53 <a href="http://www.blogjava.net/feicer/articles/258260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第一部分） </title><link>http://www.blogjava.net/feicer/articles/258248.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258248.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258248.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258248.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;载自http://www.blogjava.net/maxStruts 2与AJAX（第一部分） 在当今——Web 2.0概念铺天盖地的Internet环境下，简易的AJAX集成对于一个成功的WEB框架来说是不可或缺的。因此，Struts 2其中的一个重要的功能（Feature）就是&#8220;First-class AJAX support - Add intera...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258248.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:44 <a href="http://www.blogjava.net/feicer/articles/258248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strus 2的新表单标志的使用 </title><link>http://www.blogjava.net/feicer/articles/258244.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258244.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258244.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258244.html</trackback:ping><description><![CDATA[<br />
<span style="color: red">载自</span><font style="background-color: #cce8cf">http://www.blogjava.net/max</font><br />
<br />
<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/max/archive/2007/05/18/118442.html">Strus 2的新表单标志的使用</a> </div>
<p>&nbsp;Struts 2为大家提供了不少常用的很酷的表单标志，简化了我们程序员的工作。不过，由于这些都是新标志，大家可能在使用上还存在不少疑问。本文将就朋友们的回复、留言或Email上的问题，分别对这些酷标志进行讲述。</p>
<h2>表单标志使用小技巧</h2>
<p>Struts 2的表单标志在输出（render）HTML时，使用了模板的概念，增加了复杂性（因为它不像Struts 1.x的表单标志，它通常都是一个标志对应HTML的一个元素），因此大家在使用时，需要一些技巧：</p>
<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>
<p>下面我将分别对这些标志进行讲述：</p>
<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 alt="checkboxlist.jsp页面" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_checkboxlist.gif" /><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>分布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/doubleselect.action">http://localhost:8080/Struts2_CoolTags/doubleselect.action</a>，出现如下图所示页面：</p>
<p><img alt="doubleselect.jsp页面" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_doubleselect.gif" /><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.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> tutorial;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_115_471_Open_Text"><span style="color: #000000">{ &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_244_265_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_308_337_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_468_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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>发布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/token.jsp">http://localhost:8080/Struts2_CoolTags/token.jsp</a>，出现如下图所示页面：</p>
<p><img alt="正常显示的token.jsp页面" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_token1.gif" /><br />
<span style="font-size: smaller; font-style: italic">清单10 正常显示的token.jsp页面</span></p>
<p>随便填点东西并提交页面，一切正常返回以上页面，然后按&#8220;F5&#8221;刷新页面，在弹出的对话框中点击&#8220;Retry&#8221;，出现如下图所示页面：</p>
<p><img alt="重复提交出错显示" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_token2.gif" /><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>发布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/others.jsp">http://localhost:8080/Struts2_CoolTags/others.jsp</a>，出现如下图所示页面：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/max/22548/o_others.gif"><img alt="点击查看大图" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_others.gif" /></a><br />
<span style="font-size: smaller; font-style: italic">清单13 其它表单标志页面</span></p>
<h2>总结</h2>
<p>Struts 2在标志上的确比Struts 1.x丰富了许多，同时模板机制也给程序员带来不少方便（如果你不太喜欢个性化的风格）。另外，Struts 2还有一些AJAX（如<a title="autocompleter" href="http://www.blogjava.net/max/admin/autocompleter.html">&lt;s: autocompleter /&gt;</a>等）的标志和非表单的UI标志（如<a href="http://cwiki.apache.org/WW/tree.html">&lt;s: tree /&gt;</a>等），我会在以后的文章中讲述其使用。</p>
 <img src ="http://www.blogjava.net/feicer/aggbug/258244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:34 <a href="http://www.blogjava.net/feicer/articles/258244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中的OGNL </title><link>http://www.blogjava.net/feicer/articles/258239.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258239.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258239.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258239.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/maxStruts 2中的OGNL 本人是一个EL（Expression Language，以下译为表达式语言）的支持者。因为我对&lt;% %&gt;写法极为反感，忘记了在那本书上看到的一句话——&#8220;使用标志（Tag）的一个目的就是避免在JSP页面中出现过多的&lt;%%&gt;的语句，使页面与后台代码分离。&#822...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258239.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:20 <a href="http://www.blogjava.net/feicer/articles/258239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现CRUD </title><link>http://www.blogjava.net/feicer/articles/258234.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258234.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258234.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258234.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/max在Struts 2中实现CRUD CRUD是Create（创建）、Read（读取）、Update（更新）和Delete（删除）的缩写，它是普通应用程序的缩影。如果您掌握了某框架的CRUD编写，那么意味可以使用该框架创建普通应用程序了，所以大家使用新框架开发OLTP（Online Transaction Processing）应用...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258234.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:15 <a href="http://www.blogjava.net/feicer/articles/258234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现文件上传 </title><link>http://www.blogjava.net/feicer/articles/258231.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258231.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258231.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258231.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/max在Struts 2中实现文件上传 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题， 所以今天我们就来讨论一下这个问题。实现原理Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹，然后Struts使用file...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258231.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:05 <a href="http://www.blogjava.net/feicer/articles/258231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现IoC</title><link>http://www.blogjava.net/feicer/articles/258230.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258230.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258230.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258230.html</trackback:ping><description><![CDATA[<br />
<span style="color: red">载自</span><font style="background-color: #cce8cf">http://www.blogjava.net/max</font><br />
<br />
<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/max/archive/2006/12/28/90548.html">在Struts 2中实现IoC</a> </div>
<p>IoC(Inversion of Control，以下译为控制反转）随着Java社区中轻量级容器（Lightweight Contianer）的推广而越来越为大家耳熟能详。在此，我不想再多费唇舌来解释&#8220;什么是控制反转&#8221;和&#8220;为什么需要控制反转&#8221;。因为互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。大家可以去读一下Rod Johnson和Juergen Hoeller合著的《<a href="http://www.wrox.com/books/0764558315.shtml">Expert one-on-one J2EE Development without EJB</a>》或Martin Fowler所写的《<a class="l" onmousedown="return clk(0,'','','res','1','')" href="http://www.martinfowler.com/articles/injection.html" target="_blank"><span style="color: #0000cc">Inversion of Control Containers and the Dependency Injection pattern</span></a>》。</p>
<p>言归正传，本文的目的主要是介绍在Struts 2中实现控制反转。</p>
<h2>历史背景</h2>
<p>众所周知，Struts 2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本，其自身有一套控制反转的实现，Webwork 2.2在<a href="http://www.springframework.org/">Spring 框架</a>的如火如荼发展的背景下，决定放弃控制反转功能的开发，转由Spring实现。值得一提的是，Spring确实是一个值得学习的框架，因为有越来越多的开源组件（如<a href="http://ibatis.apache.org/">iBATIS</a>等）都放弃与Spring重叠的功能的开发。因此，Struts 2推荐大家通过Spring实现控制反转。</p>
<h2>具体实现</h2>
<p>首先，在开发环境中配置好Struts 2的工程。对这部分仍然有问题的朋友，请参考我的早前的文章。</p>
<p>然后，将所需的Spring的jar包加入到工程的构建环境（Build Path）中，如下图1所示：</p>
<p><img alt="图1 所依赖的Spring的jar包" src="http://www.blogjava.net/images/blogjava_net/max/18760/r_pic1.gif" /> <br />
<span style="font-size: smaller; font-style: italic">图1 所依赖的Spring的jar包</span> </p>
<p>本文使用的是Spring 2.0，Spring强烈建议大家在使用其jar包时，只引用需要的包，原因是Spring是一个功能非常强大的框架，其中有些功能是您不需要的；而且Spring提倡的是&#8220;按需所取&#8221;，而不是EJB的&#8220;爱我就要爱我的一切&#8221;。当然，如果你怕麻烦或者是不清楚每个包的作用，引用一个Spring的总包也未尝不可。</p>
<p>接下来，就要修改WEB-INF\web.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 />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">web-app </span><span style="color: #ff0000">version</span> <span style="color: #0000ff">="2.4"</span> <span style="color: #ff0000">xmlns</span> <span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xmlns:xsi</span> <span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xsi:schemaLocation</span> <span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;<br />
&nbsp; &nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">display-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">Struts 2 IoC Demo</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">display-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter</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">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts-cleanup</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</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">filter-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-class</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">filter</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter</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">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts2</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</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">filter-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-class</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">filter</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-mapping</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">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts-cleanup</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</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">url-pattern</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">/*</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">url-pattern</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">filter-mapping</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-mapping</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">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts2</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</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">url-pattern</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">/*</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">url-pattern</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">filter-mapping</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">listener</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">listener-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.springframework.web.context.ContextLoaderListener<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">listener-class</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">listener</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">welcome-file-list</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">welcome-file</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">index.html</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">welcome-file</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">welcome-file-list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">web-app</span> <span style="color: #0000ff">&gt;</span> </div>
<span style="font-size: smaller; font-style: italic">清单1 WEB-INF\web.xml</span>
<p>大家一看便知道，主要是加入Spring的ContextLoaderListener监听器，方便Spring与Web容器交互。</p>
<p>紧接着，修改Struts.properties文件，告知Struts 2运行时使用Spring来创建对象（如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"><span style="color: #000000">struts.objectFactory</span> <span style="color: #000000">=</span> <span style="color: #000000">spring</span> </div>
<span style="font-size: smaller; font-style: italic">清单2 classes\struts.properties</span>
<p>再下来，遵循Spring的原则——面向接口编程，创建接口ChatService，代码如下：</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.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /> <span style="color: #0000ff">package</span> <span style="color: #000000">tutorial;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.Set;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_71_102_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_102_Open_Text.style.display='none'; Codehighlighter1_71_102_Closed_Image.style.display='inline'; Codehighlighter1_71_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_71_102_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_71_102_Closed_Text.style.display='none'; Codehighlighter1_71_102_Open_Image.style.display='inline'; Codehighlighter1_71_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span> <span style="color: #000000">ChatService </span><span id="Codehighlighter1_71_102_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_71_102_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">getUserNames();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: smaller; font-style: italic">清单3 tutorial.ChatService.java</span>
<p>然后，再创建一个默认实现ChatServiceImpl，代码如下：</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.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /> <span style="color: #0000ff">package</span> <span style="color: #000000">tutorial;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.HashSet;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.Set;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_120_287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_120_287_Open_Text.style.display='none'; Codehighlighter1_120_287_Closed_Image.style.display='inline'; Codehighlighter1_120_287_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_120_287_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_120_287_Closed_Text.style.display='none'; Codehighlighter1_120_287_Open_Image.style.display='inline'; Codehighlighter1_120_287_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #000000">ChatServiceImpl </span><span style="color: #0000ff">implements</span> <span style="color: #000000">ChatService </span><span id="Codehighlighter1_120_287_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_120_287_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_158_284_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_284_Open_Text.style.display='none'; Codehighlighter1_158_284_Closed_Image.style.display='inline'; Codehighlighter1_158_284_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_158_284_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_158_284_Closed_Text.style.display='none'; Codehighlighter1_158_284_Open_Image.style.display='inline'; Codehighlighter1_158_284_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">getUserNames() </span><span id="Codehighlighter1_158_284_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_158_284_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">users </span><span style="color: #000000">=</span> <span style="color: #0000ff">new</span> <span style="color: #000000">HashSet</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="color: #000000">"</span> <span style="color: #000000">Max</span> <span style="color: #000000">"</span> <span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="color: #000000">"</span> <span style="color: #000000">Scott</span> <span style="color: #000000">"</span> <span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="color: #000000">"</span> <span style="color: #000000">Bob</span> <span style="color: #000000">"</span> <span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">return</span> <span style="color: #000000">users;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> <br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: smaller; font-style: italic">清单4 tutorial.ChatServiceImpl.java</span>
<p>接下来，就该新建Action了。tutorial.ChatAction.java的代码如下：</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.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /> <span style="color: #0000ff">package</span> <span style="color: #000000">tutorial;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.Set;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_135_529_Open_Image" onclick="this.style.display='none'; Codehighlighter1_135_529_Open_Text.style.display='none'; Codehighlighter1_135_529_Closed_Image.style.display='inline'; Codehighlighter1_135_529_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_135_529_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_135_529_Closed_Text.style.display='none'; Codehighlighter1_135_529_Open_Image.style.display='inline'; Codehighlighter1_135_529_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #000000">ChatAction </span><span style="color: #0000ff">extends</span> <span style="color: #000000">ActionSupport </span><span id="Codehighlighter1_135_529_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_135_529_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">final</span> <span style="color: #0000ff">long</span> <span style="color: #000000">serialVersionUID </span><span style="color: #000000">=</span> <span style="color: #000000">8445871212065L</span> <span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">private</span> <span style="color: #000000">ChatService chatService;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">private</span> <span style="color: #000000">Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">userNames;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_323_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_360_Open_Text.style.display='none'; Codehighlighter1_323_360_Closed_Image.style.display='inline'; Codehighlighter1_323_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_323_360_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_323_360_Closed_Text.style.display='none'; Codehighlighter1_323_360_Open_Image.style.display='inline'; Codehighlighter1_323_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> <span style="color: #000000">setChatService(ChatService chatService) </span><span id="Codehighlighter1_323_360_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_323_360_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">this</span> <span style="color: #000000">.chatService </span><span style="color: #000000">=</span> <span style="color: #000000">chatService;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_399_422_Open_Image" onclick="this.style.display='none'; Codehighlighter1_399_422_Open_Text.style.display='none'; Codehighlighter1_399_422_Closed_Image.style.display='inline'; Codehighlighter1_399_422_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_399_422_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_399_422_Closed_Text.style.display='none'; Codehighlighter1_399_422_Open_Image.style.display='inline'; Codehighlighter1_399_422_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">getUserNames() </span><span id="Codehighlighter1_399_422_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_399_422_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">return</span> <span style="color: #000000">userNames;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_462_525_Open_Image" onclick="this.style.display='none'; Codehighlighter1_462_525_Open_Text.style.display='none'; Codehighlighter1_462_525_Closed_Image.style.display='inline'; Codehighlighter1_462_525_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_462_525_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_462_525_Closed_Text.style.display='none'; Codehighlighter1_462_525_Open_Image.style.display='inline'; Codehighlighter1_462_525_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">String execute() </span><span id="Codehighlighter1_462_525_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /> </span><span id="Codehighlighter1_462_525_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;userNames </span><span style="color: #000000">=</span> <span style="color: #000000">chatService.getUserNames();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/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.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: smaller; font-style: italic">清单5 tutorial.ChatAction.java</span>
<p>ChatAction类使用属性（Getter/Setter）注入法取得ChatService对象。</p>
<p>然后，配置Spring的applicationContext.xml（位于WEB-INF下）文件，内容如下：</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 />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">beans </span><span style="color: #ff0000">xmlns</span> <span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xmlns:xsi</span> <span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xsi:schemaLocation</span> <span style="color: #0000ff">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</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">bean </span><span style="color: #ff0000">id</span> <span style="color: #0000ff">="chatService"</span> <span style="color: #ff0000">class</span> <span style="color: #0000ff">="tutorial.ChatServiceImpl"</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">bean </span><span style="color: #ff0000">id</span> <span style="color: #0000ff">="chatAction"</span> <span style="color: #ff0000">class</span> <span style="color: #0000ff">="tutorial.ChatAction"</span> <span style="color: #ff0000">scope</span> <span style="color: #0000ff">="prototype"</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">property </span><span style="color: #ff0000">name</span> <span style="color: #0000ff">="chatService"</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">ref </span><span style="color: #ff0000">local</span> <span style="color: #0000ff">="chatService"</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">property</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">bean</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">beans</span> <span style="color: #0000ff">&gt;</span> </div>
<span style="font-size: smaller; font-style: italic">清单6 WEB-INF\applicationContext.xml</span>
<p>上述代码有二点值得大家注意的：</p>
<ol>
    <li>Struts 2会为每一个请求创建一个Action对象，所以在定义chatAction时，使用scope="prototype"。这样Spring就会每次都返回一个新的ChatAction对象了；
    <li>因为ChatServiceImpl被配置为默认的scope（也即是singleton，唯一的），所以在实现时应保证其线程安全（关于编写线程安全的代码的讨论已经超出本文的范围，更超出了本人的能力范围，大家可以参考Addison Wesley Professional出版的《<a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601">Java Concurrency in Practice</a>》）。 </li>
</ol>
<p>接下来，在classes/struts.xml中配置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"><span style="color: #0000ff">&lt;!</span> <span style="color: #ff00ff">DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; &nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; &nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</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> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">include </span><span style="color: #ff0000">file</span> <span style="color: #0000ff">="struts-default.xml"</span> <span style="color: #0000ff">/&gt;</span> <span style="color: #000000">&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp;<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_IoC"</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">="Chat"</span> <span style="color: #ff0000">class</span> <span style="color: #0000ff">="chatAction"</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">/UserList.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">&nbsp; &nbsp;<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">清单7 classes\struts.xml</span>
<p>这里的Action和平常不同的就是class属性，它对应于Spring所定义的bean的id，而不是它的类全名。</p>
<p>最后，让我们看看/UserList.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; background-color: #ffff00">&lt;%</span> <span style="color: #000000; background-color: #f5f5f5">@ page 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: #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: #ffff00">%&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> <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">User List</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">title</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 />
<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 />
&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">User List</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">ol</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:iterator </span><span style="color: #ff0000">value</span> <span style="color: #0000ff">="userNames"</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">li</span> <span style="color: #0000ff">&gt;&lt;</span> <span style="color: #800000">s:property </span><span style="color: #0000ff">/&gt;&lt;/</span> <span style="color: #800000">li</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">s:iterator</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">ol</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 /UserList.jsp</span>
<p>大功告成，分布运行应用程序，在浏览器中键入<a href="http://localhost:8080/Struts2_IoC/Chat.action">http://localhost:8080/Struts2_IoC/Chat.action</a>，出现如图2所示页面：</p>
<p><img alt="图2 /ListUser.jsp" src="http://www.blogjava.net/images/blogjava_net/max/18760/r_pic2.gif" /> <br />
<span style="font-size: smaller; font-style: italic">图2 /ListUser.jsp</span> </p>
<h2>总结</h2>
<p>通过Spring在Struts 2上实现控制反转是强烈推荐的做法，当然您也可以组合其它的实现（如Pico等）。</p>
<img src ="http://www.blogjava.net/feicer/aggbug/258230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 16:03 <a href="http://www.blogjava.net/feicer/articles/258230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2的基石——拦截器（Interceptor）</title><link>http://www.blogjava.net/feicer/articles/258229.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258229.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258229.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258229.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/maxStruts 2的基石——拦截器（Interceptor） Interceptor（以下译为拦截器）是Struts 2的一个强有力的工具，有许多功能（feature）都是构建于它之上，如国际化、转换器，校验等。什么是拦截器拦截器，在AOP（Aspect-Oriented Programming）中用于在某个方法或字段被访...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258229.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 15:59 <a href="http://www.blogjava.net/feicer/articles/258229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中实现表单数据校验（Validation） </title><link>http://www.blogjava.net/feicer/articles/258224.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258224.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258224.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258224.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/max/在Struts 2.0中实现表单数据校验（Validation）                         All Input Is Evil!             -Writing secure code             在写前几篇文章的时候，有些朋友建议我的写一篇关...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258224.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 15:45 <a href="http://www.blogjava.net/feicer/articles/258224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换器（Converter）——Struts 2.0中的魔术师</title><link>http://www.blogjava.net/feicer/articles/258218.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258218.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258218.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258218.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/max转换器（Converter）——Struts 2.0中的魔术师 在我已往的Struts 1.x项目经验中，有个问题不时的出现——在创建FormBean时，对于某个属性到底应该用String还是其它类型？开发Web应用程序与开发传统桌面应用程序不同，Web应用程序实际上是分布个不同的主机（当然也可以同一个主机，不过比较少见）上的两...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258218.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 15:32 <a href="http://www.blogjava.net/feicer/articles/258218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中国际化(i18n)您的应用程序</title><link>http://www.blogjava.net/feicer/articles/258216.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258216.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258216.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258216.html</trackback:ping><description><![CDATA[<div class="postTitle"><span style="color: red">载自</span><span lang="EN-US" style="font-size: 10.5pt; background: #cce8cf; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">http://www.blogjava.net/max</span><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/max/archive/2006/11/01/78536.html"><br />
在Struts 2.0中国际化(i18n)您的应用程序</a> </div>
<p>国际化是商业系统中不可或缺的一部分，所以无论您学习的是什么Web框架，它都是必须掌握的技能。</p>
<p>其实，Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作，例如，如果您要输出一条国际化的信息，只需在代码包中加入FILE-NAME_xx_XX.properties（其中FILE-NAME为默认资源文件的文件名），然后在struts-config.xml中指明其路径，再在页面用&lt;bean:message&gt;标志输出即可。 </p>
<p>不过，所谓&#8220;没有最好，只有更好&#8221;。Struts 2.0并没有在这部分止步，而是在原有的简单易用的基础上，将其做得更灵活、更强大。</p>
<h2>国际化Hello World</h2>
<p>下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。</p>
<ol>
    <li>在Eclipse创建工程配置开发和运行环境（如果对这个步骤有问题，可以参考我早前的文章《<a class="entrylistItemTitle" id="A1" href="http://www.blogjava.net/max/archive/2006/10/10/74353.html">为Struts 2.0做好准备</a>》）。 <br />
    <li>在src文件夹中加入struts.properties文件，内容如下： <br />
    <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">struts.custom.i18n.resources</span><span style="color: #000000">=</span><span style="color: #000000">globalMessages</span></div>
    <center>
    <table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"  alt="" /></td>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。
                <ul>
                    <li>struts.xml用于应用程序相关的配置
                    <li>struts.properties用于Struts 2.0的运行时（Runtime）的配置</li>
                </ul>
                </td>
            </tr>
        </tbody>
    </table>
    </center>
    <li>在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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">HelloWorld</span><span style="color: #000000">=</span><span style="color: #000000">Hello World!</span></div>
    <li>在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<br />
    <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">HelloWorld</span><span style="color: #000000">=你</span><span style="color: #000000">好，世界！</span></div>
    <table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"  alt="" /></td>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：<br />
                <div style="padding-right: 36px; padding-left: 36px">1、展开Eclipse的Help菜单，将鼠标移到Software Update子项，在出现的子菜单中点击Find and Install；<br />
                2、在Install/Update对话框中选择Search for new features to install，点击Next；<br />
                3、在Install对话框中点击New Remote Site；<br />
                4、在New Update Site对话框的Name填入&#8220;PropEdit&#8221;或其它任意非空字符串，在URL中填入http://propedit.sourceforge.jp/eclipse/updates/；<br />
                5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br />
                6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉（适用于Eclipse 3.2版本的朋友）；<br />
                7、点击Finish关闭对话框；<br />
                8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 </div>
                </td>
            </tr>
        </tbody>
    </table>
    <li>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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 &nbsp;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: #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: #ffff00">%&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><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">Hello World</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</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"><br />
    &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="HelloWorld"</span><span style="color: #0000ff">/&gt;&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">h2</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:property </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="%{getText('HelloWorld')}"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h2</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>
    <li>发布运行应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp">http://localhost:8080/Struts2_i18n/HelloWorld.jsp</a> ，出现图1所示页面。<br />
    <img alt="图1 中文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag2.gif" /><br />
    <span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图1 中文输出</span>
    <li>将浏览器的默认语言改为&#8220;英语（美国）&#8221;，刷新页面，出现图2所示页面。<br />
    <img alt="图2 英文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag1.gif" /><br />
    <span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图2 英文输出</span> </li>
</ol>
上面的例子的做法，与Struts 1.x的做法相似，似乎并不能体现Struts 2.0的优势。不过，我在上面的例子用了两种方法来显示国际化字符串，其输出是相同的。其实，这就是Struts 2.0的一个优势，因为它默认支持EL，所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时，getText可以用来设置label属性，例如：<br />
<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">s:textfield </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="%{getText('UserName')}"</span><span style="color: #0000ff">/&gt;</span></div>
<h2>资源文件查找顺序</h2>
<p>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts 2.0中有下面几种方法：</p>
<ol>
    <li>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）中被引用，如一些比较共用的出错提示；
    <li>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源；
    <li>使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫；
    <li>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl" href="http://www.blogjava.net/max/archive/2006/10/18/75857.html">常用的Struts 2.0的标志（Tag）介绍</a>》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。</li>
</ol>
<p>上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的是特定的顺序，如图3所示：</p>
<img alt="图3 资源文件查找顺序图" src="http://www.blogjava.net/images/blogjava_net/max/16758/o_Search.jpg" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图3 资源文件查找顺序图</span>
<p>假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<ol>
    <li>查找ChildAction_xx_XX.properties文件或ChildAction.properties；
    <li>查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties；
    <li>查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties；
    <li>判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件；
    <li>查找当前包下的package.properties文件；
    <li>查找当前包的父包，直到最顶层包；
    <li>在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源;
    <li>查找在struts.properties配置的默认的资源文件，参考例1;
    <li>输出user.title。</li>
</ol>
<h2>参数化国际化字符串</h2>
<p>许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在Struts 2.0中，我们通过以下两种方法做到这点：</p>
<ol>
    <li>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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">validation.require</span><span style="color: #000000">=</span><span style="margin-bottom: 8px; color: #000000">${getText(fileName)} is required</span></div>
    <li>使用<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html">java.text.MessageFormat</a>中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time | choice）, 格式样式}，例如：<br />
    <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">validation.between</span><span style="color: #000000">=</span><span style="color: #000000">Date must between {</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000"> date, short} and {</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000"> date, short}</span></div>
    </li>
</ol>
在显示这些国际化字符时，同样有两种方法设置参数的值：<br />
<ol>
    <li>使用标志的value0、value1...valueN的属性，如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation.required"</span><span style="color: #ff0000"> value0</span><span style="color: #0000ff">="User Name"</span><span style="color: #0000ff">/&gt;</span></div>
    <li>使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<br />
    <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">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation.required"</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:param </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="User Name"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:text</span><span style="color: #0000ff">&gt;</span></div>
    </li>
</ol>
<h2>让用户方便地选择语言</h2>
<p>开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</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.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> tutorial;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Hashtable;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Locale;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Map;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_116_345_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_345_Open_Text.style.display='none'; Codehighlighter1_116_345_Closed_Image.style.display='inline'; Codehighlighter1_116_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_116_345_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_116_345_Closed_Text.style.display='none'; Codehighlighter1_116_345_Open_Image.style.display='inline'; Codehighlighter1_116_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #0000ff">class</span><span style="color: #000000"> Locales </span><span id="Codehighlighter1_116_345_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_116_345_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_159_343_Open_Image" onclick="this.style.display='none'; Codehighlighter1_159_343_Open_Text.style.display='none'; Codehighlighter1_159_343_Closed_Image.style.display='inline'; Codehighlighter1_159_343_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_159_343_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_159_343_Closed_Text.style.display='none'; Codehighlighter1_159_343_Open_Image.style.display='inline'; Codehighlighter1_159_343_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000"> getLocales() </span><span id="Codehighlighter1_159_343_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_159_343_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000"> locales </span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> Hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">2</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="color: #000000">"</span><span style="color: #000000">American English</span><span style="color: #000000">"</span><span style="color: #000000">, Locale.US);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="color: #000000">"</span><span style="color: #000000">Simplified Chinese</span><span style="color: #000000">"</span><span style="color: #000000">, Locale.CHINA);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> locales;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<span style="font-size: smaller; font-style: italic">tutorial/Locales.java</span><br />
<br />
<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">@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: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #000000; background-color: #f5f5f5">&lt;!--</span><span style="color: #000000; background-color: #f5f5f5"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5"> langSelecter_onChanged() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; document.langForm.submit();<br />
&nbsp; &nbsp; }<br />
</span><span style="color: #008000; background-color: #f5f5f5">//</span><span style="color: #008000; background-color: #f5f5f5">--&gt;</span><span style="color: #008000; background-color: #f5f5f5"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:set </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="SESSION_LOCALE"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="#session['WW_TRANS_I18N_LOCALE']"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="locales"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="tutorial.Locales"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="&lt;s:url includeParams="</span><span style="color: #ff0000">get" encode</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">" name="langForm"&nbsp;<br />
&nbsp; &nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br />
&nbsp; &nbsp; Language: </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:select </span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Language"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#locales.locales"</span><span style="color: #ff0000"> listKey</span><span style="color: #0000ff">="value"</span><span style="color: #ff0000"> &nbsp; &nbsp;listValue</span><span style="color: #0000ff">="key"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="request_locale"</span><span style="color: #ff0000"> id</span><span style="color: #0000ff">="langSelecter"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; onchange</span><span style="color: #0000ff">="langSelecter_onChanged()"</span><span style="color: #ff0000"> theme</span><span style="color: #0000ff">="simple"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">LangSelector.jsp</span>
<p>上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示：
<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">s:include </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="/LangSelector.jsp"</span><span style="color: #0000ff">/&gt;</span></div>
<br />
在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建Action，代码如下：<br />
<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">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="HelloWorld"</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">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/HelloWorld.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 />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个Action。<br />
<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">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; </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 />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action">http://localhost:8080/Struts2_i18n/HelloWorld.action</a>，出现图4所示页面：<br />
<img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag3.gif" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图3 HelloWorld.action<br />
</span><br />
在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：<br />
<img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag4.gif" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图4 HelloWorld.action</span><br />
<table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"  alt="" /></td>
            <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">可能大家会问为什么一定要通过Action来访问页面呢？<br />
            你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不会工作，所以拦截器链也不会工作。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/feicer/aggbug/258216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 15:26 <a href="http://www.blogjava.net/feicer/articles/258216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.0的Action讲解 </title><link>http://www.blogjava.net/feicer/articles/258213.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258213.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258213.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258213.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258213.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/maxStruts 2.0的Action讲解 有Struts 1.x经验的朋友都知道Action是Struts的核心内容，当然Struts 2.0也不例外。不过，Struts 1.x与Struts 2.0的Action模型很大的区别。                        &nbsp;           ...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258213.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 15:17 <a href="http://www.blogjava.net/feicer/articles/258213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的Struts 2.0的标志（Tag）介绍</title><link>http://www.blogjava.net/feicer/articles/258208.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258208.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258208.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258208.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/max常用的Struts 2.0的标志（Tag）介绍在上一篇文章《为Struts 2.0做好准备》中，我过于详细地介绍了Struts 2.0开发环境和运行环境的配置，所以，本文很少涉及的以上两方面的细节。在介绍常用标志前，我想先从总体上，对Struts 1.x与Struts 2.0的标志库（Tag Library）作比较。 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258208.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 15:13 <a href="http://www.blogjava.net/feicer/articles/258208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为Struts 2.0做好准备 </title><link>http://www.blogjava.net/feicer/articles/258205.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Fri, 06 Mar 2009 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258205.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258205.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258205.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 载自http://www.blogjava.net/max为Struts 2.0做好准备 Struts作为MVC 2的Web框架，自推出以来不断受到开发者的追捧，得到用广泛的应用。作为最成功的Web框架，Struts自然拥有众多的优点：    MVC 2模型的使用    功能齐全的标志库（Tag Library）    开放源代码 但是，所谓&#8220;金无赤金，...&nbsp;&nbsp;<a href='http://www.blogjava.net/feicer/articles/258205.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-06 14:52 <a href="http://www.blogjava.net/feicer/articles/258205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 的 struts.xml 配置中 namespace 的使用 </title><link>http://www.blogjava.net/feicer/articles/258036.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Thu, 05 Mar 2009 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/258036.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258036.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/258036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258036.html</trackback:ping><description><![CDATA[Struts2 的 struts.xml 中是分 package 配置的，可以为 package 设置 namespace 属性，如<br />
<br />
&lt;package namespace="/secure"&nbsp;&nbsp; ....&gt;<br />
&nbsp;&nbsp;&nbsp; ......<br />
&lt;/package&gt;<br />
<br />
如果没有指定 namespace 属性，默认 namespace 是 ""。使用 namespace 可以方便于按不同目的规划对应用的访问规则。比如不同 namespace 下配置了不同的拦截器就可以实现权限的控制，如 "/secure" 下已登陆用户才能访问，"/public" 下可公开访问的。<br />
<br />
配置了 namespace 直接就是反应在访问 URL 上，例如 namespace="/secure"&nbsp; name="test" 的 action<br />
<br />
&nbsp;&lt;package namespace="/secure"&nbsp;&nbsp; ....&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action name="test"&nbsp; ....<br />
&lt;/package&gt;<br />
<br />
访问它的 URL 就是 <a href="http://ip:port/context/secure/test.action">http://ip:port/context/secure/test.action</a>，那如果在 namespace "/secure" 下没有 test action 会出现什么情况呢？Struts 还会尝试在默认 namespace，即 "" 下找 test。<br />
<br />
再举个例子，URL 是 <a href="http://ip:port/context/some/path/test.action">http://ip:port/context/some/path/test.action</a>&nbsp;时，如果在 "/some/path" namespace 下找不到 test action，也是到 "" (default namespace) 下找 test action，但不会去 "/some" 下找的。<br />
<br />
用标签 &lt;s:url value="/secure/test.action"/&gt;&nbsp; 对应页面源文件是 /context/secure/test.action<br />
<br />
稍有麻的就是 &lt;s:form action="/secure/test.action" .... 对应的源文件是 &lt;form action="/context/secure/test.action" ...<br />
<br />
但是后台会有警告：<br />
<br />
警告: No configuration found for the specified action: '/secure/test.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.<br />
<br />
Struts2 把 action 属性值当整一个 Action Name 了，但这也不影响使用，这个 URL 正好能与 (package namespace) + (action name) 合上拍。<br />
<br />
但是对于使用了动态方法调用（struts.enable.DynamicMethodInvocation = true）就没这么幸运了。很容易想当然的<br />
&nbsp;<br />
&lt;s:form action="/secure/test!update.action" ....&nbsp; 生成的 HTML 源文件却是 action="/TestStruts2/om/test"<br />
<br />
同时后台的警告信息是：<br />
<br />
警告: No configuration found for the specified action: '/secure/test' in namespace: ''. Form action defaulting to 'action' attribute's literal value.<br />
<br />
很显然对于这个 action="/TestStruts2/om/test"，提交时是会得到 HTTP Status 404 - /context/secure/test&nbsp; 错误。<br />
<br />
正确的用法是 &lt;s:action...&gt; 也有一个 namespace 属性，对了，就是<br />
<br />
&lt;s:form namespace="/secure" action="test!login"&gt;&nbsp; 生成的 HTML 源文件是：&lt;form&nbsp;action="/TestStruts2/om/test!login.action" ....&gt;<br />
<br />
我们要的就是这个。<br />
<br />
如果不配置 namespace 属性，我们能不能在访问 action 时也用上目录层次呢？可以，那是在 struts1 习惯的做法，配置 &lt;action name="secure/test" ....&gt; name 中使用斜杠，但在 Struts2 中 Action Name 中使用斜杠需要设置<br />
<br />
struts.enable.SlashesInActionNames=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认为 false<br />
<br />
可是 Struts2 大概不赞同这种做法，力挺 namespace 的作用。<br />
<br />
对于上面使用了斜框的 Action Name，&lt;s:form 中的写法要用<br />
<br />
&lt;s:form action="secure/test"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 生成 HTML 源文件：&lt;form action="/context/secure/test.action" .....<br />
<br />
&lt;s:form action="secure/test!update"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成 HTML 源文件：&lt;form action="/context/secure/test!login.action" .....<br />
<br />
<hr style="color: red" />
<br />
上面的 action 后加不加 .action 无所谓，只是要保证 &lt;s:form&gt;&nbsp; 的 action 属性一定要与 struts.xml 中的 &lt;action&gt; 的 name 匹配上，如果你自作多情的在前面加个斜杠，如写成了<br />
&nbsp;<br />
&lt;s:form action="/secure/test!update"&gt;&nbsp;、 &lt;s:form action="/secure/test"&gt;&nbsp;&nbsp;或者 &lt;s:form action="/secure/test!update.action"&gt;&nbsp;&nbsp; 生成的 HTML 源文件就都成了：&lt;form action="/context/secure/test" .....<br />
<br />
这也是从 Struts1 带来的弊病，因为 Struts1 中 &lt;html:form&gt; action 属性对应的是 &lt;action&gt; 的 path，而 Struts2 中 &lt;s:form&gt; 的 action 属性对应的是 &lt;action&gt; 的 name；name 要完全匹配，path 可以加些层次。<br />
 <img src ="http://www.blogjava.net/feicer/aggbug/258036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-05 17:25 <a href="http://www.blogjava.net/feicer/articles/258036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate-3.3.1GA包结构解释</title><link>http://www.blogjava.net/feicer/articles/hibernate_3_3_1GA_package.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Thu, 05 Mar 2009 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/hibernate_3_3_1GA_package.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258021.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/hibernate_3_3_1GA_package.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258021.html</trackback:ping><description><![CDATA[<span style="color: red">hibernate3.3.1GA <br />
目录结构 <br />
hibernate-distribution-3.3.1.GA <br />
---hibernate3.jar</span>---lib//Hibernate的库，没有什么可说的，必须使用的jar包 <br />
<br />
------bytecode <br />
------optional <br />
------required <br />
---------<span style="color: red">antlr-2.7.6.jar</span>//个人认为此包是对HQL的支持 <br />
---------<span style="color: red">commons-collections-3.1.jar</span>//Apache Commons包中的一个，包含了一些Apache开发的集合类，功能比java.util.*强大。必须使用的jar包。 <br />
---------<span style="color: red">dom4j-1.6.1.jar</span>//dom4j是一个Java的XML API，类似于jdom，用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章，对主流的Java XML API进行的性能、功能和易用性的评测，dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j，直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML，特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包，Hibernate用它来读写配置文件。 <br />
<br />
---------<span style="color: red">javassist-3.4.GA.jar</span>//JAAS是用来进行权限验证的，已经包含在JDK1.4里面了。所以实际上是多余的包 <br />
---------<span style="color: red">jta-1.1.jar</span>//JTA规范，当Hibernate使用JTA的时候需要，不过App Server都会带上，所以也是多余的 <br />
---------<span style="color: red">slf4j-api-1.5.2.jar</span>//一种日志插件，事后证明需要<span style="color: red">slf4j-api-1.5.6.jar 和slf4j-nop-1.5.6.jar</span>两个包配合（版本一致）<br />
---documentation <br />
---project <br />
<br />
此为下载下来的hibernate3.3.1 解压后在required 文件夹中所带的包。<br />
本人导入这些包以后，提示：<br />
<span><span>SLF4J:&nbsp;Failed&nbsp;to&nbsp;load&nbsp;</span><span class="keyword">class</span><span>&nbsp;</span><span class="string">"org.slf4j.impl.StaticLoggerBinder"</span><span>.&nbsp;&nbsp;</span></span><br />
&nbsp;很明显是相关的jar包没有被引入，而且&#8220;hibernate-distribution-3.3.1.GA-dist.zip&#8221;中压根就没有<span style="white-space: pre">org/slf4j/impl/StaticLoggerBinder类的存在，还需另外下载slf4j-nop-1.5.2.jar引入到工程中才行。<br />
<br />
本人就下载了 <span style="color: red">slf4j-api-1.5.6.jar 和slf4j-nop-1.5.6.jar </span>，导入以后问题解决<br />
<br />
</span>
 <img src ="http://www.blogjava.net/feicer/aggbug/258021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-05 15:53 <a href="http://www.blogjava.net/feicer/articles/hibernate_3_3_1GA_package.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 所需jar包详解</title><link>http://www.blogjava.net/feicer/articles/struts2_jar.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Thu, 05 Mar 2009 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/struts2_jar.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258018.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/struts2_jar.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/struts2_jar.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-05 15:36 <a href="http://www.blogjava.net/feicer/articles/struts2_jar.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 3.* C3P0配置</title><link>http://www.blogjava.net/feicer/articles/C3P0_config.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Thu, 05 Mar 2009 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/C3P0_config.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258009.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/C3P0_config.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258009.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate自带的连接池算法相当不成熟。 它只是为了让你快些上手，并不适合用于产品系统或性能测试中。 出于最佳性能和稳定性考虑你应该使用第三方的连接池。只需要用特定连接池的设置替换 hibernate.connection.pool_size即可。这将关闭Hibernate自带的连接池。 例如， 你可能会想用C3P0. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C3P0是一个随Hibernate一同分发的开源的JDBC连接池， 它位于lib目录下。 如果你设置了hibernate.c3p0.*相关的属性， Hibernate将使用 C3P0ConnectionProvider来缓存JDBC连接。 如果你更原意使用Proxool， 请参考发 行包中的hibernate.properties并到Hibernate网站获取更多的信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个使用C3P0的hibernate.properties样例文件（来自Hibernate包中etc目录下）：</p>
<p>###########################<br />
### C3P0 Connection Pool###<br />
###########################</p>
<p>#hibernate.c3p0.max_size 2<br />
#hibernate.c3p0.min_size 2<br />
#hibernate.c3p0.timeout 5000<br />
#hibernate.c3p0.max_statements 100<br />
#hibernate.c3p0.idle_test_period 3000<br />
#hibernate.c3p0.acquire_increment 2<br />
#hibernate.c3p0.validate false<br />
&nbsp;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在hibernate.cfg.xml文件里面加入如下的配置：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 最大连接数 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.max_size"&gt;20&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 最小连接数 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.min_size"&gt;5&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 获得连接的超时时间,如果超过这个时间,会抛出异常，单位毫秒 ***--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.timeout"&gt;120&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 最大的PreparedStatement的数量 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.max_statements"&gt;100&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 每隔120秒检查连接池里的空闲连接 ，单位是秒--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.idle_test_period"&gt;120&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 当连接池里面的连接用完的时候，C3P0一下获取的新的连接数 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.acquire_increment"&gt;2&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 每次都验证连接是否可用 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.c3p0.validate"&gt;true&lt;/property&gt;<br />
&nbsp;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完整示例如下（hibernate.properties）：</p>
<p>hibernate.connection.driver_class = org.postgresql.Driver<br />
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase</p>
<p>hibernate.connection.username = myuser<br />
hibernate.connection.password = secret<br />
hibernate.c3p0.min_size=5<br />
hibernate.c3p0.max_size=20<br />
hibernate.c3p0.timeout=1800<br />
hibernate.c3p0.max_statements=50<br />
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect<br />
&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/feicer/aggbug/258009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-05 15:13 <a href="http://www.blogjava.net/feicer/articles/C3P0_config.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate-distribution-3.3.1.GA 部署slf4j-api-1.5.6.jar 包导入</title><link>http://www.blogjava.net/feicer/articles/slf4j.html</link><dc:creator>fd</dc:creator><author>fd</author><pubDate>Thu, 05 Mar 2009 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/feicer/articles/slf4j.html</guid><wfw:comment>http://www.blogjava.net/feicer/comments/258001.html</wfw:comment><comments>http://www.blogjava.net/feicer/articles/slf4j.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feicer/comments/commentRss/258001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feicer/services/trackbacks/258001.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/feicer/articles/slf4j.html'>阅读全文</a><img src ="http://www.blogjava.net/feicer/aggbug/258001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feicer/" target="_blank">fd</a> 2009-03-05 14:37 <a href="http://www.blogjava.net/feicer/articles/slf4j.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>