<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>ｍｉｎｇｏ</title>
    <description></description>
    <link>http://mingo.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>ACEGI结合LDAP进行统一用户管理</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/196408" style="color:red;">http://mingo.javaeye.com/blog/196408</a>&nbsp;
          发表时间: 2008年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用acegi进行用户登陆和权限判断已有好几个项目的经验了，但是用户密码和权限信息都是存储在数据库里面的，各套系统之间的用户数据彼此都互相独立，这个系统一套用户名密码，那个系统则是另一套，每个用户要同时记住好几个密码，比较麻烦。但是现在的发展趋势都是用LDAP对用户进行统一管理，即在LDAP服务器中进行认证管理，在业务系统里进行授权管理。<br />这样子，只要各业务系统都练到这一个LDAP服务器上，大家的账号和密码就都是统一的。<br /><br />以下是acegi与Windows AD进行结合，实现用户统一管理的例子。<br /><br />实现的思路是，在LDAP进行用户认证，在数据库中进行权限鉴别。<br /><br />acegi也有针对LDAP进行认证和鉴权的全部代码和推荐配置，但是比较单纯，要么是全部数据库，要么是全部LDAP，对于LDAP+DB，还没有看到网上有例子，只有一个台湾的家伙，还觉得满保密，不想公开他的代码。<br /><br />Windows AD，就是Windows Active Directory，是微软的域控制器，与windows操作系统进行了集成，支持LDAP协议。<br /><br />1、将daoAuthenticationProvider换成ldapAuthenticationProvider<br /><pre name="code" class="java">
&lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
        &lt;property name="providers">
            &lt;list>
                &lt;ref local="ldapAuthenticationProvider"/>
            &lt;/list>
        &lt;/property>
        &lt;property name="sessionController">
            &lt;ref bean="concurrentSessionController"/>
        &lt;/property>
    &lt;/bean>
</pre><br />2、添加ldapAuthenticationProvider的bean定义：<br /><pre name="code" class="java">
&lt;!--
         LDAP+DB进行登陆判断
         LDAP中进行用户名认证（authenticator）
         DB中进行权限判断（daoPopulator）
     -->
&lt;bean id="ldapAuthenticationProvider" class="org.acegisecurity.providers.ldap.LdapAuthenticationProvider">
      	&lt;constructor-arg>&lt;ref local="authenticator"/>&lt;/constructor-arg>
      	&lt;constructor-arg>&lt;ref local="daoPopulator"/>&lt;/constructor-arg>
		&lt;property name="userCache" ref="userCache"/>
&lt;/bean>
</pre><br />3、添加authenticator的bean定义<br /><pre name="code" class="java">
&lt;!--
         在LDAP Server中判断用户和密码的有效性
        initialDirContextFactory：LDAP上下文环境
        userDnPatterns：用户匹配模式，其中sAMAccountName是AD中用户名的字段名称
     -->
&lt;bean id="authenticator" class="org.acegisecurity.providers.ldap.authenticator.BindAuthenticator">
		&lt;constructor-arg>&lt;ref local="initialDirContextFactory"/>&lt;/constructor-arg>
		&lt;property name="userDnPatterns">
			&lt;list>
				&lt;value>sAMAccountName={0},ou=BroadText_SH,DC=broadtext,DC=local&lt;/value>
			&lt;/list>
		&lt;/property>
		&lt;property name="userSearch">&lt;ref local="userSearch"/>&lt;/property>
&lt;/bean>
</pre><br />其中userDnPatterns是根据不同的LDAP服务有着不同的配置，sAMAccountName是AD中存储用户账号的字段名称，后面那一串是账号路径的一部分。<br />4、编写自己的DaoAuthoritiesPopulator，从数据库中查询权限，这里有两个参数：数据源和查询SQL，数据源可以直接利用已经定义的dataSource，查询SQL就是以前在jdbcDaoImpl中用过的authoritiesByUsernameQuery。类中的代码如下（省去了dataSource和authoritiesByUsernameQuery的setter和getter）：<br /><pre name="code" class="java">
private static final Log logger = LogFactory.getLog(DaoAuthoritiesPopulator.class);
    protected MappingSqlQuery authoritiesByUsernameMapping;
    private String authoritiesByUsernameQuery;
    private String rolePrefix = "";
    private DataSource dataSource; 
	/* (non-Javadoc)
	 * @see org.acegisecurity.providers.ldap.LdapAuthoritiesPopulator#getGrantedAuthorities(org.acegisecurity.userdetails.ldap.LdapUserDetails)
	 */
	public GrantedAuthority[] getGrantedAuthorities(LdapUserDetails user){
    	this.authoritiesByUsernameMapping = new AuthoritiesByUsernameMapping(getDataSource());
    	List dbAuths = authoritiesByUsernameMapping.execute(user.getUsername());
    	
    	if (dbAuths.size() == 0) {
            throw new PermissionNotEnoughException("User has no GrantedAuthority");
        }

        GrantedAuthority[] arrayAuths = (GrantedAuthority[]) dbAuths.toArray(new GrantedAuthority[dbAuths.size()]);

        if (logger.isDebugEnabled()) {
            logger.debug("Getting authorities for user " + user.getUsername());
            logger.debug("授权成功 ：" + user.getUsername());
        }
		return arrayAuths;
	}
	 /**
     * Query object to look up a user's authorities.
     */
    protected class AuthoritiesByUsernameMapping extends MappingSqlQuery {
        protected AuthoritiesByUsernameMapping(DataSource ds) {
            super(ds, authoritiesByUsernameQuery);
            declareParameter(new SqlParameter(Types.VARCHAR));
            compile();
        }

        protected Object mapRow(ResultSet rs, int rownum)
            throws SQLException {
            String roleName = rolePrefix + rs.getString(2);
            GrantedAuthorityImpl authority = new GrantedAuthorityImpl(roleName);

            return authority;
        }
    }
</pre><br />bean定义XML文件如下：<br /><pre name="code" class="java">
&lt;!--
         从数据库中获取权限
        dataSource：数据源
        authoritiesByUsernameQuery：根据用户名查询权限的sql 
     -->
&lt;bean id="daoPopulator" class="com.broadtext.eim.security.ldap.DaoAuthoritiesPopulator">
        &lt;property name="dataSource" ref="dataSource"/>
        &lt;property name="authoritiesByUsernameQuery">
            &lt;value>select u.username,p.name from sys_user u,sys_role r,sys_permission p,sys_user_role ur,sys_role_permis rp where u.id=ur.user_id and r.id=ur.role_id and p.id=rp.permission_id and
                r.id=rp.role_id and p.open_flag='1' and u.username=?&lt;/value>
        &lt;/property>
&lt;/bean>
</pre><br />5、添加LDAP服务器上下文的bean配置：<br /><pre name="code" class="java">
&lt;!--
       LDAP Server的配置信息
        构造函数的参数：LDAP服务器地址和端口
       managerDn：管理员账号在LDAP中的地址
       managerPassword：管理员密码
     -->
