﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-空间站-文章分类-其他</title><link>http://www.blogjava.net/i369/category/17407.html</link><description>北极心空</description><language>zh-cn</language><lastBuildDate>Tue, 01 Apr 2008 12:44:38 GMT</lastBuildDate><pubDate>Tue, 01 Apr 2008 12:44:38 GMT</pubDate><ttl>60</ttl><item><title>python实现抢qq奥运火炬[仅供学习][转贴]</title><link>http://www.blogjava.net/i369/articles/190179.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 01 Apr 2008 11:22:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/190179.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/190179.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/190179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/190179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/190179.html</trackback:ping><description><![CDATA[[声明:仅供学习探讨之用，对于使用本文代码所造成之影响，本文作者不负任何法律和连带责任]<br />
最近，看到qq上不少好友的头像前都有个小火炬，自己也想要一个，遂行..<br />
结果发现，需要登陆网页 http://huoju.icoke.qq.com/ 去自己&#8216;抢&#8217;火炬去，而且我试验多次，也没办法抢到，只有靠&#8216;机器&#8217;来抢了....<br />
言归正传，经过分析，如果想抢到火炬，需要激发网页上的&#8216;立即争夺&#8217;按钮，获取网页代码：<br />
<br />
<table style="width: 570px; border-collapse: collapse; height: 117px" bordercolor="#999999" cellspacing="0" cellpadding="0" bgcolor="#f1f1f1" border="1">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)">##按钮部分代码<br />
            </span></span></code></p>
            <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,255)">tr</span><span style="color: rgb(0,0,204)">&gt;</span><br />
            <span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,255)">td</span> <span style="color: rgb(255,0,0)">height</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"67"</span> <span style="color: rgb(255,0,0)">align</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"center"</span><span style="color: rgb(0,0,204)">&gt;</span><span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,255)">a</span> <span style="color: rgb(255,0,0)">id</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"rob"</span> <span style="color: rgb(255,0,0)">href</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"#"</span> <span style="color: rgb(255,0,0)">onclick</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"return rob_torch();"</span><span style="color: rgb(0,0,204)">&gt;</span> ... <span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">/</span><span style="color: rgb(0,0,255)">td</span><span style="color: rgb(0,0,204)">&gt;</span><br />
            <span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">/</span><span style="color: rgb(0,0,255)">tr</span><span style="color: rgb(0,0,204)">&gt;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
由此可知，如函数rob_torch()有关，下载此网页相关的javascript（JS）代码，找出rob_torch()函数如下所示：<br />
<br />
<table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">function</span> rob_torch<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            <span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">Cookie</span><span style="color: rgb(0,0,204)">.</span>getCookie<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"tobtorchcookie"</span><span style="color: rgb(0,0,204)">)</span> <span style="color: rgb(0,0,204)">=</span><span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> ntime <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(255,0,0)">Date</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> stime <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(255,0,0)">Date</span><span style="color: rgb(0,0,204)">(</span>ntime<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getYear</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">,</span> ntime<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getMonth</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">,</span> ntime<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getDate</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">,</span> ntime<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getHours</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">,</span> ntime<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getMinutes</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">,</span> ntime<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getSeconds</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">+</span>25<span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">Cookie</span><span style="color: rgb(0,0,204)">.</span>setCookie<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"tobtorchcookie"</span><span style="color: rgb(0,0,204)">,</span> <span style="color: rgb(255,0,255)">"ok"</span><span style="color: rgb(0,0,204)">,</span> stime<span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">else</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">alert</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"抱歉，您的操作过于频繁，请于25秒后重试。"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">return</span> <span style="color: rgb(0,0,255)">false</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span>arrDelay<span style="color: rgb(0,0,204)">.</span>num <span style="color: rgb(0,0,204)">=</span><span style="color: rgb(0,0,204)">=</span> 0<span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">alert</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"目前没有活动资格可供争夺，请耐心等候!"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">return</span> <span style="color: rgb(0,0,255)">false</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> vers <span style="color: rgb(0,0,204)">=</span> getQQVersion<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span>vers <span style="color: rgb(0,0,204)">=</span><span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,204)">-</span>1<span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">return</span> <span style="color: rgb(0,0,255)">false</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span>vers <span style="color: rgb(0,0,204)">&lt;</span> 1777 <span style="color: rgb(0,0,204)">|</span><span style="color: rgb(0,0,204)">|</span> vers <span style="color: rgb(0,0,204)">&gt;</span><span style="color: rgb(0,0,204)">=</span> 2007<span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">alert</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"您当前的版本不支持活动资格争夺，请到http://im.qq.com下载安装官方2007II正式版或2008贺岁版QQ客户端。"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">return</span> <span style="color: rgb(0,0,255)">false</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;JsonLoader<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">load</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">'http://app.icoke.qq.com/icoke/torchdelay.php?'</span><span style="color: rgb(0,0,204)">+</span><span style="color: rgb(255,0,0)">Math</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">random</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">,</span><span style="color: rgb(0,0,255)">function</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,255)">typeof</span><span style="color: rgb(0,0,204)">(</span>numJson<span style="color: rgb(0,0,204)">)</span> <span style="color: rgb(0,0,204)">!</span><span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">undefined</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> <span style="color: rgb(255,0,0)">url</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,255)">"tencent://LargeSizedActivity/?HandleID=3&amp;PUIN=&amp;TorchUIN="</span><span style="color: rgb(0,0,204)">+</span>numJson<span style="color: rgb(0,0,204)">[</span>1<span style="color: rgb(0,0,204)">]</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"rob"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">href</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">url</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">window</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">open</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">url</span><span style="color: rgb(0,0,204)">,</span> <span style="color: rgb(255,0,255)">"robtorchiframe"</span><span style="color: rgb(0,0,204)">,</span> <span style="color: rgb(255,0,255)">"location=no"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">return</span> <span style="color: rgb(0,0,255)">true</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">else</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">return</span> <span style="color: rgb(0,0,255)">false</span><span style="color: rgb(0,0,204)">;</span><br />
            <span style="color: rgb(0,0,204)">}</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
