﻿<?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-wadise</title><link>http://www.blogjava.net/wadise/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 14:19:56 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 14:19:56 GMT</pubDate><ttl>60</ttl><item><title>DAO</title><link>http://www.blogjava.net/wadise/archive/2006/06/05/50607.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Mon, 05 Jun 2006 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/06/05/50607.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/50607.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/06/05/50607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/50607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/50607.html</trackback:ping><description><![CDATA[许多Java开发员已经知道DAO模式。这个模式有许多不同的实现，尽管如此，在这篇文章中将阐述DAO实现的设想：<br />1.系统中所有数据库访问都通过DAO来包装<br />2.每个DAO实例代表一个原生的领域对象或实体。如果一个领域对象有一个独立的生命周期，那么它应该有自己的DAO。<br />3.DAO代表在领域对象上的CURD操作。<br />4.DAO允许基于Criteria的查询不同于用主键查询。我比较倾向构造一个finder方法。该finder方法的返回值是一个领域对象组的Collection集合<br />5.DAO不代表处理事务，Sessions或连接。这些在DAO外处理将更加灵活。<br /><br />例子：<br />GenericDao是CRUD操作的DAO基类。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> GenericDao </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T, PK </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> Serializable</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> {<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"> Persist the newInstance object into database </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    PK create(T newInstance);<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"> Retrieve an object that was previously persisted to the database using<br />     *   the indicated id as primary key<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    T read(PK id);<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"> Save changes made to a persistent object.  </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> update(T transientObject);<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"> Remove an object from persistent storage in the database </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> delete(T persistentObject);<br />}</span></div><br /><br />下面是它的实现类：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> GenericDaoHibernateImpl </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T, PK </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> Serializable</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"> GenericDao</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T, PK</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">, FinderExecutor {<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Class</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> type;<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> GenericDaoHibernateImpl(Class</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> type) {<br />        </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.type </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> type;<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> PK create(T o) {<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (PK) getSession().save(o);<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> T read(PK id) {<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (T) getSession().get(type, id);<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> update(T o) {<br />        getSession().update(o);<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> delete(T o) {<br />        getSession().delete(o);<br />    }<br />}</span></div><br /><br />扩展GenericDAO<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> PersonDao </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> GenericDao</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Person, Long</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> {<br />    List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Person</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> findByName(String name);<br />}<br /></span></div><br /><img src ="http://www.blogjava.net/wadise/aggbug/50607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-06-05 23:10 <a href="http://www.blogjava.net/wadise/archive/2006/06/05/50607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Map的简易写法</title><link>http://www.blogjava.net/wadise/archive/2006/06/05/50598.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Mon, 05 Jun 2006 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/06/05/50598.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/50598.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/06/05/50598.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/50598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/50598.html</trackback:ping><description><![CDATA[通常我们在初始化一个Map的时候，都要这样子：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Map test </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> HashMap();<br />test.put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">11</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />test.put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">22</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);</span></div><br />这样就显得有点太繁烦，不像动态语言那么灵活。。但是我们可以这样写：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Map test </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> HashMap() {<br />  {<br />    put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">11</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />    put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">22</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />   }<br />};</span></div><br />Collection同理!<br /><img src ="http://www.blogjava.net/wadise/aggbug/50598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-06-05 22:29 <a href="http://www.blogjava.net/wadise/archive/2006/06/05/50598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpSession二（转载）</title><link>http://www.blogjava.net/wadise/archive/2006/05/09/45274.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Tue, 09 May 2006 12:27:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/05/09/45274.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/45274.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/05/09/45274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/45274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/45274.html</trackback:ping><description><![CDATA[原文：http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770<br /><br />Using Sessions and Session Persistence in Web Applications<a name="deploy-webapp"></a><p><a name="100367"></a>The following sections describe how to set up sessions and session persistence:</p><ul type="square"><p><a name="104397"></a></p><li type="square"><a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#139518">Overview of HTTP Sessions</a><p><a name="139644"></a></p></li><li type="square"><a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100659">Setting Up Session Management</a><p><a name="104409"></a></p></li><li type="square"><a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#139726">Configuring Session Persistence</a><p><a name="104414"></a></p></li><li type="square"><a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770">Using URL Rewriting</a></li></ul><p> </p><hr noshade="noshade" /><p class="head1"><a name="139518"></a>Overview of HTTP Sessions</p><p><a name="139531"></a>Session tracking enables you to track a user's
progress over multiple servlets or HTML pages, which, by nature, are
stateless. A session is defined as a series of related browser requests
that come from the same client during a certain time period. Session
tracking ties together a series of browser requests—think of these
requests as pages—that may have some meaning as a whole, such as a
shopping cart application.</p><p> </p><hr noshade="noshade" /><p class="head1"><a name="100659"></a>Setting Up Session Management <a name="session-management"></a></p><p><a name="100660"></a>WebLogic Server is set up to handle session
tracking by default. You need not set any of these properties to use
session tracking. However, configuring how WebLogic Server manages
sessions is a key part of tuning your application for best performance.
Tuning depends upon factors such as: </p><ul type="square"><p><a name="100661"></a></p><li type="square">How many users you expect to hit the servlet

<p><a name="100662"></a></p></li><li type="square">How many concurrent users hit the servlet 

<p><a name="100663"></a></p></li><li type="square">How long each session lasts 

<p><a name="100664"></a></p></li><li type="square">How much data you expect to store for each user 

<p><a name="139890"></a></p></li><li type="square">Heap size allocated to the WebLogic Server instance.
</li></ul><p class="head2"><a name="100665"></a>HTTP Session Properties<a name="session-props"></a></p><p><a name="100666"></a>You configure WebLogic Server session tracking with properties in the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font>. For instructions on editing the WebLogic-specific deployment descriptor, see <a href="http://e-docs.bea.com/wls/docs70/webapp/webappdeployment.html#1031777">Step 4: Define session parameters</a>.</p><p><a name="100675"></a>For a complete list of session attributes, see <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1037041">jsp-descriptor</a>.</p><p><a name="141907"></a>WebLogic Server 7.0 introduced a change to the
SessionID format that caused some load balancers to lose the ability to
retain session stickiness. </p><p><a name="141908"></a>A new server startup flag,
-Dweblogic.servlet.useExtendedSessionFormat=true , retains the
information that the load-balancing application needs for session
stickiness. The extended session ID format will be part of the URL if
URL rewriting is activated, and the startup flag is set to true.</p><p class="head2"><a name="108118"></a>Session Timeout<a name="session-timeout"></a></p><p><a name="108122"></a>You can specify an interval of time after which
HTTP sessions expire. When a session expires, all data stored in the
session is discarded. You can set the interval in either web.xml or
weblogic.xml:</p><ul type="square"><p><a name="108125"></a></p><li type="square">Set the <font class="code">TimeoutSecs</font> attribute in the<a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1037041">jsp-descriptor</a> of the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml.</font> This value is set in seconds.

<p><a name="108223"></a></p></li><li type="square">Set the &lt;session-timeout&gt;(see <a href="http://e-docs.bea.com/wls/docs70/webapp/web_xml.html#1045373">session-config</a><font class="code">)</font><font class="code">element</font> in the Web Application deployment descriptor, <font class="code">web.xml</font>.
</li></ul><p class="head2"><a name="100676"></a>Configuring Session Cookies<a name="session-cookie"></a></p><p><a name="100677"></a>WebLogic Server uses cookies for session management when supported by the client browser. </p><p><a name="100678"></a>The cookies that WebLogic Server uses to track
sessions are set as transient by default and do not outlive the
session. When a user quits the browser, the cookies are lost and the
session lifetime is regarded as over. This behavior is in the spirit of
session usage and it is recommended that you use sessions in this way. </p><p><a name="109568"></a>You can configure session-tracking attributes of cookies in the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font>. A complete list of session and cookie-related attributes is available <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1037041">jsp-descriptor</a>.</p><p><a name="109573"></a>For instructions on editing the WebLogic-specific deployment descriptor, see <a href="http://e-docs.bea.com/wls/docs70/webapp/webappdeployment.html#1031777">Step 4: Define session parameters</a>.</p><p class="head2"><a name="100688"></a>Using Cookies<a name="long-cookie"></a> That Outlive a Session</p><p><a name="100689"></a>For longer-lived client-side user data, your
application should create and set its own cookies on the browser via
the HTTP servlet API, and should not attempt to use the cookies
associated with the HTTP session. Your application might use cookies to
auto-login a user from a particular machine, in which case you would
set a new cookie to last for a long time. Remember that the cookie can
only be sent from that client machine. Your application should store
data on the server if it must be accessed by the user from multiple
locations.</p><p><a name="100690"></a>You cannot directly connect the age of a
browser cookie with the length of a session. If a cookie expires before
its associated session, that session becomes orphaned. If a session
expires before its associated cookie, the servlet is not be able to
find a session. At that point, a new session is assigned when the <font class="code">request.getSession(true)</font> method is called. You should only make transient use of sessions.</p><p><a name="139898"></a>You can set the maximum life of a cookie with the <font class="code">CookieMaxAgeSecs</font> parameter in the session descriptor of the <font class="code">weblogic.xml</font> deployment descriptor. For more information, see <a href="http://e-docs.bea.com/wls/docs70/webapp/webappdeployment.html#1031777">Step 4: Define session parameters</a></p><p class="head2"><a name="139365"></a>Logging Out and Ending a Session</p><p><a name="139397"></a>User authentication information is stored both
in the user's session data and in the context of a server or virtual
host that is targeted by a Web Application. The <font class="code">session.invalidate()</font>
method, which is often used to log out a user, only invalidates the
current session for a user—the user's authentication information still
remains valid and is stored in the context of the server or virtual
host. If the server or virtual host is hosting only one Web
Application, the <font class="code">session.invalidate() </font>method, in effect, logs out the user. </p><p><a name="139398"></a>There are several Java methods and strategies
you can use when using authentication with multiple Web Applications.
For more information, see <a href="http://e-docs.bea.com/wls/docs70/servlet/progtasks.html#sso">Implementing Single Sign-On</a> in the <em>Programming WebLogic HTTP Servlets</em>,.</p><p> </p><hr noshade="noshade" /><p class="head1"><a name="139726"></a>Configuring Session Persistence<a name="session-persistence"></a></p><p><a name="140566"></a>Use Session Persistence to permanently stored
data from an HTTP session object in order to enable failover and load
balancing across a cluster of WebLogic Servers. When your applications
stores data in an HTTP session object, the data must be serializable.</p><p><a name="139753"></a>There are five different implementations of session persistence: </p><ul type="square"><p><a name="100694"></a></p><li type="square">Memory (single-server, non-replicated) 

<p><a name="100695"></a></p></li><li type="square">File system persistence 

<p><a name="100696"></a></p></li><li type="square">JDBC persistence 

<p><a name="138904"></a></p></li><li type="square">Cookie-based session persistence

<p><a name="100697"></a></p></li><li type="square">In-memory replication (across a cluster) 
</li></ul><p><a name="100699"></a>The first four are discussed here; in-memory replication is discussed in <a href="http://e-docs.bea.com/wls/docs70/cluster/failover.html#1022034">"HTTP Session State Replication,"</a> in <em>Using WebLogic Server Clusters</em>.  </p><p><a name="100700"></a>File, JDBC, Cookie-based, and memory
(single-server, non-populated) session persistence have some common
properties. Each persistence method has its own set of attributes, as
discussed in the following sections.</p><p class="head2"><a name="100701"></a>Common Properties of Session Attributes<a name="common-props"></a></p><p><a name="100702"></a>This section describes attributes common to
file system, memory (single-server, non-replicated), JDBC, and
cookie-based persistence. You can configure the number of sessions that
are held in memory by setting the following properties in the <font class="code">&lt;session-descriptor&gt;</font> element of the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font>. These properties are only applicable if you are using session persistence: </p><dl><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100706"></a><strong><font class="code">CacheSize</font></strong></dd></font></p><dl><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100707"></a>Limits
the number of cached sessions that can be active in memory at any one
time. If you are expecting high volumes of simultaneous active
sessions, you do not want these sessions to soak up the RAM of your
server since this may cause performance problems swapping to and from
virtual memory. When the cache is full, the least recently used
sessions are stored in the persistent store and recalled automatically
when required. If you do not use persistence, this property is ignored,
and there is no soft limit to the number of sessions allowed in main
memory. By default, the number of cached sessions is 1024. The minimum
is 16, and maximum is <em><font class="code">Integer.MAX_VALUE</font></em>. An empty session uses less than 100 bytes, but grows as data is added to it. </dd></font></p></dl><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100708"></a><strong><font class="code">SwapIntervalSecs</font></strong></dd></font></p><dl><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100709"></a>The interval the server waits between purging the least recently used sessions from the cache to the persistent store, when the <font class="code">cacheEntries</font> limit has been reached. </dd></font></p><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100710"></a>If unset, this property defaults to 10 seconds; minimum is 1 second, and maximum is 604800 (1 week). </dd></font></p></dl><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100711"></a><strong><font class="code">InvalidationIntervalSecs</font></strong></dd></font></p><dl><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="107731"></a>Sets
the time, in seconds, that WebLogic Server waits between doing
house-cleaning checks for timed-out and invalid sessions, and deleting
the old sessions and freeing up memory. Set this parameter to a value
less than the value set for the <font class="code">&lt;session-timeout&gt;</font> element. Use this parameter to tune WebLogic Server for best performance on high traffic sites.</dd></font></p><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="100713"></a>The
minimum value is every second (1). The maximum value is once a week
(604,800 seconds). If unset, the parameter defaults to 60 seconds.</dd></font></p><p><font color="#000000" face="Verdana,Geneva,Arial,Helvetica,sans-serif" size="-1"><dd><a name="109632"></a>To set <font class="code">&lt;session-timeout&gt;, see</font> the <a href="http://e-docs.bea.com/wls/docs70/webapp/web_xml.html#1045373">session-config</a> of the Web Application deployment descriptor <font class="code">web.xml</font>. </dd></font></p></dl></dl><p class="head2"><a name="100714"></a>Using Memory-based, Single-server, Non-replicated Persistent Storage<a name="memoy-persistence"></a></p><p><a name="100715"></a>To use memory-based, single-server, non-replicated persistent storage, set the <font class="code">PersistentStoreType</font> property in the <font class="code">&lt;session-descriptor&gt;</font> element of the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font> to <font class="code">memory.</font>
When you use memory-based storage, all session information is stored in
memory and is lost when you stop and restart WebLogic Server.</p><p><a name="139953"></a><strong>Note:	</strong> If you do not allocate sufficient heap size when running WebLogic Server, your server may run out of memory under heavy load.</p><p class="head2"><a name="100716"></a>Using File-based Persistent Storage <a name="file_persistence"></a></p><p><a name="100717"></a>To configure file-based persistent storage for sessions: </p><ol type="1"><li value="1"><a name="100718"></a>Set the <font class="code">PersistentStoreType</font> property in the <font class="code">&lt;session-descriptor&gt;</font> element in the deployment descriptor file  <font class="code">weblogic.xml</font> to <font class="code">file</font>.
</li><li value="2"><a name="107755"></a>Set the directory where WebLogic Server stores the sessions. See <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036948">PersistentStoreDir</a>. <p><a name="107859"></a> If you do not explicitly set a value for this attribute, a temporary directory is created for you by WebLogic Server. </p><p><a name="113930"></a> If you are using file-based persistence in a
cluster, you must explicitly set this attribute to a shared directory
that is accessible to all the servers in a cluster. You must create
this directory yourself.</p></li></ol><p class="head2"><a name="113932"></a>Using a Database for Persistent <a name="jdbc_persistence"></a>Storage (JDBC persistence)</p><p><a name="139756"></a>JDBC persistence stores session data in a
database table using a schema provided for this purpose. You can use
any database for which you have a JDBC driver. You configure database
access by using connection pools.</p><p><a name="113933"></a>To configure JDBC-based persistent storage for sessions: </p><ol type="1"><li value="1"><a name="100724"></a>Set the <font class="code">PersistentStoreType</font> property in the <font class="code">&lt;session-descriptor&gt;</font> element of the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font>, to <font class="code">jdbc.</font></li><li value="2"><a name="100725"></a>Set a JDBC connection pool to be used for persistence storage with the <font class="code">PersistentStorePool</font> property of the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font>. Use the name of a connection pool that is defined in the WebLogic Server Administration Console.  <dl><dt></dt><p class="listpara"><a name="100731"></a>For more details on setting up a database connection pool, see <a href="http://e-docs.bea.com/wls/docs70/adminguide/jdbc.html">Managing JDBC Connectivity</a>.</p></dl></li><li value="3"><a name="100733"></a>Set an ACL for the
connection that corresponds to the users that have permission. For more
details on setting up a database connection, see <a href="http://e-docs.bea.com/wls/docs70/adminguide/jdbc.html">Managing JDBC Connectivity</a>.
</li><li value="4"><a name="140305"></a>Set up a database table named <font class="code">wl_servlet_sessions</font>
for JDBC-based persistence. The connection pool that connects to the
database needs to have read/write access for this table. The following
table shows the Column names and data types you should use when
creating this table.</li></ol><p><a name="140384"></a><strong><div class="tblmargin"><table bordercolorlight="#FFFFFF" bordercolordark="#000000" border="1" cellpadding="3" cellspacing="0"><tbody><tr bgcolor="#cccccc"><th align="left" valign="top"><b><p class="table"><a name="140388"></a><strong>Column name</strong></p></b></th><th align="left" valign="top"><b><p class="table"><a name="140390"></a><strong>Type</strong></p></b></th></tr><tr><td align="left" valign="top"><p class="table"><a name="140392"></a><font class="code">wl_id</font></p></td><td align="left" valign="top"><p class="table"><a name="140394"></a> Variable-width alphanumeric column, up to 100 characters; for example, Oracle <font class="code">VARCHAR2(100)</font>.<br /><em> The primary key must be set as follows:</em></p><p class="table"><a name="140395"></a><font class="code">wl_id + wl_context_path.</font></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140397"></a><font class="code">wl_context_path</font></p></td><td align="left" valign="top"><p class="table"><a name="140399"></a>Variable-width alphanumeric column, up to 100 characters; for example, Oracle <font class="code">VARCHAR2(100)</font>. <em>This column is used as part of the primary key. (See the </em><font class="code">wl_id</font><em>column</em><em> description.)</em></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140401"></a><font class="code">wl_is_new</font></p></td><td align="left" valign="top"><p class="table"><a name="140403"></a>Single char column; for example, Oracle <font class="code">CHAR(1)</font></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140405"></a><font class="code">wl_create_time</font></p></td><td align="left" valign="top"><p class="table"><a name="140407"></a>Numeric column, 20 digits; for example, Oracle <font class="code">NUMBER(20)</font></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140409"></a><font class="code">wl_is_valid</font></p></td><td align="left" valign="top"><p class="table"><a name="140411"></a>Single char column; for example, Oracle <font class="code">CHAR(1)</font></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140413"></a><font class="code">wl_session_values</font></p></td><td align="left" valign="top"><p class="table"><a name="140415"></a>Large binary column; for example, Oracle <font class="code">LONG RAW</font></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140417"></a><font class="code">wl_access_time</font></p></td><td align="left" valign="top"><p class="table"><a name="140419"></a>Numeric column, 20 digits; for example, <font class="code">NUMBER(20)</font></p></td></tr><tr><td align="left" valign="top"><p class="table"><a name="140421"></a><font class="code">wl_max_inactive_interval</font></p></td><td align="left" valign="top"><p class="table"><a name="140423"></a>Integer column; for example, Oracle <font class="code">Integer</font>.
Number of seconds between client requests before the session is
invalidated. A negative time value indicates that the session should
never timeout.</p></td></tr></tbody></table></div></strong></p><p><a name="140345"></a>If you are using an Oracle DBMS, use the following SQL statement to create the <font class="code">wl_servlet_sessions</font> table:</p><blockquote><pre><font color="#000000" face="Courier"><a name="119416"></a>create table wl_servlet_sessions<br />  ( wl_id VARCHAR2(100) NOT NULL,<br />    wl_context_path VARCHAR2(100) NOT NULL,<br />    wl_is_new CHAR(1),<br />    wl_create_time NUMBER(20),<br />    wl_is_valid CHAR(1),<br />    wl_session_values LONG RAW,<br />    wl_access_time NUMBER(20),<br />    wl_max_inactive_interval INTEGER,<br />   PRIMARY KEY (wl_id, wl_context_path) ); <br /></font></pre></blockquote><p><a name="141957"></a>If you are using SqlServer2000, use the following SQL statement to create the <font class="code">wl_servlet_sessions</font> table:</p><blockquote><pre><font color="#000000" face="Courier"><a name="141958"></a>create table wl_servlet_sessions<br />  ( wl_id VARCHAR2(100) NOT NULL,<br />    wl_context_path VARCHAR2(100) NOT NULL,<br />    wl_is_new VARCHAR(1),<br />    wl_create_time DeCIMAL,<br />    wl_is_valid VARCHAR(1),<br />    wl_session_values IMAGE,<br />    wl_access_time DECIMAL,<br />    wl_max_inactive_interval INTEGER,<br />   PRIMARY KEY (wl_id, wl_context_path) ); <br /></font></pre></blockquote><p><a name="119429"></a>Modify one of the preceeding SQL statements for use with your DBMS.</p><p><a name="119417"></a><strong>Note:	</strong> You can configure a
maximum duration that JDBC session persistence should wait for a JDBC
connection from the connection pool before failing to load the session
data with the <font class="code">JDBCConnectionTimeoutSecs</font> attribute. For more information, see <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1037016">JDBCConnectionTimeoutSecs</a>.</p><p class="head2"><a name="138913"></a>Using Cookie-Based Session Persistence</p><p><a name="138914"></a>Cookie-based session persistence provides a
stateless solution for session persistence by storing all session data
in a cookie that is stored in the user's browser. Cookie-based session
persistence is most useful when you do not need to store large amounts
of data in the session. Cookie-based session persistence can make
managing your WebLogic Server installation easier because clustering
failover logic is not required. Because the session is stored in the
browser, not on the server, you can start and stop WebLogic Servers
without losing sessions.</p><p><a name="138928"></a>There are some limitations to cookie-based session persistence:</p><ul type="square"><p><a name="138949"></a></p><li type="square">You can store only string attributes in the session. If you store any other type of object in the session, an <font class="code">IllegalArgument</font> exception is thrown.

<p><a name="138968"></a></p></li><li type="square">You cannot flush the HTTP response (because the cookie must be written to the header data <em>before</em> the response is committed).

