<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>airport</title>
    <description>J2EE lover</description>
    <link>http://airport.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>Ajax中的编码和缓存问题</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/211522" style="color:red;">http://airport.javaeye.com/blog/211522</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、编码问题。默认使用UTF-8，如果一旦发现对象找不到的情况，可能js中输入了中文，同时js的编码格式可能为gb2312，可用记事本打开js，另存为utf-8格式的文档。</p>
<p>&nbsp;</p>
<p>通过XMLHttpRequest获取的数据，默认的字符编码是UTF-8，如果前端页面是GB2312或者其它编码，显示获取的数据就是乱码。通过XMLHTTPRequest，POST的数据也是UTF-8编码，如果后台是GB2312或者其他编码也会出现乱码。</p>
<p>&nbsp;</p>
<p>2、Cache问题</p>
<p>由于IE的缓存处理机制问题，每次通过XMLHttpRequest访问动态页面返回的总是首次访问的内容，解决方法有：</p>
<ol>
<li>客户端通过添加随机字符串解决。如： <br /><span class="code" style="width: 454px; height: 66px;">var url = 'http://dancewithnet.com/';<br />url +=&nbsp; '?temp=' + new Date().getTime();<br />url +=&nbsp; '?temp=' + Math.random();</span> </li>
<li>在HTTP headers禁止缓存。如： <br /><span class="code" style="width: 455px; height: 336px;">HTTP:<br />&lt;meta http-equiv="pragma" content="no-cache" /&gt;<br />&lt;meta http-equiv="Cache-Control" content="no-cache, must-revalidate" /&gt;<br />&lt;meta http-equiv="expires" content="Thu, 01 Jan 1970 00:00:01 GMT" /&gt;<br />&lt;meta http-equiv="expires" content="0" /&gt;<br />PHP：<br />header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");<br />header("Cache-Control: no-cache, must-revalidate");<br />header("Pragma: no-cache");<br />ASP：<br />Response.expires=0<br />Response.addHeader("pragma","no-cache")<br />Response.addHeader("Cache-Control","no-cache, must-revalidate")<br />JSP：<br />response.addHeader("Cache-Control", "no-cache");<br />response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");</span> </li>
<li>在XMLHttpRequest发送请求之前加上： <br /><span class="code" style="width: 452px; height: 48px;">XMLHttpRequest.setRequestHeader("If-Modified-Since","0");<br />XMLHttpRequest.send(null);</span></li>
</ol>
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/211522#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/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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 13:46:16 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/211522</link>
        <guid>http://airport.javaeye.com/blog/211522</guid>
      </item>
      <item>
        <title>使用flash进行文件上传-FancyUpload的一个应用实例</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/206449" style="color:red;">http://airport.javaeye.com/blog/206449</a>&nbsp;
          发表时间: 2008年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>对Fancyupload的实现一直心仪已久，我看网上多在寻觅Asp.net的实现，就用VS2005实现了一个。</p>
<p>因为项目中正好要应用，所以给出个demo让大家下载。发现除了在js端出现点问题以外，基本上用</p>
<p>asp.net实现非常简单，代码为fancyupload2.0的实现。我看javaeye以前有网友上传的是1.0的</p>
<p>一个action页面包含的代码和现在成熟的框架一样都很少。<br />upload.aspx.cs</p>
<pre name="code" class="c#">protected void Page_Load(object sender, EventArgs e)
        {
            HttpPostedFile postedFile = Request.Files["photoupload"];
            if (postedFile != null)
            {
                string nam = postedFile.FileName;
                postedFile.SaveAs(Server.MapPath("\\upload\\" + nam));
            }
        }</pre>
<p>&nbsp;index.htm部分</p>
<pre name="code" class="html">&lt;form action="upload.aspx" method="post" enctype="multipart/form-data" id="form-demo"&gt;
	&lt;fieldset id="demo-fallback"&gt;
		&lt;legend&gt;文件上传&lt;/legend&gt;
		&lt;p&gt;
            选择上传的照片文件.&lt;br /&gt;
            &lt;span style="font-size: 9pt"&gt;
			&lt;strong&gt;(这个Demo使用了Flash和Js进行ajax的文件上传.&lt;/strong&gt; )&lt;/span&gt;&lt;/p&gt;
		&lt;label for="demo-photoupload"&gt;
			上传文件:
			&lt;input type="file" name="photoupload" id="demo-photoupload" /&gt;
		&lt;/label&gt;
	&lt;/fieldset&gt;
 
	&lt;div id="demo-status" class="hide"&gt;
		&lt;p&gt;
			&lt;a href="#" id="demo-browse-Excel"&gt;选择Excel&lt;/a&gt; |
			&lt;a href="#" id="demo-clear"&gt;清除&lt;/a&gt; |
			&lt;a href="#" id="demo-upload"&gt;上传&lt;/a&gt;
		&lt;/p&gt;
		&lt;div&gt;
			&lt;strong class="overall-title"&gt;总进度&lt;/strong&gt;&lt;br /&gt;
			&lt;img src="./js/bar.gif" class="progress overall-progress" alt="进度条" /&gt;
		&lt;/div&gt;
		&lt;div&gt;
			&lt;strong class="current-title"&gt;文件进度&lt;/strong&gt;&lt;br /&gt;
			&lt;img src="./js/bar.gif" class="progress current-progress" alt="进度条" /&gt;
		&lt;/div&gt;
		&lt;div class="current-text"&gt;&lt;/div&gt;
	&lt;/div&gt;
 
	&lt;ul id="demo-list"&gt;&lt;/ul&gt;</pre>
<p>&nbsp;默认就上传到了upload目录。</p>
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/206449#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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Jun 2008 20:14:47 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/206449</link>
        <guid>http://airport.javaeye.com/blog/206449</guid>
      </item>
      <item>
        <title>关于Web性能测试和CC攻击的几点思路</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/200676" style="color:red;">http://airport.javaeye.com/blog/200676</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>1、Web性能测试</strong> </p>
<p>Web性能测试涉及的范围太广，但一般web开发者在程序上线以后很多都曾遇到过性能的问题。普遍表现为页面速度开始急剧变慢，正常访问时间变的很长，或则干脆给你抛出异常错误页面。这里会涉及到很多可能发生的情况，举例几个最主要发生的情况：</p>
<ul>
<li>数据库连接超过最大限制，目前一般表现为程序的连接池满，拒绝了与数据库的连接。</li>
<li>数据库死锁</li>
<li>Web Server 超过最大连接数（一般在虚拟主机上才会限制）</li>
<li>内存泄漏</li>
<li>Http连接数太多，即访问量超过了机器和软件设计正常所能提供的服务</li>
</ul>
<p><strong>2、CC攻击</strong></p>
<p>CC主要是用来攻击页面的.大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库就越大,被访问的频率也越高,占用的系统资源也就相当可观。</p>
<p>一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读读帖子的权限,如果有,就读出帖子里面的内容,显示出来&mdash;&mdash;这里至少访问了2次数据库,如果数据库的体积有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大. </p>
<p><br />CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。</p>
<p>&nbsp;</p>
<p>假设服务器A对Search.asp的处理时间需要0.01S(多线程只是时间分割,对结论没有影响),也就是说他一秒可以保证100个用户的Search请求,服务器允许的最大连接时间为60s,那么我们使用CC模拟120个用户并发连接,那么经过1分钟,服务器的被请求了7200次,处理了6000次,于是剩下了1200个并发连接没有被处理.有的朋友会说:丢连接!丢连接!问题是服务器是按先来后到的顺序丢的,这1200个是在最后10秒的时候发起的,想丢?!还早,经过计算,服务器满负开始丢连接的时候,应该是有7200个并发连接存在队列,然后服务器开始120个/秒的丢连接,我们发动的连接也是120个/秒,服务器永远有处理不完的连接,服务器的CPU&nbsp;100%并长时间保持,然后丢连接的60秒服务器也判断处理不过来了,新的连接也处理不了,这样服务器达到了超级繁忙状态.</p>
<p>我们假设服务器处理Search只用了0.01S,也就是10毫秒(这个速度你可以去各个有开放时间显示的论坛看看),我们使用的线程也只有120,很多服务器的丢连接时间远比60S长,我们的使用线程远比120多,可以想象可怕了吧,而且客户机只要发送了断开,连接的保持是代理做的,而且当服务器收到SQL请求,肯定会进入队列,不论连接是否已经断开,而且服务器是并发的,不是顺序执行,这样使得更多的请求进入内存请求,对服务器负担更大. </p>
<p>&nbsp;</p>
<p><strong>防范方法</strong> <br /><br />说了攻击原理,大家肯定会问,那么怎么防御?使用硬件防火墙我不知道如何防范,除非你完全屏蔽页面访问,我的方法是通过页面的编写实现防御. <br /><br />1.&nbsp;使用Cookie认证.这时候朋友说CC里面也允许Cookie,但是这里的Cookie是所有连接都使用的,所以启用IP+Cookie认证就可以了. <br /><br />2.&nbsp;利用Session.这个判断比Cookie更加方便,不光可以IP认证,还可以防刷新模式,在页面里判断刷新,是刷新就不让它访问,没有刷新符号给它刷新符号.给些示范代码吧,Session: <br /><br /><strong>程序代码: 
<table cellspacing="0" border="1" align="center" width="405" cellpadding="2" style="width: 405px; height: 122px;">
<tbody>
<tr>
<td class="code" bgcolor="#e6e6e6">
<pre>〈% 

