﻿<?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-XZC.Log-随笔分类-Design</title><link>http://www.blogjava.net/xzclog/category/17324.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 04 Mar 2010 18:02:51 GMT</lastBuildDate><pubDate>Thu, 04 Mar 2010 18:02:51 GMT</pubDate><ttl>60</ttl><item><title>PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码</title><link>http://www.blogjava.net/xzclog/archive/2010/03/03/314416.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 03 Mar 2010 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/03/03/314416.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/314416.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/03/03/314416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/314416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/314416.html</trackback:ping><description><![CDATA[<div class="tit">【转】PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码</div>
<div class="date">2009-12-03 15:06</div>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <div class="cnt">
            <p>PowerDesigner-&gt;Tools-&gt;Execute Commands-&gt;Edit/Run Scripts</p>
            <p>&nbsp;</p>
            <p>代码一:将Name中的字符COPY至Comment中</p>
            <div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">****************************************************************************** </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">*&nbsp;&nbsp;&nbsp; File:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2comment.vbs </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">*&nbsp;&nbsp;&nbsp; Purpose:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Database&nbsp;&nbsp;&nbsp; generation&nbsp;&nbsp;&nbsp; cannot&nbsp;&nbsp;&nbsp; use&nbsp;&nbsp;&nbsp; object&nbsp;&nbsp;&nbsp; names&nbsp;&nbsp;&nbsp; anymore&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&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; in&nbsp;&nbsp;&nbsp; version&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; above. </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&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; It&nbsp;&nbsp;&nbsp; always&nbsp;&nbsp;&nbsp; uses&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; object&nbsp;&nbsp;&nbsp; codes. </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)"> </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&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; In&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; object&nbsp;&nbsp;&nbsp; codes&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; not&nbsp;&nbsp;&nbsp; aligned&nbsp;&nbsp;&nbsp; with&nbsp;&nbsp;&nbsp; your&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&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; object&nbsp;&nbsp;&nbsp; names&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; your&nbsp;&nbsp;&nbsp; model,&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; script&nbsp;&nbsp;&nbsp; will&nbsp;&nbsp;&nbsp; copy&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&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; the&nbsp;&nbsp;&nbsp; object&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp; onto&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; object&nbsp;&nbsp;&nbsp; Comment&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&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; the&nbsp;&nbsp;&nbsp; Tables&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; Columns. </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)"> </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">*&nbsp;&nbsp;&nbsp; Title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">*&nbsp;&nbsp;&nbsp; Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0 </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">*&nbsp;&nbsp;&nbsp; Company:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sybase&nbsp;&nbsp;&nbsp; Inc.&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">****************************************************************************** </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Option</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Explicit</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />ValidationMode&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">True</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />InteractiveMode&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; im_Batch <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; mdl&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; model </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; get&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; active&nbsp;&nbsp;&nbsp; model </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Set</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; mdl&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; ActiveModel <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">If</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; (mdl&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Is</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Nothing</span><span style="color: rgb(0,0,0)">)&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">MsgBox</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(128,0,0)">There&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; no&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; Model </span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">ElseIf</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; mdl.IsKindOf(PdPDM.cls_Model)&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">MsgBox</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(128,0,0)">The&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; model&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; not&nbsp;&nbsp;&nbsp; an&nbsp;&nbsp;&nbsp; Physical&nbsp;&nbsp;&nbsp; Data&nbsp;&nbsp;&nbsp; model. </span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Else</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessFolder&nbsp;&nbsp;&nbsp; mdl <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">End</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">If</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; This&nbsp;&nbsp;&nbsp; routine&nbsp;&nbsp;&nbsp; copy&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp; into&nbsp;&nbsp;&nbsp; comment&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; each&nbsp;&nbsp;&nbsp; table,&nbsp;&nbsp;&nbsp; each&nbsp;&nbsp;&nbsp; column&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; each&nbsp;&nbsp;&nbsp; view </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; folder </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Private</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">sub</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; ProcessFolder(folder) <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; Tab&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; Tab&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; folder.tables <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; tab.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tab.comment&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; tab.name <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; col&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; running&nbsp;&nbsp;&nbsp; column </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; col&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; tab.columns <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.comment</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; col.name <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">running&nbsp;&nbsp;&nbsp; view </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; folder.Views <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view.comment&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view.name <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; go&nbsp;&nbsp;&nbsp; into&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; sub-packages </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; running&nbsp;&nbsp;&nbsp; folder </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">For</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp; In&nbsp;&nbsp;&nbsp; folder.Packages <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; f.IsShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessFolder&nbsp;&nbsp;&nbsp; f <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">sub</span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
            <p>代码二:将Comment中的字符COPY至Name中</p>
            <div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: rgb(0,0,255)">Option</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Explicit</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />ValidationMode&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">True</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />InteractiveMode&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; im_Batch <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; mdl&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; model </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; get&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; active&nbsp;&nbsp;&nbsp; model </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Set</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; mdl&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; ActiveModel <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">If</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; (mdl&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Is</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Nothing</span><span style="color: rgb(0,0,0)">)&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">MsgBox</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(128,0,0)">There&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; no&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; Model </span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">ElseIf</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; mdl.IsKindOf(PdPDM.cls_Model)&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">MsgBox</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(128,0,0)">The&nbsp;&nbsp;&nbsp; current&nbsp;&nbsp;&nbsp; model&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; not&nbsp;&nbsp;&nbsp; an&nbsp;&nbsp;&nbsp; Physical&nbsp;&nbsp;&nbsp; Data&nbsp;&nbsp;&nbsp; model. </span><span style="color: rgb(128,0,0)">"</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Else</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessFolder&nbsp;&nbsp;&nbsp; mdl <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">End</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">If</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">Private</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">sub</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; ProcessFolder(folder) <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">On</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">Error</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">Resume</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">Next</span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; Tab&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; Tab&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; folder.tables <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; tab.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tab.name&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; tab.comment<br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; col&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; running&nbsp;&nbsp;&nbsp; column </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; col&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; tab.columns <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> col.comment</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(128,0,0)">""</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; col.comment <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">running&nbsp;&nbsp;&nbsp; view </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; folder.Views <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view.name&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; view.comment <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; go&nbsp;&nbsp;&nbsp; into&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; sub-packages </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Dim</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">'</span><span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; running&nbsp;&nbsp;&nbsp; folder </span><span style="color: rgb(0,128,0)"><br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">For</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Each</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp; In&nbsp;&nbsp;&nbsp; folder.Packages <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">not</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; f.IsShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">then</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessFolder&nbsp;&nbsp;&nbsp; f <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">Next</span><span style="color: rgb(0,0,0)"> <br />
            <img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: rgb(0,0,255)">end</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">sub</span></div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/xzclog/aggbug/314416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-03-03 16:09 <a href="http://www.blogjava.net/xzclog/archive/2010/03/03/314416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jpetstore阅读心得之分层结构 </title><link>http://www.blogjava.net/xzclog/archive/2006/11/02/78593.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 02 Nov 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/11/02/78593.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/78593.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/11/02/78593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/78593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/78593.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 虽然对														Spring												不熟悉，又不懂														iBatis												，而且对模式的概念还没有弄清楚，但也硬着头皮去读														Spring												包自带的														Jpetstore											...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2006/11/02/78593.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/78593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-11-02 09:41 <a href="http://www.blogjava.net/xzclog/archive/2006/11/02/78593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用状态模式(state pattern)替代if else </title><link>http://www.blogjava.net/xzclog/archive/2006/10/16/75399.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 16 Oct 2006 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/10/16/75399.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/75399.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/10/16/75399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/75399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/75399.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 大多数开发人员现在还在使用if else的过程结构，曾看过jdon的banq大哥写的一篇文章，利用command,aop模式替代if else过程结构。当时还不太明白，这几天看了《重构》第一章的影片租赁案例，感触颇深。下面我来谈一谈为什么要用state pattern替代if else，替代if else有什么好处，以及给出详细代码怎么替代if else。本文参考jdon的“你还在使用if els...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2006/10/16/75399.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/75399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-10-16 13:46 <a href="http://www.blogjava.net/xzclog/archive/2006/10/16/75399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>权限的设计分析 </title><link>http://www.blogjava.net/xzclog/archive/2006/09/18/70375.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 18 Sep 2006 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/09/18/70375.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/70375.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/09/18/70375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/70375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/70375.html</trackback:ping><description><![CDATA[
		<p>权限往往是一个极其复杂的问题，但也可简单表述为这样的逻辑表达式：判断“Who对What(Which)进行How的操作”的逻辑表达式是否为真。针对不同的应用，需要根据项目的实际情况和具体架构，在维护性、灵活性、完整性等N多个方案之间比较权衡，选择符合的方案。<br />目标：<br />直观，因为系统最终会由最终用户来维护，权限分配的直观和容易理解，显得比较重要，系统不辞劳苦的实现了组的继承，除了功能的必须，更主要的就是因为它足够直观。<br />简单，包括概念数量上的简单和意义上的简单还有功能上的简单。想用一个权限系统解决所有的权限问题是不现实的。设计中将常常变化的“定制”特点比较强的部分判断为业务逻辑，而将常常相同的“通用”特点比较强的部分判断为权限逻辑就是基于这样的思路。<br />扩展，采用可继承在扩展上的困难。的Group概念在支持权限以组方式定义的同时有效避免了重定义时<br />现状：<br />对于在企业环境中的访问控制方法，一般有三种：<br />1.自主型访问控制方法。目前在我国的大多数的信息系统中的访问控制模块中基本是借助于自主型访问控制方法中的访问控制列表(ACLs)。<br />2.强制型访问控制方法。用于多层次安全级别的军事应用。<br />3.基于角色的访问控制方法（RBAC）。是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是：1.减小授权管理的复杂性，降低管理开销。2.灵活地支持企业的安全策略，并对企业的变化有很大的伸缩性。<br />名词：<br />粗粒度：表示类别级，即仅考虑对象的类别(the type of object)，不考虑对象的某个特<br />定实例。比如，用户管理中，创建、删除，对所有的用户都一视同仁，并不区分操作的具体对象实例。<br />细粒度：表示实例级，即需要考虑具体对象的实例(the instance of object)，当然，细<br />粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如，合同管理中，列表、删除，需要区分该合同实例是否为当前用户所创建。<br />原则：<br />权限逻辑配合业务逻辑。即权限系统以为业务逻辑提供服务为目标。相当多细粒度的权限问题因其极其独特而不具通用意义，它们也能被理解为是“业务逻辑”的一部分。比如，要求：“合同资源只能被它的创建者删除，与创建者同组的用户可以修改，所有的用户能够浏览”。这既可以认为是一个细粒度的权限问题，也可以认为是一个业务逻辑问题。在这里它是业务逻辑问题，在整个权限系统的架构设计之中不予过多考虑。当然，权限系统的架构也必须要能支持这样的控制判断。或者说，系统提供足够多但不是完全的控制能力。即，设计原则归结为：“系统只提供粗粒度的权限，细粒度的权限被认为是业务逻辑的职责”。<br />需要再次强调的是，这里表述的权限系统仅是一个“不完全”的权限系统，即，它不提供所有关于权限的问题的解决方法。它提供一个基础，并解决那些具有“共性”的(或者说粗粒度的)部分。在这个基础之上，根据“业务逻辑”的独特权限需求，编码实现剩余部分(或者说细粒度的)部分，才算完整。回到权限的问题公式，通用的设计仅解决了Who+What+How 的问题，其他的权限问题留给业务逻辑解决。<br />概念：<br />Who：权限的拥用者或主体（Principal、User、Group、Role、Actor等等）<br />What：权限针对的对象或资源（Resource、Class）。<br />How：具体的权限（Privilege, 正向授权与负向授权）。<br />Role：是角色，拥有一定数量的权限。<br />Operator：操作。表明对What的How 操作。<br />说明：<br />User：与 Role 相关，用户仅仅是纯粹的用户，权限是被分离出去了的。User是不能与 Privilege 直接相关的，User 要拥有对某种资源的权限，必须通过Role去关联。解决 Who 的问题。<br />Resource：就是系统的资源，比如部门新闻，文档等各种可以被提供给用户访问的对象。资源可以反向包含自身，即树状结构，每一个资源节点可以与若干指定权限类别相关可定义是否将其权限应用于子节点。<br />Privilege：是Resource Related的权限。就是指，这个权限是绑定在特定的资源实例上的。比如说部门新闻的发布权限，叫做"部门新闻发布权限"。这就表明，该Privilege是一个发布权限，而且是针对部门新闻这种资源的一种发布权限。Privilege是由Creator在做开发时就确定的。权限，包括系统定义权限和用户自定义权限用户自定义权限之间可以指定排斥和包含关系(如：读取，修改，管理三个权限，管理 权限 包含 前两种权限)。Privilege 如"删除" 是一个抽象的名词，当它不与任何具体的 Object 或 Resource 绑定在一起时是没有任何意义的。拿新闻发布来说，发布是一种权限，但是只说发布它是毫无意义的。因为不知道发布可以操作的对象是什么。只有当发布与新闻结合在一起时，才会产生真正的 Privilege。这就是 Privilege Instance。权限系统根据需求的不同可以延伸生很多不同的版本。<br />Role：是粗粒度和细粒度(业务逻辑)的接口，一个基于粗粒度控制的权限框架软件，对外的接口应该是Role，具体业务实现可以直接继承或拓展丰富Role的内容，Role不是如同User或Group的具体实体，它是接口概念，抽象的通称。<br />Group：用户组，权限分配的单位与载体。权限不考虑分配给特定的用户。组可以包括组(以实现权限的继承)。组可以包含用户，组内用户继承组的权限。Group要实现继承。即在创建时必须要指定该Group的Parent是什么Group。在粗粒度控制上，可以认为，只要某用户直接或者间接的属于某个Group那么它就具备这个Group的所有操作许可。细粒度控制上，在业务逻辑的判断中，User仅应关注其直接属于的Group，用来判断是否“同组” 。Group是可继承的，对于一个分级的权限实现，某个Group通过“继承”就已经直接获得了其父Group所拥有的所有“权限集合”，对这个Group而言，需要与权限建立直接关联的，仅是它比起其父Group需要“扩展”的那部分权限。子组继承父组的所有权限，规则来得更简单，同时意味着管理更容易。为了更进一步实现权限的继承，最直接的就是在Group上引入“父子关系”。<br />User与Group是多对多的关系。即一个User可以属于多个Group之中，一个Group可以包括多个User。子Group与父Group是多对一的关系。Operator某种意义上类似于Resource + Privilege概念，但这里的Resource仅包括Resource Type不表示Resource Instance。Group 可以直接映射组织结构，Role 可以直接映射组织结构中的业务角色，比较直观，而且也足够灵活。Role对系统的贡献实质上就是提供了一个比较粗颗粒的分配单位。</p>
		<p>Group与Operator是多对多的关系。各概念的关系图示如下：<br />解释：<br />Operator的定义包括了Resource Type和Method概念。即，What和How的概念。之所以将What和How绑定在一起作为一个Operator概念而不是分开建模再建立关联，这是因为很多的How对于某What才有意义。比如，发布操作对新闻对象才有意义，对用户对象则没有意义。<br />How本身的意义也有所不同，具体来说，对于每一个What可以定义N种操作。比如，对于合同这类对象，可以定义创建操作、提交操作、检查冲突操作等。可以认为，How概念对应于每一个商业方法。其中，与具体用户身份相关的操作既可以定义在操作的业务逻辑之中，也可以定义在操作级别。比如，创建者的浏览视图与普通用户的浏览视图要求内容不同。既可以在外部定义两个操作方法，也可以在一个操作方法的内部根据具体逻辑进行处理。具体应用哪一种方式应依据实际情况进行处理。<br />这样的架构，应能在易于理解和管理的情况下，满足绝大部分粗粒度权限控制的功能需要。但是除了粗粒度权限，系统中必然还会包括无数对具体Instance的细粒度权限。这些问题，被留给业务逻辑来解决，这样的考虑基于以下两点：<br />一方面，细粒度的权限判断必须要在资源上建模权限分配的支持信息才可能得以实现。比如，如果要求创建者和普通用户看到不同的信息内容，那么，资源本身应该有其创建者的信息。另一方面，细粒度的权限常常具有相当大的业务逻辑相关性。对不同的业务逻辑，常常意味着完全不同的权限判定原则和策略。相比之下，粗粒度的权限更具通用性，将其实现为一个架构，更有重用价值；而将细粒度的权限判断实现为一个架构级别的东西就显得繁琐，而且不是那么的有必要，用定制的代码来实现就更简洁，更灵活。<br />所以细粒度控制应该在底层解决，Resource在实例化的时候，必需指定Owner和GroupPrivilege在对Resource进行操作时也必然会确定约束类型：究竟是OwnerOK还是GroupOK还是AllOK。Group应和Role严格分离User和Group是多对多的关系，Group只用于对用户分类，不包含任何Role的意义；Role只授予User，而不是Group。如果用户需要还没有的多种Privilege的组合，必须新增Role。Privilege必须能够访问Resource，同时带User参数，这样权限控制就完备了。<br />思想：<br />权限系统的核心由以下三部分构成：1.创造权限，2.分配权限，3.使用权限，然后，系统各部分的主要参与者对照如下：1.创造权限 - Creator创造，2.分配权限 - Administrator 分配，3.使用权限 - User：<br />1. Creator 创造 Privilege， Creator 在设计和实现系统时会划分，一个子系统或称为模块，应该有哪些权限。这里完成的是 Privilege 与 Resource 的对象声明，并没有真正将 Privilege 与具体Resource 实例联系在一起，形成Operator。<br />2. Administrator 指定 Privilege 与 Resource Instance 的关联。在这一步， 权限真正与资源实例联系到了一起， 产生了Operator（Privilege Instance）。Administrator利用Operator这个基本元素，来创造他理想中的权限模型。如，创建角色，创建用户组，给用户组分配用户，将用户组与角色关联等等...这些操作都是由 Administrator 来完成的。<br />3. User 使用 Administrator 分配给的权限去使用各个子系统。Administrator 是用户，在他的心目中有一个比较适合他管理和维护的权限模型。于是，程序员只要回答一个问题，就是什么权限可以访问什么资源，也就是前面说的 Operator。程序员提供 Operator 就意味着给系统穿上了盔甲。Administrator 就可以按照他的意愿来建立他所希望的权限框架可以自行增加，删除，管理Resource和Privilege之间关系。可以自行设定用户User和角色Role的对应关系。(如果将 Creator看作是 Basic 的发明者， Administrator 就是 Basic 的使用者，他可以做一些脚本式的编程) Operator是这个系统中最关键的部分，它是一个纽带，一个系在Programmer，Administrator，User之间的纽带。<br />用一个功能模块来举例子。<br />一．建立角色功能并做分配：<br />1．如果现在要做一个员工管理的模块(即Resources)，这个模块有三个功能，分别是：增加，修改，删除。给这三个功能各自分配一个ID，这个ID叫做功能代号：<br />Emp_addEmp，Emp_deleteEmp，Emp_updateEmp。<br />2．建立一个角色(Role)，把上面的功能代码加到这个角色拥有的权限中，并保存到数据库中。角色包括系统管理员，测试人员等。<br />3．建立一个员工的账号，并把一种或几种角色赋给这个员工。比如说这个员工既可以是公司管理人员，也可以是测试人员等。这样他登录到系统中将会只看到他拥有权限的那些模块。<br />二．把身份信息加到Session中。<br />登录时，先到数据库中查找是否存在这个员工，如果存在，再根据员工的sn查找员工的权限信息，把员工所有的权限信息都入到一个Hashmap中，比如就把上面的Emp_addEmp等放到这个Hashmap中。然后把Hashmap保存在一个UserInfoBean中。最后把这个UserInfoBean放到Session中，这样在整个程序的运行过程中，系统随时都可以取得这个用户的身份信息。<br />三．根据用户的权限做出不同的显示。<br />可以对比当前员工的权限和给这个菜单分配的“功能ID”判断当前用户是否有打开这个菜单的权限。例如：如果保存员工权限的Hashmap中没有这三个ID的任何一个，那这个菜单就不会显示，如果员工的Hashmap中有任何一个ID，那这个菜单都会显示。<br />对于一个新闻系统(Resouce)，假设它有这样的功能(Privilege)：查看，发布，删除，修改；假设对于删除，有"新闻系统管理者只能删除一月前发布的，而超级管理员可删除所有的这样的限制，这属于业务逻辑(Business logic)，而不属于用户权限范围。也就是说权限负责有没有删除的Permission，至于能删除哪些内容应该根据UserRole or UserGroup来决定(当然给UserRole or UserGroup分配权限时就应该包含上面两条业务逻辑)。<br />一个用户可以拥有多种角色，但同一时刻用户只能用一种角色进入系统。角色的划分方法可以根据实际情况划分，按部门或机构进行划分的，至于角色拥有多少权限，这就看系统管理员赋给他多少的权限了。用户—角色—权限的关键是角色。用户登录时是以用户和角色两种属性进行登录的（因为一个用户可以拥有多种角色，但同一时刻只能扮演一种角色），根据角色得到用户的权限，登录后进行初始化。这其中的技巧是同一时刻某一用户只能用一种角色进行登录。<br />针对不同的“角色”动态的建立不同的组，每个项目建立一个单独的Group，对于新的项目，建立新的 Group 即可。在权限判断部分，应在商业方法上予以控制。比如：不同用户的“操作能力”是不同的(粗粒度的控制应能满足要求)，不同用户的“可视区域”是不同的(体现在对被操作的对象的权限数据，是否允许当前用户访问，这需要对业务数据建模的时候考虑权限控制需要)。</p>
		<p>扩展性：<br />有了用户/权限管理的基本框架，Who(User/Group)的概念是不会经常需要扩展的。变化的可能是系统中引入新的 What (新的Resource类型)或者新的How(新的操作方式)。那在三个基本概念中，仅在Permission上进行扩展是不够的。这样的设计中Permission实质上解决了How 的问题，即表示了“怎样”的操作。那么这个“怎样”是在哪一个层次上的定义呢？将Permission定义在“商业方法”级别比较合适。比如，发布、购买、取消。每一个商业方法可以意味着用户进行的一个“动作”。定义在商业逻辑的层次上，一方面保证了数据访问代码的“纯洁性”，另一方面在功能上也是“足够”的。也就是说，对更低层次，能自由的访问数据，对更高层次，也能比较精细的控制权限。<br />确定了Permission定义的合适层次，更进一步，能够发现Permission实际上还隐含了What的概念。也就是说，对于What的How操作才会是一个完整的Operator。比如，“发布”操作，隐含了“信息”的“发布”概念，而对于“商品”而言发布操作是没有意义的。同样的，“购买”操作，隐含了“商品”的“购买”概念。这里的绑定还体现在大量通用的同名的操作上，比如，需要区分“商品的删除”与“信息的删除”这两个同名为“删除”的不同操作。<br />提供权限系统的扩展能力是在Operator (Resource + Permission)的概念上进行扩展。Proxy 模式是一个非常合适的实现方式。实现大致如下：在业务逻辑层(EJB Session Facade [Stateful SessionBean]中)，取得该商业方法的Methodname，再根据Classname和 Methodname 检索Operator 数据，然后依据这个Operator信息和Stateful中保存的User信息判断当前用户是否具备该方法的操作权限。<br />应用在 EJB 模式下，可以定义一个很明确的 Business层次，而一个Business 可能意味着不同的视图，当多个视图都对应于一个业务逻辑的时候，比如，Swing Client以及 Jsp Client 访问的是同一个 EJB 实现的 Business。在 Business 层上应用权限较能提供集中的控制能力。实际上，如果权限系统提供了查询能力，那么会发现，在视图层次已经可以不去理解权限，它只需要根据查询结果控制界面就可以了。<br />灵活性：<br />Group和Role，只是一种辅助实现的手段，不是必需的。如果系统的Role很多，逐个授权违背了“简单，方便”的目的，那就引入Group，将权限相同的Role组成一个Group进行集中授权。Role也一样，是某一类Operator的集合，是为了简化针对多个Operator的操作。<br />Role把具体的用户和组从权限中解放出来。一个用户可以承担不同的角色，从而实现授权的灵活性。当然，Group也可以实现类似的功能。但实际业务中，Group划分多以行政组织结构或业务功能划分；如果为了权限管理强行将一个用户加入不同的组，会导致管理的复杂性。<br />Domain的应用。为了授权更灵活，可以将Where或者Scope抽象出来，称之为Domain，真正的授权是在Domain的范围内进行，具体的Resource将分属于不同的Domain。比如：一个新闻机构有国内与国外两大分支，两大分支内又都有不同的资源（体育类、生活类、时事政治类）。假如所有国内新闻的权限规则都是一样的，所有国外新闻的权限规则也相同。则可以建立两个域，分别授权，然后只要将各类新闻与不同的域关联，受域上的权限控制，从而使之简化。<br />权限系统还应该考虑将功能性的授权与资源性的授权分开。很多系统都只有对系统中的数据（资源）的维护有权限控制，但没有对系统功能的权限控制。<br />权限系统最好是可以分层管理而不是集中管理。大多客户希望不同的部门能且仅能管理其部门内部的事务，而不是什么都需要一个集中的Administrator或Administrators组来管理。虽然你可以将不同部门的人都加入Administrators组，但他们的权限过大，可以管理整个系统资源而不是该部门资源。<br />正向授权与负向授权：正向授权在开始时假定主体没有任何权限，然后根据需要授予权限，适合于权限要求严格的系统。负向授权在开始时假定主体有所有权限，然后将某些特殊权限收回。<br />权限计算策略：系统中User，Group，Role都可以授权，权限可以有正负向之分，在计算用户的净权限时定义一套策略。<br />系统中应该有一个集中管理权限的AccessService，负责权限的维护（业务管理员、安全管理模块）与使用（最终用户、各功能模块），该AccessService在实现时要同时考虑一般权限与特殊权限。虽然在具体实现上可以有很多，比如用Proxy模式，但应该使这些Proxy依赖于AccessService。各模块功能中调用AccessService来检查是否有相应的权限。所以说，权限管理不是安全管理模块自己一个人的事情，而是与系统各功能模块都有关系。每个功能模块的开发人员都应该熟悉安全管理模块，当然，也要从业务上熟悉本模块的安全规则。<br />技术实现：<br />1．表单式认证，这是常用的，但用户到达一个不被授权访问的资源时，Web容器就发<br />出一个html页面，要求输入用户名和密码。<br />2．一个基于Servlet Sign in/Sign out来集中处理所有的Request，缺点是必须由应用程序自己来处理。<br />3．用Filter防止用户访问一些未被授权的资源，Filter会截取所有Request/Response，<br />然后放置一个验证通过的标识在用户的Session中，然后Filter每次依靠这个标识来决定是否放行Response。<br />这个模式分为：<br />Gatekeeper ：采取Filter或统一Servlet的方式。<br />Authenticator： 在Web中使用JAAS自己来实现。<br />用户资格存储LDAP或数据库：<br />1. Gatekeeper拦截检查每个到达受保护的资源。首先检查这个用户是否有已经创建<br />好的Login Session，如果没有，Gatekeeper 检查是否有一个全局的和Authenticator相关的session？<br />2. 如果没有全局的session，这个用户被导向到Authenticator的Sign-on 页面，<br />要求提供用户名和密码。<br />3. Authenticator接受用户名和密码，通过用户的资格系统验证用户。<br />4. 如果验证成功，Authenticator将创建一个全局Login session，并且导向Gatekeeper<br />来为这个用户在他的web应用中创建一个Login Session。<br />5. Authenticator和Gatekeepers联合分享Cookie，或者使用Tokens在Query字符里。</p>
		<p>————————————————————————————————————</p>
		<p>权限表及相关内容大体可以用六个表来描述，如下：<br />1 角色（即用户组）表：包括三个字段，ID，角色名，对该角色的描述；<br />2 用户表：包括三个或以上字段，ID，用户名，对该用户的描述，其它（如地址、电话等信息）；<br />3 角色-用户对应表：该表记录用户与角色之间的对应关系，一个用户可以隶属于多个角色，一个角色组也可拥有多个用户。包括三个字段，ID，角色ID，用户ID； <br />4 权限列表：该表记录所有要加以控制的权限，如录入、修改、删除、执行等，也包括三个字段，ID，名称，描述； <br />5 权限-角色对应表：该表记录权限与角色之间的对应关系，一个角色可以拥有多个权限，一个权限也可以隶属多个角色。包括三个字段，ID, 角色ID，权限ID；</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/70375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-09-18 20:48 <a href="http://www.blogjava.net/xzclog/archive/2006/09/18/70375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE开发之常用开源项目介绍</title><link>http://www.blogjava.net/xzclog/archive/2006/09/11/68945.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 11 Sep 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/09/11/68945.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/68945.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/09/11/68945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/68945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/68945.html</trackback:ping><description><![CDATA[
		<div twffan="done">主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发.主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库</div>
		<div twffan="done"> </div>
		<div twffan="done">1持久层:</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">1)Hibernate</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">这个不用介绍了,用的很频繁,用的比较多的是映射,包括继承映射和父子表映射</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">对于DAO在这里介绍个在它基础上开发的包bba96,目前最新版本是bba96 2.0它对Hibernate进行了封装, 查询功能包括执行hsql或者sql查询/更新的方法，如果你要多层次逻辑的条件查询可以自己组装QueryObject.可以参考它做HibernateDAO.也可以直接利用它</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">2) iBATIS</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">另一个ORM工具,没有Hibernate那么集成,自由度比较大,所以使用时普遍性能上比Hibernate要快一些.</div>
		<div twffan="done">2:SpringMVC</div>
		<div twffan="done">
				<span twffan="done">       </span>原理说明和快速入门:</div>
		<div twffan="done">
				<span twffan="done">       </span>配置文件为:</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Spring的配置文件默认为WEB-INF/xxxx-servelet.xm其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。</div>
		<div twffan="done">
				<span twffan="done">       Action</span>分发:</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Spring将按照配置文件定义的URL，Mapping到具体Controller类，再根据URL里的action= xxx或其他参数，利用反射调用Controller里对应的Action方法。</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">输入数据绑定:</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Spring提供Binder 通过名字的一一对应反射绑定Pojo，也可以直接从request.getParameter()取数据。</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">输入数据验证</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Sping 提供了Validator接口当然还可以使用开源的Commons-Validaor支持最好</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Interceptor(拦截器)</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Spring的拦截器提供接口需要自己编写,在这点不如WebWork做的好.全面 </div>
		<div twffan="done">
				<span twffan="done">       (</span>这里提一下WebWork和Struts的区别最主要的区别在于WebWork在建立一个Action时是新New一个对象而Struts是SingleMoule所有的都继承它的一个Action,所以根据项目需要合适的选择.)</div>
		<div twffan="done">3:View层</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">1) 标签库:JSP2.0/JSTL</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">由于Webwork或Spring的标签确实很有限,一般view层用JSTL标签,而且据说JSTL设计很好速度是所有标签中最快的使用起来也很简单</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">2) 富客户端:DOJO Widgets, YUI(YahooUI),FCKEditor, Coolest日历控件</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Dojo主要提供Tree, Tab等富客户端控件,可以用其进行辅助客户端开发</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">YahooUI和DOJO一样它有自己的一套javascript调试控制台,主要支持ajax开发也有很多Tree,Table,Menu等富客户端控件</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">FCKEditor 最流行的文本编辑器</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Coolest日历控件 目前很多日历控件可用,集成在项目中也比较简单,这个只是其中的一个,界面不错的说..</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">3) JavaScript:Prototype.js</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Prototype.js作为javascript的成功的开源框架，封装了很多好用的功能,通过它很容易编写AJAX应用,现在AJAX技术逐渐成熟,框架资源比较丰富,比如YUI,DWR等等,也是因为JavaScript没有合适的调试工具,所以没有必要从零开始编写AJAX应用,个人认为多用一些成熟的Ajax框架实现无刷新更新页面是不错的选择.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">4)表格控件:Display Tag ,Extreme Table</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">这两个的功能差不多,都是View层表格的生成,界面也比较相向,可以导出Excel,Pdf,对Spring支持很容易.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">相比较而言比较推荐ExtremeTable,它的设计很好功能上比DisplayTag多一些,支持Ajax,封装了一些拦截器,而且最方面的是在主页wiki中有详细的中文使用文档.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">5):OSCache</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件,Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统的稳定性和运行性能。</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">它主要用在处理短时间或一定时间内一些数据或页面不会发生变化,或将一些不变的统计报表,缓冲在内存,可以充分的减轻服务器的压力,防治负载平衡,快速重启服务器(通过硬盘缓存).</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">6)SiteMesh</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">sitemesh应用Decorator模式主要用于提高页面的可维护性和复用性，其原理是用Filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer，现在，在sitemesh的帮助下，我们删掉他们轻松达到复合视图模式.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Sitemesh也是<span twffan="done"> OpenSymphony</span>的一个项目现在最近的版本是2.2,目前OpenSymphony自从04年就没有更新的版本了..感觉它还是比较有创新的一种页面组装方式, OpenSymphony开源组织的代码一般写的比较漂亮,可以改其源代码对自己的项目进行适配.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">测试发现Sitemesh还存在一些问题,比如中文问题,它的默认编码是iso-8859-1在使用时候需要做一些改动.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">7)CSS,XHTML</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">这个不用说了,遵循W3C标准的web页面开发.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">8)分页标签: pager-taglib组件</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Pager-taglib 是一套分页标签库，可以灵活地实现多种不同风格的分页导航页面，并且可以很好的与服务器分页逻辑分离.使用起来也比较简单.</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">9)Form: Jodd Form taglib</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Jodd Form taglib使用比较简单,只要把&lt;form&gt;的头尾以&lt;jodd:form bean= "mybean"&gt;包住</div>
		<div twffan="done">就会自动绑定mybean, 自动绑定mybean的所有同名属性到普通html标记input, selectbox, checkbox,radiobox.....在这些input框里不用再写任何代码…</div>
		<div twffan="done">
				<span twffan="done">       </span>
		</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">10)Ajax:DWR</div>
		<div twffan="done">
				<span twffan="done">       J2EE</span>应用最常用的ajax框架</div>
		<div twffan="done">
				<span twffan="done">       </span>
		</div>
		<div twffan="done">
				<span twffan="done">       11)</span>报表 图表</div>
		<div style="MARGIN-LEFT: 21pt" twffan="done">Eclipse BIRT功能比较强大,也很庞大..好几十<span twffan="done">M,一般没有特别需求或别的图表设计软件可以解决的不用它</span></div>
		<div style="TEXT-INDENT: 21pt" twffan="done">JasperReports+ iReport是一个基于Java的开源报表工具，它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">JFreeChart主要是用来制作各种各样的图表，这些图表包括：饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。</div>
		<div twffan="done">
				<span twffan="done">      琴棋报表,国产的..重点推荐,适合中国的情况,开放源代码，使用完全免费。纯JAVA开发，适用多种系统平台。特别适合B/S结构的系统。官方网站有其优点介绍,看来用它还是不错的选择,最重要的是支持国产呵呵</span>
		</div>
		<div twffan="done"> </div>
		<div twffan="done">4:权限控制: Acegi</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Acegi是Spring Framework 下最成熟的安全系统，它提供了强大灵活的企业级安全服务，如完善的认证和授权机制，Http资源访问控制，Method 调用访问控制等等,支持CAS</div>
		<div twffan="done">(耶鲁大学的单点登陆技术,这个单点登陆方案比较出名.我也进行过配置使用,可以根据项目需要,如果用户分布在不同的地方不同的系统通用一套登陆口令可以用它进行解决,一般注册机登陆机就是这样解决的)</div>
		<div twffan="done">
				<span twffan="done">       Acegi</span>只是于Spring结合最好的安全框架,功能比较强大,当然还有一些其他的安全框架,这里列举一些比较流行的是我从网上找到的,使用方法看其官方文档把…</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">JAAS, Seraph, jSai - Servlet Security, Gabriel, JOSSO, Kasai, jPAM, OpenSAML都是些安全控制的框架..真够多的呵呵</div>
		<div twffan="done"> </div>
		<div twffan="done">5:全文检索</div>
		<div twffan="done">
				<span twffan="done">       1) Lucene</span>
		</div>
		<div twffan="done">
				<span twffan="done">       Lucene</span>是一套全文索引接口,可以通过它将数据进行倒排文件处理加入索引文件,它的索引速度和查询速度是相当快的,查询百万级数据毫秒级出结果,现在最火的Apache开源项目,版本更新速度很快现在已经到了2.0,每个版本更新的都比较大,目前用的最多的版本应该是1.4.3,但它有个不太方面的地方单个索引文件有2G文件限制,现在2.0版本没有这个限制,我研究的比较多,它的扩展性比较好,可以很方面的扩充其分词接口和查询接口.</div>
		<div twffan="done">
				<span twffan="done">       </span>基于它的开发的系统很多,比如最常用的Eclipse的搜索功能,还有一些开源的软件比如Compass,Nutch,Lius,还有我最近做的InSearch(企业级FTP文件网页搜索)</div>
		<div twffan="done">6:公共Util类</div>
		<div twffan="done">
				<span twffan="done">       </span>主要是Jakarta-Commons类库,其中最常用得是以下几个类库</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">1) Jakarta-Commons-Language</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">
				<span twffan="done">       </span>最常用得类是StringUtils类,提供了使用的字符串处理的常用方法效率比较高</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">2) Jakarta-Commons-Beantuils</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">
				<span twffan="done">       </span>主要用Beantuils能够获得反射函数封装及对嵌套属性，map,array型属性的读取。</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">3) Jakarta-Commons-Collections</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">
				<span twffan="done">       </span>里面有很多Utils方法</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div twffan="done">7 日志管理</div>
		<div twffan="done">
				<span twffan="done">       Log4J</span>
		</div>
		<div twffan="done">
				<span twffan="done">       </span>任务是日志记录,分为Info,Warn,error几个层次可以更好的调试程序</div>
		<div twffan="done"> </div>
		<div twffan="done">8 开源的J2EE框架</div>
		<div twffan="done">
				<span twffan="done">       1) Appfuse</span>
		</div>
		<div twffan="done">
				<span twffan="done">              Appfuse</span>是Matt Raible 开发的一个指导性的入门级J2EE框架, 它对如何集成流行的Spring、Hibernate、iBatis、Struts、Xdcolet、JUnit等基础框架给出了示范. 在持久层，AppFuse采用了Hibernate O/R映射工具；在容器方面，它采用了Spring,用户可以自由选择Struts、Spring/MVC，Webwork，JSF这几个Web框架。</div>
		<div twffan="done">
				<span twffan="done">       </span>
		</div>
		<div twffan="done">
				<span twffan="done">       2) SpringSide</span>
		</div>
		<div twffan="done">
				<span twffan="done">       .SpringSide</span>较完整的演示了企业应用的各个方面,是一个电子商务网站的应用 SpringSide也大量参考了Appfuse中的优秀经验。最重要的是它是国内的一个开源项目,可以了解到国内现在的一些实际技术动态和方向很有指导意义…</div>
		<div twffan="done"> </div>
		<div twffan="done">9:模版 Template </div>
		<div style="TEXT-INDENT: 21pt" twffan="done">主要有Veloctiy和Freemarker</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">模板用Servlet提供的数据动态地生成 HTML。编译器速度快，输出接近静态HTML<span twffan="done">             </span>页面的速度。</div>
		<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
		<div twffan="done">10:工作流</div>
		<div twffan="done">
				<span twffan="done">       </span>我所知道比较出名的主要有JBpm Shark Osworkflow,由于对它没有过多的研究所以还不是很清楚之间有什么区别.</div>
		<div twffan="done"> </div>
		<div twffan="done">项目管理软件</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">dotProject:是一个基于LAMP的开源项目管理软件。最出名的项目管理软件</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">JIRA: 项目计划，任务安排，错误管理</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">Bugzilla:提交和管理bug,和eclipse集成,可以通过安装MyEclipse配置一下即可使用</div>
		<div style="MARGIN-LEFT: 52.5pt; TEXT-INDENT: -31.5pt" twffan="done">BugFree借鉴微软公司软件研发理念、免费开放源代码、基于Web的精简版Bug管理</div>
		<div style="TEXT-INDENT: 21pt" twffan="done">CVS:这个就不介绍了都在用.</div>
		<div style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -26.25pt" twffan="done">SVN: SubVersion已逐渐超越CVS，更适应于JavaEE的项目。Apache用了它很久后，Sourceforge刚刚推出SVN的支持。</div>
		<div style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -26.25pt" twffan="done">测试用例:主要JUnit单元测试,编写TestCase,Spring也对Junit做了很好的支持</div>
		<div twffan="done"> </div>
		<div twffan="done">后记:</div>
		<div twffan="done">
				<span twffan="done">       </span>以Spring为主的应用开发可选用的组件中间件真是眼花缭乱,所以针对不同的项目需求可以利用不同的开源产品解决,比如用Spring+Hibernate/ iBATIS或Spring+WebWork+Hibernate/ iBATIS或Spring+Struts+Hibernate/ iBATIS,合理的框架设计和代码复用设计对项目开发效率和程序性能有很大的提高,也有利于后期的维护.</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/68945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-09-11 13:41 <a href="http://www.blogjava.net/xzclog/archive/2006/09/11/68945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>