<p><a name="139155"></a></p></li><li type="square">If the content
length of the response exceeds the buffer size, the response is
automatically flushed and the session data cannot be updated in the
cookie. (The buffer size is, by default, 8192 bytes. You can change the
buffer size with the <font class="code">javax.servlet.ServletResponse.setBufferSize()</font> method.

<p><a name="138985"></a></p></li><li type="square">You can only use basic (browser-based) authentication.

<p><a name="139186"></a></p></li><li type="square">Session data is sent to the browser in clear text.

<p><a name="139191"></a></p></li><li type="square">The user's browser must be configured to accept cookies.

<p><a name="141838"></a></p></li><li type="square">You cannot use commas (,) in a string when using cookie-based session persistence or an exception occurs.
</li></ul><p><a name="138990"></a>To set up cookie-based session persistence:</p><ol type="1"><li value="1"><a name="139001"></a>In the <font class="code">&lt;session-descriptor&gt;</font> element of <font class="code">weblogic.xml</font>, set the <font class="code">PersistentStoreType</font> parameter to <font class="code">cookie.</font></li><li value="2"><a name="139037"></a>Optionally, set a name for the cookie using the <font class="code">PersistentStoreCookieName</font> parameter. The default is <font class="code">WLCOOKIE</font>.</li></ol><p> </p><hr noshade="noshade" /><p class="head1"><a name="100770"></a><a name="urlrewriting"></a>Using URL Rewriting<a name="url-rewriting"></a></p><p><a name="100771"></a>In some situations, a browser or wireless
device may not accept cookies, which makes session tracking using
cookies impossible. URL rewriting is a solution to this situation that
can be substituted automatically when WebLogic Server detects that the
browser does not accept cookies. URL rewriting involves encoding the
session ID into the hyper-links on the Web pages that your servlet
sends back to the browser. When the user subsequently clicks these
links, WebLogic Server extracts the ID from the URL address and finds
the appropriate <font class="code">HttpSession</font> when your servlet calls the <font class="code">getSession()</font> method. </p><p><a name="100773"></a>Enable URL rewriting in WebLogic Server by setting the <font class="code">URLRewritingEnabled</font> attribute in the WebLogic-specific deployment descriptor, <font class="code">weblogic.xml</font>, under the <font class="code">&lt;session-descriptor&gt;</font> element.<font class="code"></font>The default value for this attribute is <font class="code">true</font>. See <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1037027">URLRewritingEnabled</a>. </p><p class="head2"><a name="100777"></a>Coding Guidelines for URL Rewriting</p><p><a name="123231"></a>There are some general guidelines for how your code should handle URLs in order to support URL rewriting. </p><ul type="square"><p><a name="123247"></a></p><li type="square">Avoid writing a URL straight to the output stream, as shown here: 

<blockquote><pre><font color="#000000" face="Courier"><a name="100778"></a>out.println("&lt;a href=\"/myshop/catalog.jsp\"&gt;catalog&lt;/a&gt;");</font></pre></blockquote><dl><dt></dt><p class="listpara"><a name="100779"></a>Instead, use the <font class="code">HttpServletResponse.encodeURL()</font> method, for example:</p><blockquote><pre><font color="#000000" face="Courier"><a name="100780"></a>out.println("&lt;a href=\""<br />     + response.encodeURL("myshop/catalog.jsp") <br />     + "\"&gt;catalog&lt;/a&gt;");</font></pre></blockquote><dt></dt><p class="listpara"><a name="100781"></a>Calling the <font class="code">encodeURL()</font>
method determines if the URL needs to be rewritten, and if so, it
rewrites it by including the session ID in the URL. The session ID is
appended to the URL and begins with a semicolon.</p></dl><p><a name="100782"></a></p></li><li type="square">In addition to URLs that are returned as a response to WebLogic Server, also encode URLs that send redirects. For example: 

<blockquote><pre><font color="#000000" face="Courier"><a name="100783"></a>if (session.isNew())<br />  response.sendRedirect (response.encodeRedirectUrl(welcomeURL));  </font></pre></blockquote><dl><dt></dt><p class="listpara"><a name="100784"></a>WebLogic
Server uses URL rewriting when a session is new, even if the browser
does accept cookies, because the server cannot tell whether a browser
accepts cookies in the first visit of a session. </p></dl><p><a name="109664"></a></p></li><li type="square">Your servlet can determine whether a given session ID was received from a cookie by checking the Boolean returned from the <font class="code">HttpServletRequest.isRequestedSessionIdFromCookie()</font> method. Your application may respond appropriately, or simply rely on URL rewriting by WebLogic Server.
</li></ul><p class="head2"><a name="109666"></a>URL Rewriting and Wireless Access Protocol (WAP) <a name="wap"></a></p><p><a name="139999"></a>If you are writing a WAP application, you must
use URL rewriting because the WAP protocol does not support cookies. In
addition, some WAP devices have a 128-character limit on the length of
a URL (including parameters), which limits the amount of data that can
be transmitted using URL rewriting. To allow more space for parameters,
you can limit the size of the session ID that is randomly generated by
WebLogic Server. See <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036988">IDLength</a>.</p><img src ="http://www.blogjava.net/wadise/aggbug/45274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-05-09 20:27 <a href="http://www.blogjava.net/wadise/archive/2006/05/09/45274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpSession一（转载）</title><link>http://www.blogjava.net/wadise/archive/2006/05/09/45273.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Tue, 09 May 2006 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/05/09/45273.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/45273.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/05/09/45273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/45273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/45273.html</trackback:ping><description><![CDATA[原文：http://www.javaresearch.org/article/showarticle.jsp?column=106&amp;thread=45120<br /><br />摘要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一技术。
本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。<br /><br />目录：<br />一、术语session<br />二、HTTP协议与状态保持<br />三、理解cookie机制<br />四、理解session机制<br />五、理解javax.servlet.http.HttpSession<br />六、HttpSession常见问题<br />七、跨应用程序的session共享<br />八、总结<br />参考文档<br /><br />一、术语session<br />在我的经验里，session这个词被滥用的程度大概仅次于transaction，更加有趣的是transaction与session在某些语境下的含义是相同的。<br /><br />session，
中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个
 session。有时候我们可以看到这样的话“在一个浏览器会话期间，...”，这里的会话一词用的就是其本义，是指从一个浏览器窗口打开到关闭这个期
间 ①。最混乱的是“用户（客户端）在一次会话期间”这样一句话，它可能指用户的一系列动作（一般情况下是同某个具体目的相关的一系列动作，比如从登录到
选购商品到结账登出这样一个网上购物的过程，有时候也被称为一个transaction），然而有时候也可能仅仅是指一次连接，也有可能是指含义①，其中
的差别只能靠上下文来推断②。<br /><br />然而当session一词与网络协议相关联时，它又往往隐含了“面向连接”和/或“保持状态”这样两个含
义， “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道，比如打电话，直到对方接了电话通信才能开始，与此相对的是写信，在你把信发出去的
时候你并不能确认对方的地址是否正确，通信渠道不一定能建立，但对发信人来说，通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起
来，使得消息之间可以互相依赖，比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个
TCP session”或者 “一个POP3 session”③。<br /><br />而到了web服务器蓬勃发展的时代，session在web开发语
境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构，如
“把xxx保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持，所以在某种特定语言的语境下，
session也被用来指代该语言的解决方案，比如经常把Java里提供的javax.servlet.http.HttpSession简称为
session⑥。<br /><br />鉴于这种混乱已不可改变，本文中session一词的运用也会根据上下文有不同的含义，请大家注意分辨。<br />在本文中，使用中文“浏览器会话期间”来表达含义①，使用“session机制”来表达含义④，使用“session”表达含义⑤，使用具体的“HttpSession”来表达含义⑥<br /><br />二、HTTP协议与状态保持<br />HTTP 
协议本身是无状态的，这与HTTP协议本来的目的是相符的，客户端只需要简单的向服务器请求下载某些文件，无论是客户端还是服务器都没有必要纪录彼此过去
的行为，每一次请求之间都是独立的，好比一个顾客和一个自动售货机或者一个普通的（非会员制）大卖场之间的关系一样。<br /><br />然而聪明（或者贪
心？）的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用，就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加
了表单、脚本、DOM等客户端行为，另一方面在服务器端则出现了CGI规范以响应客户端的动态请求，作为传输载体的HTTP协议也添加了文件上载、
 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户
端与服务器之间保持状态的解决方案。<br /><br />让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠，然而一次性消费5杯咖啡的机会微乎其微，这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案：<br />1、该店的店员很厉害，能记住每位顾客的消费数量，只要顾客一走进咖啡店，店员就知道该怎么对待了。这种做法就是协议本身支持状态。<br />2、发给顾客一张卡片，上面记录着消费的数量，一般还有个有效期限。每次消费时，如果顾客出示这张卡片，则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。<br />3、发给顾客一张会员卡，除了卡号之外什么信息也不纪录，每次消费时，如果顾客出示该卡片，则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。<br /><br />由
于HTTP协议是无状态的，而出于种种考虑也不希望使之成为有状态的，因此，后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保
持状态的方案，而session机制采用的是在服务器端保持状态的方案。同时我们也看到，由于采用服务器端保持状态的方案在客户端也需要保存一个标识，所
以session机制可能需要借助于cookie机制来达到保存标识的目的，但实际上它还有其他选择。<br /><br />三、理解cookie机制 <br />cookie机制的基本原理就如上面的例子一样简单，但是还有几个问题需要解决：“会员卡”如何分发；“会员卡”的内容；以及客户如何使用“会员卡”。<br /><br />正统的cookie分发是通过扩展HTTP协议来实现的，服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。<br /><br />而cookie 
的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie，如果某个cookie所声明的作用范围大于等于将要请求的
资源所在的位置，则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示，如果某家分店还发行了自
己的会员卡，那么进这家店的时候除了要出示麦当劳的会员卡，还要出示这家店的会员卡。<br /><br />cookie的内容主要包括：名字，值，过期时间，路径和域。<br />其中域可以指定某一个域比如.google.com，相当于总店招牌，比如宝洁公司，也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com，可以用飘柔来做比。<br />路径就是跟在域名后面的URL路径，比如/或者/foo等等，可以用某飘柔专柜做比。<br />路径与域合在一起就构成了cookie的作用范围。<br />如
果不设置过期时间，则表示这个cookie的生命期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览器会话期的
 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里，当然这种行为并不是规范规定的。如果设置了过期时间，浏览
器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie仍然有效直到超过设定的过期时间。<br /><br />存储在硬盘上的
cookie 可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存里的cookie，不同的浏览器有不同的处理方式。对于IE，在一个打
开的窗口上按 Ctrl-N（或者从文件菜单）打开的窗口可以与原窗口共享，而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie；
对于 Mozilla Firefox0.8，所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的
window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用
session机制的web应用程序开发者造成很大的困扰。<br /><br />下面就是一个goolge设置cookie的响应头的例子<br />HTTP/1.1 302 Found<br />Location: <a href="http://www.google.com/intl/zh-CN/">http://www.google.com/intl/zh-CN/</a><br />Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com<br />Content-Type: text/html<br /><br /><br /><br /><br />这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分<br /><br /><br /><br /><br />浏览器在再次访问goolge的资源时自动向外发送cookie<br /><br /><br /><br /><br />使用Firefox可以很容易的观察现有的cookie的值<br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。<br /><br /><br /><br /><br />IE也可以设置在接受cookie前询问<br /><br /><br /><br /><br />这是一个询问接受cookie的对话框。<br /><br />四、理解session机制<br />session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构（也可能就是使用散列表）来保存信息。<br /><br />当
程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为
 session id，如果已包含一个session id则说明以前已经为此客户端创建过session，服务器就按照session id把这个
 session检索出来使用（如果检索不到，可能会新建一个），如果客户端请求不包含session id，则为此客户端创建一个session并且生
成一个与此session相关联的session id，session id的值应该是一个既不会重复，又不容易被找到规律以仿造的字符串，这个
 session id将被在本次响应中返回给客户端保存。<br /><br />保存这个session id的方式可以采用cookie，这样在交互过程中
浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID，而。比如weblogic对于web应用
程序生成的cookie，JSESSIONID=
 ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764，它的名字就是
 JSESSIONID。<br /><br />由于cookie可以被人为的禁止，必须有其他机制以便在cookie被禁止时仍然能够把session id
传递回服务器。经常被使用的一种技术叫做URL重写，就是把session id直接附加在URL路径的后面，附加方式也有两种，一种是作为URL路径的
附加信息，表现形式为<a href="http://...../xxx;jsessionid=">http://...../xxx;jsessionid=</a> ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />另一种是作为查询字符串附加在URL后面，表现形式为<a href="http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng%21-145788764">http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764</a><br />这两种方式对于用户来说是没有区别的，只是服务器在解析的时候处理的方式不同，采用第一种方式也有利于把session id的信息和正常程序参数区分开来。<br />为了在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session id。<br /><br />另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session id传递回服务器。比如下面的表单<br />&lt;form name="testform" action="/xxx"&gt;<br />&lt;input type="text"&gt;<br />&lt;/form&gt;<br />在被传递给客户端之前将被改写成<br />&lt;form name="testform" action="/xxx"&gt;<br />&lt;input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"&gt;<br />&lt;input type="text"&gt;<br />&lt;/form&gt;<br />这种技术现在已较少应用，笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。<br />实际上这种技术可以简单的用对action应用URL重写来代替。<br /><br />在
谈论session机制的时候，常常听到这样一种误解“只要关闭浏览器，session就消失了”。其实可以想象一下会员卡的例子，除非顾客主动对店家提
出销卡，否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的，除非程序通知服务器删除一个session，否则服务器会一直保留，程序
一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭，因此服务器根本不会有机会
知道浏览器已经关闭，之所以会有这种错觉，是大部分session机制都使用会话cookie来保存session id，而关闭浏览器后这个
 session id就消失了，再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改
写浏览器发出的HTTP请求头，把原来的session id发送给服务器，则再次打开浏览器仍然能够找到原来的session。<br /><br />恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为seesion设置了一个失效时间，当距离客户端上一次使用session的时间超过这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。<br /><br />五、理解javax.servlet.http.HttpSession<br />HttpSession是Java平台对session机制的实现规范，因为它仅仅是个接口，具体到每个web应用服务器的提供商，除了对规范支持之外，仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。<br /><br />首
先，Weblogic Server提供了一系列的参数来控制它的HttpSession的实现，包括使用cookie的开关选项，使用URL重写的开关
选项，session持久化的设置，session失效时间的设置，以及针对cookie的各种设置，比如设置cookie的名字、路径、域，
 cookie的生存时间等。<br /><br />一般情况下，session都是存储在内存里，当服务器进程被停止或者重启的时候，内存里的session
也会被清空，如果设置了session的持久化特性，服务器就会把session保存到硬盘上，当服务器进程重新启动或这些信息将能够被再次使用，
 Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。<br /><br />复制严格说来不算持久化保存，因为session实际上还是保存在内存里，不过同样的信息被复制到各个cluster内的服务器进程中，这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。<br /><br />cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。<br /><br />cookie的路径对于web应用程序来说是一个非常重要的选项，Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。<br /><br />关于session的设置参考[5] <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869">http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869</a><br /><br />六、HttpSession常见问题<br />（在本小节中session的含义为⑤和⑥的混合）<br /><br /><br />1、session在何时被创建<br />一
个常见的误解是以为session在有客户端访问时就被创建，然而事实是直到某server端程序调用
 HttpServletRequest.getSession(true)这样的语句时才被创建，注意如果JSP没有显示的使用 &lt;%
 @page session="false"%&gt; 关闭session，则JSP文件在编译成Servlet时将会自动加上这样一条语句
 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的
 session对象的来历。<br /><br />由于session会消耗内存资源，因此，如果不打算使用session，应该在所有的JSP中关闭它。<br /><br />2、session何时被删除<br />综合前面的讨论，session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止（非持久session）<br /><br />3、如何做到在浏览器关闭时删除session<br />严格的讲，做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作，然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。<br /><br />4、有个HttpSessionListener是怎么回事<br />你
可以创建这样的listener去监控session的创建和销毁事件，使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销
毁动作触发listener，而不是相反。类似的与HttpSession有关的listener还有
 HttpSessionBindingListener，HttpSessionActivationListener和
 HttpSessionAttributeListener。<br /><br />5、存放在session中的对象必须是可序列化的吗<br />不是必需
的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在
 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果
 session中有不可序列化的对象，在session销毁时会有一个Exception，很奇怪。<br /><br />6、如何才能正确的应付客户端禁止cookie的可能性<br />对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL，具体做法参见[6]<br /><a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770">http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770</a><br /><br />7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session<br />参见第三小节对cookie的讨论，对session来说是只认id不认人，因此不同的浏览器，不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。<br /><br />8、如何防止用户打开两个浏览器窗口操作导致的session混乱<br />这
个问题与防止表单多次提交是类似的，可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端，同时保存在session里，客
户端提交表单时必须把这个id也返回服务器，程序首先比较返回的id与保存在session里的值是否一致，如果不一致则说明本次操作已经被提交过了。可
以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口，一般不设置这个id，
或者使用单独的id，以防主窗口无法操作，建议不要再window.open打开的窗口里做修改操作，这样就可以不用设置。<br /><br />9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue<br />做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变，需要向其他服务器进程复制新的session值。<br /><br />10、为什么session不见了<br />排
除session正常失效的因素之外，服务器本身的可能性应该是微乎其微的，虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到
过；浏览器插件的可能性次之，笔者也遇到过3721插件造成的问题；理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。<br />出现这一问题的大部分原因都是程序的错误，最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。<br /><br />七、跨应用程序的session共享<br /><br />常
常有这样的情况，一个大项目被分割成若干小项目开发，为了能够互不干扰，要求每个小项目作为一个单独的web应用程序开发，可是到了最后突然发现某几个小
项目之间需要共享一些信息，或者想使用session来实现SSO(single sign on)，在session中保存login的用户信息，最自
然的要求是应用程序间能够访问彼此的session。<br /><br />然而按照Servlet规范，session的作用范围应该仅仅限于当前应用程序
下，不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范，但是实现的细节却可能各有不同，因此解决
跨应用程序session共享的方法也各不相同。<br /><br />首先来看一下Tomcat是如何实现web应用程序之间session的隔离的，从
 Tomcat设置的cookie路径来看，它对不同的应用程序设置的cookie路径是不同的，这样不同的应用程序所用的session id是不同
的，因此即使在同一个浏览器窗口里访问不同的应用程序，发送给服务器的session id也可以是不同的。<br /><br /><br />  <br /><br />根据这个特性，我们可以推测Tomcat中session的内存结构大致如下。<br /><br /><br /><br /><br />笔
者以前用过的iPlanet也采用的是同样的方式，估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器，解决的思路很简单，实
际实行起来也不难。要么让所有的应用程序共享一个session id，要么让应用程序能够获得其他应用程序的session id。<br /><br />iPlanet中有一种很简单的方法来实现共享一个session id，那就是把各个应用程序的cookie路径都设为/（实际上应该是/NASApp，对于应用程序来讲它的作用相当于根）。<br />&lt;session-info&gt;<br />&lt;path&gt;/NASApp&lt;/path&gt;<br />&lt;/session-info&gt;<br /><br />需
要注意的是，操作共享的session应该遵循一些编程约定，比如在session attribute名字的前面加上应用程序的前缀，使得
 setAttribute("name", "neo")变成setAttribute("app1.name", "neo")，以防止命名空间冲
突，导致互相覆盖。<br /><br /><br />在Tomcat中则没有这么方便的选择。在Tomcat版本3上，我们还可以有一些手段来共享
session。对于版本4以上的Tomcat，目前笔者尚未发现简单的办法。只能借助于第三方的力量，比如使用文件、数据库、JMS或者客户端
cookie，URL参数或者隐藏字段等手段。<br /><br />我们再看一下Weblogic Server是如何处理session的。<br /><br /><br />  <br /><br />从
截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/，这是不是意味着在Weblogic Server中
默认的就可以共享session了呢？然而一个小实验即可证明即使不同的应用程序使用的是同一个session，各个应用程序仍然只能访问自己所设置的那
些属性。这说明Weblogic Server中的session的内存结构可能如下<br /><br /><br /><br /><br />对于这样一种结构，在
 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量，比如使用文件、数据库、JMS或者客户端
 cookie，URL参数或者隐藏字段等手段，还有一种较为方便的做法，就是把一个应用程序的session放到ServletContext中，这样
另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下，<br /><br />应用程序A<br />context.setAttribute("appA", session); <br /><br />应用程序B<br />contextA = context.getContext("/appA");<br />HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); <br /><br />值得注意的是这种用法不可移植，因为根据ServletContext的JavaDoc，应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值，以上做法在Weblogic Server 8.1中通过。<br /><br />那
么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢？原来是为了SSO，凡是共享这个session的应用程序都可
以共享认证的信息。一个简单的实验就可以证明这一点，修改首先登录的那个应用程序的描述符weblogic.xml，把cookie路径修改为
/appA 访问另外一个应用程序会重新要求登录，即使是反过来，先访问cookie路径为/的应用程序，再访问修改过路径的这个，虽然不再提示登录，但
是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM，因为浏览器和web服务器对basic认证方式有其他的处理方式，第二次请求的认
证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization，你可以修改所附的示例程序来做这些试验。<br /><br />八、总结<br />session机制本身并不复杂，然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器，服务器的经验当作普遍适用的经验，而是始终需要具体情况具体分析。<br />摘
要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一技术。本
文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。<img src ="http://www.blogjava.net/wadise/aggbug/45273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-05-09 20:26 <a href="http://www.blogjava.net/wadise/archive/2006/05/09/45273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MSNP9协议分析(转载)</title><link>http://www.blogjava.net/wadise/archive/2006/04/23/42638.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Sun, 23 Apr 2006 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/04/23/42638.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/42638.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/04/23/42638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/42638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/42638.html</trackback:ping><description><![CDATA[
		<p align="center">
				<b>MSNP9协议分析</b>
		</p>
		<p>MSN Messenger协议</p>
		<p align="center">原作：bhw98</p>
		<p class="H2">前 言</p>
		<p>MSN Messenger 是Microsoft开发的聊天工具，目前在国内拥有很大的用户群。使用MSN 
            Messenger可以与他人进行文字聊天，语音对话，视频会议等即时交流，还可以通过此软件来查看联系人是否联机等。该软件的最新版本是6.1。</p>
		<p>1999年，Microsoft向IETF提交了一份"MSN Messenger Service 1.0 
            Protocol"草案，这是最初版本的MSN Messenger协议。在以后几年，该公司不再公开有关MSN 
            Messenger协议的升级、修改细节的官方文档。但无论是开发第三方的聊天客户端软件(如Gaim, 
            MyIM等)，还是做协议分析，必须对其通信协议有深入了解。正因为如此，有一些民间人士对这些协议开展了研究(见本文的"<a href="http://www.linuxboy.net/msnqq/003.html#source">相关资源</a>"一节)。</p>
		<p>当我们还在感叹"这世界，变化快"的时候，MSN Messenger的协议已经到了第10版，简称MSNP10，对应于MSN 
            Messenger 6.1。MSN Messenger 6.0则使用MSNP9。现在Microsoft强迫MSN 
            Messenger用户升级到6.0或6.1版，因为服务器对MSNP8以下的版本不再支持。本文及后续文章所描述的MSN 
            Messenger协议主要针对MSNP9/MSNP10。</p>
		<p class="H2">1. 连 接</p>
		<p>MSN 
            Messenger协议建立在TCP/IP之上。除了文件传输和语音聊天是直接的"点对点"通信之外，其它所有的情形全部通过服务器进行。</p>
		<p>在逻辑上，一共有三种类型的服务器，各司其职：</p>
		<table cellpadding="0" cellspacing="0">
				<tbody>
						<tr>
								<td class="ma" width="398">
								</td>
						</tr>
				</tbody>
				<li>
						<b>派遣服务器(Dispatch Server, DS)</b> - 
            客户端最初连接的服务器。负责给客户端分配合适的通知服务器。域名是messenger.hotmail.com，标准服务端口是1863。完成派遣任务后，切断TCP连接。 

            </li>
				<li>
						<b>通知服务器(Notification Server, NS)</b> - 
            客户端需要一直保持连接的服务器。很多任务要在这个会话内完成，包括登录、改变状态、获取用户列表、修改用户信息、发起聊天、接受呼叫、邮件通知、退出等等。服务端口由派遣服务器指定，通常也是1863。 

            </li>
				<li>
						<b>接线服务器(Switchboard Server, SS)</b> - 
            客户端之间聊天使用的中转服务器。每开一个聊天窗口，客户端和服务器就建立一个TCP会话。当客户端之间需要进行文件传输或语音聊天时，发送系统消息，建立"点对点"会话通道(可能转为使用UDP)。服务端口通常也是1863。"点对点" 
            通信使用的端口由客户端自动协商决定，如文件传输通常使用6891端口。 
            <p>2. 命 令</p><p>MSN Messenger命令使用纯ASCII码。对非ASCII码字符使用URL编码。命令的语法是</p><pre>XXX[&lt;SP&gt;TrID&lt;SP&gt;PARAM1&lt;SP&gt;PARAM2…]&lt;CRLF&gt;</pre><p>其中，&lt;SP&gt;是空白字符，&lt;CRLF&gt;是回车换行，XXX是一个3字符的命令串，TrID是一个流水号，PARAMx是参数，[ 
            ]内是可选项。最简单的命令没有流水号和参数。为了方便起见，下面讨论时用" 
            "代表&lt;SP&gt;，"\r\n"代表&lt;CRLF&gt;，"\x??"代表一个值为0x??字节。红色表示由客户端发出，蓝色表示由服务器发出。一个MSN 
            Messenger命令的例子如下：</p><pre><span class="样式1">USR 18 TWN I example@hotmail.com</span>\r\n</pre><p class="H2">3. 错 误</p><p>无论是由于客户端发出的命令无效，参数无效，还是其他什么原因，服务器可以返回一个错误。格式为</p><pre>XXX[&lt;SP&gt;TrID]&lt;CRLF&gt;</pre><p>其中，XXX是一个3位数字的串。如</p><pre><span class="样式1">ADD 21 AL non_existent@passport.com non_existent@passport.com\r\n</span><br /><span class="样式3">205 21</span>\r\n</pre><p>上例中，non_existent@passport.com是一个不存在的账号。</p><p class="H2">4. 消 息</p><p>MSN Messenger消息符合MIME 
            1.0标准，由消息头与消息体组成。通常使用UTF-8编码，消息头中也需要URL编码格式，消息体则直接用二进制数据。</p><p>一个MSN Messenger消息的例子如下：</p><pre>MIME-Version: 1.0\r\n<br />Content-Type: text/plain; charset=UTF-8\r\n<br />X-MMS-IM-Format: FN=%E5%AE%8B%E4%BD%93; EF=; CO=0; CS=86; PF=0\r\n<br />\r\n<br />bhw98\xE4\xBD\xA0\xE5\xA5\xBD\xEF\xBC\x81</pre><p>经简单分析可知，"%E5%AE%8B%E4%BD%93"是"宋体"的UTF-8加URL编码，而"bhw98\xE4\xBD\xA0\xE5\xA5\xBD\xEF\xBC\x81"是"bhw98你好！"的UTF-8编码。</p><h3>命令一览</h3></li>
				<li>
						<table align="center" bgcolor="#ffffff" border="1" cellpadding="4" cellspacing="1" width="100%">
								<tbody>
										<tr>
												<td class="head">命令
                </td>
												<td class="head">来源
                </td>
												<td class="head">去向
                </td>
												<td class="head">说明
                </td>
												<td class="head">备注</td>
										</tr>
										<tr>
												<td>ACK
                </td>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>确认，做出肯定回答。
                </td>
												<td>acknowledgement</td>
										</tr>
										<tr>
												<td rowspan="2">ADD
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出添加新联系人到列表的请求。
                </td>
												<td rowspan="2">add user</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回添加新联系人请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">ADG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出添加新联系人组请求。
                </td>
												<td rowspan="2">add group</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回添加新联系人组请求的应答。</td>
										</tr>
										<tr>
												<td>ANS
                </td>
												<td>Client
                </td>
												<td>SS
                </td>
												<td>接受聊天连接请求。
                </td>
												<td>answer</td>
										</tr>
										<tr>
												<td rowspan="2">BLP
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>设置对尚未列入明确允许/禁止的联系人列表的保密策略。
                </td>
												<td rowspan="2">block list privacy</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回设置保密策略请求的应答。</td>
										</tr>
										<tr>
												<td>BYE
                </td>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>通知客户端结束会话。
                </td>
												<td>bye</td>
										</tr>
										<tr>
												<td rowspan="2">CAL
                </td>
												<td>Client
                </td>
												<td>SS
                </td>
												<td>发出建立聊天连接的请求。
                </td>
												<td rowspan="2">call</td>
										</tr>
										<tr>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>返回建立聊天连接请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">CHG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出改变状态的请求。
                </td>
												<td rowspan="2">change state</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回改变状态的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">CHL
                </td>
												<td>NS
                </td>
												<td>Client
                </td>
												<td rowspan="2">服务器发出验证要求。
                </td>
												<td rowspan="2">challenge</td>
										</tr>
										<tr>
												<td>SS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td rowspan="4">CVR
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td rowspan="2">发出客户端的OS、语言、MSN Messenger版本等信息。
                </td>
												<td rowspan="4">client version</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>SS</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td rowspan="2">返回推荐的MSN Messenger版本、升级软件需要的下载地址等信息。</td>
										</tr>
										<tr>
												<td>SS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td>FLN
                </td>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>通知有联系人列表中的用户下线。
                </td>
												<td>off-line</td>
										</tr>
										<tr>
												<td rowspan="2">GTC
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>设置当有联系人列表中的用户状态改变时给出的提示。
                </td>
												<td rowspan="2">greeting to changes?</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回设置请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="4">INF
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td rowspan="2">询问服务器所支持的认证方式。
                </td>
												<td rowspan="4">information?</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>SS</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td rowspan="2">返回服务器所支持的认证方式。</td>
										</tr>
										<tr>
												<td>SS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td>ILN
                </td>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>当客户端登录或添加联系人到列表时，通知列表中的联系人的状态。
                </td>
												<td>initial online state</td>
										</tr>
										<tr>
												<td>IRO
                </td>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>当有新用户加入聊天连接时，通知客户端该连接中的用户名单。
                </td>
												<td>initial roster information</td>
										</tr>
										<tr>
												<td>JIO
                </td>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>通知客户端已经同另外的用户建立了聊天连接。
                </td>
												<td>jion</td>
										</tr>
										<tr>
												<td rowspan="2">LSG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出获取联系人组列表的请求。
                </td>
												<td rowspan="2">list groups</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回获取联系人组列表请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">LST
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出获取联系人列表的请求。
                </td>
												<td rowspan="2">list</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回获取联系人列表请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="3">MSG
                </td>
												<td>Client
                </td>
												<td>SS
                </td>
												<td>发送消息到其他用户(聊天对象)。
                </td>
												<td rowspan="3">message</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>传递服务器(系统) 的消息到客户端。</td>
										</tr>
										<tr>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>传递其他用户(聊天对象)的消息到客户端。</td>
										</tr>
										<tr>
												<td>NAK
                </td>
												<td>SS
                </td>
												<td>Client
                </td>
												<td>做出否定回答。
                </td>
												<td>negative acknowledgement</td>
										</tr>
										<tr>
												<td>NLN
                </td>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>通知客户端联系人上线或改变状态。
                </td>
												<td>on-line</td>
										</tr>
										<tr>
												<td>OUT
                </td>
												<td>All
                </td>
												<td>All
                </td>
												<td>结束客户端-服务器的连接。
                </td>
												<td>out</td>
										</tr>
										<tr>
												<td rowspan="2">PNG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td rowspan="2">测试TCP连接状态。
                </td>
												<td rowspan="2">ping</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>SS</td>
										</tr>
										<tr>
												<td rowspan="2">PRP
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出设置个人电话号码的请求。
                </td>
												<td rowspan="2">personal phone number</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回设置请求的应答</td>
										</tr>
										<tr>
												<td rowspan="2">PNG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td rowspan="2">测试TCP连接状态。
                </td>
												<td rowspan="2">ping</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>SS</td>
										</tr>
										<tr>
												<td rowspan="2">QNG
                </td>
												<td>NS
                </td>
												<td>Client
                </td>
												<td rowspan="2">返回测试TCP连接状态的应答。
                </td>
												<td rowspan="2">quiz ping?</td>
										</tr>
										<tr>
												<td>SS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td rowspan="2">QRY
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td rowspan="2">客户端回答服务器的验证要求。
                </td>
												<td rowspan="2">quiz reply?</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>SS</td>
										</tr>
										<tr>
												<td rowspan="2">REA
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出修改用户昵称的请求。
                </td>
												<td rowspan="2">rename nickname</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回修改用户昵称请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">REG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出修改联系人组的请求。
                </td>
												<td rowspan="2">rename group</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回修改联系人组请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">REM
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出从联系人列表中删除用户的请求。
                </td>
												<td rowspan="2">rename user</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回删除用户请求的应答。</td>
										</tr>
										<tr>
												<td rowspan="2">RMG
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出删除联系人组的请求。
                </td>
												<td rowspan="2">remove group</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回删除联系人组请求的应答。</td>
										</tr>
										<tr>
												<td>RNG
                </td>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>通知客户端有人要建立聊天连接。
                </td>
												<td>ring</td>
										</tr>
										<tr>
												<td rowspan="2">SYN
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td rowspan="2">客户端-服务器同步。
                </td>
												<td rowspan="2">synchronization</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td rowspan="2">URL
                </td>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出获取MSN服务URL的请求。
                </td>
												<td rowspan="2">URL</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回获取URL请求的应答。</td>
										</tr>
										<tr>
												<td>USR
                </td>
												<td>All
                </td>
												<td>All
                </td>
												<td>声明、传递、鉴别用户身份。
                </td>
												<td>user</td>
										</tr>
										<tr>
												<td rowspan="4">VER
                </td>
												<td>Client
                </td>
												<td>DS
                </td>
												<td rowspan="4">协商MSN Messenger协议版本。
                </td>
												<td rowspan="4">version</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>NS</td>
										</tr>
										<tr>
												<td>DS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client</td>
										</tr>
										<tr>
												<td rowspan="3">XFR
                </td>
												<td>DS
                </td>
												<td>Client
                </td>
												<td>向客户端分配NS（通知客户端转向连接指定的NS）。
                </td>
												<td rowspan="3">transfer</td>
										</tr>
										<tr>
												<td>Client
                </td>
												<td>NS
                </td>
												<td>发出分配SS的请求。</td>
										</tr>
										<tr>
												<td>NS
                </td>
												<td>Client
                </td>
												<td>返回分配SS请求的应答。</td>
										</tr>
								</tbody>
						</table>
						<h3>MSN Messenger协议--错误代码一览</h3>
				</li>
				<li>
						<table align="center" border="1" cellpadding="4" cellspacing="1" width="100%">
								<tbody>
										<tr>
												<td class="head">代码
                </td>
												<td class="head">含义
                </td>
												<td class="head">可能的命令
                </td>
												<td class="head">错误示例
                </td>
												<td class="head">备注</td>
										</tr>
										<tr>
												<td>200
                </td>
												<td>非法命令
                </td>
												<td> 
                </td>
												<td>
														<span class="样式1">ABC 18</span>\r\n<br /><span class="样式3">200 
                  18</span>\r\n
                </td>
												<td> </td>
										</tr>
										<tr>
												<td>201
                </td>
												<td>非法参数
                </td>
												<td> 
                </td>
												<td>
														<span class="样式1">CHG 19 FLN 0</span>\r\n<br /><span class="样式3">201 19</span>\r\n<br /><span class="样式1">ADD 20 AL 
                  aaa@bbb@ccc aaa@bbb@ccc</span>\r\n<br /><span class="样式3">201 
                  20</span>\r\n
                </td>
												<td> </td>
										</tr>
										<tr>
												<td>205
                </td>
												<td>用户不存在
                </td>
												<td>ADD
                </td>
												<td>
														<span class="样式1">ADD 21 AL none@hotmail.com 
                  none@hotmail.com</span>\r\n<br /><span class="样式3">205 
                  21</span>\r\n
                </td>
												<td> </td>
										</tr>
										<tr>
												<td>206
                </td>
												<td>缺少域名
                </td>
												<td>
														<br />
												</td>
												<td>
														<br />
												</td>
												<td> </td>
										</tr>
										<tr>
												<td>207
                </td>
												<td>已经登录
                </td>
												<td>USR
                </td>
												<td>
														<span class="样式1">USR 20 TWN I 
                  example@hotmail.com</span>\r\n<br /><span class="样式3">207 
                  20</span>\r\n<br /><span class="样式1">USR 21 TWN S 
                  8d30fc782aa25ec9e1293fdda13cab42</span>\r\n<br /><span class="样式3">207 21</span>\r\n
                </td>
												<td> </td>
										</tr>
										<tr>
												<td>208
                </td>
												<td>非法用户名
                </td>
												<td>CAL
                </td>
												<td>
														<span class="样式1">CAL 2 @@hotmail.com</span>\r\n<br /><span class="样式3">208 2</span>\r\n
                </td>
												<td> </td>
										</tr>
										<tr>
												<td>209
                </td>
												<td>非法用户昵称
                </td>
												<td>REA
                </td>
												<td>
														<span class="样式1">REA 18 one@hotmail.com 
                  kill%20microsoft</span>\r\n<br /><span class="样式3">209 
                  18</span>\r\n
                </td>
												<td> </td>
										</tr>
										<tr>
												<td>210
                </td>
												<td>用户太多
                </td>
												<td>ADD
                </td>
												<td>
														<span class="样式1">ADD 23 FL one@hotmail.com one@hotmail.com 
                  0</span>\r\n<br /><span class="样式3">210 23</span>\r\n 
                </td>
												<td>最大150</td>
										</tr>
										<tr>
												<td rowspan="2">215
                </td>
												<td rowspan="2">用户已在列表中
                </td>
												<td>ADD
                </td>
												<td>
														<span class="样式1">ADD 36 FL one@hotmail.com one@hotmail.com 
                  2</span>\r\n<br /><span class="样式3">ADD 36 825 FL one@hotmail.com 
                  one@hotmail.com 2</span>\r\n<br /><span class="样式1">ADD 37 FL 
                  one@hotmail.com one@hotmail.com 2</span>\r\n<br /><span class="样式3">215 37</span>\r\n 
                </td>
												<td rowspan="2">
														<br />
												</td>
										</tr>
										<tr>
												<td>CAL
                </td>
												<td>
														<span class="样式1">CAL 5 two@hotmail.com</span>\r\n<br /><span class="样式3">CAL 5 RINGING 213697</span>\r\n<br /><span class="样式1">CAL 6 two@hotmail.com</span>\r\n<br /><span class="样式3">215 6</span>\r\n</td>
										</tr>
										<tr>
												<td rowspan="3">216
                </td>
												<td rowspan="3">用户不在列表中
                </td>
												<td>REM
                </td>
												<td>
														<span class="样式1">REM 14 FL 
                  three@hotmail.com</span>\r\n<br /><span class="样式3">216 
                  14</span>\r\n 
                </td>
												<td rowspan="3">
														<br />
												</td>
										</tr>
										<tr>
												<td>REA
                </td>
												<td>
														<span class="样式1">REA 48 three@hotmail.com 
                  three</span>\r\n<br /><span class="样式3">216 48</span>\r\n</td>
										</tr>
										<tr>
												<td>CAL
                </td>
												<td>
														<span class="样式1">CAL 2 
                  three@hotmail.com</span>\r\n<br /><span class="样式3">216 
                  2</span>\r\n</td>
										</tr>
										<tr>
												<td>217
                </td>
												<td>用户不在线
                </td>
												<td>CAL
                </td>
												<td>
														<span class="样式1">CAL 2 two@hotmail.com</span>\r\n<br /><span class="样式3">217 2</span>\r\n 
                </td>
												<td>
														<br />
												</td>
										</tr>
										<tr>
												<td rowspan="2">218
                </td>
												<td rowspan="2">已在指定模式
                </td>
												<td>BLP
                </td>
												<td>
														<span class="样式1">BLP 17 BL</span>\r\n<br /><span class="样式3">BLP 17 151 BL</span>\r\n<br /><span class="样式1">BLP 18 
                  BL</span>\r\n<br /><span class="样式3">218 18</span>\r\n 
                </td>
												<td rowspan="2">
														<br />
												</td>
										</tr>
										<tr>
												<td>GTC
                </td>
												<td>
														<span class="样式1">GTC 19 A</span>\r\n<br /><span class="样式3">GTC 
                  19 152 A</span>\r\n<br /><span class="样式1">GTC 20 
                  A</span>\r\n<br /><span class="样式3">218 20</span>\r\n</td>
										</tr>
										<tr>
												<td>219
                </td>
												<td>用户已经在相反的列表中
                </td>
												<td>ADD
                </td>
												<td>
														<span class="样式1">ADD 15 AL four@hotmail.com 
                  four@hotmail.com</span>\r\n<br /><span class="样式3">ADD 15 AL 56 
                  four@hotmail.com four</span>\r\n<br /><span class="样式1">ADD 16 BL 
                  four@hotmail.com four@hotmail.com</span>\r\n<br /><span class="样式3">219 16</span>\r\n
                </td>
												<td>
														<br />
												</td>
										</tr>
										<tr>
												<td>223
                </td>
												<td>用户组太多
                </td>
												<td>ADG
                </td>
												<td>
														<span class="样式1">ADG 28 new%20group 0</span>\r\n<br /><span class="样式3">223 28</span>\r\n
                </td>
												<td>最大30</td>
										</tr>
										<tr>
												<td rowspan="4">224
                </td>
												<td rowspan="4">非法组号
                </td>
												<td>ADD
                </td>
												<td>
														<span class="样式1">RMG 24 3</span>\r\n<br /><span class="样式3">RMG 
                  24 11506 3</span>\r\n<br /><span class="样式1">ADD 25 FL 
                  five@hotmail.com 3</span>\r\n<br /><span class="样式3">224 
                  25</span>\r\n
                </td>
												<td rowspan="4">
														<br />
												</td>
										</tr>
										<tr>
												<td>REM
                </td>
												<td>
														<span class="样式2">RMG 24 3</span>\r\n<br /><span class="样式3">RMG 
                  24 11506 3</span>\r\n<br /><span class="样式1">REM 25 FL 
                  five@hotmail.com 3</span>\r\n<br /><span class="样式3">224 
                  25</span>\r\n</td>
										</tr>
										<tr>
												<td>REG
                </td>
												<td>
														<span class="样式1">RMG 24 3</span>\r\n<br /><span class="样式3">RMG 
                  24 11506 3</span>\r\n<br /><span class="样式1">REG 25 3 New%20Name 
                  0</span>\r\n<br /><span class="样式3">224 25</span>\r\n</td>
										</tr>
										<tr>
												<td>RMG
                </td>
												<td>
														<span class="样式1">RMG 24 3</span>\r\n<br /><span class="样式3">RMG 
                  24 11506 3</span>\r\n<br /><span class="样式1">RMG 25 
                  3</span>\r\n<br /><span class="样式3">224 25</span>\r\n</td>
										</tr>
										<tr>
												<td>225
                </td>
												<td>用户不在组中
                </td>
												<td>REM
                </td>
												<td>
														<span class="样式1">REM 26 FL six@hotmail.com 
                  3</span>\r\n<br /><span class="样式3">225 26</span>\r\n
                </td>
												<td>
														<br />
												</td>
										</tr>
										<tr>
												<td>229
                </td>
												<td>组名太长
                </td>
												<td>ADG
                </td>
												<td>
														<span class="样式1">ADG 27 
                  ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 
                  0</span>\r\n<br /><span class="样式3">229 27</span>\r\n
                </td>
												<td>最大60</td>
										</tr>
										<tr>
												<td>230
                </td>
												<td>不能删除组0
                </td>
												<td>RMG
                </td>
												<td>
														<span class="样式1">RMG 28 0</span>\r\n<br /><span class="样式2">230 
                  28</span>\r\n
                </td>
												<td>
														<br />
												</td>
										</tr>
										<tr>
												<td>300</td>
												<td>缺少必要的参数</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>302 </td>
												<td>尚未登录</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>500</td>
												<td>服务器内部错误</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>540</td>
												<td>验证应答错误</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>600</td>
												<td>服务器忙</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>707</td>
												<td>无法建立连接</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>910</td>
												<td>服务器忙</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
										<tr>
												<td>911</td>
												<td>身份验证失败</td>
												<td> </td>
												<td> </td>
												<td> </td>
										</tr>
								</tbody>
						</table>
						<p>过
去的MSN
Messenger版本(MSNP8以下)，简单地使用MD5等Hash算法对用户身份进行认证。MSNP9/MSNP10使用一种TWN
(Tweener)认证方式，通过SSL/TLS连接到login.passport.com和loginnet.passport.com等服务器，借
助于HTTP协议输入账号和密码，认证通过后，才能取得“入场券”。 </p>
						<p>真正意义上的身份认证，发生在客户端与通知服务器(NS)之间。客户端登陆NS时，首先交换版本信息。双方均支持MSNP8以上版本时，才能进行认证过程。如果客户端版本较低，不支持TWN，咋办？服务器会将你一脚揣出去，信不信？ 
            </p>
						<p>好了，废话少说，现在拿一个成功认证的例子看看。在下面的例子中，账号是“example@passport.com”，密码是“password”。 
            </p>
VER 4 MSNP10 MSNP9 CVR0 \r\n <br />
VER 4 MSNP9 CVR0 \r\n <br />
CVR 5 
            0x0804 winnt 5.0 i386 MSNMSGR 6.1.0203 MSMSGS example@passport.com 
            \r\n <br />
CVR 5 6.0.0602 6.0.0602 5.0.0527 
            http://download.microsoft.com/download/d/4/f/d4f560d5-6dc6-4901-b149-a568415561d7/SETUPNT.EXE 
            http://messenger.msn.com/cn \r\n <br />
USR 6 TWN I 
            example@passport.com \r\n <br />
USR 6 TWN 
            Slc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, 
            tpf=ed1c2f217a21c191c61251eb8b73bb60 \r\n 
            <br />
(此时通过SSL进行身份认证，获得“入场券”) <br />
USR 7 TWN S 
            t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ 
            &amp;p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M 
            !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$ 
            \r\n <br />
USR 7 OK example@passport.com example@passport.com 1 0 \r\n 

            
        <p>第一回合(TrID=4)，双方协商MSN版本号。客户端说“我能支持MSNP9和MSNP10”，NS说“行，就MSNP9吧”。 
            </p><p>第二回合(TrID=5)，客户端报告本机信息：OS = Windows 2000 (NT 5.0), 语言 = 简体中文，MSN 
            Messenger版本 = 6.1.0203, 账号 = 
            example@passport.com。NS给出了推荐的版本号，能够使用的最老的版本号，新版本下载地址，官方网站地址等信息。 </p><p>第三回合(TrID=6)，客户端要求身份认证(I = Initial)，NS则给出所需要的一长串信息(S = 
            Subsequent)。其中tpf相当于challenge，参与Hash运算，能保证每次认证返回的串是不同的。 </p><p>第四回合(TrID=7)，客户端出示从认证服务器得到的“入场券”，NS放行(OK)。 </p><p>第三、四回合之间，通过SSL的认证过程如下： </p><p>首先在HTTPS端口443向login.passport.com发送一个GET请求，将账号、密码和NS给定的一长串信息送出 
            </p>
GET /login2.srf HTTP/1.1 \r\n <br />
Authorization: Passport1.4 
            OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=example%40passport.com,pwd=password, 
            lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, 
            tpf=ed1c2f217a21c191c61251eb8b73bb60 \r\n <br />
Host: 
            login.passport.com \r\n \r\n 
            
        <p>根据情况，会重定向到不同的URL。本例中，重定向到"https://loginnet.passport.com/login2.srf?lc=1033"，服务器应答 
            </p>
HTTP/1.1 302 Found \r\n Server: Microsoft-IIS/5.0 \r\n <br />
Date: 
            Mon, 22 Dec 2003 21:10:05 GMT \r\n <br />
PPServer: H: LAWPPLOG5C006 
            \r\n <br />
Connection: close \r\n <br />
Content-Type: text/html \r\n 
            <br />
Expires: Mon, 22 Jun 2003 21:09:05 GMT \r\n<br />
Cache-Control: 
            no-cache \r\n <br />
cachecontrol: no-store \r\n Pragma: no-cache 
            \r\n<br />
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" 
            \r\n<br />
Authentication-Info: Passport1.4 da-status=redir \r\n 
            <br />
Location: https://loginnet.passport.com/login2.srf?lc=1033 \r\n 
            <br />
\r\n ... ... 
            
        <p>然后，重新向指定的URL发出请求，得到如下响应 </p><p>HTTP/1.1 200 OK \r\n <br />Server: Microsoft-IIS/5.0 \r\n <br />Date: 
            Mon, 22 Dec 2003 21:10:07 GMT \r\n <br />PPServer: H: LAWPPIIS6B061 
            \r\n <br />Connection: close \r\n Content-Type: text/html 
            \r\n<br />Expires: Mon, 22 Dec 2003 21:09:07 GMT 
            \r\n<br />Cache-Control: no-cache \r\n <br />cachecontrol: no-store \r\n 
            <br />Pragma: no-cache \r\n <br />P3P: CP="DSP CUR OTPi IND OTRi ONL 
            FIN" \r\n<br />Set-Cookie: ... ... \r\n <br />Authentication-Info: 
            Passport1.4 
            da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec, 
            from-PP='t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ 
            &amp;p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M 
            !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$', 
            ru=http://messenger.msn.com \r\n <br />Content-Length: 0 \r\n <br />\r\n 
            </p><p>开始时直接向loginnet.passport.com发出正确的请求，也是可以的。不难看出，在服务器认证成功的返回信息中，Authentication-Info字段的from-PP串值，就是所谓的“入场券”。 
            </p><p>如果认证失败，服务器返回401错误 </p>
HTTP/1.1 401 Unauthorized \r\n ... ... 
            
        <p>这样，就无法拿到“入场券”，自然不能在第四回合中输入合法的串。 </p></li>
		</table>
<img src ="http://www.blogjava.net/wadise/aggbug/42638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-04-23 13:02 <a href="http://www.blogjava.net/wadise/archive/2006/04/23/42638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一篇讨论DSL的文章</title><link>http://www.blogjava.net/wadise/archive/2006/04/19/41987.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Wed, 19 Apr 2006 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/04/19/41987.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/41987.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/04/19/41987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/41987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/41987.html</trackback:ping><description><![CDATA[江南白衣 10:00:26<br />
JetBrains opens Meta Programming System for Early Access<br /><br />
http://www.theserverside.com/news/thread.tss?thread_id=34619 <br />
江南白衣 10:00:46<br />
JetBrains那个DSL制造器终于放出来溜达了 <br />
magicgod 10:00:55<br />
是不是以idea为依靠？ <br />
江南白衣 10:01:09<br />
an IDE-like language workbench for creating domain-specific languages
(DSLs) and programs. It includes a plugin for IntelliJ IDEA which helps
to generate Java code from your DSLs.<br />
 <br />
magicgod 10:01:15<br />
dsl跟rules有什么区别？ <br />
江南白衣 10:02:39<br />
Martin Flower最近出来凑热闹,写了一篇关于Language workbench的blog阿,非常综合的总结了面向语言编程,你看他的好了<br />
http://martinfowler.com/articles/languageWorkbench.html <br />
江南白衣 10:03:44<br />
不是说,面向对象的封装不能真的一一映射现实世界.<br />
而面向人类语言习惯的封装,从逻辑学上,更能影射人类的思维. <br />
magicgod 10:04:00<br />
看了一下，真的有点奇怪 <br />
江南白衣 10:04:43<br />
他那篇blog,一开始举的例子太长太无聊了,搞得大家频频起身吃零食,去厕所.... <br />
buaawhl 10:04:43<br />
LOP. <br />
magicgod 10:05:22<br />
哈哈，是的 <br />
magicgod 10:05:41<br />
但我总觉得还是有点隐隐不对劲 <br />
buaawhl 10:06:07<br />
groovy, beanshell, js, python, ruby 不都是 LOP吗？<br />
 <br />
江南白衣 10:06:18<br />
不是吧 .... <br />
buaawhl 10:06:18<br />
LOP的一个例子 <br />
magicgod 10:06:20<br />
这又回到了五六十年代人工智能和专家系统的方向了 <br /><br /><br />
 <br />
buaawhl 10:06:43<br />
Lisp允许自定义 语法规则 <br />
magicgod 10:06:43<br />
lisp是恐怖的 <br />
buaawhl 10:06:56<br />
对。最终的出路就是 人工智能 <br />
magicgod 10:07:02<br />
学autocad的时候，真是要晕死了 <br />
magicgod 10:07:24<br />
不见得是自然的，应该有一种类自然语言先出现 <br />
buaawhl 10:07:28<br />
autocad用Lisp ? <br />
江南白衣 10:07:28<br />
Lisp按MF的分类,属于Internal DSL.用自己来表达DSL<br />
而其他的都属于External DSL,需要转译器 <br />
magicgod 10:07:40<br />
我看了ilog的语言，看上去不错 <br />
江南白衣 10:07:52<br />
MPS这种是用转译器的阿,不同LISP. <br />
江南白衣 10:08:50<br />
JetBrains的MPS,优点在帮你制造语言的同时,制作这种语言的IDE... <br />
magicgod 10:10:01<br />
应该是为了让这种语言给用户或低级实施人员用吧 <br />
江南白衣 10:11:18<br />
周末试用一下再说了,这年头,总是广告做得好,实际没什么用. <br />
buaawhl 10:11:43<br />
MPS is a Java Code generator ?<br />
 <br />
magicgod 10:12:16<br />
是不是这样的理想：创建一种语言适合客户直接使用 <br />
buaawhl 10:12:23<br />
http://www.jetbrains.com/mps/start_mps3.html  look its sample <br />
magicgod 10:12:29<br />
那么就相当于把域逻辑的功能放给用户来用 <br />
magicgod 10:12:49<br />
这个hello world是有点复杂的，我觉得他举的例子不对 <br />
buaawhl 10:12:52<br />
客户直接使用 自然语言。比如，汉语 <br />
magicgod 10:13:48<br />
而且更好规范，适合计算机来识别 <br />
江南白衣 10:14:25<br />
举个例子吧,SQL属于DSL....你如果不用SQL,也可以用一堆API来进行查询,像hibernate的critexx.....<br />
但SQL明显更易读.<br /><br />
so,把代码封装成语言,在某些情况下比封装成OO的lib更好. <br /><br />
 <br />
magicgod 10:15:13<br />
是的，那如果封装成OO的语言呢？ <br />
magicgod 10:15:56<br />
一个用户写好的DSL代码，继承给另一个用户去使用，岂不是很方便 <br />
buaawhl 10:16:57<br />
SQL能够做到的事情很少啊。where = if.  <br />
江南白衣 10:17:03<br />
可继承的语言?这不是我的知识范围内了... <br />
buaawhl 10:17:08<br />
if( a = 1) b = 3; <br />
buaawhl 10:17:25<br />
select * from A where b = 3 <br />
buaawhl 10:17:43<br />
难度差不多啊<br />
 <br />
江南白衣 10:17:57<br />
MF说,DSL就是不是不符合图灵XXX的语言,不自足的,只能成为程序的某一方面,而主体必须要General Language(like java)完成. <br />
magicgod 10:18:25<br />
是的，DSL就是要简单 <br />
江南白衣 10:18:40<br />
靠,打字太快,<br />
MF说,DSL就是不符合图灵XXX的语言<br />
 <br />
buaawhl 10:18:43<br />
问题是在于，General Language(like java) 表达 程序的某一方面（简单）的时候， 也相当简单。和DSL一样简单 <br />
magicgod 10:18:53<br />
目标不是程序员，而是行业用户 <br />
江南白衣 10:19:08<br />
而且,简单的时候你可以不封装阿. <br />
magicgod 10:19:09<br />
如果要到DSL的程度就可以视为DSL <br />
buaawhl 10:19:11<br />
那么，有必要用另一个简单，来定义 本来就简单的东西吗？ <br />
buaawhl 10:19:41<br />
行业用户？:-) for example? what they realy need? <br />
江南白衣 10:19:41<br />
不是这个意思啊. <br />
buaawhl 10:19:58<br />
前一段时间，看了一下 Rule Engine <br />
江南白衣 10:20:00<br />
ilog的规则语言就可以让电信的mm自定义收费规则 <br />
magicgod 10:20:26<br />
是的，就是要够简单，这只是一个模糊概念 <br /><br />
 <br />