&lt;bean id="initialDirContextFactory" class="org.acegisecurity.ldap.DefaultInitialDirContextFactory">
		&lt;constructor-arg value="ldap://你的LDAP服务器地址:端口"/>
  		&lt;property name="managerDn">&lt;value>yourAdministratorName&lt;/value>&lt;/property>
      	&lt;property name="managerPassword">&lt;value>yourAdministratorPassword&lt;/value>&lt;/property>
&lt;/bean>
</pre><br />这样定义以后，大概相当于指定了进行用户认证的数据库schema。<br /><br />在这里，推荐一个LDAP的浏览工具，叫LDAP Browser，下载地址是<a href="http://file1.softsea.net/30190/ldapbrowser25ce.zip" target="_blank">http://file1.softsea.net/30190/ldapbrowser25ce.zip</a>，可以用这个工具来判断你所拿到的上面三个参数的值是否正确。<br />6、添加userSearch的bean定义：<br /><pre name="code" class="java">
&lt;!--
       在LDAP服务器校验账号的时候，定义搜索账号的规则
     -->
&lt;bean id="userSearch" class="org.acegisecurity.ldap.search.FilterBasedLdapUserSearch">
      	&lt;constructor-arg>
        	&lt;value>ou=BroadText_SH,DC=broadtext,DC=local&lt;/value>
      	&lt;/constructor-arg>
      	&lt;constructor-arg>
        	&lt;value>(sAMAccountName={0})&lt;/value>
      	&lt;/constructor-arg>
      	&lt;constructor-arg>
        	&lt;ref local="initialDirContextFactory"/>
      	&lt;/constructor-arg>            
      	&lt;property name="searchSubtree">
        	&lt;value>true&lt;/value>
      	&lt;/property>            
&lt;/bean>
</pre><br /><br />第一个构造参数表示搜索路径（指定了用户认证的数据表），第二个构造参数表示用怎么的查询条件去搜索，第三个构造参数是要搜索的上下文环境（指定了用户认证的数据库schema），，属性searchSubtree为true表示可以在子节点中进行搜索。<br /><br />大致配置就是这些了。
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/196408#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 24 May 2008 18:29:17 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/196408</link>
        <guid>http://mingo.javaeye.com/blog/196408</guid>
      </item>
      <item>
        <title>2007年年终总结</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/152997" style="color:red;">http://mingo.javaeye.com/blog/152997</a>&nbsp;
          发表时间: 2008年01月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          2007年总结：<br />2007年，我结婚了，在相恋3周年后领到一个红本子。<br />2007年，我升官了，开始人模人样的规划，哈哈，据说不算大，总是被lp说臭美。<br />2007年，我没有发财，但是已把买房提到议事日程，还去看了看房子。<br />2007年，我找到几个不错的同事，大家伙很开心的做事情。<br />2007年，我爸妈第一次来上海，我和他们一起玩了上海滩。<br /> <br />2008年计划：<br />1、买个不大的房子。<br />2、lp来上海，一起规划这个家。<br />3、出去旅游度蜜月。<br />4、部门工作正规化，丰富化。<br />5、减到120~130之间。
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/152997#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jan 2008 09:22:17 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/152997</link>
        <guid>http://mingo.javaeye.com/blog/152997</guid>
      </item>
      <item>
        <title>JBoss4.2.x版本发布web应用，用ip直接访问的解决办法</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/116135" style="color:red;">http://mingo.javaeye.com/blog/116135</a>&nbsp;
          发表时间: 2007年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近有个应用要部署到JBoss上，就用了较新的JBoss4.2版本。</p>
<p>部署上去很奇怪的是，以前用4.0GA版本的时候，部署完毕在ie地址栏敲入ip:port就能访问的应用却报错说：找不到服务器~而用localhost:port就可以正常访问。</p>
<p>百思不得其解~</p>
<p>回来，google了一下，又到官网上看了一下release notes，找到两个解决办法，可以用IP直接访问应用：</p>
<p>1、直接修改<font face="Arial">jboss-4.2.0.GA\server\default\deploy\jboss-web.deployer\server.xml：</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 将<font face="Arial"></font>中的${jboss.bind.address}改为实际的IP地址或者0.0.0.0即可恢复ip直接访问。</p>
<div class="code_title">xml 代码
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Connector</span><span>&nbsp;</span><span class="attribute">port</span><span>=</span><span class="attribute-value">&quot;8088&quot;</span><span>&nbsp;</span><span class="attribute">address</span><span>=</span><span class="attribute-value">&quot;${jboss.bind.adress}&quot;</span><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">maxThreads</span><span>=</span><span class="attribute-value">&quot;250&quot;</span><span>&nbsp;</span><span class="attribute">maxHttpHeaderSize</span><span>=</span><span class="attribute-value">&quot;8192&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">emptySessionPath</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">protocol</span><span>=</span><span class="attribute-value">&quot;HTTP/1.1&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">enableLookups</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">redirectPort</span><span>=</span><span class="attribute-value">&quot;8443&quot;</span><span>&nbsp;</span><span class="attribute">acceptCount</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">connectionTimeout</span><span>=</span><span class="attribute-value">&quot;20000&quot;</span><span>&nbsp;</span><span class="attribute">disableUploadTimeout</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p>&nbsp;</p>
<p>2、修改启动脚本文件run.bat，加上执行参数 -b options：</p>
<p>先创建一个run.bat的快捷方式，然后右键快捷方式，查看其属性，在&ldquo;目标&rdquo;栏中加入<font face="Arial">-b 192.168.19.34或者-b 0.0.0.0，然后启动这个快捷方式即可。</font></p>
<p>&nbsp;<img src="http://mingo.javaeye.com/topics/download/ad43f463-d010-40d7-bea0-5f4ebf302bb7" alt="" /></p>
<p>官网上有以下说明：</p>
<p>JBossAS 4.2.0.GA<br />
<br />
&nbsp;&nbsp;&nbsp; * JBossAS now binds its services to localhost (127.0.0.1) *by default*, instead of binding to all available interfaces (0.0.0.0). This was primarily done for security reasons because of concerns of users going to production without having secured their servers properly. To enable remote access by binding JBoss services to a particular interface, simply run jboss with the -b option. To bind to all available interfaces and re-enable the legacy behaviour use -b 0.0.0.0. In any case, be aware you still need to secure you server properly.</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/116135#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Aug 2007 10:27:00 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/116135</link>
        <guid>http://mingo.javaeye.com/blog/116135</guid>
      </item>
      <item>
        <title>天台山户外（1）</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/106210" style="color:red;">http://mingo.javaeye.com/blog/106210</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          【引子】<br />