其中大部分都是验证，不是很重要，我们注意到<code><span style="color: rgb(0,0,0)">JsonLoader<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,1,2)">load</span><span style="color: rgb(0,0,204)"><span style="color: rgb(0,1,2)">这个函数调用，其中有两个参数，一个是原url地址，另一个是回调函数内容，我们先看到这个回调函数会调用url地址</span>&#8216;</span></span></code><code><span style="color: rgb(0,0,0)"><span style="color: rgb(255,0,255)">tencent://LargeSizedActivity/?HandleID=3&amp;PUIN=&amp;TorchUIN=XXX</span></span></code><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)">&#8217;<span style="color: rgb(0,1,2)">其中XXX经过后来分析，是一个号码，火炬号码</span>，</span></span></code><code><span style="color: rgb(0,0,0)">$<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"rob"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">href</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">url</span><span style="color: rgb(0,0,204)">;<span style="color: rgb(0,1,2)">讲网页中的变量rob赋值为这个刚刚生成的url地址，然后由</span>window.open()<span style="color: rgb(0,1,2)">来调用这个链接，后来分析这个tencent协议需要调用一个qq客户端程序，暂时不知，由这个客户端程序去处理url地址请求。</span><br style="color: rgb(0,1,2)" />
<span style="color: rgb(0,1,2)">再返回来查看JsonLoad对象的load函数，代码如下：</span><br />
</span></span></code>
<table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">var</span> JsonLoader <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">load</span><span style="color: rgb(0,0,204)">:</span> <span style="color: rgb(0,0,255)">function</span><span style="color: rgb(0,0,204)">(</span>sUrl<span style="color: rgb(0,0,204)">,</span> fCallback<span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> _script <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">document</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">createElement</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"script"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_script<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">setAttribute</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"type"</span><span style="color: rgb(0,0,204)">,</span> <span style="color: rgb(255,0,255)">"text/javascript"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_script<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">setAttribute</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"src"</span><span style="color: rgb(0,0,204)">,</span> sUrl<span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">document</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">getElementsByTagName</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"head"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">[</span>0<span style="color: rgb(0,0,204)">]</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">appendChild</span><span style="color: rgb(0,0,204)">(</span>_script<span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">!</span><span style="color: rgb(0,0,204)">!</span><span style="color: rgb(255,0,0)">document</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">all</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_script<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">onreadystatechange</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">function</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">readyState</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"loaded"</span> <span style="color: rgb(0,0,204)">|</span><span style="color: rgb(0,0,204)">|</span> <span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">readyState</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"complete"</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fCallback<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">else</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_script<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">onload</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">function</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fCallback<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><span style="color: rgb(0,0,204)">,</span><br />
            <span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
这个，我们截取了一部分，其主要意思是根据情况，调用load的第二个参数，回调函数。<br />
这样，我们就知道了，我们只需要激发这个tencent的协议调用就可以激发按钮事件了....<br />
现在的问题就是我们如何去获得上文中的XXX，即火炬号码，由<code><span style="color: rgb(0,0,0)">上述代码rob_torch<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)<span style="color: rgb(0,1,2)">函数中的</span></span></span></code><code><span style="color: rgb(0,0,0)"><span style="color: rgb(255,0,0)">url</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,255)">"tencent://LargeSizedActivity/?HandleID=3&amp;PUIN=&amp;TorchUIN="</span><span style="color: rgb(0,0,204)">+</span>numJson<span style="color: rgb(0,0,204)">[</span>1<span style="color: rgb(0,0,204)">]，<span style="color: rgb(0,1,2)">我们发现，这个XXX变量numjSon[1]同函数</span></span></span></code><code style="color: rgb(0,1,2)">delay_refresh()中的arrDelay.delayqq的值是一样的，所以我们就直接每次通过调用delay_refresh()函数来更新获得当前放出来的火炬的延迟编号。</code>
<table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">function</span> delay_refresh<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            <span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> <span style="color: rgb(255,0,0)">url</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,255)">'http://huoju.icoke.qq.com/huojuicoke/datajs/torch_delay2.js?'</span><span style="color: rgb(0,0,204)">+</span><span style="color: rgb(255,0,0)">Math</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">random</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AsynLoader<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">load</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">url</span><span style="color: rgb(0,0,204)">,</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0,0,204)">{</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">method</span><span style="color: rgb(0,0,204)">:</span><span style="color: rgb(255,0,255)">'get'</span><span style="color: rgb(0,0,204)">,</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onSuccess<span style="color: rgb(0,0,204)">:</span> <span style="color: rgb(0,0,255)">function</span><span style="color: rgb(0,0,204)">(</span>xmlHttp<span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrDelay <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">eval</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"("</span> <span style="color: rgb(0,0,204)">+</span> xmlHttp<span style="color: rgb(0,0,204)">.</span>responseText <span style="color: rgb(0,0,204)">+</span> <span style="color: rgb(255,0,255)">")"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"torch_num"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">innerHTML</span> <span style="color: rgb(0,0,204)">=</span> arrDelay<span style="color: rgb(0,0,204)">.</span>num<span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> <span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">$</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"torch_total"</span><span style="color: rgb(0,0,204)">)</span> <span style="color: rgb(0,0,204)">!</span><span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"torch_total"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">innerHTML</span> <span style="color: rgb(0,0,204)">=</span> formatNum<span style="color: rgb(0,0,204)">(</span>arrDelay<span style="color: rgb(0,0,204)">.</span>total_count<span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">var</span> <span style="color: rgb(255,0,0)">url</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,255)">"tencent://LargeSizedActivity/?HandleID=3&amp;PUIN=&amp;TorchUIN="</span><span style="color: rgb(0,0,204)">+</span>arrDelay<span style="color: rgb(0,0,204)">.</span>delayqq<span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">"rob"</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">href</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">url</span><span style="color: rgb(0,0,204)">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><span style="color: rgb(0,0,204)">,</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onFailure<span style="color: rgb(0,0,204)">:</span> <span style="color: rgb(0,0,255)">function</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span> <span style="color: rgb(0,0,204)">}</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">;</span> </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
后面进一步分析得知，此页面每隔一定时间调用这个fresh函数去刷新获取当前释放出来的火炬编号，一段时间只释放一个编号，我们可以频繁调用这个刷新函数，然后在这个火炬被释放的第一时间，获取这个火炬的编号，然后调用tencent协议url请求去获取获取，这样，一旦有火炬被释放出来，就可以很快的去'抢'，比自己用手去点要快多了，本代码没有考虑异常情况，而且实现也不是很完善....不想继续完善了，因为本来是用于分析和学习，所以没必要继续了....<br />
经过测试，机器就是比人快...哈哈，以下是python实现的而代码，再次提醒，对于代码造成的任何影响，本作者不附带任何责任。
<table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">import</span> urllib<span style="color: rgb(0,0,204)">,</span>webbrowser<span style="color: rgb(0,0,204)">,</span>time<br />
            <span style="color: rgb(0,0,255)">import</span> random<br />
            <span style="color: rgb(0,0,255)">import</span> re<br />
            <br />
            regx <span style="color: rgb(0,0,204)">=</span> re<span style="color: rgb(0,0,204)">.</span>compile<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,255)">'\"[0-9]*\"'</span><span style="color: rgb(0,0,204)">)</span> #分析获取火炬编号的模式<br />
            <br />
            #用于记录原来的火炬编号，如果两次获取的火炬编号一致，则不激发获取火炬的事件<br />
            <br />
            old<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">''</span><br />
            <br />
            num<span style="color: rgb(0,0,204)">=</span>999 #试验999次<br />
            <br />
            fresh_url<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">'http://huoju.icoke.qq.com/huojuicoke/datajs/torch_delay2.js?'</span><br />
            <br />
            get_url<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">'tencent://LargeSizedActivity/?HandleID=3&amp;PUIN=&amp;TorchUIN='</span><br />
            <br />
            <span style="color: rgb(0,0,255)">while</span> num<span style="color: rgb(0,0,204)">-</span><span style="color: rgb(0,0,204)">-</span> <span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">=</span> 0<span style="color: rgb(0,0,204)">:</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;net<span style="color: rgb(0,0,204)">=</span>urllib<span style="color: rgb(0,0,204)">.</span>urlopen<span style="color: rgb(0,0,204)">(</span>fresh_url<span style="color: rgb(0,0,204)">)</span> #刷新释放的火炬<br />
            &nbsp;&nbsp;&nbsp;&nbsp;data<span style="color: rgb(0,0,204)">=</span>net<span style="color: rgb(0,0,204)">.</span>read<span style="color: rgb(0,0,204)">(</span><span style="color: rgb(0,0,204)">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_list<span style="color: rgb(0,0,204)">=</span>re<span style="color: rgb(0,0,204)">.</span>findall<span style="color: rgb(0,0,204)">(</span>regx<span style="color: rgb(0,0,204)">,</span>data<span style="color: rgb(0,0,204)">)</span> #获取火炬编号<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span> old <span style="color: rgb(0,0,204)">!</span><span style="color: rgb(0,0,204)">=</span> m_list<span style="color: rgb(0,0,204)">[</span>0<span style="color: rgb(0,0,204)">]</span><span style="color: rgb(0,0,204)">:</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webbrowser<span style="color: rgb(0,0,204)">.</span>open<span style="color: rgb(0,0,204)">(</span>get_url <span style="color: rgb(0,0,204)">+</span> str<span style="color: rgb(0,0,204)">(</span>m_list<span style="color: rgb(0,0,204)">[</span>0<span style="color: rgb(0,0,204)">]</span><span style="color: rgb(0,0,204)">)</span><span style="color: rgb(0,0,204)">)</span> #激发获取火炬事件<br />
            &nbsp;&nbsp;&nbsp;&nbsp;time<span style="color: rgb(0,0,204)">.</span>sleep<span style="color: rgb(0,0,204)">(</span>1<span style="color: rgb(0,0,204)">)</span> #stop 1 second<br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/190179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-04-01 19:22 <a href="http://www.blogjava.net/i369/articles/190179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j和commons.logging日志记录的使用方法</title><link>http://www.blogjava.net/i369/articles/185309.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 11 Mar 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/185309.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/185309.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/185309.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/185309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/185309.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text"><span style="font-size: 9pt; color: black">
            <p style="margin: 0in 0in 0pt"><strong><span style="font-size: 9pt">Log4j</span><span style="font-size: 9pt">中文手册下载地址</span></strong><span style="font-size: 9pt"><a href="http://www.matrix.org.cn/resource/upload/forum/2006_04_07_205056_ZCxoePRlHJ.pdf" target="_blank"><span style="color: windowtext">http://www.matrix.org.cn/resource/upload/forum/2006_04_07_205056_ZCxoePRlHJ.pdf</span></a></span></p>
            <p style="margin: 0in 0in 0pt"></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt">log4j的好处在于：<br />
            1.通过修改配置文件，就可以决定log信息输出到何处(console,文件,...),是否输出。<br />
            这样，在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(...)等)。<br />
            2.使用log4j，需要整个系统有一个统一的log机制，有利于系统的规划。</span></p>
            <p style="margin: 0in 0in 0pt"></p>
            </span>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: black">当你在开发程序的时候</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">调试</span><span style="font-size: 9pt; color: black">(debugging)</span><span style="font-size: 9pt; color: black">和日志</span><span style="font-size: 9pt; color: black">(logging)</span><span style="font-size: 9pt; color: black">都是非常重要的工作</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">但是</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">现在有太多的</span><span style="font-size: 9pt; color: black"> logging API </span><span style="font-size: 9pt; color: black">问世</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">因为他们都不错</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">很难做一个抉择</span><span style="font-size: 9pt; color: black">. </span><span style="font-size: 9pt; color: black">国外</span><span style="font-size: 9pt; color: black"> java </span><span style="font-size: 9pt; color: black">论坛对于这些</span><span style="font-size: 9pt; color: black"> logging </span><span style="font-size: 9pt; color: black">方式也是有一番讨论</span><span style="font-size: 9pt; color: black">.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">而</span><span style="font-size: 9pt; color: black"> common logging </span><span style="font-size: 9pt; color: black">就是一个在这几个不同的</span><span style="font-size: 9pt; color: black"> logging API </span><span style="font-size: 9pt; color: black">中建立小小的桥梁</span><span style="font-size: 9pt; color: black">.</span><span style="font-size: 9pt; color: black">目前在</span><span style="font-size: 9pt; color: black"> Java </span><span style="font-size: 9pt; color: black">中最有名的</span><span style="font-size: 9pt; color: black"> Log </span><span style="font-size: 9pt; color: black">方式</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">首推是</span><span style="font-size: 9pt; color: black"> Log4j, </span><span style="font-size: 9pt; color: black">另是</span><span style="font-size: 9pt; color: black"> JDK 1.4 Logging API. </span><span style="font-size: 9pt; color: black">除此之外</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">还有</span><span style="font-size: 9pt; color: black"> Avalon </span><span style="font-size: 9pt; color: black">中用的</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">LogKit </span><span style="font-size: 9pt; color: black">等等</span><span style="font-size: 9pt; color: black"> . </span><span style="font-size: 9pt; color: black">而</span><span style="font-size: 9pt; color: black"> commons-logging </span><span style="font-size: 9pt; color: black">也有实现一些基本</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">的</span><span style="font-size: 9pt; color: black"> logging </span><span style="font-size: 9pt; color: black">方式为</span><span style="font-size: 9pt; color: black"> NoOpLog </span><span style="font-size: 9pt; color: black">及</span><span style="font-size: 9pt; color: black"> SimpleLog. </span><span style="font-size: 9pt; color: black">对于他们的比较不在这次讨论范围</span><span style="font-size: 9pt; color: black">,<br />
            <br />
            </span><span style="font-size: 9pt; color: black">有兴趣者请自行参阅参考文件</span><span style="font-size: 9pt; color: black">.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">快速使用</span><span style="font-size: 9pt; color: black"> Logging </span><span style="font-size: 9pt; color: black">其实</span><span style="font-size: 9pt; color: black"> logging </span><span style="font-size: 9pt; color: black">非常简单去使用</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">将</span><span style="font-size: 9pt; color: black"> commons-logging.jar </span><span style="font-size: 9pt; color: black">放到</span><span style="font-size: 9pt; color: black"> /WEB-INF/lib </span><span style="font-size: 9pt; color: black">之下</span><span style="font-size: 9pt; color: black">.</span><span style="font-size: 9pt; color: black">接著写以下的代码</span><span style="font-size: 9pt; color: black"><br />
            <br />
            LoggingTest.java<br />
            <br />
            package com.softleader.newspaper.java.opensource;<br />
            <br />
            import org.apache.commons.logging.Log;<br />
            import org.apache.commons.logging.LogFactory;<br />
            <br />
            public class LoggingTest {<br />
            <br />
            Log log = LogFactory.getLog(LoggingTest.class);<br />
            <br />
            public void hello() {<br />
            log.error("ERROR");<br />
            log.debug("DEBUG");<br />
            log.warn("WARN");<br />
            log.info("INFO");<br />
            log.trace("TRACE");<br />
            System.out.println("OKOK");<br />
            }<br />
            <br />
            }<br />
            <br />
            </span><span style="font-size: 9pt; color: black">在</span><span style="font-size: 9pt; color: black"> / </span><span style="font-size: 9pt; color: black">放置一个</span><span style="font-size: 9pt; color: black"> jsp </span><span style="font-size: 9pt; color: black">测试</span><span style="font-size: 9pt; color: black"> test-commons-logging.jsp<br />
            <br />
            &lt;%@ page import="com.softleader.newspaper.java.opensource.LoggingTest" %&gt;<br />
            &lt;% LoggingTest test = new LoggingTest(); test.hello();%&gt;<br />
            <br />
            </span><span style="font-size: 9pt; color: black">你将会看到</span><span style="font-size: 9pt; color: black"> tomcat console </span><span style="font-size: 9pt; color: black">会有下面输出</span><span style="font-size: 9pt; color: black"><br />
            <br />
            log4j:WARN No appenders could be found for logger (com.softleader.newspaper.java.opensource.LoggingTest).<br />
            log4j:WARN Please initialize the log4j system properly.OKOK<br />
            <br />
            </span><span style="font-size: 9pt; color: black">是因为你还没有配置</span><span style="font-size: 9pt; color: black"> commons-logging.properties, </span><span style="font-size: 9pt; color: black">马上会为你介绍</span><span style="font-size: 9pt; color: black"> ~~~.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">设定</span><span style="font-size: 9pt; color: black"> commons-logging.properties </span><span style="font-size: 9pt; color: black">你可以设置你的</span><span style="font-size: 9pt; color: black"> log factory </span><span style="font-size: 9pt; color: black">是要使用哪一个</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">我以</span><span style="font-size: 9pt; color: black"> Log4J </span><span style="font-size: 9pt; color: black">为例子</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">在</span><span style="font-size: 9pt; color: black"> /WEB-INF/classes/commons-logging.properties </span><span style="font-size: 9pt; color: black">中写入</span><span style="font-size: 9pt; color: black"><br />
            org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog<br />
            </span><span style="font-size: 9pt; color: black">如果你</span><span style="font-size: 9pt; color: black"> server </span><span style="font-size: 9pt; color: black">是使用</span><span style="font-size: 9pt; color: black"> jdk1.4 </span><span style="font-size: 9pt; color: black">以上的版本</span><span style="font-size: 9pt; color: black"><br />
            </span><span style="font-size: 9pt; color: black">可以使用</span><span style="font-size: 9pt; color: black"> org.apache.commons.logging.impl.Jdk14Logger<br />
            </span><span style="font-size: 9pt; color: black">接著根据你的</span><span style="font-size: 9pt; color: black"> Logger </span><span style="font-size: 9pt; color: black">撰写符合他的</span><span style="font-size: 9pt; color: black"> properties </span><span style="font-size: 9pt; color: black">拿</span><span style="font-size: 9pt; color: black"> Log4j </span><span style="font-size: 9pt; color: black">为例子</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">你就要在</span><span style="font-size: 9pt; color: black"><br />
            /WEB-INF/classes/ </span><span style="font-size: 9pt; color: black">下放置一个</span><span style="font-size: 9pt; color: black"><br />
            <br />
            //</span><span style="font-size: 9pt; color: black">日志输出到文件</span><span style="font-size: 9pt; color: black"><br />
            log4j.rootLogger=DEBUG, A_default<br />
            log4j.appender.A_default=org.apache.log4j.RollingFileAppender<br />
            log4j.appender.A_default.File=c://log/test.log<br />
            log4j.appender.A_default.MaxFileSize=4000KB<br />
            log4j.appender.A_default.MaxBackupIndex=10<br />
            log4j.appender.A_default.layout=org.apache.log4j.PatternLayout<br />
            log4j.appender.A_default.layout.ConversionPattern=%d{ISO8601} - %p - %m%n<br />
            <br />
            //</span><span style="font-size: 9pt; color: black">日志输出到控制台</span><span style="font-size: 9pt; color: black"><br />
            log4j.rootLogger=INFO, A1<br />
            log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
            log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
            log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n<br />
            <br />
            //</span><span style="font-size: 9pt; color: black">发送邮件</span><span style="font-size: 9pt; color: black"><br />
            # Configuration for receiving e-mails when ERROR messages occur.<br />
            <br />
            #</span><span style="font-size: 9pt; color: black">自定义的</span><span style="font-size: 9pt; color: black">Appender<br />
            log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender<br />
            #</span><span style="font-size: 9pt; color: black">日志的错误级别</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.Threshold=ERROR<br />
            #</span><span style="font-size: 9pt; color: black">缓存文件大小，日志达到</span><span style="font-size: 9pt; color: black">512K</span><span style="font-size: 9pt; color: black">时发送</span><span style="font-size: 9pt; color: black">Email<br />
            log4j.appender.MAIL.BufferSize=512<br />
            #</span><span style="font-size: 9pt; color: black">发件人</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.From=webmaster@bcxy.com<br />
            #</span><span style="font-size: 9pt; color: black">发送邮件的服务器</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.SMTPHost=smtp.163.com<br />
            #</span><span style="font-size: 9pt; color: black">邮件的标题</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.Subject=Log4J Message<br />
            #</span><span style="font-size: 9pt; color: black">日志邮件的接收者</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.To=ezerg@126.com<br />
            #</span><span style="font-size: 9pt; color: black">日志</span><span style="font-size: 9pt; color: black">PatternLayout<br />
            log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout<br />
            #</span><span style="font-size: 9pt; color: black">日志的格式</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />
            <br />
            <br />
            </span><span style="font-size: 9pt; color: black">此时你去执行</span><span style="font-size: 9pt; color: black"> test-commons-logging.jsp </span><span style="font-size: 9pt; color: black">输出的内容</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">就会记录在你的</span><span style="font-size: 9pt; color: black"> c:\log </span><span style="font-size: 9pt; color: black">目录的</span><span style="font-size: 9pt; color: black"> test.log </span><span style="font-size: 9pt; color: black">中了</span><span style="font-size: 9pt; color: black"> ps:</span><span style="font-size: 9pt; color: black">如果没有相关的</span><span style="font-size: 9pt; color: black"> class </span><span style="font-size: 9pt; color: black">会使用到</span><span style="font-size: 9pt; color: black"> SimpLog, </span><span style="font-size: 9pt; color: black">此时要设定的是</span><span style="font-size: 9pt; color: black"><br />
            simplelog.properties </span><span style="font-size: 9pt; color: black">结论以我自己本身使用的经验</span><span style="font-size: 9pt; color: black">, Log4j </span><span style="font-size: 9pt; color: black">可以满足所有工程师</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">所以我也是直接使用</span><span style="font-size: 9pt; color: black"> log4j </span><span style="font-size: 9pt; color: black">而没有使用</span><span style="font-size: 9pt; color: black"> commons-logging.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">不过为了增加产品的通用性</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">避免移植时候的麻烦</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">新的产品及项目</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">我会将他改成</span><span style="font-size: 9pt; color: black"> commons-logging api </span><span style="font-size: 9pt; color: black">去调用</span><span style="font-size: 9pt; color: black">.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">如果你对</span><span style="font-size: 9pt; color: black">commons-logging</span><span style="font-size: 9pt; color: black">的工作原理不是很了解，请参考＜</span><span style="font-size: 9pt; color: black">commons-logging</span><span style="font-size: 9pt; color: black">的使用方法＞</span></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: black">另，</span><span style="font-size: 9pt; color: black">mvnforum</span><span style="font-size: 9pt; color: black">里面的</span><span style="font-size: 9pt; color: black">commons-logging.properties</span><span style="font-size: 9pt; color: black">写法：</span><span style="font-size: 9pt; color: black"><br />
            # This is configuration file which used to config Logging for mvnForum application<br />
            # mvnForum supports 2 Loggings: Log4J and jzonic<br />
            # Depend on your web server, you should choose a logging properly<br />
            <br />
            <br />
            # IMPORTANT NOTE FOR TOMCAT 5.x USERS:<br />
            #<br />
            # By default, Tomcat 5.x will not work with Log4J. <br />
            # However, this file (commons-logging.properties) with a line<br />
            # config : org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory<br />
            # make Tomcat 5.x and Log4J work happyly together forever, I dont know why :-)<br />
            <br />
            <br />
            <br />
            # Log4J<br />
            # This used to config logging Log4J<br />
            # Note that by default, common logging will look for Log4J first<br />
            # Comment out folling line to if you will use Jlo logging (also remember to enable Jlo below)<br />
            <br />
            org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory<br />
            <br />
            # Jlo <br />
            # jlo.xml config logging which only log the statements (DEBUG, ERROR, TRACE, INFO, WARN) <br />
            # from the packages start with net.myvietnam and com.mvnforum. <br />
            # See properities/jlo.xml for detail about this logging<br />
            # See <a href="http://jzonic.org/" target="_blank"><font color="#333333">http://jzonic.org</font></a> for documentation<br />
            # If you want to extend mvnForum application, you should be aware of that<br />
            <br />
            # Uncomment folling line to choose jlo logging <br />
            # You will need Jlo if Log4j could not run on Tomcat 5.0.x, Tomcat 5.5.x or JRun 4<br />
            # NOTE: read comment above about Tomcat 5.x issue<br />
            <br />
            # org.apache.commons.logging.LogFactory=org.jzonic.jlo.LogManager</span></p>
            <p style="margin: 0in 0in 0pt"></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: black">====================================================================</span></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt">LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， <br />
            <br />
            <br />
            <br />
            log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />
            log4j.addivity.org.apache=true <br />
            <br />
            <br />
            <br />
            # 应用于控制台 <br />
            <br />
            log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />
            log4j.appender.Threshold=DEBUG <br />
            log4j.appender.CONSOLE.Target=System.out <br />
            log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />
            <br />
            <br />
            #应用于文件 <br />
            <br />
            log4j.appender.FILE=org.apache.log4j.FileAppender <br />
            log4j.appender.FILE.File=file.log <br />
            log4j.appender.FILE.Append=false <br />
            log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            # Use this layout for LogFactor 5 analysis <br />
            <br />
            <br />
            <br />
            # 应用于文件回滚 <br />
            <br />
            log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />
            log4j.appender.ROLLING_FILE.Threshold=ERROR <br />
            log4j.appender.ROLLING_FILE.File=rolling.log <br />
            log4j.appender.ROLLING_FILE.Append=true <br />
            log4j.appender.ROLLING_FILE.MaxFileSize=10KB <br />
            log4j.appender.ROLLING_FILE.MaxBackupIndex=1 <br />
            log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            <br />
            <br />
            #应用于socket <br />
            log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />
            log4j.appender.SOCKET.RemoteHost=localhost <br />
            log4j.appender.SOCKET.Port=5001 <br />
            log4j.appender.SOCKET.LocationInfo=true <br />
            # Set up for Log Facter 5 <br />
            log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />
            <br />
            <br />
            # Log Factor 5 Appender <br />
            log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />
            log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 <br />
            <br />
            <br />
            <br />
            # 发送日志给邮件 <br />
            <br />
            log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />
            log4j.appender.MAIL.Threshold=FATAL <br />
            log4j.appender.MAIL.BufferSize=10 <br />
            log4j.appender.MAIL.From=web@<a href="http://www.wuset.com/" target="_blank">www.wuset.com</a> <br />
            log4j.appender.MAIL.SMTPHost=www.wusetu.com <br />
            log4j.appender.MAIL.Subject=Log4J Message <br />
            log4j.appender.MAIL.To=web@<a href="http://www.wusetu.com/" target="_blank">www.wusetu.com</a> <br />
            log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            <br />
            <br />
            <br />
            # 用于数据库 <br />
            log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />
            log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />
            log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />
            log4j.appender.DATABASE.user=root <br />
            log4j.appender.DATABASE.password= <br />
            log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') <br />
            log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            <br />
            <br />
            log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />
            log4j.appender.A1.File=SampleMessages.log4j <br />
            log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />
            log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout <br />
            <br />
            #自定义Appender <br />
            <br />
            log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender <br />
            <br />
            log4j.appender.im.host = mail.cybercorlin.net <br />
            log4j.appender.im.username = username <br />
            log4j.appender.im.password = password <br />
            log4j.appender.im.recipient = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#114;&#108;&#105;&#110;&#64;&#99;&#121;&#98;&#101;&#114;&#99;&#111;&#114;&#108;&#105;&#110;&#46;&#110;&#101;&#116;">corlin@cybercorlin.net</a> <br />
            <br />
            log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/i369/aggbug/185309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-11 11:48 <a href="http://www.blogjava.net/i369/articles/185309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>访问安全网站(使用SSL)总是跳出安全警报的解决方法</title><link>http://www.blogjava.net/i369/articles/157717.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 02 Nov 2007 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/157717.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/157717.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/157717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/157717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/157717.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/i369/aggbug/157717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-02 12:04 <a href="http://www.blogjava.net/i369/articles/157717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]一个优秀软件开发人员的必修课：GRASP软件开发模式浅析 </title><link>http://www.blogjava.net/i369/articles/153199.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 16 Oct 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/153199.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/153199.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/153199.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/153199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/153199.html</trackback:ping><description><![CDATA[<table width="100%">
    <tbody>
        <tr>
            <td>&nbsp;
            <p><span style="font-family: 宋体">你是一个优秀软件开发人员吗？你知道</span>GRASP<span Times Roman?;?2?>&nbsp;</p>
            <h2>一.职责分配和职责驱动设计</h2>
            <p><span style="font-family: 宋体">在一个软件项目开始的时候，我们通常需要进行需求分析，了解客户需要设计一个什么样的软件，这个软件中应当有什么功能。需求分析了解到的是现实世界中客户需求的业务功能，每个业务功能往往是一个业务流程，即客户在日常工作中不断在完成的业务流程。同时，在用户的问题世界中，必然有一些东西或者说事物，它们之间存在着相互的关联。</span></p>
            <p><span style="font-family: 宋体">拿一个软件评审管理系统作为一个例子吧。评审管理系统的业务需求如下：</span></p>
            <p>1<span Times 宋体;? Roman?;?font-family:>通过以上需求的描述，我们不难发现整个问题世界中的相关事物：评审组织者、评审计划、评审者、评审对象、评审表、疑问、评审报告、评审结论、问题。我们也不难分析出这些事物相互关系，比如评审计划与评审者是一对多，而评审报告与评审结论是一对一。</span></p>
            <p><span style="font-family: 宋体">在</span>RUP<span Times 宋体;? Roman?;?font-family:>领域模型中的对象将成为软件开发中形成具体对象的基础（软件开发中形成什么对象是根据软件开发的具体需求而定的，并不一定要与领域模型的对象一致）。用例模型中的用例，将通过赋予这些对象行为而得以实现。现在的问题就出来了，用例模型中的功能，或者说一系列行为，应当如何分配给这些对象呢。也就是说，为了完成同一个任务，我可以将行为</span>A<span Times 宋体;? Roman?;?font-family:>我们通过对现实世界的分析，或者说对于领域模型的分析，设计出了软件系统中的对象，这时候我们应当为每一个对象分配职责。什么是对象的职责呢，当然是通过对现实世界的分析，定义的这个对象应当完成的任务。比如评审者对象的职责是存取与评审者相关的数据。当然对象的职责不一定是一个，比如评审计划包含了评审对象和评审者的子项，所以它在工作不繁忙的情况下可以代理处理评审对象和评审者的信息存取。但是一个对象的职责不应当过多（也就</span>2<span Times 宋体;? Roman?;?font-family:>职责分配现在已经被普遍认为是一个优秀的软件设计应当遵循的原则，它有以下好处：</span></p>
            <p>1<span Times 宋体;? Roman?;?font-family:>这种通过考虑对象、职责、协作的对象设计及构件方式，被称为&#8220;职责驱动设计（</span>RDD<span Times span Roman?;<></p>
            <h2>二.GRASP模式挨个析</h2>
            <p>GRASP<span Times 宋体;? Roman?;?font-family:><font face="Arial"><a href="http://fangang.javaeye.com/admin/show/49082">（原创）一个优秀软件开发人员的必修课：GRASP（2）低耦合</a></font></span></p>
            <p><span style="font-family: 宋体"><font face="Arial"><a href="http://fangang.javaeye.com/admin/show/49458">（原创）一个优秀软件开发人员的必修课：GRASP（3）高内聚</a></font></span></p>
            <p><span style="font-family: 宋体"><font face="Arial"><a href="http://fangang.javaeye.com/admin/show/51240">一个对象撕心裂肺的怒吼：谁来创建我！GRASP（4）创建者模式</a></font></span></p>
            <p><span style="font-family: 宋体">（待续）</span></p>
            </span></span></td>
        </tr>
    </tbody>