buaawhl 10:21:10<br />
yes. i know iLog. 怎么说呢.那是商业的成功.另外也是业务模块的成功. <br />
magicgod 10:21:54<br />
而且实际上DSL应该是面向实际人群的，比如：电报码是一个非常复杂的编码，可是仍然有大批的业务人员直接操作 <br />
江南白衣 10:22:01<br />
其实也不一定直接面对行业用户<br />
只是把某些面向OO的lib ,转为面向语言的封装,产生更多的蓝领.<br />
但我觉得这个方向还有太多东西要研究,MPS只是一次探索 <br />
buaawhl 10:22:24<br />
谁能给出一个 具体的 ilog sample ?  MPS可以说是 MDA。<br />
 <br />
buaawhl 10:22:33<br />
Model Graph -&gt; Code <br />
buaawhl 10:23:16<br />
iLog和JRules是同一个产品吗？ <br />
 风之子 10:23:19<br />
Ilog是rule-&gt;Fuction <br />
magicgod 10:24:27<br />
If    the call destination number is the preferred
numberThen     apply the preferred number rate <br />
江南白衣 10:24:27<br />
MPS的内涵一定不只Model Graph -&gt; Code ,看他的那篇总领性的文章,不只如此的.<br />
不过可能第一版只做到这样. <br />
magicgod 10:24:41<br />
If    the call destination number is the preferred
numberThen     apply the preferred number rate <br />
magicgod 10:24:44<br />
If<br />
    the call destination number is the preferred number<br />