那天晚上逛驴屋，看到有人号召去天台山，济公故里，溪降、溯溪等活动，背着大大的包，行走在崎岖的山路，绝对锻炼，甚是诱人&hellip;&hellip;看着自己渐渐鼓起来的肚子，赶紧拉上一个同事报名&hellip;&hellip;论坛里说，这叫ZN，自虐是也&hellip;&hellip;<br />
【准备】<br />
如果说我们参加户外的目的是锻炼身体，那么最快乐的事情，其实是活动之前的一系列准备。首先我们要在周末去玩，一经宣布，就引起了公司一群人的注意，他们不停的跑来问这问那，既是羡慕又是新奇，这个要提供背包，那个要提供帐篷&hellip;&hellip;<br />
<br />
还是要准备一些装备的，什么速干裤，快干衣，溯溪鞋，登山鞋，背包，帐篷之类的，都要有。幸好背包帐篷可以从俱乐部先租着，以后长期参加了，再考虑购买。<br />
户外活动就是个烧钱的活动，到了户外用品专卖店一看，可买的东西可真是太多了，东转细看，敲定一个速干裤，穿起来确实舒服，赶紧拿下。顺便撺掇同事也买了，哈哈，撺掇别人买东西，尤其是奢侈的东西，也成了我的一个爱好了&hellip;&hellip;<br />
<br />
然后就是淘宝网上购买一系列小玩意，雨衣，防雨罩，手电筒&hellip;&hellip;<br />
<br />
说实在的，周五晚上出发的活动，这之前的一周每天过的都乐呵呵的，兴奋啊，还不停的上网查资料充电&hellip;&hellip;<br />
<br />
周五中午杀到超市进行食品大采购。开完两个项目会议，已是晚上6点，距离发车时间还有1个半小时，而我们还没有整理背包&hellip;&hellip;看着我们拎回来的几大包好吃的，同事们开始打趣说，盼望我们来不及赶上车，这样他们就可以大快朵颐了&hellip;&hellip;真是不像话啊<br />
<br />
手忙脚乱的把几个包塞进大的背包，就在同事们&ldquo;艳遇多多&rdquo;的祝福声中出发了，路上我们才发现，我们的打包是多么弱智，人家的帐篷，防潮垫都是在背包外边挂着的，而我们都放进了背包，怪不得东西差点装不下&hellip;&hellip;呵呵
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/106210#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 23:01:00 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/106210</link>
        <guid>http://mingo.javaeye.com/blog/106210</guid>
      </item>
      <item>
        <title>简历驱动开发RDD</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/64630" style="color:red;">http://mingo.javaeye.com/blog/64630</a>&nbsp;
          发表时间: 2007年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>听到一个新名词：简历驱动开发，RDD(Resume Driven Development)，觉得很有韵味。</p>
<p>大致是说，目前我们所做的开发工作，所学到的知识、技能等，都会被以后我们再找工作时，写进我们的简历。或比如我在某项目中担任核心程序员，在另一个项目中担任技术架构等等，看上去都是多么耀眼的字眼。如果自己做的不好，那么简历也不会辉煌到哪里去。</p>
<p>又想起一个同事，经常性的，大概没几个月一次吧，到51job上去维护自己的简历，把自己的工作经验，学到的知识、技能整理整理，贴上去，自我陶醉一番，然后又是一条生龙活虎的好汉&hellip;&hellip;偶尔要是能收到别的公司的邀请信，就更high了，曾想我炫耀过&hellip;&hellip;</p>
<p>简历，简历，就是工作经历。实际上，软件开发和人生一样，软件开发注重开发经历，人生注重生活经历。有了经历，在三年五年之后回望往事，就会觉得那时候觉得很困难的事情，其实不也都熬过来了吗？项目结束之后，回望项目最初的困难，都是多么不值一提，相信也是一种快乐的体验。</p>
<p>最近，就有几个弟兄，经常给我说在北京出差的那段日子，还是挺happy的&hellip;&hellip;</p>
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/64630#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 Mar 2007 12:07:28 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/64630</link>
        <guid>http://mingo.javaeye.com/blog/64630</guid>
      </item>
      <item>
        <title>webwork2.2.2迁移到struts2.0.6之记录</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/64616" style="color:red;">http://mingo.javaeye.com/blog/64616</a>&nbsp;
          发表时间: 2007年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>听说struts2出来了，与webwork2的差别也不是很大，robbin说迁移很easy，禁不住诱惑，我也尝试了一把，然则发现其实好像没那么容易啊，下面把一些过程记下来。</p>