</table>
<br />
<br />
以下是原博客的讨论:[建议到员博客阅读]<br />
<div class="topic_summary">
<table width="100%">
    <tbody>
        <tr>
            <td valign="bottom" width="90%">最后更新：2007-02-04 15:24<br />
            14:11&nbsp;&nbsp;|&nbsp;&nbsp; <a href="javascript:Element.toggle('link48504');">永久链接</a>&nbsp;&nbsp;|&nbsp;&nbsp; 浏览&nbsp;(5801)&nbsp;&nbsp;|&nbsp;&nbsp; <a href="http://fangang.javaeye.com/blog/48504#comments">评论</a>&nbsp;(13)&nbsp;&nbsp;| &nbsp;&nbsp; <a href="http://fangang.javaeye.com/admin/favorite_blog/209116">收藏</a>&nbsp;&nbsp;|&nbsp;&nbsp; <a href="http://fangang.javaeye.com/topic/48504">进入论坛</a>&nbsp;&nbsp;|&nbsp;&nbsp; </td>
            <td width="10%"></td>
        </tr>
    </tbody>
</table>
</div>
<div class="topic_link" id="link48504" style="display: none">
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td align="left" height="30"><span class="date_show">永久链接</span></td>
        </tr>
        <tr>
            <td align="left"><a href="http://fangang.javaeye.com/blog/48504">http://fangang.javaeye.com/blog/48504</a> </td>
        </tr>
    </tbody>