Then     <br />
    apply the preferred number rate <br />
magicgod 10:24:53<br />
ilog's bal <br />
庄表伟 10:25:02<br />
这是ilog的代码？ <br />
magicgod 10:25:02<br />
已经比较接近自然语言了 <br />
庄表伟 10:25:08<br />
让我想起了cobol <br />
buaawhl 10:25:10<br />
yes. i c. 江南白衣(228013) 10:20:00<br />
ilog的规则语言就可以让电信的mm自定义收费规则 。   <br />
电信的mm写这个？ <br />
magicgod 10:25:13<br />
google上抄来的 <br />
buaawhl 10:25:26<br />
是啊。Pascal， VB 也是这样 <br />
magicgod 10:25:26<br />
是的，有点象，所以cobol至今还有生命力 <br />
magicgod 10:25:43<br />
destination number <br /><br />
 <br />
magicgod 10:29:09<br />
这应该就是DSL的好处，用户很快搞懂了SQL的基本方法，以后做报表就简单了 <br />
buaawhl 10:29:15<br />
可以自定义语言规则。 <br />
buaawhl 10:29:27<br />
其实，就是关键字替换了。 <br />
江南白衣 10:29:40<br />
不会的,ilog的规则语言也是绑定IDE的,你打个节字,会出来一个下拉选择框,只能选节假日 <br />
phalanger 10:29:50<br />
自然语言太自然了不是什么好事，到最后还是要一个语言规则，发展到最后，其实还是要小mm掌握一门“电脑语言” <br />
magicgod 10:30:10<br />
http://blog.csdn.net/calvinxiu/archive/2005/05/27/382372.aspx <br />
magicgod 10:30:20<br />
做了一个比较 <br />
江南白衣 10:30:49<br />
就像我们用dtd,xsd限制 xml一样. <br />
magicgod 10:31:32<br />
既然用户需求这么多变，好！干脆开放给你们，自己写去吧！这总算好了吧 <br />
buaawhl 10:31:41<br />
对，XML表示逻辑，没有一点优势。iLog采用的是script方式。好多了。 <br />
buaawhl 10:32:18<br />
不过，难道iLog要为每一个国家行业定制一种 解释引擎/IDE？<br />
 <br />
庄表伟 10:33:03<br />
看了你的blog，和我的思路，有很多可以相互参照之处 <br />
buaawhl 10:33:13<br />
iLog能够流行起来，完全靠的是，行业经验。和 DSL的优势 没有关系 <br />
庄表伟 10:33:40<br />
我现在在写的对于OO的分析，就是认为它事实上无法准确的描述真实世界 <br />
庄表伟 10:33:51<br />
而要描述需求世界，OO又是不足的 <br />
buaawhl 10:33:54<br />
假设我也是iLog公司，我用支持 中文变量的 VB，一样可以做到这样的程度 <br />
江南白衣 10:34:14<br />
ilog但如果不靠DSL ,而是一堆 API，想必大打折扣。 <br />
buaawhl 10:34:22<br />
只要把业务模块做好了。 <br />
magicgod 10:34:48<br />
关键在于要让用户来写这个东西最好了 <br />
buaawhl 10:34:53<br />
是啊，VB 的 function 也可以不带 ( )<br /><br />
 <br />
庄表伟 10:35:05<br />
要更好的描述需求世界，应该要将真实经验转换为需求世界中的规范定义，然后需要另外的、特定的、描述需求的语言 <br />
magicgod 10:35:19<br />
动态语言更好，这其实就是向人工智能的发展 <br />
buaawhl 10:35:26<br />
用户用iLog从来就不会定义 function。从来只是调用 function. <br />
庄表伟 10:35:27<br />
这样的语言，究竟是不是要类似自然语言，我却有不同的看法 <br />
magicgod 10:35:49<br />
再下去用户就会提要求了，能不能搞懂自己的意思啊 <br />
庄表伟 10:35:52<br />
可能类似于model graph这样的图形表示会更加好 <br />
buaawhl 10:35:56<br />
那么，VB也是一样。我就给你一本关键字手册，而不是API手册。有什么区别？ <br />
magicgod 10:36:27<br />
正是如此，DSL就是领域内的一种语言啊 <br />
magicgod 10:36:51<br />
定好语法，函数，然后用户你去写吧，最多给你一个IDE可以调试一把 <br />
buaawhl 10:37:07<br />
不是一种。而是多种。:-) ilog 一种，jrules一种，drools一种， <br />
江南白衣 10:37:10<br />
我还是认为语言和API之间的差别是巨大的。<br />
而且APi还受很多继承阿，多重继承阿之类的编程语言本身的限制。<br /><br />
 <br />
庄表伟 10:37:19<br />
如果我的思路没错的话，那么我的那篇文章，最后会自然的接上DSL这样的语言 <br />
庄表伟 10:37:27<br />
  <br />
magicgod 10:37:33<br />
是的，听了阿飞介绍的GP确实感触比较大 <br />
magicgod 10:38:04<br />
就是又回到了原来的世界，语言要定义得简单，让客户能使用，不要设计包罗万象的东西 <br />
buaawhl 10:38:07<br />
江南白衣(228013) 10:37:10<br />
我还是认为语言和API之间的差别是巨大的。<br />
而且APi还受很多继承阿，多重继承阿之类的编程语言本身的限制。<br /><br />
应该说 是  关键字  和  API之间的差别吧 <br />
江南白衣 10:38:18<br />
MF说，LOP== GP，微软软件工厂，JetBrains MPS三线发展... <br />
magicgod 10:38:23<br />
甚至对于一个项目就设计一种语言 <br />
magicgod 10:38:41<br />
然后实际上的软件开发核心让用户来开发，哈哈，完美啊 <br />
庄表伟 10:39:20<br />
哪有这么简单，最为困难的部分，就是将真实世界，抽象、界定为含义清晰的需求世界的工作。 <br /><br />
 <br />
buaawhl 10:39:18<br />
magicgod(2240529) 10:38:23<br />
甚至对于一个项目就设计一种语言 <br />
magicgod(2240529) 10:38:41<br />
然后实际上的软件开发核心让用户来开发，哈哈，完美啊  <br /><br />
LOP文章就是这么鼓吹的。:-) <br />
magicgod 10:39:25<br />
把需求变更的事转嫁到用户上去，干脆我也不用了解业务了，你自己玩去吧， <br />
江南白衣 10:39:26<br />
to buaawhl:哈哈，得找些语言学家和你聊聊天了：）<br />
即使目前是关键字==API,也只是现状，明天会更好 <br />
magicgod 10:39:53<br />
在一个小范围的功能中让客户来方便定制，象家电一样 <br />
庄表伟 10:39:59<br />
这是需要长期的经验积累的 <br />
buaawhl 10:40:15<br />
:-) 明天，当然。我只是力图破除 商业概念的 迷信。 <br />
江南白衣 10:40:22<br />
微软那个work beach，又有人试了没有？ <br />
magicgod 10:40:39<br />
其实DSL也不是什么先进的概念，只是老调重弹而已 <br />
magicgod 10:41:02<br />
IT界需要这样的东西，快被用户逼疯了，项目已经成为人际关系的产物 <br />
buaawhl 10:41:02<br />
不要被误导了。这些厂家 的成功决不是因为什么DSL。完全是行业经验的积累。 DSL只是他们炮制出来的壁垒和规则。 <br />
buaawhl 10:41:34<br />
用户的培训也是一大笔费用呢 <br />
magicgod 10:41:57<br />
那是，DSL是帮助厂家来专注到业务上的 <br />
江南白衣 10:42:11<br />
Domain Specific Tools CTP Released for Visual Studio 2005 Beta 2<br />
http://www.theserverside.net/news/thread.tss?thread_id=34253 <br />
buaawhl 10:42:20<br />
就说那个电信的例子。不经过培训，MM怎么懂 DSL？ <br />
magicgod 10:42:28<br />
用不着再追新技术，到此为止了，框架也不需要了，干脆，咱们上DSL吧，哈哈 <br />
buaawhl 10:42:51<br />
而且，那些DSL的逻辑语法极其简单，其实是起着 数据的作用 <br />
magicgod 10:42:51<br />
只要培训成本与原来持平即可 <br />
江南白衣 10:43:13<br />
微软不是傻子，如果别人是学院派的乱试，微软的加入至少说明点问题。 <br />
buaawhl 10:43:41<br />
不可能啊。DSL只有 MS, iLog这样的大公司才搞得起。那属于规则制定啊<br />
 <br />
buaawhl 10:44:02<br />
小公司 不要想着 定义自己的 DSL <br />
 <br /><br />
 <br />
magicgod 10:44:03<br />
行不行的拉出来溜溜，目前成功的DSL已经有了，就看各软件公司如何制定DSL <br />
江南白衣 10:44:22<br />
MS提供的是工具噢..... <br />
magicgod 10:45:00<br />
术语，规则都可以直接制定，那么支持DSL开发的厂商显然是成本更低了 <br />
buaawhl 10:45:08<br />
白衣再把那个ms dsl发来，我仔细看看  <br />
magicgod 10:45:18<br />
各行业应该都会干这事的 <br />
buaawhl 10:45:40<br />
我先详细了解一下 MS DSL的用法   <br />
江南白衣 10:47:05<br />
那要先装vs2005b2,我机上只有vs2003,一直没试呢。 <br />
江南白衣 10:47:20<br />
http://www.theserverside.net/news/thread.tss?thread_id=34253 <br />
buaawhl 10:49:11<br />
这就是刚才那个连接，我还有。我是说，你前几天发来的新闻。   是啊，我也没有2005。没办法试验。也看不到 demo <br />
江南白衣 10:49:31<br />
what新闻？ <br />
江南白衣 10:49:47<br />
今天另一个比较好的发布信息是<br />
Backport175 1.0 released: Annotations for Java 1.3 &amp; 1.4 ，codehaus出的。 <br />
buaawhl 10:50:08<br />
MS DSL Tool 发布的新闻。好像有用户体验 <br />
庄表伟 10:50:10<br />
有没有Flash这样的动态演示呢？ <br />
江南白衣 10:51:01<br />
俺那个针对旧项目的ORM，可以用annotation了：）<br />
之前要包含一个meta class,像groovy那样。 <br />
buaawhl 10:50:59<br />
其实，从我内心的感觉，DSL Tool = Javacc<br />
 <br />
江南白衣 10:51:28<br />
是超级加强版的javacc <br />
buaawhl 10:51:32<br />
iLog 那套简单的 if ... then  ....   我用javacc也能做出来。 <br />
buaawhl 10:52:05<br />
当然有IDE支持 <br />
 风之子 10:52:10<br />
iLOG的关键是动作语义 <br />
 风之子 10:52:19<br />
不是if..then <br /><br />
 <br />
江南白衣 10:52:25<br />
看hibernate里用antlr翻译Hql,用EBNF语法慢慢表示，累死了，而且还有很多不如意的地方，他自己注释起来很多todo... <br />
 风之子 10:52:48<br />
Action Semantics <br />
buaawhl 10:53:03<br />
但你这里看到，DSL IDE里面，关键字都在下拉框里面。这里的关键字 就相当于 数据了。 <br />
buaawhl 10:53:09<br />
Action Semantics？ <br />
江南白衣 10:56:24<br />
Quality-focused Groovy 1.0 pre-release 2 is out<br />
http://www.theserverside.com/news/thread.tss?thread_id=34587<br />
这篇文章的讨论很搞笑...大部分人都在讲<br />
i use groovy for<br />
1. ...<br />
2. ...<br />
很像枪手们在旺场 <br />
buaawhl 10:56:42<br />
 风之子(17256936) 10:52:10<br />
iLOG的关键是动作语义 <br /><br />
啥叫动作语义？for example?   我将来的一个主要理想，就是肃清 buzz word的迷信。  <br />
江南白衣 10:56:54<br />
不过的确列举了动态语言一些可用的地方。 <br />
庄表伟 10:57:01<br />
是啊是啊，新词太多，晕 <br />
buaawhl 10:57:10<br />
http://www.brics.dk/Projects/AS/   Action Semantics<br />
Home Page  <br />
庄表伟 10:57:16<br />
  <br />
buaawhl 11:03:16<br />
3.2 ILog的BAL(Business Action Language)--最完美的王者？<br />
   没有实际用过，只能看文档过过瘾。从文档来看，配合Ilog的编辑器，的确就是最完美的规则语言了。<br /><br />
If    the call destination number is the preferred
numberThen     apply the preferred number rate<br />
 <br />
江南白衣 11:05:12<br />
to buaawhl：<br />
关键字==API,我觉得你抓得很对,很快抓住了Ilog的本质.<br />
但是,抓得太快会忽略了语言的中间过程. <br />
江南白衣 11:05:28<br />
请看下面这段:<br />
 <br />
江南白衣 11:06:00<br />
如果我们有一辆购物车 <br /><br />
并且购物车里面至少有两件物品 <br /><br />
并且购物车里面的物品不超过四件 <br /><br />
并且如果购物车里面的商品价值至少是100美元 <br /><br />
并且如果客户是黄金客户 <br /><br />
那么就为该客户打八五折 <br /><br />
并且显示信息“我们为您黄金客户打了八五折” <br />
 <br />
buaawhl 11:06:46<br />
这是一个  and  逻辑 <br />
buaawhl 11:07:02<br />
没有 or ,  很简单。 <br />
江南白衣 11:07:04<br />
这就是一段规则语言.<br />
如果我们先不抓ilog,而是自己也做一次语言分析的练习,那你分析出这门语言有什么要素呢? <br />
庄表伟 11:07:39<br />
这样的规则语言？ <br />
buaawhl 11:07:47<br />
要素？what do you mean ?    <br />
庄表伟 11:07:49<br />
我编一个，你看看算不算： <br /><br />
 <br />
庄表伟 11:07:57<br />
我们给他100块 <br />
庄表伟 11:08:10<br />
如果他觉得够了，我们就不再给了 <br />
庄表伟 11:08:21<br />
如果他觉得不够，我们就再给100 <br />
庄表伟 11:08:33<br />
如果他觉得够了，我们就不再给了 <br />
庄表伟 11:08:41<br />
如果他觉得不够，我们就再给100  <br />
femto 11:08:42<br />
。。。。 <br />
庄表伟 11:08:46<br />
如果他觉得够了，我们就不再给了<br />
 <br />
庄表伟 11:08:47<br />
如果他觉得不够，我们就再给100   <br />
femto 11:08:49<br />
他觉得够不够的标准是什么 <br />
femto 11:08:51<br />
。。。。 <br />
femto 11:08:59<br />
老庄绕口令阿。。 <br />
庄表伟 11:09:06<br />
够不够是一个用户输入呀 <br />
femto 11:09:10<br />
呵呵 <br />
buaawhl 11:09:19<br />
condtions to meet = { 我们有一辆购物车 <br /><br />
购物车里面至少有两件物品 <br /><br />
购物车里面的物品不超过四件 <br /><br />
如果购物车里面的商品价值至少是100美元 <br />
客户是黄金客户 <br />
   }<br /><br /><br />
就为该客户打八五折 <br />
显示信息“我们为您黄金客户打了八五折” <br />
 <br />
江南白衣 11:09:45<br />
我的分析上面那段规则语言的要素有<br />
if ,then, and ,or<br />
&gt; ,=,&gt;=,&lt;=, is ,数值,一些关键字,如黄金客户, 单位(美金),购物车，物品... <br />
buaawhl 11:09:58<br />
where is Or ? <br />
femto 11:10:03<br />
以规则语言为中心的应用应该是 <br />
femto 11:10:07<br />
一对逻辑 <br />
江南白衣 11:10:07<br />
好，这段没有. <br />
femto 11:10:14<br />
一堆逻辑 <br /><br />
 <br />
femto 11:10:16<br />
经常修改 <br />
femto 11:10:28<br />
这样使用才有必要 <br />
femto 11:10:39<br />
否则传统的编程足够解决了 <br />
庄表伟 11:10:42<br />
白衣，那我刚才的那段，算不算规则语言？ <br />
buaawhl 11:11:03<br />
算，简单的条件循环 <br />
phalanger 11:11:19<br />
可以用数理逻辑证明一组规则是否完备，问题是所谓的完备的逻辑系统，就是现在目前大多数语言所拥有的那样子了 <br />
江南白衣 11:11:47<br />
so,ilog的语言就是 这些if,then,and ,&gt;,&lt;,is加上一些关键字的支持，这就是ilog的DSL了。<br />
你可以说它简单，但他就需要这样。<br />
然后，我们还可以分析用这个思路，其他的领域的DSL<br />
 <br />
庄表伟 11:12:04<br />
还要正常的取款机逻辑中，还要包括（三次以内，金额足够，每次取款限制） <br />
庄表伟 11:12:41<br />
要表达这种“复杂逻辑”，while语句是很自然需要的 <br />
庄表伟 11:12:46<br />
ilog里有没有？ <br />
buaawhl 11:12:51<br />
是的。我同意,iLog的语法很清楚。:-) <br />
buaawhl 11:13:40<br />
我的意思是说，VB等，一样可以这么清楚 <br />
buaawhl 11:13:51<br />
或者，我用 Javacc也可以作出这么清楚地。 <br />
phalanger 11:14:09<br />
很多语言一开始的时候都是很清楚的，慢慢发展越来越不清楚而已 <br />
magicgod 11:14:30<br />
我怀疑DSL的走向会不会象普通语言一样 <br />
buaawhl 11:15:02<br />
我怀疑DSL有没有必要。简单的东西，用什么表达都是简单的。 <br />
江南白衣 11:15:14<br />
不要只抓着ilog不放嘛，从ilog看DSL的整个思路，从java,VB这些通用语言中分离出来，只有自己最关键的关键字，还有行业特有的关键字..... <br />
buaawhl 11:15:29<br />
行业特有的关键字<br />
 <br />
buaawhl 11:15:42<br />
对。这才是关键 <br />
庄表伟 11:15:45<br />
是不是还会有项目特有的关键字？ <br /><br />
 <br />
phalanger 11:15:53<br />
一开始大家都只会有条件，循环，布尔逻辑，基本四则运算几个简单东西。但慢慢什么函数，子过程什么乱七八糟的东西就会因需求而产生，慢慢就会变得庞大 <br />
buaawhl 11:16:15<br />
最重要的积累就在这里。一个行业的业务规则变化很小。 <br />
buaawhl 11:16:41<br />
iLog的成功，完全是 行业关键字（行业API）的积累。 <br />
magicgod 11:17:00<br />
DSL是要用客户熟悉的关键字而不是程序员 <br />
buaawhl 11:17:14<br />
和DSL关系不大。DSL是用来圈地的。但是，给人一种印象，DSL是成功的关键。 <br />
magicgod 11:17:28<br />
这就是区别吧，DSL要让业务专家来设计的，而不是程序员 <br />
magicgod 11:17:43<br />
实现估计还是用传统程序来实现 <br />
buaawhl 11:18:31<br />
magicgod(2240529) 11:17:28<br />
这就是区别吧，DSL要让业务专家来设计的，<br /><br />
你的意思是说，业务专家来定义 业务关键字？ <br />
buaawhl 11:18:52<br />
还是说，业务专家 用DSL 输入那些规则？ <br />
phalanger 11:19:10<br />
业务专家的思维方式也会慢慢遵循程序员的发展过程慢慢变化的。例如某天他们会发现某着业务逻辑几个地方都会用到，于是函数/子过程的需求就会应运而生 <br />
magicgod 11:19:16<br />
是业务专家来描述DSL <br />
magicgod 11:19:28<br />
所以业务专家必须保证纯正的业务专家 <br />
buaawhl 11:19:40<br />
你是说，业务专家来定义DSL？ <br />
magicgod 11:19:43<br />
业务专家要贴近的是最终用户而不是程序员 <br />
phalanger 11:19:55<br />
不能因为别人是业务专家就扼杀别人的逻辑能力的 <br />
magicgod 11:19:55<br />
是的，其实这就是一种定义业务标准的过程 <br />
一剑倾心 11:19:59<br />
庄表伟，关于OO的哲学<br />
http://canonical.blogdriver.com/canonical/761080.html<br />
庄表伟 11:20:05<br />
不懂编程的业务专家，也定义不好DSL的吧 <br />
magicgod 11:20:16<br />
不是的，业务专家不应该懂编程 <br />
magicgod 11:20:44<br />
编程是一种附加，业务专家就象定义需求一样，根本不考虑实现的问题 <br /><br />
 <br />
magicgod 11:21:03<br />
而只提出要什么，并且用什么来描述对行业内某部分客户是最适合的 <br />
buaawhl 11:21:10<br />
DSL Tool 就是给 业务专家用来定义DSL的？ <br />
phalanger 11:21:19<br />
例如没有函数，业务专家会发现有些东西改了，他就会很辛苦的逐个去该每一个逻辑。虽然他不一定会提出“函数”这么抽象的东西，但实际上它还是有这样的需求 <br />
magicgod 11:21:48<br />
估计还得找人翻译一把，dsl tool还没这么强 <br />
buaawhl 11:21:58<br />
yes. 如果逻辑复杂到一定程度,那么dsl就失去了用武之地。 <br />
phalanger 11:22:00<br />
慢慢得当函数不能满足需求的时候，业务专家同样会提出很多很多类似于程序员需要的东西，慢慢得OO也就会出来了 <br />
magicgod 11:22:08<br />
实际上业务内的逻辑并没有相象得这么复杂 <br />
庄表伟 11:22:09<br />
突然联想到Hibernate的数据库冬眠理想，事实上是，如果不能深刻理解数据库，根本用不好Hibernate <br />
江南白衣 11:22:12<br />
我已经决定try一把之前先不讨论了:) <br />
magicgod 11:22:25<br />
DSL的目的就是为了让逻辑简单下来 <br />
buaawhl 11:22:41<br />
而简单的情况，一般的脚本描述起来也很简单。  yes. support 白衣' try. thanks.<br />
 <br />
magicgod 11:22:44<br />
阿飞给我看一下某牛人分析的WEB，其实是一张大图，象非常简单 <br />
一剑倾心 11:22:53<br />
谁先举一个现实的例子出来，认为DSL好的人拿出一个实际的例子<br />
phalanger 11:23:05<br />
事务是会发展的，java出来的时候也没有想过后来会这么复杂 <br />
magicgod 11:23:17<br />
java出来的时候已经是一个复杂的类库了 <br />
magicgod 11:23:36<br />
因为计算机语言出来大多是解决所有问题的，而不是解决小范围问题 <br />
magicgod 11:23:50<br />
现在的DSL就是为了解决小范围问题，而省去OO，甚至省去函数 <br />
江南白衣 11:24:02<br />
DSL现在一直以SQL做例子.....这是对API论最好的打击  <br />
buaawhl 11:24:08<br />
to zhuang : O R 的目的，是为了把 relation db 作为OODB来用。 <br />
magicgod 11:24:23<br />
程序员以为自己的计算机语言可以解决所有的问题，但是实际上仅仅是理论上可以解决 <br /><br />
 <br />
buaawhl 11:24:33<br />
SQL里面还有函数呢？:-) <br />
magicgod 11:24:42<br />
实际上外部限制太多了，根本无法解决所有问题 <br />
江南白衣 11:24:53<br />
但它是基于sql语言框架下的函数 <br />
buaawhl 11:24:56<br />
decode(),  to_chart()    sql需要这些API做什么？ <br />
magicgod 11:24:57<br />
所以DSL提出就解决少数问题来创建一种语言 <br />
江南白衣 11:25:12<br />
但它是基于sql语言框架下的函数  <br />
magicgod 11:25:18<br />
实际上整个SQL定义是非常简单的，相比于JDK来说 <br />
buaawhl 11:25:20<br />
  java function 也是基于 java语言框架下的函数 <br />