<p>1、JDK版本，首先我们用的是JDK1.4，一直不太敢使用JDK5，因为我们开发的系统很有可能还要在用户很久以前的系统上跑，怕出兼容问题，所以struts2我们只能选用其jdk4的那个版本了。放入的jar是：</p>
<p><font face="Arial">xwork-j4-2.0.1.jar、<font face="Arial">struts2-core-j4-2.0.6.jar、<font face="Arial">retrotranslator-transformer-1.2.0.jar、<font face="Arial">retrotranslator-runtime-1.2.0.jar、<font face="Arial">backport-util-concurrent-3.0.jar</font></font></font></font></font></p>
<p>2、受到一个jar包的名字的引诱，就是<font face="Arial">struts2-spring-plugin-2.0.6.jar，于是将这个jar放到了lib中，出现了版本不兼容的异常，系统不能启动，于是找到源码，用jdk4重新编译了一下，好了。然后将struts-plugin.xml也放到了classes下面。这时候还是一直启动不了。郁闷。非常郁闷，找到以前的项目不停的对比。最后发现<font face="Arial">struts2-spring-plugin-2.0.6.jar这个jar完全没用，也就是说里面的那个类StrutsSpringObjectFactory对系统来说是没用的。删掉，然后将struts-plugin.xml也删掉了。最后的各种配置文件如下：</font></font></p>
<font face="Arial">
<div class="code_title">struts.properties文件内容如下，注意的是：</div>
<div class="code_title"><font face="Arial">struts.objectFactory = spring这句要注释掉</font></div>
<div class="code_title"><font face="Arial"><font face="Arial">struts.objectFactory.spring.autoWire=name要保留</font></font></div>
<div class="code_title"><font face="Arial">struts.configuration.files=struts-default.xml,struts.xml（里面不能有struts-plugin.xml文件）</font></div>
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>###&nbsp;Struts&nbsp;</span><span class="keyword">default</span><span>&nbsp;properties &nbsp;&nbsp;</span></span></li>
    <li class=""><span>###(can&nbsp;be&nbsp;overridden&nbsp;by&nbsp;a&nbsp;struts.properties&nbsp;file&nbsp;in&nbsp;the&nbsp;root&nbsp;of&nbsp;the&nbsp;classpath) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>### &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Specifies&nbsp;the&nbsp;Configuration&nbsp;used&nbsp;to&nbsp;configure&nbsp;Struts&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;one&nbsp;could&nbsp;extend&nbsp;org.apache.struts2.config.Configuration &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;to&nbsp;build&nbsp;one's&nbsp;customize&nbsp;way&nbsp;of&nbsp;getting&nbsp;the&nbsp;configurations&nbsp;parameters&nbsp;into&nbsp;Struts &nbsp;&nbsp;</span></li>
    <li class=""><span>#&nbsp;struts.configuration=org.apache.struts2.config.DefaultConfiguration &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;This&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;set&nbsp;your&nbsp;</span><span class="keyword">default</span><span>&nbsp;locale&nbsp;and&nbsp;encoding&nbsp;scheme &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;struts.locale=en_US &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.i18n.encoding=UTF-</span><span class="number">8</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;</span><span class="keyword">if</span><span>&nbsp;specified,&nbsp;the&nbsp;</span><span class="keyword">default</span><span>&nbsp;object&nbsp;factory&nbsp;can&nbsp;be&nbsp;overridden&nbsp;here &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Note:&nbsp;</span><span class="keyword">short</span><span>-hand&nbsp;notation&nbsp;is&nbsp;supported&nbsp;in&nbsp;some&nbsp;cases,&nbsp;such&nbsp;as&nbsp;</span><span class="string">&quot;spring&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alternatively,&nbsp;you&nbsp;can&nbsp;provide&nbsp;a&nbsp;com.opensymphony.xwork2.ObjectFactory&nbsp;subclass&nbsp;name&nbsp;here&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#struts.objectFactory&nbsp;=&nbsp;spring &nbsp;&nbsp;</span></li>
    <li class=""><span>#上面这句一定要注释掉。 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;specifies&nbsp;the&nbsp;autoWiring&nbsp;logic&nbsp;when&nbsp;using&nbsp;the&nbsp;SpringObjectFactory. &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;valid&nbsp;values&nbsp;are:&nbsp;name,&nbsp;type,&nbsp;auto,&nbsp;and&nbsp;constructor&nbsp;(name&nbsp;is&nbsp;the&nbsp;</span><span class="keyword">default</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.objectFactory.spring.autoWire&nbsp;=&nbsp;name &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;indicates&nbsp;to&nbsp;the&nbsp;struts-spring&nbsp;integration&nbsp;</span><span class="keyword">if</span><span>&nbsp;Class&nbsp;instances&nbsp;should&nbsp;be&nbsp;cached &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;</span><span class="keyword">this</span><span>&nbsp;should,&nbsp;until&nbsp;a&nbsp;future&nbsp;Spring&nbsp;release&nbsp;makes&nbsp;it&nbsp;possible,&nbsp;be&nbsp;left&nbsp;as&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;unless&nbsp;you&nbsp;know&nbsp;exactly&nbsp;what&nbsp;you&nbsp;are&nbsp;doing! &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;valid&nbsp;values&nbsp;are:&nbsp;</span><span class="keyword">true</span><span>,&nbsp;</span><span class="keyword">false</span><span>&nbsp;(</span><span class="keyword">true</span><span>&nbsp;is&nbsp;the&nbsp;</span><span class="keyword">default</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.objectFactory.spring.useClassCache&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;</span><span class="keyword">if</span><span>&nbsp;specified,&nbsp;the&nbsp;</span><span class="keyword">default</span><span>&nbsp;object&nbsp;type&nbsp;determiner&nbsp;can&nbsp;be&nbsp;overridden&nbsp;here &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Note:&nbsp;</span><span class="keyword">short</span><span>-hand&nbsp;notation&nbsp;is&nbsp;supported&nbsp;in&nbsp;some&nbsp;cases,&nbsp;such&nbsp;as&nbsp;</span><span class="string">&quot;tiger&quot;</span><span>&nbsp;or&nbsp;</span><span class="string">&quot;notiger&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alternatively,&nbsp;you&nbsp;can&nbsp;provide&nbsp;a&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer&nbsp;implementation&nbsp;name&nbsp;here &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Note:&nbsp;</span><span class="keyword">if</span><span>&nbsp;you&nbsp;have&nbsp;the&nbsp;xwork-tiger.jar&nbsp;within&nbsp;your&nbsp;classpath,&nbsp;GenericsObjectTypeDeterminer&nbsp;is&nbsp;used&nbsp;by&nbsp;</span><span class="keyword">default</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;To&nbsp;disable&nbsp;tiger&nbsp;support&nbsp;use&nbsp;the&nbsp;</span><span class="string">&quot;notiger&quot;</span><span>&nbsp;property&nbsp;value&nbsp;here. &nbsp;&nbsp;</span></li>
    <li class=""><span>#struts.objectTypeDeterminer&nbsp;=&nbsp;tiger &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#struts.objectTypeDeterminer&nbsp;=&nbsp;notiger &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Parser&nbsp;to&nbsp;handle&nbsp;HTTP&nbsp;POST&nbsp;requests,&nbsp;encoded&nbsp;using&nbsp;the&nbsp;MIME-type&nbsp;multipart/form-data &nbsp;&nbsp;</span></li>
    <li class=""><span>#&nbsp;struts.multipart.parser=cos &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;struts.multipart.parser=pell &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.multipart.parser=jakarta &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;uses&nbsp;javax.servlet.context.tempdir&nbsp;by&nbsp;</span><span class="keyword">default</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>struts.multipart.saveDir= &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.multipart.maxSize=</span><span class="number">2097152</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Load&nbsp;custom&nbsp;property&nbsp;files&nbsp;(does&nbsp;not&nbsp;override&nbsp;struts.properties!) &nbsp;&nbsp;</span></li>
    <li class=""><span>#&nbsp;struts.custom.properties=application,org/apache/struts2/extension/custom &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;How&nbsp;request&nbsp;URLs&nbsp;are&nbsp;mapped&nbsp;to&nbsp;and&nbsp;from&nbsp;actions &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#struts.mapper.</span><span class="keyword">class</span><span>=org.apache.struts2.dispatcher.mapper.DefaultActionMapper &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Used&nbsp;by&nbsp;the&nbsp;DefaultActionMapper &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;You&nbsp;may&nbsp;provide&nbsp;a&nbsp;comma&nbsp;separated&nbsp;list,&nbsp;e.g.&nbsp;struts.action.extension=action,jnlp,</span><span class="keyword">do</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.action.extension=action &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Used&nbsp;by&nbsp;FilterDispatcher &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;If&nbsp;</span><span class="keyword">true</span><span>&nbsp;then&nbsp;Struts&nbsp;serves&nbsp;</span><span class="keyword">static</span><span>&nbsp;content&nbsp;from&nbsp;inside&nbsp;its&nbsp;jar.&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;If&nbsp;</span><span class="keyword">false</span><span>&nbsp;then&nbsp;the&nbsp;</span><span class="keyword">static</span><span>&nbsp;content&nbsp;must&nbsp;be&nbsp;available&nbsp;at&nbsp;&lt;context_path&gt;/struts &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.serve.</span><span class="keyword">static</span><span>=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Used&nbsp;by&nbsp;FilterDispatcher &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;This&nbsp;is&nbsp;good&nbsp;</span><span class="keyword">for</span><span>&nbsp;development&nbsp;where&nbsp;one&nbsp;wants&nbsp;changes&nbsp;to&nbsp;the&nbsp;</span><span class="keyword">static</span><span>&nbsp;content&nbsp;be &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;fetch&nbsp;on&nbsp;each&nbsp;request.&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;NOTE:&nbsp;This&nbsp;will&nbsp;only&nbsp;have&nbsp;effect&nbsp;</span><span class="keyword">if</span><span>&nbsp;struts.serve.</span><span class="keyword">static</span><span>=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;If&nbsp;</span><span class="keyword">true</span><span>&nbsp;-&gt;&nbsp;Struts&nbsp;will&nbsp;write&nbsp;out&nbsp;header&nbsp;</span><span class="keyword">for</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;contents&nbsp;such&nbsp;that&nbsp;they&nbsp;will &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;cached&nbsp;by&nbsp;web&nbsp;browsers&nbsp;(using&nbsp;Date,&nbsp;Cache-Content,&nbsp;Pragma,&nbsp;Expires) &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers). &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;If&nbsp;</span><span class="keyword">false</span><span>&nbsp;-&gt;&nbsp;Struts&nbsp;will&nbsp;write&nbsp;out&nbsp;header&nbsp;</span><span class="keyword">for</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;contents&nbsp;such&nbsp;that&nbsp;they&nbsp;are &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;to&nbsp;be&nbsp;cached&nbsp;by&nbsp;web&nbsp;browser&nbsp;(using&nbsp;Cache-Content,&nbsp;Pragma,&nbsp;Expires &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers) &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.serve.</span><span class="keyword">static</span><span>.browserCache=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Set&nbsp;</span><span class="keyword">this</span><span>&nbsp;to&nbsp;</span><span class="keyword">false</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;you&nbsp;wish&nbsp;to&nbsp;disable&nbsp;implicit&nbsp;dynamic&nbsp;method&nbsp;invocation &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;via&nbsp;the&nbsp;URL&nbsp;request.&nbsp;This&nbsp;includes&nbsp;URLs&nbsp;like&nbsp;foo!bar.action,&nbsp;as&nbsp;well&nbsp;as&nbsp;params &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;like&nbsp;method:bar&nbsp;(but&nbsp;not&nbsp;action:foo).&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;An&nbsp;alternative&nbsp;to&nbsp;implicit&nbsp;dynamic&nbsp;method&nbsp;invocation&nbsp;is&nbsp;to&nbsp;use&nbsp;wildcard&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;mappings,&nbsp;such&nbsp;as&nbsp;&lt;action&nbsp;name=</span><span class="string">&quot;*/*&quot;</span><span>&nbsp;method=</span><span class="string">&quot;{2}&quot;</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">&quot;actions.{1}&quot;</span><span>&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.enable.DynamicMethodInvocation&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Set&nbsp;</span><span class="keyword">this</span><span>&nbsp;to&nbsp;</span><span class="keyword">true</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;you&nbsp;wish&nbsp;to&nbsp;allow&nbsp;slashes&nbsp;in&nbsp;your&nbsp;action&nbsp;names.&nbsp;&nbsp;If&nbsp;</span><span class="keyword">false</span><span>, &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Actions&nbsp;names&nbsp;cannot&nbsp;have&nbsp;slashes,&nbsp;and&nbsp;will&nbsp;be&nbsp;accessible&nbsp;via&nbsp;any&nbsp;directory &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;prefix.&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;traditional&nbsp;behavior&nbsp;expected&nbsp;of&nbsp;WebWork&nbsp;applications. &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Setting&nbsp;to&nbsp;</span><span class="keyword">true</span><span>&nbsp;is&nbsp;useful&nbsp;when&nbsp;you&nbsp;want&nbsp;to&nbsp;use&nbsp;wildcards&nbsp;and&nbsp;store&nbsp;values &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;in&nbsp;the&nbsp;URL,&nbsp;to&nbsp;be&nbsp;extracted&nbsp;by&nbsp;wildcard&nbsp;patterns,&nbsp;such&nbsp;as&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;&lt;action&nbsp;name=</span><span class="string">&quot;*/*&quot;</span><span>&nbsp;method=</span><span class="string">&quot;{2}&quot;</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">&quot;actions.{1}&quot;</span><span>&gt;&nbsp;to&nbsp;match&nbsp;</span><span class="string">&quot;/foo/edit&quot;</span><span>&nbsp;or&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;</span><span class="string">&quot;/foo/save&quot;</span><span>. &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.enable.SlashesInActionNames&nbsp;=&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;use&nbsp;alternative&nbsp;syntax&nbsp;that&nbsp;requires&nbsp;%{}&nbsp;in&nbsp;most&nbsp;places &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;to&nbsp;evaluate&nbsp;expressions&nbsp;</span><span class="keyword">for</span><span>&nbsp;String&nbsp;attributes&nbsp;</span><span class="keyword">for</span><span>&nbsp;tags &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.tag.altSyntax=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;when&nbsp;set&nbsp;to&nbsp;</span><span class="keyword">true</span><span>,&nbsp;Struts&nbsp;will&nbsp;act&nbsp;much&nbsp;more&nbsp;friendly&nbsp;</span><span class="keyword">for</span><span>&nbsp;developers.&nbsp;This &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;includes: &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;-&nbsp;struts.i18n.reload&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;-&nbsp;struts.configuration.xml.reload&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;-&nbsp;raising&nbsp;various&nbsp;debug&nbsp;or&nbsp;ignorable&nbsp;problems&nbsp;to&nbsp;errors &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;For&nbsp;example:&nbsp;normally&nbsp;a&nbsp;request&nbsp;to&nbsp;foo.action?someUnknownField=</span><span class="keyword">true</span><span>&nbsp;should &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;ignored&nbsp;(given&nbsp;that&nbsp;any&nbsp;value&nbsp;can&nbsp;come&nbsp;from&nbsp;the&nbsp;web&nbsp;and&nbsp;it &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;not&nbsp;be&nbsp;trusted).&nbsp;However,&nbsp;during&nbsp;development,&nbsp;it&nbsp;may&nbsp;be &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useful&nbsp;to&nbsp;know&nbsp;when&nbsp;these&nbsp;errors&nbsp;are&nbsp;happening&nbsp;and&nbsp;be&nbsp;told&nbsp;of &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;them&nbsp;right&nbsp;away. &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.devMode&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;when&nbsp;set&nbsp;to&nbsp;</span><span class="keyword">true</span><span>,&nbsp;resource&nbsp;bundles&nbsp;will&nbsp;be&nbsp;reloaded&nbsp;on&nbsp;_every_&nbsp;request. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;</span><span class="keyword">this</span><span>&nbsp;is&nbsp;good&nbsp;during&nbsp;development,&nbsp;but&nbsp;should&nbsp;never&nbsp;be&nbsp;used&nbsp;in&nbsp;production &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.i18n.reload=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Standard&nbsp;UI&nbsp;theme &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Change&nbsp;</span><span class="keyword">this</span><span>&nbsp;to&nbsp;reflect&nbsp;which&nbsp;path&nbsp;should&nbsp;be&nbsp;used&nbsp;</span><span class="keyword">for</span><span>&nbsp;JSP&nbsp;control&nbsp;tag&nbsp;templates&nbsp;by&nbsp;</span><span class="keyword">default</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>struts.ui.theme=jsxhtml &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.ui.templateDir=template &nbsp;&nbsp;</span></li>
    <li class=""><span>#sets&nbsp;the&nbsp;</span><span class="keyword">default</span><span>&nbsp;template&nbsp;type.&nbsp;Either&nbsp;ftl,&nbsp;vm,&nbsp;or&nbsp;jsp &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.ui.templateSuffix=ftl &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Configuration&nbsp;reloading &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;This&nbsp;will&nbsp;cause&nbsp;the&nbsp;configuration&nbsp;to&nbsp;reload&nbsp;struts.xml&nbsp;when&nbsp;it&nbsp;is&nbsp;changed &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.configuration.xml.reload=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Location&nbsp;of&nbsp;velocity.properties&nbsp;file.&nbsp;&nbsp;defaults&nbsp;to&nbsp;velocity.properties &nbsp;&nbsp;</span></li>
    <li class=""><span>###struts.velocity.configfile&nbsp;=&nbsp;velocity.properties &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Comma&nbsp;separated&nbsp;list&nbsp;of&nbsp;VelocityContext&nbsp;classnames&nbsp;to&nbsp;chain&nbsp;to&nbsp;the&nbsp;StrutsVelocityContext &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###struts.velocity.contexts&nbsp;= &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;Location&nbsp;of&nbsp;the&nbsp;velocity&nbsp;toolbox &nbsp;&nbsp;</span></li>
    <li class=""><span>###struts.velocity.toolboxlocation= &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;used&nbsp;to&nbsp;build&nbsp;URLs,&nbsp;such&nbsp;as&nbsp;the&nbsp;UrlTag &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.url.http.port&nbsp;=&nbsp;</span><span class="number">80</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>struts.url.https.port&nbsp;=&nbsp;</span><span class="number">443</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;possible&nbsp;values&nbsp;are:&nbsp;none,&nbsp;get&nbsp;or&nbsp;all &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.url.includeParams&nbsp;=&nbsp;get &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Load&nbsp;custom&nbsp;</span><span class="keyword">default</span><span>&nbsp;resource&nbsp;bundles &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;struts.custom.i18n.resources=testmessages,testmessages2 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;workaround&nbsp;</span><span class="keyword">for</span><span>&nbsp;some&nbsp;app&nbsp;servers&nbsp;that&nbsp;don't&nbsp;handle&nbsp;HttpServletRequest.getParameterMap() &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;often&nbsp;used&nbsp;</span><span class="keyword">for</span><span>&nbsp;WebLogic,&nbsp;Orion,&nbsp;and&nbsp;OC4J &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.dispatcher.parametersWorkaround&nbsp;=&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;configure&nbsp;the&nbsp;Freemarker&nbsp;Manager&nbsp;</span><span class="keyword">class</span><span>&nbsp;to&nbsp;be&nbsp;used &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Allows&nbsp;user&nbsp;to&nbsp;plug-in&nbsp;customised&nbsp;Freemarker&nbsp;Manager&nbsp;</span><span class="keyword">if</span><span>&nbsp;necessary &nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;MUST&nbsp;</span><span class="keyword">extends</span><span>&nbsp;off&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager &nbsp;&nbsp;</span></li>
    <li class=""><span>#struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;See&nbsp;the&nbsp;StrutsBeanWrapper&nbsp;javadocs&nbsp;</span><span class="keyword">for</span><span>&nbsp;more&nbsp;information &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.freemarker.wrapper.altMap=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;configure&nbsp;the&nbsp;XSLTResult&nbsp;</span><span class="keyword">class</span><span>&nbsp;to&nbsp;use&nbsp;stylesheet&nbsp;caching. &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Set&nbsp;to&nbsp;</span><span class="keyword">true</span><span>&nbsp;</span><span class="keyword">for</span><span>&nbsp;developers&nbsp;and&nbsp;</span><span class="keyword">false</span><span>&nbsp;</span><span class="keyword">for</span><span>&nbsp;production. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.xslt.nocache=</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>###&nbsp;A&nbsp;list&nbsp;of&nbsp;configuration&nbsp;files&nbsp;automatically&nbsp;loaded&nbsp;by&nbsp;Struts &nbsp;&nbsp;</span></li>
    <li class=""><span>struts.configuration.files=struts-</span><span class="keyword">default</span><span>.xml,struts.xml &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#不能加载struts-plugin.xml，在classpath下面也不能有这个文件 &nbsp;&nbsp;</span></li>
    <li class=""><span>###&nbsp;Whether&nbsp;to&nbsp;always&nbsp;select&nbsp;the&nbsp;namespace&nbsp;to&nbsp;be&nbsp;everything&nbsp;before&nbsp;the&nbsp;last&nbsp;slash&nbsp;or&nbsp;not &nbsp;&nbsp;</span></li>
    <li class="alt"><span>struts.mapper.alwaysSelectFullNamespace=</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div class="code_title">