if session(“refresh”)〈〉 1 then  

Session(“refresh”)=session(“refresh”)+1 

Response.redirect “index.asp” 

End if 

%〉</pre>
</td>
</tr>
</tbody>
</table>
</strong><br /><br />这样用户第一次访问会使得Refresh=1,第二次访问,正常,第三次,不让他访问了,认为是刷新,可以加上一个时间参数,让多少时间允许访问,这样就限制了耗时间的页面的访问,对正常客户几乎没有什么影响. <br /><br />3.&nbsp;通过代理发送的HTTP_X_FORWARDED_FOR变量来判断使用代理攻击机器的真实IP,这招完全可以找到发动攻击的人,当然,不是所有的代理服务器都发送,但是有很多代理都发送这个参数.详细代码: <br /><br />程序代码: 
<table cellspacing="0" border="1" align="center" width="405" cellpadding="2" style="width: 405px; height: 122px;">
<tbody>
<tr>
<td class="code" bgcolor="#e6e6e6">〈% <br /><br />Dim&nbsp;fsoObject <br /><br />Dim&nbsp;tsObject <br /><br />dim&nbsp;file <br /><br />if&nbsp;Request.ServerVariables("HTTP_X_FORWARDED_FOR")=""&nbsp;then&nbsp; <br /><br />response.write&nbsp;"无代理访问" <br /><br />response.end <br /><br />end&nbsp;if <br /><br />Set&nbsp;fsoObject&nbsp;=&nbsp;Server.CreateObject("Scripting.FileSystemObject") <br /><br />file&nbsp;=&nbsp;server.mappath("CCLog.txt") <br /><br />if&nbsp;not&nbsp;fsoObject.fileexists(file)&nbsp;then <br /><br />fsoObject.createtextfile&nbsp;file,true,false <br /><br />end&nbsp;if <br /><br />set&nbsp;tsObject&nbsp;=&nbsp;fsoObject.OpenTextFile(file,8) <br /><br />tsObject.Writeline&nbsp;Request.ServerVariables("HTTP_X_FORWARDED_FOR")&amp;"["&amp;Request.ServerVariables("REMOTE_ADDR")&amp;"]"&amp;now() <br /><br />Set&nbsp;fsoObject&nbsp;=&nbsp;Nothing <br /><br />Set&nbsp;tsObject&nbsp;=&nbsp;Nothing <br /><br />response.write&nbsp;"有代理访问" <br /><br />%〉 </td>
</tr>
</tbody>
</table>
<br /><br />这样会生成CCLog.txt,它的记录格式是:真实IP&nbsp;[代理的IP]&nbsp;时间,看看哪个真实IP出现的次数多,就知道是谁在攻击了.将这个代码做成Conn.asp文件,替代那些连接数据库的文件,这样所有的数据库请求就连接到这个文件上,然后马上就能发现攻击的人. <br /><br />4.&nbsp;还有一个方法就是把需要对数据查询的语句做在Redirect后面,让对方必须先访问一个判断页面,然后Redirect过去. <br /><br />5.&nbsp;在存在多站的服务器上,严格限制每一个站允许的IP连接数和CPU使用时间,这是一个很有效的方法. <br /><br />CC的防御要从代码做起,其实一个好的页面代码都应该注意这些东西,还有SQL注入,不光是一个入侵工具,更是一个DDOS缺口,大家都应该在代码中注意.举个例子吧,某服务器,开动了5000线的CC攻击,没有一点反应,因为它所有的访问数据库请求都必须一个随机参数在Session里面,全是静态页面,没有效果.突然发现它有一个请求会和外面的服务器联系获得,需要较长的时间,而且没有什么认证,开800线攻击,服务器马上满负荷了. <br /><br />代码层的防御需要从点点滴滴做起,一个脚本代码的错误,可能带来的是整个站的影响,甚至是整个服务器的影响,慎之!<br /></p>
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/200676#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 20:49:52 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/200676</link>
        <guid>http://airport.javaeye.com/blog/200676</guid>
      </item>
      <item>
        <title>使用rails时碰到的几个常见的问题--补充中</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/34399" style="color:red;">http://airport.javaeye.com/blog/34399</a>&nbsp;
          发表时间: 2006年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1、render使用中的问题</strong><br />当页面错误要跳转到固定的页面的时候，用了Render<br />这样的代码，总说页面找不到，没找到原因，后台看了路径显示好像也没有问题<br /><pre name="code" class="java">render :file => "#{RAILS_ROOT}/public/404.html",   
             :status => '404 Not Found'   
</pre><br />换成下面的代码就可以了<br /><pre name="code" class="java">render :text => File.read("#{RAILS_ROOT}/public/400.html"),
      :layout => 'application',
      :status => "500 Error"</pre><br /><br /><strong>2、中文字符截取的问题</strong><br />原理就不多说了，正常用中文或则日文的时候长度是>1的，解决办法<br />在config/environment.rb里加上一行： <pre name="code" class="java">