buaawhl 11:25:39<br />
sql能表达的东西也很简单:-) <br />
magicgod 11:25:39<br />
我觉得应该把SQL与整个JDK相比吧 <br />
magicgod 11:25:51<br />
是的，就是用简单的东西来解决简单的事 <br />
buaawhl 11:26:05<br />
比较一下功能好了。SQL可以实现 刚才 白衣给出的 规则吗？<br />
 <br />
magicgod 11:26:08<br />
因为计算机语言面向所有问题，但是客户只面向子集 <br />
庄表伟 11:26:10<br />
乱了，乱了，我们在缕一缕  <br />
江南白衣 11:26:18<br />
但java语言本身没有办法很直观的表达 select xxx from的语言。问问你喜欢用hibernate的Critera APi还是用hql? <br />
magicgod 11:26:21<br />
我们需要非常方便的子集来面向客户的子集 <br />
庄表伟 11:26:24<br />
SQL与JDK是一回事 <br />
庄表伟 11:26:37<br />
数据库与领域又是另外一回事 <br />
庄表伟 11:26:52<br />
从概念来说，我支持magicgod的我们需要非常方便的子集来面向客户的子集 <br />
 <br />
magicgod 11:26:55<br />
DSL并不是什么创新， 其实很象HTML <br /><br />
 <br />
江南白衣 11:26:58<br />
数据库查询就是一个领域阿 <br />
buaawhl 11:27:03<br />
DSL如何表达  select ... where ? <br />
庄表伟 11:27:14<br />
但是从实际的语法来说，我认为ilog这样的语法，是cobol的复辟 <br />
magicgod 11:27:19<br />
有没有觉得？HTML是XML的一个子集，用来解决浏览的问题 <br />
江南白衣 11:27:36<br />
SQL语言啊， select where是SQL DSL的关键字和特定语法。 <br />
庄表伟 11:27:37<br />
吃饭去了 <br />
buaawhl 11:27:50<br />
filter( collection,  { a = 1;} ) <br />
buaawhl 11:28:18<br />
这个 STL-like 就是 select ... where <br />
magicgod 11:28:25<br />
所以HTML流行了 <br />
江南白衣 11:28:34<br />
对阿，但是怎么大部分程序员习惯 where a=1多于<br />
filter(collection,{a=1})呢 <br />
magicgod 11:28:40<br />
但后来人们要让HTML来解决所有问题，所以XML流行了 <br />
magicgod 11:29:15<br />
感觉还是要从客户和低水平人员的角度来考虑 <br />
magicgod 11:29:27<br />
idea会过期？ <br />
江南白衣 11:29:39<br />
是阿，html,sql, DSL其实早就无处不在了。<br />
只是现在明确提出了，制造 DSL的工具。 <br />
buaawhl 11:29:42<br />
I c your point. 你是说，某个特定领域，就是某种语言才适合 <br />
magicgod 11:30:02<br />
应该是这个意思 <br />
buaawhl 11:30:12<br />
问题是我说的，那些规则表达的领域，DSL并没有表现出SQL这样的优势 <br />
buaawhl 11:30:27<br />
并没有显示出来他们特有的 适合度 <br />
buaawhl 11:30:42<br />
因为这些DSL在表达 if , then, else. <br />
magicgod 11:30:42<br />
应该说DSL总是适合的 <br /><br />
 <br />
magicgod 11:31:13<br />
因为DSL非常狡猾，如果领域扩大了，那么DSL就可以扩大为某种计算机语言，比如JAVA <br />
buaawhl 11:31:12<br />
比如，VB, pascal 等，优势不是很明显。 <br />
magicgod 11:31:24<br />
这也是DSL，只不过用来解决的领域扩大了 <br />
buaawhl 11:31:34<br />
不觉得，DSL 有表达 if, else, then 的优势。 <br />
江南白衣 11:31:32<br />
有可能， ilog的关键字太少，语法太贴近通用语言，所以优势不明显:0 <br />
magicgod 11:31:50<br />
DSL就是贴近用户来描述啊，让用户的学习成本下降 <br />
buaawhl 11:32:00<br />
yes. :-) <br />
buaawhl 11:32:23<br />
业务用语  成为 DSL关键字。 <br />
magicgod 11:32:24<br />
毕竟出发点不同，所以在细节使用方面，DSL就显示出优势 <br />
magicgod 11:32:37<br />
更重要的是DSL是业务专家来设计的，而不是计算机专家 <br />
magicgod 11:32:43<br />
我希望的是这样... <br />
buaawhl 11:32:53<br />
业务用语  成为 DSL关键字。 这才是 真正的优势。<br />
 <br />
共筑佳话 11:33:04<br />
业务专家来设计DSL，估计也贼费尽 <br />
共筑佳话 11:33:09<br />
够呛 <br />
江南白衣 11:33:14<br />
但总有语法不贴近通用语言的领域的，SQL是其一，我们平时的领域就更加了。V <br />
magicgod 11:34:13<br />
只能由业务专家来设计，因为领域内的语言由业务专家最熟 <br />
magicgod 11:34:23<br />
就象SQL是数据库领域内一样 <br />
buaawhl 11:34:27<br />
yes. 有些理解了。  同样，这些领域的特点就是 逻辑足够简单。而业务用词足够特殊 <br />
magicgod 11:34:58<br />
是的，因为就是要解决特殊的问题，没必要用解决所有问题的语言啊 <br />
magicgod 11:35:13<br />
实际上根本不存在要解决所有问题的客户 <br /><br />
 <br />
magicgod 11:35:36<br />
其实客户是不需要JAVA和JDK,只需要DSL类似描述 <br />
buaawhl 11:36:22<br />
DSL Tool能够提供这样的定义能力？不同领域的用户，都可以用同一个DSL tool 创建自己的 DSL？ <br />
magicgod 11:36:32<br />
就是看清楚了这种事，才提交DSL，并且每一个项目来创建一种DSL <br />
buaawhl 11:36:38<br />
还是说，每个行业一套 DSL? <br />
magicgod 11:37:09<br />
都可以，看你实施了 <br />
江南白衣 11:37:09<br />
DSL Tool,就是GP,JetBrains, MS努力的梦想。 <br />
buaawhl 11:37:24<br />
每个项目？这太可怕了吧? 学习成本再低，也不能这么折腾啊 <br />
magicgod 11:37:28<br />
而DSL总是业务专家这个角色来设计了 <br />
magicgod 11:37:57<br />
其实也是这样，第一个项目设计一个DSL，第二个项目改一把就行了 <br />
buaawhl 11:38:19<br />
DSL Tool的关键还是要深入 各业务领域的通用方面。 <br />
江南白衣 11:38:43<br />
内里的实现还是java,c#的lib <br />
magicgod 11:38:56<br />
是的，现在就是将真正的业务应用上去的时候了 <br />
magicgod 11:39:10<br />
抛开乱七八糟的框架和平台，用户和专家不关心这些 <br />
magicgod 11:39:36<br />
谁能直接面向需求，谁就有主动权 <br />
buaawhl 11:39:38<br />
用户和专家本来就不关心这些 ，:-) <br />
magicgod 11:39:51<br />
IBM的随需而动是有点道理的 <br />
buaawhl 11:40:04<br />
不用DSL, 他们也从来不关心这些。:-) <br />
magicgod 11:40:06<br />
但是现在程序员限制了用户和专家，必须来考虑这些问题了 <br />
buaawhl 11:40:27<br />
用了DSL,他们反而要关心这些, <br />
buaawhl 11:40:45<br />
江南白衣(228013) 11:38:43<br />
内里的实现还是java,c#的lib <br /><br />
 <br />
magicgod 11:40:55<br />
不会吧，DSL本来是没有这些细节的 <br />
buaawhl 11:41:12<br />
如果以前要关心java, c#，那么现在不仅要关心java, c#,还要关心 DSL. <br />
buaawhl 11:41:41<br />
那你说，以前业务专家为什么要关系 java, c# ? <br />
buaawhl 11:42:01<br />
他们只是做业务分析。 <br />
magicgod 11:43:07<br />
因为程序员要关心 <br />
magicgod 11:43:31<br />
程序员反馈给业务专家说这个java不支持 <br />
magicgod 11:44:00<br />
而现在DSL希望能完全解决行业问题吧 <br />
buaawhl 11:44:40<br />
DSL下面的实现不还是java吗？程序员反馈给业务专家说这个java不支持 <br /><br />
 <br />
江南白衣 11:44:42<br />
DSL是需要转译成Java，C# lib的，天上暂时还没馅饼下来  <br />
magicgod 11:44:55<br />
本来也就是这样的 <br />
magicgod 11:45:17<br />
就算编译了，也是要转成硬件代码的嘛 <br />
buaawhl 11:45:26<br />
所以，专家定义DSL的同时，还要考虑java是否支持 <br />
江南白衣 11:46:20<br />
有直接翻译成机器码和翻译成java,c#的选择，<br />
显然直接翻译成机器码的难度大NN倍。 <br />
magicgod 11:46:36<br />
估计是假定java全支持了吧 <br />
magicgod 11:46:37<br />
因为毕竟DSL是子集 <br />
buaawhl 11:47:08<br />
yes. :-)  <br />
magicgod 11:47:09<br />
正在试用mps <br />
buaawhl 11:47:49<br />
如果DSL Tool考虑了Java支持。那么专家就不用考虑了。 <br />
magicgod 11:48:29<br />
是的，估计是这样想的 <br />
magicgod 11:48:53<br />
DSL是朴素的经验主义向理论发展的产物 <br /><br />
 <br />
magicgod 11:49:51<br />
定义一个DSL真是复杂啊，非得有人辅助不可啊 <br />
共筑佳话 11:50:12<br />
专家应该知道些什么呢，达到了什么层次的知识？ <br />
buaawhl 11:50:45<br />
DSL可以看作是一种数据格式，一种配置文件的格式定义。 <br />
magicgod 11:50:47<br />
这个概念定义跟类定义不是一样啊？ft <br />
magicgod 11:51:07<br />
专家角色应该只知道业务知识，其他不懂，假定，哈哈 <br />
buaawhl 11:51:35<br />
一开始，DSL还是摆脱不了 Programm Languange的框子，明天会更好!!!! <br />
共筑佳话 11:51:51<br />
什么层次的知识？是元层次？元元层次？ <br />
magicgod 11:52:29<br />
见鬼了，这东西一定是给程序员用的 <br />
magicgod 11:52:34<br />
干脆定义类算了 <br />
buaawhl 11:52:46<br />
一开始，DSL还是摆脱不了 Programm Languange的框子，明天会更好!!!!   <br />
江南白衣 11:54:27<br />
另外magic god可以留意一下MPS同时定制IDE方面的功能，这是以前yacc没有的 <br />
buaawhl 11:55:37<br />
我们还是要忙着写API, 到时候，用DSL包装成关键字 就行了 <br />
江南白衣 11:56:54<br />
magic god可以上班时间试mps,太爽了 <br />
江南白衣 11:57:02<br />
一定是PM以上级别:) <br />
江南白衣 11:57:59<br />
还有那些11点就喊着去吃饭的..... <br />
magicgod 12:03:58<br />
恐怖，这个操作太可怕了 <br />
magicgod 12:05:32<br />
rubyWeb? <br />
magicgod 12:08:41<br />
代码生成居然有错？！ <br />
江南白衣 12:15:47<br />
加油 <br /><br /><br /><br />
magicgod(2240529) 12:49:15<br />
 更象一个代码生成器 <br />
