﻿<?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 Oct 2007 00:41:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151208.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151208.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151208.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //GB2312汉字笔画解析&nbsp;public&nbsp;class&nbsp;CnToStrokeCount&nbsp;{&nbsp;/**&nbsp;&nbsp;*&nbsp;@param&nbsp;args&nbsp;&nbsp;*/&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/151208.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/151208.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:41 <a href="http://www.blogjava.net/i369/articles/151208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DisplayTag了解(都是转的)</title><link>http://www.blogjava.net/i369/articles/151040.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 08 Oct 2007 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151040.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151040.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151040.html</trackback:ping><description><![CDATA[<p align="center"><strong style="font-size: 18pt">DisplayTag应用指南</strong></p>
【摘 要】<span class="checkoutHeader"><strong>本文详细介绍Web开发设计中的：DisplayTag应用指南，DisplayTag是一个非常好用的表格显示标签，适合MVC模式。</strong></span><br />
<br />
<p>　DisplayTag是一个非常好用的表格显示标签，适合MVC模式，其主页在http://displaytag.sourceforge.net<br />
　　 <br />
　　 <strong>一、最简单的情况，未使用&lt;display:column/&gt;标签</strong><br />
　　 <br />
　　 &lt;%request.setAttribute( "test", new ReportList(6) );%&gt;<br />
　　 &lt;display:table name="test" /&gt;<br />
　　 <br />
　　 标签遍历List里的每一个对象，并将对象里的所有属性显示出来。一般用于开发的时候检查对象数据的完整性。<br />
　　 <br />
　　 <strong>二、使用&lt;display:column/&gt;标签的情况</strong><br />
　　 <br />
　　 &lt;display:table name="test"&gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="name" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;display:column property="description" title="Comments"/&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 property对应List里对象的属性（用getXXX()方法取得），title则对应表格表头里的列名。定义列有两种方式：<br />
　　 <br />
　　 A、&lt;display:column property="email" /&gt;<br />
　　 <br />
　　 使用&lt;display:column/&gt;标签里的property属性来定义<br />
　　 <br />
　　 B、&lt;display:column title="email"&gt;email@it.com&lt;/display:column&gt;<br />
　　 <br />
　　 在&lt;display:column/&gt;标签体里增加内容，可以是常量，也可以用其他标签等等<br />
　　 <br />
　　 两种方式比较，用property属性来定义更加快速和利于排序。<br />
　　 <br />
　　 <strong>三、表格显示样式的定义</strong><br />
　　 <br />
　　 A、在&lt;display:table/&gt;和&lt;display:column/&gt;标签里指定标准的html属性，烦琐<br />
　　 <br />
　　 B、修改样式表<br />
　　 &lt;display:table name="test" class="mars"&gt;<br />
　　 &lt;display:column property="id" title="ID" class="idcol"/&gt;<br />
　　 &lt;display:column property="name" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" class="tableCellError" /&gt;<br />
　　 &lt;display:column property="description" title="Comments"/&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 通过class属性来指定所要应用的样式。可以在其默认样式表里（./css/screen.css）直接修改<br />
　　 <br />
　　 <strong>四、标签取得数据的数据源</strong><br />
　　 <br />
　　 有四种范围<br />
　　 <br />
　　 pageScope<br />
　　 requestScope (默认)　&lt;display:table name="test2" &gt;<br />
　　 sessionScope　&lt;display:table name="sessionScope.holder.list" &gt; 注意，这里要指定范围，非默认<br />
　　 applicationScope<br />
　　 <br />
　　 <strong>五、通过增加id属性创建隐含的对象</strong><br />
　　 <br />
　　 &lt;display:table name="test" id="testit"&gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="name" /&gt;<br />
　　 &lt;display:column title="static value"&gt;static&lt;/display:column&gt;<br />
　　 &lt;display:column title="row number (testit_rowNum)"&gt;&lt;%=pageContext.<br />
getAttribute("testit_rowNum")%&gt;&lt;/display:column&gt;<br />
　　 &lt;display:column title="((ListObject)testit).getMoney()"&gt;<br />
&lt;%=((ListObject)pageContext.<br />
getAttribute("testit")).getMoney()%&gt;&lt;/display:column&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 注意到在&lt;display:table/&gt;里增加了id属性，这时就在page context里创建了一个隐含对象，指向List里的当前对象，<br />
　　 <br />
　　 可以通过(ListObject)pageContext.getAttribute("id")来捕获这个对象。同时还创建了一个id_rowNum对象，同样，可<br />
　　 <br />
　　 通过pageContext.getAttribute("testit_rowNum")来捕获，它仅仅代表当前行的行数。<br />
　　 <br />
　　 有了这两个隐含对象，就可以通过其他标签来访问，例如Jstl:<br />
　　 <br />
　　 &lt;display:table id="row" name="mylist"&gt;<br />
　　 &lt;display:column title="row number" &gt;<br />
　　 &lt;c:out value="${row_rowNum}"/&gt;<br />
　　 &lt;/display:column&gt;<br />
　　 &lt;display:column title="name" &gt;<br />
　　 &lt;c:out value="${row.first_name}"/&gt;<br />
　　 &lt;c:out value="${row.last_name}"/&gt;<br />
　　 &lt;/display:column&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 <strong>六、显示部分数据</strong><br />
　　 <br />
　　 显示开始五条数据：通过设定length属性<br />
　　 <br />
　　 &lt;display:table name="test" length="5"&gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 显示第三到第八条数据：通过设定offset和length属性<br />
　　 <br />
　　 &lt;display:table name="test" offset="3" length="5"&gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 <strong>七、对email和url地址的直接连接</strong><br />
　　 <br />
　　 &lt;display:table name="test" &gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="email" autolink="true" /&gt;<br />
　　 &lt;display:column property="url" autolink="true" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 如果要显示的对象里包含email和url地址，则可以在display:column里直接设定autolink="true"来直接连接<br />
　　 <br />
　　 <strong>八、使用装饰模式转换数据显示（写自己的 decorator ）</strong><br />
　　 <br />
　　 A、对整个表格应用decorator<br />
　　 <br />
　　 &lt;display:table name="test" decorator="org.displaytag.sample.Wrapper" &gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;display:column property="date" /&gt;<br />
　　 &lt;display:column property="money" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 org.displaytag.sample.Wrapper即自己写的decorator，它要继承TableDecorator类，看看它的一个方法：<br />
　　 public String getMoney()<br />
　　 {<br />
　　 return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney());<br />
　　 }<br />
　　 <br />
　　 很明显，它通过父类的getCurrentRowObject()方法获得当前对象，然后对其getMoney()方法进行&#8216;油漆&#8217;<br />
　　 <br />
　　 B、对单独的column应用decorator<br />
　　 <br />
　　 &lt;display:table name="test"&gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;display:column property="date" decorator="org.displaytag.sample.LongDateWrapper" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口，它的方法：<br />
　　 public final String decorate(Object columnValue)<br />
　　 {<br />
　　 Date date = (Date) columnValue;<br />
　　 return this.dateFormat.format(date);<br />
　　 }<br />
　　 <br />
　　 显然，它获得不了当前对象（因为它实现的是接口），仅仅是获得该对象的columnValue，然后&#8216;油漆&#8217;<br />
　　 <br />
　　 <strong>九、创建动态连接</strong><br />
　　 <br />
　　 有两种方法创建动态连接：<br />
　　 <br />
　　 A、在&lt;display:column/&gt;里通过增加href、paramId、paramName、paramScope、paramProperty属性<br />
　　 <br />
　　 href　　　　　　 基本的URL 地址<br />
　　 paramId　　　　　加在URL 地址后的参数名称<br />
　　 paramName　　　　数据bean的名称，一般为null（即使用当前List里的对象）<br />
　　 paramScope　　　 数据bean的范围，一般为null<br />
　　 paramProperty　　数据bean的属性名称，用来填充URL 地址后的参数值<br />
　　 &lt;display:table name="sessionScope.details"&gt;<br />
　　 &lt;display:column property="id" title="ID" href="details.jsp" paramId="id" /&gt;<br />
　　 &lt;display:column property="email" href="details.jsp" paramId="action" <br />
paramName="testparam" paramScope="request" /&gt;<br />
　　 &lt;display:column property="status" href="details.jsp" <br />
paramId="id" paramProperty="id" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 这种方法简便直接，但缺点是无法产生类似details.jsp?id=xx&amp;action=xx的复合URL<br />
　　 <br />
　　 B、应用decorator 创建动态连接：<br />
　　 <br />
　　 &lt;display:table name="sessionScope.details" decorator=<br />
"org.displaytag.sample.Wrapper" &gt;<br />
　　 &lt;display:column property="link1" title="ID" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="link2" title="Actions" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 org.displaytag.sample.Wrapper里的方法：<br />
　　 public String getLink1()<br />
　　 {<br />
　　 ListObject lObject= (ListObject)getCurrentRowObject();<br />
　　 int lIndex= getListIndex();<br />
　　 return "&lt;a href=\"details.jsp?index=" + lIndex + "\"&gt;"<br />
+ lObject.getId() + "&lt;/a&gt;";<br />
　　 }<br />
　　 <br />
　　 public String getLink2()<br />
　　 {<br />
　　 ListObject lObject= (ListObject)getCurrentRowObject();<br />
　　 int lId= lObject.getId();<br />
　　 <br />
　　 return "&lt;a href=\"details.jsp?id=" + lId<br />
　　 + "&amp;action=view\"&gt;View&lt;/a&gt; | "<br />
　　 + "&lt;a href=\"details.jsp?id=" + lId<br />
　　 + "&amp;action=edit\"&gt;Edit&lt;/a&gt; | "<br />
　　 + "&lt;a href=\"details.jsp?id=" + lId<br />
　　 + "&amp;action=delete\"&gt;Delete&lt;/a&gt;";<br />
　　 }<br />
　　 <br />
　　 <strong>十、分页</strong><br />
　　 <br />
　　 实现分页非常的简单，增加一个pagesize属性指定一次想显示的行数即可<br />
　　 <br />
　　 &lt;display:table name="sessionScope.test" pagesize="10"&gt;<br />
　　 &lt;display:column property="id" title="ID" /&gt;<br />
　　 &lt;display:column property="name" /&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 <strong>十一、排序</strong><br />
　　 <br />
　　 排序实现也是很简单，在需要排序的column里增加sortable="true"属性，headerClass="sortable"仅仅是<br />
　　 <br />
　　 指定显示的样式。column里的属性对象要实现Comparable接口，如果没有的话可以应用decorator<br />
　　 <br />
　　 defaultsort="1"　　　　　　　默认第一个column排序<br />
　　 defaultorder="descending"　　默认递减排序<br />
　　 &lt;display:table name="sessionScope.stest" defaultsort="1" <br />
defaultorder="descending"&gt;<br />
　　 &lt;display:column property="id" title="ID" sortable="true" <br />
headerClass="sortable" /&gt;<br />
　　 &lt;display:column property="name" sortable="true" headerClass="sortable"/&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" sortable="true" headerClass="sortable"/&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 注意的是，当同时存在分页时排序仅仅针对的是当前页面，而不是整个List都进行排序<br />
　　 <br />
　　 <strong>十二、column 分组</strong><br />
　　 <br />
　　 分组只是需要在column里增加group属性<br />
　　 <br />
　　 &lt;display:table name="test" class="simple"&gt;<br />
　　 &lt;display:column property="city" title="CITY" group="1"/&gt;<br />
　　 &lt;display:column property="project" title="PROJECT" group="2"/&gt;<br />
　　 &lt;display:column property="amount" title="HOURS"/&gt;<br />
　　 &lt;display:column property="task" title="TASK"/&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 <strong>十三、导出数据到其他格式（页面溢出filter??）</strong><br />
　　 <br />
　　 在&lt;display:table/&gt;里设定export="true"<br />
　　 <br />
　　 在&lt;display:column/&gt;里设定media="csv excel xml pdf" 决定该字段在导出到其他格式时被包不包含，不设定则都包含<br />
　　 <br />
　　 &lt;display:setProperty name="export.csv" value="false" /&gt;<br />
　　 <br />
　　 决定该种格式能不能在页面中导出<br />
　　 <br />
　　 &lt;display:table name="test" export="true" id="currentRowObject"&gt;<br />
　　 &lt;display:column property="id" title="ID"/&gt;<br />
　　 &lt;display:column property="email" /&gt;<br />
　　 &lt;display:column property="status" /&gt;<br />
　　 &lt;display:column property="longDescription" <br />
media="csv excel xml pdf" title="Not On HTML"/&gt;<br />
　　 &lt;display:column media="csv excel" title="URL" property="url"/&gt;<br />
　　 &lt;display:setProperty name="export.pdf" value="true" /&gt;<br />
　　 &lt;display:setProperty name="export.csv" value="false" /&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 <strong>十四、配置属性，覆盖默认</strong><br />
　　 <br />
　　 两种方法：<br />
　　 <br />
　　 A、在程序classpath下新建displaytag.properties文件<br />
　　 <br />
　　 B、对于单个表格，应用&lt;display:setProperty&gt;标签<br />
　　 <br />
　　 具体可配置的属性：http://displaytag.sourceforge.net/configuration.html<br />
　　 <br />
　　 <strong>十五、一个完整的例子</strong><br />
　　 <br />
　　 &lt;display:table name="test" export="true" sort="list" pagesize="8"&gt;<br />
　　 &lt;display:column property="city" title="CITY" group="1" <br />
sortable="true" headerClass="sortable"/&gt;<br />
　　 &lt;display:column property="project" title="PROJECT"<br />
group="2" sortable="true" headerClass="sortable"/&gt;<br />
　　 &lt;display:column property="amount" title="HOURS"/&gt;<br />
　　 &lt;display:column property="task" title="TASK"/&gt;<br />
　　 &lt;/display:table&gt;<br />
　　 <br />
　　 sort="list" 对整个list进行排序<br />
　　 <br />
　　 导出数据到其他格式时，group无效 <br />
<br />
=====================第二篇===================================<br />
</p>
<h4 class="TextColor1" id="subjcns!4310F6ED266D455D!235" style="margin-bottom: 0px" align="center"><span style="font-size: 18pt">DisplayTag七宗罪</span></h4>
<div class="bvMsg">最近比较乱,很长时间没更新空间了,正好今天有话题,准备更新下^_^</div>
<div class="bvMsg">Display Tag Lib是一个标签库,主要用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等,而且使用起来非常的方便,能够大大减少代码量.</div>
<div class="bvMsg">记得有N多朋友问过分页问题如何可以更加方便、快速的处理,我的回答好象每次都是"DisplayTag",然后步骤相同的向朋友讲它有什么功能、能减少多少编码量、发文档、如何看war例子.以至于当时都想把操作过程录下来,来降低我的口水消耗量.</div>
<div class="bvMsg">俗话说得好"路遥知马力",经过不断的使用,感觉DisplayTag"肾虚"了,问题与缺陷越来越多.现在还在使用它的朋友,如果已经放弃不用,那么就别浪费时间看这个了;如果还在使用的朋友,最好能看看我总结的DisplayTag罪状,倒能弥补些缺陷,不至于问题出现时记恨在下.呵呵.</div>
<div class="bvMsg">1.中文翻页、排序问题:对于中文无法翻页、排序,最简单的办法是修改Tomcat下的server.xml文件.找到HTTP的Connector标签,在里面添加一项URIEncoding="...",引号里面的内容取决于你的页面编码,比如可以是GBK,UTF-8等.</div>
<div class="bvMsg">2.分页数据加载问题:DisplayTag的分页机制是这样的,它把所有的数据放入集合中,然后再进行分页处理.这样在数据量比较大的情况下,很容易造成性能下降或者内存超支等问题.目前解决方法有两个,一是在&lt;displaytag&gt;中增加两个属性：partialList="true"size="resultSize",每次只加再当前页数据.还有就是实现 org.displaytag.pagination.PaginatedList接口,自定义分页算法.个人推荐第二种,详细的实现方法可参考DisplayTag 1.1所带的例子.<br />
PS:第二种方法还不完善,DisplayTag中仍存在一些Bug.</div>
<div class="bvMsg">3.导出中文Excel问题:当导出中文列表名和中文表格数据Excel时,会产生乱码现象.<br />
解决:<br />
更改配置文件displaytag.properties,使用displaytag-export-poi.jar包.更改export.excel.class=org.displaytag.export.ExcelView为export.excel.class=org.displaytag.excel.ExcelHssfView,这样可以解决中文表格数据的问题.对于中文列表名乱码的问题,必须更改org.displaytag.excel.ExcelHssfView源代码:</div>
<div class="bvMsg">old:<br />
HSSFCell cell = xlsRow.createCell((short) colNum++);<br />
cell.setCellValue(columnHeader);<br />
cell.setCellStyle(headerStyle);<br />
cell.setEncoding(HSSFCell.ENCODING_UTF_16);</div>
<div class="bvMsg">new:<br />
HSSFCell cell = xlsRow.createCell((short) colNum++);<br />
cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
cell.setCellValue(columnHeader);<br />
cell.setCellStyle(headerStyle);</div>
<div class="bvMsg">还有一种通过修改编码方式来支持中文的方法,那就是将org.displaytag.export.ExcelView.java中的getMimeType()方法内容修改为return "application/vnd.ms-excel;charset=GB2312";但是这样修改后,导出速度将会非常慢,呵呵.</div>
<div class="bvMsg">4.decorator内容无法导出问题和Html标签导出问题:如果对table进行了decorator,那么decorator后的内容将无法导出.目前此问题无法解决.所以最好不用decorator.如果显示的内容使用了html标签进行了修饰,那么它会将html标签一起导出.也是没有什么好的解决方法.</div>
<div class="bvMsg">5.导出Excel兼容性问题:有时会出现兼容性问题,导出的Excel在Office 2003下打不开.<br />
PS:导出问题不少,尤其是Excel.建议使用Apache POI自己实现Excel的导出.</div>
<div class="bvMsg">6.同页面使用多个displayTag翻页问题.DisplayTag翻页时,页面上所有的displayTag元素都翻页.解决办法:对页面中的每个表格,先判断它的记录是否为0,如果为0则不使用DisplayTag.</div>
<div class="bvMsg">7.未知Bug比较多:正式发布版本总是存在很多Bug.在1.1版本发布时,居然分页算法出现了明显Bug,无语.</div>
<br />
======================第三篇=====================================<br />
<div class="tit" align="center"><strong style="font-size: 24pt">displayTag的应用</strong></div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="font5" style="display: none">&nbsp;</div>
            displayTag作为当前还算得上比较流行的表现层工具插件,在sourceForge官方网站(http://displaytag.sourceforge.net/)上，平均每天的访问量数以万计,本文是建立在实际开发过程中 <br />
            碰到的导出excel报表的实际需求，所获得的一些学习心得与技巧与大家分享. <br />
            默认的displayTag导出的Excel格式会有中文乱码，网上大部分文章都说只有改一下，org.displaytag.export.ExcelView类中， <br />
            public String getMimeType() <br />
            { <br />
            return "application/vnd.ms-excel"; //$NON-NLS-1$ <br />
            } <br />
            方法，在方法后面追加;chartset=gbk；其它不尽然，如果这样改的话在tomcat作为web服务端的话，如果列表中有中文，很慢很慢才会有导出(不过，我至今尚未在tomcat下导出过中文)， <br />
            把WEB应用布署在JBOSS下面，导出的话，如果数据量大的话也会有20-40秒不等,后来到displayTag的官网上，去看它的bugtrack，发现其实不尽然。其它displayTag如果在你需要导出excel并且想自已利用apache的 <br />
            POI的话，要再去到官方网上下载一个displaytag-export-poi-1.1.jar的包，详细操作请看http://displaytag.sourceforge.net/11/install.html <br />
            <br />
            其中里面谈到，如果，每次导出的excel数据总是有缓存的话，可以在web.xml文件中加入如下配置进行过滤，这样就可以导出实时数据了。 <br />
            Configure the Filter in your web.xml: <br />
            <br />
            &lt;filter&gt; <br />
            &lt;filter-name&gt;ResponseOverrideFilter&lt;/filter-name&gt; <br />
            &lt;filter-class&gt;org.displaytag.filter.ResponseOverrideFilter&lt;/filter-class&gt; <br />
            &lt;/filter&gt;And add mappings for the pages that you will intercept, for example: <br />
            <br />
            &lt;filter-mapping&gt; <br />
            &lt;filter-name&gt;ResponseOverrideFilter&lt;/filter-name&gt; <br />
            &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; <br />
            &lt;/filter-mapping&gt; <br />
            &lt;filter-mapping&gt; <br />
            &lt;filter-name&gt;ResponseOverrideFilter&lt;/filter-name&gt; <br />
            &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt; <br />
            &lt;/filter-mapping&gt; <br />
            <br />
            从以上内容来看，也只是告诉你，如果要用apache的最新的POI的话，需要把displaytag-export-poi-1.1.jar从官网下载下来，放入你的工程文件中， <br />
            并没有说如何调用写自己的所需的excel的报表格式.下面就实际问题，来讨论一下如何让displayTag导出自己所需的excel格式. <br />
            在displayTag所提供的接口类中，导出自已所需的Excel有两种方式，一种是通过指定的excel模板，一种是对excel的所有的格子，一个个样式的处理， <br />
            后一种方式完全体现了&#8220;慢工出细活&#8221;的格言，而前一种方式实现起来显然要好用得多,只用读模板的样式就行了。如何调用displayTag对导出自定制的Excel文件 <br />
            所提供的接口呢，请看下文，（不要急噢!^_^） <br />
            要调用displayTag给Poi所提供的接口操作步骤如下： <br />
            1，先要在你的appfuse工程中新建一个类，让其实现org.displaytag.export.BinaryExportView接口，其中关键的方法是 <br />
            public void doExport(OutputStream out) throws JspException { <br />
            String captionvalue = this.model.getCaption(); <br />
            // ExcelHssfView1 tempExcelView=new ExcelHssfView1(); <br />
            // try { <br />
            // BeanUtils.setProperty(tempExcelView, "action",captionvalue); <br />
            // } catch (IllegalAccessException e) { <br />
            // // TODO Auto-generated catch block <br />
            // e.printStackTrace(); <br />
            // } catch (InvocationTargetException e) { <br />
            // // TODO Auto-generated catch block <br />
            // e.printStackTrace(); <br />
            // } <br />
            if (captionvalue != null) { <br />
            captionvalue = captionvalue.replaceAll("(\\r)|(\\n)|(\\t)", ""); <br />
            <br />
            doExportCommon(out); <br />
            <br />
            <br />
            } else { <br />
            System.out.println("exec Common"); <br />
            doExportCommon(out); <br />
            } <br />
            } <br />
            对这个方法按照你的POI的定制excel报表的的方法，然后实现它，再把内容写入outputStream中去，基本上就可以了，当然如果有上面的 <br />
            <br />
            this.model.getCaption()是读取displayTag的页面标签&lt;displayTag:caption/&gt;标签中的内容，可以在不同的JSP页面放入不同的caption的值 <br />
            从而判断调用不同的方法，生成不同的excel样式的报表，灵活性兼而有之. <br />
            写完以上类以后，最好先写个测试方法，用main或junit工具都成，看看你的调用poi的逻辑有没有问题。 <br />
            当以上的类及方法写完后，就要在你的appfuse工程中找displaytag.properties文件了,一般就在web/class/目录下，找到后，打开此文件，添加如下一段配置： <br />
            export.excel.class=org.displaytag.export.excel.ExcelHssfView1 <br />
            后面一段是你的新建的类的文件的路径 <br />
            因为是多国语言系统，所以最好把display_en.properties及display_zh_Cn.properties都加上. <br />
            到此就完成了，使用自己的POI来在appfuse中导出指定格式样式的excel文件.先别急噢，还有更精彩的等着你。这个时候又有一个问题来了，如果你 <br />
            页面想要显示某些列表字段列，而导出的excel文件中又不出现这样的字段，又该如何处理呢，嘿嘿，请接着看下文。 <br />
            如果要实现以上功能请如下操作： <br />
            1,调整页面上的displayTag标签的参数值，呵，比如: <br />
            <br />
            &lt;display:table name="testList" cellspacing="0" cellpadding="0" requestURI="" sort="list" <br />
            id="testList" pagesize="5" class="table testList" export="true" <br />
            defaultsort="1" defaultorder="descending" &gt; <br />
            &lt;display:caption media="excel"&gt;ExportByCommon&lt;/display:caption&gt; <br />
            &lt;display:column title="ID" sortable="true" media="html"&gt; <br />
            &lt;a href="/aaa.html?id=&lt;c:out value="${testList.id }" /&gt; " <br />
            target="operationFrame"&gt; <br />
            &lt;c:out value="${testList.id }" /&gt; <br />
            &lt;/a&gt; <br />
            <br />
            &lt;/display:column&gt; <br />
            &lt;display:column title="Status" sortable="true" media="html"&gt; <br />
            &lt;img src="&lt;c:out value="${testList.status}" /&gt;.gif" title="&lt;c:out value="Status:${testList.status}" /&gt;"&gt; <br />
            &lt;/display:column&gt; <br />
            <br />
            &lt;display:column property="remarks" escapeXml="true" sortable="true" <br />
            title="Remarks" style="word-wrap: break-word;word-break: break-all; width:90px;"/&gt; <br />
            &lt;display:footer media="excel"&gt; <br />
            &lt;c:out value="${aa }"&gt;&lt;/c:out&gt;| <br />
            &lt;c:out value="(${bb })"&gt;&lt;/c:out&gt;| <br />
            &lt;c:out value="${currentDate }"&gt;&lt;/c:out&gt; <br />
            &lt;/display:footer&gt; <br />
            &lt;display:setProperty name="item_name" value="Info"/&gt; <br />
            &lt;display:setProperty name="items_name" value="Infos"/&gt; <br />
            &lt;display:setProperty name="export.excel" value="true" /&gt; <br />
            &lt;display:setProperty name="export.excel.filename" value="&lt;%=exportFileName%&gt;"/&gt; <br />
            &lt;display:setProperty name="export.csv" value="false" /&gt; <br />
            &lt;display:setProperty name="export.xml" value="false" /&gt; <br />
            &lt;display:setProperty name="export.pdf" value="false" /&gt; <br />
            &lt;/display:table&gt; <br />
            &lt;/form&gt; <br />
            注意上面用了多种配置需求，可以自已加链接，自定义导出名，自定义表头表尾，自定义是否全排序，自定义样式等，这些网上都有，就不细说了， <br />
            关键的需求点media的配置参数噢，如果media="excel"表示只在excel中显示，如果media=html表示仅在页面出现，没有此参数是两个都显示噢 <br />
            其它的格式也类同设置，到此displayTag的点点心得分享与大家完毕，谢谢大家花费时间分享我的快乐！^_^ <br />
            噢，上文提到中文问题，用POI后就解决了！ </td>
        </tr>
    </tbody>
</table>
<p align="left"><br />
==============================第四篇=============================<br />
<span style="font-size: 24pt"><strong>displaytag-1.1.1之中文（乱码）解决方案<br />
<span style="font-size: 12pt"><strong>1，displaytag页面的汉化：<br />
<span style="color: rgb(255,0,255)">把displaytag.properties考到项目里，同时复制一份displaytag.properties，修改文件名displaytag_zh_CN.properties，把文件里面的对应条目改成中文即可</span>；<br />
同时，文件里的对应两条配置注意选择合适的使用，下面是struts的配置<br />
<span style="color: rgb(255,0,255)">locale.provider=org.displaytag.localization.I18nStrutsAdapter</span><br style="color: rgb(255,0,255)" />
<span style="color: rgb(255,0,255)">locale.resolver=org.displaytag.localization.I18nStrutsAdapter</span><br />
<br />
2，excel导出中文内容乱码：<br />
重载类org.displaytag.export.ExcelView，复写<br />
public String getMimeType(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(255,0,255)">return "application/vnd.ms-excel;charset=gbk"</span>; //$NON-NLS-1$<br />
}<br />
原代码是return "application/vnd.ms-excel"; //$NON-NLS-1$<br />
修改displaytag_zh_CN.properties中对应条目：<br />
</strong><span style="color: rgb(255,0,255)"><strong>export.excel.class=yourpackage.SimpleChineseExcelView<br />
<br />
</strong><span style="color: rgb(0,0,0)"><strong>3,Excel导出文件名中文乱码：<br />
重载类org.displaytag.tags.SetPropertyTag，复写<br />
private String value;<br />
public void setValue(String propertyValue){<br />
&nbsp; try{<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(255,0,255)">this.value = new String(propertyValue.getBytes("GBK"),"ISO-8859-1");</span><br />
&nbsp; }catch(Exception e){<br />
&nbsp;&nbsp;&nbsp; this.value = propertyValue;<br />
&nbsp; }<br />
&nbsp; <span style="color: rgb(255,0,255)">super.setValue(this.value);</span><br />
}<br />
修改displaytag.tld对应条目<br />
&lt;name&gt;setProperty&lt;/name&gt;<br />
&lt;!-- &lt;tag-class&gt;org.displaytag.tags.SetPropertyTag&lt;/tag-class&gt; --&gt;<br />
&lt;tag-class&gt;<span style="color: rgb(255,0,255)">yourpackage.SimpleChineseSetPropertyTag</span>&lt;/tag-class&gt;<br />
在jsp中应用时<br />
&lt;display:setProperty name="export.excel.filename" <span style="color: rgb(255,0,255)">value="导出中文名称.xls</span>"/&gt;<br />
注意，<span style="color: rgb(255,0,0)">这种解决方案只能解决value的中文名称，而不能解决bodycontent内的中文名称，如</span><br style="color: rgb(255,0,0)" />
<span style="color: rgb(255,0,0)">&lt;display:setProperty name="export.excel.filename"&gt;导出菜单.xls&lt;/</span></strong></span></span><span style="color: rgb(255,0,0)"><strong>display:setProperty</strong></span><span style="color: rgb(255,0,255)"><strong><span style="color: rgb(0,0,0)"><span style="color: rgb(255,0,0)">&gt;</span><br />
<br />
4,Excel导出文件名中文乱码bodycontent中的不完美解决方案</span><br />
&lt;display:setProperty name="export.excel.filename"&gt;<br />
&nbsp; &lt;%=new String("导出菜单.xls".getBytes("GBK"),"ISO-8859-1") %&gt;<br />
&lt;/display:setProperty&gt;<br />
</strong><span style="color: rgb(0,0,0)"><strong>这种解决方案之所以称之为不完美适应为它要借助页面中的java代码实现<br />
<br />
</strong></span></span><strong><span style="color: rgb(255,0,255)"><span style="color: rgb(0,0,0)">使用Mesources<br />
&lt;display:setProperty name="export.excel.filename"&gt;<br />
&lt;%<br />
&nbsp;MessageResources mrs = (MessageResources)request.getAttribute("org.apache.struts.action.MESSAGE");<br />
&nbsp;String fileName = mrs.getMessage("menu.export.excel.filename");<br />
&nbsp;fileName = new String(fileName.getBytes("GBK"),"ISO-8859-1");<br />
&nbsp;out.print(fileName);<br />
%&gt;<br />
&lt;/display:setProperty&gt;<br />
<br />
谁有好的解决方案可以回帖~~感激不尽~<br />
</span></span><br />
</strong></span></strong></p>
</span>
<img src ="http://www.blogjava.net/i369/aggbug/151040.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-08 13:52 <a href="http://www.blogjava.net/i369/articles/151040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于权限设计的探讨</title><link>http://www.blogjava.net/i369/articles/150969.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 08 Oct 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/150969.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/150969.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/150969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/150969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/150969.html</trackback:ping><description><![CDATA[<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
                <tbody>
                    <tr>
                        <td class="title1" align="center" width="100%" bgcolor="#eeeeee" colspan="3" height="40"><strong>关于权限设计的探讨</strong></td>
                    </tr>
                    <tr>
                        <td align="center" width="100%" bgcolor="#eeeeee"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#116;&#99;&#57;&#54;&#48;&#50;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">qinxupeng</a> 转贴&nbsp;&nbsp;&nbsp;更新：2005-11-30 09:27:42&nbsp;&nbsp;版本: 1.0 &nbsp;&nbsp; </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <!-- end of article title -->
        <tr>
            <td valign="top" align="center" width="100%"><!--start of article content -->
            <table class="rtable" width="98%" border="0">
                <tbody>
                    <tr>
                        <td class="text" align="left" width="100%"><br />
                        <br />
                        但凡涉及多用户不同权限的网络或者单机程序，都会有权限管理的问题，比较突出的是MIS系统。&nbsp;<br />
                        下面我要说的是MIS系统权限管理的数据库设计及实现，当然，这些思路也可以推广开来应用，比如说在BBS中用来管理不同级别的用户权限。&nbsp;<br />
                        权限设计通常包括数据库设计、应用程序接口(API)设计、程序实现三个部分。&nbsp;<br />
                        这三个部分相互依存，密不可分，要实现完善的权限管理体系，必须考虑到每一个环节可行性与复杂程度甚至执行效率。&nbsp;<br />
                        我们将权限分类，首先是针对数据存取的权限，通常有录入、浏览、修改、删除四种，其次是功能，它可以包括例如统计等所有非直接数据存取操作，另外，我们还可能对一些关键数据表某些字段的存取进行限制。除此，我想不出还有另外种类的权限类别。&nbsp;<br />
                        完善的权限设计应该具有充分的可扩展性，也就是说，系统增加了新的其它功能不应该对整个权限管理体系带来较大的变化，要达到这个目的，首先是数据库设计合理，其次是应用程序接口规范。&nbsp;<br />
                        我们先讨论数据库设计。通常我们使用关系数据库，这里不讨论基于Lotus产品的权限管理。&nbsp;<br />
                        权限表及相关内容大体可以用六个表来描述，如下：&nbsp;<br />
                        1&nbsp;角色（即用户组）表：包括三个字段，ID，角色名，对该角色的描述；&nbsp;<br />
                        2&nbsp;用户表：包括三个或以上字段，ID，用户名，对该用户的描述，其它（如地址、电话等信息）；&nbsp;<br />
                        3&nbsp;角色-用户对应表：该表记录用户与角色之间的对应关系，一个用户可以隶属于多个角色，一个角色组也可拥有多个用户。包括三个字段，ID，角色ID，用户ID；&nbsp;<br />
                        4&nbsp;限制内容列表：该表记录所有需要加以权限区分限制的数据表、功能和字段等内容及其描述，包括三个字段，ID，名称，描述；&nbsp;<br />
                        5&nbsp;权限列表：该表记录所有要加以控制的权限，如录入、修改、删除、执行等，也包括三个字段，ID，名称，描述；&nbsp;<br />
                        6&nbsp;权限-角色-用户对应表：一般情况下，我们对角色/用户所拥有的权限做如下规定，角色拥有明令允许的权限，其它一律禁止，用户继承所属角色的全部权限，在&nbsp;此范围内的权限除明令禁止外全部允许，范围外权限除明令允许外全部禁止。该表的设计是权限管理的重点，设计的思路也很多，可以说各有千秋，不能生搬硬套说&nbsp;某种方法好。对此，我的看法是就个人情况，找自己觉得合适能解决问题的用。&nbsp;<br />
                        先说第一种也是最容易理解的方法，设计五个字段：ID，限制内容ID，权限ID，角色/用户类型（布尔型字段，用来描述一条记录记录的是角色权限还是用户权限），角色/用户ID，权限类型（布尔型字段，用来描述一条记录表示允许还是禁止）&nbsp;<br />
                        好了，有这六个表，根据表六，我们就可以知道某个角色/用户到底拥有/禁止某种权限。&nbsp;<br />
                        或者说，这么设计已经足够了，我们完全实现了所需要的功能：可以对角色和用户分别进行权限定制，也具有相当的可扩展性，比如说增加了新功能，我们只&nbsp;需要添加一条或者几条记录就可以，同时应用程序接口也无须改动，具有相当的可行性。但是，在程序实现的过程中，我们发现，使用这种方法并不是十分科学，例&nbsp;如浏览某个用户所拥有的权限时，需要对数据库进行多次（甚至是递归）查询，极不方便。于是我们需要想其它的办法。使用过Unix系统的人们都知道，&nbsp;Unix文件系统将对文件的操作权限分为三种：读、写和执行，分别用1、2、4三个代码标识，对用户同时具有读写权限的文件被记录为3，即1+2。我们也&nbsp;可以用类似的办法来解决这个问题。初步的想法是修改权限列表，加入一个字段：标识码，例如，我们可以将录入权限标识为1，浏览权限标识为2，修改权限标识&nbsp;为4，删除权限标识为8，执行权限标识为16，这样，我们通过权限累加的办法就可以轻易的将原本要分为几条记录描述的权限放在一起了，例如，假定某用户&nbsp;ID为1，库存表对应的限制内容ID为2，同时规定角色类型为0、用户类型为1，我们就可以将该用户具有录入、浏览、修改、删除库存表的权限描述为：&nbsp;2,15,1,1。&nbsp;<br />
                        确实很简单，不是吗？甚至还有更过激的办法，将限制内容列表也加上一列，定义好标识码，这样，我们甚至可以用简单的一条记录描述某个用户具有的对全&nbsp;部内容所具有的全部权限了。当然，这样做的前提是限制内容数量比较小，不然，呵呵，2的n次方递增起来可是数量惊人，不容易解析的。&nbsp;<br />
                        从表面上看，上述方法足以达到实现功能、简化数据库设计及实现的复杂度这个目的，但这样做有个弊端，我们所涉及的权限列表不是相互独立而是互相依赖&nbsp;的，比如说修改权限，其实是包含浏览权限的，例如，我们可能只是简单的设置用户对库存表存取的权限值为录入+修改+删除（1+4+8=13),但事实上，&nbsp;该用户具有(1+2+4+8=15）的权限，也就是说，在这种方案中，13=15。于是当我们调用API询问某用户是否具有浏览权限时，就必须判断该用户&nbsp;是否具有对该数据表的修改权限，因此，如果不能在程序中固化权限之间的包含关系，就不能利用应用程序接口简单的做出判断。但这与我们的目的&#8220;充分的可扩展&nbsp;性&#8221;矛盾。&nbsp;<br />
                        这个问题如何解决？我想到了另外一种设置标识码的方法，那就是利用素数。我们不妨将录入、浏览、修改、删除、执行的基本标志码定为&nbsp;2,3,5,7,11，当遇到权限互相包含的时候，我们将它的标识码设定为两个（或多个）基本标志码的乘积，例如，可以将&#8220;修改&#8221;功能的标志码定为3*5&nbsp;=15，然后将所有的权限相乘，就得到了我们需要的最终权限标识值。这样，我们在询问用户是否具有某项权限的时候，只需要将最终的值分解成质因子，例如，&nbsp;我们可以定义一个用户具有录入+修改+删除库存表的权限为&nbsp;2*15*7=2*3*5*7，即表示，该用户具有了对库存表录入+浏览+修改+删除权限。&nbsp;<br />
                        当然，对权限列表我们使用上述方法的前提是权限列表记录条数不会太多并且关系不是十分复杂，否则，光是解析权限代码就要机器忽悠半宿：）&nbsp;<br />
                        我希望以上的分析是正确且有效的（事实上，我也用这些的方法在不止一套系统中实现），但无论如何，我觉得如此实现权限管理，只是考虑了数据库设计和&nbsp;应用程序接口两部分内容，对于实现，还是显得很费劲。因此，我恳请有过类似设计、实现经验的同志们提出建设性的意见和修改建议。&nbsp;<br />
                        另外，关于数据库设计的思路还有使用二维表的，这将在以后的时间里讨论，关于应用程序接口的设计和实现我也将在利用另外篇幅和大家共同探讨，代码将用类C语法实现（我不喜欢pascal，抱歉）&nbsp;<br />
                        欢迎朋友们和我联系，mailto:berg@91search.com，也欢迎访问我和另外一位朋友共同建设的网站：<a href="http://www.91search.com/">http://www.91search.com</a>，那里将有一个音乐搜索的工具软件提供下载。<br />
                        &nbsp;<br />
                        ========================================<br />
                        关于权限包容关系通过角色和权限掩码来实现。<br />
                        &nbsp;///&nbsp;&lt;summary&gt;<br />
                        &nbsp;///&nbsp;权限保护类型枚举类型。<br />
                        &nbsp;///&nbsp;&lt;/summary&gt;<br />
                        &nbsp;public&nbsp;enum&nbsp;ProtectEnum<br />
                        &nbsp;{<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;撤回权限保护类型&lt;/summary&gt;<br />
                        &nbsp;&nbsp;RevokeProtect&nbsp;=&nbsp;0,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;授予权限保护类型&lt;/summary&gt;<br />
                        &nbsp;&nbsp;GrantProtect&nbsp;=&nbsp;1,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;拒绝权限保护类型&lt;/summary&gt;<br />
                        &nbsp;&nbsp;DenyProtect&nbsp;&nbsp;=&nbsp;2<br />
                        &nbsp;}<br />
                        &nbsp;///&nbsp;&lt;summary&gt;<br />
                        &nbsp;///&nbsp;系统固定用户或角色枚举类型。<br />
                        &nbsp;///&nbsp;&lt;/summary&gt;<br />
                        &nbsp;///&nbsp;&lt;remarks&gt;<br />
                        &nbsp;///&nbsp;管理员角色：16399&nbsp;=&nbsp;100000000001111<br />
                        &nbsp;///&nbsp;所有者角色：16385&nbsp;=&nbsp;100000000000001<br />
                        &nbsp;///&nbsp;只读者角色：16386&nbsp;=&nbsp;100000000000010<br />
                        &nbsp;///&nbsp;安全员角色：16388&nbsp;=&nbsp;100000000000100<br />
                        &nbsp;///&nbsp;配置员角色：16392&nbsp;=&nbsp;100000000001000<br />
                        &nbsp;///&nbsp;&lt;/remarks&gt;<br />
                        &nbsp;public&nbsp;enum&nbsp;FixedRoleEnum<br />
                        &nbsp;{<br />
                        &nbsp;&nbsp;///&lt;summary&gt;系统管理员固定用户&lt;/summary&gt;<br />
                        &nbsp;&nbsp;Administrator&nbsp;=&nbsp;1,<br />
                        &nbsp;&nbsp;///&lt;summary&gt;系统管理员固定角色&lt;/summary&gt;<br />
                        &nbsp;&nbsp;Administrators&nbsp;=&nbsp;16399,<br />
                        &nbsp;&nbsp;///&lt;summary&gt;所有者固定角色（具有读写操作之权限）&lt;/summary&gt;<br />
                        &nbsp;&nbsp;Authors&nbsp;&nbsp;=&nbsp;16385,<br />
                        &nbsp;&nbsp;///&lt;summary&gt;只读者固定角色（具有只读操作之权限）&lt;/summary&gt;<br />
                        &nbsp;&nbsp;Readers&nbsp;&nbsp;=&nbsp;16386,<br />
                        &nbsp;&nbsp;///&lt;summary&gt;系统安全管理员固定角色&lt;/summary&gt;<br />
                        &nbsp;&nbsp;Security&nbsp;=&nbsp;16388,<br />
                        &nbsp;&nbsp;///&lt;summary&gt;系统设置管理员固定角色&lt;/summary&gt;<br />
                        &nbsp;&nbsp;Setting&nbsp;&nbsp;=&nbsp;16392<br />
                        &nbsp;}<br />
                        &nbsp;///&nbsp;&lt;summary&gt;<br />
                        &nbsp;///&nbsp;系统权限枚举类型。<br />
                        &nbsp;///&nbsp;&lt;/summary&gt;<br />
                        &nbsp;public&nbsp;enum&nbsp;PermissionEnum<br />
                        &nbsp;{<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;&#8220;读取&#8221;权限&lt;/summary&gt;<br />
                        &nbsp;&nbsp;FetchPermission&nbsp;=&nbsp;1,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;&#8220;新增&#8221;权限&lt;/summary&gt;<br />
                        &nbsp;&nbsp;AddNewPermission&nbsp;=&nbsp;2,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;&#8220;更新&#8221;权限&lt;/summary&gt;<br />
                        &nbsp;&nbsp;UpdatePermission&nbsp;=&nbsp;4,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;&#8220;删除&#8221;权限&lt;/summary&gt;<br />
                        &nbsp;&nbsp;DeletePermission&nbsp;=&nbsp;8,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;&#8220;打印&#8221;权限&lt;/summary&gt;<br />
                        &nbsp;&nbsp;PrintPermission&nbsp;=&nbsp;16,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;系统保留，应用于流程处理&lt;/summary&gt;<br />
                        &nbsp;&nbsp;FlowPermission&nbsp;=&nbsp;1024,<br />
                        &nbsp;&nbsp;///&nbsp;&lt;summary&gt;系统保留，应用于流程处理&lt;/summary&gt;<br />
                        &nbsp;&nbsp;VoidPermission&nbsp;=&nbsp;2048<br />
                        &nbsp;}<br />
                        如果用户&#8220;Popeye&#8221;对&#8220;销售出仓单[2009]&#8221;系统对象具有读写（读取＋修改＋删除＋新增）权限：（权限表定义如下TPermission）<br />
                        FormID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Permission<br />
                        =======&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;====&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==========<br />
                        2009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Popeye&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1+2+4+8=15<br />
                        *****&nbsp;上面系统定义的默认权限肯定是不够系统使用的，那么还有一些权限（例如：报关系统中的&#8220;计算差异表&#8221;&#8220;制造申报单&#8221;等权限，就由系统再定义），其实不用太&nbsp;担心会不够用的，因为在一个Form中不可能会出现所有权限情况，所以，系统自定义的权限掩码可重复使用在不同的表单中。*****<br />
                        ??建议不要把角色和用户分开两张表来存储（可参考MS-SQL&nbsp;Server中的sys_users表），因为在后面的权限定义表需要引用这个表的UID（其可为用户或角色，SQL中是使用UID的数值范围来区别用户&nbsp;与角色的，建议也如此。），版主说的角色与用户分开对待权限设置，这点我不赞成。因为角色只不过是一种用户组，其应该享用用户的权限定义范围，在其下属的&nbsp;角色成员（注意角色成员不同于用户或角色哦，其可以为角色也可以为用户）均默认继承其定义的权限，除非角色成员重新指派其上级角色定义的权限字。下面给出&nbsp;我的相关表定义：<br />
                        TUser(用户或角色表)<br />
                        ===================<br />
                        (PK)UID&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL（主键）<br />
                        Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nvarchar(50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL（唯一性约束）<br />
                        FullName&nbsp;&nbsp;nvarchar(100)&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />
                        Description&nbsp;&nbsp;&nbsp;nvarchar(255)&nbsp;&nbsp;NULL<br />
                        MasterNo&nbsp;&nbsp;varchar(25)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL（注：该字段对应为员工表中的员工编号，通过该字段就可以关联知道该用户或角色所属的员工了，在企业管理系统中很有用啊！）<br />
                        TMember(用户与角色关系表)<br />
                        =========================<br />
                        (*PK)RoleID&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL<br />
                        (*PK)UserID&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL<br />
                        TPermission(用户权限表)<br />
                        =======================<br />
                        (*PK)FormID&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL（表示系统中各个模块或表单的唯一编号）<br />
                        (*PK)UserID&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL（用户或角色编号）<br />
                        Protect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL（1：表示显示授予权限；0：表示显示拒绝权限）<br />
                        Permission&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;NOT&nbsp;NULL（权限掩码和）<br />
                        *****&nbsp;如果哪位兄弟有意研究权限与流程定制方面的东东，相信找偶是没错的了！！！呵呵～～～&nbsp;&nbsp;&nbsp;&nbsp;老板，给分啊～～～～～&#215;&#215;&#215;&#215;&#215;<br />
                        &nbsp;<br />
                        ==========================================<br />
                        以上的方法与我做的项目的方法基本一致，现摘一部分的表结构，以供大家参考<br />
                        create&nbsp;table&nbsp;t_workelement&nbsp;/*工作元素表*/<br />
                        (<br />
                        &nbsp;code&nbsp;varchar(20)&nbsp;not&nbsp;null,&nbsp;/*元素的代码，唯一*/<br />
                        &nbsp;name&nbsp;varchar(50)&nbsp;&nbsp;not&nbsp;null&nbsp;UNIQUE,/*元素的名称，唯一*/<br />
                        &nbsp;type&nbsp;int&nbsp;&nbsp;not&nbsp;null,&nbsp;/*类型&nbsp;0-单据操作&nbsp;1-报表操作&nbsp;2-功能操作*/<br />
                        &nbsp;bcode&nbsp;varchar(20)&nbsp;null,&nbsp;&nbsp;/*对应操作的单据\报表\功能的代码*/<br />
                        &nbsp;style&nbsp;int&nbsp;&nbsp;null,&nbsp;&nbsp;/*单据：类型&nbsp;0-查看&nbsp;1-新增&nbsp;2-修改&nbsp;3-删除*/<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*报表：无*/<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*功能：无*/<br />
                        &nbsp;term&nbsp;ntext&nbsp;&nbsp;null,&nbsp;&nbsp;/*单据：查看\修改\删除时要符合的条件,如"{$承揽合同.编号}=12\n{$承揽合同.名称}&lt;&gt;'afd'"*/<br />
                        &nbsp;primary&nbsp;key(code)<br />
                        )<br />
                        go<br />
                        drop&nbsp;table&nbsp;t_role<br />
                        go<br />
                        create&nbsp;table&nbsp;t_role&nbsp;/*角色表*/<br />
                        (<br />
                        &nbsp;name&nbsp;varchar(30)&nbsp;not&nbsp;null,<br />
                        &nbsp;category&nbsp;varchar(50)&nbsp;null,<br />
                        &nbsp;remark&nbsp;varchar(100)&nbsp;null,<br />
                        &nbsp;primary&nbsp;key(name)<br />
                        )<br />
                        go<br />
                        drop&nbsp;table&nbsp;t_roleelement<br />
                        go<br />
                        create&nbsp;table&nbsp;t_roleelement&nbsp;/*角色元素操作表*/<br />
                        (<br />
                        &nbsp;rname&nbsp;varchar(30)&nbsp;not&nbsp;null,&nbsp;/*角色名称*/<br />
                        &nbsp;ecode&nbsp;varchar(20)&nbsp;not&nbsp;null,&nbsp;/*元素的代码*/<br />
                        &nbsp;primary&nbsp;key(rname,ecode)<br />
                        )<br />
                        go<br />
                        drop&nbsp;table&nbsp;t_users<br />
                        go<br />
                        create&nbsp;table&nbsp;t_users&nbsp;/*用户表*/<br />
                        (<br />
                        &nbsp;name&nbsp;varchar(20)&nbsp;not&nbsp;null,&nbsp;/*用户的名称*/<br />
                        &nbsp;dcode&nbsp;varchar(20)&nbsp;not&nbsp;null,&nbsp;/*所属的部门*/<br />
                        &nbsp;category&nbsp;varchar(50)&nbsp;null,&nbsp;&nbsp;/*用户的类别*/<br />
                        &nbsp;pswd&nbsp;varchar(15)&nbsp;null,&nbsp;&nbsp;/*密码*/<br />
                        &nbsp;primary&nbsp;key(name)<br />
                        )<br />
                        go<br />
                        /*插入系统管理员*/<br />
                        INSERT&nbsp;INTO&nbsp;t_users<br />
                        (<br />
                        &nbsp;name,<br />
                        &nbsp;dcode,<br />
                        &nbsp;category,<br />
                        &nbsp;pswd<br />
                        )<br />
                        VALUES<br />
                        (<br />
                        &nbsp;'Admini',<br />
                        &nbsp;'system',<br />
                        &nbsp;'超级用户',<br />
                        &nbsp;''<br />
                        )<br />
                        go<br />
                        drop&nbsp;table&nbsp;t_userrole<br />
                        go<br />
                        create&nbsp;table&nbsp;t_userrole&nbsp;/*用户角色表*/<br />
                        (<br />
                        &nbsp;uname&nbsp;varchar(20)&nbsp;not&nbsp;null,&nbsp;/*用户名称*/<br />
                        &nbsp;rname&nbsp;varchar(30)&nbsp;not&nbsp;null,&nbsp;/*角色的名称*/<br />
                        &nbsp;primary&nbsp;key(uname,rname)<br />
                        )<br />
                        go<br />
                        INSERT&nbsp;INTO&nbsp;t_userrole<br />
                        (<br />
                        &nbsp;uname,<br />
                        &nbsp;rname<br />
                        )<br />
                        VALUES<br />
                        (<br />
                        &nbsp;'Admini',<br />
                        &nbsp;'系统管理员'<br />
                        )<br />
                        go<br />
                        drop&nbsp;table&nbsp;t_dept<br />
                        go<br />
                        create&nbsp;table&nbsp;t_dept&nbsp;/*部门表*/<br />
                        (<br />
                        &nbsp;code&nbsp;varchar(20)&nbsp;not&nbsp;null,&nbsp;/*部门的代码*/<br />
                        &nbsp;name&nbsp;varchar(50)&nbsp;not&nbsp;null&nbsp;UNIQUE,/*部门的名称*/<br />
                        &nbsp;type&nbsp;varchar(10)&nbsp;null,&nbsp;&nbsp;/*部门的类别&nbsp;行政&nbsp;仓库&nbsp;车间*/<br />
                        &nbsp;subtype&nbsp;varchar(16)&nbsp;null,&nbsp;&nbsp;/*子类别&nbsp;成品仓库&nbsp;原料仓库自定义*/<br />
                        &nbsp;primary&nbsp;key(code)<br />
                        )<br />
                        go<br />
                        /*插入系统管理部*/<br />
                        INSERT&nbsp;INTO&nbsp;t_dept<br />
                        (<br />
                        &nbsp;code,<br />
                        &nbsp;name,<br />
                        &nbsp;type<br />
                        )<br />
                        VALUES<br />
                        (<br />
                        &nbsp;'system',<br />
                        &nbsp;'系统管理部',<br />
                        &nbsp;'行政'<br />
                        )<br />
                        go<br />
                        续：关于权限系统的设计<br />
                        jackyz&nbsp;&nbsp;Dec&nbsp;7,&nbsp;2002&nbsp;1:00&nbsp;AM&nbsp;<br />
                        source：<a href="http://www.jdon.com/jive/article.jsp?forum=46&amp;thread=4110&amp;message=438816">http://www.jdon.com/jive/article.jsp?forum=46&amp;thread=4110&amp;message=438816</a><br />
                        Note：<br />
                        首先，向版主致歉。这原是关于权限系统设计问题的回帖，本不应该另开新贴。而在下的另开新贴，一方面是因为本人的观点中与很多人&nbsp;的观点差别较大，另一方面也担心其会被&#8220;埋没&#8221;在原贴的大量回帖中。此外，本贴的内容整理与编排耗费了我周末接近一整个晚上的时间，包含了我对近期项目中&nbsp;权限系统的思考与总结，希望引来大家足够的目光和指导。请版主体谅。<br />
                        <br />
                        <br />
                        权限系统，其重要性当然不言自明。看见大家的方案，有相当多优秀的创意与经验，我的项目也有所涉及，以下说明的是我最近在一个企业&nbsp;EJB&nbsp;项目中初步实现的方案(以及设计考量)，望与诸位共商榷。<br />
                        <br />
                        <br />
                        前言：<br />
                        <br />
                        权限往往是一个极其复杂的问题，但也可简单表述为这样的逻辑表达式：判断&#8220;who&nbsp;对&nbsp;what(which)&nbsp;进行&nbsp;how&nbsp;的操作&#8221;的逻辑表达式是否为真。<br />
                        <br />
                        针对不同的应用，需要根据项目的实际情况和具体架构，在维护性、灵活性、完整性等N多个方案之间比较权衡，选择符合的方案。<br />
                        <br />
                        <br />
                        目标：<br />
                        <br />
                        这个权限系统的设计，我主要考虑了这么几个目标：<br />
                        <br />
                        直观，因为系统最终会由最终用户来维护，权限分配的直观和容易理解，显得比较重要，系统不辞劳苦的实现了组的继承，除了功能的必须，更主要的就是因为它足够直观。<br />
                        <br />
                        简&nbsp;单，包括概念数量上的简单和意义上的简单还有功能上的简单。想用一个权限系统解决所有的权限问题是不现实的。设计中将常常变化的&#8220;定制&#8221;特点比较强的部分&nbsp;判断为业务逻辑，而将常常相同的&#8220;通用&#8221;特点比较强的部分判断为权限逻辑就是基于这样的思路。此外，同时具备&nbsp;Role&nbsp;和&nbsp;Group&nbsp;的系统难于理解，权衡之下，摒弃了&nbsp;Role&nbsp;概念。<br />
                        <br />
                        扩展，我在以前的项目中也实现过基于&nbsp;Role&nbsp;概念的权限系统，但效果不太理想。之所以在这里摒弃&nbsp;Role&nbsp;的概念，另一个原因就是因为它不易扩展。通常&nbsp;Role&nbsp;的设计方式意味着预先已经定好了一组权限，这样的&#8220;预先设计&#8221;，常常会鼓励程序员&nbsp;hardcode&nbsp;这些权限相关的部分，而，如果这么做的话，当需要重新定义&nbsp;Role&nbsp;时，扩展就会变得极为困难。而采用可继承的&nbsp;Group&nbsp;概念在支持权限以组方式定义的同时有效避免了重定义时在扩展上的困难。<br />
                        <br />
                        <br />
                        名词：<br />
                        <br />
                        下面两个名词极其重要，是整个设计问题边界定义的关键，或许我的理解与通常的理解不同，在此有必要特别澄清。<br />
                        <br />
                        粗粒度：表示类别级，即，仅考虑对象的类别，不考虑对象的某个特定实例。比方，用户管理中，创建、删除，对所有的用户都一视同仁，并不区分操作的具体对象实例。<br />
                        <br />
                        细粒度：表示实例级，即，需要考虑具体对象的实例，当然，细粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比方，合同管理中，列表、删除，需要区分该合同实例是否为当前用户所创建。<br />
                        <br />
                        <br />
                        原则：<br />
                        <br />
                        权&nbsp;限逻辑配合业务逻辑。即，权限系统以为业务逻辑提供服务为目标。纯粹纸面意义的极其复杂和精巧的权限系统，这里不作讨论。相当多细粒度的权限问题因其极其&nbsp;独特而不具通用意义，它们也能被理解为是&#8220;业务逻辑&#8221;的一部分。比方，要求：&#8220;合同资源只能被它的创建者删除，与创建者同组的用户可以修改，所有的用户能&nbsp;够浏览&#8221;。这既可以认为是一个细粒度的权限问题，也可以认为是一个业务逻辑问题。在这里我认为它是业务逻辑问题，在整个权限系统的架构设计之中不予过多考&nbsp;虑。当然，权限系统的架构也必须要能支持这样的控制判断。或者说，系统提供足够多但不是完全的控制能力。即，设计原则归结为：&#8220;系统只提供粗粒度的权限，&nbsp;细粒度的权限被认为是业务逻辑的职责&#8221;。<br />
                        <br />
                        需要再次强调的是，这里表述的权限系统仅是一个&#8220;不完全&#8221;的权限系统，即，它不提供所有关于权限&nbsp;的问题的解决方法。它提供一个基础，并解决那些具有&#8220;共性&#8221;的(或者说粗粒度的)部分。在这个基础之上，根据&#8220;业务逻辑&#8221;的独特权限需求，编码实现剩余部&nbsp;分(或者说细粒度的)部分，才算完整。回到权限的问题公式，我的设计仅解决了&nbsp;who&nbsp;+&nbsp;what&nbsp;+&nbsp;how&nbsp;的问题，which&nbsp;的权限问题留给业务逻辑解决。<br />
                        <br />
                        <br />
                        概念：<br />
                        <br />
                        User：用户。解决&nbsp;who&nbsp;的问题。<br />
                        <br />
                        Group：组。权限分配的单位与载体。权限不考虑分配给特定的用户。组可以包括组(以实现权限的继承)。<br />
                        <br />
                        Operate：操作。表明对&nbsp;what&nbsp;的&nbsp;how&nbsp;操作。<br />
                        <br />
                        <br />
                        说明：<br />
                        <br />
                        User<br />
                        <br />
                        与大家的都一样，没什么好说的。<br />
                        <br />
                        Group<br />
                        <br />
                        与&nbsp;大家的类似，所不同的是，Group&nbsp;要实现继承。即，在创建时必须要指定该&nbsp;Group&nbsp;的&nbsp;Parent&nbsp;是什么&nbsp;Group&nbsp;。在粗粒度控制上，可以认为，只要某用户直接或者间接的属于某个&nbsp;Group&nbsp;那么它就具备这个&nbsp;Group&nbsp;的所有操作许可。细粒度控制上，在业务逻辑的判断中，User&nbsp;仅应关注其直接属于的&nbsp;Group&nbsp;，用来判断是否&#8220;同组&#8221;，间接的&nbsp;Group&nbsp;对权限的控制意义不大，试设想存在一个&nbsp;All&nbsp;User&nbsp;的&nbsp;Group&nbsp;是所有&nbsp;Group&nbsp;的祖先，这样的情形下，判断的结果不具备实际意义。<br />
                        <br />
                        User&nbsp;与&nbsp;Group&nbsp;是多对多的关系。即，一个&nbsp;User&nbsp;可以属于多个&nbsp;Group&nbsp;之中，一个&nbsp;Group&nbsp;可以包括多个&nbsp;User&nbsp;。<br />
                        <br />
                        子&nbsp;Group&nbsp;与&nbsp;父&nbsp;Group&nbsp;是多对一的关系。即，一个子&nbsp;Group&nbsp;只能有一个父&nbsp;Group&nbsp;，一个父&nbsp;Group&nbsp;可以包括多个子&nbsp;Group&nbsp;。<br />
                        <br />
                        <br />
                        Operate<br />
                        <br />
                        某种意义上类似于大家的&nbsp;Resource&nbsp;+&nbsp;Privilege&nbsp;概念，但，这里的&nbsp;Resource&nbsp;仅包括&nbsp;Resource&nbsp;Type&nbsp;不表示&nbsp;Resource&nbsp;Instance。Operate&nbsp;概念上与大家的观点区别比较，后面有详细的解释。<br />
                        <br />
                        Group&nbsp;与&nbsp;Operate&nbsp;是多对多的关系。<br />
                        <br />
                        各概念的关系图示如下：<br />
                        <br />
                        &nbsp;User<br />
                        &nbsp;&nbsp;|*<br />
                        &nbsp;&nbsp;|<br />
                        &nbsp;&nbsp;|*&nbsp;&nbsp;&nbsp;1<br />
                        &nbsp;Group---+<br />
                        &nbsp;&nbsp;|*&nbsp;|*&nbsp;&nbsp;|<br />
                        &nbsp;&nbsp;|&nbsp;&nbsp;+---+<br />
                        &nbsp;&nbsp;|*<br />
                        &nbsp;Operate<br />
                        <br />
                        <br />
                        解释：<br />
                        <br />
                        Operate&nbsp;的定义包括了&nbsp;Resource&nbsp;Type&nbsp;和&nbsp;Method&nbsp;概念。即，&nbsp;what&nbsp;和&nbsp;how&nbsp;的概念。之所以将&nbsp;what&nbsp;和&nbsp;how&nbsp;绑定在一起作为一个&nbsp;Operate&nbsp;概念而不是分开建模再建立关联，这是因为很多的&nbsp;how&nbsp;对于某&nbsp;what&nbsp;才有意义。比方，发布操作对新闻对象才有意义，对用户对象则没有意义。<br />
                        <br />
                        how&nbsp;本身的意义也有所不同，这里并非仅定义类&nbsp;UNIX&nbsp;的&nbsp;RWX&nbsp;三种操作，这样的定义对于文件系统是合理的，但，对于其他的应用领域或许就不是那么足够了。具体来说，对于每一个&nbsp;what&nbsp;可以定义&nbsp;N&nbsp;种操作。比方，对于合同这类对象，可以定义创建操作、提交操作、检查冲突操作等。可以认为，how&nbsp;概念对应于每一个商业方法。<br />
                        <br />
                        其中，与&nbsp;具体用户身份相关的操作既可以定义在操作的业务逻辑之中，也可以定义在操作级别。比方，创建者的浏览视图与普通用户的浏览视图要求内容不同。你既可以在外&nbsp;部定义两个操作方法，也可以在一个操作方法的内部根据具体逻辑进行处理。具体应用哪一种方式应依据实际情况进行处理。<br />
                        <br />
                        这样的架构，应能在易于理解和管理的情况下，满足绝大部分粗粒度权限控制的功能需要。但是，除了粗粒度权限，无可否认，系统中必然还会包括无数对具体&nbsp;Instance&nbsp;的细粒度权限。这些问题，被留给业务逻辑来解决，这样的考虑基于以下两点。<br />
                        <br />
                        一&nbsp;方面，细粒度的权限判断必须要在资源上建模权限分配的支持信息才可能得以实现。比方，如果要求创建者和普通用户看到不同的信息内容，那么，资源本身应该有&nbsp;其创建者的信息。如同&nbsp;Unix&nbsp;的每一个文件(资源)，都定义了对&nbsp;Owner,&nbsp;Group,&nbsp;All&nbsp;的不同操作属性。<br />
                        <br />
                        另一方面，&nbsp;细粒度的权限常常具有相当大的业务逻辑相关性。对不同的业务逻辑，常常意味着完全不同的权限判定原则和策略。相比之下，粗粒度的权限更具通用性，将其实现&nbsp;为一个架构，更有重用价值；而将细粒度的权限判断实现为一个架构级别的东西就显得繁琐，而且不是那么的有必要，用定制的代码来实现就更简洁，更灵活。<br />
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/i369/aggbug/150969.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-08 09:31 <a href="http://www.blogjava.net/i369/articles/150969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搞定log4j中文提示输出</title><link>http://www.blogjava.net/i369/articles/150964.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 08 Oct 2007 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/150964.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/150964.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/150964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/150964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/150964.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
                <tbody>
                    <tr>
                        <td class="title1" align="center" width="100%" bgcolor="#eeeeee" colspan="3" height="40"><strong>搞定log4j中文提示输出</strong></td>
                    </tr>
                    <tr>
                        <td align="center" width="100%" bgcolor="#eeeeee"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#103;&#97;&#109;&#101;&#109;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">agamem</a> 原创&nbsp;&nbsp;&nbsp;更新：2005-09-08 09:40:47&nbsp;&nbsp;版本: 1.0 &nbsp;&nbsp; </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <!-- end of article title -->
        <tr>
            <td valign="top" align="center" width="100%"><!--start of article content -->
            <table class="rtable" width="98%" border="0">
                <tbody>
                    <tr>
                        <td class="text" align="left" width="100%"><br />
                        这是自己对论坛中&#8220;关于log4j输出显示的问题&nbsp;&#8221;的答复！<br />
                        在论坛提出这个问题，没人搭理，只好自己看代码了！<br />
                        自力更生，丰衣足食！<br />
                        毛主席讲的话真是好啊！<br />
                        这个问题我自己搞定了！<br />
                        还是改了log4j的代码。<br />
                        管这个东西的代码在org\apache\log4j&nbsp;的Priority.java和&nbsp;Level.java<br />
                        <br />
                        Priority.java中有一段<br />
                        &nbsp;&nbsp;final&nbsp;&nbsp;public&nbsp;&nbsp;String&nbsp;toString()&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;levelStr;<br />
                        &nbsp;&nbsp;}<br />
                        Level&nbsp;继承自Priority,所以在Priority中把上面那段改成<br />
                        &nbsp;&nbsp;public&nbsp;&nbsp;String&nbsp;toString()&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;levelStr;<br />
                        &nbsp;&nbsp;}<br />
                        让Level可以覆盖toString.<br />
                        在Level中实现：<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;toString()&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s=super.toString();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("ALL"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"全部";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("DEBUG"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"调试";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if(s.equals("FINE"))&nbsp;return&nbsp;Level.FINE;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("INFO"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"信息";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("WARN"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"警告";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("ERROR"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"错误";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("FATAL"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"致命";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals("OFF"))<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"关闭";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"异常";<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        想怎么改就怎么改，尽情发挥吧！<br />
                        完了之后编译：Overridejavac&nbsp;Priority.java&nbsp;Level.java<br />
                        把这两个文件拷贝到你用的log4j包中。<br />
                        我用winrar打开log4j包，然后把里面的文件踢出，再加进这两个文件！<br />
                        呵呵！！懒人方法！！<br />
                        还有，Log4j的输出是TTCCLayout中的format方法，如果有什么想法，可以在这个方法中搞定！！ <br />
                        <br />
                        <script type="text/javascript"><!-- google_ad_client="pub-7390275636631344" ; google_ad_width="728;
google_ad_height" = 90; google_ad_format="728x90_as" ; google_ad_type="text_image" ; google_ad_channel="5095444487" ; google_color_border="336699" ; google_color_bg="FFFFFF" ; google_color_link="0000FF" ; google_color_url="008000" ; google_color_text="000000" ;
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/150964.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-08 09:22 <a href="http://www.blogjava.net/i369/articles/150964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAP基础</title><link>http://www.blogjava.net/i369/articles/138322.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 21 Aug 2007 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/138322.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/138322.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/138322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/138322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/138322.html</trackback:ping><description><![CDATA[一.LDAP的4中基本模型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LDAP的体系结构由4中基本模型组成：信息模型描述LDAP的信息表达方式；命名模型描述LDAP的数据如何组织；功能模型描述LDAP的数据操作访问方式；安全模型描述LDAP的安全机制。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.信息模型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LDAP信息模型定义能够在目录中存储的数据类型和基本的信息单位。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.命名模型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LDAP中的命名模型，即LDAP中的条目定位方式。在LDAP中每个条目均有自己的DN(Distinguished Name,标识名)和RDN(Relative Distinguished Name,相对标识名)。DN是该条目在整个数中唯一名称标识。RDN是条目在父节点下唯一名称标识，如同文件系统中，带路径的文件名就是DN，文件名就是RDN.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.功能模型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LDAP功能模型说明了能够使用LDAP协议对目录执行某些操作。在LDAP中共有4类操作（共10种）：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)查询类操作，如搜索，比较；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)更新类操作，如添加条目，删除条目，修改条目和修改条目名；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)认证类操作，如绑定，解绑定；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)其它操作，如放弃和扩展操作。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.安全模型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LDAP的安全模型主要是基于绑定操作的，绑定操作的不同使得安全机制有所不同。3种：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)无认证<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)基本认证：当使用LDAP的基本安全认证时，客户进程通过网络向服务进程发送一个分辨名(DN)和口令来标识自己。服务进程检查客户进程发送的分辨名(DN)和密码是否与目录中储存的分辨名(DN)和密码相匹配，如果匹配则认为通过了认证。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)SASL认证：即LDAP提供的在SSL和TLS安全通道基础上进行的身份认证，包括数字证书的认证。<br>&nbsp;&nbsp;&nbsp;&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二.LDAP存储结构<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一棵目录信息数由若干条目(Entry)组成，每个条目有惟一的标识名DN，一个条目是一个对象，每个条目由多个&#8220;属性(Attribute)&#8221;组成，每个属性由一个类型和一个到多个值组成，每个属性可以对应一个或多个&#8220;值(Value)&#8221;。<br><a href="http://hiphotos.baidu.com/%B3%AC%B5%D8%B4%F8/pic/item/b1435fd8e7f9543232fa1c7c.jpg" target=_blank><img src="http://hiphotos.baidu.com/%B3%AC%B5%D8%B4%F8/pic/item/b1435fd8e7f9543232fa1c7c.jpg" border=0></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三.LDAP的基本概念<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目录数据库是以目录信息数(Directory Information Tree,DIT)为存储方式的数型存储结构。<br>*常用关键字及其对应的含义<br>【dc】-- Domain Component-- 域名的部分，其格式是将完整的域名分成几部分，如域名为example.com变成dc=example,dc=com</p>
<p>【uid】-- User ID-- 用户ID,如&#8220;tom&#8221;</p>
<p>【ou】-- Organization Unit-- 组织单位，类似于Linux文件系统中的子目录，是一个容器对象，组织单位可以包含其他各种对象（包括其他组织单元），如&#8220;market&#8221;</p>
<p>【sn】-- Surname-- 姓，如&#8220;Johansson&#8221;</p>
<p>【dn】-- Distinguished Name-- 唯一辨别名，类似于Linux文件系统中的绝对路径，每个对象都有一个唯一的名称，如&#8220;uid=tom,ou=market,dc=example,dc=com&#8221;,在一个目录树中DN总是唯一的</p>
<p>【rdn】-- Relative dn-- 相对辨别名，类似于文件系统中的相对路径，它是与目录树结构无关的部分，如&#8220;uid=ton&#8221;或&#8220;cn=Thomas Johansson&#8221;</p>
<p>【c】-- Country -- 国家，如&#8220;CN&#8221;或&#8220;US&#8221;等</p>
<p>【o】-- Organization -- 组织名，如&#8220;Example,Inc.&#8221;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 四.规划目录树<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要实现LDAP,首先要规划目录树，一个灵活且易于扩展的目录树可以减少后期维护目录树的工作量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过例子说明。假设有一个名为Example的公司(DNS名为example.com),其组织结构如下：<br><a href="http://hiphotos.baidu.com/%B3%AC%B5%D8%B4%F8/pic/item/5c6b094ac865a32408f7ef77.jpg" target=_blank><img src="http://hiphotos.baidu.com/%B3%AC%B5%D8%B4%F8/pic/item/5c6b094ac865a32408f7ef77.jpg" border=0></a></p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp; (1)首先要为目录树建立一个&#8220;根(Root)&#8221;。根是目录树的最顶层，后面建立的所有对象都是基于这个根的，所以它也称为基准DN。它可以有3种格式表示。<br>&nbsp;&nbsp;&nbsp;&nbsp; *使用X.500标准格式：o=example,c=CN。 <br>&nbsp;&nbsp;&nbsp;&nbsp; *直接使用公司的DNS域名：o=example.com。<br>&nbsp;&nbsp;&nbsp;&nbsp; *使用公司的DNS域名的不同部分：dc=example,dc=com。<br>&nbsp;&nbsp;&nbsp;&nbsp; 第3种格式更利于以后目录树的扩展，如将来Example公司合并了abc公司，之需要将dc=com最为根即可，不需要修改原有的结构。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; (2)公司中的部门作为OU,如&#8220;ou=market&#8221;。OU是目录树的分枝节点，下面可以包含其他分枝节点或叶子节点。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; (3)用户是目录树的最底层（即叶子节点），可以根据用户所在的部门将其放置在不同的OU中，使用uid或cn描述都可以，如&#8220;uid=tom&#8221;或&#8220;cn=Thomas Johansson&#8221;。<br><a href="http://hiphotos.baidu.com/%B3%AC%B5%D8%B4%F8/pic/item/7e0366a4afe2ecf09152ee77.jpg" target=_blank><img src="http://hiphotos.baidu.com/%B3%AC%B5%D8%B4%F8/pic/item/7e0366a4afe2ecf09152ee77.jpg" border=0></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 四.LDAP服务的应用领域<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于LDAP所具有的查询效率高，树状的信息管理模式，分布式的部署框架以及灵活而细腻的访问控制，是LDAP广泛地用于基础性，关键性信息（如用户信息，网络资源信息等）的管理。LDAP的应用主要涉及以下几种类型。<br>&nbsp;&nbsp;&nbsp;&nbsp; *信息安全类：数字证书管理，授权管理，单点登录。<br>&nbsp;&nbsp;&nbsp;&nbsp; *科学计算类：DCE(Distributed Computing Envirionment,分布式计算环境)，UDDI(Universal Description,Discovery and Integration,统一描述，发现和集成协议)。<br>&nbsp;&nbsp;&nbsp;&nbsp; *网络资源管理类：MAIL系统，DNS系统，网络用户管理，电话号码薄。<br>&nbsp;&nbsp;&nbsp;&nbsp; *电子政务资源管理类：内网组织信息服务，电子政务目录体系，人口基础库，法人基础库。</p>
<br>
<img src ="http://www.blogjava.net/i369/aggbug/138322.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-08-21 11:44 <a href="http://www.blogjava.net/i369/articles/138322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Retrotranslator--将JDK5.0项目完全转换为JDK1.4 字节码的恩物 </title><link>http://www.blogjava.net/i369/articles/135910.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 10 Aug 2007 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135910.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135910.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135910.html</trackback:ping><description><![CDATA[作者：<a href="http://calvin.blogjava.net/"><font color=#366900><u>江南白衣</u></font></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;因为<a href="http://retrotranslator.sf.net/" target=_blank><u><font color=#800080>Retrotranslator</font></u></a>的出现，<a href="http://www.springside.org.cn/"><u><font color=#0000ff>SpringSide 1.0</font></u></a>终于放心升到JDK5.0，并保证仍然100%可以运行在JDK1.4的服务器上。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;不能随意更改运行环境JDK的历史项目，客户真金白银买了不支持JDK5的Weblogic8.1的项目，一般只能看着JDK5的annotation、泛型和EJB3干咽口水，所以上帝說要有光，我们有了这个恩物。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;和以前推荐的<a title=Retroweaver href="http://retroweaver.sourceforge.net/" target=_blank mce_href="http://retroweaver.sourceforge.net/"><u><font color=#0000ff>Retroweaver</font></u></a>一样，大家直接用JDK5开发，如果需要部署到JDK1.4的运行环境，就通过asm把Class转到JDK1.4的字节码。<br>&nbsp;<strong>&nbsp;&nbsp;但它不仅支持JDK5的语法，还支持JDK5的新增API。<br></strong>&nbsp;&nbsp;&nbsp;下午试验了一下，把用了大量JDK5特征的EasyMock移植到JDK1.4，一行代码未改就通过了。正是由于这点，SpringSide终于下定决心升级，毕竟使用JDK5的框架越来越多，如果困守JDK1.4必然受到越来越多局限。既然现在有了完全兼容的保证，就升了吧。&nbsp;本来这么一样东西应该是由Sun发行的，Java的开源社区强悍得吓人。<br><br>&nbsp;&nbsp; Retrotranslator的用法很简单，可以用命令行、Ant和IDEA插件自动转换，<a href="http://retrotranslator.sf.net/"><u><font color=#800080>http://retrotranslator.sf.net</font></u></a> 上讲得很清楚，可以转换Jar，也可以转换Class目录。<br>&nbsp;&nbsp;&nbsp;比较特别的是有个Verify选项，能确保你没有用到它暂时还不支持的JDK5 API（记得Classpath里要加入JDK1.4的rt.jar)。在<font color=#366900><a href="http://www.springside.org.cn/"><font color=#366900><u>SpringSide</u></font></a></font>的build.xml里已加入了这个verfiy&nbsp; target，确保代码仍然可以在JDK1.4上运行。（实践把springside部署回Tomcat5.0+JDK1.4环境，除了Spring cgilib式的AOP Proxy与泛型的反射函数有冲突外需进一步研究外，其它一切工作正常）<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=694204</p>
<img src ="http://www.blogjava.net/i369/aggbug/135910.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-08-10 18:36 <a href="http://www.blogjava.net/i369/articles/135910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Tomcat SSL配置大全 </title><link>http://www.blogjava.net/i369/articles/135893.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 10 Aug 2007 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135893.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135893.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135893.html</trackback:ping><description><![CDATA[<div><font size=4><font size=3>由于配置CAS的单点登陆系统，需要先配置</font></font><font size=4><font size=3>Tomcat的SSL, 在配置tomcat的SSL过程中，我配置的版本是tomcat5.5.20,参考了很多资料，但发现一直不行，后来我换到了5.5.9,结果非常顺利，我于是换了总共4个主要版本，发现SSL的配置还真有些不同，现在我将这些配置记录下来，供下次参考。</font></font></div>
<div>
<hr>
</div>
<div><strong><u><font size=3></font></u></strong></div>
<h1><font color=#000000>参考文档</font></h1>
<div><span>Keytool</span><span>使用指南：</span></div>
<div><span><a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html"><span><font color=#800080>http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html</font></span></a></span></div>
<div>&nbsp;</div>
<div><span>Tomcat-ssl</span><span>配置指南：</span></div>
<div><span></span><span><a href="http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html"><span><font color=#800080>http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html</font></span></a></span></div>
<div><span></span></div>
<div><span></span></div>
<div><span></span></div>
<div><span></span></div>
<h1><span><font color=#000000>配置过程</font></span></h1>
<div><span><span></span></span></div>
<span><span>
<h2><span>1.<span Times New Roman??>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>生成 server key ：</h2>
<div><font color=#000000>以命令行方式切换到目录%TOMCAT_HOME%，在command命令行输入如下命令（jdk1.4以上带的工具）：&nbsp;</font></div>
<div><font color=#000000><font color=#0000ff>keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600</font> </font></div>
<div><font color=#000000></font></div>
<div><font color=#000000>用户名输入域名，如localhost（开发或测试用）或hostname.domainname(用户拥有的域名)，其它全部以 enter 跳过，最后确认，此时会在%TOMCAT_HOME%下生成server.keystore 文件。</font></div>
<div><font color=#000000>注：参数 <span>-validity </span>指证书的有效期(天)，缺省有效期很短，只有90天。</font></div>
<div><font color=#000000></font></div>
<h2>2.&nbsp; 将证书导入的JDK的证书信任库中:</h2>
<div><font color=#000000>这步对于T</font><font color=#000000>omcat的SSL配置不是必须，但对于CAS SSO是必须的，否则会出现如下错误：<span 0,0)?><em><u>edu.yale.its.tp.cas.client.CASAuthenticationException:&nbsp;Unable&nbsp;to&nbsp;validate&nbsp;ProxyTicketValidator。。。</u></em></span></font></div>
<div><font color=#000000><span 0,0)?>导入过程分2步，第一步是导出证书，第二步是导入到证书信任库，命令如下：</span></font></div>
<div><span style="COLOR: rgb(0,0,0)"><font color=#0000ff>keytool -import -trustcacerts -alias tomcat -file server.cer -keystore&nbsp; cacerts -storepass changeit</font></span></div>
<div><span style="COLOR: rgb(0,0,0)"><font color=#0000ff>keytool -import -trustcacerts -alias tomcat -file server.cer -keystore&nbsp; D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts -storepass changeit</font></span></div>
<div><font color=#000000><span 0,0)?></span></font></div>
<div><font color=#000000><span 0,0)?>其他有用keytool命令（列出信任证书库中所有已有证书，删除库中某个证书）：</span></font></div>
<div><span style="COLOR: rgb(0,0,0)"><font color=#0000ff>keytool -list -v -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts</font></span></div>
<div><span style="COLOR: rgb(0,0,0)"><font color=#0000ff>keytool -delete -trustcacerts -alias tomcat&nbsp; -keystore&nbsp; D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts -storepass changeit</font></span></div>
<div><font color=#000000><span 0,0)?></span></font></div>
<div><font color=#000000><span 0,0)?></span></font></div>
<div><font color=#000000></font></div>
<div></div>
<div></div>
<h2><span style="COLOR: navy"><span>3.<span Times New Roman??>&nbsp; 配置TOMCAT&nbsp;:</span></span></span></h2>
<div><font color=#000000><span><span><span Times New Roman??><font color=#000000><font face=Arial>修改%TOMCAT_HOME%\conf\server.xml，以文字编辑器打开，查找这一行：</font></font></span></span></span></font></div>
<div><font color=#000000><span><span><span Times New Roman??>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=comments>&lt;!--&nbsp;Define&nbsp;a&nbsp;SSL&nbsp;HTTP/1.1&nbsp;Connector&nbsp;on&nbsp;port&nbsp;8443&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</span></span></span></font></div>
<div><font face=Arial color=#000000><span><span><span Times New Roman??></span></span></span></font></div>
<div><font color=#000000><span></span></font></div>
<div><font color=#000000><span><font face=Arial>将之后的那段的注释去掉，并加上 keystorePass及keystoreFile属性。</font></span></font></div>
<div><font color=#000000><span></span></font></div>
<div><font color=#000000><span>注意，</span><span>tomcat</span><span>不同版本配置是不同的:</span></font></div>
<h3><span>Tomcat4.1.34</span><span>配置：</span></h3>
<pre><span><font face=Arial>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=comments>&lt;!--&nbsp;Define&nbsp;a&nbsp;SSL&nbsp;Coyote&nbsp;HTTP/1.1&nbsp;Connector&nbsp;on&nbsp;port&nbsp;8443&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>Connector</span><span>&nbsp;</span><span class=attribute>className</span><span>=</span><span class=attribute-value>"org.apache.coyote.tomcat4.CoyoteConnector"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>port</span><span>=</span><span class=attribute-value>"8443"</span><span>&nbsp;</span><span class=attribute>enableLookups</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;</span><span class=attribute>scheme</span><span>=</span><span class=attribute-value>"https"</span><span>&nbsp;</span><span class=attribute>secure</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>acceptCount</span><span>=</span><span class=attribute-value>"100"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>useURIValidationHack</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>disableUploadTimeout</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>clientAuth</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>sslProtocol</span><span>=</span><span class=attribute-value>"TLS"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystoreFile</span><span>=</span><span class=attribute-value>"server.keystore"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystorePass</span><span>=</span><span class=attribute-value>"changeit"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</font></span></pre>
<div><font face=Arial><font face=Arial color=#000000><font face=Arial></font></font></font></div>
<div><font color=#000000></font></div>
<div><font color=#000000></font></div>
<div><font color=#000000></font></div>
<div><font color=#000000></font></div>
<div><font color=#000000></font></div>
<h3><span>Tomcat5.5.9</span><span>配置：</span><span><br></span>
<div><font color=#000000>&nbsp;
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=comments>&lt;!--&nbsp;Define&nbsp;a&nbsp;SSL&nbsp;HTTP/1.1&nbsp;Connector&nbsp;on&nbsp;port&nbsp;8443&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span></span><span class=tag>&lt;</span><span class=tag-name>Connector</span><span>&nbsp;</span><span class=attribute>port</span><span>=</span><span class=attribute-value>"8443"</span><span>&nbsp;</span><span class=attribute>maxHttpHeaderSize</span><span>=</span><span class=attribute-value>"8192"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>maxThreads</span><span>=</span><span class=attribute-value>"150"</span><span>&nbsp;</span><span class=attribute>minSpareThreads</span><span>=</span><span class=attribute-value>"25"</span><span>&nbsp;</span><span class=attribute>maxSpareThreads</span><span>=</span><span class=attribute-value>"75"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>enableLookups</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>disableUploadTimeout</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>acceptCount</span><span>=</span><span class=attribute-value>"100"</span><span>&nbsp;</span><span class=attribute>scheme</span><span>=</span><span class=attribute-value>"https"</span><span>&nbsp;</span><span class=attribute>secure</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>clientAuth</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>sslProtocol</span><span>=</span><span class=attribute-value>"TLS"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystoreFile</span><span>=</span><span class=attribute-value>"server.keystore"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystorePass</span><span>=</span><span class=attribute-value>"changeit"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</font></div>
<h3><span>Tomcat5.5.20</span><span>配置</span><span>(</span><span>此配置同样可用于</span><span>Tomcat6.0)</span><span>：</span><br>&nbsp;</h3>
<div>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=comments>&lt;!--&nbsp;Define&nbsp;a&nbsp;SSL&nbsp;HTTP/1.1&nbsp;Connector&nbsp;on&nbsp;port&nbsp;8443&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span></span><span class=tag>&lt;</span><span class=tag-name>Connector</span><span>&nbsp;</span><span class=attribute>protocol</span><span>=</span><span class=attribute-value>"org.apache.coyote.http11.Http11Protocol"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>port</span><span>=</span><span class=attribute-value>"8443"</span><span>&nbsp;</span><span class=attribute>maxHttpHeaderSize</span><span>=</span><span class=attribute-value>"8192"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>maxThreads</span><span>=</span><span class=attribute-value>"150"</span><span>&nbsp;</span><span class=attribute>minSpareThreads</span><span>=</span><span class=attribute-value>"25"</span><span>&nbsp;</span><span class=attribute>maxSpareThreads</span><span>=</span><span class=attribute-value>"75"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>enableLookups</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>disableUploadTimeout</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>acceptCount</span><span>=</span><span class=attribute-value>"100"</span><span>&nbsp;</span><span class=attribute>scheme</span><span>=</span><span class=attribute-value>"https"</span><span>&nbsp;</span><span class=attribute>secure</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>clientAuth</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>sslProtocol</span><span>=</span><span class=attribute-value>"TLS"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystoreFile</span><span>=</span><span class=attribute-value>"server.keystore"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystorePass</span><span>=</span><span class=attribute-value>"changeit"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div></div>
<div><font color=#000000></font></div>
<div><span><font color=#000000></font></span></div>
<div><font color=#000000><span></span></font></div>
<h3><span>Tomcat6.0.10</span><span>配置：<br></span><span><font face=Arial></font></span></h3>
<div class=code_title>xml 代码</div>
<div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=tag>&lt;</span><span class=tag-name>Connector</span><span>&nbsp;</span><span class=attribute>protocol</span><span>=</span><span class=attribute-value>"org.apache.coyote.http11.Http11NioProtocol"</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>port</span><span>=</span><span class=attribute-value>"8443"</span><span>&nbsp;</span><span class=attribute>minSpareThreads</span><span>=</span><span class=attribute-value>"5"</span><span>&nbsp;</span><span class=attribute>maxSpareThreads</span><span>=</span><span class=attribute-value>"75"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>enableLookups</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;</span><span class=attribute>disableUploadTimeout</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>acceptCount</span><span>=</span><span class=attribute-value>"100"</span><span>&nbsp;&nbsp;</span><span class=attribute>maxThreads</span><span>=</span><span class=attribute-value>"200"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>scheme</span><span>=</span><span class=attribute-value>"https"</span><span>&nbsp;</span><span class=attribute>secure</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;</span><span class=attribute>SSLEnabled</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>clientAuth</span><span>=</span><span class=attribute-value>"false"</span><span>&nbsp;</span><span class=attribute>sslProtocol</span><span>=</span><span class=attribute-value>"TLS"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystoreFile</span><span>=</span><span class=attribute-value>"D:/tools/apache-tomcat-6.0.10/server.keystore"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=attribute>keystorePass</span><span>=</span><span class=attribute-value>"changeit"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div><span><font face=Arial>tomcat6支持3种，请参考以下文档：</font></span></div>
<div><span><font face=Arial><font face=Arial><a href="http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html">http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html</a></font></font></span> </div>
<div></div>
<h1><font color=#000000>验证配置</font></h1>
<div><font color=#000000></font></div>
<div><font color=#000000>访问 </font><a href="https://localhost:8443/"><font color=#000000>https://localhost:8443/</font></a></div>
</h3>
<p><br>原文好像有点问题：<br><br><span><span></p>
<div><font color=#000000><span>导入过程分2步，第一步是导出证书，第二步是导入到证书信任库，命令如下：</span></font></div>
<div><span 0, 0);?><font color=#0000ff>keytool -import -trustcacerts -alias tomcat -file server.cer -keystore&nbsp; cacerts -storepass changeit<br><font color=#339966>（应该修正为<br>keytool <font color=#ff0000>-export</font> -trustcacerts -alias tomcat -file server.cer -keystore <font color=#ff0000>server.keystore</font> -storepass changeit<br>）</font></font></span></div>
<div><span 0, 0);?><font color=#0000ff>keytool -import -trustcacerts -alias tomcat -file server.cer -keystore&nbsp; D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts -storepass changeit</font></span></div>
</span></span></span></span>
<img src ="http://www.blogjava.net/i369/aggbug/135893.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-08-10 17:20 <a href="http://www.blogjava.net/i369/articles/135893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c/c++中指针学习的两个绝好例子 </title><link>http://www.blogjava.net/i369/articles/134647.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 06 Aug 2007 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/134647.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/134647.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/134647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/134647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/134647.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针学习不好关键是概念不清造成的，说的简单点就是书没有认真看，指针的学习犹如人在学习饶口令不多看多学多练是不行的，下面是两个很经典的例子，很多书上都有,对于学习的重点在于理解*x和x的理解，他们并不相同，*x所表示的其实就是变量a本身，x表示的是变量a在内存中的地址，如果想明白可以输出观察cout&lt;&lt;*x"|"x;，当定义了int&nbsp; *x后，对x=&amp;a的理解的问题。仔细阅读和联系下面的两个例子我想指针问题就不是难点了！
<p class=code clear=all>#include&nbsp;&lt;stdio.h&gt;&nbsp; <br>&nbsp; <br>main()&nbsp; <br>{&nbsp; <br><font color=#0000ff>int</font>&nbsp;a,b;&nbsp;<font color=#008000>/*&nbsp;定义a,b两个整形变量用于输入两个整数&nbsp;*/</font> <br><font color=#0000ff>int</font>&nbsp;*point_1,*point_2,*temp_point;&nbsp;<font color=#008000>/*&nbsp;定义三个指针变量&nbsp;*/</font> <br><font color=#800000>scanf</font>("%d,%d",&amp;a,&amp;b);&nbsp;<font color=#008000>/*&nbsp;格式化输入a,b的值&nbsp;*/</font> <br>point_1=&amp;a;&nbsp;<font color=#008000>/*&nbsp;把指针变量point_1的值指向变量a的地址&nbsp;*/</font> <br>point_2=&amp;b;&nbsp;<font color=#008000>/*&nbsp;把指针变量point_2的值指向变量b的地址&nbsp;*/</font> <br><font color=#0000ff>if</font>&nbsp;(a&lt;b)&nbsp; <br>{&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;temp_point=point_1;&nbsp;<font color=#008000>/*&nbsp;这里的temp_point是用于临时存储point_1的值也就是变量a的地址的&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;point_1=point_2;&nbsp;<font color=#008000>/*&nbsp;把point_2的值赋予point_1&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;point_2=temp_point;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>/*&nbsp;由于point_1的值已经改变无法找到,利用前面临时存储的也就是temp_point找回原point_1的值赋予point_2,打到把point_1和point_2值对换的目的*/</font> <br>}&nbsp; <br><font color=#800000>printf</font>("%d,%d",*point_1,*point_2);&nbsp;<font color=#008000>/*&nbsp;利用*point_1和*point_2也就是分辨指向b和a的方法把值显示自爱屏幕上&nbsp;*/</font> <br>}&nbsp; <br>&nbsp; <br><font color=#008000>/*&nbsp;此题需要注意和了解是的此法并没有改变变量a,b的值只是利用指针变量分别存储a和b的地址,然后再把那两个指针变量的值对换一下其实就是存储在&nbsp; <br>指针变量里面a与b的地址对换,在利用*point_1和*point_2的方式把调换后的值显示出来这里的*point_1实际就是a,此中算法并非真的改变a,b的值,而是&nbsp; <br>利用指针进行地址交换达到大小排序的目的.&nbsp; <br>*/</font> </p>
<p><br><br>&nbsp;</p>
<p class=code>#include&nbsp;&lt;stdio.h&gt;&nbsp; <br>&nbsp; <br>main()&nbsp; <br>{&nbsp; <br><font color=#0000ff>int</font>&nbsp;a,b;&nbsp;<font color=#008000>/*&nbsp;定义a,b两个整形变量用于输入两个整数&nbsp;*/</font> <br><font color=#0000ff>int</font>&nbsp;*point_1,*point_2;&nbsp;<font color=#008000>/*&nbsp;定义三个指针变量&nbsp;*/</font> <br><font color=#800000>scanf</font>("%d,%d",&amp;a,&amp;b);&nbsp;<font color=#008000>/*&nbsp;格式化输入a,b的值&nbsp;*/</font> <br>point_1&nbsp;<font color=#ff0000>=</font>&nbsp;&amp;a;&nbsp;<font color=#008000>/*&nbsp;把指针变量point_1的值指向变量a的地址&nbsp;*/</font> <br>point_2&nbsp;<font color=#ff0000>=</font>&nbsp;&amp;b;&nbsp;<font color=#008000>/*&nbsp;把指针变量point_2的值指向变量b的地址&nbsp;*/</font> <br>compositor(point_1,point_2);&nbsp;<font color=#008000>/*&nbsp;调用自定义的排序涵数,把a,b的地址传递给point_1和point_2&nbsp;*/</font> <br><font color=#800000>printf</font>("%d,%d",a,b);&nbsp;<font color=#008000>/*&nbsp;打印出a,b的值&nbsp;*/</font> <br>}&nbsp; <br>&nbsp; <br><font color=#0000ff>static</font>&nbsp;compositor(p1,p2)&nbsp; <br><font color=#0000ff>int</font>&nbsp;*p1,*p2;&nbsp;<font color=#008000>/*&nbsp;定义形式参数p1,p2为指针变量&nbsp;*/</font> <br>{&nbsp; <br><font color=#0000ff>int</font>&nbsp;temp;&nbsp;<font color=#008000>/*&nbsp;建立临时存储变量&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000ff>if</font>&nbsp;(*p1&lt;*p2)&nbsp;<font color=#008000>/*&nbsp;如果*p1&lt;p2,注意这里的*p1和*p2其实就是a和b&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;<font color=#ff0000>=</font>&nbsp;*p1;&nbsp;<font color=#008000>/*&nbsp;利用变量temp用于临时存储*p1和就是a的值&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p1&nbsp;<font color=#ff0000>=</font>&nbsp;*p2;&nbsp;<font color=#008000>/*&nbsp;将*p1的值也就是a的值换成*p2的值也就是b的值,等价于a=b&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p2&nbsp;<font color=#ff0000>=</font>&nbsp;temp;&nbsp;<font color=#008000>/*&nbsp;将*p2的值也就是temp的值等价于b=temp&nbsp;*/</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br>}&nbsp; <br>&nbsp; <br><font color=#008000>/*&nbsp;注意:此题与上题不同的是,直接改变了a于b的值达到真实改变的目的&nbsp;*/</font></p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=315632</p>
<img src ="http://www.blogjava.net/i369/aggbug/134647.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-08-06 11:07 <a href="http://www.blogjava.net/i369/articles/134647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用开源项目</title><link>http://www.blogjava.net/i369/articles/134617.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 06 Aug 2007 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/134617.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/134617.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/134617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/134617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/134617.html</trackback:ping><description><![CDATA[<p>Lomboz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.objectlearn.com/index.jsp"><font color=#009933>http://www.objectlearn.com/index.jsp</font></a>&nbsp;(J2EE plugin for Eclipse)<br>htmlArea&nbsp;&nbsp;&nbsp; <a href="http://www.htmlarea.com/"><font color=#009933>http://www.htmlarea.com/</font></a>&nbsp;(所见即所得的在线HTML编辑器)<br>XmlBuddy&nbsp;&nbsp; <a href="http://www.xmlbuddy.com/"><font color=#009933>http://www.xmlbuddy.com/</font></a>&nbsp;(XML Editor plugin for Eclipse)<br>JFreeChart <a href="http://www.jfree.org/"><font color=#009933>http://www.jfree.org/</font></a>&nbsp;(用于生成图表的项目)<br>EclipseME&nbsp;&nbsp; <a href="http://eclipseme.sourceforge.net/"><font color=#009933>http://eclipseme.sourceforge.net/</font></a>&nbsp;(J2ME Developmnt Plugin for Eclipse)<br>mvnForum&nbsp; <a href="http://sourceforge.net/projects/mvnforum/"><font color=#009933>http://sourceforge.net/projects/mvnforum/</font></a>&nbsp;(论坛)<br>jChatBox&nbsp;&nbsp;&nbsp; <a href="http://www.javazoom.net/index.shtml"><font color=#009933>http://www.javazoom.net/index.shtml</font></a>&nbsp;(用servlet实现的WEB聊天引擎)<br>POI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://jakarta.apache.org/poi/index.html"><font color=#009933>http://jakarta.apache.org/poi/index.html</font></a>&nbsp;(用于处理Excel,WORD等文档的项目)<br>FileUpload <a href="http://jakarta.apache.org/commons/fileupload/"><font color=#009933>http://jakarta.apache.org/commons/fileupload/</font></a>&nbsp;(用于处理HTTP文件上传得项目)<br>PDFBox&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://sourceforge.net/projects/pdfbox/"><font color=#009933>http://sourceforge.net/projects/pdfbox/</font></a>&nbsp;(处理PDF文档的项目)<br>Lucene&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://jakarta.apache.org/lucene/index.html"><font color=#009933>http://jakarta.apache.org/lucene/index.html</font></a>&nbsp;(搜索引擎)<br>Digester&nbsp;&nbsp;&nbsp; <a href="http://jakarta.apache.org/commons/digester/"><font color=#009933>http://jakarta.apache.org/commons/digester/</font></a>&nbsp;(处理XML信息的项目)<br>DBCP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://jakarta.apache.org/commons/dbcp/"><font color=#009933>http://jakarta.apache.org/commons/dbcp/</font></a>&nbsp; (数据库连接池)<br>AXIS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://ws.apache.org/axis/"><font color=#009933>http://ws.apache.org/axis/</font></a>&nbsp;(WebService 的实现框架)<br>Jetspeed&nbsp;&nbsp; <a href="http://portals.apache.org/jetspeed-1/"><font color=#009933>http://portals.apache.org/jetspeed-1/</font></a>&nbsp;(Portal)<br>HSQLDB&nbsp;&nbsp;&nbsp; <a href="http://sourceforge.net/projects/hsqldb/"><font color=#009933>http://sourceforge.net/projects/hsqldb/</font></a>&nbsp;(Im memory Database Engine)<br>CEWOLF&nbsp;&nbsp; <a href="http://sourceforge.net/projects/cewolf/"><font color=#009933>http://sourceforge.net/projects/cewolf/</font></a>&nbsp; (一套标签库实现Web报表,使用的是jFreeChart引擎)<br>Struts Menu <a href="http://sourceforge.net/projects/struts-menu/"><font color=#009933>http://sourceforge.net/projects/struts-menu/</font></a>&nbsp; (基于Struts的Web菜单项目)<br>htmlparser&nbsp;&nbsp; <a href="http://sourceforge.net/projects/htmlparser/"><font color=#009933>http://sourceforge.net/projects/htmlparser/</font></a>&nbsp;&nbsp; (用于解析HTML信息的项目)<br>Mondrian&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://sourceforge.net/projects/mondrian/"><font color=#009933>http://sourceforge.net/projects/mondrian/</font></a>&nbsp; (Open Source OLAP Database)<br>ProGuard&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://sourceforge.net/projects/proguard/"><font color=#009933>http://sourceforge.net/projects/proguard/</font></a>&nbsp;(Java的混淆器)<br>InfoGlue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://sourceforge.net/projects/infoglue/"><font color=#009933>http://sourceforge.net/projects/infoglue/</font></a>&nbsp; (J2EE 内容管理系统)<br>JPivot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://sourceforge.net/projects/jpivot/"><font color=#009933>http://sourceforge.net/projects/jpivot/</font></a>&nbsp; (基于WEB的OLAP 展现)<br>HttpClient&nbsp;&nbsp; <a href="http://jakarta.apache.org/commons/httpclient/"><font color=#009933>http://jakarta.apache.org/commons/httpclient/</font></a>&nbsp; 处理http客户端的接口<br>JDavMail&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://jdavmail.sourceforge.net/"><font color=#009933>http://jdavmail.sourceforge.net/</font></a>&nbsp; 一个JavaMail的提供者用来访问Hotmail邮箱<br>ANTLR <a href="http://www.antlr.org/"><font color=#009933>http://www.antlr.org/</font></a>&nbsp;一个用于生成识别语法分析器的项目<br>ArrowHead <a href="http://www.tripi.com/arrowhead"><font color=#009933>http://www.tripi.com/arrowhead</font></a>&nbsp;在JSP环境下执行ASP页面的项目<br>unixODBC&nbsp; <a href="http://www.unixodbc.org/"><font color=#009933>http://www.unixodbc.org/</font></a>&nbsp;在UNIX下的ODBC驱动框架</p>
<img src ="http://www.blogjava.net/i369/aggbug/134617.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-08-06 10:31 <a href="http://www.blogjava.net/i369/articles/134617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最简便有效的恢复IE为默认浏览器的方法</title><link>http://www.blogjava.net/i369/articles/132501.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 26 Jul 2007 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/132501.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/132501.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/132501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/132501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/132501.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IE本来是Windows默认的浏览器，但是浏览器一安装多了就会乱套了，稍微点错了默认浏览器就改成别的了，好像什么后安装的谁就是老大似的<img src="http://spaces.msn.com/rte/emoticons/smile_angry.gif">虽然说好多浏览器都比IE用起来方便，但是对网页支持最好的却是IE，有时候不用它还真不行。
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是被非IE核心的浏览器给替代了如FireFox、Opera等还好说，直接打开IE，点击&#8220;工具－－INTERNET选项－－程序&#8221;，把最下边的&#8220;检查Internet Explorer是否为默认浏览器&#8221;前面的复选框选中，关闭IE再重新打开就会弹出对话框问你&#8220;IE现在不是默认浏览器，是否设置成默认浏览器&#8221;，选择是就可以了。但是如果是被IE核心的浏览器如Maxthon、腾讯TT等替换了，像刚才那样操作根本就不会弹出询问的对话框，一般方法都会建议你修改注册表或者安装诸如上网助手这样自己本身就是流氓软件的DD来摆平，其实Windows XP自带的工具就可以解决这个问题。</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击&#8220;开始－－所有程序&#8221;选中最上面的"设定程序访问和默认值&#8220;，如图</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://static.flickr.com/36/84706323_87f210022f.jpg?v=0">
<p>选中自定义，并且展开&#8221;自定义&#8220;选项，如图所示&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <img src="http://static.flickr.com/43/84705415_12e3ee08a6.jpg?v=0">
<p>选中&#8221;选择一个默认的浏览器下面的&#8220;Internet Explorer&#8221;，再选中&#8220;启用对此程序的访问&#8221;。确认就OK了:)&nbsp;
<p>&nbsp; </p>
<img src ="http://www.blogjava.net/i369/aggbug/132501.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-07-26 12:55 <a href="http://www.blogjava.net/i369/articles/132501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Myeclipse 5.5 GA 算号器源代码（分析） </title><link>http://www.blogjava.net/i369/articles/131266.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Jul 2007 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/131266.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/131266.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/131266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/131266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/131266.html</trackback:ping><description><![CDATA[<p>其实5.5算号器的的源代码并没有多大改变，自己看看就清除了！<br></p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br><br><br></span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">//*5.5.x&nbsp;GA算号源代码</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Crack&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;String&nbsp;convert(String&nbsp;s)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(s&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;s.length()&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;s;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">&nbsp;abyte0[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.getBytes();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ac[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[s.length()];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;abyte0.length;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;k;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;abyte0[i];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">57</span><span style="COLOR: #000000">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">90</span><span style="COLOR: #000000">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">97</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">122</span><span style="COLOR: #000000">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">97</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">97</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ac[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">)&nbsp;j;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;String.valueOf(ac);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;hash(String&nbsp;s)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ac[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.toCharArray();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ac.length;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;k;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">31</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ac[j];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Math.abs(i);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;String&nbsp;inputString()&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;bufferedreader&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BufferedReader(<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;InputStreamReader(System.in));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;bufferedreader.readLine();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;ioexception)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioexception.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;s;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String&nbsp;args[])&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">My&nbsp;Eclipse&nbsp;IDE&nbsp;vxx.xx&nbsp;Keygen</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">License&nbsp;Name&nbsp;:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;inputString();<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;程序关键代码：</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;licStr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YE3MP-100000-0912310</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;h&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.substring(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;licStr<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Decompiling&nbsp;this&nbsp;copyrighted&nbsp;software&nbsp;is&nbsp;a&nbsp;violation&nbsp;of&nbsp;both&nbsp;your&nbsp;license&nbsp;agreement&nbsp;and&nbsp;the&nbsp;Digital&nbsp;Millenium&nbsp;Copyright&nbsp;Act&nbsp;of&nbsp;1998&nbsp;(http://www.loc.gov/copyright/legislation/dmca.pdf).&nbsp;Under&nbsp;section&nbsp;1204&nbsp;of&nbsp;the&nbsp;DMCA,&nbsp;penalties&nbsp;range&nbsp;up&nbsp;to&nbsp;a&nbsp;$500,000&nbsp;fine&nbsp;or&nbsp;up&nbsp;to&nbsp;five&nbsp;years&nbsp;imprisonment&nbsp;for&nbsp;a&nbsp;first&nbsp;offense.&nbsp;Think&nbsp;about&nbsp;it;&nbsp;pay&nbsp;for&nbsp;a&nbsp;license,&nbsp;avoid&nbsp;prosecution,&nbsp;and&nbsp;feel&nbsp;better&nbsp;about&nbsp;yourself.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;s;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;hash(h);<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;lic&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.substring(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;licStr&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Integer.toString(j);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">License&nbsp;Key&nbsp;:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;convert(lic));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;exception)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>}</span></div>
<p><br>&nbsp;</p>
<p>看看代码，其实只有licStr这部分变了：</p>
<p>5.5.x GA版的：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">String&nbsp;licStr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YE3MP-100000-0912310</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span></div>
<p><br>&nbsp;</p>
<p>5.1.x 以前的：<br></p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">String&nbsp;licStr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YE3MP-501-00-0912310</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span></div>
<p><br>&nbsp;</p>
<p>看出来了吧，只是很小的改动！</p>
<p>这段代码的解释：（5.5.x GA）</p>
<p>E3MP&nbsp;&nbsp;表示pro版，E2MY 表示standard版；</p>
<p>100000 前面100表示版本号，后面000为使用人数，可以随便填，默认000为Ultimate；</p>
<p>091231 表示使用到期时间为：2009-12-31，这个已经是最大期限了，不能再改大了！</p>
<img src ="http://www.blogjava.net/i369/aggbug/131266.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-07-19 14:39 <a href="http://www.blogjava.net/i369/articles/131266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_ldap翻译</title><link>http://www.blogjava.net/i369/articles/130031.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 13 Jul 2007 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/130031.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/130031.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/130031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/130031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/130031.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: spring_ldap翻译（一）作为spring框架的一部分，Spring JDBC提供了十分简单而有效的SQL开发。对Java LDAP，我们需要也需要如此。第一章 介绍&nbsp;&nbsp; 1.1 概览&nbsp;&nbsp; Spring-LDAP是一个java简单应用在LDAP开发的一个库，是采取类似Spring JDBC中的JdbcTemplate的原理建立的。它使得...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/130031.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/130031.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-07-13 11:28 <a href="http://www.blogjava.net/i369/articles/130031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于aix下xmanager、cde、ftp、telnet问题的小结</title><link>http://www.blogjava.net/i369/articles/117611.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117611.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117611.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117611.html</trackback:ping><description><![CDATA[感谢农哥等很多朋友的指导，可能不同环境下有不同的解决方法，我只将我的方法贴出来供大家参考：<br><br>&nbsp; &nbsp;&nbsp; &nbsp;1.如果cde无法启动，查看是否安装了cde，如没有将系统盘第一张插进光驱，simt 中有个install software bundle ，选择CDE安装就行了，我看到IBM网站和一些资料都是告诉你安装哪些fileset，很麻烦的，此法安装很方便。<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;如果装好了cde，有时却无法启动cde，就运行一下/etc/rc.dt<br><br>&nbsp; &nbsp;&nbsp; &nbsp;2.如果xmanager无法登陆，请检查/etc/hosts文件，将IP与主机名设置正确，改完之后一定要重启系统！<br><br>&nbsp; &nbsp;&nbsp; &nbsp;3.如果ping小机丢包，telnet很慢（丢包也能telnet，只不过要等很久），请检查你的ip 地址，还有路由，正确设置后ping 就不会丢包了，但telnet还会很慢，这时就检查/etc/resolv.conf，如果存在就把它删掉.<br>&nbsp; &nbsp;&nbsp; &nbsp;<br>&nbsp; &nbsp;&nbsp; &nbsp;4.如果不能ftp，将/etc/ftpusers清空或删掉，还不行？用农哥这招：rm /etc/resolv.conf，还搞不定？那我也没办法了。<br><br>如果哪位还有补充，请跟贴分享，如果有什么漏洞还请指出，谢谢! 
<img src ="http://www.blogjava.net/i369/aggbug/117611.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-05-15 15:08 <a href="http://www.blogjava.net/i369/articles/117611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX CDE不能启动的故障一般性解决方法</title><link>http://www.blogjava.net/i369/articles/117606.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117606.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117606.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117606.html</trackback:ping><description><![CDATA[<div class=NewsContent id=NewsContentLabel>
<p>CDE不能启动的故障一般性解决方法 <br>Document #: 1811114I23000 </p>
<p>Body: <br>CDE不能启动的故障一般性解决方法</p>
<p>环境:AIX ALL</p>
<p>问题描述: <br>用户经常会遇到CDE桌面启动不了的情况，那么遇到这种情况应该如何解决呢？</p>
<p>解答: <br>1、检查是否从图形控制台上能看到login图形提示。如果可以看到，问题仅仅发生在输入用户名密码之后出现篮屏等等不能登陆的情况，那么检查:a&gt;各个文件系统的空间有没有满的。有的话删除部分文件或者扩大文件系统。b&gt;hostname 在/etc/hosts文件中是否和正在使用的IP地址有对应关系。如果有错误，请用hostname更改主机名或者修改/etc/hosts文件。 <br>2、如果不能启动CDE，并且连login的图形提示都无法看到。那么尝试以下步骤：a&gt;执行/usr/dt/bin/dtconfig -kill b&gt;执行ps-ef|grep dt查看是否有dtlogin进程，如果有，用kill -9 PID 杀死该进程 c&gt;在图形主控台上执行 /etc/rc.dt 命令启动CDE桌面，到login提示符。 <br>3、如果上述操作不能成功，或者根本没有/usr/dt/bin/dtconfig 和/etc/rc.dt文件，那么请从光盘上安装所有以X11.*的文件集。安装的时候，请注意选择 OVERWRITE same or newer versions? 为yes。（默认是no）在安装完之后执行第二步，不需要重启。&nbsp;&nbsp;</p>
<br><br><br>本文地址：<a href="http://www.newbooks.com.cn/info/35465.html"><u><font color=#0000ff>http://www.newbooks.com.cn/info/35465.html</font></u></a> </div>
<img src ="http://www.blogjava.net/i369/aggbug/117606.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-05-15 14:59 <a href="http://www.blogjava.net/i369/articles/117606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Xmanager等终端软件无法连接AIX的解决方案</title><link>http://www.blogjava.net/i369/articles/117607.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117607.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117607.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117607.html</trackback:ping><description><![CDATA[<p><strong>显示错误：</strong><br><font color=#ff0000>XDMCP Connection failed.Try again?</font></p>
<p><strong>解决方法：</strong><br>AIX上无须进行任何配置，但是必须有XDMCP协议。服务程序在监听XDMCP端口。CDE的XDMCP服务器为 <br>dtlogin，X Window本身的XDMCP服务器为xdm，当然GNU也有一些其它的服务器。如果AIX上安了CDE，则只要启动CDE即可。如果没有安装CDE，需要启动xdm。 </p>
<p>以下命令可以确认XDMCP服务器已经启动： <br>netstat -an|grep 177 </p>
<p>检查输出，确认状态为LISTEN。如果一切正常，就可以使用Xmanager通过登录了。 </p>
<p>安装完Xmanager后，在Xbrowser中New一个XDMCP，选择XDM query，在Host输入框输入主机名或IP <br>地址，选Apply，然后Done，启动Xmanager就会显示图形登录介面了。&nbsp;</p>
<img src ="http://www.blogjava.net/i369/aggbug/117607.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-05-15 14:59 <a href="http://www.blogjava.net/i369/articles/117607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX常用命令 </title><link>http://www.blogjava.net/i369/articles/117605.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117605.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117605.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117605.html</trackback:ping><description><![CDATA[AIX常用命令<br>
<p class=line-height><br>查看交换区信息： <br>lsps -a 显示交换区的分布信息 <br>lsps -s 显示交换区的使用信息 <br>slibclean 清除处理程序遗留的旧分页信息 <br>smit mkps 建立交换区空间信息 <br>swapon -a 启动所有的分页空间 <br>/etc/swapspaces 存放分页空间表格信息 <br>------------------------------------------------- <br>显示卷信息： <br>lsvg 显示卷的名称 <br>lsvg -l rootvg 显示rootvg卷的详细信息 <br><br>------------------------------------------------- <br>mount卷的方法： <br>varyonvg datavg 加载datavg卷 <br>mount /dev/data1 加载datavg下的一个data1卷 <br><br>裸设备类型：raw,jfs jfs可以转变成文件系统，而raw则不行 <br>------------------------------------------------- <br><br>在裸设备上安装oracle系统： <br>修改裸设备的权限，如裸设备名为system01，安装数据库用户为oracle <br>chown oracle:dba /dev/system01 <br>chown oracle:dba /dev/rsystem01 <br>在使用文件时必须用rsystem01 <br>------------------------------------------------- <br><br>smit快速路径名称：(smit：图形方式，smitty：字符方式) <br>dev 设备管理 <br>diag 诊断 <br>jfs 定期档案管理系统 <br>lvm 逻辑卷册系统管理员管理 <br>nfs NFS管理 <br>sinstallp 软件安装及维护 <br>spooler 列印队列管理 <br>system 系统管理 <br>tcpip TCP/IP管理 <br>USER 使用者管理 <br>clstart，clstop：启动和停止cluster <br>lssrc -g cluser：查看cluser的状态 <br>------------------------------------------------- <br><br>查看已安装的软件信息： <br>ls -aF /usr/lpp (lpp:Licensed Program Products) <br>查看安装媒体内容： <br>installp -q -d /dev/cdrom -l <br>------------------------------------------------- <br><br>启动时自动加载文件系统信息： <br>需要加载的信息存放在/etc/filesystems <br>mount -t nf 加载所有在/ect/filesystems中定义type=nfs的文件系统 <br>显示已加载的文件系统及状态： df -v,mount <br>------------------------------------------------- <br><br>查看错误日志信息： <br>errpt -a <br>------------------------------------------------- <br><br>有关TCP/IP的命令 <br>网路卡： <br>smit chgenet,chgtok,chgfddi,opschange,mktty:adptr架构快速路径 <br>smit mkinet,ppp:slip与ppp快速路径 <br>ifconfig:config界面 <br>位址： <br>/etc/hosts 静态主机表 <br>/etc/resolv.conf 位址解析的名称服务器 <br>/etc/named.boot 名称服务器架构 <br>/etc/named.ca 根名称服务器快取 <br>/etc/named.data 位址列表 <br>/etc/named.rev 反转指标列表 <br>nslookup 查询名称服务器资讯 <br>网络路由： <br>route 管理路由 <br>netstat -rn 列出定义的路由 <br>routed 路由(daekmin rip) <br>gated 路由(daekmin rip、egp、hello) <br>/etc/gateways 已知网关 <br>/etc/networks 已知网路 <br>服务： <br>/etc/services <br>/etc/inetd.conf <br>TCP/IP群组子系统: <br>/etc/rc.net <br>startsrc -g tcpip 启动全部的tcpip子系统 <br>startsrc -s inetd 启动主要internet <br>除错： <br>iptrace 启动封包追踪 <br>ipreport 追踪结果格式化输出 <br>netstat 网络统计 <br>ping 检查是否可以到达 <br>查看HACMP，外部硬盘信息: <br>lscfg -v <br>lsdev -Cc adapter <br>对等机器信息： <br>/etc/.rhosts <br>/etc/hosts.equiv <br>/etc/hosts <br>------------------------------------------------- <br><br>观察进程内存使用情况： <br>ps aux 观察参数%mem：内存使用百分比 RSS:实际使用内存 <br>vmstat free的单位为块，缺省值为4096bytst <br>------------------------------------------------- <br><br>创建raw设备时选择的类型: <br>raw_lv <br><br></p>
<p class=line-height>自己总结的aix的命令，且都在小型机上通过！<br><br>登陆<br>cmd-&gt;telnet 10.122.149.1<br>修改密码<br>#passwd<br>关机<br>#shutdown<br>#shutdown &#8211;F<br>重启计算机<br>#shutdown &#8211;Fr<br>进入目录<br>#cd app(目录名)<br>回退：<br>#cd ..<br>查看设备状态<br>#lsdev -Cc disk查看磁盘是否可用<br>#lsdev -Cc adapter查看适配器是否可用<br>#lsdev -Cc tape 查看磁带是否可用<br>查看磁盘的基本属性<br>#lsattr -El hdisk5<br>从root用户修改为oracle用户<br>#chown oracle:dba aa.txt(文件名称/磁盘名称)<br>修改disk5磁盘的读写权限<br>#chmod 755 *hdisk5 <br>删除磁盘<br>#rmdev &#8211;dl hdisk5<br>磁带备份<br>#cfgmgr &#8211;v 确认磁带机<br>#lsdev &#8211;Cc tape 看磁带机是否可用<br>开始备份<br>#smitty mksysb<br>#选择可用磁带机回车(esc+4)选择<br>镜像<br>#smitty vg<br>#选择 mirror a volume group <br>#选择 rootvg<br>#hdisk1需要一段时间<br>#bosboot &#8211;ad hdisk1<br>#bootlist &#8211;m normal hdisk0 hdisk1 硬盘启动的顺序<br>HACMP 启动和停止<br>(1)、启动 HACMP<br>使用以下步骤启动 HACMP：<br>&nbsp; &nbsp; &nbsp; &nbsp; 以 root 用户 login AIX<br>&nbsp; &nbsp; &nbsp; &nbsp; 使用 smitty cl_admin 进入 HACMP 管理界面<br>&nbsp; &nbsp; &nbsp; &nbsp; 选择 Manage Cluster Services 菜单项，按 Enter 键<br>选择 Start Cluster Services 菜单项，按 Enter 键<br>&nbsp; &nbsp; &nbsp; &nbsp; 按 Enter 键启动 HACMP<br>(2)、停止 HACMP<br>使用以下步骤启动 HACMP：<br>&nbsp; &nbsp; &nbsp; &nbsp; 以 root 用户 login AIX<br>&nbsp; &nbsp; &nbsp; &nbsp; 使用 smitty cl_admin 进入 HACMP 管理界面<br>&nbsp; &nbsp; &nbsp; &nbsp; 选择 Manage Cluster Services 菜单项，按 Enter 键<br>&nbsp; &nbsp; &nbsp; &nbsp; 选择 Stop Cluster Services 菜单项，按 Enter 键<br>&nbsp; &nbsp; &nbsp; &nbsp; 按 Enter 键停止 HACMP<br>查看ip地址和子网掩码，端口号<br>#ifconfig -a <br>#netstat -i<br>#netstat -in<br>#uptime 运行天数<br>#ps &#8211;ep|grep ora 查看ora进程<br>#ps &#8211;ep|grep 查看所有的进程<br>#ps &#8211;ep|pg 按页显示进程<br>FTP命令<br>cmd下 ftp 10.122.149.1<br>#bin二进制模式下传送<br>#mput a.txt上传文件<br>#mget a.txt下载文件<br>#errpt 查看错误信息<br>#errpt &gt;/tmp/errpt2007110.txt保存errpt为txt文件<br>#errclear 0 把errpt错误日志清0<br>#kill -9 pid 关掉进程<br># cd oracle/app/crs/product/10.2/log/hdmis1/crsd<br># ls<br>core.2006-12-20-21:55:28&nbsp;&nbsp;core.2006-12-20-23:21:45&nbsp;&nbsp;core.2006-12-21-01:16:46&nbsp;&nbsp;crsd.l01<br>core.2006-12-20-22:12:57&nbsp;&nbsp;core.2006-12-20-23:25:46&nbsp;&nbsp;core.2006-12-21-01:52:35&nbsp;&nbsp;crsd.log<br>core.2006-12-20-22:50:42&nbsp;&nbsp;core.2006-12-20-23:30:20&nbsp;&nbsp;core.2006-12-21-15:33:27<br>core.2006-12-20-23:17:50&nbsp;&nbsp;core.2006-12-21-00:19:30&nbsp;&nbsp;core.2007-01-08-15:39:35<br></p>
<p class=line-height><br>&nbsp;</p>
<p><font size=3><span><font face="Times New Roman">AIX</font></span><span>是</span><span><font face="Times New Roman">IBM</font></span><span>公司开发的业界领先的优秀商务</span><span><font face="Times New Roman">Unix</font></span><span>操作系统，在可靠性、可用性、开放性、扩展性、高性能、安全性等方面都非常突出，尤其是在</span><span><font face="Times New Roman">Internet</font></span><span>的关键应用领域以及系统和硬件管理能力方面，其性能表现更为出色，受到了业界的普遍认可和广泛使用。以下是笔者几年来使用</span><span><font face="Times New Roman">AIX</font></span><span>系统的一点心得，兹供使用该系统的其他读者参考。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>．如何禁止终端上的中断键（</span><span><font face="Times New Roman">CTRL+C</font></span><span>）？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在很多应用系统中，系统管理员希望普通用户只运行自己的应用程序，不能进入系统的</span><span><font face="Times New Roman">shell</font></span><span>提示符下，但缺省情况下当用户在终端上按</span><span><font face="Times New Roman">CTRL+C</font></span><span>键时就会退到系统提示符下。由于用户终端一般没有固定的端口号，为了禁止使用中断键，可采取下面办法：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">1</font></span><span>）如果使用</span><span><font face="Times New Roman">ksh, </font></span><span>可在</span><span><font face="Times New Roman">$HOME/.profile</font></span><span>中第一行加入如下内容：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>trap "echo 'Abnormal operation'; exit" 123915 </font></span></p>
<p><font size=3><span><font face="Times New Roman">(2)</font></span><span>如果使用</span><span><font face="Times New Roman">csh(ksh</font></span><span>亦可</span><span><font face="Times New Roman">)</font></span><span>，可用如下命令：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>%stty intr ^! </font></span></p>
<p><font size=3><span>如果恢复正常情况，键入下列命令：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>% stty intr ^c </font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．如何在</span><span><font face="Times New Roman">shell</font></span><span>中不回显（</span><span><font face="Times New Roman">echo</font></span><span>）字符？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在实际应用中，一般当我们在键盘上键入口令时不希望将其显示在屏幕上，为此可采用下面的两种办法：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>&#183;使用</span><span><font face="Times New Roman">stty </font></span><span>命令</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>stty -echo # do not display password </font></span></p>
<p><span><font face="Times New Roman" size=3>echo "Enter password: \c" </font></span></p>
<p><span><font face="Times New Roman" size=3>read PASSWD #get the password </font></span></p>
<p><span><font face="Times New Roman" size=3>stty echo # restore standard configuration </font></span></p>
<p><font size=3><span>&#183;使用</span><span><font face="Times New Roman">echo</font></span><span>命令</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>设置保密属性：</span><span><font face="Times New Roman">echo "\033[<st1:chmetcnv w:st="on" UnitName="m" SourceValue="8" HasSpace="False" Negative="False" NumberType="1" TCSC="0">8m</st1:chmetcnv>" </font></span></font></p>
<p><font size=3><span>取消保密属性：</span><span><font face="Times New Roman">echo "\033[m" </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．如何在某个目录及其所属子目录的所有文件中查找字符串？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在程序维护过程中，有时需要在某个目录及其所属子目录的所有文件中查找某一个字符串，为此可用下面两种方法（假设在</span><span><font face="Times New Roman">*.cp</font></span><span>文件中查找字符串</span><span><font face="Times New Roman">"abc"</font></span><span>，结果放在文件</span><span><font face="Times New Roman">out</font></span><span>中）：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">1</font></span><span>）</span><span><font face="Times New Roman">cat /dev/null &gt; out </font></span></font></p>
<p><span><font face="Times New Roman" size=3>find ./ -name "*.cp" -exec grep "abc"{} &gt;&gt; out </font></span></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">2</font></span><span>）</span><span><font face="Times New Roman">find ./ -name "*.cp" | xargs grep "abc" &gt; out </font></span></font></p>
<p><font size=3><span>推荐使用第二种方法，因其系统开销小、速度快。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">4</font></span><span>．如何对</span><span><font face="Times New Roman">/etc/inittab</font></span><span>文件中的一行进行注释？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>我们都知道在</span><span><font face="Times New Roman">shell</font></span><span>中使用</span><span><font face="Times New Roman">"#"</font></span><span>作为注释符号，但在</span><span><font face="Times New Roman">/etc/inittab</font></span><span>中注释一行的方法是在第一个字符前插入字符</span><span><font face="Times New Roman">"</font></span><span>：</span><span><font face="Times New Roman">"</font></span><span>。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">5</font></span><span>．如何转换</span><span><font face="Times New Roman">DOS</font></span><span>和</span><span><font face="Times New Roman">AIX</font></span><span>两种格式的文本文件？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>如欲转换</span><span><font face="Times New Roman">DOS</font></span><span>和</span><span><font face="Times New Roman">AIX</font></span><span>两种格式的文本文件，有两种方法：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">1</font></span><span>）用</span><span><font face="Times New Roman">ftp</font></span><span>命令：设置</span><span><font face="Times New Roman">ASCII</font></span><span>传输类型，在一台运行</span><span><font face="Times New Roman">AIX</font></span><span>的机器和另外一台运行</span><span><font face="Times New Roman">Windows</font></span><span>的机器之间互相传送，这里不再赘述。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">2</font></span><span>）使用</span><span><font face="Times New Roman">aix2dos</font></span><span>或</span><span><font face="Times New Roman">dos2aix</font></span><span>命令</span><font face="Times New Roman"> </font></font></p>
<p><font size=3><span>如将</span><span><font face="Times New Roman">DOS</font></span><span>格式的文本文件转换为</span><span><font face="Times New Roman">AIX</font></span><span>格式，可用命令</span><span><font face="Times New Roman">A</font></span><span>：</span><span><font face="Times New Roman">dos2aix inputfile outfile</font></span><span>，反之可用命令：</span><span><font face="Times New Roman">aix2dos inputfile outfile</font></span><span>，关于</span><span><font face="Times New Roman">dos2aix</font></span><span>和</span><span><font face="Times New Roman">aix2dos</font></span><span>命令的详细用法可参阅</span><span><font face="Times New Roman">"dos2aix -h "</font></span><span>和</span><span><font face="Times New Roman">"aix2dos -h "</font></span><span>。注意要使用这两个命令，必须首先安装文件集</span><span><font face="Times New Roman">bos.pci</font></span><span>。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">6</font></span><span>．如何解决某一</span><span><font face="Times New Roman">PV</font></span><span>上的</span><span><font face="Times New Roman">VGDA</font></span><span>与</span><span><font face="Times New Roman">ODM</font></span><span>库不一致的问题？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在系统维护过程中，因为操作错误或其他特殊原因，有可能使某一</span><span><font face="Times New Roman">PV</font></span><span>上的</span><span><font face="Times New Roman">LVCB</font></span><span>和</span><span><font face="Times New Roman">VGDA</font></span><span>与其对应的</span><span><font face="Times New Roman">ODM</font></span><span>库不一致，导致</span><span><font face="Times New Roman">ODM</font></span><span>库紊乱，对</span><span><font face="Times New Roman">PV</font></span><span>的有关操作无法进行，这时可采用如下两个</span><span><font face="Times New Roman">AIX</font></span><span>命令加以解决：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>redefinevg -d hdisk_name vg_name </font></span></p>
<p><font size=3><span>该命令以指定</span><span><font face="Times New Roman">PV</font></span><span>上的</span><span><font face="Times New Roman">LVM</font></span><span>信息重新定义给定</span><span><font face="Times New Roman">VG</font></span><span>的</span><span><font face="Times New Roman">ODM</font></span><span>库。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>或：</span><span><font face="Times New Roman">synclvodm -P -v vgname </font></span></font></p>
<p><font size=3><span>该命令同步或重建给定</span><span><font face="Times New Roman">VG</font></span><span>的</span><span><font face="Times New Roman">ODM</font></span><span>库和</span><span><font face="Times New Roman">LVM</font></span><span>信息。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">7</font></span><span>．如何设置用户的文件大小限制？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在</span><span><font face="Times New Roman">AIX</font></span><span>系统中，用户使用系统资源是有一定限制的。如用户缺省可创建或扩展的最大文件为</span><st1:chmetcnv w:st="on" UnitName="g" SourceValue="1" HasSpace="False" Negative="False" NumberType="1" TCSC="0"><span><font face="Times New Roman">1G</font></span></st1:chmetcnv><span>（参见</span><span><font face="Times New Roman">/etc/security/limits: fsize = 2097151, fsize_hard=fsize 512-bytes blocks</font></span><span>）。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>如欲修改，可使用</span><span><font face="Times New Roman">smit: </font></span></font></p>
<p><font size=3><span><font face="Times New Roman"># smit chuser </font></span><span>选择用户，修改下面两项：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>Soft FILE size [4194302] </font></span></p>
<p><font size=3><span><font face="Times New Roman"># (<st1:chmetcnv w:st="on" UnitName="g" SourceValue="2" HasSpace="False" Negative="False" NumberType="1" TCSC="0">2G</st1:chmetcnv>,</font></span><span>可根据需要设定</span><span><font face="Times New Roman">) </font></span></font></p>
<p><span><font face="Times New Roman" size=3>Hard FILE size [4194302] </font></span></p>
<p><font size=3><span><font face="Times New Roman"># (<st1:chmetcnv w:st="on" UnitName="g" SourceValue="2" HasSpace="False" Negative="False" NumberType="1" TCSC="0">2G</st1:chmetcnv>, </font></span><span>可根据需要设定</span><span><font face="Times New Roman">) </font></span></font></p>
<p><font size=3><span>用该用户身份登录，使用</span><span><font face="Times New Roman">"ulimit -f "</font></span><span>和</span><span><font face="Times New Roman">"ulimit -Hf"</font></span><span>可分别显示其</span><span><font face="Times New Roman">fsize</font></span><span>、</span><span><font face="Times New Roman">fsize_hard</font></span><span>的大小。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">8</font></span><span>、如何按文件大小排序列出一个文件系统下的文件？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>当监控某一文件系统的空间使用情况时，如果该文件系统剩余空间较少或已使用空间增长较快，则有必要排序列出该文件系统中所有大于某一给定字节数的文件，以便进一步维护管理。为此，可用如下命令：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3># find [filesystem_name] -xdev -size +[512-bytes bloks] -ls | sort -r -n -k7 </font></span><br></p>
<img src ="http://www.blogjava.net/i369/aggbug/117605.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-05-15 14:55 <a href="http://www.blogjava.net/i369/articles/117605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java语言编码规范(Java Code Conventions)</title><link>http://www.blogjava.net/i369/articles/114305.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sat, 28 Apr 2007 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/114305.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/114305.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/114305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/114305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/114305.html</trackback:ping><description><![CDATA[<table>
    <tbody>
        <tr align=left colspan="3">
            <td width="10%"></td>
            <td vAlign=top>
            <table class=middletext cellPadding=5 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width=60>　<strong>名称</strong></td>
                        <td>Java语言编码规范(Java Code Conventions)</td>
                    </tr>
                    <tr>
                        <td>　<strong>译者</strong></td>
                        <td>晨光（Morning）</td>
                    </tr>
                    <tr>
                        <td>　<strong>简介</strong></td>
                        <td>本文档讲述了Java语言的编码规范，较之陈世忠先生《c++编码规范》的浩繁详尽，此文当属短小精悍了。而其中所列之各项条款，从编码风格，到注意事项，不单只Java，对于其他语言，也都很有借鉴意义。因为简短，所以易记，大家不妨将此作为handbook，常备案头，逐一对验。</td>
                    </tr>
                    <tr>
                        <td>　<strong>声明</strong></td>
                        <td>如需复制、传播，请附上本声明，谢谢。<br>原文出处：http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html，<br>译文出处：http://morningspace.51.net/，moyingzz@etang.com </td>
                    </tr>
                    <tr>
                        <td colSpan=2>
                        <p>　<strong>目录</strong></p>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#1"><u><font color=#0000ff>1 介绍</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#11"><u><font color=#0000ff>1.1 为什么要有编码规范</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#12"><u><font color=#0000ff>1.2 版权声明</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#2"><u><font color=#0000ff>2 文件名</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#21"><u><font color=#0000ff>2.1 文件后缀</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#22"><u><font color=#0000ff>2.2 常用文件名</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#3"><u><font color=#0000ff>3 文件组织</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#31"><u><font color=#0000ff>3.1 Java源文件</font></u></a>
                            <ul>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#311"><u><font color=#0000ff>3.1.1 开头注释</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#312"><u><font color=#0000ff>3.1.2 包和引入语句</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#313"><u><font color=#0000ff>3.1.3 类和接口声明</font></u></a> </li>
                            </ul>
                            </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#4"><u><font color=#0000ff>4 缩进排版</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#41"><u><font color=#0000ff>4.1 行长度</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#42"><u><font color=#0000ff>4.2 换行</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#5"><u><font color=#0000ff>5 注释</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#51"><u><font color=#0000ff>5.1 实现注释的格式</font></u></a>
                            <ul>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#511"><u><font color=#0000ff>5.1.1 块注释</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#512"><u><font color=#0000ff>5.1.2 单行注释</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#513"><u><font color=#0000ff>5.1.3 尾端注释</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#514"><u><font color=#0000ff>5.1.4 行末注释</font></u></a> </li>
                            </ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#52"><u><font color=#0000ff>5.2 文挡注释</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#6"><u><font color=#0000ff>6 声明</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#61"><u><font color=#0000ff>6.1 每行声明变量的数量</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#62"><u><font color=#0000ff>6.2 初始化</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#63"><u><font color=#0000ff>6.3 布局</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#64"><u><font color=#0000ff>6.4 类和接口的声明</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#7"><u><font color=#0000ff>7 语句</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#71"><u><font color=#0000ff>7.1 简单语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#72"><u><font color=#0000ff>7.2 复合语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#73"><u><font color=#0000ff>7.3 返回语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#74"><u><font color=#0000ff>7.4 if，if-else，if else-if else语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#75"><u><font color=#0000ff>7.5 for语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#76"><u><font color=#0000ff>7.6 while语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#77"><u><font color=#0000ff>7.7 do-while语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#78"><u><font color=#0000ff>7.8 switch语句</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#79"><u><font color=#0000ff>7.9 try-catch语句</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#8"><u><font color=#0000ff>8 空白</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#81"><u><font color=#0000ff>8.1 空行</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#82"><u><font color=#0000ff>8.2 空格</font></u></a> </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#9"><u><font color=#0000ff>9 命名规范</font></u></a> <a href="http://www.huihoo.org/code/java_code_conventions.html#a"><u><font color=#0000ff>10 编程惯例</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a1"><u><font color=#0000ff>10.1 提供对实例以及类变量的访问控制</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a2"><u><font color=#0000ff>10.2 引用类变量和类方法</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a3"><u><font color=#0000ff>10.3 常量</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a4"><u><font color=#0000ff>10.4 变量赋值</font></u></a>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a5"><u><font color=#0000ff>10.5 其它惯例</font></u></a>
                            <ul>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a51"><u><font color=#0000ff>10.5.1 圆括号</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a52"><u><font color=#0000ff>10.5.2 返回值</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a53"><u><font color=#0000ff>10.5.3 条件运算符"?"前的表达式"?"前的表达式</font></u></a>
                                <li><a href="http://www.huihoo.org/code/java_code_conventions.html#a54"><u><font color=#0000ff>10.5.4 特殊注释</font></u></a> </li>
                            </ul>
                            </li>
                        </ul>
                        <a href="http://www.huihoo.org/code/java_code_conventions.html#b"><u><font color=#0000ff>11 代码范例</font></u></a>
                        <ul>
                            <li><a href="http://www.huihoo.org/code/java_code_conventions.html#b1"><u><font color=#0000ff>11.1 Java源文件范例</font></u></a> </li>
                        </ul>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
            <td width="10%">&nbsp;</td>
        </tr>
        &lt;!--内容--&gt;
        <tr align=left colspan="3">
            <td width="10%">&nbsp;</td>
            <td vAlign=top>
            <p class=middletitle><a name=1>1 介绍(Introduction)</a><a name=11>1.1 为什么要有编码规范(Why Have Code Conventions)</a><a name=12>1.2 版权声明(Acknowledgments)</a><a name=2>2 文件名(File Names)</a><a name=21>2.1 文件后缀(File Suffixes)</a><a name=22>2.2 常用文件名(Common File Names)</a><a name=3>3 文件组织(File Organization)</a><a name=31>3.1 Java源文件(Java Source Files)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#311"><u><font color=#0000ff>开头注释</font></u></a>"）<br>- 包和引入语句（参见"<a href="http://www.huihoo.org/code/java_code_conventions.html#312"><u><font color=#0000ff>包和引入语句</font></u></a>"）<br>- 类和接口声明（参见"<a href="http://www.huihoo.org/code/java_code_conventions.html#313"><u><font color=#0000ff>类和接口声明</font></u></a>"） </p>
            <p class=middletitle>&nbsp;</p>
            <p>编码规范对于程序员而言尤为重要，有以下几个原因：</p>
            <p>- 一个软件的生命周期中，80%的花费在于维护<br>- 几乎没有任何一个软件，在其整个生命周期中，均由最初的开发人员来维护<br>- 编码规范可以改善软件的可读性，可以让程序员尽快而彻底地理解新的代码<br>- 如果你将源码作为产品发布，就需要确任它是否被很好的打包并且清晰无误，一如你已构建的其它任何产品 </p>
            <p>为了执行规范，每个软件开发人员必须一致遵守编码规范。每个人。</p>
            <p class=middletitle>&nbsp;</p>
            <p>本文档反映的是Sun MicroSystems公司，Java语言规范中的编码标准部分。主要贡献者包括：Peter King，Patrick Naughton，Mike DeMoney，Jonni Kanerva，Kathy Walrath以及Scott Hommel。</p>
            <p>本文档现由Scott Hommel维护，有关评论意见请发至shommel@eng.sun.com</p>
            <p class=middletitle>&nbsp;</p>
            <p>这部分列出了常用的文件名及其后缀。</p>
            <p class=middletitle>&nbsp;</p>
            <p>Java程序使用下列文件后缀：</p>
            <p>
            <table border=1>
                <tbody>
                    <tr>
                        <td>文件类别</td>
                        <td>文件后缀</td>
                    </tr>
                    <tr>
                        <td>Java源文件</td>
                        <td>.java</td>
                    </tr>
                    <tr>
                        <td>Java字节码文件</td>
                        <td>.class</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p class=middletitle>&nbsp;</p>
            <p>常用的文件名包括：</p>
            <p>
            <table border=1>
                <tbody>
                    <tr>
                        <td>文件名</td>
                        <td>用途</td>
                    </tr>
                    <tr>
                        <td>GNUmakefile</td>
                        <td>makefiles的首选文件名。我们采用gnumake来创建（build）软件。</td>
                    </tr>
                    <tr>
                        <td>README</td>
                        <td>概述特定目录下所含内容的文件的首选文件名</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p class=middletitle>&nbsp;</p>
            <p>一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成。超过2000行的程序难以阅读，应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。</p>
            <p class=middletitle>&nbsp;</p>
            <p>每个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联，可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。</p>
            <p>Java源文件还遵循以下规则：</p>
            <p>- 开头注释（参见"</p>
            <p class=middletitle><a name=311>3.1.1 开头注释(Beginning Comments)</a><a name=312>3.1.2 包和引入语句(Package and Import Statements)</a><a name=313>3.1.3 类和接口声明(Class and Interface Declarations)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#b1"><u><font color=#0000ff>Java源文件范例</font></u></a>"中一个包含注释的例子。</p>
            <p>所有的源文件都应该在开头有一个C语言风格的注释，其中列出类名、版本信息、日期和版权声明：</p>
            <p>&nbsp;</p>
            <pre>  /*
            * Classname
            *
            * Version information
            *
            * Date
            *
            * Copyright notice
            */
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>在多数Java源文件中，第一个非注释行是包语句。在它之后可以跟引入语句。例如：</p>
            <p>&nbsp;</p>
            <pre>  package java.awt;
            import java.awt.peer.CanvasPeer;
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>下表描述了类和接口声明的各个部分以及它们出现的先后次序。参见"</p>
            <p>
            <table border=1>
                <tbody>
                    <tr>
                        <td>&nbsp;</td>
                        <td>类/接口声明的各部分</td>
                        <td>注解</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>类/接口文档注释(/**&#8230;&#8230;*/)</td>
                        <td>该注释中所需包含的信息，参见"<a href="http://www.huihoo.org/code/java_code_conventions.html#52"><u><font color=#0000ff>文档注释</font></u></a>"</td>
                    </tr>
                    <tr>
                        <td>2</td>
                        <td>类或接口的声明</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>3</td>
                        <td>类/接口实现的注释(/*&#8230;&#8230;*/)如果有必要的话</td>
                        <td>该注释应包含任何有关整个类或接口的信息，而这些信息又不适合作为类/接口文档注释。</td>
                    </tr>
                    <tr>
                        <td>4</td>
                        <td>类的(静态)变量</td>
                        <td>首先是类的公共变量，随后是保护变量，再后是包一级别的变量(没有访问修饰符，access modifier)，最后是私有变量。</td>
                    </tr>
                    <tr>
                        <td>5</td>
                        <td>实例变量</td>
                        <td>首先是公共级别的，随后是保护级别的，再后是包一级别的(没有访问修饰符)，最后是私有级别的。</td>
                    </tr>
                    <tr>
                        <td>6</td>
                        <td>构造器</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>7</td>
                        <td>方法</td>
                        <td>这些方法应该按功能，而非作用域或访问权限，分组。例如，一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码。</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p class=middletitle><a name=4>4 缩进排版(Indentation)</a><a name=41>4.1 行长度(Line Length)</a><a name=42>4.2 换行(Wrapping Lines)</a><a name=5>5 注释(Comments)</a><a name=51>5.1 实现注释的格式(Implementation Comment Formats)</a><a name=511>5.1.1 块注释(Block Comments)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#52"><u><font color=#0000ff>文档注释</font></u></a>"</p>
            <p>4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。一个制表符等于8个空格(而非4个)。</p>
            <p class=middletitle>&nbsp;</p>
            <p>尽量避免一行的长度超过80个字符，因为很多终端和工具不能很好处理之。</p>
            <p>注意：用于文档中的例子应该使用更短的行长，长度一般不超过70个字符。</p>
            <p class=middletitle>&nbsp;</p>
            <p>当一个表达式无法容纳在一行内时，可以依据如下一般规则断开之：</p>
            <p>- 在一个逗号后面断开<br>- 在一个操作符前面断开<br>- 宁可选择较高级别(higher-level)的断开，而非较低级别(lower-level)的断开<br>- 新的一行应该与上一行同一级别表达式的开头处对齐<br>- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边，那就代之以缩进8个空格。 </p>
            <p>以下是断开方法调用的一些例子：</p>
            <p>&nbsp;</p>
            <pre>  someMethod(longExpression1, longExpression2, longExpression3,
            longExpression4, longExpression5);
            var = someMethod1(longExpression1,
            someMethod2(longExpression2,
            longExpression3));
            </pre>
            <p>&nbsp;</p>
            <p>以下是两个断开算术表达式的例子。前者更好，因为断开处位于括号表达式的外边，这是个较高级别的断开。</p>
            <p>&nbsp;</p>
            <pre>  longName1 = longName2 * (longName3 + longName4 - longName5)
            + 4 * longname6; //PREFFER
            longName1 = longName2 * (longName3 + longName4
            - longName5) + 4 * longname6; //AVOID
            </pre>
            <p>&nbsp;</p>
            <p>以下是两个缩进方法声明的例子。前者是常规情形。后者若使用常规的缩进方式将会使第二行和第三行移得很靠右，所以代之以缩进8个空格</p>
            <p>&nbsp;</p>
            <pre>  //CONVENTIONAL INDENTATION
            someMethod(int anArg, Object anotherArg, String yetAnotherArg,
            Object andStillAnother) {
            ...
            }
            //INDENT 8 SPACES TO AVOID VERY DEEP INDENTS
            private static synchronized horkingLongMethodName(int anArg,
            Object anotherArg, String yetAnotherArg,
            Object andStillAnother) {
            ...
            }
            </pre>
            <p>&nbsp;</p>
            <p>if语句的换行通常使用8个空格的规则，因为常规缩进(4个空格)会使语句体看起来比较费劲。比如：</p>
            <p>&nbsp;</p>
            <pre>  //DON&#8217;T USE THIS INDENTATION
            if ((condition1 &amp;&amp; condition2)
            || (condition3 &amp;&amp; condition4)
            ||!(condition5 &amp;&amp; condition6)) { //BAD WRAPS
            doSomethingAboutIt();             //MAKE THIS LINE EASY TO MISS
            }
            //USE THIS INDENTATION INSTEAD
            if ((condition1 &amp;&amp; condition2)
            || (condition3 &amp;&amp; condition4)
            ||!(condition5 &amp;&amp; condition6)) {
            doSomethingAboutIt();
            }
            //OR USE THIS
            if ((condition1 &amp;&amp; condition2) || (condition3 &amp;&amp; condition4)
            ||!(condition5 &amp;&amp; condition6)) {
            doSomethingAboutIt();
            }
            </pre>
            <p>&nbsp;</p>
            <p>这里有三种可行的方法用于处理三元运算表达式：</p>
            <p>&nbsp;</p>
            <pre>  alpha = (aLongBooleanExpression) ? beta : gamma;
            alpha = (aLongBooleanExpression) ? beta
            : gamma;
            alpha = (aLongBooleanExpression)
            ? beta
            : gamma;
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>Java程序有两类注释：实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的，使用/*...*/和//界定的注释。文档注释(被称为"doc comments")是Java独有的，并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。</p>
            <p>实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。</p>
            <p>注释应被用来给出代码的总括，并提供代码自身没有提供的附加信息。注释应该仅包含与阅读和理解程序有关的信息。例如，相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中。</p>
            <p>在注释里，对设计决策中重要的或者不是显而易见的地方进行说明是可以的，但应避免提供代码中己清晰表达出来的重复信息。多余的的注释很容易过时。通常应避免那些代码更新就可能过时的注释。</p>
            <p>注意：频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候，考虑一下重写代码使其更清晰。</p>
            <p>注释不应写在用星号或其他字符画出来的大框里。注释不应包括诸如制表符和回退符之类的特殊字符。</p>
            <p class=middletitle>&nbsp;</p>
            <p>程序可以有4种实现注释的风格：块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。</p>
            <p class=middletitle>&nbsp;</p>
            <p>块注释通常用于提供对文件，方法，数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方，比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。</p>
            <p>块注释之首应该有一个空行，用于把块注释和代码分割开来，比如：</p>
            <p>&nbsp;</p>
            <pre>  /*
            * Here is a block comment.
            */
            </pre>
            <p>&nbsp;</p>
            <p>块注释可以以/*-开头，这样indent(1)就可以将之识别为一个代码块的开始，而不会重排它。</p>
            <p>&nbsp;</p>
            <pre>  /*-
            * Here is a block comment with some very special
            * formatting that I want indent(1) to ignore.
            *
            *    one
            *        two
            *            three
            */
            </pre>
            <p>&nbsp;</p>
            <p>注意：如果你不使用indent(1)，就不必在代码中使用/*-，或为他人可能对你的代码运行indent(1)作让步。</p>
            <p>参见"</p>
            <p class=middletitle><a name=512>5.1.2 单行注释(Single-Line Comments)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#511"><u><font color=#0000ff>块注释</font></u></a>")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子：</p>
            <p>短注释可以显示在一行内，并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完，就该采用块注释(参见"</p>
            <p>&nbsp;</p>
            <pre>  if (condition) {
            /* Handle the condition. */
            ...
            }
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle><a name=513>5.1.3 尾端注释(Trailing Comments)</a><a name=514>5.1.4 行末注释(End-Of-Line Comments)</a><a name=52>5.2 文档注释(Documentation Comments)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#b1"><u><font color=#0000ff>Java源文件范例</font></u></a>"</p>
            <p>极短的注释可以与它们所要描述的代码位于同一行，但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中，它们应该具有相同的缩进。</p>
            <p>以下是一个Java代码中尾端注释的例子：</p>
            <p>&nbsp;</p>
            <pre>  if (a == 2) {
            return TRUE;              /* special case */
            } else {
            return isPrime(a);         /* works only for odd a */
            }
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>注释界定符"//"，可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本；然而，它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子：</p>
            <p>&nbsp;</p>
            <pre>  if (foo &gt; 1) {
            // Do a double-flip.
            ...
            }
            else {
            return false;          // Explain why here.
            }
            //if (bar &gt; 1) {
            //
            //    // Do a triple-flip.
            //    ...
            //}
            //else {
            //    return false;
            //}
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>注意：此处描述的注释格式之范例，参见"</p>
            <p>若想了解更多，参见"How to Write Doc Comments for Javadoc"，其中包含了有关文档注释标记的信息(@return, @param, @see)：</p>
            <p><a href="http://java.sun.com/javadoc/writingdoccomments/index.html"><u><font color=#0000ff>http://java.sun.com/javadoc/writingdoccomments/index.html</font></u></a></p>
            <p>若想了解更多有关文档注释和javadoc的详细资料，参见javadoc的主页：</p>
            <p><a href="http://java.sun.com/javadoc/index.html"><u><font color=#0000ff>http://java.sun.com/javadoc/index.html</font></u></a></p>
            <p>文档注释描述Java的类、接口、构造器，方法，以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中，一个注释对应一个类、接口或成员。该注释应位于声明之前：</p>
            <p>&nbsp;</p>
            <pre>  /**
            * The Example class provides ...
            */
            public class Example { ...
            </pre>
            <p>&nbsp;</p>
            <p>注意顶层(top-level)的类和接口是不缩进的，而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进；随后的文档注释每行都缩进1格(使星号纵向对齐)。成员，包括构造函数在内，其文档注释的第一行缩进4格，随后每行都缩进5格。</p>
            <p>若你想给出有关类、接口、变量或方法的信息，而这些信息又不适合写在文档中，则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如，有关一个类实现的细节，应放入紧跟在类声明后面的实现块注释中，而不是放在文档注释中。</p>
            <p>文档注释不能放在一个方法或构造器的定义块中，因为Java会将位于文档注释之后的第一个声明与其相关联。</p>
            <p class=middletitle><a name=6>6 声明(Declarations)</a><a name=61>6.1 每行声明变量的数量(Number Per Line)</a><a name=62>6.2 初始化(Initialization)</a><a name=63>6.3 布局(Placement)</a><a name=64>6.4 类和接口的声明(Class and Interface Declarations)</a><a name=7>7 语句(Statements)</a><a name=71>7.1 简单语句(Simple Statements)</a><a name=72>7.2 复合语句(Compound Statements)</a><a name=73>7.3 返回语句(return Statements)</a><a name=74>7.4 if，if-else，if else-if else语句(if, if-else, if else-if else Statements)</a><a name=75>7.5 for语句(for Statements)</a><a name=76>7.6 while语句(while Statements)</a><a name=77>7.7 do-while语句(do-while Statements)</a><a name=78>7.8 switch语句(switch Statements)</a><a name=79>7.9 try-catch语句(try-catch Statements)</a><a name=8>8 空白(White Space)</a><a name=81>8.1 空行(Blank Lines)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#511"><u><font color=#0000ff>5.1.1</font></u></a>"）或单行注释（参见"<a href="http://www.huihoo.org/code/java_code_conventions.html#512"><u><font color=#0000ff>5.1.2</font></u></a>"）之前<br>- 一个方法内的两个逻辑段之间，用以提高可读性 </p>
            <p class=middletitle>&nbsp;</p>
            <p>推荐一行一个声明，因为这样以利于写注释。亦即，</p>
            <p>&nbsp;</p>
            <pre>  int level;  // indentation level
            int size;   // size of table
            </pre>
            <p>&nbsp;</p>
            <p>要优于，</p>
            <p>int level, size; </p>
            <p>不要将不同类型变量的声明放在同一行，例如：</p>
            <p>&nbsp;</p>
            <pre>  int foo,  fooarray[];   //WRONG!
            </pre>
            <p>&nbsp;</p>
            <p>注意：上面的例子中，在类型和标识符之间放了一个空格，另一种被允许的替代方式是使用制表符：</p>
            <p>&nbsp;</p>
            <pre>  int		level;         // indentation level
            int		size;          // size of table
            Object	currentEntry;  // currently selected table entry
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。</p>
            <p class=middletitle>&nbsp;</p>
            <p>只在代码块的开始处声明变量。（一个块是指任何被包含在大括号"{"和"}"中间的代码。）不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂，同时会妨碍代码在该作用域内的可移植性。</p>
            <p>&nbsp;</p>
            <pre>  void myMethod() {
            int int1 = 0;         // beginning of method block
            if (condition) {
            int int2 = 0;     // beginning of "if" block
            ...
            }
            }
            </pre>
            <p>&nbsp;</p>
            <p>该规则的一个例外是for循环的索引变量</p>
            <p>&nbsp;</p>
            <pre>  for (int i = 0; i &lt; maxLoops; i++) { ... }
            </pre>
            <p>&nbsp;</p>
            <p>避免声明的局部变量覆盖上一级声明的变量。例如，不要在内部代码块中声明相同的变量名：</p>
            <p>&nbsp;</p>
            <pre>  int count;
            ...
            myMethod() {
            if (condition) {
            int count = 0;     // AVOID!
            ...
            }
            ...
            }
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>当编写类和接口是，应该遵守以下格式规则：</p>
            <p>- 在方法名与其参数列表之前的左括号"("间不要有空格<br>- 左大括号"{"位于声明语句同行的末尾<br>- 右大括号"}"另起一行，与相应的声明语句对齐，除非是一个空语句，"}"应紧跟在"{"之后 </p>
            <pre>  class Sample extends Object {
            int ivar1;
            int ivar2;
            Sample(int i, int j) {
            ivar1 = i;
            ivar2 = j;
            }
            int emptyMethod() {}
            ...
            }
            </pre>
            - 方法与方法之间以空行分隔
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>每行至多包含一条语句，例如：</p>
            <p>&nbsp;</p>
            <pre>  argv++;       // Correct
            argc--;       // Correct
            argv++; argc--;       // AVOID!
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>复合语句是包含在大括号中的语句序列，形如"{ 语句 }"。例如下面各段。</p>
            <p>- 被括其中的语句应该较之复合语句缩进一个层次<br>- 左大括号"{"应位于复合语句起始行的行尾；右大括号"}"应另起一行并与复合语句首行对齐。<br>- 大括号可以被用于所有语句，包括单个语句，只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。 </p>
            <p class=middletitle>&nbsp;</p>
            <p>一个带返回值的return语句不使用小括号"()"，除非它们以某种方式使返回值更为显见。例如：</p>
            <p>&nbsp;</p>
            <pre>  return;
            return myDisk.size();
            return (size ? size : defaultSize);
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>if-else语句应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  if (condition) {
            statements;
            }
            if (condition) {
            statements;
            } else {
            statements;
            }
            if (condition) {
            statements;
            } else if (condition) {
            statements;
            } else{
            statements;
            }
            </pre>
            <p>&nbsp;</p>
            <p>注意：if语句总是用"{"和"}"括起来，避免使用如下容易引起错误的格式：</p>
            <p>&nbsp;</p>
            <pre>  if (condition) //AVOID! THIS OMITS THE BRACES {}!
            statement;
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>一个for语句应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  for (initialization; condition; update) {
            statements;
            }
            </pre>
            <p>&nbsp;</p>
            <p>一个空的for语句(所有工作都在初始化，条件判断，更新子句中完成）应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  for (initialization; condition; update);
            </pre>
            <p>&nbsp;</p>
            <p>当在for语句的初始化或更新子句中使用逗号时，避免因使用三个以上变量，而导致复杂度提高。若需要，可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。</p>
            <p class=middletitle>&nbsp;</p>
            <p>一个while语句应该具有如下格式</p>
            <p>&nbsp;</p>
            <pre>  while (condition) {
            statements;
            }
            </pre>
            <p>&nbsp;</p>
            <p>一个空的while语句应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  while (condition);
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>一个do-while语句应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  do {
            statements;
            } while (condition);
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>一个switch语句应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  switch (condition) {
            case ABC:
            statements;
            /* falls through */
            case DEF:
            statements;
            break;
            case XYZ:
            statements;
            break;
            default:
            statements;
            break;
            }
            </pre>
            <p>&nbsp;</p>
            <p>每当一个case顺着往下执行时(因为没有break语句)，通常应在break语句的位置添加注释。上面的示例代码中就包含注释/* falls through */。</p>
            <p class=middletitle>&nbsp;</p>
            <p>一个try-catch语句应该具有如下格式：</p>
            <p>&nbsp;</p>
            <pre>  try {
            statements;
            } catch (ExceptionClass e) {
            statements;
            }
            </pre>
            <p>&nbsp;</p>
            <p>一个try-catch语句后面也可能跟着一个finally语句，不论try代码块是否顺利执行完，它都会被执行。</p>
            <p>&nbsp;</p>
            <pre>  try {
            statements;
            } catch (ExceptionClass e) {
            statements;
            } finally {
            statements;
            }
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>空行将逻辑相关的代码段分隔开，以提高可读性。</p>
            <p>下列情况应该总是使用两个空行：</p>
            <p>- 一个源文件的两个片段(section)之间<br>- 类声明和接口声明之间 </p>
            <p>下列情况应该总是使用一个空行：</p>
            <p>- 两个方法之间<br>- 方法内的局部变量和方法的第一条语句之间<br>- 块注释（参见"</p>
            <p class=middletitle><a name=82>8.2 空格(Blank Spaces)</a><a name=9>9 命名规范(Naming Conventions)</a><a name=a>10 编程惯例(Programming Practices)</a><a name=a1>10.1 提供对实例以及类变量的访问控制(Providing Access to Instance and Class Variables)</a><a name=a2>10.2 引用类变量和类方法(Referring to Class Variables and Methods)</a><a name=a3>10.3 常量(Constants)</a><a name=a4>10.4 变量赋值(Variable Assignments)</a><a name=a5>10.5 其它惯例(Miscellaneous Practices)</a><a name=a51>10.5.1 圆括号(Parentheses)</a><a name=a52>10.5.2 返回值(Returning Values)</a><a name=a53>10.5.3 条件运算符"?"前的表达式(Expressions before '?' in the Conditional Operator)</a><a name=a54>10.5.4 特殊注释(Special Comments)</a><a name=b>11 代码范例(Code Examples)</a><a name=b1>11.1 Java源文件范例(Java Source File Example)</a><a href="http://www.huihoo.org/code/java_code_conventions.html#313"><u><font color=#0000ff>类和接口声明</font></u></a>"以及"<a href="http://www.huihoo.org/code/java_code_conventions.html#52"><u><font color=#0000ff>文挡注释</font></u></a>"。</p>
            <p>下列情况应该使用空格：</p>
            <p>- 一个紧跟着括号的关键字应该被空格分开，例如：<br></p>
            <pre>  while (true) {
            ...
            }
            </pre>
            注意：空格不应该置于方法名与其左括号之间。这将有助于区分关键字和方法调用。<br>- 空白应该位于参数列表中逗号的后面<br>- 所有的二元运算符，除了"."，应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格，比如：负号("-")、自增("++")和自减("--")。例如：
            <pre>    a += c + d;
            a = (a + b) / (c * d);
            while (d++ = s++) {
            n++;
            }
            printSize("size is " + foo + "\n");
            </pre>
            - for语句中的表达式应该被空格分开，例如：
            <pre>    for (expr1; expr2; expr3)
            </pre>
            - 强制转型后应该跟一个空格，例如：
            <pre>    myMethod((byte) aNum, (Object) x);
            myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>命名规范使程序更易读，从而更易于理解。它们也可以提供一些有关标识符功能的信息，以助于理解代码，例如，不论它是一个常量，包，还是类。</p>
            <p>
            <table border=1>
                <tbody>
                    <tr>
                        <td>标识符类型</td>
                        <td>命名规则</td>
                        <td>例子</td>
                    </tr>
                    <tr>
                        <td>包(Packages)</td>
                        <td>一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名，通常是com，edu，gov，mil，net，org，或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department)，项目(project)，机器(machine)，或注册名(login names)。</td>
                        <td>com.sun.eng<br>com.apple.quicktime.v2<br>edu.cmu.cs.bovik.cheese</td>
                    </tr>
                    <tr>
                        <td>类(Classes)</td>
                        <td>命名规则：类名是个一名词，采用大小写混合的方式，每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词，避免缩写词(除非该缩写词被更广泛使用，像URL，HTML)</td>
                        <td>class Raster;<br>class ImageSprite;</td>
                    </tr>
                    <tr>
                        <td>接口(Interfaces)</td>
                        <td>命名规则：大小写规则与类名相似</td>
                        <td>interface RasterDelegate;<br>interface Storing;</td>
                    </tr>
                    <tr>
                        <td>方法(Methods)</td>
                        <td>方法名是一个动词，采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。</td>
                        <td>run();<br>runFast();<br>getBackground();</td>
                    </tr>
                    <tr>
                        <td>变量(Variables)</td>
                        <td>除了变量名外，所有实例，包括类，类常量，均采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。变量名不应以下划线或美元符号开头，尽管这在语法上是允许的。<br>变量名应简短且富于描述。变量名的选用应该易于记忆，即，能够指出其用途。尽量避免单个字符的变量名，除非是一次性的临时变量。临时变量通常被取名为i，j，k，m和n，它们一般用于整型；c，d，e，它们一般用于字符型。</td>
                        <td>char c;<br>int i;<br>float myWidth;</td>
                    </tr>
                    <tr>
                        <td>实例变量(Instance Variables)</td>
                        <td>大小写规则和变量名相似，除了前面需要一个下划线</td>
                        <td>int _employeeId;<br>String _name;<br>Customer _customer;</td>
                    </tr>
                    <tr>
                        <td>常量(Constants)</td>
                        <td>类常量和ANSI常量的声明，应该全部大写，单词间用下划线隔开。(尽量避免ANSI常量，容易引起错误)</td>
                        <td>static final int MIN_WIDTH = 4;<br>static final int MAX_WIDTH = 999;<br>static final int GET_THE_CPU = 1;</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p class=middletitle>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>若没有足够理由，不要把实例或类变量声明为公有。通常，实例变量无需显式的设置(set)和获取(gotten)，通常这作为方法调用的边缘效应 (side effect)而产生。</p>
            <p>一个具有公有实例变量的恰当例子，是类仅作为数据结构，没有行为。亦即，若你要使用一个结构(struct)而非一个类(如果java支持结构的话)，那么把类的实例变量声明为公有是合适的。</p>
            <p class=middletitle>&nbsp;</p>
            <p>避免用一个对象访问一个类的静态变量和方法。应该用类名替代。例如：</p>
            <p>&nbsp;</p>
            <pre>  classMethod();             //OK
            AClass.classMethod();      //OK
            anObject.classMethod();    //AVOID!
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>位于for循环中作为计数器值的数字常量，除了-1,0和1之外，不应被直接写入代码。</p>
            <p class=middletitle>&nbsp;</p>
            <p>避免在一个语句中给多个变量赋相同的值。它很难读懂。例如：</p>
            <p>&nbsp;</p>
            <pre>  fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
            </pre>
            <p>&nbsp;</p>
            <p>不要将赋值运算符用在容易与相等关系运算符混淆的地方。例如：</p>
            <p>&nbsp;</p>
            <pre>  if (c++ = d++) {        // AVOID! (Java disallows)
            ...
            }
            </pre>
            <p>&nbsp;</p>
            <p>应该写成</p>
            <p>&nbsp;</p>
            <pre>  if ((c++ = d++) != 0) {
            ...
            }
            </pre>
            <p>&nbsp;</p>
            <p>不要使用内嵌(embedded)赋值运算符试图提高运行时的效率，这是编译器的工作。例如：</p>
            <p>&nbsp;</p>
            <pre>  d = (a = b + c) + r;        // AVOID!
            </pre>
            <p>&nbsp;</p>
            <p>应该写成</p>
            <p>&nbsp;</p>
            <pre>  a = b + c;
            d = a + r;
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>一般而言，在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题，是个好方法。即使运算符的优先级对你而言可能很清楚，但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。</p>
            <p>&nbsp;</p>
            <pre>  if (a == b &amp;&amp; c == d)     // AVOID!
            if ((a == b) &amp;&amp; (c == d))  // RIGHT
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>设法让你的程序结构符合目的。例如：</p>
            <p>&nbsp;</p>
            <pre>  if (booleanExpression) {
            return true;
            } else {
            return false;
            }
            </pre>
            <p>&nbsp;</p>
            <p>应该代之以如下方法：</p>
            <p>&nbsp;</p>
            <pre>  return booleanExpression;
            </pre>
            <p>&nbsp;</p>
            <p>类似地：</p>
            <p>&nbsp;</p>
            <pre>  if (condition) {
            return x;
            }
            return y;
            </pre>
            <p>&nbsp;</p>
            <p>应该写做：</p>
            <p>&nbsp;</p>
            <pre>  return (condition ? x : y);
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前，那么应该给表达式添上一对圆括号。例如：</p>
            <p>&nbsp;</p>
            <pre>  (x &gt;= 0) ? x : -x;
            </pre>
            <p>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>在注释中使用XXX来标识某些未实现(bogus)的但可以工作(works)的内容。用FIXME来标识某些假的和错误的内容。</p>
            <p class=middletitle>&nbsp;</p>
            <p class=middletitle>&nbsp;</p>
            <p>下面的例子，展示了如何合理布局一个包含单一公共类的Java源程序。接口的布局与其相似。更多信息参见"</p>
            <p>&nbsp;</p>
            <pre>/*
            * @(#)Blah.java        1.82 99/03/18
            *
            * Copyright (c) 1994-1999 Sun Microsystems, Inc.
            * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
            * All rights reserved.
            *
            * This software is the confidential and proprietary information of Sun
            * Microsystems, Inc. ("Confidential Information").  You shall not
            * disclose such Confidential Information and shall use it only in
            * accordance with the terms of the license agreement you entered into
            * with Sun.
            */
            package java.blah;
            import java.blah.blahdy.BlahBlah;
            /**
            * Class description goes here.
            *
            * @version 	1.82 18 Mar 1999
            * @author 	Firstname Lastname
            */
            public class Blah extends SomeClass {
            /* A class implementation comment can go here. */
            /** classVar1 documentation comment */
            public static int classVar1;
            /**
            * classVar2 documentation comment that happens to be
            * more than one line long
            */
            private static Object classVar2;
            /** instanceVar1 documentation comment */
            public Object instanceVar1;
            /** instanceVar2 documentation comment */
            protected int instanceVar2;
            /** instanceVar3 documentation comment */
            private Object[] instanceVar3;
            /**
            * ...constructor Blah documentation comment...
            */
            public Blah() {
            // ...implementation goes here...
            }
            /**
            * ...method doSomething documentation comment...
            */
            public void doSomething() {
            // ...implementation goes here...
            }
            /**
            * ...method doSomethingElse documentation comment...
            * @param someParam description
            */
            public void doSomethingElse(Object someParam) {
            // ...implementation goes here...
            }
            }
            </pre>
            <p>&nbsp;</p>
            </td>
            <td width="10%">&nbsp;</td>
        </tr>
    </tbody>
</table>
<hr width="98%" noShade SIZE=1>
<img src ="http://www.blogjava.net/i369/aggbug/114305.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-04-28 12:56 <a href="http://www.blogjava.net/i369/articles/114305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选择dojo的三大理由</title><link>http://www.blogjava.net/i369/articles/111966.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111966.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111966.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111966.html</trackback:ping><description><![CDATA[<p>来自《<a href="http://www.javaresource.org/ajax/ajax-60.html"><u><font color=#0000ff>ajax</font></u></a> in action》中文版作者dlee的经验之谈，cleverpig在此转发给大家：有朋友对于我为什么会选择dojo很</p>
<div id=main>
<div class=post id=article>
<div class=postText><br><br>有朋友对于我为什么会选择dojo很感兴趣，我就在这里介绍一下我选择它的理由，以便对于其他网友也能有所帮助。<br><br><span style="COLOR: red">一、我选择dojo主要是出于以下几个理由：</span><br><br><span style="COLOR: green">1.dojo是一个很好的基础架构。</span><br><br>它可以非常有效地分离页面中的Structure、Presentation、Behaviour，这对于实现Ajax组件unobtrusive的目标非常有帮助。<br><br>有人问：那么，同样是基础架构，你为什么不选择Prototype呢？<br>当然，Prototype对于开发一些Ajax效果也是非常有帮助的。但是Prototype的设计目标和dojo有很大的不同。<br>Prototype 的设计目标是扩充JavaScript的功能，使得可以以类似于Ruby的方式来编写JavaScript。 Prototype主要是对于JavaScript语言本身的一些底层的扩充，另外解决了一些跨浏览器的问题。但是Prototype还是太底层了，本身 提供的功能非常少，基于它来建造复杂的Ajax组件（例如，一个功能完善的Grid组件）仍然非常困难。<br><br>而Rico呢，仍然谈不上是一个框架，Rico和Scriptaculous都只是基于Prototype建造的Ajax效果库。 Rico的Live Grid太原始了，这也是我放弃Rico的一个原因，而且Rico这半年来就没有什么大的发展。<br><br>我并不是要否定Prototype，而是经过考察发现Prototype很难支持我的目标。我的目标就是建造一个全面的Ajax组件库，dojo恰好对于支持这个目标非常有帮助。<br>dojo其实是一个组件模型，类似于Spring，用来支持大规模的组件化开发。组件模型的作用就是增强代码的重用，这对于提高开发效率是至关重要的。<br><br><span style="COLOR: green">2.dojo的背后有强大的支持。</span><br><br>dojo现在已经是众多开源框架的选择，包括：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;* WebWork<br>&nbsp;&nbsp;&nbsp;&nbsp;* Tapestry<br>&nbsp;&nbsp;&nbsp;&nbsp;* Eclipse ATF<br>&nbsp;&nbsp;&nbsp;&nbsp;* MyFaces<br><br>这个列表还会随着时间的推移而扩大。<br>dojo的开发团队由Alex Russell领军，人数众多，力量非常强大。<br><br><span style="COLOR: green">3.dojo的组件比较丰富，而且目前的开发非常活跃。</span><br><br>这里是一些组件列表，也可以在这里提出新的组件需求。<br><a href="http://dojo.jot.com/WidgetWishlist" target=_new><u><font color=#0000ff>http://dojo.jot.com/WidgetWishlist</font></u></a><br><br>有一个正在开发的Grid组件，按照功能描述来看非常强大，值得高度注意。<br><a href="http://dojo.jot.com/GridWidget" target=_new><u><font color=#0000ff>http://dojo.jot.com/GridWidget</font></u></a><br><br>这样以来就可以减轻我的大量沉重的工作。 <br><br><span style="COLOR: red">二、参加讨论：</span><br><br><a href="http://www.matrix.org.cn/thread.shtml?topicId=42920&amp;forumId=41" target=_new><font color=#0000ff><u>matrix论坛</u></font></a><br><br><a href="http://<a%20href=http://www.javaresource.org/ajax/ajax-60.html>ajax</a>cn.org/space/start/2006-04-14/1" target=_new><u><font color=#0000ff>Ajaxcn</font></u></a><br><br></div>
</div>
</div>
<a href="http://blog.csdn.net/hxcfindjob/archive/2006/05/15/739723.aspx"></a><br>请记住本文永久地址:<br><a href="http://www.javaresource.org/ajax/ajax-73911.html"><u><font color=#0000ff>http://www.javaresource.org/ajax/ajax-73911.html</font></u></a> <br>
<img src ="http://www.blogjava.net/i369/aggbug/111966.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-04-19 16:01 <a href="http://www.blogjava.net/i369/articles/111966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写基于Prototype的Javascript动画类 </title><link>http://www.blogjava.net/i369/articles/111925.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111925.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111925.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111925.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这段时间身体欠佳，经常头晕。医生说并无大碍，可我服了药也不见有多少好转。因此我很久没有更新Blog了。针对大家关于Struts 2的问题，我正着手开发一个应用程序例子。这个例子以ASP.NET的&#8220;Personal Web Site Stater Kit&#8221;应用程序作为蓝本，采用&#8220;Spring 2 + Hiberante 3 + Struct 2&#8221;架...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111925.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111925.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-04-19 13:45 <a href="http://www.blogjava.net/i369/articles/111925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初次接触Extreme Table </title><link>http://www.blogjava.net/i369/articles/111670.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 18 Apr 2007 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111670.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111670.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111670.html</trackback:ping><description><![CDATA[Home Page:<a href="http://www.extremecomponents.org/"><u><font color=#800080>http://www.extremecomponents.org</font></u></a>
<p>&nbsp;&nbsp;&nbsp; &nbsp;Extreme Table是最功能强大而又容易配置,扩展,自定义的Table 控件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 最紧要的功能包括排序, 分页, 导出Excel, pdf和汇总。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; springside的best 示例代码在: listBook.jsp和listOrder.jsp.</p>
<p>基础读物:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1. <a href="http://extremecomponents.org/wiki/index.php/Main_Page" target=_blank><u><font color=#800080>ExtremeTable自带的文档</font></u></a> .</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2.<a href="http://extremecomponents.org/wiki/index.php/Simplified_Chinese" target=_blank><u><font color=#800080>Luck翻译的ExtremeTable官方文档中文版</font></u></a>&nbsp;&nbsp;&nbsp;</p>
<h2>1. 安装</h2>
<h3>1.1 安装原始版本</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1. 从<a href="http://www.extremecomponents.org/"><u><font color=#800080>http://www.extremecomponents.org</font></u></a> 下载最新版</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2.把extremecomponents.jar 放入web-inf/lib</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 3.根据minum, 导出excel 或 导出pdf的需要，把/lib下的jar copy到web-inf/lib</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 4.把images里的图片放入web的任意目录</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 5.把css文件放到web的任意目录</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 6.在/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面并进行修改.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 7.修改web.xml (见2)。</p>
<h3>&nbsp;0.2 复制SpringSide的样式</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1.Copy springside的Table Head的图，查。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2.将springside中的修改版extremecomponents.css文件放入任意目录</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 3.把/src/resource/extremetable.properties 复制到对应目录</p>
<h3>0.3 使用Compact View很重要</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 默认的式样不符合大家的审美，幸亏还有Compact View和css设置，让我们可以敬谢不敏它号称非常方便的HtmlView子类扩展。</p>
<p>&nbsp;&nbsp;&nbsp; 1. 在全局设置里</p>
<pre> table.view.html=org.extremecomponents.table.view.CompactView</pre>
<p>&nbsp;&nbsp;&nbsp; 2.把images里/table/compact/*.gif copy 到 /table</p>
<h2>2.全局属性配置</h2>
<p>&nbsp;&nbsp; ExtremeTable支持在properties文件里方便的统一配置丰富的全局属性</p>
<p>&nbsp; 在/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面.</p>
<p>&nbsp;在web.xml里面增加</p>
<pre>&nbsp;&nbsp; &lt;context-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;extremecomponentsPreferencesLocation&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/extremetable.properties&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/context-param&gt;</pre>
<p>一般只写需要修改的文件:</p>
<pre>table.filterable=false<br>table.imagePath=/images/table/*.gif<br>table.locale=zh_CN<br>table.view.html=org.extremecomponents.table.view.CompactView<br>row.highlightRow=true<br>column.format.date=yyyy-MM-dd<br>column.format.currency=###,###,###,###,#00.00<br></pre>
<h2>3.导出Excel</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;注意Excel 导出的Tag已改为，且官方版不支持中文文件名。</p>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ec:exportXls fileName="BookList.xls" tooltip="导出 Excel"/&gt;</pre>
<p>在web.xml必须加入：</p>
<pre>&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.extremecomponents.table.filter.ExportFilter&lt;/filter-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br>    &lt;filter-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br></pre>
<p>&nbsp;&nbsp;&nbsp; &nbsp;ExtremeTable导出的一项重要特性是可以根据不同的View导出不同的列.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 比如html管理界面可能只列出订单几个最重要的列，而导出excel时则需要导出所有的列。</p>
<pre>&lt;ec:column property="orderdate" title="订单日期"&nbsp; cell="date" format="yyyy-MM-dd"&nbsp; viewsDenied= "html"/&gt;</pre>
<p>又比如有些操作按纽的列只想在html出现,excel里不想出现：</p>
<pre>&lt;ec:column property="orderdate" title="订单日期" viewAllowed= "html"/&gt;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 以上订单日期列在html view看不到，而excel,pdf view可以见到.</p>
<p>&nbsp;&nbsp;&nbsp; 而"编辑图标"，"选择Checkbox"这些管理界面上的列，也可以设置不export到pdf,excel view</p>
<h2>4.其他要点<br></h2>
<h3>4.1. 使用排序功能时,如果property为嵌套属性时,需要设置alias</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;因为javascript的关系.</p>
<pre>&lt;ec:column property="customer.name" title="客户名称" alias="customer"/&gt;</pre>
<h3>4.2. Date Cell与NumberCell 和RowCountCell</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在全局属性定义:</p>
<p>&nbsp;</p>
<pre> column.format.date= yyyy-MM-ddcolumn.format.currency= ￥###,###,#00.00</pre>
<pre>&lt;ec:column property="totalprice" title="总金额" cell="currency" width="80" /&gt;<br>&lt;ec:column property="shipdate" title="发货日期"&nbsp; cell="date" width= "80"/&gt;<br>&lt;e</pre>
<p>其中RowCountCell用于显示序号。</p>
<h3>4.3. 汇总</h3>
<p>在column中加入两个cac属性，就会自动在table的底端显示汇总</p>
<p>&nbsp;</p>
<pre>&lt;ec:column property="totalprice" title="总金额" cell="number" format="###,###,##0.00" calc="total" calcTitle= "汇总:"/&gt;</pre>
<h3>4.4 i18N</h3>
<p>在Web.xml里面指定i18N的Properties文件</p>
<pre>&lt;context-param&gt;<br>&nbsp;&nbsp;&lt;param-name&gt;extremecomponentsMessagesLocation&lt;/param-name&gt;<br>&nbsp;&nbsp;&lt;param-value&gt;messages&lt;/param-value&gt;<br>&lt;/context-param&gt;</pre>
<pre>&lt;ec:column property="name" title="book.name"/&gt;</pre>
<h3>4.5数据库分页</h3>
<p>&nbsp;EC默认从数据库中查找所有记录然后由它来分页，如果查询结果较大，可以考虑使用数据库端分页的方案。</p>
<p>&nbsp;此时，EC会使用Limit对象向Controller传递PageNo,PageSize,OrderBy等分页信息。而服务端将向EC返回总记录数和当前页的内容，具体请参看 BookController。</p>
<h3>4.6不显示导出excel及分页</h3>
<p>最快的方式是设置table的showStatusBar= false</p>
<pre>&lt;ec:table&nbsp; items= "order.orderItems"var="item"&nbsp;action=""&nbsp;&nbsp; showStatusBar= "false"&gt;</pre>
<h3>&nbsp;&nbsp;&nbsp; 4.7ImagePath</h3>
<p>&nbsp; 旧版EC包括其文档都在每个table tag里定义ImagePath, 新版已经可以自动插入ContextPath,只需在properties文件定义table.imagePath=/images/table/*.gif即可</p>
<h2>5.自定义及扩展</h2>
<p>&nbsp;&nbsp; ExtremeTable比Display Tag的i一个就是良好的自定义和扩展能力，不用千人一面。<br>&nbsp;&nbsp; 不过，人总是懒的，虽然扩展子类很容易，但能不扩展就还是不可扩展了。幸亏用Compact View再改改CSS一般就能达到要求。</p>
<h3>&nbsp;5.1. 良好的CSS定义</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExtremeTable 的CSS定义非常严谨, 并且提供很多个层次的修改方式:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.直接修改css文件, 可以把table view改成任意样式</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.修改全局属性, 改变某种元素对应的css class名</p>
<pre>table.styleClass=tableRegion</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.在某个页面的row,column tag中定义class</p>
<pre>&nbsp;&lt;ec:row style="" or styleClass=""/&gt;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringSide采用层次1, 直接修改extremecomponents.css为合适的样式</p>
<h3>5.2方便的&lt;tr&gt;&lt;td&gt;属性扩展</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row与column已提供了丰富的普通属性与 javascript属性如onClick(), 如果属性仍然未够,可自行扩展&lt;row&gt;与&lt;column&gt;tag ，并通过全局属性指定新的子类名。</p>
<p>&nbsp;&nbsp;&nbsp;为了方便大家在子类扩展属性, extreme Table提供了专门的回调函数与Util函数如</p>
<pre>public void addColumnAttributes(Column column) {   column.addAttribute("customAttributeOne", customAttributeOne);<br>}           </pre>
<p>详细请看手册,Table, Row,Column都提供相同的扩展:<br><a href="http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes"><u><font color=#0000ff>http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes</font></u></a></p>
<p>如果不是Extremetable的特别支持, 普通taglib class要扩展属性的话:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.定义真正的Java属性,setter,getter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. tld文件中声明新的属性 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.重载输出函数将新属性打印出来</p>
<h3>5.3 扩展HTMLView,cell 等显示组件</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Extreme Table在这些类的扩展上放便很多，但这个版本里我还没有进行尝试，就不写了。请自行参考官方文档:<a href="http://extremecomponents.org/wiki/index.php/Html_View_Tutorial"><u><font color=#0000ff>http://extremecomponents.org/wiki/index.php/Html_View_Tutorial</font></u></a> .&nbsp;</p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1549813</p>
<img src ="http://www.blogjava.net/i369/aggbug/111670.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-04-18 16:20 <a href="http://www.blogjava.net/i369/articles/111670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构师任务--制定代码规范(Standard of Coding Standards) </title><link>http://www.blogjava.net/i369/articles/111603.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 18 Apr 2007 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111603.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111603.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111603.html</trackback:ping><description><![CDATA[作者：<a href="http://blog%20.csdn.net/calvinxiu/"><u><font color=#0000ff>江南白衣</font></u></a>，原文地址：<a href="http://blog.csdn.net/calvinxiu/archive/2007/04/17/1567553.aspx"><u><font color=#800080>http://blog.csdn.net/calvinxiu/archive/2007/04/17/1567553.aspx</font></u></a>，转载请保留。
<p>&nbsp;这个系列希望写一些正儿八经的架构设计之外的，属于架构师职责的杂七杂八的事情。</p>
<p>&nbsp;制定项目的代码规范也是架构师的杂事之一，下面记一些制定规范的规范，Standar of Coding Standars。</p>
<p><strong>1.规范的内容</strong></p>
<p>&nbsp; a.Standars在老外口中可以细化为Conventions、Rules、Guidelines和Best Practices，身为一份有价值的规范，除了定义最简单的格式、命名规则外，更要包含足够份量的禁条、指南和最佳实践。</p>
<p>&nbsp; b.规范必须是经实践的广泛共识的标准，不是完美主义者凭空发明，认为这样子会更好的条款。</p>
<p>&nbsp; c.条款必须有被描述的价值，没人会做的蠢事就不用再列了（比如编译器已经强制检查的，或者滥用goto语句这样的条款）</p>
<p>&nbsp;&nbsp;d.条款可以分成必须遵循(I)、推荐遵循(II)与可选建议(III)几个等级。</p>
<p>&nbsp; e.团员意见一致的规范比完美的规范更重要。</p>
<p><strong>2.第0条规范---不要拘泥于细节，个人喜好与过时的东西不应该被标准化</strong></p>
<p>&nbsp;&nbsp;&nbsp; ----来自《C++ Coding Standards中文版》，很重要的条款。</p>
<p>&nbsp;&nbsp;&nbsp; 有些东西只是个人喜好与信仰问题(MS vs Unix)，并不影响程序的正确性可读性，比如，花括号的位置，缩进，空格与缩进符，行的长度，只需要规定在一个文件、一个模块中必须一致就可以了。</p>
<p>&nbsp;&nbsp;&nbsp; 具体使用哪种风格其实并不影响可读性，不值得花太多的时间来争论，规范中更有价值的是格式以外的部分，比如How处理异常，How写log等。何况现代IDE一下就能转换格式。但若是阅读同一段代码时要在几种风格中切换就有点难受。</p>
<p>&nbsp;&nbsp;&nbsp; 过多过细的命名规定也不值得，而匈牙利记法，单入口单出口条例在书中被认为过时。</p>
<p><strong>3.以别人的规范作基础</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>a. C++</strong></p>
<ul>
    <li><font color=#669966><font color=#000000><a href="http://www.possibility.com/Cpp/CppCodingStandard.html"><u><font color=#0000ff>C++ Coding Standard</font></u></a>&nbsp; 很多公司使用的规范，2007.1更新。</font></font>
    <li><a href="http://www.dearbook.com/book/91309"><u><font color=#0000ff>《C++ Coding Standards中文版》</font></u></a>Herb Sutter(Exceptional C++作者)，与Andrei Alexandrescu(Modern C++ Design作者)两大鬼才的返璞归真之作。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>b. Java</strong></p>
<ul>
    <li><a href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html"><font color=#669966><u>Code Conventions for the Java Programming Language</u></font></a>, <a href="http://java.sun.com/j2se/javadoc/writingdoccomments/index.html"><font color=#669966><br><u>How to Write Doc Comments for the Javadoc tool</u></font></a> by Sun Microsystems, Inc.
    <li><a href="http://gee.cs.oswego.edu/dl/html/javaCodingStd.html"><font color=#669966><u>Draft Java Coding Standard</u></font></a>, by Doug Lea (Java并发编程教父)
    <li><a href="http://www.ambysoft.com/javaCodingStandards.html"><font color=#669966><u>Coding Standards for Java</u></font></a>, by Scott W. Ambler&nbsp;(著名书商，2007.1更新)
    <li><a href="http://wiki.springside.org.cn/display/springside/Coding+Standards"><u><font color=#800080>SpringSide Coding Standard</font></u></a> by 白衣 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>c. Other</strong></p>
<ul>
    <li>&nbsp;<a href="http://directory.google.com/Top/Computers/Programming/Languages/"><font color=#669966><u>Google Directory</u></font></a>&nbsp; 和 <a href="http://dmoz.org/Computers/Programming/Languages/"><font color=#669966><u>Open Directory</u></font></a> 上，每种语言都可能收集有Coding Standard/Styles。
    <li>RUP的文档中也有C++与Java Programing Guidline Examples。 </li>
</ul>
<p><strong>4. Code Review</strong><br>&nbsp;&nbsp;&nbsp; 善用自动review的工具如<span class=nobr><a title="Visit page outside Confluence" href="http://www.eclipse.org/" rel=nofollow><u><font color=#0000ff>Eclipse</font></u></a></span>与 <span class=nobr><a title="Visit page outside Confluence" href="http://www.jetbrains.com/" rel=nofollow><u><font color=#0000ff>Inellij IDEA</font></u></a></span>的代码校验功能和<span class=nobr><a title="Visit page outside Confluence" href="http://checkstyle.sf.net/" rel=nofollow><u><font color=#0000ff>Checkstyle</font></u></a></span><span class=nobr>、<a title="Visit page outside Confluence" href="http://pmd.sf.net/" rel=nofollow><u><font color=#0000ff>PMD</font></u></a>&nbsp;这些静态代码分析工具。</span></p>
<p><span class=nobr><strong>5.参考资料：<br></strong><a href="http://www.jamesshore.com/Agile-Book/coding_standards.html"><u><font color=#0000ff>《The Art of Agile Development》Coding Standards一章</font></u></a></span></p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1567553</p>
<img src ="http://www.blogjava.net/i369/aggbug/111603.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-04-18 14:04 <a href="http://www.blogjava.net/i369/articles/111603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构师核心技能养成计划 </title><link>http://www.blogjava.net/i369/articles/111602.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 18 Apr 2007 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111602.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111602.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111602.html</trackback:ping><description><![CDATA[作者：<a href="http://blog.csdn.net/calvin/"><u><font color=#0000ff>江南白衣</font></u></a>，原文出处： <a href="http://blog.csdn.net/calvinxiu/archive/2007/02/18/1511545.aspx"><u><font color=#800080>http://blog.csdn.net/calvinxiu/archive/2007/02/18/1511545.aspx</font></u></a>，转载请保留。--last update 2007.3.25
<p><strong>引子：<br></strong>&nbsp;&nbsp;&nbsp; "这个项目的架构是什么？"<br>&nbsp;&nbsp; 对方爽快的回答："Spring+Struts+Hibernate。"<br>&nbsp;&nbsp; 嗯，这位很可能不是架构师......</p>
<h2>一、核心竞争力</h2>
<p><strong>架构设计的原理、模式与技术<br>&nbsp;&nbsp;&nbsp; </strong>未经培训的架构师们从试验与挫折中获得架构设计的技能，但其中大量的原理、知识、模式和技巧，都经历了一个<strong>重复发现</strong>的过程。<br>&nbsp;&nbsp;&nbsp; 其实，各路神仙在这个领域虽则没有捣鼓出大热的畅销书来，但前篇的<a href="http://blog.csdn.net/calvinxiu/archive/2007/02/12/1508088.aspx"><u><font color=#0000ff>架构师书单</font></u></a>，也足够为我们作一个系统的知识整理。<br>&nbsp;&nbsp;&nbsp;&nbsp;悲哀的发现，自己的再发现式积累还是太慢、太片面，大多局限于GOF23、Java EE架构模式、RUP 等方面。</p>
<p><strong>满足架构质量属性所需的软硬件知识</strong>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;如何满足性能，伸缩性，扩展性、可靠性，容灾，可恢复性，可管理性这些架构质量属性，是架构师的饭碗级知识。</p>
<p><strong>有序的以方法为驱动源的任务执行</strong>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;匠级的架构师多有一套自己的方法论、过程论，每回设计都是熟练而有序的执行。<br>&nbsp;&nbsp;&nbsp;&nbsp;架构师在软件开发中的过程，<strong>以RUP为基础的剪裁</strong>被描述得最为详细，可执行度最高的。<br>&nbsp;&nbsp;&nbsp; 而核心的架构过程，直觉与模式，有序与混沌的平衡，就只有反复试验，独家秘制。<br>&nbsp;&nbsp; <br><br><strong>领域知识与业务分析能力<br>&nbsp;</strong>&nbsp;&nbsp; 技术人员一般抗拒学习软件开发以外的东西，但架构师却非如此不可。<br>&nbsp;&nbsp;&nbsp; BTW.G9写过一篇很有意思的<strong><a href="http://blog.csdn.net/g9yuayon/archive/2006/09/18/1236675.aspx"><u><font color=#0000ff>〈商业软件编程很无聊？〉</font></u></a><br></strong><br><strong>大型项目的经验</strong>&nbsp;<br>&nbsp;&nbsp; &nbsp;中国有多少架构师，不在于有多少人通过了什么考试培训，而在于中国大型项目的数量。<br><strong>&nbsp;&nbsp;&nbsp; 问：你这个项目的架构是什么？一口回答：Spring+Struts+Hibernate。这位很可能就不是架构师了，因为这仅仅是技术Stack，项目规模不大时Spring+Struts+Hibernate才会成为架构的重点。</strong></p>
<p>&nbsp;&nbsp;&nbsp; 除了亲自担任这些项目的架构师，如果明了别人架构设计与决策的思路也是一样能拿经验。所以，尽量多读一下公司项目的设计文档，也愉快的接受其他项目组架构评审会的邀请。</p>
<h2><br>二、基本能力</h2>
<p><br><strong>完整的软件开发生命周期经验</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 这个不用说了，幸好中国的架构师什么脏活累活都做过，甚至跟着市场人员跑去做演示这些国外架构师不一定有的经验我们都有了，差别只在于基本开发生命周期理论--RUP 、CMMI3、 敏捷原则的细节掌握。</p>
<p><br><strong>精通一两种主流开发语言、保持当下架构的开发体验</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 国内的架构师到了三十岁以后很多就往理论上跑，而国外的架构师在往上发展的同时保持下面的编程体验，所以国内多水王，而国外则多大师。水王的设计多与实现有很大断层。而且人过三十学习能力下降，手艺放下了就别想捡起来了:(<br>&nbsp;&nbsp;&nbsp; 但是，保持一个体验就好了，也不必要苦行僧似的要求自己每日编码若干行，很可能因为你的时间安排不来反而拖了大家的进度。</p>
<p><strong>宏观了解当前的技术与产品，追逐最新的技术潮流</strong>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 架构师的知识结构必须是亘古真理+最新技术的结合，盲目追逐最in技术的不是架构师，但倚老卖老，张口就说你们年轻人就知道追逐新技术的同样也讨人嫌。<br>&nbsp;&nbsp;&nbsp;&nbsp; 架构师对各大公司的完整产品线和著名的开源项目应该都有个宏观上的了解。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但也要抵制成为某项技术专家，如Oracle启动参数优化专家的诱惑，技术细节掌握到业务职责需要的程度就刚好了。除非如Spring Framework进一步了解能有天大好处。<br><br><strong>与业务域开发域人员沟通的能力、决策能力和权威和其他的领导能力</strong>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp; IT 架构师处在客户和开发人员之间，必须能够使用各种媒体（代码、模型、文档、PowerPoint以及谈话和讲座），与技术和非技术的干系人进行沟通。<br>&nbsp;&nbsp; 另外，架构师必须注意培养自己的技术决策能力和决策权威。<br>&nbsp;&nbsp; 最后，架构师好歹也是个半大不小的官，其他领导必要的能力就不列了。<br><br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;参考了IBM DW中国上的两篇文章：</p>
<ul>
    <li>
    <div><a href="http://www.ibm.com/developerworks/cn/rational/rationaledge/content/apr06/eeles/"><font color=#800080><u><strong>软件构架师的特点</strong> </u></font></a></div>
    <li>
    <div><a href="http://www.ibm.com/developerworks/cn/webservices/ar-itio3/"><u><font color=#800080><strong>观点与展望，第 3 部分: 什么是最有价值的 IT 体系结构技能，如何学习？</strong> </font></u></a></div>
    </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; </p>
<h2>三、镜子做好了，自己先照一下</h2>
<ul>
    <li>要把<a href="http://blog.csdn.net/calvinxiu/archive/2007/02/12/1508088.aspx"><u><font color=#0000ff>书单</font></u></a>啃完；
    <li>要熟悉电信的业务知识；
    <li>要重点学习满足架构质量属性的软硬件知识；&nbsp;
    <li>要把公司几百个项目的设计文档挑好的看一遍；
    <li>要跟随公司最新一波RUP+CMMI3行情；
    <li>要重修C++；
    <li>要完整了解一遍IBM、BEA们的产品线。 </li>
</ul>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1511545</p>
<br>
<img src ="http://www.blogjava.net/i369/aggbug/111602.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-04-18 14:02 <a href="http://www.blogjava.net/i369/articles/111602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构师的启蒙战歌 </title><link>http://www.blogjava.net/i369/articles/111600.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 18 Apr 2007 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111600.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111600.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111600.html</trackback:ping><description><![CDATA[<p>作者：<a href="http://blog.csdn.net/calvin/" temp_href="http://blog.csdn.net/calvin/"><u><font color=#0000ff>江南白衣</font></u></a>，转载请保留。&nbsp;</p>
<p>下面几个What的问题是架构师的入门Question。</p>
<p><strong>1.什么是架构？</strong><br>&nbsp; 如果自问自答，这是个相当鸡肋的问题。看看书里的答案可能有点收获。<br>&nbsp; 架构定义了系统元素的结构与行为，关注最重要的元素，记录决策原理，受涉众利益与环境的影响。<br>&nbsp;&nbsp;架构不仅是结构，也不是企业架构，系统架构，信息架构，硬件架构.....<br>&nbsp; 架构设计也不是面向对象分析/设计，虽然架构设计基于面向对象设计，但补充了面向对象设计里没有关注的视点。</p>
<p><strong>2.架构有什么用途？<br></strong>&nbsp; 人类所有行为都是目的驱动的，不同目的下架构的过程也会不同，继续看书里的答案，经常的用途有：</p>
<ul>
    <li>培训与沟通
    <li>满足系统的质量属性，与涉众沟通达成一致的目标
    <li>有效管理复杂性
    <li>支持开发日程安排、工作分配、成本分析 </li>
</ul>
<p><strong>3.各个流派用什么视图来表达架构？<br></strong>&nbsp;&nbsp; 最经典的RUP 4+1，ISO/ITU-T联合制定的RM-ODP，Hofmeister在《Applied Software Architecture》中使用的西门子视图，《Documenting Software Architectures》使用的方法等。</p>
<p><strong>4.架构师在软件生命周期中的工作和角色？<br>&nbsp;&nbsp; </strong>架构师的工作不只是设计(虽然最重要的的确如是），在分析、设计、实现、测试、维护、技术风险管理、问题域分析、团队技术领导与沟通者等流程里架构师都有自己的角色要担当。</p>
<p><strong>5..架构师的技能？</strong><br>&nbsp; 自己总结了一篇<a href="http://blog.csdn.net/calvinxiu/archive/2007/02/18/1511545.aspx"><u><font color=#800080>《</font><font color=#000000>架构师核心技能养成计划</font><font color=#800080>》</font></u></a></p>
<p><strong>答案：</strong><br>1.IBM DW 中文站上有四篇不错的入门文章：<br>一、<a href="http://www.ibm.com/developerworks/cn/rational/rationaledge/content/mar06/eeles/"><u><font color=#800080>什么是软件架构？</font></u></a> <br>二、<a href="http://www.ibm.com/developerworks/cn/rational/rationaledge/content/apr06/eeles/"><u><font color=#800080>软件构架师的特点</font></u></a> <br>三、<a href="http://www.ibm.com/developerworks/cn/rational/rationaledge/content/may06/eeles/"><u><font color=#0000ff>软件架构的过程</font></u></a><br>四、<a href="http://www.ibm.com/developerworks/cn/rational/rationaledge/content/jun06/eeles/"><u><font color=#0000ff>进行软件架构设计的益处</font></u></a>&nbsp; </p>
<p>2.《Large-Scale Software Architecture》的前50页也回答了同样的问题。</p>
<p>3. 另外所有和架构沾点边的书都会忍不住浪费篇幅去讨论这些问题。</p>
<p>&nbsp;&nbsp;&nbsp; 不过这些答案从字面上看都是大家熟悉的东西，很容易泛泛的看完了，过一阵子脑子里又十室九空，最好是能够看进去产出化学作用，再辛苦一点把它们总结成自己的文档。</p>
<p>And then? 可以开始一些How的问题了.....</p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1524867</p>
<img src ="http://www.blogjava.net/i369/aggbug/111600.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-04-18 14:00 <a href="http://www.blogjava.net/i369/articles/111600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>