$KCODE = 'utf8'</pre><br />或则在启动的时候加上ruby.exe -KU script/server<br /><br />然后就可以用split方法把string转成char来进行截取<br />如<pre name="code" class="java">
&lt;%= @title.split(//)[0,10] %> #截取title字段的前10个字符</pre>
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/34399#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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 15 Nov 2006 17:14:00 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/34399</link>
        <guid>http://airport.javaeye.com/blog/34399</guid>
      </item>
      <item>
        <title>如何在你的应用中管理错误的页面</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/34309" style="color:red;">http://airport.javaeye.com/blog/34309</a>&nbsp;
          发表时间: 2006年11月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Rails在不同的环境下，对错误的处理是不一样的，在开发和测试环境中提供开发级别的错误，在生产环境中提供Application Error的错误。<br />1、设置全局的异常处理程序，在application.rb中增加：<br /><pre name="code" class="java">  def rescue_action_in_public(exception)
    logger.error("rescue_action_in_public executed")
    case exception
    when ActiveRecord::RecordNotFound, ::ActionController::RoutingError,  
      ::ActionController::UnknownAction
      logger.error("404 displayed")
      render(:file	=> "#{RAILS_ROOT}/public/404.html",
      :status	=> "404 Not Found")
    else
      logger.error("500 displayed")
      render(:file	=> "#{RAILS_ROOT}/public/500.html",
      :status	=> "500 Error")
#      SystemNotifier.deliver_exception_notification(self, request,  
#                                                    exception)
    end
  end
</pre><br />2、Controller级别的异常处理，可以在你自己的Controller里面增加：<br /><pre name="code" class="java">def rescue_action_in_public(exception)
    render :text => "&lt;html>&lt;body>
&lt;p>There was a controller specfic error processing your request.&lt;/p>
&lt;!--  #{exception}  -->&lt;/body>&lt;/html>" 
  end
</pre><br />3、注意在不同环境中的配置，生产环境中，默认的配置应该就可以显示效果，但在开发模式下，需要确认/config/environments/development.rb中的<br /><pre name="code" class="java">config.action_controller.consider_all_requests_local = false</pre><br />如果在本机访问必须增加：<br /><pre name="code" class="java">  def local_request?
    false
  end
</pre> 才能显示错误页面
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/34309#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/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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Nov 2006 23:21:29 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/34309</link>
        <guid>http://airport.javaeye.com/blog/34309</guid>
      </item>
      <item>
        <title>一个production模式下的Ror环境搭建</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/34121" style="color:red;">http://airport.javaeye.com/blog/34121</a>&nbsp;
          发表时间: 2006年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          比较了一些ROR的生产环境，经过测试，还是选用了mongrel+apache的方式。<br /><br />1.download安装包:<br />httpd-2.2.3.tar.gz ,apache服务器<br />ruby-1.8.5.tar.gz<br />rubygems-0.9.0.tgz<br />mongrel-0.3.13.4.gem<br /><br />2.安装ruby<br />tar zxvf ruby-1.8.5.tar.gz<br />./configure<br />make<br />make install<br /><br />3.安装rubygems<br />tar zxfv rubygems-0.9.0.tgz<br />cd rubygems-0.9.0<br />ruby setup.rb<br /># gem update - system<br /><br />4.安装rails<br />gem install rails --include-dependencies<br /><br />5.安装mongrel<br />#gem install daemons<br />#gem install gem_plugin 如果提示需要则安装<br />gem install mongrel<br /><br />6.安装apache<br />tar zxvf httpd-2.2.3.tar.gz <br />./configure --prefix=/usr/local/apache<br />make<br />make install<br /><br />7.启动mongrel<br />cd myrailsapp<br />#启动<br />mongrel_rails start -d -p 8000 -e production -P ./log/mongrel-1.pid<br />#停止<br />mongrel_rails stop -P ./log/mongrel-1.pid<br /><br />8.编辑httpd.conf<br /><pre name="code" class="java">
 &lt;VirtualHost *:80>
    ServerName myapp.com
    ServerAlias www.myapp.com

    ProxyPass / http://www.myapp.com:8000/
    ProxyPassReverse / http://www.myapp.com:8000
    ProxyPreserveHost on

    ProxyPass /images ! 
    ProxyPass /stylesheets ! 
    Alias /images /path/to/public/images
    Alias /stylesheets /path/to/public/stylesheets 
    #continue with aliases for static content

  &lt;/VirtualHost>
</pre><br /><br />改天把测试数据整理出来，包括cluster应用！
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/34121#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/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Nov 2006 22:57:14 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/34121</link>
        <guid>http://airport.javaeye.com/blog/34121</guid>
      </item>
      <item>
        <title>整合File-Column和Rmagick功能实现图片上传</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/33216" style="color:red;">http://airport.javaeye.com/blog/33216</a>&nbsp;
          发表时间: 2006年11月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在网站制作过程中，图片上传以及图片的大小调整是经常会用到的一个功能！<br /><br />Rails结合几个plug-in可以说很智能的做到了这一点<br /><br />做了一个简单的例子，系统在Windows平台上运行<br /><br />1.上网下载file-column-0.3.1.tar.gz 和rmagick-win32-1.13.0_IM-6.2.9-3.zip （我当前的最新版本，到下述站点下载 http://rubyforge.org/projects/rmagick/ Linux下版本是RMagick-1.14.1.tar.gz）<br /><br />2.安装rmagick，执行zip包里面的exe文件，同时把安装路径放到path环境变量里面去，否则可能会报CORE_RL_magick_.dll找不到的错误<br /><br />3.安装file-column到app的vendor目录里，直接copy过去就行<br /><br /><div class="quote_title">引用</div><div class="quote_div">以下的文件配置基本上按照官方提供的sample来进行，算是用中文整合一下，谈不上原创</div><br />4.建立一个存放路径的model，在数据库中建立Entry数据库<br />  并生成相应的scaffold：<br />ruby script/generate scaffold Entry upload<br /><br />4.修改model，并限制只能图片上传<br /><pre name="code" class="java">class Entry &lt; ActiveRecord::Base
  validates_format_of :image,
    :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,
    :message => "你只能上传JPG或则GIF的图片文件"
  file_column :image, :magick => { 
          :versions => { "thumb" => "50x50", "medium" => "640x480>" }
        }
end</pre><br /><br />5.修改_form.rhtml<br /><pre name="code" class="java">&lt;%= error_messages_for 'entry' %>

&lt;!--[form:entry]-->
&lt;p>&lt;label for="entry_image">Image&lt;/label>&lt;br/>
&lt;%= file_column_field 'entry', 'image'  %>&lt;/p>
&lt;!--[eoform:entry]--></pre><br /><br />6.修改new.rhtml<br /><pre name="code" class="java">
&lt;h1>New entry&lt;/h1>

&lt;%= start_form_tag 'create',:multipart => true%>
  &lt;%= render :partial => 'form' %>
  &lt;%= submit_tag "Create" %>
&lt;%= end_form_tag %>

&lt;%= link_to 'Back', :action => 'list' %>
</pre><br /><br />7.修改show.rhtml<br /><pre name="code" class="java">
&lt;% for column in Entry.content_columns %>
&lt;p>
  &lt;b>&lt;%= column.human_name %>:&lt;/b> &lt;%=h @entry.send(column.name) %>
  &lt;br>
  原始大小：
  &lt;%= image_tag url_for_file_column 'entry', 'image' %>
  &lt;br>
  thumb:
  &lt;%= image_tag url_for_file_column 'entry', 'image' ,'thumb'%>
  &lt;br>
  medium:
  &lt;%= image_tag url_for_file_column 'entry', 'image' ,'medium'%>
&lt;/p>
&lt;% end %>

&lt;%= link_to 'Edit', :action => 'edit', :id => @entry %> |
&lt;%= link_to 'Back', :action => 'list' %>
</pre><br /><br /><img src="http://www.javaeye.com/topics/download/6f768e8e-d8f7-4cd9-b075-b0eaeda14cf5" />
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/33216#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/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><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>Wed, 08 Nov 2006 16:03:04 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/33216</link>
        <guid>http://airport.javaeye.com/blog/33216</guid>
      </item>
      <item>
        <title>Velocity用户手册---中文版(学习修改版)</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/23634" style="color:red;">http://airport.javaeye.com/blog/23634</a>&nbsp;
          发表时间: 2005年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Velocity的能力远不止web站点开发这个领域，例如，它可以从模板（template）产生SQL和PostScript、XML，它也可以被当作一个独立工具来产生源代码和报告，或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务（template service）。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。<br /><br />Velocity能为我们作什么？<br />The Mud Store Example <br />假设你是一家专门出售Mud的在线商店的页面设计人员，让我们暂且称它为“在线MUD商店”。你们的业务很旺，客户下了各种类型和数量的mud订单。他们都是通过输入用户名和密码后才登陆到你的网站，登陆后就允许他们查看订单并购买更多的mud。现在，一种非常流行的mud正在打折销售。另外有一些客户规律性的购买另外一种也在打折但是不是很流行的Bright Red Mud，由于购买的人并不多所以它被安置在页面的边缘。所有用户的信息都是被跟踪并存放于数据库中的，所以某天有一个问题可能会冒出来：为什么不使用velocity来使用户更好的浏览他们感兴趣的商品呢？<br />Velocity使得web页面的客户化工作非常容易。作为一个web site的设计人员，你希望每个用户登陆时都拥有自己的页面。<br />你会见了一些公司内的软件工程师，你发现他们每个人都同意客户应该拥有具有个性化的信息。那让我们把软件工程师应该作的事情发在一边，看一看你应该作些什么吧。<br />你可能在页面内嵌套如下的VTL声明：<br />[code:1]&lt;html&gt;<br />&lt;body&gt;<br />Hello $customer.Name!<br />&lt;table&gt;<br />#foreach&#40; $mud in $nudsOnSpecial &#41; <br />#if &#40; $customer.hasPurchased&#40; $mud &#41; &#41; <br />&lt;tr&gt;&lt;td&gt;$flogger.getPromo&#40; $mud &#41;&lt;/td&gt;&lt;/tr&gt;<br />#end<br />#end<br />&lt;/table&gt;[/code:1]<br />Velocity Template Language(VTL):AN introduction<br />VTL意味着提供最简单、最容易并且最整洁的方式合并页面动态内容。<br />VTL使用references来在web site内嵌套动态内容，一个变量就是一种类型的reference。变量是某种类型的refreence，它可以指向java代码中的定义，或者从当前页面内定义的VTL statement得到值。下面是一个VTL statement的例子，它可以被嵌套到HTML代码中：<br /> [code:1] #set &#40; $a = “Velocity” &#41;[/code:1]<br />和所有的VTL statement一样，这个statement以＃字符开始并且包含一个directive：set。当一个在线用户请求你的页面时，Velocity Templating Engine将查询整个页面以便发现所有＃字符，然后确定哪些是VTL statement，哪些不需要VTL作任何事情。<br />＃字符后紧跟一个directive：set时，这个set directive使用一个表达式（使用括号封闭）――一个方程式分配一个值给变量。变量被列在左边，而它的值被列在右边，最后他们之间使用＝号分割。<br />在上面的例子中，变量是$a，而它的值是Velocity。和其他的references一样以$字符开始，而值总是以双引号封闭。Velocity中仅有String可以被赋值给变量。<br />记住以下的规则：<br />使用$字符开始的references用于得到什么；使用#字符开始的directives用于作些什么。<br />Hello Velocity World!<br />一旦某个变量被分配了一个值，那么你就可以在HTML文件的任何地方引用它。在下面的例子中，一个值被分配给$foo变量，并在其后被引用。<br />&lt;html&gt;<br />&lt;body&gt;<br />#set ( $foo = “Velocity” )<br />Hello $foo World!<br />&lt;/body&gt;<br />&lt;/html&gt;<br />上面的实现结果是在页面上打印“Hello Velocity World！”<br />为了使包含VTL directives的statement更具有可读性，我们鼓励你在新行开始每个VTL statement，尽管你不是必须这么作。Set directive将在后面详细描述。<br />注释<br />单行注释：<br />  ## This is a single line comment.<br />多行注释：<br />  #*<br />   Thus begins a multi-line comment. Online visitors won’t<br />   see this text because the Velocity Templating Engine will<br />ignore it.<br />  *#<br />文档格式：<br />  #**<br />   This is a VTL comment block and<br />   may be used to store such information<br />as the document author and versioning<br />   information:<br />   @version 5<br />   @author<br />  *#<br /><br />References<br />在VTL中有三种类型的references：变量(variables)、属性(properties)、方法(methods)。作为一个使用VTL的页面设计者，你和你的工程师必须就references的名称达成共识，以便你可以在你的template中使用它们。<br />Everything coming to and from a reference被作为一个String对象处理。如果有一个对象$foo是一个Integer对象，那么Velocity将调用它的toString()方法将这个对象转型为String类型。<br />  变量 <br />  格式要求同java。<br />  属性 <br />  例子：<br />    $customer.Address<br />    $purchase.Total<br />$customer.Address有两种含义。它可以表示：查找hashtable对象customer中以Address为关键字的值；也可以表示调用customer对象的getAddress()方法。当你的页面被请求时，Velocity将确定以上两种方式选用那种，然后返回适当的值。<br />方法 <br />一个方法就是被定义在java中的一段代码，并且它有完成某些有用工作的能力，例如一个执行计算和判断条件是否成立、满足等。方法是一个由$开始并跟随VTL标识符组成的References，一般还包括一个VTL方法体。例如：<br />  $customer.getAddress()<br />  $purchase.getTotal()<br />  $page.setTitle( “My Home Page” )<br />  $person.setAttributes( [“Strange”, “Weird”, “Excited”] )<br />前两个例子$customer.getAddress()和$purchase.getTotal()看起来挺想上面的属性$customer.Address 和 $purchase.Total。如果你觉得他们之间有某种联系的话，那你是正确的。<br />VTL属性可以作为VTL方法的缩写。$customer.Address属性和使用$customer.getAddress()方法具有相同的效果。如果可能的话使用属性的方式是比较合理的。属性和方法的不同点在于你能够给一个方法指定一个参数列表。<br />正式reference标记<br />reference的正是格式如下：<br />  ${mudSlinger}        变量<br />  ${customer.Address}    属性<br />  ${purchase.getTotal()}    方法<br />非正是格式更见常用，但是有时还是使用正是格式比较适合。例如：你希望通过一个变量$vice来动态的组织一个字符串。<br />  Jack is a $vicemaniac.<br />本来变量是$vice现在却变成了$vicemaniac，这样Veloctiy就不知道您到底要什么了。所以，应该使用正是格式书写<br />  Jack is a ${vice}maniac<br />现在Velocity知道变量是$vice而不是$vicemaniac。<br />Quiet reference notation<br />例如：<br />  &lt;input type=”text” name=”email” value=”$email” /&gt;<br />当页面的form被初始加载时，变量$email还没有值，这时你肯定是希望它能够显示一个blank text来代替输出”$email”这样的字段。那么使用quiet reference notation就比较合适。<br />  &lt;input type=”text” name=”email” value=”$!email”/&gt;<br />这样文本框的初始值就不会是email而是空值了。<br />正式和quiet格式的reference notation也可一同使用，像下面这样：<br />  &lt;input type=”text” name=”email” value=”$!{email}”/&gt;<br />Getting literal <br />Velocity使用特殊字符$和#来帮助它工作，所以如果要在template里使用这些特殊字符要格外小心。本节将讨论$字符。<br />  货币字符 <br />在VTL中使用$2.5这样的货币标识是没有问题得的，VTL不会将它错认为是一个reference，因为VTL中的reference总是以一个大写或者小写的字母开始。<br />Escaping valid VTL reference <br />VTL中使用“\”作为逃逸符。<br />例如：<br />  #set( $email = “foo” )<br />  $email<br />  \$email<br />  \\$email<br />  \\\$email<br />将render为：<br />  foo<br />  $email<br />  \foo<br />  \\$email<br />如果email变量没有被定义则<br />  $email<br />  \$email<br />  \\$email<br />  \\\$email<br />将被render为：<br />  $email<br />  \$email<br />  \\$email<br />  \\\$email<br />注意：VTL中未被定义的变量将被认为是一个字符串，所以以下例子：<br />  #set( $foo = “gibbous” )<br />  $moon = $foo<br />的输出结果是：<br />$moon = gibbous<br />Case substitution<br />现在你已经对reference比较熟悉了，你可以将他们高效的应用于你的template了。Velocity利用了很多java规范以方便了设计人员的使用。例如：<br />  $foo<br />  $foo.getBar()<br />  ## is the same as<br />  $foo.Bar<br /><br />  $data.getUser(“jon”)<br />  ## is the same as<br />  $data.User(“jon”)<br /><br />  $data.getRequest().getServerName()<br />  # is the same as<br />  $data.Request.ServerName<br />  ## is the same as<br />  ${data.Request.ServerName}<br />但是，注意VTL中不会将reference解释为对象的实例变量。例如：$foo.Name将被解释为Foo对象的getName（）方法，而不是Foo对象的Name实例变量。<br />Directives<br />Reference允许设计者使用动态的内容，而directive使得你可以应用java代码来控制你的显示逻辑，从而达到你所期望的显示效果。<br />  #set <br />  #set directive被用于设置一个reference的值。例如：<br />    #set ( $primate = “monkey” )<br />    #set ( $customer.Behavior = $primate )<br />赋值左侧的（LHS）必须是一个变量或者属性reference。右侧（RHS）可以是以下类型中一种：<br />l  变量reference<br />l  String literal<br />l  属性reference<br />l  方法reference<br />l  number literal<br />l  ArrayList<br />下面是应用各种类型的RHS的例子：<br />  ＃set ( $monkey = $bill ) ##变量reference<br />  ＃set ( $monkey.Friend = “monica” ) ##String literal<br />  ＃set ( $monkey.Blame = $whitehouse.Leak )##属性reference<br />  ＃set ( $monkey.Plan = $spindoctor.weave($web) )##方法reference<br />  ＃set ( $monkey.Number = 123 )##Number literal<br />  ＃set ( $monkey.Say = [“Not”, $my, “fault”] )##ArrayList<br />注意：最后一个例子的取值方法为：$monkey.Say.get(0)<br />RHS也可以是一个简单的算术表达式：<br />  #set ( $value = $foo + 1 )<br />  #set ( $value = $bar -1 )<br />#set ( $value = $foo * $bar )<br />#set ( $value = $foo / $bar )<br />如果你的RHS是一个null，VTL的处理将比较特殊：它将指向一个已经存在的reference，这对初学者来讲可能是比较费解的。例如：<br />  #set ( $resut = $query.criteria(“name”) )<br />  The result of the first query is $result<br /><br />  #set ( $resut = $query.criteria(“address”) )<br />  The result of the second query is $result<br />如果$query.criteria(“name”)返回一个“bill”，而$query.criteria(“address”)返回的是null，则显示的结果如下：<br />  The result of the first query is bill<br />  The result of the first query is bill<br />看看下面的例子：<br />  #set( $criteria = ["name", "address"] )<br />#foreach( $criterion in $criteria )<br />#set( $result = $query.criteria($criterion) )<br />  #if( $result )<br />  Query was successful<br />     #end<br />#end<br />在上面的例子中，程序将不能智能的根据$result的值决定查询是否成功。在$result被#set后（added to the context），它不能被设置回null（removed from the context）。打印的结果将显示两次查询结果都成功了，但是实际上有一个查询是失败的。<br />为了解决以上问题我们可以通过预先定义的方式：<br />  #set( $criteria = [“name”, “address”] )<br />  #foreach( $criterion in $criteria )<br />    #set( $result = false )<br />    #set( $result = $query.criteria( $criterion ) )<br />    #if( $result )<br />      Query was successful<br />    #end<br />  #end<br />  String Literals <br />  当你使用#set directive，String literal封闭在一对双引号内。<br />    #set ( $directoryRoot = “www” )<br />    #set ( $templateName = “index.vm” )<br />    #set ( $template = “$directoryRoot/$tempateName” )<br />    $template<br />  上面这段代码的输出结果为：www/index.vm<br />  但是，当string literal被封装在单引号内时，它将不被解析：<br />    #set ( $foo = “bar” )<br />    $foo<br />    #set ( $blargh = ‘$foo’ )<br />  结果：<br />    bar<br />    $foo<br />  上面这个特性可以通过修改velocity.properties文件的stringliterals.interpolate = false的值来改变上面的特性是否有效。<br />条件语句<br />  if/elseif/else <br />当一个web页面被生成时使用Velocity的#if directrive，如果条件成立的话可以在页面内嵌入文字。例如：<br />  #if ( $foo )<br />    &lt;strong&gt;Velocity!&lt;/strong&gt;<br />  #end<br />上例中的条件语句将在以下两种条件下成立：<br />l  $foo是一个boolean型的变量，且它的值为true<br />l  $foo变量的值不为null<br />这里需要注意一点：Velocity context仅仅能够包含对象，所以当我们说“boolean”时实际上代表的时一个Boolean对象。即便某个方法返回的是一个boolean值，Velocity也会利用内省机制将它转换为一个Boolean的相同值。<br />如果条件成立，那么#if和#end之间的内容将被显示。<br />#elseif和#else元素可以同#if一同使用。例如：<br />  #if( $foo &lt; 10 )<br />    &lt;strong&gt; Go North &lt;/strong&gt;<br />  #elseif( $foo == 10 )<br />    &lt;strong&gt; Go East &lt;/strong&gt;<br />  #elseif( $foo == 6 )<br />    &lt;strong&gt; Go South &lt;/strong&gt;<br />  #else<br />    &lt;strong&gt; Go West &lt;/strong&gt;<br />  #end<br />注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false，但是与java不同它使用“＝＝”来比较两个值，而且velocity要求等号两边的值类型相同。<br />关系、逻辑运算符 <br />Velocity中使用等号操作符判断两个变量的关系。例如：<br />#set ( $foo = “deoxyribonucleic acid” )<br />#set ( $bar = “ribonucleic acid” )<br />#if ( $foo == $foo )<br />  In this case it’s clear they aren’t equivalent.So…<br />#else<br />  They are not equivalent and this will be the output.<br />#end<br /><br />Velocity有AND、OR和NOT逻辑运算符。下面是一些例子：<br />  ## logical AND<br />  #if( $foo && $bar )<br />    &lt;strong&gt; This AND that &lt;/strong&gt;<br />  #end<br /><br />  ## logical OR<br />  #if ( $foo || $bar )<br />    &lt;strong&gt;This OR That &lt;/strong&gt;<br />  #end<br /><br />  ##logical NOT<br />  #if ( !$foo )<br />    &lt;strong&gt; NOT that &lt;/strong&gt;<br />  #end<br />循环 <br />  Foreach循环 <br />  例子：<br />    &lt;ul&gt;<br />      #foreach ( $product in $allProducts )<br />        &lt;li&gt; $product &lt;/li&gt;<br />      #end<br />    &lt;/ul&gt;<br />  每次循环$allProducts中的一个值都会赋给$product变量。<br />$allProducts可以是一个Vector、Hashtable或者Array。分配给$product的值是一个java对象，并且可以通过变量被引用。例如：如果$product是一个java的Product类，并且这个产品的名字可以通过调用他的getName（）方法得到。<br />现在我们假设$allProducts是一个Hashtable，如果你希望得到它的key应该像下面这样：<br />&lt;ul&gt;<br />#foreach ( $key in $allProducts.keySet() )<br />&lt;li&gt;Key: $key -&gt; Value: $allProducts.get($key) &lt;/li&gt;<br />#end<br />&lt;/ul&gt;<br /><br />Velocity还特别提供了得到循环次数的方法，以便你可以像下面这样作：<br />&lt;table&gt;<br />#foreach ( $customer in $customerList )<br />&lt;tr&gt;&lt;td&gt;$velocityCount&lt;/td&gt;&lt;td&gt;$customer.Name&lt;/td&gt;&lt;/tr&gt;<br />#end<br />&lt;/table&gt;<br />$velocityCount变量的名字是Velocity默认的名字，你也可以通过修改velocity.properties文件来改变它。默认情况下，计数从“1”开始，但是你可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置：<br />  # Default name of loop counter<br />  # variable reference<br />  directive.foreach.counter.name = velocityCount<br /><br />  # Default starting value of the loop<br />  # counter variable reference<br />  directive.foreach.counter.initial.value = 1<br /><br />include<br />#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因，被引入的本地文件只能在TEMPLATE_ROOT目录下。<br />  #inclued ( “one.txt” )<br />如果您需要引入多个文件，可以用逗号分隔就行：<br />  #include ( “one.gif”, “two.txt”, “three.htm” )<br />在括号内可以是文件名，但是更多的时候是使用变量的：<br />  #inclue ( “greetings.txt”, $seasonalstock )<br /><br />parse<br />#parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTL并render模板。<br />  #parse( “me.vm” )<br />就像#include，#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是，#parse只能指定单个对象。<br />你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10。#parse是可以递归调用的，例如：如果dofoo.vm包含如下行：<br />  Count down.<br />  #set ( $count = 8 )<br />  #parse ( “parsefoo.vm” )<br />  All done with dofoo.vm!<br />那么在parsefoo.vm模板中，你可以包含如下VTL：<br />  $count<br />  #set ( $count = $count – 1 )<br />  #if ( $count &gt; 0 )<br />    #parse( “parsefoo.vm” )<br />  #else<br />    All done with parsefoo.vm!<br />  #end<br />的显示结果为：<br />  Count down.<br />  8<br />  7<br />  6<br />  5<br />  4<br />  3<br />  2<br />  1<br />  0<br />  All done with parsefoo.vm!<br />All done with dofoo.vm!<br /><br />Stop<br />#stop script element允许模板设计者停止执行模板引擎并返回。把它应用于debug是很有帮助的。<br />  #stop<br /><br />Velocimacros<br />#macro script element允许模板设计者定义一段可重用的VTL template。例如：<br />  #macro ( d )<br />  &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;<br />  #end<br />在上面的例子中Velocimacro被定义为d，然后你就可以在任何VTL directive中以如下方式调用它：<br />  #d()<br />当你的template被调用时，Velocity将用&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;替换为#d()。<br />每个Velocimacro可以拥有任意数量的参数――甚至0个参数，虽然定义时可以随意设置参数数量，但是调用这个Velocimacro时必须指定正确的参数。下面是一个拥有两个参数的Velocimacro，一个参数是color另一个参数是array：<br />  #macro ( tablerows $color $somelist )<br />  #foreach ( $something in $somelist )<br />    &lt;tr&gt;&lt;td bgcolor=$color&gt;$something&lt;/td&lt;/tr&gt;<br />  #end<br />  #end<br />调用#tablerows Velocimacro：<br />  #set ( $greatlakes = [ “Superior”, “Michigan”, “Huron”, “Erie”, “Ontario” ] )<br />  #set ( $color = “blue” )<br />  &lt;table&gt;<br />    #tablerows( $color $greatlakes )<br />  &lt;/table&gt;<br />经过以上的调用将产生如下的显示结果：<br />  &lt;table&gt;<br />    &lt;tr&gt;&lt;td bgcolor=” blue”&gt; Superior &lt;/td&gt;&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=” blue”&gt; Michigan &lt;/td&gt;&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=” blue”&gt; Huron &lt;/td&gt;&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=” blue”&gt; Erie &lt;/td&gt;&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=” blue”&gt; Ontario &lt;/td&gt;&lt;/tr&gt;<br />  &lt;/table&gt;<br />Velocimacros可以在Velocity模板内实现行内定义（inline），也就意味着同一个web site内的其他Velocity模板不可以获得Velocimacros的定义。定义一个可以被所有模板共享的Velocimacro显然是有很多好处的：它减少了在一大堆模板中重复定义的数量、节省了工作时间、减少了出错的几率、保证了单点修改。<br />上面定义的#tablerows( $color $list )Velocimacro被定义在一个Velocimacros模板库(在velocity.properties中定义)里，所以这个macro可以在任何规范的模板中被调用。它可以被多次应用并且可以应用于不同的目的。例如下面的调用：<br />  #set ( $parts = [ “volva”, “stipe”, “annulus”, “gills”, “pileus” ] )<br />  #set ( $cellbgcol = “#CC00FF” )<br />  &lt;table&gt;<br />    #tablerows( $cellbgcol $parts )<br />  &lt;/table&gt;<br />上面VTL将产生如下的输出：<br />  &lt;table&gt;<br />    &lt;tr&gt;&lt;td bgcolor=”#CC00FF”&gt; volva &lt;/td&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=”#CC00FF”&gt; stipe &lt;/td&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=”#CC00FF”&gt; annulus &lt;/td&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=”#CC00FF”&gt; gills &lt;/td&lt;/tr&gt;<br />    &lt;tr&gt;&lt;td bgcolor=”#CC00FF”&gt; pileus &lt;/td&lt;/tr&gt;<br />  &lt;/table&gt;<br />  Velocimacro arguments <br />  Velocimacro可以使用以下任何元素作为参数：<br />l  Reference：任何以$开头的reference<br />l  String literal：<br />l  Number literal：<br />l  IntegerRange：[1….3]或者[$foo….$bar]<br />l  对象数组：[“a”,”b”,”c”]<br />l  boolean值：true、false<br />当将一个reference作为参数传递给Velocimacro时，请注意reference作为参数时是以名字的形式传递的。这就意味着参数的值在每次Velocimacro内执行时才会被产生。这个特性使得你可以将一个方法调用作为参数传递给Velocimacro，而每次Velocimacro执行时都是通过这个方法调用产生不同的值来执行的。例如：<br />  #macro ( callme $a )<br />    $a $a $a<br />  #end<br />  #callme( $foo.bar() )<br />执行的结果是：reference $foo的bar（）方法被执行了三次。<br />如果你不需要这样的特性可以通过以下方法：<br />  #set ( $myval = $foo.bar() )<br />  #callme ( $myval )<br /><br />Velocimacro properties <br />Velocity.properties文件中的某几行能够使Velocimacros的实现更加灵活。注意更多的内容可以看Developer Guide。<br />Velocity.properties文件中的velocimacro.libraary：一个以逗号分隔的模板库列表。默认情况下，velocity查找唯一的一个库：VM_global_library.vm。你可以通过配置这个属性来指定自己的模板库。<br />Velocity.properties文件中的velocimacro.permissions.allow.inline属性：有两个可选的值true或者false，通过它可以确定Velocimacros是否可以被定义在regular template内。默认值是ture――允许设计者在他们自己的模板中定义Velocimacros。<br />Velocity.properties文件中的<br />velocimacro.permissions.allow.inline.replace.global属性有两个可选值true和false，这个属性允许使用者确定inline的Velocimacro定义是否可以替代全局Velocimacro定义（比如在velocimacro.library属性中指定的文件内定义的Velocimacro）。默认情况下，此值为false。这样就阻止本地Velocimacro定义覆盖全局定义。<br />Velocity.properties文件中的<br />velocimacro.permissions.allow.inline.local.scale属性也是有true和false两个可选值，默认是false。它的作用是用于确定你inline定义的Velocimacros是否仅仅在被定义的template内可见。换句话说，如果这个属性设置为true，一个inline定义的Velocimacros只能在定义它的template内使用。你可以使用此设置实现一个奇妙的VM敲门：a template can define a private implementation of the second VM that will be called by the first VM when invoked by that template. All other templates are unaffected。<br />Velocity.properties文件中的velocimacro.context.localscope属性有true和false两个可选值，默认值为false。当设置为true时，任何在Velocimacro内通过#set()对context的修改被认为是针对此velocimacro的本地设置，而不会永久的影响内容。<br />Velocity.properties文件中的velocimacro.library.autoreload属性控制Velocimacro库的自动加载。默认是false。当设置为ture时，对于一个Velocimacro的调用将自动检查原始库是否发生了变化，如果变化将重新加载它。这个属性使得你可以不用重新启动servlet容器而达到重新加载的效果，就像你使用regular模板一样。这个属性可以使用的前提就是resource loader缓存是off状态（file.resource.loader.cache = false）。注意这个属性实际上是针对开发而非产品的。<br />Velocimacro Trivia <br />Velocimacro必须被定义在他们被使用之前。也就是说，你的#macro()声明应该出现在使用Velocimacros之前。<br />特别要注意的是，如果你试图#parse()一个包含#macro()的模板。因为#parse()发生在运行期，但是解析器在parsetiem决定一个看似VM元素的元素是否是一个VM元素，这样#parse()-ing一组VM声明将不按照预期的样子工作。为了得到预期的结果，只需要你简单的使用velocimacro.library使得Velocity在启动时加载你的VMs。<br />Escaping VTL directives<br />VTL directives can be escaped with “\”号，使用方式跟VTL的reference使用逃逸符的格式差不多。<br />  ## #include( “a.txt” ) renders as &lt;ontents of a.txt&gt;(注释行)<br />  #include( “a.txt” )<br /><br />  ## \#include( “a.txt” ) renders as \#include( “a.txt” )<br />  \#include( “a.txt” )<br /><br />  ## \\#include ( “a.txt” ) renders as \&lt;contents of a.txt&gt;<br />  \\#include( “a.txt” )<br />在对在一个directive内包含多个script元素的VTL directives使用逃逸符时要特别小心（比如在一个if-else-end statement内）。下面是VTL的if-statement的典型应用：<br />  #if ( $jazz )<br />    Vyacheslav Ganelin<br />  #end<br />如果$jazz是ture，输出将是：<br />  Vyacheslav Ganelin<br />如果$jazz是false，将没有输出。使用逃逸符将改变输出。考虑一下下面的情况：<br />  \#if ( $jazz )<br />    Vyacheslav Ganelin<br />  \#end<br />现在无论$jazz是true还是false，输出结果都是：<br />  #if ( $jazz )<br />    Vyacheslav Ganelin<br />  #end<br />事实上，由于你使用了逃逸符，$jazz根本就没有被解析为boolean型值。在逃逸符前使用逃逸符是合法的，例如：<br />  \\#if ( $jazz )<br />    Vyacheslav Ganelin<br />  \\#end<br />以上程序的显示结果为：<br />  \ Vyacheslav Ganelin<br />  \<br />但是如果$jazz为false，那么将没有输出。（书上说会没有输出，但是我觉得应该还有有“\”字符被输出。）<br />VTL：Formatting issues<br />尽管在此用户手册中VTL通常都开始一个新行，如下所示：<br />  #set ( $imperial = [ “Munetaka”, “Koreyasu”, “Hisakira”, “Morikune” ] )<br />  #foreach ( $shogun in $imperial )<br />    $shogun<br />  #end<br />但是像下面这种写法也是可以的：<br />  Send me #set($foo = [“$10 and”,”a cake”])#foreach($a in $foo)$a #end please.<br />上面的代码可以被改写为：<br />  Send me<br />  #set ( $foo = [“$10 and “,”a cake”] )<br />  #foreach ( $a in $foo )<br />    $a<br />  #end<br />  please.<br />或者<br />  Send me<br />  #set($foo = [“$10 and “,”a cake”])<br />        #foreach （$a in $foo ）$a<br />      #end please.<br />这两种的输出结构将一样。<br />其他特性和杂项<br />  math   在模板中可以使用Velocity内建的算术函数，如：加、减、乘、除<br />    #set ( $foo = $bar + 3 )<br />    #set ( $foo = $bar - 4 )<br />    #set ( $foo = $bar * 6 )<br />    #set ( $foo = $bar / 2 )<br />  当执行除法时将返回一个Integer类型的结果。而余数你可以使用%来得到：<br />    #set ( $foo = $bar % 5 )<br />在Velocity内使用数学计算公式时，只能使用像-n,-2,-1,0,1,2,n这样的整数，而不能使用其它类型数据。当一个非整型的对象被使用时它将被logged并且将以null作为输出结果。<br />Range Operator<br />Range operator可以被用于与#set和#foreach statement联合使用。对于处理一个整型数组它是很有用的，Range operator具有以下构造形式：<br />  [n..m]<br />m和n都必须是整型，而m是否大于n则无关紧要。例子：<br />  First example:<br />  #foreach ( $foo in [1..5] )<br />    $foo<br />  #end<br /><br />  Second example:<br />  #foreach ( $bar in [2..-2] )<br />    $bar<br />  #end<br /><br />  Third example:<br />  #set ( $arr = [0..1] )<br />  #foreach ( $i in $arr )<br />    $i<br />  #end<br /><br />  Fourth example:<br />  [1..3]<br />上面四个例子的输出结果为：<br />  First example：<br />  1 2 3 4 5<br /><br />  Second example：<br />  2 1 0 -1 -2<br /><br />  Third example：<br />  0 1<br /><br />  Fourth example：<br />  [1..3]<br />注意：range operator只在#set和#foreach中有效。<br />Advanced Issue：Escaping and！<br />当一个reference被“！”分隔时，并且在它之前有逃逸符时，reference将以特殊的方式处理。注意这种方式与标准的逃逸方式时不同的。对照如下： <br />#set ( $foo = “bar” )<br />特殊形式  标准格式<br />Render前  Render后  Render前  Render后<br />$\!foo  $!foo  \$foo  \$foo<br />$\!{foo}  $!{foo}  \$!foo  \$!foo<br />$\\!foo  $\!foo  \$!{foo}  \$!{foo}<br />$\\\!foo  $\\!foo  \\$!{foo}  \bar<br />Velocimacro杂记<br />  Can I user a directive or another VM as an argument to a VM? <br />  例如：#center ( #bold( “hello” ) )<br />  不可以。一个directive的参数使用另外一个directive是不合法的。<br />  但是，还是有些事情你可以作的。最简单的方式就是使用双引号：<br />    #set ( $stuff = “#bold( ‘hello’ )” )<br />    #center ( $stuff ) <br />  上面的格式也可以缩写为一行：<br />    #center ( “#bold( ‘hello’ ) )<br />请注意在下面的例子中参数被evaluated在Velocimacro内部，而不是在calling level。例子：<br />  #macro ( inner $foo )<br />    inner : $foo<br />  #end<br /><br />  #macro ( outer $foo )<br />    #set ( $bar = “outerlala” )<br />    outer : $foo<br />  #end<br />  <br />  #set ( $bar = ‘calltimelala’ )<br />  #outer( “#inner($bar)” )<br />输出结果为：<br />  outer : inner : outerlala<br />记住Veloctiy的特性：参数的传递是By Name的。例如：<br />  #macro ( foo $color )<br />    &lt;tr bgcolor = $color &gt;&lt;td&gt;Hi&lt;/td&gt;&lt;/tr&gt;<br />    &lt;tr bgcolor = $color &gt;&lt;td&gt;There&lt;/td&gt;&lt;/tr&gt;<br />  #end<br /><br />  #foo ( $bar.rowColor() )<br />以上代码将导致rowColor()方法两次调用，而不是一次。为了避免这种现象的出现，我们可以按照下面的方式执行：<br />  #set ( $color = $bar.rowColor() )<br />  #foo ( $color )<br />can I register velocimacros via #parse()? <br />目前，Velocimacros必须在第一次被模板调用前被定义。这就意味着你的#macro()声明应该出现在使用Velocimacros之前。<br />如果你试图#parse()一个包含#macro() directive的模板，这一点是需要牢记的。因为#parse()发生在运行期，但是解析器在parsetiem决定一个看似VM元素的元素是否是一个VM元素，这样#parse()-ing一组VM声明将不按照预期的样子工作。为了得到预期的结果，只需要你简单的使用velocimacro.library使得Velocity在启动时加载你的VMs。<br />What is velocimacro autoreloading？ <br />velocimacro.library.autoreload是专门为开发而非产品使用的一个属性。此属性的默认值是false。<br />String concatenation<br />开发人员最常问的问题是我如何作字符拼接？在java中是使用“＋”号来完成的。<br />在VTL里要想实现同样的功能你只需要将需要联合的reference放到一起就行了。例如：<br />#set ( $size = “Big” )<br />#set ( $name = “Ben” )<br />The clock is $size$name.<br />输出结果将是：The clock is BigBen.。更有趣的情况是：<br />  #set ( $size = “Big” )<br />  #set ( $name = “Ben” )<br />  #set ( $clokc = “$size$name” )<br />  The clock is $clock.<br />上例也会得到同样的结果。最后一个例子，当你希望混合固定字段到你的reference时，你需要使用标准格式：<br />  #set ( $size = “Big” )<br />  #set ( $name = “Ben” )<br />  #set ( $clock = “${size}Tall$name” )<br />  The clock is $clock.<br />输出结果是：The clock is BigTallBen.。使用这种格式主要是为了使得$size不被解释为$sizeTall。<br /><br />几个写法汇总：<br />[code:1]<br />--关于链接的写法--<br />&lt;a href=&quot;abc.jsp?num=$var&quot;&gt;url&lt;/a&gt;[/code:1]
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/23634#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/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>Fri, 16 Dec 2005 13:15:14 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/23634</link>
        <guid>http://airport.javaeye.com/blog/23634</guid>
      </item>
      <item>
        <title>webwork2 + spring 结合</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/23602" style="color:red;">http://airport.javaeye.com/blog/23602</a>&nbsp;
          发表时间: 2005年12月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          webwork2.1x系列，和spring的结合主要有三种方法，按照文章的介绍，下载<a href="http://xwork-optional.dev.java.net/" target="_blank">http://xwork-optional.dev.java.net/</a> 插件。<br /><br />webwork2.2，目前还没有正式版本，官方推荐了一种方法<br />具体见：<a href="http://wiki.opensymphony.com/display/WW/Spring" target="_blank">http://wiki.opensymphony.com/display/WW/Spring</a><br />其实也就是前面所说的第三种方式，只是把它加入了源码包中
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/23602#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>Tue, 06 Dec 2005 09:40:12 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/23602</link>
        <guid>http://airport.javaeye.com/blog/23602</guid>
      </item>
      <item>
        <title>18位身份证号码校验码的算法（JAVA）- -</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/23600" style="color:red;">http://airport.javaeye.com/blog/23600</a>&nbsp;
          发表时间: 2005年12月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [code:1]public static char doVerify&#40;String id&#41;<br />    &#123;<br />        char pszSrc&#91;&#93;=id.toCharArray&#40;&#41;;<br />        int iS = 0;<br />        int iW&#91;&#93;=&#123;7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2&#125;;<br />        char szVerCode&#91;&#93; = new char&#91;&#93;&#123;'1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'&#125;;<br />        int i;<br />        for&#40;i=0;i&lt;17;i++&#41;<br />        &#123;<br />            iS += &#40;int&#41;&#40;pszSrc&#91;i&#93;-'0'&#41; * iW&#91;i&#93;;<br />        &#125;<br />        int iY = iS%11;<br />        return szVerCode&#91;iY&#93;;<br />    &#125;[/code:1]
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/23600#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>Mon, 05 Dec 2005 16:55:06 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/23600</link>
        <guid>http://airport.javaeye.com/blog/23600</guid>
      </item>
      <item>
        <title>[copy]HIBERNATE的HBM.XML文件可以不用一个一个写到SPRING的 ...</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/23598" style="color:red;">http://airport.javaeye.com/blog/23598</a>&nbsp;
          发表时间: 2005年12月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          记得以前看到过一篇文章，说HIBERNATE的HBM.XML文件可以不用一个一个写到SPRING的配置文件里，只要指定一个目录就可以，当时我简单试了一下，的确可以，但当时没有记下来，导致现在用到的时候GOOGLE不到（可能找法不对），很是郁闷，只好去看SPRING的源代码，终于被我找到。原来是mappingDirectoryLocations属性。只要如下写就可以:<br />        &lt;property name="mappingDirectoryLocations"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;HBM.XML文件目录&lt;/value&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />看了SPRING的一些源代码，再次感到SPRING配置的威力！
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/23598#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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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, 05 Dec 2005 13:53:56 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/23598</link>
        <guid>http://airport.javaeye.com/blog/23598</guid>
      </item>
      <item>
        <title>Jert学习笔记</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/23584" style="color:red;">http://airport.javaeye.com/blog/23584</a>&nbsp;
          发表时间: 2005年12月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Jert学习
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/23584#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/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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 Dec 2005 17:12:57 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/23584</link>
        <guid>http://airport.javaeye.com/blog/23584</guid>
      </item>
      <item>
        <title>webwork和spring的结合 Use SpringObjectFactory</title>
        <author>airport</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://airport.javaeye.com">airport</a>&nbsp;
          链接：<a href="http://airport.javaeye.com/blog/23585" style="color:red;">http://airport.javaeye.com/blog/23585</a>&nbsp;
          发表时间: 2005年12月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          //webwork的文档中自带<br /><br />The xwork-optional package from dev.java.net contains a module xwork-spring that contains all the necessary code to use Spring in WebWork. It contains primarily a SpringObjectFactory to wire up the dependencies for an Action before passing it to WebWork. Each action should be configured within a Spring application context as a prototype (because WebWork assumes a new instance of a class for every action invocation). Specify something like this in applicationContext.xml: <br /><br />[code:1]&lt;bean name=&quot;some-action&quot; class=&quot;fully.qualified.class.name&quot; singleton=&quot;false&quot;&gt;<br />    &lt;property name=&quot;someProperty&quot;&gt;&lt;ref bean=&quot;someOtherBean&quot;/&gt;&lt;/property&gt;<br />&lt;/bean&gt;[/code:1]<br /><br />and in xwork.xml: <br />[code:1]&lt;action name=&quot;myAction&quot; class=&quot;some-action&quot;&gt;<br />    &lt;result name=&quot;success&quot;&gt;view.jsp&lt;/result&gt;<br />&lt;/action&gt;[/code:1]<br />Notice that the WebWork Action's class name some-action is the bean name defined in the Spring application context.<br /><br />Another advantage of the SpringObjectFactory approach is that it can also be used to load interceptors using the same sort of logic. If the interceptor is stateless, then it's possible to create the interceptor as a singelton instance, but otherwise it's best to create it as a Spring prototype. <br />In order to be used, the default ObjectFactory that WebWork uses should be replaced with an instance of the SpringObjectFactory. There are two different ways to accomplish this. The first method is to use the ContextListener in the xwork-optional package. This method assumes that the Spring application context has already been configured. Add the following to web.xml: <br />[code:1]&lt;!-- This needs to be after Spring ContextLoaderListener --&gt;<br />&lt;listener&gt;<br />  &lt;listener-class&gt;com.opensymphony.xwork.spring.SpringObjectFactoryListener&lt;/listener-class&gt;<br />&lt;/listener&gt;[/code:1]<br />Note: this is actually a XWork configuration but for simplicity, I just assume WebWork.<br /><br />The second method is to call the initObjectFactory method on com.opensymphony.xwork.spring.SpringObjectFactory. The easiest way to do this is to have Spring's application configure and supply the aforementioned method as the "init-method". Add the following to your applicationContext.xml: <br />[code:1]&lt;bean id=&quot;spring-object-factory&quot; class=&quot;com.opensymphony.xwork.spring.SpringObjectFactory&quot; init-method=&quot;initObjectFactory&quot;/&gt;[/code:1]Note: The second option should work when only using Xwork (as compared to XW and WW2).
          <br/>
          <span style="color:red;">
            <a href="http://airport.javaeye.com/blog/23585#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/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><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 Dec 2005 17:12:46 +0800</pubDate>
        <link>http://airport.javaeye.com/blog/23585</link>
        <guid>http://airport.javaeye.com/blog/23585</guid>
      </item>
  </channel>
</rss>