<div class="code_title">struts.xml 的代码如下，规模开发时，每个人拥有自己的配置文件，避免文件提交冲突。这个文件曾经犯晕，将struts-plugin.xml文件include进来了，结果总是启动不了，报空指针异常。去掉。</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;!DOCTYPE&nbsp;struts&nbsp;PUBLIC &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN&quot; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-default.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-application.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-common.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-dym.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-zxw.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-hw.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-zw.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-lb.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-lx.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-cjh.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;struts-wyf.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div class="code_title">&nbsp;
<div class="code_title">下面的代码比较重要，其中相比webwork2.2.2时，增加了一个拦截器autowiring，把它放在了拦截器栈的最上面。这样就可以将spring配置文件的service示例，以名字的形式，自动注入到action中，完成action对业务service的调用。</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;!DOCTYPE&nbsp;struts&nbsp;PUBLIC &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN&quot; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;default&quot;</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">&quot;struts-default&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;Interceptor&nbsp;to&nbsp;catch&nbsp;exceptions&nbsp;and&nbsp;display&nbsp;mapped&nbsp;exception&nbsp;result&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;exceptionHandler&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.broadtext.framework.web.interceptor.ExceptionHandleInterceptor&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;authorizationHandler&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.broadtext.framework.web.interceptor.AuthorizationInterceptor&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;autowiring&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-stack</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;appDefaultStack&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;autowiring&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;exception&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;alias&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;servlet-config&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;prepare&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;chain&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;model-driven&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;fileUpload&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;static-params&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;params&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;conversionError&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;exceptionHandler&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;authorizationHandler&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">interceptor-stack</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">default-interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;appDefaultStack&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">global-results</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;appBaseError&quot;</span><span class="tag">&gt;</span><span>/pages/common/appBaseError.jsp</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;runtimeError&quot;</span><span class="tag">&gt;</span><span>/pages/common/runtimeError.jsp</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;unkownError&quot;</span><span class="tag">&gt;</span><span>/pages/common/runtimeError.jsp</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">global-results</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">package</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div class="code_title">&nbsp;
<div class="code_title">这是userService的spring配置代码，使用的是Spring2.0.1。</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;userService&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.broadtext.cmshzhgl.security.service.impl.UserServiceImpl&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dao&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;baseDao&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;utilService&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;utilService&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;roleService&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;roleService&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div class="code_title">这是测试Action的&nbsp;代码，用来测试一下是不是可以调用spring配置的业务service了。</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;LoginAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BaseAction&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;UserService&nbsp;userService; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;login(){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aaa&nbsp;=&nbsp;userService.getTestString(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(aaa); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SUCCESS; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setUserService(UserService&nbsp;userService)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.userService&nbsp;=&nbsp;userService; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</font>
<div class="code_title">action与jsp之间的struts配置文件代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;!DOCTYPE&nbsp;struts&nbsp;PUBLIC &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN&quot; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test&quot;</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">&quot;default&quot;</span><span>&nbsp;</span><span class="attribute">namespace</span><span>=</span><span class="attribute-value">&quot;/pages/test&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;login&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.broadtext.cmshzhgl.security.action.LoginAction&quot;</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">&quot;login&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;success&quot;</span><span class="tag">&gt;</span><span>/pages/common/currentUser.jsp</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">package</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>总体感觉是：对于具体的开发业务的配置，xwork.xml变到struts.xml比较简单，但是spring如何注入还是比较麻烦的，要改几个文件的内容，而不是简单的将webwork和xwork改成struts就ok，主要问题struts提供了好几种spring注入的选择，弄得有些犯晕。上面我只列出其中一种配置方案，更多的配置方法慢慢再体验吧。</p>
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/64616#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 Mar 2007 11:16:11 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/64616</link>
        <guid>http://mingo.javaeye.com/blog/64616</guid>
      </item>
      <item>
        <title>JS组合拼接字符串的效率zz</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/31920" style="color:red;">http://mingo.javaeye.com/blog/31920</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          经常记不住这个方法，还要去google，干脆放在自己的blog里找起来方便。<br /><br /><br />在脚本开发过程中，经常会按照某个规则，组合拼接出一个大字符串进行输出。比如写脚本控件时控制整个控件的外观的HTML标签输出，比如AJAX里得到服务器端的回传值后动态分析创建HTML标签时，不过这里我就不讨论拼接字符串的具体应用了，我只是想在这里讨论一下拼接的效率。<br /><br />    字符串的拼接在我们写代码的时候都是用“+=”这个运算符，s += String; 这是我们最为熟知的写法，不知道大家有没有注意过没有，在组合的字符串容量有几十K甚至几百K的时候，脚本执行起来很慢，CPU使用率狂高，例如：<br /><br />    var str = "01234567891123456789212345678931234567894123456789";<br />        str+= "51234567896123456789712345678981234567899123456789\n";<br />    var result = "";<br />    for(var i=0; i&lt;2000; i++) result += str;<br /><br />    就这么一步操作，产生的结果字符串是200K，耗时是1.1秒（这个与电脑配置有关），CPU的峰值100%。（为了更直观地看到效果，我多做了些循环）。可想而知就这么一步操作就消耗了我一秒多的时间，再加上其它的代码的时间消耗，那整个脚本块的执行时间就难以忍受了。那有没有优化的方案呢？还有其它的方法吗？答案当然是有的，否则我写这篇文章就是废话。<br /><br />    更快的方式就是使用数组，在循环拼接的时候不是相接拼接到某个字符串里去，而是把字符串放到一个数组里，最后用数组.join("") 得到结果字符串，代码示例：<br /><br />    var str = "01234567891123456789212345678931234567894123456789";<br />        str+= "51234567896123456789712345678981234567899123456789\n";<br />    var result = "", a = new Array();<br />    for(var i=0; i&lt;2000; i++) a[i] = str;<br />    result = a.join(""); a = null;<br /><br />    大家可以测试测试，组合出一个相同大小的字符串所消耗的时间，我这里测试出来的结果是：&lt;15毫秒，请注意，它的单位是毫秒，也就是说组合出这么一个200K的字符串，两种模式的时间消耗是差不多两个数量级。这意味着什么？意味着后者已经工作结束吃完中饭回来，前者还在做着苦力。我写一个测试页面，大家可以把下面这些代码拷贝下来另存为一个HTM文件在网页里打开自己来测试一下两者之间的效率差，反正我测试的是前者要半分钟才能完成的事，后者0.07秒就搞定了（循环10000次）。<br /><br />&lt;body><br />字符串拼接次数&lt;input id="totle" value="1000" size="5" maxlength="5"><br />&lt;input type="button" value="字符串拼接法" onclick="method1()"><br />&lt;input type="button" value="数组赋值join法" onclick="method2()">&lt;br><br />&lt;div id="method1"> &lt;/div><br />&lt;div id="method2"> &lt;/div><br />&lt;textarea id="show" style="width: 100%; height: 400">
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/31920#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 09:45:58 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/31920</link>
        <guid>http://mingo.javaeye.com/blog/31920</guid>
      </item>
      <item>
        <title>国庆第六、七天</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/25996" style="color:red;">http://mingo.javaeye.com/blog/25996</a>&nbsp;
          发表时间: 2006年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          终于受不了这乏味的节日，为了度过一个特别的中秋节，我们5号晚上决定去爬号称北京第一高峰的灵山过中秋……<br /><br />灵山海拔2303米，位于京西与河北交界的地方。由于去的时节不对，山体光秃秃的，泛着黄色，白桦树叶子都快掉光了，号称可以和西藏媲美的高山草甸上也了无绿色，让人没了躺下去拥抱大地的冲动。<br /><br />6号下午骑马上山去主峰之外的山，看了没有标识的所谓的三个景点：白桦林、黄花岭、狮子头。高头大马从大街上穿过，感觉确实很不错，甚至想朝大街两边挥手致意了，可惜没人羡慕我，难怪高中状元之后要去骑马游街，确实很耀武扬威啊……上山时，马背上晃悠晃悠，舒服的只想睡觉。<br /><br />中秋之夜住在海拔1500多米的半山腰的农家旅馆，店家显然是尚未开发得当，很贵的菜式，不敢点，于是每顿饭只是主食度过。<br /><br />约好5点起床，爬山去看日出，结果赖到8点多。<br /><br />爬山很累，主峰处有群中年人放鞭炮，劈哩啪啦，旁边的看起来是登山爱好者的一群人斥之，曰污染环境，于是那群人默然。mm说俗不可耐，貌似上坟-_-。<br /><br />传说中，灵山主峰上终年积雪，远看一片白色，像是白幡，被称为幡山。后来有识之僧看中这块地方，建了寺庙，日渐香火不绝，还很灵验，遂改名灵山。然而如今寺庙已经没了，只留下片瓦碎石，旁边和尚饮用的泉水也都早已干涸。<br /><br />整个灵山唯一特色的两个地方：山高，可以爬上以锻炼体魄；骑马，可以过过新鲜劲。余下的回忆为零。
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/25996#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Oct 2006 09:24:11 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/25996</link>
        <guid>http://mingo.javaeye.com/blog/25996</guid>
      </item>
      <item>
        <title>国庆第三、四、五天</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/25970" style="color:red;">http://mingo.javaeye.com/blog/25970</a>&nbsp;
          发表时间: 2006年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          国庆慵懒的生活，没啥记事之处。<br /><br />mm身体好些了，做了月饼，没有模子，看起来像烧卖，刚出锅的时候很好吃，凉了之后像砖头，咬不动，这让mm批量生产然后送人的梦想破灭……<br /><br />每天在宿舍做饭吃，味道不错，撑得俩人大眼瞪小眼，捂着肚皮说要节食……而且一边吃饭，一边看易中天的评三国，俨然家庭生活的样子。
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/25970#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Oct 2006 09:06:42 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/25970</link>
        <guid>http://mingo.javaeye.com/blog/25970</guid>
      </item>
      <item>
        <title>国庆第二天</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/25517" style="color:red;">http://mingo.javaeye.com/blog/25517</a>&nbsp;
          发表时间: 2006年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          mm虚弱的爬不起来床，幸亏楼下有个同仁堂，于是吃各种各样的药，退烧的，健胃的，消炎的……生病真难受！病分给我一半就好了<br /><br />决定3号的济南之行作废，火车票送了一圈没送掉，只好紧急退掉。反正也不是很想出去玩，就过家庭生活吧，也不错的<br /><br />国庆之后貌似每天从下午开始，睡到中午才起床，赖到这时才写blog……
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/25517#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Oct 2006 15:58:39 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/25517</link>
        <guid>http://mingo.javaeye.com/blog/25517</guid>
      </item>
      <item>
        <title>国庆第一天</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/25493" style="color:red;">http://mingo.javaeye.com/blog/25493</a>&nbsp;
          发表时间: 2006年10月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          国庆第一天，睡了懒觉……<br /><br />然后去逛街，买了一双鞋，一件衬衫，脚底板累得疼。<br /><br />晚上吃了附件的八宝烤香鸭，结果和mm两个人双双拉肚子……mm到现在还在萎靡中<br /><br />结论：郁闷的国庆节。
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/25493#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 02 Oct 2006 16:19:26 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/25493</link>
        <guid>http://mingo.javaeye.com/blog/25493</guid>
      </item>
      <item>
        <title>职业规划四步走</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/25278" style="color:red;">http://mingo.javaeye.com/blog/25278</a>&nbsp;
          发表时间: 2006年09月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天大老板过来看望我们一帮在北京出差的兄弟，于是我们义不容辞的宰了他一顿全聚德，可惜去的比较晚，菜没点够就急急忙忙开始吃了起来，等再想加菜的时候，大厨下班了……胸闷<br /><br />不过席间，boss给我们讲了他最近的职业规划感悟，颇有心得，遂下笔成文，聊以记之。<br /><br />第一步：learn，就是学习。每个人刚进入社会，在某个行业，都是要学习的。学习这个行业的游戏规则，学习这个行业所需要的基本技能等等。同样是学习，人与人之间也有不同，有的人学的很快，有的人学的比较慢，学的很快的人马上就可以进入到下一步，而学的比较慢的，在这第一步待上三五年都有可能。这期间，也是会做一些事情的，但是学习的意味大于做，对于公司来说，这部分的时间越短越好。<br />第二步：do，就是做。具备了一些基本技能，掌握一些技巧之后，就要做了，这时候你可能是一个合格的程序员，可以按时完成任务，保证质量。如果你要是不想再学了，凭着第一步积累的老本，你也能够在这个社会混下去，随着经验的丰富，时间的积累，你可能会慢慢成为一个senior programer,抑或senior senior programer。这个阶段，很多时候大家面对的都是机器，面对的都是代码，不用去管人，劳力大于劳心。很多人做到这个步骤之后，就不想再往上走了，于是一直在这一步转悠，转悠。他们中的很多人可能是以此为乐。<br />第三步：lead，就是领导。如果你不满足于做，你还想往上走，那你接下来的步骤可能就是lead，即带着别人做。这时候你就得开始管人，劳心大于劳力。每天想着如何使你的团队保持高昂的斗志、保持团结、保持高效。某个人情绪不对，你得马上去帮忙调节。某个成员不听话了，闹无组织情绪，你得赶紧制止这种情绪。由于开始主要和人打交道，这阶段需要的技巧是很多的，尤其是在中国这样一个讲究中庸的社会，稍不留神，可能你领导的人都不拥护你了，这是比较悲哀的事情。在这个阶段最理想的情况就是下面的人都拥护你这个领导，同时你的团队又保持高产出。这个阶段类似于中层领导，中层干部，他所面对的可能是一个项目，一个部门。<br />第四步：shape，就是创造，塑造。这个词是boss提出来的，当时他问我这第四步应该是什么，我的答案是operate，即运营。好像有些差别，又有些像。这个阶段说白了，就是一个企业的CEO吧，他开始运作整个公司，保持整个公司的良好发展，他可能要经常拍板做决定了，比如说做不做某个客户，做什么产品方向等等。他也要经常给员工们画饼，描绘公司的蓝图。他的决定经常会影响整个企业的发展路线，所以说这个阶段他已经不是他自己一个人了，他代表整个公司的利益。很多公司的决策者只有一个，所以很多公司的决策都有很明显的个人印迹。<br /><br />总体来说，这个职业规划还是满有道理的，很多人都可以对号入座了。<br /><br />然而，不一定每个人在一个时刻只能处于一个阶段的。我现在就同时是一个learner，一个doer，一个leader……超级三合一。目前的我感觉项目管理是一件很累的事情，很想回归到第二步，呵呵，做一个前面有很多个senior的programer也不错啊，写程序直至成精，gigix说的。目前也的确需要充充电，再多做一些事情。但是如果这样又有些不太甘心。矛盾啊……
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/25278#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Sep 2006 09:29:17 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/25278</link>
        <guid>http://mingo.javaeye.com/blog/25278</guid>
      </item>
      <item>
        <title>国庆到了</title>
        <author>mingo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mingo.javaeye.com">mingo</a>&nbsp;
          链接：<a href="http://mingo.javaeye.com/blog/25206" style="color:red;">http://mingo.javaeye.com/blog/25206</a>&nbsp;
          发表时间: 2006年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          国庆打算：<br />睡觉，逛街，吃饭，北京周边游……<br /><br />mm要做月饼，拭目以待……<br /><br />或者中间突发奇想，去泰山看看也不错，据说只有6个小时的汽车路程。
          <br/>
          <span style="color:red;">
            <a href="http://mingo.javaeye.com/blog/25206#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Sep 2006 11:41:37 +0800</pubDate>
        <link>http://mingo.javaeye.com/blog/25206</link>
        <guid>http://mingo.javaeye.com/blog/25206</guid>
      </item>
  </channel>
</rss>