</table>
</div>
<div><a name="comments"></a>
<div style="border-top: gray 1px solid; margin-top: 15px">
<div id="comment-list" style="margin: 10px 20px 0px">
<div>
<table width="100%">
    <tbody>
        <tr valign="top">
            <td width="50%"><strong class="title">评论</strong> &nbsp;&nbsp;&nbsp;共 13 条 </td>
            <td align="right" width="50%"><a href="javascript:Field.focus('message');">发表评论</a> </td>
        </tr>
    </tbody>
</table>
</div>
<div style="margin-top: 10px">
<div id="post_209778">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://amigobot.javaeye.com/">amigobot</a> &nbsp;&nbsp;&nbsp; 2007-01-20 13:08 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>没有下文了？ 期待中。GRASP和GoF是不同类型的模式， 出发点不同。 GRASP是解决类之间如何交互， 如何设计合理， 和具体问题无关。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_209789">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://galaxystar.javaeye.com/">galaxystar</a> &nbsp;&nbsp;&nbsp; 2007-01-20 13:50 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>感觉是一种综合体！</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_209796">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://zuly.javaeye.com/">zuly</a> &nbsp;&nbsp;&nbsp; 2007-01-20 14:08 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>知道名字就可以!其他的可以google!</p>
            <p>what we need is the name , add others to google!</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_210355">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://fangang.javaeye.com/">fangang</a> &nbsp;&nbsp;&nbsp; 2007-01-22 08:46 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>
            <div class="quote_title">zuly 写道</div>
            <div class="quote_div">知道名字就可以!其他的可以google!
            <p>&nbsp;</p>
            <p>what we need is the name , add others to google!</p>
            </div>
            我写这篇文章的起因是因为我偶然在google或yahoo这样的搜索引擎搜索GRASP发现，除了国外的网站，国内网站多介绍和讨论GoF而很少介绍GRASP，即使这少量的文章也讲解非常粗略。个人认为作为优秀的开发人员，理解GRASP比GoF更重要，故写此文章。此文章后面的内容我会不断添上，谢谢支持
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_210374">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://fangang.javaeye.com/">fangang</a> &nbsp;&nbsp;&nbsp; 2007-01-22 09:15 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>
            <div class="quote_title">amigobot 写道</div>
            <div class="quote_div">没有下文了？ 期待中。GRASP和GoF是不同类型的模式， 出发点不同。 GRASP是解决类之间如何交互， 如何设计合理， 和具体问题无关。</div>
            <br />
            我同意。GRASP与GoF最大的区别，本人认为GoF往往是解决一些具体的问题，比如类的具体创建方式等等，而GRASP是解决对象分析的一些基本原则，即你如何去设计你的问题空间中的类和它们的行为，是原则性的东西。后面我会一个一个分析GRASP的9个模式，也就是9个基本原则，谢谢支持
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_211821">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://laohuang.javaeye.com/">newman</a> &nbsp;&nbsp;&nbsp; 2007-01-24 10:36 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>有点意思。不过从fangang朋友对grasp的介绍，我得到的印象是grasp跟gof作为比较有些不当，可能是我的理解有误。希望能看到fangang朋友对grasp给出一个比较明确的定义，以及适用范围，比如在软件开发生命周期中，grasp在什么阶段用合适？有哪些效用。。。等等，期待中。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_212182">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://fangang.javaeye.com/">fangang</a> &nbsp;&nbsp;&nbsp; 2007-01-24 13:46 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>谢谢指教，grasp和gof都是称为软件开发模式，只是描述的内容和角度不同，这相关的问题Craig Larman在《UML和模式应用》的第17章中有详细描述</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_212275">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://fly-ever.javaeye.com/">fly_ever</a> &nbsp;&nbsp;&nbsp; 2007-01-24 15:55 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>有一本书阐述了GRASP，《深入浅出设计模式 C#/JAVA版》，06年出版的。 <br />
            感觉跟GOF相比，GRASP主要是用来指导面向对象的分析和设计。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_212304">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://fangang.javaeye.com/">fangang</a> &nbsp;&nbsp;&nbsp; 2007-01-24 16:23 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>
            <div class="quote_title">newman 写道</div>
            <div class="quote_div">有点意思。不过从fangang朋友对grasp的介绍，我得到的印象是grasp跟gof作为比较有些不当，可能是我的理解有误。希望能看到fangang朋友对grasp给出一个比较明确的定义，以及适用范围，比如在软件开发生命周期中，grasp在什么阶段用合适？有哪些效用。。。等等，期待中。</div>
            <br />
            grasp(General Responsibility Assignment Software Patterns)，它往往适用于对象分析和设计中，即在RUP的制作分析模型和设计模型阶段。grasp有9种模式，是用于解决软件设计中的9种常见的问题，因此其效用各不一样，不能一概而论。
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_212817">
<div class="light_b" style="padding-right: 2px; margin-top: 10px; padding-left: 2px; padding-bottom: 2px; padding-top: 2px"><a href="http://fangang.javaeye.com/">fangang</a> &nbsp;&nbsp;&nbsp; 2007-01-25 09:51 </div>
<div style="margin-top: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>非常感谢newman给我提的数个问题。GRASP虽好，GoF虽好，最关键是我们怎么用和啥时候用，这两个问题一直是我反复思考的问题。我正在筹划写一篇关于软件开发过程，特别是分析和设计这个阶段，如何运用GRASP和GoF的一点儿认识，期望和大家切磋切磋</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/153199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-16 11:22 <a href="http://www.blogjava.net/i369/articles/153199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN配置</title><link>http://www.blogjava.net/i369/articles/153192.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 16 Oct 2007 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/153192.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/153192.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/153192.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/153192.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/153192.html</trackback:ping><description><![CDATA[在linux下安装配置svn独立服务器
<div>　　subversion(以下简称svn)是近年来崛起的版本管理工具，是cvs的接班人。</div>
<div>　　svn服务器有2种运行方式：独立服务器和借助apache。2种方式各有利弊。</div>
<div>　　svn存储版本数据也有2种方式：BDB和FSFS。因为BDB方式在服务器中断时，有可能锁住数据（我在搞ldap时就深受其害，没法根治），所以还是FSFS方式更安全一点。</div>
<div>1. svn服务器安装</div>
<div>操作系统: Redhat Linux AS4</div>
<div>安装包获取:</div>
<div>下载<a href="http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz" target="_blank"><font color="#111133">http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz</font></a>和<a href="http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz" target="_blank"><font color="#111133">http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz</font></a>。</div>
<div>编译:<br />
以root用户登录。<br />
将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。</div>
<div>tar xfvz subversion-1.4.0.tar.gz<br />
tar xfvz subversion-deps-1.4.0.tar.gz<br />
cd subversion-1.4.0<br />
./configure --prefix=/opt/svn --without-berkeley-db &#8211;with-zlib<br />
(注：以svnserve方式运行，不加apache编译参数。以fsfs格式存储版本库，不编译berkeley-db)<br />
make clean<br />
make<br />
make install</div>
<div>vi /etc/profile,在/etc/profile最后加入:<br />
PATH=$PATH:/opt/svn/bin<br />
export PATH</div>
<div>测试:<br />
svnserve &#8211;version</div>
<div>如果显示如下，安装成功:<br />
svnserve, version 1.4.0 (r21228)<br />
　 compiled Oct 12 2006, 10:18:56</div>
<div>Copyright (C) 2000-2006 CollabNet.<br />
Subversion is open source software, see <a href="http://subversion.tigris.org/"><font color="#111133">http://subversion.tigris.org/</font></a><br />
This product includes software developed by CollabNet (<a href="http://www.collab.net/"><font color="#111133">http://www.Collab.Net/</font></a>).</div>
<div>The following repository back-end (FS) modules are available:</div>
<div>* fs_fs : Module for working with a plain file (FSFS) repository.</div>
<div>2. svn配置<br />
建立版本库目录，可建多个：<br />
mkdir -p /opt/svndata/repos1<br />
mkdir -p /opt/svndata/repos2</div>
<div>建立版本库:<br />
svnadmin create /opt/svndata/repos1<br />
svnadmin create /opt/svndata/repos2</div>
<div>修改版本库配置文件:<br />
版本库1：<br />
vi /opt/svndata/repos1/conf/svnserve.conf</div>
<div>内容修改为:<br />
[general]<br />
anon-access = none<br />
auth-access = write<br />
password-db = /opt/svn/conf/pwd.conf<br />
authz-db = /opt/svn/conf/authz.conf<br />
realm = repos1</div>
<div>版本库2:<br />
vi /opt/svndata/repos2/conf/svnserve.conf</div>
<div>内容修改为:<br />
[general]<br />
anon-access = none<br />
auth-access = write<br />
password-db = /opt/svn/conf/pwd.conf<br />
authz-db = /opt/svn/conf/authz.conf<br />
realm = repos2</div>
<div>　　即除realm = repos2外，其他与版本库1配置文件完全相同。如果有更多的版本库，依此类推。</div>
<div>配置允许访问的用户:<br />
vi /opt/svn/conf/pwd.conf</div>
<div>　　为了简化配置，2个版本库共用1个用户配置文件。如有必要，也可以分开。</div>
<div>注意：对用户配置文件的修改立即生效，不必重启svn。</div>
<div>文件格式如下：<br />
[users]<br />
&lt;用户1&gt; = &lt;密码1&gt;<br />
&lt;用户2&gt; = &lt;密码2&gt;</div>
<div>　　其中，[users]是必须的。下面列出要访问svn的用户，每个用户一行。示例：<br />
[users]<br />
alan = password<br />
king = hello</div>
<div>配置用户访问权限:<br />
vi /opt/svn/conf/authz.conf</div>
<div>　　为了简化配置，3个版本库共用1个权限配置文件/opt/svn/conf/pwd.conf。如有必要，也可以分开。文件中定义用户组和版本库目录权限。</div>
<div>注意：<br />
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。<br />
* 对权限配置文件的修改立即生效，不必重启svn。</div>
<div>用户组格式：<br />
[groups]<br />
&lt;用户组名&gt; = &lt;用户1&gt;,&lt;用户2&gt;<br />
其中，1个用户组可以包含1个或多个用户，用户间以逗号分隔。</div>
<div>版本库目录格式：<br />
[&lt;版本库&gt;:/项目/目录]<br />
@&lt;用户组名&gt; = &lt;权限&gt;<br />
&lt;用户名&gt; = &lt;权限&gt;</div>
<div>　　其中，方框号内部分可以有多种写法:<br />
/,表示根目录及以下。根目录是svnserve启动时指定的，我们指定为/opt/svndata。这样，/就是表示对全部版本库设置权限。<br />
repos1:/,表示对版本库1设置权限<br />
repos2:/occi, ,表示对版本库2中的occi项目设置权限<br />
repos2:/occi/aaa, ,表示对版本库2中的occi项目的aaa目录设置权限</div>
<div>　　权限主体可以是用户组、用户或*，用户组在前面加@，*表示全部用户。权限可以是w、r、wr和空，空表示没有任何权限。</div>
<div>示例：<br />
[groups]<br />
admin = alan</div>
<div>[/]<br />
@admin = rw</div>
<div>[repos1:/occi/aaa]<br />
king = rw</div>
<div>[repos2:/pass]<br />
king =</div>
<div>删除无用文件:<br />
rm /opt/svndata/repos1/conf/authz<br />
rm /opt/svndata/repos1/conf/passwd<br />
rm /opt/svndata/repos2/conf/authz<br />
rm /opt/svndata/repos2/conf/passwd</div>
<div>3. 启动svn<br />
建立启动svn的用户:<br />
useradd svn<br />
passwd svn<br />
根据提示为用户svn设置密码</div>
<div>允许用户svn访问版本库:<br />
chown &#8211;R svn:svn /opt/svndata<br />
chown &#8211;R svn:svn /opt/data</div>
<div>启动svn：<br />
su - svn -c "svnserve -d --listen-port 9999 -r /opt/svndata"</div>
<div>其中：<br />
su &#8211; svn表示以用户svn的身份启动svn<br />
-d表示以daemon方式（后台运行）运行<br />
--listen-port 9999表示使用9999端口，可以换成你需要的端口。但注意，使用1024以下的端口需要root权限<br />
-r /opt/svndata指定根目录是/opt/svndata</div>
<div>检查:<br />
ps &#8211;ef|grep svnserve</div>
<div>如果显示如下，即为启动成功：<br />
svn　　　 6941　　 1　0 15:07 ?　　　　00:00:00 svnserve -d --listen-port 9999 -r /opt/svndata</div>
<div>参考资料：<br />
<a href="http://www.gbunix.com/htmldata/2006_07/15/27/article_1337_1.html"><font color="#111133">http://www.gbunix.com/htmldata/2006_07/15/27/article_1337_1.html</font></a><br />
<a href="http://www.iusesvn.com/bbs/thread-157-1-1.html"><font color="#111133">http://www.iusesvn.com/bbs/thread-157-1-1.html</font></a><br />
<a href="http://16hot.blog.isyi.com/post/1/552"><font color="#111133">http://16hot.blog.isyi.com/post/1/552</font></a></div>
<div><br />
检测服务是否开启：netstat -ntlp如果看到3690的端口正常开放了，证明SVN启动了。]<br />
下面是机器上的端口显示:<br />
Active Internet connections (only servers)<br />
Proto Recv-Q Send-Q Local Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foreign Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PID/Program name<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:32769&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2611/rpc.statd<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2591/portmap<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2827/xinetd<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:631&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4860/cupsd<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2846/sendmail: acce<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::3690&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :::*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5513/svnserve<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :::*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2812/sshd<br />
下面这个就是了:<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::3690&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :::*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5513/svnserve<br />
好了,svn已经架起来了</div>
<div>主页 | 照片 | 视频 | 收藏<br />
Onion的天空<br />
Live In ShangHai.Mon 7 Aug 2006在 Linux/Apache 2.2 上配置SVN服务器<br />
By Onion under Linux&nbsp;&nbsp; | Tag : Apache, Linux, svn, Ubuntu<br />
You can skip to the end and leave a response. Pinging is currently not allowed. <br />
准备，下载所需要文件.<br />
检查已安装的 Apache2 是否已经安装了 mod_dav .<br />
编译SVN，遇到的问题和解决方法<br />
使用 默认文件系统(fsfs) 保存数据<br />
使用 Berkeley DB 保存数据<br />
配置Apache和SVN，测试.<br />
其它小结<br />
从Windows平台上数据转移<br />
配置文件,使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息.<br />
基于路径的权限控制</div>
<div>常用SVN命令<br />
相关资源</div>
<div>* 准备，下载所需要文件.<br />
本文测试环境：</div>
<div>ubuntu 6.06 LTS (kernel 2.6.15-25-k7，gcc-4.0.3) /ubuntu server (2.6.15-26-server,gcc-4.0.4)<br />
Subversion 1.3.2</div>
<div>Apache 2.2.2</div>
<div>最新的版本 Subversion 可以在这里找到 ：<a href="http://subversion.tigris.org/project_packages.html"><font color="#111133">http://subversion.tigris.org/project_packages.html</font></a></div>
<div>* 检查已安装的 Apache2 是否已经安装了 mod_dav .<br />
如果已经成功安装了Apache，使用 httpd -M 来查看有没有安装 dav_module，如果没有的话 必须附加 &#8216;&#8211;enable-dav&#8217; &#8216;&#8211;enable-dav-fs&#8217; 两个参数重新编译 Apache，否则即使编译通过了svn,apache也会启动不起来.</div>
<div>如何编译 Apache 请参考我另外一篇文章.</div>
<div>* 编译SVN，遇到的问题和解决方法.<br />
使用默认的文件系统保存数据.<br />
最终完整通过安装和测试的编译参数为：</div>
<div>./configure --with-apxs=/usr/local/apache2/bin/apxs \<br />
--with-apr=/home/src/server/httpd-2.2.2/srclib/apr \<br />
--with-apr-util=/home/src/server/httpd-2.2.2/srclib/apr-util</div>
<div>make<br />
make install</div>
<div>其中 /home/src/server/ 为 httpd-2.2.2 源代码所在文件夹，根据实际情况调整一下.</div>
<div>◆ 遇到问题：</div>
<div>1) --with-apr 和 --with-apr-util 如果没有加上的话，即使编译成功了也会出现</div>
<div>Can&#8217;t set position pointer in file &#8216;/home/svn/repos/db/revs/0&#8242;: Invalid argument<br />
这样的错误提示.</div>
<div>2) 暂时不能使用 Berkeley DB [* 已解决]</div>
<div>svn保存文件更新数据库的方法有两个，一种是直接使用 fs (filesystem)来保存,另一种是通过Oracle提供支持的开源数据库 Berkeley DB 进行保存。但是如果加上 &#8211;with-berkeley-db=/usr/local/BerkeleyDB.4.4 就会configure时就会报错.</div>
<div>configure: error: APR-UTIL was installed independently, it won&#8217;t be<br />
possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4</div>
<div>我想 apr-unit 暂时不支持吧，我们就用默认的fs好了.</div>
<div>3) 在make 的时候可能会遇到缺少 srclib/apr/libapr-1.la，srclib/apr-util/libaprutil-1.la 两个文件，找不到而make error.</div>
<div>解决办法：/usr/local/apache2/lib/ 中找到，将其复制到源代码文件夹相应的位置中.</div>
<div>Update!!</div>
<div>使用 BerkeleyDB 保存数据.<br />
1) 安装 BerkeleyDB</div>
<div>cd /usr/local/src<br />
wget <a href="http://downloads.sleepycat.com/db-4.3.29.tar.gz"><font color="#111133">http://downloads.sleepycat.com/db-4.3.29.tar.gz</font></a></div>
<div>tar xzvf db-4.3.29.tar.gz<br />
cd /usr/local/src/db-4.3.29/build_unix<br />
../dist/configure --enable-compat185<br />
make<br />
make install</div>
<div>2) 更新apr和apr-util源代码</div>
<div># 清理编译后的.la文件<br />
cd /usr/local/src/httpd-2.2.3</div>
<div>make clean</div>
<div>cd /usr/local/src/subversion-1.3.2<br />
rm -rf apr<br />
rm -rf apr-util<br />
cp -rf /usr/local/src/httpd-2.2.3/srclib/apr ./<br />
cp -rf /usr/local/src/httpd-2.2.3/srclib/apr-util/ ./</div>
<div>3) 编译安装</div>
<div>./configure --with-apxs=/usr/local/apache2/bin/apxs \<br />
--with-berkeley-db=/usr/local/BerkeleyDB.4.3 \<br />
--with-ssl<br />
make<br />
make install<br />
◆ 遇到问题：<br />
1) BerkeleyDB 版本不能大于 4.3.否则同样会出现以下错误.</div>
<div>configure: error: APR-UTIL was installed independently, it won&#8217;t be<br />
possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4<br />
主要是apr-util 暂时不支持4.4的版本.</div>
<div>2) 必须更新apr，apr-util 源代码.<br />
subversion-1.3.2 自带的 apr-util 的版本是0.9.6的,必须升级为 1.2.7 虽然能编译过去。但在 svn checkout 的时候会提示</div>
<div>svn: REPORT request failed on &#8216;/!svn/vcc/default&#8217;<br />
svn: REPORT of &#8216;/!svn/vcc/default&#8217;: Could not read status line: connection was closed by server.<br />
这个问题困扰了我很长时间，Google和官方论坛都无结果。后来昨天竟然自己无意中解决了，感动的得哭了:)</div>
<div>* 配置Apache和SVN，测试<br />
成功编译svn后会在 httpd.conf 中自动加上</div>
<div>LoadModule dav_svn_module modules/mod_dav_svn.so<br />
LoadModule authz_svn_module modules/mod_authz_svn.so<br />
两个模块，没有的话，自行加上或检测是否真的编译成功.</div>
<div>假设我们现在要将一个名为 Lair 的项目导入到 SVN中</div>
<div>1). Apache的配置</div>
<div>在 conf/httpd.conf 或 conf/extra/httpd-vhosts.conf 中加入</div>
<div>&lt;Location /svn/Lair&gt;</div>
<div>DAV svn<br />
SVNPath /home/svn/Lair<br />
&lt;/Location&gt;</div>
<div>可以参考以下apache的配置，实现数据加密传输，用户身份验证.</div>
<div>Listen 443</div>
<div>AddType application/x-x509-ca-cert .crt<br />
AddType application/x-pkcs7-crl .crl.</div>
<div>SSLPassPhraseDialog exec:/etc/sendsslpwd<br />
SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_scache(512000)<br />
SSLSessionCacheTimeout 300<br />
SSLMutex file:/usr/local/apache2/logs/ssl_mutex</div>
<div>&lt;VirtualHost _default_:443&gt;<br />
DocumentRoot /var/SVNRoot<br />
ServerName svn.yousite.com:443<br />
ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#101;&#98;&#109;&#97;&#115;&#116;&#101;&#114;&#64;&#121;&#111;&#117;&#115;&#105;&#116;&#101;&#46;&#99;&#111;&#109;"><font color="#111133">webmaster@yousite.com</font></a><br />
&lt;Location /&gt;</div>
<div>DAV svn<br />
SVNPath /var/SVNRoot<br />
AuthzSVNAccessFile /etc/svnserve.conf<br />
Satisfy Any<br />
AuthType Basic<br />
AuthName &#8220;yousite SVN Repository&#8221;<br />
AuthUserFile /etc/httpd-passwords.txt<br />
Require valid-user</div>
<div>&lt;/Location&gt;<br />
SSLEngine on<br />
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br />
SSLCertificateFile /etc/ssl/server.crt<br />
SSLCertificateKeyFile /etc/ssl/server.key</div>
<div>&lt;/VirtualHost&gt;</div>
<div>更详细的配置说明文档 <a href="http://svnbook.red-bean.com/nightly/en/svn.ref.mod_dav_svn.conf.html"><font color="#111133">http://svnbook.red-bean.com/nightly/en/svn.ref.mod_dav_svn.conf.html</font></a></div>
<div>2). 配置，并且测试SVN，</div>
<div>创建一个新用户,用了保存仓库.</div>
<div>useradd -m svn<br />
创建一个新模块</div>
<div>su daemon (apache是以daemon用户运行的,所以要切换身份，否则可能会报目录访问权限错误)<br />
svnadmin create --fs-type fsfs /home/svn/Lair<br />
导入原来的项目</div>
<div>svn import /var/www/Lair <a href="http://localhost/svn/Lair"><font color="#111133">http://localhost/svn/Lair</font></a> -m &#8216;Initial import&#8217;</div>
<div>重新建立工作目录</div>
<div>rm -rf /var/www/Lair (注意备份!!)<br />
svn checkout <a href="http://localhost/svn/Lair"><font color="#111133">http://localhost/svn/Lair</font></a><br />
测试打开 <a href="http://localhost/svn/Lair"><font color="#111133">http://localhost/svn/Lair</font></a></div>
<div>如能看到一个你项目录列表，说明您成功了。</div>
<div>* 其它小结<br />
■ 数据转移:</div>
<div>从 Windows 平台 SVN 服务器转移<br />
如果windows svn储存的格式也是dbd的话，直接将SVN的文件夹copy过来即可.然后<br />
执行 svnadmin recover /var/SVNRoot 检查一下数据库是否损坏.</div>
<div>最后注意权限,确保 db 目录下的所有文件可写。</div>
<div>chmod 755 db<br />
chmod 666 db/*<br />
否则checkout时出现以下错误，多数是因为文件或者目录权限问题引起的，可以尝试用 chown 或者 chmod 命令修改一下权限</div>
<div>&lt;m:human-readable errcode=&#8221;160029&#8243;&gt;</div>
<div>Could not open the requested SVN filesystem<br />
&lt;/m:human-readable&gt;</div>
<div>&lt;m:human-readable errcode=&#8221;13&#8243;&gt;<br />
Could not open the requested SVN filesystem<br />
&lt;/m:human-readable&gt;</div>
<div>另外一种方法没有测试过，原理大致和mysqldump一样，将svn导出为文本文件，然后重新导入，好处是可以避免因为存储格式不同而导致的数据转移困难。</div>
<div># dump data to file (assuming a repo @ c:\repo):</div>
<div>svnadmin dump c:\repo &gt; c:\repo.txt<br />
# Copy the file over to linux:<br />
mkdir /repo<br />
svnadmin create /repo<br />
svnadmin load /repo &lt; /repo.txt</div>
<div>■ 设置访问控制</div>
<div>当 httpd.conf 中 设置 AuthzSVNAccessFile 时，可以设置不同用户对不同目录的访问控制.以下是一个例子.</div>
<div>[groups]<br />
root = admin.root<br />
web = user1,user2<br />
soft = user3,user4</div>
<div>[/]<br />
@root = rw</div>
<div>[/www]</div>
<div>@web = rw</div>
<div>[/soft]<br />
@soft = rw</div>
<div>详细的说明文档：<a href="http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html"><font color="#111133">http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html</font></a></div>
<div>■ 配置文件，使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息(自动属性).</div>
<div>Windows : C:\Documents and Settings\%USERNAME%\Application Data\Subversion\config<br />
Linux : ~\.subversion\config</div>
<div>[miscellany]</div>
<div>enable-auto-props = yes<br />
[auto-props]<br />
*.php=svn:keywords=Id<br />
*.html=svn:keywords=Id</div>
<div>&gt;&gt; 关于自动属性的更高级讨论</div>
<div>■ 几条常用svn 命令<br />
svn update<br />
svn add &#8220;filename&#8221;<br />
svn commit</div>
<div>———————&#8211;<br />
Change Log:</div>
<div>2006-08-14 neon库subversion已经自带,不需要在单独安装,添加-with-ssl即可使用svn对ssl支持.<br />
2006-08-10 补充自动属性的说明.<br />
2006-08-08 加入关于目录访问验证的说明.<br />
2006-08-07 httpd,2.2.3测试依然有效，解决bdb数据库的支持问题，添加从Windows到Linux下的数据转移方案。<br />
2006-07-25 看到到.声仔对 Can&#8217;t set position pointer in file 另一种解决方案,我当时也测试了，好像没有成功。不想用apache源代码编译的朋友可以也测试一下<br />
</div>
<img src ="http://www.blogjava.net/i369/aggbug/153192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-16 11:13 <a href="http://www.blogjava.net/i369/articles/153192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一步一步架设自用svn服务器</title><link>http://www.blogjava.net/i369/articles/151220.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151220.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151220.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151220.html</trackback:ping><description><![CDATA[简单介绍如何在Windows平台通过TortoiseSVN搭建简单的自用svn文件管理服务器。<br />
&nbsp;<span style="font-family: 宋体">目的</span>：
<p style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt">1.架设基于Svnserve的服务器</p>
<p style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt">2.让Svnserve在Windows启动时，自动启动 &nbsp;</p>
<p style="margin-bottom: 14.15pt"><span></p>
<p></span>一，下载TortoiseSVN和Subversion软件</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">1.下载TortoiseSVN,当前最新的版本是1.4.4, 从这儿下载<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi?download">http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi?download</a></p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">2.安装</p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">3.重启</p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">4.下载Subversion，当前最新版是1.4.4，从这儿下载<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91%20.">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91%20.</a></p>
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">5.安装</p>
</div>
<p style="margin-bottom: 14.15pt">二，新建仓库<br />
&nbsp;&nbsp;&nbsp; 仓库是存放你的源代码文件等等的集散地。</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">1.在任意地方新建一个文件夹。譬如: d:"Repo. </p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">2.右击这个文件夹，选择TortoiseSVN-&gt;Create repository here &#8230; </p>
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">3.创建仓库结束&nbsp;</p>
</div>
<p style="margin-bottom: 14.15pt"><br />
三，架设Svnserver服务器<br />
&nbsp;&nbsp;&nbsp; Svnserver是Subversion自带的一个轻量级的服务器。<br />
&nbsp;&nbsp;&nbsp; 1. 启动Svnserver服务</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">1.Windows桌面，点击开始</p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">2.运行，键入cmd(打开一个dos窗口) </p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">3.键入svnserve.exe &#8211;daemon &#8211;root drive:"path"to"repository </p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">4.启动了一个svn服务器。</p>
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">5.这样你就可以从任何地方访问你的repository了,譬如svn co <a href="svn://192.168.0.1/test/trunk" rel="nofollow">svn://192.168.0.1/test/trunk</a>或者svn co <a href="svn://localhost/test/trunk" rel="nofollow">svn://localhost/test/trunk</a></p>
</div>
<p style="margin-bottom: 14.15pt">&nbsp;&nbsp;&nbsp; 2. 让Svnserver随Windows自动启动</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt"><span style="color: red">1.</span>sc create svnserve binpath= &#8220;C:"Program Files"Subversion"bin"svnserve.exe &#8211;service &#8211;root drive:"path"to"repository&#8221; displayname= &#8220;Subversion&#8221; depend= tcpip start= auto&nbsp;&nbsp; <span style="color: red">将C:"Program Files"Subversion"改为Subversion安装文件夹，将drive:"path"to"repository改为Repository所在文件夹。如果命令写错了，先sc delete svnserve，然后再写命令，否则会因为有相同的服务名，而无法创建成功</span></p>
</div>
<p style="margin-bottom: 14.15pt">&nbsp;&nbsp;&nbsp; 3. 控制Svnserver访问权限</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt"><span style="color: black">1.</span>让匿名访问可以读可以写：Repository所在位置下的conf目录，打开svnserve.conf,把[general]下的password-db = passwd前的注释去掉，<span style="color: red">注意要把空格也去掉。<span style="color: black">然后再在passwd文件里添加用户和用户名</span></span></p>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/151220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:54 <a href="http://www.blogjava.net/i369/articles/151220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA程序员不可不注意的编码规范作者: 周建东  日期: 2007-09-30 14:05</title><link>http://www.blogjava.net/i369/articles/151209.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:43:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151209.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151209.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151209.html</trackback:ping><description><![CDATA[<div class="Content-body" id="logcontent_462" style="table-layout: fixed; word-break: break-all"><strong><font size="5">一、规范存在的意义<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp; 应用编码规范对于软件本身和软件开发人员而言尤为重要，有以下几个原因：<br />
<br />
&nbsp;&nbsp;&nbsp; 1、好的编码规范可以尽可能的减少一个软件的维护成本 , 并且几乎没有任何一个软件，在其整个生命周期中，均由最初的开发人员来维护；<br />
<br />
&nbsp;&nbsp;&nbsp; 2、好的编码规范可以改善软件的可读性，可以让开发人员尽快而彻底地理解新的代码；<br />
<br />
&nbsp;&nbsp;&nbsp; 3、好的编码规范可以最大限度的提高团队开发的合作效率；<br />
<br />
&nbsp;&nbsp;&nbsp; 4、长期的规范性编码还可以让开发人员养成好的编码习惯，甚至锻炼出更加严谨的思维；<br />
<br />
<font size="5"><strong>二、命名规范<br />
<br />
</strong></font>&nbsp;&nbsp;&nbsp; <strong><font color="#0000ff" size="4">1、一般概念<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、尽量使用完整的英文描述符<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、采用适用于相关领域的术语<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、采用大小写混合使名字可读<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4、尽量少用缩写，但如果用了，必须符合整个工程中的统一定义<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 5、避免使用长的名字（小于 15 个字母为正常选择）<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 6、避免使用类似的名字，或者仅仅是大小写不同的名字<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 7、避免使用下划线（除静态常量等）<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#0000ff" size="4">2、标识符类型说明<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、包（ Package ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Package 的名字应该采用完整的英文描述符，都是由一个小写单词组成。并且包名的前缀总是一个顶级域名，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 通常是 com、edu、gov、mil、net、org 等；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： com.yjhmily.test<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、类（ Class ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 类名应该是个一名词，采用大小写混合的方式，每个单词的首字母大写。尽量保证类名简洁而富于描述。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 使用完整单词，避免缩写词 ( 除非工程内有统一缩写规范或该缩写词被更广泛使用，像 URL ， HTML)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： FileDescription<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、接口（ Interface ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 基本与 Class 的命名规范类似。在满足 Classd 命名规则的基础之上，保证开头第一个字母为 &#8221;I&#8221;，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 便于与普通的 Class区别开。其实现类名称取接口名的第二个字母到最后，且满足类名的命名规范；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： IMenuEngine<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4、枚举（ Enum ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 基本与 Class 的命名规范类似。在满足 Classd 命名规则的基础之上，保证开头第一个字母为 &#8221;E&#8221; ，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 便于与普通的 Class区别开。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： EUserRole<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 5、异常（ Exception ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 异常（ Exception ） 通常采用字母 e 表示异常，对于自定义的异常类，其后缀必须为 Exception<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： BusinessException<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 6、方法（ Method ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 方法名是一个动词，采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 方法名尽可能的描述出该方法的动作行为。返回类型为 Boolean 值的方法一般由&#8220; is &#8221;或&#8220; has &#8221;来开头<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： getCurrentUser() 、 addUser() 、 hasAuthority()<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 7、参数（ Param ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第一个单词的首字母小写，其后单词的首字母大写。参数量名不允许以下划线或美元符号开头，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 虽然这在语法上是允许的。参数名应简短且富于描述。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： public UserContext getLoginUser(String loginName);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 8、常量字段 （ Constants ）的命名<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 静态常量字段（ static final ） 全部采用大写字母，单词之间用下划线分隔；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： public static final Long FEEDBACK;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Long USER_STATUS;<br />
<br />
&nbsp;<strong><font color="#0000ff" size="4"><font color="#000000" size="5">三、注释规范<br />
</font></font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个很好的可遵循的有关注释的经验法则是：<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#ff0000">问问你自己，你如果从未见过这段代码，要在合理的时间内有效地明白这段代码，你需要一些什么信息？？？</font><br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<strong><font color="#0000ff" size="4"> 1、一般概念<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、注释应该增加代码的清晰度<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、保持注释的简洁<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、在写代码之前或同时写注释<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4、注释出为什么做了一些事，而不仅仅是做了什么<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#0000ff" size="4"><strong>2、注释哪些部分<br />
<br />
</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、Java 文件：必须写明版权信息以及该文件的创建时间和作者；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、类：类的目的、即类所完成的功能，以及该类创建的时间和作者名称；多人一次编辑或修改同一个类时，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 应在作者名称处出现多人的名称；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、接口： 在满足类注释的基础之上，接口注释应该包含设置接口的目的、它应如何被使用以及如何不被使用。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在接口注释清楚的前提下对应的实现类可以不加注释；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4、方法注释： 对于设置 (Set 方法 ) 与获取 (Get 方法 ) 成员的方法，在成员变量已有说明的情况下，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 可以不加注释；普通成员方法要求说明完成什么功能，参数含义是什么且返回值什么；另外方法的创建<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 时间必须注释清楚，为将来的维护和阅读提供宝贵线索；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 5、方法内部注释： 控制结构，代码做了些什么以及为什么这样做，处理顺序等，特别是复杂的逻辑处理部分，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 要尽可能的给出详细的注释；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 6、参数： 参数含义、及其它任何约束或前提条件；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 7、属性： 字段描述；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 8、局部 ( 中间 ) 变量： 无特别意义的情况下不加注释；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <strong><font color="#0000ff" size="4">3、注释格式<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遵循工程规定的统一注释格式，一般情况下会以 codetemplates.xml 格式的文件导入 IDE(Eclipse)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 或者用Eclipse默认的；<br />
<br />
<strong><font size="5">四、代码格式规范<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 遵循工程规定的统一代码格式，一般情况下直接使用 IDE(Eclipse) 自带的默认代码格式对代码进行格式化；<br />
<br />
<strong><font size="5">五、其他规范<br />
<br />
</font></strong><font size="4">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <strong><font color="#0000ff">JSP 文件命名</font></strong></font><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 采用完整的英文描述说明 JSP 所完成的功能，尽可能包括一个生动的动词，第一个字母小写，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： viewMessage.jsp 、editUser.jsp 等。<br />
<br />
<strong><font size="5">六、工程特有命名规范<br />
<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;&nbsp;</strong><font color="#0000ff" size="4"><strong> 1、持久层<br />
</strong><br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、 Hibernate 映射文件及实体<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 与数据库表名称完全对应；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： Advertisement.hbm.xml 、 Advertisement.java<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、数据访问 DAO<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DAO 接口和实现类名称必须完全符合正常接口和实现类的命名规则，且最后以 &#8221;DAO&#8221; 结尾<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DAO 内的数据访问方法必须足够抽象的描述出对数据库的基本 CRUD 操作；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： ICrossAdDAO( 接口 ) 、 CrossAdDAO( 实现类 )<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、各种操作数据库的 HQL 配置文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HQL 文件的个数原则上与系统的 Services 层的服务个数相等，且以服务名称命名 HQL 文件；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： resource.hbm.xml<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<font color="#0000ff" size="4"><strong>2、服务层<br />
</strong><br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、服务接口和实现<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 服务接口和实现类必须完全符合正常接口和实现类的命名规则；以工程定义的服务名为主体，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 并统一以 &#8221;Serv&#8221; 结尾<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： IResourceServ( 服务接口 ) 、 ResourceServ( 接口实现类 )<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、服务接口方法<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 方法名是一个动词，采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 方法名尽可能的描述出该方法的动作行为。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 返回类型为 Boolean 值：用&#8220; is &#8221;或&#8220; has &#8221;来开头<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 得到某数据： get+ 数据描述名词复数 + 数据类型；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 得到所有数据： get+All+ 数据描述名词复数 + 数据类型；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 通过 XXX 得到 / 查询某数据： get/query+ 数据描述名词复数 + 数据类型 +By+ 条件；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 添加某数据： save/add+ 数据描述名词 ()<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 更新某数据： save/update+ 数据描述名词；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 删除某数据： delete/remove+ 数据描述名词；<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、业务对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 业务名称 +BO<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4、查询参数对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 凡是继承 Abst***QuerySpec 的查询参数类全部满足以下规则：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Query+ 所要查询的数据描述名词 +Spec<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 作为参数传入时，参数名必须为：所要查询的数据描述名词 +Spec<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： QueryProgramSpec<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<strong><font color="#0000ff" size="4">3、MVC 层</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、Action 控制层<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Action 类名：功能模块名称 +Action ；<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Actoin 方法名称尽可能的描述出页面迁移的去向<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： LoginAction( 登录用 action) ， toWelcome( 转向欢迎页的 action 方法 )<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、资源文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 系统全局资源文件： globalMessages_+ 字符编码类型 +.properties<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 功能模块内部的资源文件： package.properties<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong> 4、Spring 配置文件<br />
<br />
</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、Action 相关配置文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 文件目录： WebRoot/WEB-INF/spring/action/ 功能模块名称 +_ApplicationContext.xml<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2、Services 相关配置文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 文件目录： WebRoot/WEB-INF/spring/services/Services_ApplicationContext.xml<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3、全局性配置文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 文件目录： WebRoot/WEB-INF/spring/工程名+_ApplicationContext.xml<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<font color="#0000ff" size="4"><strong>5、JSP 文件<br />
</strong></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 采用完整的英文描述说明 JSP 所完成的功能，尽可能包括一个生动的动词，第一个字母小写，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如： viewMessage.jsp 、editUser.jsp 等。 </div>
<div class="Content-body"><img style="margin: 0px 2px -4px 0px" alt="" src="file:///C:/Documents%20and%20Settings/ljw/My%20Documents/My%20Pictures/JAVA程序员不可不注意的编码规范%20-%20基础知识%20-%20周老师科研站.files/icon_trackback.gif" /><strong>引用通告地址:</strong> <span id="tbURL" title="点击复制到剪贴板" style="cursor: pointer" onclick="CopyText(document.all.tbURL)">http://tmsoft.lsxy.com/trackback.php?tbID=462&amp;extra=f85ca6</span><br />
</div>
<img src ="http://www.blogjava.net/i369/aggbug/151209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:43 <a href="http://www.blogjava.net/i369/articles/151209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GB2312汉字笔画解析</title><link>http://www.blogjava.net/i369/articles/151208.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 