magicgod(2240529) 12:49:46<br />
还把我的ctrl+space给废了 <br />
magicgod(2240529) 12:50:19<br />
这个生成器好象有点太直接了一点 <br />
magicgod(2240529) 12:50:53<br />
举的例子实在不恰当啊，这回JETBRAINS有点乱了 <br />
magicgod(2240529) 12:51:49<br />
BUG也太多了一点，需要写一些行业例子，这样就有代表性了 <br /><br />
magicgod(2240529) 12:56:28<br />
至少比PETSTORE更高一级的案例，然后用这个案例来套各种方案和工具比较好一点 <br />
magicgod(2240529) 12:56:52<br />
这个HELLOWORLD 最后生成了JAVA代码，有点恐怖<br /><img src ="http://www.blogjava.net/wadise/aggbug/41987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-04-19 19:16 <a href="http://www.blogjava.net/wadise/archive/2006/04/19/41987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux杂记</title><link>http://www.blogjava.net/wadise/archive/2006/04/18/41745.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Tue, 18 Apr 2006 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/04/18/41745.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/41745.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/04/18/41745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/41745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/41745.html</trackback:ping><description><![CDATA[1.要<span class="postdetails">开机自动运行某一程序，可以在/etc/rcx.d中设置。</span><span class="postbody">2－5是终端界面就启动，相同。S是X界面启动。0／1就不要设置了。<br />
2.ubuntu下没有了RH的chkconfig命令，但可以通过lsof或ps来显示当前进程，但确实看起来很吃力。于是google一下，提到可以用rcconf,如果没有的话先apt-get一下，然后再执行rcconf来配置服务。<br />
acpi-support是一种电源管理。<br /></span><font size="-1">dbus是一个提供双应用程序间的处理通信的系统<br /></font>GDM是用于图形登录的Gnome显示管理程序。GDM存在多个漏洞，本地攻击者可以利用这些问题对GDM进行拒绝服务攻击。<br /><font size="-1">hotKey-setup:此守护进程为你的 
笔记本建立一些热键映射</font><br />
其他的可以自己Man，现在流行这句口号”是男人就会Man“<br /><span class="postbody">3.装了chmsee后，每次apt-get其他软件时都会出现"依赖libgtkhtml3.20但却无法安装它“的错误，于是执行apt-get -f install来fix broken depence.<br />
4.</span>
$ sudo su - 这让你获得一个root的shell(#)<br />
5.<font size="-1"><font color="#cc0033">apt-get update</font> 更新本地<font color="#cc0033">apt-get</font>的本地数据库，使其与服务器的pkglist 
文件同步..</font><font size="-1">升级来自Debian 
镜像的包裹列表,如果你想安装当天的任何软件,至少每天运行一次,而且每次修改..</font><font size="-1">定期升级 
系统，保证系统即时升级，弥补安全漏洞<br />
6.卸载软件用：</font><span class="postbody">sudo apt-get remove apache<br />
7.手动安装软件用：</span>dpkg -i XXX.deb命令，但最好还是用apt-get来安装软件<br /><span class="postbody">8.</span>aptitude是Debian用来查看已装包的列表以及操作包例如：stalling,更新，删除。<br />
  如aptitude show chmsee就是显示chmsee程序的详细信息。而aptitude search chmsee就是查找是否已装了chmsee这个软件。<br />
9.apt-file可以查找包中的某个依赖东西。<br />10.卸载XFce<span class="postbody">  sudo apt-get remove --purge libxfce4util-1 libxfcegui4-3 libxfce4mcs-client-2 libxfce4mcs-manager-2 xfce*</span><br /><span class="postbody">
继续补充中。。。<br />
11.<br /></span><span class="postbody">安装： sudo apt-get install xxxx
<br />
卸载： sudo apt-get remove xxxx
<br />
彻底卸载：sudo apt-get remove --purge xxxx</span><img src ="http://www.blogjava.net/wadise/aggbug/41745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-04-18 20:50 <a href="http://www.blogjava.net/wadise/archive/2006/04/18/41745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初装ubuntu</title><link>http://www.blogjava.net/wadise/archive/2006/04/18/41729.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Tue, 18 Apr 2006 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/04/18/41729.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/41729.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/04/18/41729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/41729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/41729.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 收到Ubuntu寄来的光盘，可谓高兴一把，兴奋之余就先尝尝鲜，果然做得够人性化。下面把安装经过记录下来，以备不时之用。。:)1.首先我选择的是普通安装，因为菜嘛！如果你对GNOME不感兴趣的话，可以选择Server安装，然后再装你喜欢的WM。2.安装完以后，进入系统。字体什么这么模糊，先不管他，让指南先操作一遍先。替换/etc/apt/sources.list为下面内容：Code high...&nbsp;&nbsp;<a href='http://www.blogjava.net/wadise/archive/2006/04/18/41729.html'>阅读全文</a><img src ="http://www.blogjava.net/wadise/aggbug/41729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-04-18 20:03 <a href="http://www.blogjava.net/wadise/archive/2006/04/18/41729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux资源</title><link>http://www.blogjava.net/wadise/archive/2006/03/31/38449.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Fri, 31 Mar 2006 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/03/31/38449.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/38449.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/03/31/38449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/38449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/38449.html</trackback:ping><description><![CDATA[
		<br />
		<div dragover="true">
				<font class="f14" id="zoom">
						<font color="#ff0000">
								<font size="3">1。linux编程所用的一些工具</font>
						</font>
						<br />GCC 中文手册<br /><a href="http://www.nbfan.com/forum/dispbbs.asp?boardID=26&amp;ID=1433&amp;page=1" target="_blank" dragover="true"><font color="#336699">http://www.nbfan.com/forum/dispbbs....&amp;ID=1433&amp;page=1</font></a><br />GNU make 指南<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;threadid=40431" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...&amp;threadid=40431</font></a><br />autoconf-2.57手册(英文)<br /><a href="http://www.gnu.org/software/autoconf/manual/autoconf-2.57/html_chapter/autoconf_toc.html" target="_blank"><font color="#336699">http://www.gnu.org/software/autocon...toconf_toc.html</font></a><br />Autoconf-2.13手册<br /><a href="http://www.linuxforum.net/books/autoconf.html" target="_blank"><font color="#336699">http://www.linuxforum.net/books/autoconf.html</font></a><br />使用 automake<br /><a href="http://263.aka.org.cn/Lectures/002/Lecture-2.1.4/Lecture-2.1.4/230.html" target="_blank"><font color="#336699">http://263.aka.org.cn/Lectures/002/...-2.1.4/230.html</font></a><br />使用CVS进行版本管理<br /><a href="http://www.linuxforum.net/books/cvsintro.html" target="_blank"><font color="#336699">http://www.linuxforum.net/books/cvsintro.html</font></a><br />CVS用后感<br /><a href="http://www.linuxsir.org/bbs/showthread.php?t=170538" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthread.php?t=170538</font></a><br /><br /><font color="#d2691e"><font size="4">linux下常用调试工具：</font></font><br />非常好的gdb教程，强烈推荐：<br /><a href="http://www.linuxsir.org/bbs/showthread.php?t=171156" target="_blank" dragover="true"><font color="#336699">http://www.linuxsir.org/bbs/showthread.php?t=171156</font></a><br />GDB英文文档<br /><a href="http://oldsite.linuxaid.com.cn/developer/showdev.jsp?i=49" target="_blank"><font color="#336699">http://oldsite.linuxaid.com.cn/deve...howdev.jsp?i=49</font></a><br />gdb基本用法<br /><a href="http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=45731" target="_blank"><font color="#336699">http://www.linuxsir.com/bbs/showthr...&amp;threadid=45731</font></a><br />gdb的官方文档<br /><a href="http://www.gnu.org/software/gdb/documentation/" target="_blank"><font color="#336699">http://www.gnu.org/software/gdb/documentation/</font></a></font>
		</div>
		<div>
				<!--StartFragment -->
				<font class="f14" id="zoom">  </font>
				<div dragover="true">
						<font class="f14" id="zoom">
								<font color="#ff0000">
										<font size="3">linux编程基础：</font>
								</font>
								<br />要入门先看这个，Linux下C语言编程基础知识<br /><a href="http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=1005" target="_blank"><font color="#336699">http://www.linuxsir.com/bbs/showthr...=&amp;threadid=1005</font></a><br />Linux 下 C 语言编程<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;threadid=7192" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...=&amp;threadid=7192</font></a><br />Linux下的C++编程<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;postid=276723#post276723" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...6723#post276723</font></a><br />linux下的应用程序开发<br /><a href="http://www.lisoleg.net/lisoleg/applications/index.html" target="_blank"><font color="#336699">http://www.lisoleg.net/lisoleg/applications/index.html</font></a><br /><br /><font color="#ff0000"><font size="3">参考书籍</font></font><br />Linux程序员指南(The Linux Programmer's Guide)<br /><a href="http://www.linuxhq.com/guides/LPG/lpg.html" target="_blank"><font color="#336699">http://www.linuxhq.com/guides/LPG/lpg.html</font></a><br />UNIX编程环境(The UNIX Programming Environment)<br /><a href="http://www.iu.hio.no/%7Emark/unix/unix_toc.html" target="_blank"><font color="#336699">http://www.iu.hio.no/~mark/unix/unix_toc.html</font></a><br />UNIX编程的艺术(The Art of Unix Programming)<br /><a href="http://www.catb.org/%7Eesr/writings/taoup/html/" target="_blank"><font color="#336699">http://www.catb.org/~esr/writings/taoup/html/</font></a><br /><br /><font color="#ff0000"><font size="3">进程与线程</font></font><br />Linux下的多进程编程初步<br /><a href="http://www.china-pub.com/computers/emook/0439/info.htm" target="_blank"><font color="#336699">http://www.china-pub.com/computers/emook/0439/info.htm</font></a><br />多进程编程<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;threadid=44083" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...&amp;threadid=44083</font></a><br />Linux下的多进程编程<br /><a href="http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=48887" target="_blank"><font color="#336699">http://www.linuxsir.com/bbs/showthr...&amp;threadid=48887</font></a><br />进程的创建<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;threadid=44078" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...&amp;threadid=44078</font></a><br />POSIX Threads Programming<br /><a href="http://www.llnl.gov/computing/tutorials/workshops/workshop/pthreads/MAIN.html" target="_blank"><font color="#336699">http://www.llnl.gov/computing/tutor...reads/MAIN.html</font></a><br /><br /><font color="#ff0000"><font size="3">linux系统调用</font></font><br />系统调用列表，编程必备<br /><a href="http://www-900.ibm.com/developerWorks/cn/linux/kernel/syscall/part1/appendix.shtml" target="_blank"><font color="#336699">http://www-900.ibm.com/developerWor.../appendix.shtml</font></a><br />C语言库函数---unix常用系统调用---使用说明<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;threadid=119136" target="_blank" dragover="true"><font color="#336699">http://www.linuxsir.org/bbs/showthr...threadid=119136</font></a><br /><a href="http://chinaunix.net/forum/viewtopic.php?t=72159" target="_blank" dragover="true"><font color="#336699">http://chinaunix.net/forum/viewtopic.php?t=72159</font></a><br /><br /><font color="#ff0000"><font size="3">FAQ列表</font></font><br />UNIX Programming FAQ 中文版，很有参考价值<br /><a href="http://www.linuxforum.net/books/upfaq/book1.htm" target="_blank"><font color="#336699">http://www.linuxforum.net/books/upfaq/book1.htm</font></a><br />UNIX Socket FAQ<br /><a href="http://www.developerweb.net/sock-faq/" target="_blank"><font color="#336699">http://www.developerweb.net/sock-faq/</font></a><br /><br /><font color="#ff0000"><font size="3">编码规范</font></font><br />Linux内核编程风格<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;postid=257594" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...=&amp;postid=257594</font></a><br />GNU编码标准<br /><a href="http://www.linuxforum.net/forum/showthreaded.php?Board=Tworkshop&amp;Number=29053" target="_blank"><font color="#336699">http://www.linuxforum.net/forum/sho...op&amp;Number=29053</font></a><br /><br /><font color="#ff0000"><font size="3">可执行文件格式与库文件</font></font><br />从程序员角度看ELF<br /><a href="http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=48381" target="_blank"><font color="#336699">http://www.linuxsir.com/bbs/showthr...&amp;threadid=48381</font></a><br />ELF可执行联接规范（英汉对照版)<br /><a href="http://www.linuxaid.com.cn/articles/1/0/1014528121.shtml" target="_blank"><font color="#336699">http://www.linuxaid.com.cn/articles...014528121.shtml</font></a><br />Linux动态链接库高级应用<br /><a href="http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=18889" target="_blank"><font color="#336699">http://www.linuxsir.com/bbs/showthr...&amp;threadid=18889</font></a><br />链接器与加载器，非常重要的一本书(Linkers and Loaders )<br /><a href="http://www.iecc.com/linker/" target="_blank"><font color="#336699">http://www.iecc.com/linker/</font></a><br /><br /><font color="#ff0000"><font size="3">终端与串口编程、设备文件</font></font><br />UNIX下c语言的图形编程--curses.h 函式库<br /><a href="http://www.fanqiang.com/a4/b2/20020626/060200258.html" target="_blank"><font color="#336699">http://www.fanqiang.com/a4/b2/20020626/060200258.html</font></a><br />VT100控制码<br /><a href="http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=43530" target="_blank"><font color="#336699">http://www.linuxsir.com/bbs/showthr...&amp;threadid=43530</font></a><br />Linux ioctl() Primer<br /><a href="http://www.linuxsir.org/bbs/showthread.php?s=&amp;threadid=44268" target="_blank"><font color="#336699">http://www.linuxsir.org/bbs/showthr...&amp;threadid=44268</font></a><br />Linux Serial Programming How-to English version: <a href="http://www.sgmltools.org/HOWTO/Serial-Programming-HOWTO/t1.html" target="_blank"><font color="#336699">http://www.sgmltools.org/HOWTO/Seri...g-HOWTO/t1.html</font></a><br />Linux Serial Programming How-to 中文繁体版：<a href="http://www.linux.org.tw/CLDP/OLD/Serial-Programming-HOWTO.html" target="_blank"><font color="#336699">http://www.linux.org.tw/CLDP/OLD/Se...ming-HOWTO.html</font></a><br /><br /><font color="#ff0000"><font size="3">linux中文化：</font></font><br /><br />UTF-8 and Unicode FAQ<br /><a href="http://www.linuxforum.net/books/UTF-8-Unicode.html" target="_blank"><font color="#336699">http://www.linuxforum.net/books/UTF-8-Unicode.html</font></a><br />unicode 如何转换为ASCII？<br /><a href="http://www.linuxforum.net/forum/gshowflat.php?Cat=&amp;Board=program&amp;Number=400758&amp;page=0&amp;view=collapsed&amp;sb=5&amp;o=all&amp;fpart=" target="_blank"><font color="#336699">http://www.linuxforum.net/forum/gsh...=5&amp;o=all&amp;fpart=</font></a><br />一个台湾的linux中文化站点<br /><a href="http://xcin.linux.org.tw/i18n/" target="_blank"><font color="#336699">http://xcin.linux.org.tw/i18n/</font></a><br />UTF-8 and Unicode FAQ for Unix/Linux<br /><a href="http://www.cl.cam.ac.uk/%7Emgk25/unicode.html" target="_blank"><font color="#336699">http://www.cl.cam.ac.uk/~mgk25/unicode.html</font></a><br />Linux Unicode 编程<br /><a href="http://www-900.ibm.com/developerWorks/cn/linux/i18n/unicode/linuni/index.shtml" target="_blank"><font color="#336699">http://www-900.ibm.com/developerWor...uni/index.shtml</font></a><br />Linux 国际化本地化和中文化<br /><a href="http://www.linuxforum.net/doc/i18n-new.html" target="_blank"><font color="#336699">http://www.linuxforum.net/doc/i18n-new.html</font></a><br /><br /><font color="#ff0000"><font size="3">一些很好的编程资源连接：</font></font><br /><font color="#0000ff"><br />HPCVL编程资源连接<br /><a href="http://www.hpcvl.org/faqs/prog_links.html" target="_blank"><font color="#336699">http://www.hpcvl.org/faqs/prog_links.html</font></a><br />Linux Programming Resources<br /><a href="http://leapster.org/linoleum/" target="_blank"><font color="#336699">http://leapster.org/linoleum/</font></a><br /></font><br />一个综合的编程资源站点<br /><a href="http://www.clipx.net/norton.php" target="_blank"><font color="#336699">http://www.clipx.net/norton.php</font></a></font>
				</div>
		</div>
<img src ="http://www.blogjava.net/wadise/aggbug/38449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-03-31 12:57 <a href="http://www.blogjava.net/wadise/archive/2006/03/31/38449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下的C语言编程</title><link>http://www.blogjava.net/wadise/archive/2006/03/31/38447.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Fri, 31 Mar 2006 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/03/31/38447.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/38447.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/03/31/38447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/38447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/38447.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 														 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wadise/archive/2006/03/31/38447.html'>阅读全文</a><img src ="http://www.blogjava.net/wadise/aggbug/38447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-03-31 12:52 <a href="http://www.blogjava.net/wadise/archive/2006/03/31/38447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>出租司机给我上的MBA课(转载)</title><link>http://www.blogjava.net/wadise/archive/2006/03/16/35621.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Thu, 16 Mar 2006 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/03/16/35621.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/35621.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/03/16/35621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/35621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/35621.html</trackback:ping><description><![CDATA[<div align="left">我要从徐家汇赶去机场，于是匆匆结束了一个会议，在美罗大厦前搜索出租车。一辆大众发现了我，非常专业的、径直的停在我的面前。这一停，于是有了后面的这个让我深感震撼的故事，象上了一堂生动的MBA案例课。为了忠实于这名出租车司机的原意，我凭记忆尽量重复他原来的话。<br><br>“去哪里……好的，机场。我在徐家汇就喜欢做美罗大厦的生意。这里我只做两个地方。美罗大厦，均瑶大厦。你知道吗？接到你之前，我在美罗大厦门口兜了两圈，终于被我看到你了！从写字楼里出来的，肯定去的不近~~~”<br><br>“哦？你很有方法嘛！”我附和了一下。<br><br>“做出租车司机，也要用科学的方法。”他说。我一愣，顿时很有些兴趣“什么科学的方法？”<br><br>“要懂得统计。我做过精确的计算。我说给你听啊。我每天开17个小时的车，每小时成本34.5元……”<br><br>“怎么算出来的？”我追问。<br><br>“你
算啊，我每天要交380元，油费大概210元左右。一天17小时，平均每小时固定成本22元，交给公司，平均每小时12.5元油费。这是不是就是34.5
元？”，我有些惊讶。我打了10年的车，第一次听到有出租车司机这么计算成本。以前的司机都和我说，每公里成本0.3元，另外每天交多少钱之类的。<br><br>“成
本是不能按公里算的，只能按时间算。你看，计价器有一个“检查”功能。你可以看到一天的详细记录。我做过数据分析，每次载客之间的空驶时间平均为7分钟。
如果上来一个起步价，10元，大概要开10分钟。也就是每一个10元的客人要花17分钟的成本，就是9.8元。不赚钱啊！如果说做浦东、杭州、青浦的客人
是吃饭，做10元的客人连吃菜都算不上，只能算是撒了些味精。”<br><br>强！这位师傅听上去真不象出租车司机，到象是一位成本核算师。“那你怎么办呢？”我更感兴趣了，继续问。看来去机场的路上还能学到新东西。<br><br>“千
万不能被客户拉了满街跑。而是通过选择停车的地点，时间，和客户，主动地决定你要去的地方。”我非常惊讶，这听上去很有意思。“有人说做出租车司机是靠运
气吃饭的职业。我以为不是。你要站在客户的位置上，从客户的角度去思考。”这句话听上去很专业，有点象很多商业管理培训老师说的“put
yourself into others' shoes.”<br><br>“给你举个例子，医院门口，一个拿着药的，一个拿着脸盆的，你带哪一个。”我想了想，说不知道。<br><br>“你
要带那个拿脸盆的。一般人病小痛的到医院看一看，拿点药，不一定会去很远的医院。拿着脸盆打车的，那是出院的。住院哪有不死人的？今天二楼的谁死了，明天
三楼又死了一个。从医院出来的人通常会有一种重获新生的感觉，重新认识生命的意义，健康才最重要。那天这个说：走，去青浦。眼睛都不眨一下。你说他会打车
到人民广场，再去做青浦线吗？绝对不会！”<br><br>我不由得开始佩服。<br><br>“再给你举个例子。那天人民广场，三个人在前面招手。一个
年轻女子，拿着小包，刚买完东西。还有一对青年男女，一看就是逛街的。第三个是个里面穿绒衬衫的，外面羽绒服的男子，拿着笔记本包。我看一个人只要3秒
钟。我毫不犹豫地停在这个男子面前。这个男的上车后说：延安高架、南北高架~~~还没说后面就忍不住问，为什么你毫不犹豫地开到我面前？前面还有两个人，
他们要是想上车，我也不好意思和他们抢。我回答说，中午的时候，还有十几分钟就1点了。那个女孩子是中午溜出来买东西的，估计公司很近；那对男女是游客，
没拿什么东西，不会去很远；你是出去办事的，拿着笔记本包，一看就是公务。而且这个时候出去，估计应该不会近。那个男的就说，你说对了，去宝山。”<br><br>“那些在超市门口，地铁口打车，穿着睡衣的人可能去很远吗？可能去机场吗？机场也不会让她进啊。”<br><br>有道理！我越听越有意思。<br><br>“很
多司机都抱怨，生意不好做啊，油价又涨了啊，都从别人身上找原因。我说，你永远从别人身上找原因，你永远不能提高。从自己身上找找看，问题出在哪里。”这
话听起来好熟，好像是“如果你不能改变世界，就改变你自己”，或者Steven
Corvey的“影响圈和关注圈”的翻版。“有一次，在南丹路一个人拦车，去田林。后来又有一次，一个人在南丹路拦车，还是去田林。我就问了，怎么你们从
南丹路出来的人，很多都是去田林呢？人家说，在南丹路有一个公共汽车总站，我们都是坐公共汽车从浦东到这里，然后搭车去田林的。我恍然大悟。比如你看我们
开过的这条路，没有写字楼，没有酒店，什么都没有，只有公共汽车站，站在这里拦车的多半都是刚下公共汽车的，再选择一条最短路经打车。在这里拦车的客户通
常不会高于15元。”<br><br>“所以我说，态度决定一切！”我听十几个总裁讲过这句话，第一次听出租车司机这么说。<br><br>“要用科学的
方法，统计学来做生意。天天等在地铁站口排队，怎么能赚到钱？每个月就赚500块钱怎么养活老婆孩子？这就是在谋杀啊！慢性谋杀你的全家。要用知识武装自
己。学习知识可以把一个人变成聪明的人，一个聪明的人学习知识可以变成很聪明的人。一个很聪明的人学习知识，可以变成天才。”<br><br>“有一次一
个人打车去火车站，问怎么走。他说这么这么走。我说慢，上高架，再这么这么走。他说，这就绕远了。我说，没关系，你经常走你有经验，你那么走50块，你按
我的走法，等里程表50块了，我就翻表。你只给50快就好了，多的算我的。按你说的那么走要50分钟，我带你这么走只要25分钟。最后，按我的路走，多走
了4公里，快了25分钟，我只收了50块。乘客很高兴，省了10元钱左右。这4公里对我来说就是1块多钱的油钱。我相当于用1元多钱买了25分钟。我刚才
说了，我一小时的成本34.5块，我多合算啊！”<br><br>“在大众公司，一般一个司机3、4千，拿回家。做的好的大概5千左右。顶级的司机大概每月能有7000。全大众2万个司机，大概只有2-3个司机，万里挑一，每月能拿到8000以上。我就是这2-3个人中间的一个。而且很稳定，基本不会大的波动。”<br><br>太强了！到此为止，我越来越佩服这个出租车司机。<br><br>“我常常说我是一个快乐的车夫。有人说，你是因为赚的钱多，所以当然快乐。我对他们说，你们正好错了。是因为我有快乐、积极的心态，所以赚的钱多。”<br><br>说的多好啊！<br><br>“要
懂得体味工作带给你的美。堵在人民广场的时候，很多司机抱怨，又堵车了！真是倒霉。千万不要这样，用心体会一下这个城市的美，外面有很多漂亮的女孩子经
过，非常现代的高楼大厦，虽然买不起，但是却可以用欣赏的眼光去享受。开车去机场，看着两边的绿色，冬天是白色的，多美啊。再看看里程表，100多了，就
更美了！每一样工作都有她美丽的地方，我们要懂得从工作中体会这种美丽。”<br><br>“我10年前是强生公司的总教练。8年前在公司作过三个不同部门的部门经理。后来我不干了，一个月就3、5千块，没意思。就主动来做司机。我愿意做一个快乐的车夫。哈哈哈哈。”<br><br>到了机场，我给他留了一张名片，说：“你有没有兴趣这个星期五，到我办公室，给微软的员工讲一讲你怎么开出租车的？你就当打着表，60公里一小时，你讲多久，我就付你多少钱。给我电话。”<br><br>我迫不及待的在飞机上记录下他这堂生动的MBA课。</div><img src ="http://www.blogjava.net/wadise/aggbug/35621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-03-16 12:57 <a href="http://www.blogjava.net/wadise/archive/2006/03/16/35621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不要让昨日的沮丧令明天的梦想黯然失色！ </title><link>http://www.blogjava.net/wadise/archive/2006/03/10/34593.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Fri, 10 Mar 2006 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/03/10/34593.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/34593.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/03/10/34593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/34593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/34593.html</trackback:ping><description><![CDATA[<TABLE class="fixedTable blogpost" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=ellipse><SPAN class=bvTitle id=subjcns!375E608EA04F2E68!108><STRONG>不要让昨日的沮丧令明天的梦想黯然失色！ </STRONG></SPAN></TD></TR>
<TR>
<TD class=bvh8><STRONG></STRONG></TD></TR>
<TR>
<TD id=msgcns!375E608EA04F2E68!108>
<DIV>在一次讨论会上，一位著名的演说家没讲一句开场白，手里却高举着一张20美元的钞票。 <BR>　　面对会议室里的200个人，他问：“谁要这20美元？”一只只手举了起来。他接着说：“我打算把这20美元送给你们中的一位，但在这之前，请准许我做一件事。”他说着将钞票揉成一团，然后问：“谁还要？”仍有人举起手来。 <BR>　　他又说：“那么，假如我这样做又会怎么样呢？”他把钞票扔到地上，又踏上一只脚，并且用脚碾它。尔后他拾起钞票，钞票已变得又脏又皱。 <BR>　　“现在谁还要？”还是有人举起手来。 <BR>　　“朋友们，你们已经上了一堂很有意义的课。无论我如何对待那张钞票，你们还是想要它，因为它并没贬值，它依旧值20美元。人生路上，我们会无数次被自己的决定或碰到的逆境击倒、欺凌甚至碾得粉身碎骨。我们觉得自己似乎一文不值。但无论发生什么，或将要发生什么，在上帝的眼中，你们永远不会丧失价值。在他看来，肮脏或洁净，衣着齐整或不齐整，你们依然是无价之宝。”</DIV></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 border=0>
<TBODY></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/wadise/aggbug/34593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-03-10 09:35 <a href="http://www.blogjava.net/wadise/archive/2006/03/10/34593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adobe Acrobat 7.0下载地址，不是Adobe Acrobat Reader</title><link>http://www.blogjava.net/wadise/archive/2006/03/03/33497.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Fri, 03 Mar 2006 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/03/03/33497.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/33497.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/03/03/33497.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/33497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/33497.html</trackback:ping><description><![CDATA[这个软件可以对PDF进行创建，编辑，加注释，评语等等。<BR>URL <A href="http://219.149.54.89/Software/SoftDown.asp?ID=33">http://219.149.54.89/Software/SoftDown.asp?ID=33</A><img src ="http://www.blogjava.net/wadise/aggbug/33497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-03-03 16:53 <a href="http://www.blogjava.net/wadise/archive/2006/03/03/33497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何把Hibernate2.1升级到Hibernate3.0？</title><link>http://www.blogjava.net/wadise/archive/2006/03/02/33114.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Thu, 02 Mar 2006 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/03/02/33114.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/33114.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/03/02/33114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/33114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/33114.html</trackback:ping><description><![CDATA[<TABLE width="97%" border=0>
<TBODY>
<TR>
<TD width="94%">
<DIV align=left><FONT size=4>如何把Hibernate2.1升级到Hibernate3.0？ </FONT></DIV>
<P align=left><FONT size=2>选自&lt;&lt;精通Hibernate：Java对象持久化技术详解&gt;&gt; 作者：<A href="http://www.javathinker.org/main.jsp?bc=weiqin/weiqin.jsp"><FONT color=#996666>孙卫琴</FONT></A> 来源:www.javathinker.org<BR>如果转载，请标明出处，谢谢<BR></FONT></P></TD></TR>
<TR>
<TD width="94%">
<P><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#11"><FONT color=#999999>1.1 Hibernate API 变化 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#111"><FONT color=#999999>1.1.1 包名 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#112"><FONT color=#999999>1.1.2 org.hibernate.classic包 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#113"><FONT color=#999999>1.1.3 Hibernate所依赖的第三方软件包</FONT></A> <BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#114"><FONT color=#999999>1.1.4 异常模型 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#115"><FONT color=#999999>1.1.5 Session接口</FONT></A> <BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#116"><FONT color=#999999>1.1.6 createSQLQuery() </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#117"><FONT color=#999999>1.1.7 Lifecycle 和 Validatable 接口 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#118"><FONT color=#999999>1.1.8 Interceptor接口 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#119"><FONT color=#999999>1.1.9 UserType和CompositeUserType接口 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1110"><FONT color=#999999>1.1.10 FetchMode类 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1111"><FONT color=#999999>1.1.11 PersistentEnum类 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1112"><FONT color=#999999>1.1.12 对Blob 和Clob的支持 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1113"><FONT color=#999999>1.1.13 Hibernate中供扩展的API的变化 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#12"><FONT color=#999999>1.2 元数据的变化 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#121"><FONT color=#999999>1.2.1 检索策略 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#122"><FONT color=#999999>1.2.2 对象标识符的映射 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#123"><FONT color=#999999>1.2.3 集合映射 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#124"><FONT color=#999999>1.2.4 DTD</FONT></A> <BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#13"><FONT color=#999999>1.3 查询语句的变化 </FONT></A><BR><A href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#131"><FONT color=#999999>1.3.1 indices()和elements()函数</FONT></A> </P>
<P><BR>尽管Hibernate 3.0 与Hibernate2.1的源代码是不兼容的，但是当Hibernate开发小组在设计Hibernate3.0时，为简化升级Hibernate版本作了周到的考虑。对于现有的基于Hibernate2.1的Java项目，可以很方便的把它升级到Hibernate3.0。<BR><BR>本文描述了Hibernate3.0版本的新变化，Hibernate3.0版本的变化包括三个方面：<BR>（1）API的变化，它将影响到Java程序代码。<BR>（2）元数据，它将影响到对象-关系映射文件。<BR>（3）HQL查询语句。<BR><BR>值得注意的是， Hibernate3.0并不会完全取代Hibernate2.1。在同一个应用程序中，允许Hibernate3.0和Hibernate2.1并存。<BR><BR><A name=11></A>1.1 Hibernate API 变化<BR><BR><A name=111></A>1.1.1 包名<BR><BR>Hibernate3.0的包的根路径为: “org.hibernate” ，而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同时在同一个应用程序中运行。<BR><BR>如果希望把已有的应用升级到Hibernate3.0，那么升级的第一步是把Java源程序中的所有“net.sf.hibernate”替换为“org.hibernate”。<BR><BR>Hibernate2.1中的“net.sf.hibernate.expression”包被改名为“org.hibernate.criterion”。假如应用程序使用了Criteria API，那么在升级的过程中，必须把Java源程序中的所有“net.sf.hibernate.expression”替换为“org.hibernate.criterion”。<BR><BR>如果应用使用了除Hibernate以外的其他外部软件，而这个外部软件又引用了Hibernate的接口，那么在升级时必须十分小心。例如EHCache拥有自己的CacheProvider： net.sf.ehcache.hibernate.Provider，在这个类中引用了Hibernate2.1中的接口，在升级应用时，可以采用以下办法之一来升级EHCache:<BR><BR>（1）手工修改net.sf.ehcache.hibernate.Provider类，使它引用Hibernate3.0中的接口。<BR>（2）等到EHCache软件本身升级为使用Hibernate3.0后，使用新的EHCache软件。<BR>（3）使用Hibernate3.0中内置的CacheProvider：org.hibernate.cache.EhCacheProvider。<BR><BR><A name=112></A>1.1.2 org.hibernate.classic包<BR><BR>Hibernate3.0把一些被废弃的接口都转移到org.hibernate.classic中。<BR><BR><A name=113></A>1.1.3 Hibernate所依赖的第三方软件包<BR><BR>在Hibernate3.0的软件包的lib目录下的README.txt文件中，描述了Hibernate3.0所依赖的第三方软件包的变化。<BR><BR><A name=114></A>1.1.4 异常模型<BR><BR>在Hibernate3.0中，HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException。因此在编译时，编译器不会再检查HibernateException。<BR><BR><A name=115></A>1.1.5 Session接口<BR><BR>在Hibernate3.0中，原来Hibernate2.1的Session接口中的有些基本方法也被废弃，但为了简化升级，这些方法依然是可用的，可以通过org.hibernate.classic.Session子接口来访问它们，例如：<BR></P>
<P><FONT size=2>org.hibernate.classic.Session session=sessionFactory.openSession();<BR>session.delete("delete from Customer ");<BR></FONT></P>
<P>在Hibernate3.0中，org.hibernate.classic.Session接口继承了org.hibernate.Session接口，在org.hibernate.classic.Session接口中包含了一系列被废弃的方法，如find()、interate()等。SessionFactory接口的openSession()方法返回org.hibernate.classic.Session类型的实例。如果希望在程序中完全使用Hibernate3.0，可以采用以下方式创建Session实例：<BR><BR><FONT size=2>org.hibernate.Session session=sessionFactory.openSession();</FONT><BR><BR>如果是对已有的程序进行简单的升级，并且希望仍然调用Hibernate2.1中Session的一些接口，可以采用以下方式创建Session实例：<BR><BR><FONT size=2>org.hibernate.classic.Session session=sessionFactory.openSession();</FONT><BR><BR>在Hibernate3.0中，Session接口中被废弃的方法包括：<BR>* 执行查询的方法：find()、iterate()、filter()和delete(String hqlSelectQuery) <BR>* saveOrUpdateCopy()<BR><BR>Hibernate3.0一律采用createQuery()方法来执行所有的查询语句，采用DELETE 查询语句来执行批量删除，采用merge()方法来替代 saveOrUpdateCopy()方法。</P>
<P><BR><I>提示：在Hibernate2.1中，Session的delete()方法有几种重载形式，其中参数为HQL查询语句的delete()方法在Hibernate3.0中被废弃，而参数为Ojbect类型的的delete()方法依然被支持。delete(Object o)方法用于删除参数指定的对象，该方法支持级联删除。</I></P>
<P>Hibernate2.1没有对批量更新和批量删除提供很好的支持，参见&lt;&lt;精通Hibernate&gt;&gt;一书的第13章的13.1.1节（批量更新和批量删除），而Hibernate3.0对批量更新和批量删除提供了支持，能够直接执行批量更新或批量删除语句，无需把被更新或删除的对象先加载到内存中。以下是通过Hibernate3.0执行批量更新的程序代码：</P>
<P><FONT size=2>Session session = sessionFactory.openSession();<BR>Transaction tx = session.beginTransaction();</FONT></P>
<P><FONT size=2>String hqlUpdate = "update Customer set name = :newName where name = :oldName";<BR>int updatedEntities = s.createQuery( hqlUpdate )<BR>.setString( "newName", newName )<BR>.setString( "oldName", oldName )<BR>.executeUpdate();<BR>tx.commit();<BR>session.close();</FONT></P>
<P>以下是通过Hibernate3.0执行批量删除的程序代码：</P>
<P><FONT size=2>Session session = sessionFactory.openSession();<BR>Transaction tx = session.beginTransaction();</FONT></P>
<P><FONT size=2>String hqlDelete = "delete Customer where name = :oldName";<BR>int deletedEntities = s.createQuery( hqlDelete )<BR>.setString( "oldName", oldName )<BR>.executeUpdate();<BR>tx.commit();<BR>session.close();</FONT><BR><BR><A name=116></A>1.1.6 createSQLQuery()<BR><BR>在Hibernate3.0中，Session接口的createSQLQuery()方法被废弃，被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能。<BR><BR><A name=117></A>1.1.7 Lifecycle 和 Validatable 接口<BR><BR>Lifecycle和Validatable 接口被废弃，并且被移到org.hibernate.classic包中。<BR><BR><A name=118></A>1.1.8 Interceptor接口<BR><BR>在Interceptor 接口中加入了两个新的方法。 用户创建的Interceptor实现类在升级的过程中，需要为这两个新方法提供方法体为空的实现。此外，instantiate()方法的参数作了修改，isUnsaved()方法被改名为isTransient()。<BR><BR><A name=119></A>1.1.9 UserType和CompositeUserType接口<BR><BR>在UserType和CompositeUserType接口中都加入了一些新的方法，这两个接口被移到org.hibernate.usertype包中，用户定义的UserType和CompositeUserType实现类必须实现这些新方法。</P>
<P>Hibernate3.0提供了ParameterizedType接口，用于更好的重用用户自定义的类型。</P>
<P><A name=1110></A>1.1.10 FetchMode类<BR><BR>FetchMode.LAZY 和 FetchMode.EAGER被废弃。取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN。<BR><BR><A name=1111></A>1.1.11 PersistentEnum类<BR><BR>PersistentEnum被废弃并删除。已经存在的应用应该采用UserType来处理枚举类型。<BR><BR><A name=1112></A>1.1.12 对Blob 和Clob的支持<BR><BR>Hibernate对Blob和Clob实例进行了包装，使得那些拥有Blob或Clob类型的属性的类的实例可以被游离、序列化或反序列化，以及传递到merge()方法中。<BR><BR><A name=1113></A>1.1.13 Hibernate中供扩展的API的变化<BR><BR>org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 包的结构和实现发生了重大的变化。多数基于Hibernate <BR>2.1 的应用不依赖于这些包，因此不会被影响。如果你的应用扩展了这些包中的类，那么必须非常小心的对受影响的程序代码进行升级。<BR><BR><A name=12></A>1.2 元数据的变化<BR><BR><A name=121></A>1.2.1 检索策略<BR><BR>在Hibernate2.1中，lazy属性的默认值为“false”，而在Hibernate3.0中，lazy属性的默认值为“true”。在升级映射文件时，如果原来的映射文件中的有关元素，如&lt;set&gt;、&lt;class&gt;等没有显式设置lazy属性，那么必须把它们都显式的设置为lazy=“true”。如果觉得这种升级方式很麻烦，可以采取另一简单的升级方式：在&lt;hibernate-mapping&gt;元素中设置: default-lazy=“false”。 <BR><BR><A name=122></A>1.2.2 对象标识符的映射<BR><BR>unsaved-value属性是可选的，在多数情况下，Hibernate3.0将把unsaved-value="0" 作为默认值。<BR><BR>在Hibernate3.0中，当使用自然主键和游离对象时，不再强迫实现Interceptor.isUnsaved()方法。 如果没有设置这个方法，当Hibernate3.0无法区分对象的状态时，会查询数据库，来判断这个对象到底是临时对象，还是游离对象。不过，显式的使用Interceptor.isUnsaved()方法会获得更好的性能，因为这可以减少Hibernate直接访问数据库的次数。<BR><BR><A name=123></A>1.2.3 集合映射<BR><BR>&lt;index&gt;元素在某些情况下被&lt;list-index&gt;和&lt;map-key&gt;元素替代。此外，Hibernate3.0用&lt;map-key-many-to-many&gt; 元素来替代原来的&lt;key-many-to-many&gt;.元素，用&lt;composite-map-key&gt;元素来替代原来的&lt;composite-index&gt;元素。<BR><BR><A name=124></A>1.2.4 DTD<BR><BR>对象-关系映射文件中的DTD文档，由原来的：<BR>http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd <BR>改为：<BR>http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd<BR><BR><A name=13></A>1.3 查询语句的变化<BR><BR>Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器，不过，Hibernate2.1的查询翻译器也依然存在。在Hibernate的配置文件中，hibernate.query.factory_class属性用来选择查询翻译器。例如：<BR>（1）选择Hibernate3.0的查询翻译器：<BR>hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory<BR>（2）选择Hibernate2.1的查询翻译器<BR>hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory</P>
<P><BR><I>提示：ANTLR是用纯Java语言编写出来的一个编译工具，它可生成Java语言或者是C++的词法和语法分析器，并可产生语法分析树并对该树进行遍历。ANTLR由于是纯Java的，因此可以安装在任意平台上，但是需要JDK的支持。</I></P>
<P>Hibernate开发小组尽力保证Hibernate3.0的查询翻译器能够支持Hibernate2.1的所有查询语句。不过，对于许多已经存在的应用，在升级过程中，也不妨仍然使用Hibernate2.1的查询翻译器。<BR>值得注意的是， Hibernate3.0的查询翻译器存在一个Bug：不支持某些theta-style连结查询方言：如Oracle8i的OracleDialect方言、Sybase11Dialect。解决这一问题的办法有两种：（1）改为使用支持ANSI-style连结查询的方言，如 Oracle9Dialect,（2）如果升级的时候遇到这一问题，那么还是改为使用Hibernate2.1的查询翻译器。<BR><BR><A name=131></A>1.3.1 indices()和elements()函数<BR><BR>在HQL的select子句中废弃了indices()和elements()函数，因为这两个函数的语法很让用户费解，可以用显式的连接查询语句来替代 select elements(...) 。而在HQL的where子句中，仍然可以使用elements()函数。<BR></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/wadise/aggbug/33114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-03-02 08:55 <a href="http://www.blogjava.net/wadise/archive/2006/03/02/33114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse概括</title><link>http://www.blogjava.net/wadise/archive/2005/12/20/24782.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Tue, 20 Dec 2005 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/20/24782.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24782.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/20/24782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24782.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以启动多个</SPAN><SPAN lang=EN-US>java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程，并对</SPAN><SPAN lang=EN-US>java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程的运行状况进行监控，这些都有几个主要框架合作完成</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=1>其中包括：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>org.eclipse.jdt.launch</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US>java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序启动框架</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>org.eclipse.debug.core</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：除</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身进程外，其他进程的核心运行态</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>org.eclipse.core.runtime</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：提供对运行期的进程的监控及</SPAN><SPAN lang=EN-US>Runtime</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>jdt</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>launch</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架中，</SPAN><SPAN lang=EN-US>internal.launching</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包是</SPAN><SPAN lang=EN-US>launching</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包的实现</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>launching</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包中的</SPAN><SPAN lang=EN-US>AbstractVMRunner</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，是各种</SPAN><SPAN lang=EN-US>VM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的主要基类，它将进程推入到</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>debug</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架，以便在其中执行</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>VMRunner</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>run(VMRunnerConfiguration config, ILaunch launch, IProgressMonitor monitor)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>AbstractVMRunner</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现类中，将实现其继承自</SPAN><SPAN lang=EN-US>IVMRunner</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>run(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">…</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法以便生成</SPAN><SPAN lang=EN-US>java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程并使用</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>debug</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架中的</SPAN><SPAN lang=EN-US>IProcess</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行包装，</SPAN><SPAN lang=EN-US>IProcess</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示一个</SPAN><SPAN lang=EN-US>java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程是以</SPAN><SPAN lang=EN-US>normal</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行态而不是以</SPAN><SPAN lang=EN-US>Debug</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">状态运行，同时启动传入的</SPAN><SPAN lang=EN-US>IProgressMonitor</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成子监控器（</SPAN><SPAN lang=EN-US>SubProgressMonitor</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）对包装后的</SPAN><SPAN lang=EN-US>IProcess</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行监控。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">真正的启动操作，则是在</SPAN><SPAN lang=EN-US>Eclispe</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>debug.core</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US>DebugPlugin</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US>exec</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法中</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=1>也就两行代码：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if (workingDirectory == null) {</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1><SPAN style="mso-spacerun: yes">&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; </SPAN>p= Runtime.getRuntime().exec(cmdLine, envp);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} else {</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1><SPAN style="mso-spacerun: yes">&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; </SPAN>p= Runtime.getRuntime().exec(cmdLine, envp, workingDirectory);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=1>而其余的就全都是监控了</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而启动的过程，则是在</SPAN><SPAN lang=EN-US>launching</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包中的</SPAN><SPAN lang=EN-US>JavaLaunchDelegate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类中，就只有一个方法</SPAN><SPAN lang=EN-US>launch</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=1>包括设置环境变量、监控器、文件目录验证等等都在这了</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">声明一个空的工作区，在命令行加入</SPAN><SPAN lang=EN-US>-data newworkspace</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>PDE(Plug-In Development Environment</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插件开发环境</SPAN><SPAN lang=EN-US>), JDT(Java Development Tool<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发工具</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的层次结构</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><FONT size=1><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></FONT></v:shapetype></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;<IMG height=294 alt=eclipse1.JPG src="http://www.blogjava.net/images/blogjava_net/wadise/6080/eclipse1.JPG" width=637 border=0></FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1>PDE:</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1>Plugin.xml:</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>id</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性是全局唯一的插件标识，最好用包名来表示。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>name</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性是方便人阅读的插件名称。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每个按钮背后都有一个</SPAN><SPAN lang=EN-US>Action</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象提供支持，当按钮被按下时，这个对象就被调用。工具栏中的按钮被分为多个组，每个组叫做一个动作集</SPAN><SPAN lang=EN-US>(action set)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果动作要让以按钮的形式出现，就必须将其与工具栏路径相关联，在</SPAN><SPAN lang=EN-US>action</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加入</SPAN><SPAN lang=EN-US>toolbarPath=”helloGroup”</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果有别的动作已经放到</SPAN><SPAN lang=EN-US>helloGroup</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具栏的栏目中时，我们新加入的将会出现在那个按钮的旁边。如果以前没有</SPAN><SPAN lang=EN-US>helloGroup,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则会建立一个</SPAN><SPAN lang=EN-US>helloGroup</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具栏栏目。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;<IMG height=206 alt=eclipse2.JPG src="http://www.blogjava.net/images/blogjava_net/wadise/6080/eclipse2.JPG" width=502 border=0></FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=1></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动时会将所有的插件清单文件读入一个插件注册表中，为每个插件创建一个投影。此时插件本身不会被加载，只加载它们的描述信息，调用</SPAN><SPAN lang=EN-US>Platform</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</SPAN><SPAN lang=EN-US>getPluginRegistry()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法就可以得到这个投影世界的内容。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动作必须实现的接口是</SPAN><SPAN lang=EN-US>IworkbenchWindowDelegate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而当你要为工作台里的一个</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象增加一个动作时，你必须实现</SPAN><SPAN lang=EN-US>IobjectActiveDelegate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口。</SPAN></FONT></P><img src ="http://www.blogjava.net/wadise/aggbug/24782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-20 14:12 <a href="http://www.blogjava.net/wadise/archive/2005/12/20/24782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RBAC</title><link>http://www.blogjava.net/wadise/archive/2005/12/20/24739.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Tue, 20 Dec 2005 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/20/24739.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24739.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/20/24739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24739.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>1.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>RBAC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引入</SPAN><SPAN lang=EN-US>Role</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的概念是为了隔离</SPAN><SPAN lang=EN-US>User</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</SPAN><SPAN lang=EN-US>Privilege(Operation+Resource)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因为业务中的</SPAN><SPAN lang=EN-US>User</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是经常变化的，例如当某公司的普通员工都具有查看，删除，编辑公司部门内部的资料时，那么有一天我想使普通员工不具备删除部门内部资料的权限，那么我们就要对每一个普通员工进行删除这个权限，使得管理起来非常不便，引入</SPAN><SPAN lang=EN-US>Role</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把员工</SPAN><SPAN lang=EN-US>Role</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指派给普通员工，那么只要在员工</SPAN><SPAN lang=EN-US>Role</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中删除“删除部门资料”的权限，就可以对所有普通员工生效。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>2.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">角色继承用于解决复杂组织结构之间的权限关系。例如：</SPAN></FONT><SPAN lang=EN-US><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><FONT size=1> <BR><IMG height=72 alt=rbac.JPG src="http://www.blogjava.net/images/blogjava_net/wadise/6080/rbac.JPG" width=523 border=0><BR><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></FONT></v:shapetype></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那么部门主管就具有了</SPAN><SPAN lang=EN-US>A,B</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">权限，部门经理就具有了</SPAN><SPAN lang=EN-US>ABC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">权限，总经理有</SPAN><SPAN lang=EN-US>ABCD</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">权限。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=1>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US>3.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">职责关系分离：避免两个角色间的冲突。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>A. SSD</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">静态职责分离：当角色授给用户时判断是否将冲突的角色给了同一个用户。冲突的角色被定义为一个二元关系，即任何一个用户只能拥有其中的一个。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=1><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>B. DSD</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态职责分离：角色授给用户时可以把冲突角色授于同一个人，但在一次行为中不能同时扮演两个冲突的角色。</SPAN></FONT></P><img src ="http://www.blogjava.net/wadise/aggbug/24739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-20 11:46 <a href="http://www.blogjava.net/wadise/archive/2005/12/20/24739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码生成器插件开发---生成GEF的图形编辑器(4) </title><link>http://www.blogjava.net/wadise/archive/2005/12/19/24622.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Mon, 19 Dec 2005 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/19/24622.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24622.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/19/24622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24622.html</trackback:ping><description><![CDATA[<FONT size=1>在前面我们已经可以自动生成一个文件并自动进入编辑状态，但是不是图形界面。而我们的代码生成器使用的是可视化图形界面。还记得我们上一篇生成的那个文件后缀名吗？对，是.cg，那么要使得打开后缀名为cg文件时进入我们自定义的编辑环境中，只需在plugin.xml中加入： </FONT>
<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"><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN></FONT><FONT size=1><SPAN style="COLOR: #800000">extension<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">point</SPAN><SPAN style="COLOR: #0000ff">="org.eclipse.ui.editors"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>&lt;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #800000">editor<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">default</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN></FONT><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="com.hymake.hyplat.hycodegen.editor.CgEditor"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contributorClass</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="com.hymake.hyplat.hycodegen.editor.CgEditorContributor"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extensions</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="cg"-----------------<FONT color=#ff1493>这里是要编辑的文件后缀名</FONT></FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="icons/logo1.png"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="com.hymake.hyplat.hycodegen.editor.CgEditor"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">="代码生成编辑器"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">extension</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT></DIV><BR><FONT size=1>而CgEditor则要继承GraphicalEditorWithPalette，代码如下： </FONT>
<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"><FONT size=1><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG id=Codehighlighter1_57_2279_Open_Image onclick="this.style.display='none'; Codehighlighter1_57_2279_Open_Text.style.display='none'; Codehighlighter1_57_2279_Closed_Image.style.display='inline'; Codehighlighter1_57_2279_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_57_2279_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_2279_Closed_Text.style.display='none'; Codehighlighter1_57_2279_Open_Image.style.display='inline'; Codehighlighter1_57_2279_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CgEditor&nbsp;</SPAN><SPAN style="COLOR: #0000ff">extends</SPAN><SPAN style="COLOR: #000000">&nbsp;GraphicalEditorWithPalette&nbsp;</SPAN><SPAN id=Codehighlighter1_57_2279_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_57_2279_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;dirty;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_91_113_Open_Image onclick="this.style.display='none'; Codehighlighter1_91_113_Open_Text.style.display='none'; Codehighlighter1_91_113_Closed_Image.style.display='inline'; Codehighlighter1_91_113_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_91_113_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_91_113_Closed_Text.style.display='none'; Codehighlighter1_91_113_Open_Image.style.display='inline'; Codehighlighter1_91_113_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_91_113_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN></FONT><SPAN id=Codehighlighter1_91_113_Open_Text><SPAN style="COLOR: #008000"><FONT size=1>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>&nbsp;5</FONT></SPAN><FONT size=1><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造函数<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_137_218_Open_Image onclick="this.style.display='none'; Codehighlighter1_137_218_Open_Text.style.display='none'; Codehighlighter1_137_218_Closed_Image.style.display='inline'; Codehighlighter1_137_218_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_137_218_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_137_218_Closed_Text.style.display='none'; Codehighlighter1_137_218_Open_Image.style.display='inline'; Codehighlighter1_137_218_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;CgEditor()&nbsp;</SPAN><SPAN id=Codehighlighter1_137_218_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_137_218_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirty&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setEditDomain(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DefaultEditDomain(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">));<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>11</FONT></SPAN><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_225_316_Open_Image onclick="this.style.display='none'; Codehighlighter1_225_316_Open_Text.style.display='none'; Codehighlighter1_225_316_Closed_Image.style.display='inline'; Codehighlighter1_225_316_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_225_316_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_225_316_Closed_Text.style.display='none'; Codehighlighter1_225_316_Open_Image.style.display='inline'; Codehighlighter1_225_316_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_225_316_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN></FONT><SPAN id=Codehighlighter1_225_316_Open_Text><SPAN style="COLOR: #008000"><FONT size=1>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN></FONT><FONT size=1><SPAN style="COLOR: #008000">&nbsp;org.eclipse.gef.ui.parts.GraphicalEditorWithPalette#getPaletteRoot()<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_361_1703_Open_Image onclick="this.style.display='none'; Codehighlighter1_361_1703_Open_Text.style.display='none'; Codehighlighter1_361_1703_Closed_Image.style.display='inline'; Codehighlighter1_361_1703_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_361_1703_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_361_1703_Closed_Text.style.display='none'; Codehighlighter1_361_1703_Open_Image.style.display='inline'; Codehighlighter1_361_1703_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;PaletteRoot&nbsp;getPaletteRoot()&nbsp;</SPAN><SPAN id=Codehighlighter1_361_1703_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_361_1703_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteRoot&nbsp;root&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;PaletteRoot();<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;toolGroup&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;PaletteGroup(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">代码生成器</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.eclipse.gef.palette.ToolEntry&nbsp;tool&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;SelectionToolEntry();<BR></SPAN><SPAN style="COLOR: #008080">19</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolGroup.add(tool);<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.setDefaultEntry(tool);<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tool&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;MarqueeToolEntry();<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolGroup.add(tool);<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteDrawer&nbsp;drawer&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;PaletteDrawer(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">类</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">24</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.eclipse.jface.resource.ImageDescriptor&nbsp;descriptor&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;ImageFactory<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getImageDescriptor(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">table.gif</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreationToolEntry&nbsp;creationEntry&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CreationToolEntry(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">新建一个表</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">,<BR></SPAN><SPAN style="COLOR: #008080">27</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&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">新建一个表</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SimpleFactory(Table.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">),&nbsp;descriptor,&nbsp;descriptor);<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawer.add(creationEntry);<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;descriptor&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ImageFactory.getImageDescriptor(</SPAN><SPAN style="COLOR: #000000">"column</SPAN><SPAN style="COLOR: #000000">.gif</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">30</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;creationEntry&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CreationToolEntry(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">新建一个行</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">新建一个行</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">,<BR></SPAN><SPAN style="COLOR: #008080">31</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&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;SimpleFactory(Column.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">),&nbsp;descriptor,&nbsp;descriptor);<BR></SPAN><SPAN style="COLOR: #008080">32</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawer.add(creationEntry);<BR></SPAN><SPAN style="COLOR: #008080">33</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;descriptor&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ImageFactory.getImageDescriptor(</SPAN><SPAN style="COLOR: #000000">"connection</SPAN><SPAN style="COLOR: #000000">.gif</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">34</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionCreationToolEntry&nbsp;connxCreationEntry&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;ConnectionCreationToolEntry(<BR></SPAN><SPAN style="COLOR: #008080">35</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&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">新建一个连接</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">新建一个连接</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SimpleFactory(Reference.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">),<BR></SPAN><SPAN style="COLOR: #008080">36</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;descriptor,&nbsp;descriptor);<BR></SPAN><SPAN style="COLOR: #008080">37</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawer.add(connxCreationEntry);<BR></SPAN><SPAN style="COLOR: #008080">38</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(toolGroup);<BR></SPAN><SPAN style="COLOR: #008080">39</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(drawer);<BR></SPAN><SPAN style="COLOR: #008080">40</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">&nbsp;root;<BR></SPAN><SPAN style="COLOR: #008080">41</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>42</FONT></SPAN><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">43</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">44</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">45</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_1712_1803_Open_Image onclick="this.style.display='none'; Codehighlighter1_1712_1803_Open_Text.style.display='none'; Codehighlighter1_1712_1803_Closed_Image.style.display='inline'; Codehighlighter1_1712_1803_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1712_1803_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1712_1803_Closed_Text.style.display='none'; Codehighlighter1_1712_1803_Open_Image.style.display='inline'; Codehighlighter1_1712_1803_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1712_1803_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN></FONT><SPAN id=Codehighlighter1_1712_1803_Open_Text><SPAN style="COLOR: #008000"><FONT size=1>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">46</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN></FONT><FONT size=1><SPAN style="COLOR: #008000">&nbsp;org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer()<BR></SPAN><SPAN style="COLOR: #008080">47</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">48</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_1852_1858_Open_Image onclick="this.style.display='none'; Codehighlighter1_1852_1858_Open_Text.style.display='none'; Codehighlighter1_1852_1858_Closed_Image.style.display='inline'; Codehighlighter1_1852_1858_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1852_1858_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1852_1858_Closed_Text.style.display='none'; Codehighlighter1_1852_1858_Open_Image.style.display='inline'; Codehighlighter1_1852_1858_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;initializeGraphicalViewer()&nbsp;</SPAN><SPAN id=Codehighlighter1_1852_1858_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_1852_1858_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">49</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>50</FONT></SPAN><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">51</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_1865_1968_Open_Image onclick="this.style.display='none'; Codehighlighter1_1865_1968_Open_Text.style.display='none'; Codehighlighter1_1865_1968_Closed_Image.style.display='inline'; Codehighlighter1_1865_1968_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1865_1968_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1865_1968_Closed_Text.style.display='none'; Codehighlighter1_1865_1968_Open_Image.style.display='inline'; Codehighlighter1_1865_1968_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1865_1968_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN></FONT><SPAN id=Codehighlighter1_1865_1968_Open_Text><SPAN style="COLOR: #008000"><FONT size=1>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">52</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN></FONT><FONT size=1><SPAN style="COLOR: #008000">&nbsp;org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)<BR></SPAN><SPAN style="COLOR: #008080">53</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">54</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2019_2025_Open_Image onclick="this.style.display='none'; Codehighlighter1_2019_2025_Open_Text.style.display='none'; Codehighlighter1_2019_2025_Closed_Image.style.display='inline'; Codehighlighter1_2019_2025_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2019_2025_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2019_2025_Closed_Text.style.display='none'; Codehighlighter1_2019_2025_Open_Image.style.display='inline'; Codehighlighter1_2019_2025_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doSave(IProgressMonitor&nbsp;monitor)&nbsp;</SPAN><SPAN id=Codehighlighter1_2019_2025_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_2019_2025_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">55</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>56</FONT></SPAN><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">57</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2032_2096_Open_Image onclick="this.style.display='none'; Codehighlighter1_2032_2096_Open_Text.style.display='none'; Codehighlighter1_2032_2096_Closed_Image.style.display='inline'; Codehighlighter1_2032_2096_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2032_2096_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2032_2096_Closed_Text.style.display='none'; Codehighlighter1_2032_2096_Open_Image.style.display='inline'; Codehighlighter1_2032_2096_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2032_2096_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN></FONT><SPAN id=Codehighlighter1_2032_2096_Open_Text><SPAN style="COLOR: #008000"><FONT size=1>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">58</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN></FONT><FONT size=1><SPAN style="COLOR: #008000">&nbsp;org.eclipse.ui.part.EditorPart#doSaveAs()<BR></SPAN><SPAN style="COLOR: #008080">59</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">60</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2125_2131_Open_Image onclick="this.style.display='none'; Codehighlighter1_2125_2131_Open_Text.style.display='none'; Codehighlighter1_2125_2131_Closed_Image.style.display='inline'; Codehighlighter1_2125_2131_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2125_2131_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2125_2131_Closed_Text.style.display='none'; Codehighlighter1_2125_2131_Open_Image.style.display='inline'; Codehighlighter1_2125_2131_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doSaveAs()&nbsp;</SPAN><SPAN id=Codehighlighter1_2125_2131_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_2125_2131_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">61</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>62</FONT></SPAN><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">63</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2138_2209_Open_Image onclick="this.style.display='none'; Codehighlighter1_2138_2209_Open_Text.style.display='none'; Codehighlighter1_2138_2209_Closed_Image.style.display='inline'; Codehighlighter1_2138_2209_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2138_2209_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2138_2209_Closed_Text.style.display='none'; Codehighlighter1_2138_2209_Open_Image.style.display='inline'; Codehighlighter1_2138_2209_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2138_2209_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN></FONT><SPAN id=Codehighlighter1_2138_2209_Open_Text><SPAN style="COLOR: #008000"><FONT size=1>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">64</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN></FONT><FONT size=1><SPAN style="COLOR: #008000">&nbsp;org.eclipse.ui.part.EditorPart#isSaveAsAllowed()<BR></SPAN><SPAN style="COLOR: #008080">65</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=1><SPAN style="COLOR: #008080">66</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2248_2276_Open_Image onclick="this.style.display='none'; Codehighlighter1_2248_2276_Open_Text.style.display='none'; Codehighlighter1_2248_2276_Closed_Image.style.display='inline'; Codehighlighter1_2248_2276_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2248_2276_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2248_2276_Closed_Text.style.display='none'; Codehighlighter1_2248_2276_Open_Image.style.display='inline'; Codehighlighter1_2248_2276_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN><SPAN style="COLOR: #000000">&nbsp;isSaveAsAllowed()&nbsp;</SPAN><SPAN id=Codehighlighter1_2248_2276_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_2248_2276_Open_Text><FONT size=1><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">67</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN></FONT><FONT size=1><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">68</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"><FONT size=1>69</FONT></SPAN><FONT size=1><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">70</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></FONT></SPAN></DIV><FONT size=1>这样出来的图如下：<BR><IMG height=497 alt=editor1.JPG src="http://www.blogjava.net/images/blogjava_net/wadise/6080/editor1.JPG" width=568 border=0><BR>接下来我们就要对这些Action进行相应的代码编写完成指定的工作。<BR>友情小贴士：<BR>&nbsp;&nbsp; 1.在构造函数中一定要指定<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setEditDomain(new DefaultEditDomain(this));才能调用getPaletteRoot并把视图显示出来。</FONT><img src ="http://www.blogjava.net/wadise/aggbug/24622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-19 13:20 <a href="http://www.blogjava.net/wadise/archive/2005/12/19/24622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码生成器插件开发---文件自动生成并编辑(3) </title><link>http://www.blogjava.net/wadise/archive/2005/12/19/24578.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Mon, 19 Dec 2005 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/19/24578.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24578.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/19/24578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24578.html</trackback:ping><description><![CDATA[<FONT size=1>在上面的2篇中，已经可以生成一个项目，但是如果想要生成完该项目并自动转入图形编辑状态，什么办呢？<BR>本篇将讲述这个制作过程。<BR>1.在Create完Project后，添加一个函数用来生成指定文件并自动进入编辑状态。
<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: #008080">&nbsp;1</SPAN><IMG id=Codehighlighter1_4_45_Open_Image onclick="this.style.display='none'; Codehighlighter1_4_45_Open_Text.style.display='none'; Codehighlighter1_4_45_Closed_Image.style.display='inline'; Codehighlighter1_4_45_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_4_45_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_45_Closed_Text.style.display='none'; Codehighlighter1_4_45_Open_Image.style.display='inline'; Codehighlighter1_4_45_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_4_45_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_4_45_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据文件名生成一个文件并自动打开处之于编辑状态<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doFinish(<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName,<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IProgressMonitor&nbsp;monitor)<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_162_1065_Open_Image onclick="this.style.display='none'; Codehighlighter1_162_1065_Open_Text.style.display='none'; Codehighlighter1_162_1065_Closed_Image.style.display='inline'; Codehighlighter1_162_1065_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_162_1065_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_162_1065_Closed_Text.style.display='none'; Codehighlighter1_162_1065_Open_Image.style.display='inline'; Codehighlighter1_162_1065_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throws</SPAN><SPAN style="COLOR: #000000">&nbsp;CoreException&nbsp;</SPAN><SPAN id=Codehighlighter1_162_1065_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_162_1065_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">final</SPAN><SPAN style="COLOR: #000000">&nbsp;IFile&nbsp;file&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_newProject.getFile(fileName);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_234_509_Open_Image onclick="this.style.display='none'; Codehighlighter1_234_509_Open_Text.style.display='none'; Codehighlighter1_234_509_Closed_Image.style.display='inline'; Codehighlighter1_234_509_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_234_509_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_509_Closed_Text.style.display='none'; Codehighlighter1_234_509_Open_Image.style.display='inline'; Codehighlighter1_234_509_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_234_509_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_234_509_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;stream&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;openContentStream();<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_321_398_Open_Image onclick="this.style.display='none'; Codehighlighter1_321_398_Open_Text.style.display='none'; Codehighlighter1_321_398_Closed_Image.style.display='inline'; Codehighlighter1_321_398_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_321_398_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_321_398_Closed_Text.style.display='none'; Codehighlighter1_321_398_Open_Image.style.display='inline'; Codehighlighter1_321_398_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(file.exists())&nbsp;</SPAN><SPAN id=Codehighlighter1_321_398_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_321_398_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.setContents(stream,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,&nbsp;monitor);<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_405_471_Open_Image onclick="this.style.display='none'; Codehighlighter1_405_471_Open_Text.style.display='none'; Codehighlighter1_405_471_Closed_Image.style.display='inline'; Codehighlighter1_405_471_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_405_471_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_405_471_Closed_Text.style.display='none'; Codehighlighter1_405_471_Open_Image.style.display='inline'; Codehighlighter1_405_471_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_405_471_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_405_471_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.create(stream,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,&nbsp;monitor);<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.close();<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_533_543_Open_Image onclick="this.style.display='none'; Codehighlighter1_533_543_Open_Text.style.display='none'; Codehighlighter1_533_543_Closed_Image.style.display='inline'; Codehighlighter1_533_543_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_533_543_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_533_543_Closed_Text.style.display='none'; Codehighlighter1_533_543_Open_Image.style.display='inline'; Codehighlighter1_533_543_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_533_543_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_533_543_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor.worked(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor.setTaskName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">正在打开文件并编辑。。。。</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_675_1030_Open_Image onclick="this.style.display='none'; Codehighlighter1_675_1030_Open_Text.style.display='none'; Codehighlighter1_675_1030_Closed_Image.style.display='inline'; Codehighlighter1_675_1030_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_675_1030_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_675_1030_Closed_Text.style.display='none'; Codehighlighter1_675_1030_Open_Image.style.display='inline'; Codehighlighter1_675_1030_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getShell().getDisplay().asyncExec(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Runnable()&nbsp;</SPAN><SPAN id=Codehighlighter1_675_1030_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_675_1030_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_707_1020_Open_Image onclick="this.style.display='none'; Codehighlighter1_707_1020_Open_Text.style.display='none'; Codehighlighter1_707_1020_Closed_Image.style.display='inline'; Codehighlighter1_707_1020_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_707_1020_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_707_1020_Closed_Text.style.display='none'; Codehighlighter1_707_1020_Open_Image.style.display='inline'; Codehighlighter1_707_1020_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;run()&nbsp;</SPAN><SPAN id=Codehighlighter1_707_1020_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_707_1020_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IWorkbenchPage&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">24</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_857_958_Open_Image onclick="this.style.display='none'; Codehighlighter1_857_958_Open_Text.style.display='none'; Codehighlighter1_857_958_Closed_Image.style.display='inline'; Codehighlighter1_857_958_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_857_958_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_857_958_Closed_Text.style.display='none'; Codehighlighter1_857_958_Open_Image.style.display='inline'; Codehighlighter1_857_958_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_857_958_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_857_958_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008080">27</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDE.openEditor(page,&nbsp;file,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_988_1006_Open_Image onclick="this.style.display='none'; Codehighlighter1_988_1006_Open_Text.style.display='none'; Codehighlighter1_988_1006_Closed_Image.style.display='inline'; Codehighlighter1_988_1006_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_988_1006_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_988_1006_Closed_Text.style.display='none'; Codehighlighter1_988_1006_Open_Image.style.display='inline'; Codehighlighter1_988_1006_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(PartInitException&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_988_1006_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_988_1006_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">30</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">31</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">32</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor.worked(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">33</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR>2. 往文件中加入初始内容：
<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: #008080">1</SPAN><IMG id=Codehighlighter1_4_32_Open_Image onclick="this.style.display='none'; Codehighlighter1_4_32_Open_Text.style.display='none'; Codehighlighter1_4_32_Closed_Image.style.display='inline'; Codehighlighter1_4_32_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_4_32_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_32_Closed_Text.style.display='none'; Codehighlighter1_4_32_Open_Image.style.display='inline'; Codehighlighter1_4_32_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_4_32_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_4_32_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;向文件初始化一些内容<BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">4</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_78_181_Open_Image onclick="this.style.display='none'; Codehighlighter1_78_181_Open_Text.style.display='none'; Codehighlighter1_78_181_Closed_Image.style.display='inline'; Codehighlighter1_78_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_78_181_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_78_181_Closed_Text.style.display='none'; Codehighlighter1_78_181_Open_Image.style.display='inline'; Codehighlighter1_78_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;InputStream&nbsp;openContentStream()&nbsp;</SPAN><SPAN id=Codehighlighter1_78_181_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_78_181_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;contents&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">初始化内容</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ByteArrayInputStream(contents.getBytes());<BR></SPAN><SPAN style="COLOR: #008080">7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR>至此就可以在生成完项目就自动进入文件编辑状态。<BR>友情小贴士：<BR>&nbsp;&nbsp;&nbsp; 1.创建文件：final IFile file = _newProject.getFile(fileName);<BR>&nbsp;&nbsp;&nbsp; 2.打开并编辑文件代码：
<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: #008080">&nbsp;1</SPAN><IMG id=Codehighlighter1_57_412_Open_Image onclick="this.style.display='none'; Codehighlighter1_57_412_Open_Text.style.display='none'; Codehighlighter1_57_412_Closed_Image.style.display='inline'; Codehighlighter1_57_412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_57_412_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_412_Closed_Text.style.display='none'; Codehighlighter1_57_412_Open_Image.style.display='inline'; Codehighlighter1_57_412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getShell().getDisplay().asyncExec(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Runnable()&nbsp;</SPAN><SPAN id=Codehighlighter1_57_412_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_57_412_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_89_402_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_402_Open_Text.style.display='none'; Codehighlighter1_89_402_Closed_Image.style.display='inline'; Codehighlighter1_89_402_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_89_402_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_402_Closed_Text.style.display='none'; Codehighlighter1_89_402_Open_Image.style.display='inline'; Codehighlighter1_89_402_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;run()&nbsp;</SPAN><SPAN id=Codehighlighter1_89_402_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_89_402_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IWorkbenchPage&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_239_340_Open_Image onclick="this.style.display='none'; Codehighlighter1_239_340_Open_Text.style.display='none'; Codehighlighter1_239_340_Closed_Image.style.display='inline'; Codehighlighter1_239_340_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_239_340_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_239_340_Closed_Text.style.display='none'; Codehighlighter1_239_340_Open_Image.style.display='inline'; Codehighlighter1_239_340_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_239_340_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_239_340_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDE.openEditor(page,&nbsp;file,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_370_388_Open_Image onclick="this.style.display='none'; Codehighlighter1_370_388_Open_Text.style.display='none'; Codehighlighter1_370_388_Closed_Image.style.display='inline'; Codehighlighter1_370_388_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_370_388_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_370_388_Closed_Text.style.display='none'; Codehighlighter1_370_388_Open_Image.style.display='inline'; Codehighlighter1_370_388_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(PartInitException&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_370_388_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_370_388_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV></FONT><img src ="http://www.blogjava.net/wadise/aggbug/24578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-19 10:36 <a href="http://www.blogjava.net/wadise/archive/2005/12/19/24578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码生成器插件开发---代码生成项目框架的创建(2) </title><link>http://www.blogjava.net/wadise/archive/2005/12/17/24344.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Sat, 17 Dec 2005 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/17/24344.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24344.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/17/24344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24344.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇中，我们已经建立了一个向导想生成项目，这一篇中将介绍怎样在Eclipse透视图中建立一个项目及所需的东西。首先，我们在向导点击Finish完后，然后生成一个项目，如图：这里就不多说了，贴出代码出来： NewCodeGenWizardCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.Cod...&nbsp;&nbsp;<a href='http://www.blogjava.net/wadise/archive/2005/12/17/24344.html'>阅读全文</a><img src ="http://www.blogjava.net/wadise/aggbug/24344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-17 12:57 <a href="http://www.blogjava.net/wadise/archive/2005/12/17/24344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码生成器插件开发---Wizard向导制作(1)</title><link>http://www.blogjava.net/wadise/archive/2005/12/17/24328.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Sat, 17 Dec 2005 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/17/24328.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24328.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/17/24328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24328.html</trackback:ping><description><![CDATA[<FONT size=1>这几天在做一个代码生成器，顺便开发个Eclipse插件。把自己的一些开发过程记录下来以供参考。由于自己初步接触Eclipse插件开发，所以记录的东西没有什么深度。下面我们就来开发一个Wizard向导。<BR>1. new一个plugin project，由于我们想通过代码生成项目向导来新建一个项目，所以我们要用到Eclipse中的Wizard类。<BR><BR>2. 编辑plugin.xml，使之扩展org.eclipse.ui.newWizards，具体代码： </FONT>
<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"><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN></FONT><FONT size=1><SPAN style="COLOR: #800000">extension<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">point</SPAN><SPAN style="COLOR: #0000ff">="org.eclipse.ui.newWizards"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>&lt;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #800000">category<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="代码生成"</SPAN></FONT><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">="com.hymake.hyplat.hycodegen"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">category</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>&lt;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #800000">wizard<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="生成一个空项目"</SPAN></FONT><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="icons/1.gif"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="com.hymake.hyplat.hycodegen"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="com.hymake.hyplat.hycodegen.wizard.NewCodeGenWizard"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>="com.hymake.hyplat.hycodegen.wizard.new.project"</FONT></SPAN><SPAN style="COLOR: #ff0000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;project</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">description</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过向导生成一个代码生成项目框架<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">description</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=1>&lt;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #800000">selection<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">class</SPAN><SPAN style="COLOR: #0000ff">="org.eclipse.core.resources.IResource"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">selection</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">wizard</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=1><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=1><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">extension</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></FONT></DIV>
<P><FONT size=1>这里面的category就是在Eclipse的New-&gt;Project中的一个类别，例如Java或Plugin-Development类别。如图：<BR><IMG height=497 alt=wizard1.JPG src="http://www.blogjava.net/images/blogjava_net/wadise/6080/wizard1.JPG" width=527 border=0><BR><BR>通过点击Next，将调用<FONT color=#000000>NewCodeGenWizard类，进入新建项目窗体。如下图：<BR><BR><IMG height=495 alt=wizard2.JPG src="http://www.blogjava.net/images/blogjava_net/wadise/6080/wizard2.JPG" width=523 border=0></FONT></FONT></P>
<P><FONT size=1>至此，我们的向导完成，具体的代码是这样的：<BR>NewCodeGenWizard：<BR></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: #008080">&nbsp;1</SPAN><IMG id=Codehighlighter1_75_192_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_192_Open_Text.style.display='none'; Codehighlighter1_75_192_Closed_Image.style.display='inline'; Codehighlighter1_75_192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_75_192_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_192_Closed_Text.style.display='none'; Codehighlighter1_75_192_Open_Image.style.display='inline'; Codehighlighter1_75_192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;init(IWorkbench&nbsp;workbench,&nbsp;IStructuredSelection&nbsp;selection)&nbsp;</SPAN><SPAN id=Codehighlighter1_75_192_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_75_192_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._workbench&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;workbench;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setNeedsProgressMonitor(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setWindowTitle(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">新建一个空项目</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_199_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_199_270_Open_Text.style.display='none'; Codehighlighter1_199_270_Closed_Image.style.display='inline'; Codehighlighter1_199_270_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_199_270_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_270_Closed_Text.style.display='none'; Codehighlighter1_199_270_Open_Image.style.display='inline'; Codehighlighter1_199_270_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_199_270_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_199_270_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN><SPAN style="COLOR: #008000">&nbsp;org.eclipse.jface.wizard.Wizard#performFinish()<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_307_335_Open_Image onclick="this.style.display='none'; Codehighlighter1_307_335_Open_Text.style.display='none'; Codehighlighter1_307_335_Closed_Image.style.display='inline'; Codehighlighter1_307_335_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_307_335_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_307_335_Closed_Text.style.display='none'; Codehighlighter1_307_335_Open_Image.style.display='inline'; Codehighlighter1_307_335_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN><SPAN style="COLOR: #000000">&nbsp;performFinish()&nbsp;</SPAN><SPAN id=Codehighlighter1_307_335_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_307_335_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_342_408_Open_Image onclick="this.style.display='none'; Codehighlighter1_342_408_Open_Text.style.display='none'; Codehighlighter1_342_408_Closed_Image.style.display='inline'; Codehighlighter1_342_408_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_342_408_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_342_408_Closed_Text.style.display='none'; Codehighlighter1_342_408_Open_Image.style.display='inline'; Codehighlighter1_342_408_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_342_408_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_342_408_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN><SPAN style="COLOR: #008000">&nbsp;org.eclipse.jface.wizard.Wizard#addPages()<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_437_667_Open_Image onclick="this.style.display='none'; Codehighlighter1_437_667_Open_Text.style.display='none'; Codehighlighter1_437_667_Closed_Image.style.display='inline'; Codehighlighter1_437_667_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_437_667_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_437_667_Closed_Text.style.display='none'; Codehighlighter1_437_667_Open_Image.style.display='inline'; Codehighlighter1_437_667_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;addPages()&nbsp;</SPAN><SPAN id=Codehighlighter1_437_667_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_437_667_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">super</SPAN><SPAN style="COLOR: #000000">.addPages();<BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WizardNewProjectCreationPage&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;WizardNewProjectCreationPage(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">平台开发-代码生成</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.setTitle(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">创建一个代码生成项目框架</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.setDescription(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">创建一个代码生成项目框架</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addPage(page);<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR>这里我只是简单用Eclipse UI中的WizardNewProjectCreationPage&nbsp;，如果自己想自定义下一个页面的风格和内容的话，也可以再新建一个类继承WizardPage即可。代码如下：<BR>
<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: #008080">&nbsp;1</SPAN><IMG id=Codehighlighter1_34_243_Open_Image onclick="this.style.display='none'; Codehighlighter1_34_243_Open_Text.style.display='none'; Codehighlighter1_34_243_Closed_Image.style.display='inline'; Codehighlighter1_34_243_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_34_243_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_34_243_Closed_Text.style.display='none'; Codehighlighter1_34_243_Open_Image.style.display='inline'; Codehighlighter1_34_243_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;NewCodeGenWizardPage()&nbsp;</SPAN><SPAN id=Codehighlighter1_34_243_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_34_243_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">super</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">代码生成-新建一个空项目</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitle(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">代码生成-新建一个空项目</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDescription(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">代码生成-新建一个空项目</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setPageComplete(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;workspaceRoot&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ResourcesPlugin.getWorkspace().getRoot();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_250_359_Open_Image onclick="this.style.display='none'; Codehighlighter1_250_359_Open_Text.style.display='none'; Codehighlighter1_250_359_Closed_Image.style.display='inline'; Codehighlighter1_250_359_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_250_359_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_250_359_Closed_Text.style.display='none'; Codehighlighter1_250_359_Open_Image.style.display='inline'; Codehighlighter1_250_359_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_250_359_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_250_359_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN><SPAN style="COLOR: #008000">&nbsp;org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_409_625_Open_Image onclick="this.style.display='none'; Codehighlighter1_409_625_Open_Text.style.display='none'; Codehighlighter1_409_625_Closed_Image.style.display='inline'; Codehighlighter1_409_625_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_409_625_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_409_625_Closed_Text.style.display='none'; Codehighlighter1_409_625_Open_Image.style.display='inline'; Codehighlighter1_409_625_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;createControl(Composite&nbsp;parent)&nbsp;</SPAN><SPAN id=Codehighlighter1_409_625_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_409_625_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initializeDialogUnits(parent);<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">final</SPAN><SPAN style="COLOR: #000000">&nbsp;Composite&nbsp;composite&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;createClientArea(parent);<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createLabel(composite);<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setControl(composite);<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dialog.applyDialogFont(composite);<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_632_697_Open_Image onclick="this.style.display='none'; Codehighlighter1_632_697_Open_Text.style.display='none'; Codehighlighter1_632_697_Closed_Image.style.display='inline'; Codehighlighter1_632_697_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_632_697_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_632_697_Closed_Text.style.display='none'; Codehighlighter1_632_697_Open_Image.style.display='inline'; Codehighlighter1_632_697_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_632_697_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_632_697_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">24</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建一个用户区域<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;composite<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@return</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">27</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">28</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_759_1059_Open_Image onclick="this.style.display='none'; Codehighlighter1_759_1059_Open_Text.style.display='none'; Codehighlighter1_759_1059_Closed_Image.style.display='inline'; Codehighlighter1_759_1059_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_759_1059_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_759_1059_Closed_Text.style.display='none'; Codehighlighter1_759_1059_Open_Image.style.display='inline'; Codehighlighter1_759_1059_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;Composite&nbsp;createClientArea(Composite&nbsp;composite)&nbsp;</SPAN><SPAN id=Codehighlighter1_759_1059_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_759_1059_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;composite1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Composite(composite,&nbsp;SWT.NONE);<BR></SPAN><SPAN style="COLOR: #008080">30</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridLayout&nbsp;gridlayout&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;GridLayout();<BR></SPAN><SPAN style="COLOR: #008080">31</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridlayout.marginWidth&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">32</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridlayout.marginHeight&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">33</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridlayout.numColumns&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">34</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.setLayout(gridlayout);<BR></SPAN><SPAN style="COLOR: #008080">35</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;composite1;<BR></SPAN><SPAN style="COLOR: #008080">36</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">37</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">38</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_1066_1117_Open_Image onclick="this.style.display='none'; Codehighlighter1_1066_1117_Open_Text.style.display='none'; Codehighlighter1_1066_1117_Closed_Image.style.display='inline'; Codehighlighter1_1066_1117_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1066_1117_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1066_1117_Closed_Text.style.display='none'; Codehighlighter1_1066_1117_Open_Image.style.display='inline'; Codehighlighter1_1066_1117_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1066_1117_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1066_1117_Open_Text><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">39</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建一个Label<BR></SPAN><SPAN style="COLOR: #008080">40</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;composite<BR></SPAN><SPAN style="COLOR: #008080">41</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">42</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_1169_1439_Open_Image onclick="this.style.display='none'; Codehighlighter1_1169_1439_Open_Text.style.display='none'; Codehighlighter1_1169_1439_Closed_Image.style.display='inline'; Codehighlighter1_1169_1439_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1169_1439_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1169_1439_Closed_Text.style.display='none'; Codehighlighter1_1169_1439_Open_Image.style.display='inline'; Codehighlighter1_1169_1439_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;createLabel(Composite&nbsp;composite)&nbsp;</SPAN><SPAN id=Codehighlighter1_1169_1439_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1169_1439_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">43</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;label&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Label(composite,&nbsp;</SPAN><SPAN style="COLOR: #000000">64</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">44</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Label测试</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">45</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridData&nbsp;griddata&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;GridData();<BR></SPAN><SPAN style="COLOR: #008080">46</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;griddata.widthHint&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;convertWidthInCharsToPixels(</SPAN><SPAN style="COLOR: #000000">80</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">47</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;griddata.horizontalSpan&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">48</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setLayoutData(griddata);<BR></SPAN><SPAN style="COLOR: #008080">49</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR>其中的createControl是必须实现的方法。<BR>至此，我们一个简单的向导就制作完成了。<BR>友情小贴士：<BR>&nbsp;&nbsp; 1.在制作向导的时候，一定要实现addPages方法，否则你点下一步的时候，因为没有指定的Page而无法显示出来。<BR></FONT><img src ="http://www.blogjava.net/wadise/aggbug/24328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-17 11:08 <a href="http://www.blogjava.net/wadise/archive/2005/12/17/24328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贫血的领域模型</title><link>http://www.blogjava.net/wadise/archive/2005/12/16/24209.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Fri, 16 Dec 2005 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/16/24209.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24209.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/16/24209.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24209.html</trackback:ping><description><![CDATA[<FONT size=1>在Martin Fowler文章</FONT><A href="http://www.martinfowler.com/bliki/AnemicDomainModel.html"><FONT size=1>http://www.martinfowler.com/bliki/AnemicDomainModel.html</FONT></A><FONT size=1>中指出现在出现越来越多的贫血领域模型(anemia domain model)。那么贫血领域模型的概念是什么呢？老马指出：<BR><BR></FONT><FONT color=#000000><FONT size=1><FONT size=+0><EM><FONT size=1>There are objects, many named after the nouns in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is very little behavior on these objects. Indeed often these models come with design rules that say that you are not to put any domain logic in the the domain objects. Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data.</FONT><BR></EM></FONT><BR></FONT><FONT size=+0><FONT size=1>也就是说在领域模型中，本身只处理很少的行为逻辑，大多数都是处在模型上层的一系列的Service类来负责捕获处理这些领域逻辑行为。这违背了OO思想（OO认为应该把数据和行为合在一起）。<BR><BR>Eric Evans在他的Domain Driven Design中说过：<BR></FONT>
<BLOCKQUOTE><I><FONT size=1>Application Layer [his name for Service Layer]: Defines the jobs the software is supposed to do and directs the expressive domain objects to work out problems. The tasks this layer is responsible for are meaningful to the business or necessary for interaction with the application layers of other systems. This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.</FONT></I></BLOCKQUOTE>
<BLOCKQUOTE><I><FONT size=1>Domain Layer (or Model Layer): Responsible for representing concepts of the business, information about the business situation, and business rules. State that reflects the business situation is controlled and used here, even though the technical details of storing it are delegated to the infrastructure. This layer is the heart of business software.<BR><BR><BR></FONT></I></BLOCKQUOTE>
<P><FONT size=1>据说在Thoughtwork公司里面采用的技术是Hibernate+Spring+webwork，关于anemia domain model有不少员工在公司内部邮件中发问老马应该什么正确使用。但是老马还没有给出确切答案，只放入TODOList去。<BR>我个人觉的Domail类中不应该含有过多的与之无关的行为，不但违反了单一职责的原则，还使得整个系统不够稳定。例如User中有Roles，那么addRole,removeRole自然应在Domain类User中写，至于removeUser,loadUser等应该封装成Dao去处理。<BR><BR>引用robbin在一次讨论中的回复：<BR><BR></FONT><FONT size=1><SPAN class=postbody><EM>我的理解是Martin大叔所谓的domain object是“<SPAN style="COLOR: red">领域模型</SPAN>”，它是一个针对业务逻辑抽象的模型，和软件编程根本毫无关系。即使你不开发这个软件，你仍然需要抽象你的业务逻辑得到你的领域模型。<SPAN style="COLOR: red">这个领域指的是你所从事的行业，而不是狭隘的持久化类</SPAN>。 <BR><BR>并且领域模型的建模也是在需求分析阶段，或者在需求分析阶段之前完成的事情。具体到编程的过程中，领域模型并非对应某一个Java类，如果一定要强行对应的话，（业务对象，Dao接口，Hibernate实体类）他们合起来统称领域模型在Java语言的实现。把 <SPAN style="COLOR: red">商业建模范畴的“领域模型”拿来当做Hibernate编程中的实体类，根本就是牛头不对马嘴</SPAN>!<BR></EM></SPAN><BR><EM>其实你的主张就是把持久化实体类的持久化操作附着到实体类上面去，而不是分开。举例来说，也就是说Account类的增删改查不应该单独分离到AccountDao接口去，而应该把增删改查操作放在Account类里面来完成，对不？ </EM></FONT></P>
<P><FONT size=1><EM>那么我在解释这个问题之前，必须澄清一点，就是这个问题的讨论，即持久化操作是否应该单独抽象一个DAO层的问题是和Martin Fowler提到了贫血的领域模型毫无关系的。实际上传统的Entity Bean就是这种把持久化操作附着到Entity Bean本身去的，但是Martin Fowler一样在说，这种Entity Bean就是贫血的。 </EM></FONT></P>
<P><FONT size=1><EM>好了，我们现在把其他无关因素排除了，focus到这个话题上，就是我们是否需要DAO接口的问题了。因为按照你的观点，如果把对象的增删改查都放在实体类上面，其实我们就不需要DAO接口层了，业务对象和Web Action都可以直接调用实体类本身来完成持久化操作了。 </EM></FONT></P>
<P><FONT size=1><EM>大概在2003年以前，我一直就是采用这种模型的，但是从2003年开始，我就改成了分离一个DAO层来专门处理持久化操作了。原因是多方面的，从技术角度来考量的话，分离就有很多好处，Rod Johnson在《without EJB》第10章持久化里面就详细阐述了需要DAO层的理由，我建议你看一下，这里不复述了。只谈一下除了Rod Johson提到理由之外的理由： </EM></FONT></P>
<P><FONT size=1><EM>作为保持状态的实体类，他的职责是保持状态，而不负责状态的持久化。如果把持久化操作也放在实体类中，一方面来说，把两种不同的职责放在一个类中，并不符合OCP的单一职责的原则，然而更重要的原因是会带来实体类的不稳定的问题。 </EM></FONT></P>
<P><FONT size=1><EM>在我的理念中，实体类以及实体类关联关系是一个软件系统中最稳定不变的部分，在整个软件系统中，各个层面都需要涉及到实体类的操作，如何划分实体类，以及确定实体类关联是最费考量的，确定了这一点，整个软件系统就底层依赖关系就被确定下来了（实体类的属性可以变化，由于软件系统对实体的操作都是以实体类为单位的，所以实体属性的变化不会造成系统不稳定），上面的DAO层，业务层，Web层都只对实体类产生单向依赖。 </EM></FONT></P>
<P><FONT size=1><EM>如果你把DAO层合并到实体类中，请注意本来Web层是不依赖于DAO层的，Web层只依赖实体类（因为它要展现实体类状态），但是由于你合并了，使得Web层也变得依赖那些DAO层的操作了。这样的结果就是让软件系统的耦合性提高，可伸缩性降低，可维护性降低。 </EM></FONT></P>
<P><FONT size=1><EM>DAO层的变动是大于实体类变动的，实体类基本上稳定不变，而软件系统的需求变更几乎一定会带来DAO层的变动，但是并不会带来实体类层的变动（会带来实体属性的变动，但是很少会影响到实体类本身）。所以DAO层的变动频率远远大于实体类。那么当你把DAO层操作合并到实体类以后，其结果就是让实体类的变动频率等于DAO层的变动频率。那么就会造成本来稳定的实体类层变得变得频率高了很多，而实体类的变动会波及到软件系统的每个层面，造成软件大面积的相关性和不稳定。 </EM></FONT></P>
<P><FONT size=1><EM>请记住很重要的一点：实体类是有状态的类，DAO类是无状态的类，在整个软件系统中，只有两种类有状态，一个是实体类，一个是HTTP Session。有状态的类会带来很高的代码相关性，应该尽量减少有状态类的影响范围，尽量减少有状态类的变动频率，应该尽量减少有状态类的职责。 </EM></FONT></P>
<P><FONT size=1><EM>而你把DAO操作合并到实体类以后，结果就是扩大了有状态类的代码相关性的范围和影响范围，扩大了有状态类的变动频率，最后就造成软件系统的稳定性下降。</EM></FONT></P></FONT></FONT><img src ="http://www.blogjava.net/wadise/aggbug/24209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-16 14:52 <a href="http://www.blogjava.net/wadise/archive/2005/12/16/24209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>