<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>一维空间</title>
<link>http://blogger.org.cn/blog/blog.asp?name=shengjorden</link>
<description>dskongenius的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[本博客不再更新，迁移至新地址 www.dskong.com]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=72936</link>
<author>shengjorden</author>
<pubDate>2013/2/21 17:26:14</pubDate>
<description><![CDATA[本博客不再更新，迁移至新地址 www.dskong.com]]></description>
</item><item>
<title><![CDATA[20110408的一条sql分析]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=51249</link>
<author>shengjorden</author>
<pubDate>2011/4/7 11:38:58</pubDate>
<description><![CDATA[
<P>insert into dskong.all_away_urs_110406<BR>select name,domain,mobile,grade<BR>from ( XYQ.Account as a left join URS_MOBILE.urs_mobile as b using(name,domain) )<BR>left join dskong.all_active_urs_110406 as c using(name,domain)<BR>where ( a.lastdate is NULL or a.lastdate &lt; date_sub(date(now()), interval 3 month) )<BR>and c.name is NULL;</P>
<P>&nbsp;</P>
<P>写了这个sql，跑了14个小时还没有跑完，无奈之心，只好kill。</P>
<P>事后分析一下，该sql有如下几点不妥之处：</P>
<P>1. 一个sql尽量只做一件事情，这样便于查看进度。</P>
<P>2. 一个sql只做一件事情，如果出了问题，也便于检查和恢复。</P>
<P>3. 更重要的是，这个sql会锁表，这样会使得其他的对该表操作的语句处于waiting状态。</P>
<P>4. 一些事情可以用shell来执行，虽然效率相差不会太多，但是会尽量少占用数据库资源。</P>
<P>5. 上面语句可以通过</P>
<P>cat file1 file2 file2&nbsp;| sort | uniq -u</P>
<P>来执行。</P>
<P>6. 还有shell是区分大小写的，而mysql是不区分大小写的，所以一定要注意是否有duplicate key.</P>
<P>7. 我擦，一亿多条记录，随便执行一个sql语句都要一两个小时。如果不建立primary key则快很多，所以可以尽量不建立primary key,去重工作可以通过shell来执行。</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[我胡汉三又回来了]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=50875</link>
<author>shengjorden</author>
<pubDate>2011/1/14 17:27:29</pubDate>
<description><![CDATA[进入工作半年多了，不算很忙，但是一直没有写blog，这段时间很多结晶，但一直没有沉淀下来，以后坚持写blog的习惯，一有想法赶紧写下来，大家监督啊]]></description>
</item><item>
<title><![CDATA[oracle的入门心得【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=42480</link>
<author>shengjorden</author>
<pubDate>2009/1/16 10:55:16</pubDate>
<description><![CDATA[<P>转自<A href="http://blogger.org.cn/blog/blog.asp?name=whbh1984">http://blogger.org.cn/blog/blog.asp?name=whbh1984</A></P>
<P>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的体系太庞大了，对于初学者来说，难免会有些无从下手的感觉，什么都想学，结果什么都学不好，所以把学习经验共享一下，希望让刚刚入门的人对</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有一个总体的认识，少走一些弯路。</SPAN></FONT></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 face=仿宋_GB2312 size=5>&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 face=仿宋_GB2312 size=5>一、定位</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分两大块，一块是开发，一块是管理。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发主要是写写存储过程、触发器什么的，还有就是用</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Develop</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具做</SPAN><SPAN lang=EN-US>form</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。有点类似于程序员，需要有较强的逻辑思维和创造能力，个人觉得会比较辛苦，是青春饭</SPAN><SPAN lang=EN-US>J</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></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理则需要对</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库的原理有深刻的认识，有全局操纵的能力和紧密的思维，责任较大，因为一个小的失误就会</SPAN><SPAN lang=EN-US>down</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">掉整个数据库，相对前者来说，后者更看重经验。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为数据库管理的责任重大，很少公司愿意请一个刚刚接触</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的人去管理数据库。对于刚刚毕业的年轻人来说，可以先选择做开发，有一定经验后转型，去做数据库的管理。当然，这个还是要看人个的实际情况来定。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><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></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 face=仿宋_GB2312 size=5>我的方法很简单，就是：看书、思考、写笔记、做实验、再思考、再写笔记</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&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 face=仿宋_GB2312 size=5>看完理论的东西，自己静下心来想想，多问自己几个为什么，然后把所学和所想的知识点做个笔记；在想不通或有疑问的时候，就做做实验，想想怎么会这样，同样的，把实验的结果记下来。思考和做实验是为了深入的了解这个知识点。而做笔记的过程，也是理清自己思路的过程。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">学习的过程是使一个问题由模糊到清晰，再由清晰到模糊的过程。而每次的改变都代表着你又学到了一个新的知识点。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">学习的过程也是从点到线，从线到网，从网到面的过程。当点变成线的时候，你会有总豁然开朗的感觉。当网到面的时候，你就是高手了</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">很多网友，特别是初学的人，一碰到问题就拿到论坛上来问，在问前，你有没有查过书，自己有没有研究过，有没有搜索一下论坛？这就叫思维惰性。由别人来回答你的问题，会让你在短时间内不费劲地弄懂这个知识点，然而通过自己的努力去研究它，不但会更深入的了解这个知识点，更重要的是在研究的过程会提高你解决问题和分析问题的能力。总的来说，没有钻研的学习态度，不管学什么东西，都不会成功的。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=仿宋_GB2312 size=5>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然，初学的人很多时候是因为遇到问题时，无从下手，也不知道去哪里找资料，才会到论坛上提问题的。但我认为，在提问的时候，是不是可以问别人是如何分析这个问题？从哪里可以找到相关的资料？而不是这个问题的答案是什么？授人以鱼不如授人以渔。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面我讲下我处理问题的过程</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先要知道</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的官方网站：</SPAN><SPAN lang=EN-US>www.oracle.com </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里有</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的各种版本的数据库、应用工具和权威的官方文档。其次，还要知道</SPAN><SPAN lang=EN-US>http://metalink.oracle.com/ </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里是买了</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务或是</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的合作伙伴才可以进去的，里面有很多权威的解决方案和补丁。然后就是一些著名网站：</SPAN><SPAN lang=EN-US>asktom.oracle.com www.orafaq.net, www.dbazine.com</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这里有很多经验之谈。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">遇到问题了。如果是概念上的问题，第一时间可以找</SPAN><SPAN lang=EN-US>tahiti.oracle.com</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这里会给你最详细的解释。如果在运行的过程中出了什么错误。可以去</SPAN><SPAN lang=EN-US>metalink</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看看。如果是想知道事务的处理的经验之谈。可以去</SPAN><SPAN lang=EN-US>asktom</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。当然。这里只是相对而言。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三、</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的体系</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的体系很庞大，要学习它，首先要了解</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的框架。在这里，简要的讲一下</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的架构，让初学者对</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有一个整体的认识。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><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></FONT></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 face=仿宋_GB2312 size=5>控制文件：包含维护和验证数据库完整性的必要信息、例如，控制文件用于识别数据文件和重做日志文件，一个数据库至少需要一个控制文件</FONT></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 face=仿宋_GB2312 size=5>数据文件：存储数据的文件</FONT></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 face=仿宋_GB2312 size=5>重做日志文件：含对数据库所做的更改记录，这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数文件：定义</SPAN><SPAN lang=EN-US>Oracle </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例程的特性，例如它包含调整</SPAN><SPAN lang=EN-US>SGA </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中一些内存结构大小的参数</SPAN></FONT></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 face=仿宋_GB2312 size=5>归档文件：是重做日志文件的脱机副本，这些副本可能对于从介质失败中进行恢复很必要。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">密码文件：认证哪些用户有权限启动和关闭</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例程</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><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></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 face=仿宋_GB2312 size=5>表空间：是数据库中的基本逻辑结构，一系列数据文件的集合。</FONT></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 face=仿宋_GB2312 size=5>段：是对象在数据库中占用的空间</FONT></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 face=仿宋_GB2312 size=5>区：是为数据一次性预留的一个较大的存储空间</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块：</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最基本的存储单位，在建立数据库的时候指定</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><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><SPAN lang=EN-US>SGA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>PGA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>SGA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：是用于存储数据库信息的内存区，该信息为数据库进程所共享。它包含</SPAN><SPAN lang=EN-US>Oracle </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>Oracle </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器所驻留的计算机的实际内存中得以分配，如果实际内存不够再往虚拟内存中写。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>PGA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：包含单个服务器进程或单个后台进程的数据和控制信息，与几个进程共享的</SPAN><SPAN lang=EN-US>SGA </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正相反</SPAN><SPAN lang=EN-US>PGA </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是只被一个进程使用的区域，</SPAN><SPAN lang=EN-US>PGA </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在创建进程时分配在终止进程时回收</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>4</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、后台进程（数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程）</SPAN></FONT></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 face=仿宋_GB2312 size=5>数据写进程：负责将更改的数据从数据库缓冲区高速缓存写入数据文件</FONT></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 face=仿宋_GB2312 size=5>日志写进程：将重做日志缓冲区中的更改写入在线重做日志文件</FONT></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 face=仿宋_GB2312 size=5>系统监控：检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程监控：负责在一个</SPAN><SPAN lang=EN-US>Oracle </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程失败时清理资源</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><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></FONT></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 face=仿宋_GB2312 size=5>归档进程：在每次日志切换时把已满的日志组进行备份或归档</FONT></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 face=仿宋_GB2312 size=5>服务进程：用户进程服务。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户进程：在客户端，负责将用户的</SPAN><SPAN lang=EN-US>SQL </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句传递给服务进程，并从服务器段拿回查询数据。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>5</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例程：</SPAN><SPAN lang=EN-US>Oracle </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例程由</SPAN><SPAN lang=EN-US>SGA </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>6</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>SCN(System Change Number)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：系统改变号，一个由系统内部维护的序列号。当系统需要更新的时候自动增加，他是系统中维持数据的一致性和顺序恢复的重要标志。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&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 face=仿宋_GB2312 size=5>四、深入学习</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理：可以考</SPAN><SPAN lang=EN-US>OCP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">证书，对</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先有一个系统的学习，然后看</SPAN><SPAN lang=EN-US>Oracle Concepts</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>oracle online document,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</SPAN><SPAN lang=EN-US>oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的原理会有更深入的了解，同时可以开始进行一些专题的研究如：</SPAN><SPAN lang=EN-US>RMAN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>RAS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>STATSPACT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>DATAGUARD</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>TUNING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>BACKUP&amp;RECOVER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=仿宋_GB2312><FONT size=5><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发：对于想做</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的，在了解完</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本的体系结构之后，可以重点关注</SPAN><SPAN lang=EN-US>PL/SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开发工具这一部分。</SPAN><SPAN lang=EN-US> PL/SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要是包括怎么写</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句，怎么使用</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身的函数，怎么写存储过程、存储函数、触发器等。</SPAN><SPAN lang=EN-US> Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开发工具主要就是</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己的</SPAN><SPAN lang=EN-US>Developer Suite</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US>Oracle Forms Developer and Reports Developer</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这些），学会如何熟练使用这些工具。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=仿宋_GB2312 size=5>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: right; mso-pagination: widow-orphan" align=right><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><A title="评分 0" href="http://www.itpub.net/misc.php?action=viewratings&amp;tid=202504&amp;pid=1281229"><FONT face=仿宋_GB2312 size=5></FONT></A><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><FONT face=仿宋_GB2312><FONT size=5>五、开发经验及常见问题<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><A href="http://www.itpub.net/showthread.php?s=&amp;threadid=134503" target=_blank><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN lang=EN-US>常见Oracle</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US>安装问题说明</SPAN></SPAN></FONT></FONT></A></SPAN><SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><FONT face=仿宋_GB2312><FONT size=5>　<SPAN lang=EN-US>[</SPAN>当前帖子数：<SPAN lang=EN-US>5]</SPAN></FONT></FONT></SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><BR><FONT face=仿宋_GB2312 size=5>1.</FONT></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><FONT face=仿宋_GB2312 size=5>问题集锦一</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>2.Oracle9i</FONT></SPAN><FONT face=仿宋_GB2312 size=5>在<SPAN lang=EN-US>RedhatLinux8.0</SPAN>中的安装详细步骤</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>3.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>问题集锦二</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>4.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>如何配置和使用</FONT><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>iSQL*Plus<BR>5.Oracle9i</SPAN>中<SPAN lang=EN-US>Data Guard</SPAN>的新特性以及配置使用</FONT></FONT><SPAN lang=EN-US><BR><BR><SPAN style="COLOR: blue"><A href="http://www.itpub.net/showthread.php?s=&amp;threadid=134504" target=_blank><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US><SPAN lang=EN-US>常见Oracle</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US>入门问题说明</SPAN></SPAN></FONT></FONT></A></SPAN></SPAN><SPAN style="COLOR: blue"><FONT face=仿宋_GB2312><FONT size=5>　<SPAN lang=EN-US>[</SPAN>当前帖子数：<SPAN lang=EN-US>5]</SPAN></FONT></FONT></SPAN><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>1.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>关于<SPAN lang=EN-US>Linux</SPAN>下<SPAN lang=EN-US>DBSTART</SPAN>和<SPAN lang=EN-US>DBSHUT</SPAN>脚本中需要修改的地方</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>2.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>如何将<SPAN lang=EN-US>EXP</SPAN>出来的数据<SPAN lang=EN-US>IMP</SPAN>进不同的表空间</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>3.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>如果系统中安装了多个数据库实例，如何修改默认</FONT><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>SID <BR>4.Oracle9i</SPAN>初始化参数注解</FONT></FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>5.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>关于<SPAN lang=EN-US>Oracle</SPAN>数据库的升级</FONT><FONT face=仿宋_GB2312><FONT size=5><SPAN lang=EN-US>(Migration)<BR><BR><SPAN style="COLOR: blue"><A href="http://www.itpub.net/showthread.php?s=&amp;threadid=134505" target=_blank><SPAN lang=EN-US><SPAN lang=EN-US>常见Oracle</SPAN></SPAN><SPAN lang=EN-US><SPAN lang=EN-US>开发问题说明</SPAN></SPAN></A></SPAN></SPAN><SPAN style="COLOR: blue">　<SPAN lang=EN-US>[</SPAN>当前帖子数：<SPAN lang=EN-US>0]</SPAN></SPAN></FONT></FONT><SPAN lang=EN-US><BR><BR><SPAN style="COLOR: blue"><A href="http://www.itpub.net/showthread.php?s=&amp;threadid=134506" target=_blank><FONT face=仿宋_GB2312><FONT size=5>Oracle<SPAN lang=EN-US><SPAN lang=EN-US>技巧与提示</SPAN></SPAN></FONT></FONT></A></SPAN></SPAN><SPAN style="COLOR: blue"><FONT face=仿宋_GB2312><FONT size=5>　<SPAN lang=EN-US>[</SPAN>当前帖子数：<SPAN lang=EN-US>3]</SPAN></FONT></FONT></SPAN><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>1.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>如何修改数据库的字符集</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>2.</FONT></SPAN><FONT face=仿宋_GB2312 size=5>如何查看<SPAN lang=EN-US>Control File</SPAN>中保存的内容</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>3.Oracle9i(Version 9.2)SYS_CONTEXT</FONT></SPAN><FONT face=仿宋_GB2312><FONT size=5>函数的用法以及同<SPAN lang=EN-US>USERENV</SPAN>函数的比较<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><FONT face=仿宋_GB2312><FONT size=5>六、共享<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><FONT face=仿宋_GB2312 size=5>介绍几本<SPAN lang=EN-US>oracle</SPAN>入门的好书</FONT><SPAN lang=EN-US><BR><BR><FONT face=仿宋_GB2312 size=5>oracle</FONT></SPAN><FONT face=仿宋_GB2312 size=5>官方文档：《<SPAN lang=EN-US>concept</SPAN>》上面讲了<SPAN lang=EN-US>oracle</SPAN>的体系和概念，很适合初学者看。</FONT><SPAN lang=EN-US><BR><BR><FONT face=仿宋_GB2312 size=5>OCP</FONT></SPAN><FONT face=仿宋_GB2312 size=5>的教学用书，也就是<SPAN lang=EN-US>STUDY GUIDE(SG)</SPAN>。在我的<SPAN lang=EN-US>FTP</SPAN>上有<SPAN lang=EN-US>down</SPAN>。</FONT><SPAN lang=EN-US><BR><BR><FONT face=仿宋_GB2312 size=5>Oracle8i </FONT></SPAN><FONT face=仿宋_GB2312 size=5>备份恢复手册</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>Oracle8</FONT></SPAN><FONT face=仿宋_GB2312 size=5>高级管理与优化</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>Oracle8i PLSQL</FONT></SPAN><FONT face=仿宋_GB2312 size=5>程序设计</FONT><SPAN lang=EN-US><BR><FONT face=仿宋_GB2312 size=5>Oracle8</FONT></SPAN><FONT face=仿宋_GB2312 size=5>数据库管理员手册</FONT><SPAN lang=EN-US><BR></SPAN><FONT face=仿宋_GB2312 size=5>以上书本都是机械工业出版社出版。</FONT><SPAN lang=EN-US><BR><BR><BR><BR></SPAN><FONT face=仿宋_GB2312 size=5>介绍几个网站</FONT><SPAN lang=EN-US><BR><A href="http://tahiti.oracle.com/" target=_blank><FONT face=仿宋_GB2312 size=5>http://tahiti.oracle.com</FONT></A><FONT face=仿宋_GB2312 size=5>&nbsp; &nbsp;&nbsp; &nbsp;oracle</FONT></SPAN><FONT face=仿宋_GB2312 size=5>的官方文档</FONT><SPAN lang=EN-US><BR><A href="http://metalink.oracle.com/" target=_blank><FONT face=仿宋_GB2312 size=5>http://metalink.oracle.com/</FONT></A><FONT face=仿宋_GB2312 size=5>&nbsp; &nbsp;oracle</FONT></SPAN><FONT face=仿宋_GB2312 size=5>的技术支持网站。需要购买<SPAN lang=EN-US>Oracle</SPAN>服务才能有一个帐号，才能登陆，有大量的<SPAN lang=EN-US>Knowledge Base</SPAN>，大量问题解决经验。</FONT><SPAN lang=EN-US><BR><A href="http://www.oracle.com/" target=_blank><FONT face=仿宋_GB2312 size=5>http://www.oracle.com</FONT></A><FONT face=仿宋_GB2312 size=5>&nbsp; &nbsp;oracle</FONT></SPAN><FONT face=仿宋_GB2312 size=5>的官方网站，可以在这里<SPAN lang=EN-US>down oracle</SPAN>的软件、官方文档和获得最新的消息</FONT><SPAN lang=EN-US><BR><A href="http://www.dbazine.com/" target=_blank><FONT face=仿宋_GB2312 size=5>http://www.dbazine.com/</FONT></A><FONT face=仿宋_GB2312 size=5>&nbsp; &nbsp; Oracle</FONT></SPAN><FONT face=仿宋_GB2312 size=5>的杂志</FONT><SPAN lang=EN-US><BR><A href="http://asktom.oracle.com/" target=_blank><FONT face=仿宋_GB2312 size=5>http://asktom.oracle.com</FONT></A><FONT face=仿宋_GB2312 size=5>&nbsp; &nbsp; <BR></FONT><A href="http://www.orafaq.net/" target=_blank><FONT face=仿宋_GB2312 size=5>http://www.orafaq.net/</FONT></A><FONT face=仿宋_GB2312 size=5>&nbsp;&nbsp;<BR></FONT><A href="http://www.ixora.com.au/" target=_blank><FONT face=仿宋_GB2312 size=5>http://www.ixora.com.au/</FONT></A><BR><A href="http://www.oracle-base.com/" target=_blank><FONT face=仿宋_GB2312 size=5>http://www.oracle-base.com</FONT></A><BR><A href="http://www.dba-oracle.com/oracle_links.htm" target=_blank><FONT face=仿宋_GB2312 size=5>http://www.dba-oracle.com/oracle_links.htm</FONT></A><o:p></o:p></SPAN></SPAN></P>]]></description>
</item><item>
<title><![CDATA[Oracle 10g绿色客户端 plus PL/SQL Developer-搭建方便的Oracle客户端使用环境【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=42479</link>
<author>shengjorden</author>
<pubDate>2009/1/16 10:42:26</pubDate>
<description><![CDATA[<P><FONT size=4>转自</FONT><A href="http://www.sifung.com/pages/1047.shtm"><FONT size=4>http://www.sifung.com/pages/1047.shtm</FONT></A><A><FONT size=4>　</FONT></A></P>
<P><FONT size=4></FONT>&nbsp;</P>
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
<TBODY>
<TR>
<TD class=Text align=middle height=25><STRONG><FONT color=#003399 size=4>Oracle 10g绿色客户端 plus PL/SQL Developer-搭建方便的Oracle客户端使用环境</FONT></STRONG></TD></TR>
<TR>
<TD class=Text vAlign=top height=300>
<P><FONT size=4></FONT>
<DIV>
<P><FONT size=4>整个一个暑假都在做基于Oracle的一个数据处理程序。但是一直没有找到合适的人工访问实验室的数据库的方便的方法。<BR>最酷的时候我的做法是自己写个程序用JDBC连接数据库自己扒下想要的表格……<BR>后来发现实验室里边有很多机器是装过Oracle客户端的，但是ms都是当时实验室搭建数据库时用正版的安装光盘装的，我对这样臃肿的客户端有一种生理上的恐惧，于是还是用原始的方法进行自己的开发。<BR>直到有一天，看到Oracle的官方网站上边有10g的绿色版的简易客户端……<BR></FONT><A href="http://www.oracle.com/technology/tech/oci/instantclient/index.html"><U><FONT color=#0000ff size=4>http://www.oracle.com/technology/tech/oci/instantclient/index.html</FONT></U></A><BR><FONT size=4>Oracle的官方网站下载软件是要帐户的，这个申请一个就是了，本人没有网上的空间存放相关的软件，即使有也没有官网上的可靠和持久，所以就只给一个链接了。<BR></FONT><A href="http://www.allroundautomations.nl/plsqldev.html"><U><FONT color=#0000ff size=4>http://www.allroundautomations.nl/plsqldev.html</FONT></U></A><BR><FONT size=4>PL/SQL Developer是一个开发与数据库相关工程的软件，ms是Free的，不大了解，只不过看到很多开发Oracle相关数据库的人都在用，我一般只用来当作与数据库服务器交互用的Client界面……，最多的时候主要是开一个窗口敲SQL语句，（杀鸡用牛刀了……）<BR>下边是安装的过程，由于是免安装的，所以要自己配置一些环境变量和文件，比较麻烦……<BR>首先将下载的Oracle客户端的压缩包解压到一个路径，在本机上解压到了E:\OracleClient下边，所以，实际上Oracle客户端的路径是E:\OracleClient\instantclient_10_2<BR>然后进入instantclient_10_2文件夹，新建一个network文件夹，并在network文件夹下新建admin文件夹，在admin文件夹中新建名为tnsnames.ora文件，这个文件是用来配置连接远程数据库的登录信息的（客户端软件都会从这个相对路径下的文件中获取连接数据库的信息），内容如下：<BR>databasename =<BR>&nbsp;&nbsp;&nbsp; (DESCRIPTION =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = ip address)(PORT = 1521))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = database name)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>例如我链接实验室数据库的对应文件内容是：<BR>TCM =<BR>&nbsp;&nbsp;&nbsp; (DESCRIPTION =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = *.*.*.*)(PORT = 1521))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = TCM)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>IP我就不写出来了，我所用的数据库名为TCM，so……</FONT></P>
<P><FONT size=4>然后安装PL/SQL Developer，过程是傻瓜式的。进入PL/SQL后（开始进入时会要求登录数据库，但是现在PL/SQL现在还找不到你的Oracle客户端，所以登录是不会成功的，但是可以进入软件），选择Tools-&gt;Preferences，在Oracle Home OCI Library两栏中分别填入Oracle客户端的路径和OCI文件的路径（oci.dll文件直接在instantclient_10_2文件夹下），所以我在这两个选项中填写的内容是“E:\OracleClient\instantclient_10_2”和“E:\OracleClient\instantclient_10_2\oci.dll”。这时再登录就可以登录成功了。如若还不行就重启一下PL/SQL。</FONT></P>
<P><FONT size=4>绿色版的客户端可能会出现对于中文支持的问题，这主要是因为服务器端指定的字符集和客户端所默认的字符集是不相同的导致的，只要找到服务器端的字符集设置，然后将客户端的字符集设置与服务器端保持一致就好了。修改客户端字符集设置的方法有好几种，可以修改注册表，也可以用环境变量的方法解决。不过我这里介绍的客户端是绿色版的，只是解压到某一个路径而已，所以注册表的方法在这里不是很适用，所以我写了一个启动脚本，在启动PL/SQL之前，先建一个临时环境变量nls_lang，并给变量赋值，再启动软件。（我曾经做过实验，通过建立系统环境变量的方法在这里是行不通的，具体的原因我说不清楚&gt;&lt;）</FONT></P>
<P><FONT size=4>我的脚本plsql.bat的内容如下：</FONT></P>
<P><FONT size=4>set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK<BR>cd "c:\Program Files\PLSQL Developer"<BR>PLSQLDev.exe<BR>其中第二行进入的路径是PL/SQL Developer安装到的路径。</FONT></P>
<P><FONT size=4>我这里的实际情况是服务器端的字符集设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK，所以我将这个值赋给nls_lang。通过运行plsql.bat脚本就可以正常的访问服务器数据库了。</FONT></P></DIV></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[API:Properties类【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=42303</link>
<author>shengjorden</author>
<pubDate>2009/1/8 14:34:21</pubDate>
<description><![CDATA[<FONT size=4>　转自<A href="http://blog.chinaunix.net/u1/36711/showart_479048.html">http://blog.chinaunix.net/u1/36711/showart_479048.html</A></FONT>
<DIV id=art style="MARGIN: 15px"><FONT size=4>Properties类是Hashtable类的子类，Properties类将Hashtable中的关键字和值保存到文件中，还可以从文件中读取关键字和值到Hashtable的对象中。<BR><BR>在什么情况下要使用Properties类呢？大多数程序都有功能设置的选项，例如firefox的设置选项，假如我们要修改一些设置，在点击确定后，这些设置就会存入一个配置文件当中。当firefox重新启动后，这些设置值就会起作用了。<BR><BR>如果调用Properties类中的store方法就是将Properties中的关键字和值的信息存储到文件当中，要注意这个关键字和值都必须是String对象类型的。<BR><BR>下面举一个例子说明：<BR>使用Properties把程序的启动运行次数记录在某个文件当中，每次运行就打印出它的运行次数。<BR><BR></FONT>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
<TBODY>
<TR>
<TD>
<P style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN style="COLOR: rgb(0,0,0)"><FONT size=4><SPAN style="COLOR: rgb(0,0,255)">import</SPAN> <SPAN style="COLOR: rgb(255,0,0)">java</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">util</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(0,0,204)">*</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN><BR><SPAN style="COLOR: rgb(0,0,255)">import</SPAN> <SPAN style="COLOR: rgb(255,0,0)">java</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">io</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(0,0,204)">*</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN><SPAN style="COLOR: rgb(255,153,0)"></SPAN><BR><SPAN style="COLOR: rgb(0,0,255)">public</SPAN> <SPAN style="COLOR: rgb(0,0,255)">class</SPAN> TestProperties <SPAN style="COLOR: rgb(0,0,204)">{</SPAN><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,255)">public</SPAN> <SPAN style="COLOR: rgb(0,0,255)">static</SPAN> <SPAN style="COLOR: rgb(0,0,255)">void</SPAN> main<SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,0)">String</SPAN><SPAN style="COLOR: rgb(0,0,204)">[</SPAN><SPAN style="COLOR: rgb(0,0,204)">]</SPAN> args<SPAN style="COLOR: rgb(0,0,204)">)</SPAN> <SPAN style="COLOR: rgb(0,0,204)">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(255,0,0)">Properties</SPAN> p <SPAN style="COLOR: rgb(0,0,204)">=</SPAN> <SPAN style="COLOR: rgb(0,0,255)">new</SPAN> <SPAN style="COLOR: rgb(255,0,0)">Properties</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN></FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//Properties类是Hashtable类的一个子类<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,255)">try</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">load</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(0,0,255)">new</SPAN> <SPAN style="COLOR: rgb(255,0,0)">FileInputStream</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,255)">"count.txt"</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN></FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//从一个文件对象中装载进来<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">}</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,255)">catch</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,0)">Exception</SPAN> e<SPAN style="COLOR: rgb(0,0,204)">)</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">setProperty</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,255)">"count"</SPAN><SPAN style="COLOR: rgb(0,0,204)">,</SPAN><SPAN style="COLOR: rgb(255,0,0)">String</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">valueOf</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN>0<SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN></FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//setProperty方法里面的参数必须为String类型<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">}</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//int i = Integer.parseInt(p.get("count")); //get方法是从Hashtable类中继承下来的，里面的参数可以是任意类型<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,255)">int</SPAN> i <SPAN style="COLOR: rgb(0,0,204)">=</SPAN> <SPAN style="COLOR: rgb(255,0,0)">Integer</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">parseInt</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN>p<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">getProperty</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,255)">"count"</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN></FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//用getProperty方法直接就是String类型的了<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(255,0,0)">System</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN>out<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">println</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,255)">"运行了"</SPAN><SPAN style="COLOR: rgb(0,0,204)">+</SPAN>i<SPAN style="COLOR: rgb(0,0,204)">+</SPAN><SPAN style="COLOR: rgb(255,0,255)">"次运行"</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i<SPAN style="COLOR: rgb(0,0,204)">+</SPAN><SPAN style="COLOR: rgb(0,0,204)">+</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//p.put("count",new Integer(i).toString());//put方法是从Hashtable类中继承下来的，里面的参数可以是任意类型<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">setProperty</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,255)">"count"</SPAN><SPAN style="COLOR: rgb(0,0,204)">,</SPAN><SPAN style="COLOR: rgb(0,0,255)">new</SPAN> <SPAN style="COLOR: rgb(255,0,0)">Integer</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN>i<SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">toString</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN></FONT><FONT size=4><SPAN style="COLOR: rgb(255,153,0)">//用setProperty方法直接就是String类型的了<BR></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,255)">try</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">store</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(0,0,255)">new</SPAN> <SPAN style="COLOR: rgb(255,0,0)">FileOutputStream</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,255)">"count.txt"</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">,</SPAN><SPAN style="COLOR: rgb(255,0,255)">"program is used: "</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">}</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,255)">catch</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(255,0,0)">Exception</SPAN> e<SPAN style="COLOR: rgb(0,0,204)">)</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e<SPAN style="COLOR: rgb(0,0,204)">.</SPAN><SPAN style="COLOR: rgb(255,0,0)">printStackTrace</SPAN><SPAN style="COLOR: rgb(0,0,204)">(</SPAN><SPAN style="COLOR: rgb(0,0,204)">)</SPAN><SPAN style="COLOR: rgb(0,0,204)">;</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">}</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: rgb(0,0,204)">}</SPAN><BR><SPAN style="COLOR: rgb(0,0,204)">}</SPAN></FONT></SPAN></CODE></P></TD></TR></TBODY></TABLE></DIV>]]></description>
</item><item>
<title><![CDATA[Oracle与SQLServer选型时不得不说的三个小差异【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=42165</link>
<author>shengjorden</author>
<pubDate>2009/1/6 18:09:09</pubDate>
<description><![CDATA[<H4><FONT size=4>&nbsp;&nbsp;甲骨文与微软两大数据库产品，是数据库发展史上的两座大山。这让我们在数据库选型的时候，基本上没有多大的选择余地，不是微软就是甲骨文。但是，从他们两者来说，还是有比较大的差异。今天笔者就谈谈在数据库选型的时候，不得不关注的他们之间的三个小差异。了解这些区别，能够给我们数据库选型带来很大的指导作用。 </FONT></H4>
<DIV class=newscon>
<DIV>
<H5 align=left><BR>
<P><STRONG><BR><BR><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;一、所支持平台的差异。</FONT></STRONG><FONT size=4> </FONT></P><BR>
<P><BR><BR><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;甲骨文的数据库系统，是在JAVA平台上开发起来的，所以，保持着众多JAVA程序的特性。如有很多功能都需要利用命令来完成;如一些辅助工具也都是类似DOS窗口的命令行形式的窗口，等等。而基于JAVA平台开发的数据库版本，也继承了JAVA的一个很重要的性能，就是跨平台性能。甲骨文的Oracle数据库可以在现有的大部分操作系统上顺利运行，如无论是开源的Linux系统还是微软的服务器系统，又或是苹果操作系统等等，都可以跑 Oracle数据库系统。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;而微软的SQLServer数据库系统，其只能够在微软的操作系统上运行，这除了技术上的因素之外，可能也是微软捆绑销售以及垄断的商业策略的体现吧。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;但是，从各个方面考虑，数据库能够支持多个平台的特性，已经越来越重要。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;一是从服务器稳定的角度考虑。到现在为止，开源的UNIX还是首选的服务器操作系统。UNIX服务器操作系统的稳定性是有目共睹的;而微软的服务器软件漏洞之多、稳定性之差也是大家感同身受的。相比之下，在一些稳定性要求比较高的应用上来说，大家更加喜欢使用UNIX(或者其分支 LINUX)作为服务器软件。虽然，其在维护成本上可能会高于微软的服务器操作系统。既然在服务器操作系统上有多个平台可以选择，那么无论是企业还是软件公司，在数据库选型上，也必须要考虑这个趋势。若商业软件公司，他们开发的软件只支持微软的数据库，而不支持甲骨文的数据库的话，则他们开发的软件，就只能够在微软的操作系统平台上应用，而不能在如LINUX的平台下应用，这必将失去很大的一部分市场。在这方面，我们公司的CRM软件业务就吃过一次亏。由于我们公司的CRM软件是从其他公司收购过来的，其只支持微软的数据库产品。虽然跟微软的数据库产品捆绑销售，据说企业也从微软那边拿到了不少的返点，但是，也失去了不少的客户。因为现在不少客户在选型的时候，都需要CRM软件能够支持跨平台运行，特别是服务器上，出于稳定性考虑，他们都采用LINUX作为后台服务器的操作系统。但是，我们公司的CRM软件无法适应这个跨平台的需求，所以，被迫放弃了很多项目。现在研发部门正在研究，准备开发出一套能够支持跨平台的CRM软件。而要实现这个目标，首先要考虑的就是数据库要能够支持跨平台。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;二是从客户端的部署成本考虑。跨平台也是一个必然的选择。现在微软进一步加强对盗版的打击力度，这虽然可能会增加微软的销售额，但是，也在一定程度上，把微软的用户向Linux等开元操作系统转移。为了适应这个趋势，企业在软件选型的时候，不仅在服务器上有所体现，在客户端上，企业也要求能够支持Linux等开源的操作系统。这个趋势，也给微软当头一棒。虽然说，信息化管理软件的跨平台性能除了跟数据库有关外，还跟信息化管理软件的开发平台相关。但是，从客户端的部署成本来考虑，大部分企业还是会采用免费的开源操作系统，而软件公司为了满足企业的这一需求，也会采用支持跨平台的开发语言; 而他们也就自然而然会支持甲骨文的操作系统。这必将大大的影响微软数据库系统的市场占有率。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;所以，笔者认为，不能够支持跨平台运行，这是微软数据库系统跟甲骨文数据库系统在市场竞争中，最大的劣势吧。 </FONT></P><BR>
<P><FONT size=4><STRONG>二、部署成本上的区别。</STRONG> </FONT></P><BR>
<P><BR><BR><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;在数据库部署成本上，两者的差异可以用一句话概述，就是甲骨文的数据库性能比微软的数据库性能要高几十倍，但是，部署价格的话，甲骨文系统也比微软的数据库系统高贵好几倍。当然，这是一个比较笼统的说法，在实际数据库选型中，还需要实际情况实际分析。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;1、Oracle数据库也有一些免费的版本。为了吸引更多的客户，甲骨文数据库系统也推出了一些针对中小型企业的免费数据库系统，如XE 等等。这些免费的数据库虽然比收费的数据库系统在某些方面受到了一些限制，如支持CPU以及数据库容量上有一定的限制，但是，对于小型企业的应用来说，没有多大的影响。而微软的数据库系统无论是大型应用还是小型应用，都是需要收费的。虽然，根据笔者的了解，不少中小型企业，在数据库选型的时候，选择了相对复杂的Oracle数据库系统，而放弃了收费高昂的微软的数据库系统。从这方面考虑，甲骨文的数据库实施成本反而比微软的数据库要小的多。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;2、Oracle数据库部署成本高的原因，是他们还提供了很多收费的维护工具。其实，甲骨文的数据库系统，不仅仅是一个数据库软件，还有很多维护工具，而这些维护工具是跟数据库本身分开卖的。若就一个数据库系统，则对于大部分数据库管理员来说，是管理不好甲骨文的数据库系统的;如不少的甲骨文数据库管理员，失去了SQL*plus工具，就手足无策了。巧妇难为无米之炊，没有这些辅助工具，甲骨文的数据库管理员就好像魔术师失去了道具，无所适从。真是因为这些原因，甲骨文的数据库部署与维护成本，比微软的数据库系统要高的多。微软基本上没有什么收费的数据库系统官方工具，就是一个数据库系统，在里面也自带了企业管理器。利用这个企业管理器环境，基本上可以完成微软数据库系统的维护工作。正是因为如此，微软的数据库系统的部署与维护成本，要比甲骨文的低许多。当然，这是微软数据库系统以牺牲数据库的性能为代价的。毋庸置疑，真是因为这些丰富的甲骨文数据库辅助工具，才能够保障甲骨文数据库的高性能。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;3、从数据库管理员的价值来说，两者之间也有比价到的差异。若把数据库管理员当作一个商品的话，则甲骨文的数据库管理员与微软的数据库管理员，同一个档次的，则前者比后者要贵许多。虽然都是数据库管理员，但是，就好像一个是本地组装的，一个是原装进口的，两者在价格上有很大的差异。不是笔者自夸，在同一个水平下，聘请一个甲骨文的数据库管理员，就可以凭请两到三个微软数据库管理员了，甚至更多。光从数据库维护人员的支出考虑，数据库维护成本，甲骨文的操作系统就要比微软的数据库操作系统贵两倍到三倍。这也正是甲骨文数据库维护成本比较高的另一个重要原因。不过，对于刚入门的数据库管理员来说，两者没有很大的区别;级别越高，两者的“价格”，差异就越大。 </FONT></P><BR>
<P><FONT size=4><STRONG>三、社区氛围的差异。</STRONG> </FONT></P><BR>
<P><BR><BR><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;社区氛围上的差异，这不仅是微软与甲骨文数据库系统上的差异，也是这两家公司经营文化上的差异。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;微软非常注重整个产品的社区氛围。如笔者在数据库这个行业也已经有很长的经验了，笔者曾多次受到微软公司的邀请，听他们的新产品发布会、研讨会之类的;而且，在网上，还有专门的免费教育。在GOOGLE上，输入微软数据库教学，可以查询到很多官方的培训视频。但是，甲骨文公司在这点上，明显不如微软。笔者使用了这么多年的Oracle数据库，从最初的9开始，到现在的这个最新的版本，这么多的版本变更，笔者从来没有听说过，甲骨文公司什么时候在全国各地开过产品发布说明会了，更没有用户研讨会了。而且，在网站上查找一下，也很难查到官方的培训光盘。所以说，微软是比较重视他们的用户群体的。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;这一点不光是反映在他们的数据库产品上，在他们的CRM软件业是如此。正是这一点，让微软抓住了很多用户的心，这对于他们开拓市场，具有很好的辅助作用。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;微软积极营造的这种社区氛围，对于用户了解微软的数据库产品，学习他们的数据库产品技术，是非常有帮助的。而由于甲骨文缺少这种氛围，所以，基本上只有通过培训才能够进入甲骨文的数据库管理员这个团队，入门比较困难。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;(转自：ITPUB)</FONT></P></H5></DIV></DIV>]]></description>
</item><item>
<title><![CDATA[对于java类加载器的认识【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41837</link>
<author>shengjorden</author>
<pubDate>2008/12/18 23:07:55</pubDate>
<description><![CDATA[<P><FONT size=4>转自http://hi.baidu.com/pwcrab/blog/item/6a5a7cf861d50608d9f9fda4.html</FONT></P>
<P><FONT size=4>java是具有动态性，什么是动态性？有个最直观的例子：windows系统的即插即用，支持即插即用的设备可以在系统不重新启动的情况下既可以热把插使用。而java的动态性表现在：我们的程序可以不用全盘的重新编译就能对程序某部分进行更新，C#也和java一样具有动态性，而且它的这种动态性表现更为直观：直接生成windows的动态连接库文件——dll文件。而java生成的是class文件，class是怎么实现动态性的了,这个时候就全靠我们今天的主角：java的类加载器。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们都知道所有的java类都是继承了object这个类，在object这个类中有一个方法：getclass(),这个方法返回的是一个Class类对象，具体见：</FONT><A href="http://www.blogjava.net/formatmyself/articles/21291.html"><FONT size=4>认识java的Class类</FONT></A><BR><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一旦一个类被载入JVM中，同一个类就不会被再次载入了（切记，同一个类）。这里存在一个问题就是什么是“同一个类”？正如一个对象有一个具体的状态，即标识，一个对象始终和其代码(类)相关联(见文</FONT><A href="http://hi.baidu.com/pwcrab/blog/item/e1ed40ca0a5e5d41f21fe7d8.html" target=_blank><FONT size=4>认识java的Class类</FONT></A><FONT size=4>)。同理，载入JVM的类也应该有一个具体的标识，我们知道：在JAVA中，一个类用其完全匹配类名(fully qualified class name)作为标识，这里指的完全匹配类名是包名和类名。不过在JVM中一个类是用其全名再附加上一个加载类ClassLoader的实例作为唯一标识。因此，如果一个名为Pg的包中，有一个名为Cl的类，被类加载器KlassLoader的一个实例对象kl1加载，生成Cl的对象，即C1.class(这里指类，而非对象)在JVM中表示为(Cl, Pg, kl1)。这意味着两个类加载器的实例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的，被它们所加载的类也因此完全不同，互不兼容的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在java中每个类都是由某个类加载器的实体来载入的，因此在Class类的实体中，都会有字段记录载入它的类加载器的实体（当为null时，其实是指Bootstrap ClassLoader）。 在java类加载器中除了引导类加载器（既Bootstrap ClassLoader），所有的类加载器都有一个父类加载器(因为他们本身自己就是java类)。而类的加载机制是遵循一种委托模式：当类加载器有加载类的需求时，会先请求其Parent加载(依次递归),如果在其父加载器树中都没有成功加载该类，则由当前类加载器加载。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java的类加载器分为以下几种：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，Bootstrap ClassLoader，用C++实现，一切的开始，是所有类加载器的最终父加载器。负责将一些关键的Java类，如java.lang.Object和其他一些运行时代码先加载进内存中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，ExtClassLoader，用java实现，是Launcher.java的内部类，编译后的名字为：Launcher$ExtClassLoader.class 。此类由Bootstrap ClassLoader加载，但由于Bootstrap ClassLoader已经脱离了java体系(c++),所以Launcher$ExtClassLoader.class的Parent(父加载器)被设置为null;它用于装载Java运行环境扩展包(jre/lib/ext)中的类，而且一旦建立其加载的路径将不再改变。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3，AppClassLoader,用java实现，也是是Launcher.java的内部类，编译后的名字为：Launcher$AppClassLoader.class 。AppClassLoader是当Bootstrap ClassLoader加载完ExtClassLoader后，再被Bootstrap ClassLoader加载。所以ExtClassLoader和AppClassLoader都是被Bootstrap ClassLoader加载，但AppClassLoader的Parent被设置为ExtClassLoader。可见Parent和由哪个类加载器来加载不一定是对应的。<BR>个类装载器是我们经常使用的，可以调用ClassLoader.getSystemClassLoader() 来获得，如果程序中没有使用类装载器相关操作设定或者自定义新的类装载器，那么我们编写的所有java类都会由它来装载。而它的查找区域就是我们常常说到的Classpath，一旦建立其加载路径也不再改变。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4，ClassLoader：一般我们自定义的ClassLoader从ClassLoader类继承而来。比如：URLClassloader是ClassLoader的一个子类，而URLClassloader也是ExtClassLoader和AppClassLoader的父类（注意不是父加载器）。 <FONT color=#ff0000>（这里特别要强调：<STRONG> <FONT color=#0000ff>父类</FONT></STRONG> 和<STRONG><FONT color=#0000ff> 父加载器</FONT></STRONG> 是两个完全不同范围的定义，不要搞混淆了，我最开始理解就是混淆了，所以非常迷惑，因为<FONT color=#ff0000>URLClassloader的父加载器是AppClassLoader，而AppClassLoader的父类又是URLClassloader，如果将父加载器和父类混淆了，那么就彻底晕了</FONT>。 注意，两者一个是类层次的讨论，一个是加载器层次的讨论。&nbsp;&nbsp; ）</FONT></FONT></P>
<P><FONT color=#ff0000><FONT color=#000000 size=4>让我们先回到java的动态性，实现java的动态性有两种方法类型：<FONT color=#ff0000>一种是隐式，另一种是显式</FONT>。什么是隐式？new 这个关键字我们都认识，当我们用其将类实例化时（即将对象载入），这种就是隐式！我们再来看显式的实现方法，一种可以由java.long.Class里面的forName()方法将类实例化，其中也用到了类加载器，详情见：</FONT><A href="http://hi.baidu.com/pwcrab/blog/item/e1ed40ca0a5e5d41f21fe7d8.html" target=_blank><FONT color=#0000ff size=4>认识java的Class类</FONT></A><FONT color=#000000 size=4>，另一种是由也就是直接用类加载器ClassLoader来实现。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassLoader一些重要的方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A) 方法 loadClass <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassLoader.loadClass() 是 ClassLoader 的入口点。该方法的定义如下： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class loadClass( String name, boolean resolve );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数name JVM 需要的类的名称，如 Person 或 java.lang.Object。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数 resolve 参数告诉方法是否需要解析类。在准备执行类之前，应考虑类解析。并不总是需要解析。如果 JVM 只需要知道该类是否存在或找出该类的超类，那么就不需要解析详情见：</FONT><A href="http://hi.baidu.com/pwcrab/blog/item/e1ed40ca0a5e5d41f21fe7d8.html" target=_blank><FONT color=#0000ff size=4>认识java的Class类</FONT></A><FONT color=#000000 size=4> 中的forName()方法的介绍。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 方法 defineClass <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defineClass 方法是 ClassLoader 的主要诀窍。该方法接受由原始字节组成的数组并把它转换成 Class 对象。原始数组包含如从文件系统或网络装入的数据。defineClass 管理 JVM 的许多复杂、神秘和倚赖于实现的方面 -- 它把字节码分析成运行时数据结构、校验有效性等等。不必担心，您无需亲自编写它。事实上，即使您想要这么做也不能覆盖它，因为它已被标记成final的。 <BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; C) 方法 findSystemClass <BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; findSystemClass 方法从本地文件系统装入文件。它在本地文件系统中寻找类文件，如果存在，就使用 defineClass 将原始字节转换成 Class 对象，以将该文件转换成类。当运行 Java 应用程序时，这是 JVM 正常装入类的缺省机制。（Java 2 中 ClassLoader 的变动提供了关于 Java 版本 1.2 这个过程变动的详细信息。） 对于定制的 ClassLoader，只有在尝试其它方法装入类之后，再使用 findSystemClass。原因很简单：ClassLoader 是负责执行装入类的特殊步骤，不是负责所有类。例如，即使 ClassLoader 从远程的 Web 站点装入了某些类，仍然需要在本地机器上装入大量的基本 Java 库。而这些类不是我们所关心的，所以要 JVM 以缺省方式装入它们：从本地文件系统。这就是 findSystemClass 的用途。 <BR>&nbsp;&nbsp;&nbsp;&nbsp; D) 方法 resolveClass <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正如前面所提到的，可以不完全地（不带解析）装入类，也可以完全地（带解析）装入类。当编写我们自己的 loadClass 时，可以调用 resolveClass，这取决于 loadClass 的 resolve 参数的值。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E) 方法 findLoadedClass <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; findLoadedClass 充当一个缓存：当请求 loadClass 装入类时，它调用该方法来查看 ClassLoader 是否已装入这个类，这样可以避免重新装入已存在类所造成的麻烦。应首先调用该方法。<BR><BR>怎么组装这些方法 <BR>1） 调用 findLoadedClass 来查看是否存在已装入的类。<BR>2） 如果没有，那么采用那种特殊的神奇方式来获取原始字节。<BR>3） 如果已有原始字节，调用 defineClass 将它们转换成 Class 对象。<BR>4） 如果没有原始字节，然后调用 findSystemClass 查看是否从本地文件系统获取类。<BR>5） 如果 resolve 参数是 true，那么调用 resolveClass 解析 Class 对象。<BR>6） 如果还没有类，返回 ClassNotFoundException。<BR><BR>Java 2 中 ClassLoader 的变动<BR>1）loadClass 的缺省实现 <BR>&nbsp;&nbsp; 定制编写的 loadClass 方法一般尝试几种方式来装入所请求的类，如果您编写许多类，会发现一次次地在相同的、很复杂的方法上编写变量。 在 Java 1.2 中 loadClass 的实现嵌入了大多数查找类的一般方法，并使您通过覆盖 findClass 方法来定制它，在适当的时候 findClass 会调用 loadClass。 这种方式的好处是您可能不一定要覆盖 loadClass；只要覆盖 findClass 就行了，这减少了工作量。 <BR><BR>2）新方法：findClass<BR>&nbsp;&nbsp;&nbsp;&nbsp; loadClass 的缺省实现调用这个新方法。findClass 的用途包含您的 ClassLoader 的所有特殊代码，而无需要复制其它代码（例如，当专门的方法失败时，调用系统 ClassLoader）。 <BR><BR>3） 新方法：getSystemClassLoader <BR>&nbsp;&nbsp;&nbsp;&nbsp; 如果覆盖 findClass 或 loadClass，getSystemClassLoader 使您能以实际 ClassLoader 对象来访问系统 ClassLoader（而不是固定的从 findSystemClass 调用它）。 <BR><BR>4） 新方法：getParent <BR>&nbsp;&nbsp;&nbsp; 为了将类请求委托给父代 ClassLoader，这个新方法允许 ClassLoader 获取它的父代 ClassLoader。当使用特殊方法，定制的 ClassLoader 不能找到类时，可以使用这种方法。<BR>父代 ClassLoader 被定义成创建该 ClassLoader 所包含代码的对象的 ClassLoader。</FONT></FONT></P>]]></description>
</item><item>
<title><![CDATA[认识java的Class类【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41836</link>
<author>shengjorden</author>
<pubDate>2008/12/18 22:50:07</pubDate>
<description><![CDATA[<P>转自http://www.blogjava.net/formatmyself/articles/21291.html<FONT size=4>　</FONT></P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4><A id=viewpost1_TitleUrl href="http://www.blogjava.net/formatmyself/articles/21291.html">认识java的Class类</A></FONT></P>
<P><FONT size=4>Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量，成员方法，还有这个类实现的接口，以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如：每个数组均属于一个 Class 类对象，所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short, int, long, float 和 double) 和 void 类型也可表示为 Class 对象。<BR>以下示例使用 Class 对象显示一个对象的 Class 名：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void printClassName(Object obj) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("The class of " + obj +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " is " + obj.getClass().getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们都知道所有的java类都是继承了object这个类，在object这个类中有一个方法：getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用，这个引用指向的是Class类的对象（呵呵，有点别扭）。我们自己无法生成一个Class对象（构造函数为private)，而这个Class类的对象是在当各类被调入时，由 Java 虚拟机自动创建 Class 对象，或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。如下图所示：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <IMG height=373 alt=o_1.jpg src="http://www.blogjava.net/images/blogjava_net/formatmyself/5215/o_1.jpg" width=436 border=0><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以把每个Class类的对象当做众多类的代理。而且在每个Class类对象中有会有字段记录他引用的这个类的类加载器。如果该字段为null,表示该类的加载器为bootstrap loader.具体原因见：</FONT><A href="http://www.blogjava.net/formatmyself/articles/21297.html"><FONT size=4>对于类加载器的认识一文</FONT></A><FONT size=4>。<BR><IMG height=424 alt=1.jpg src="http://www.blogjava.net/images/blogjava_net/formatmyself/5215/1.jpg" width=449 border=0><BR>我们知道java中有多个加载器，每个加载器能载入多个类，所以只要取得Class类对象，就可利用其getClassLoader()方法取得该类加载器的引用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jvm为每种类管理者独一的Class对象。因此我们可以用双等号操作符来比较对象：a1.getClass()==A.class;应该返回的是true。<BR></P></FONT>
<DT><FONT size=4><STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; forName(String classname)和 forName(String classname，boolean initialze,ClassLoader loader)&nbsp;&nbsp; </STRONG>方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回给定串名相应的<CODE>Class</CODE> 对象。若给定一个类或接口的完整路径名，那么此方法将试图定位、装载和连接该类<FONT face=Arial>。若成功，返回该类对象。否则，抛出 ClassNotFoundException 异常。 例如，下面代码段返回名为<CODE>java.lang.Thread</CODE> 的运行 <CODE>Class</CODE> 描述器。</FONT></FONT><CODE><FONT size=4><FONT face=Arial>Class&nbsp;t&nbsp;= Class.forName("java.lang.Thread") ;&nbsp; 此方法是需要指定类加载器的，当用到仅有一个String参数的forName方法时，Class对象将默认调用当前类加载器作为加载器和将第二参数为true。第二个参数说明：如果是false时，调用forName方法只是在命令类加载器载入该类，而不初始化该类的静态区块，只有当该类第一次实例化时，静态区块才被调用。当为true时，则载入时就调用静态区块。</FONT> </FONT>
<DT><FONT size=4><STRONG>getClassLoader() <BR></STRONG>获取该类的类装载器。 <BR></FONT><FONT size=4><STRONG>getComponentType() <BR></STRONG>如果当前类表示一个数组，则返回表示该数组组件的 Class 对象，否则返回 null。</FONT><FONT size=4><STRONG> <BR>getConstructor(Class[]) <BR></STRONG>返回当前 Class 对象表示的类的指定的公有构造子对象。</FONT><FONT size=4><STRONG> <BR>getConstructors() <BR></STRONG>返回当前 Class 对象表示的类的所有公有构造子对象数组。</FONT><FONT size=4><STRONG> <BR>getDeclaredConstructor(Class[]) <BR></STRONG>返回当前 Class 对象表示的类的指定已说明的一个构造子对象。 <BR></FONT><FONT size=4><STRONG>getDeclaredConstructors() <BR></STRONG>返回当前 Class 对象表示的类的所有已说明的构造子对象数组。 <BR></FONT><FONT size=4><STRONG>getDeclaredField(String) <BR></STRONG>返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。</FONT><FONT size=4><STRONG> <BR>getDeclaredFields() <BR></STRONG>返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。</FONT><FONT size=4><STRONG> <BR>getDeclaredMethod(String, Class[]) <BR></STRONG>返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。</FONT><FONT size=4><STRONG> <BR>getDeclaredMethods() <BR></STRONG>返回 Class 对象表示的类或接口的所有已说明的方法数组。</FONT><FONT size=4><STRONG> <BR>getField(String) <BR></STRONG>返回当前 Class 对象表示的类或接口的指定的公有成员域对象。</FONT><FONT size=4><STRONG> <BR>getFields() <BR></STRONG>返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。</FONT><FONT size=4><STRONG> <BR>getInterfaces() <BR></STRONG>返回当前对象表示的类或接口实现的接口</FONT><FONT size=4><STRONG>。 <BR>getMethod(String, Class[]) <BR></STRONG>返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。</FONT><FONT size=4><STRONG> <BR>getMethods() <BR></STRONG>返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组，包括已声明的和从父类继承的方法。</FONT><FONT size=4><STRONG> <BR>getModifiers() <BR></STRONG>返回该类或接口的 Java 语言修改器代码。</FONT><FONT size=4><STRONG> <BR>getName() <BR></STRONG>返回 Class 对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。</FONT><FONT size=4><STRONG> <BR>getResource(String) <BR></STRONG>按指定名查找资源。</FONT><FONT size=4><STRONG> <BR>getResourceAsStream(String) <BR></STRONG>用给定名查找资源。</FONT><FONT size=4><STRONG> <BR>getSigners() <BR></STRONG>获取类标记。</FONT><FONT size=4><STRONG> <BR>getSuperclass() <BR></STRONG>如果此对象表示除 Object 外的任一类, 那么返回此对象的父类对象。</FONT><FONT size=4><STRONG> <BR>isArray() <BR></STRONG>如果 Class 对象表示一个数组则返回 true, 否则返回 false。</FONT><FONT size=4><STRONG> <BR>isAssignableFrom(Class) <BR></STRONG>判定 Class 对象表示的类或接口是否同参数指定的 Class 表示的类或接口相同，或是其父类。</FONT><FONT size=4><STRONG> <BR>isInstance(Object) <BR></STRONG>此方法是 Java 语言 instanceof 操作的动态等价方法。</FONT><FONT size=4><STRONG> <BR>isInterface() <BR></STRONG>判定指定的 Class 对象是否表示一个接口类型。</FONT><FONT size=4><STRONG> <BR>isPrimitive() <BR></STRONG>判定指定的 Class 对象是否表示一个 Java 的基类型</FONT><FONT size=4><STRONG>。 <BR>newInstance() <BR></STRONG>创建类的新实例。</FONT><FONT size=4><STRONG> <BR>toString() <BR></STRONG>将对象转换为字符串。&nbsp;</FONT></DT></CODE>]]></description>
</item><item>
<title><![CDATA[c/c++编程基础篇之浅析堆&栈【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41433</link>
<author>shengjorden</author>
<pubDate>2008/11/29 13:09:17</pubDate>
<description><![CDATA[<A><FONT size=4></FONT>
<H4><FONT face=宋体 color=#000000 size=4>转自http://hi.baidu.com/zhanghui625/blog/item/1f7c9f34a6fd493e5bb5f5a7.html</FONT></H4>
<P>&nbsp;</P>
<H4><FONT face=宋体 color=#000000 size=4>五大内存分区</FONT><SPAN><BR><FONT face=宋体 color=#000000 size=4>&nbsp;&nbsp;&nbsp; </FONT></SPAN><FONT face=宋体 color=#000000 size=4>在<SPAN>C++</SPAN>中，内存分成<SPAN>5</SPAN>个区，他们分别是堆、栈、自由存储区、全局<SPAN>/</SPAN>静态存储区和常量存储区。</FONT><SPAN><BR><FONT face=宋体 color=#000000 size=4>&nbsp;&nbsp;&nbsp; </FONT></SPAN><FONT face=宋体 color=#000000 size=4>栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。</FONT><SPAN><BR><FONT face=宋体 color=#000000 size=4>&nbsp;&nbsp;&nbsp; </FONT></SPAN><FONT face=宋体 color=#000000 size=4>堆，就是那些由<SPAN>new</SPAN>分配的内存块，他们的释放编译器不去管，由我们的应用程序去控制，一般一个<SPAN>new</SPAN>就要对应一个<SPAN>delete</SPAN>。如果程序员没有释放掉，那么在程序结束后，操作系统会自动回收。</FONT><SPAN><BR><FONT face=宋体 color=#000000 size=4>&nbsp;&nbsp;&nbsp; </FONT></SPAN><FONT face=宋体 color=#000000 size=4>自由存储区，就是那些由<SPAN>malloc</SPAN>等分配的内存块，他和堆是十分相似的，不过它是用<SPAN>free</SPAN>来结束自己的生命的。</FONT><SPAN><BR><FONT face=宋体 color=#000000 size=4>&nbsp;&nbsp;&nbsp; </FONT></SPAN><FONT face=宋体 color=#000000 size=4>全局<SPAN>/</SPAN>静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的<SPAN>C</SPAN>语言中，全局变量又分为初始化的和未初始化的，在<SPAN>C++</SPAN>里面没有这个区分了，他们共同占用同一块内存区。</FONT><SPAN><BR><FONT face=宋体 color=#000000 size=4>&nbsp;&nbsp;&nbsp; </FONT></SPAN><FONT face=宋体 color=#000000 size=4>常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改</FONT></H4>
<H4><FONT size=4></FONT></H4>
<H4><FONT face=宋体 color=#000000 size=4>一般认为在<SPAN>c</SPAN>中分为这几个存储区：</FONT><SPAN><BR><FONT face=宋体><FONT size=4><FONT color=#000000>&nbsp;&nbsp;&nbsp; 1.</FONT><SPAN style="COLOR: burlywood"> </SPAN></FONT></FONT></SPAN><FONT face=宋体><FONT size=4><SPAN style="COLOR: yellowgreen">栈</SPAN><SPAN style="COLOR: burlywood"> </SPAN><FONT color=#000000>－－有编译器自动分配释放</FONT></FONT></FONT><FONT face=宋体><FONT size=4><SPAN><FONT color=#000000> <BR>&nbsp;&nbsp;&nbsp; 2. </FONT></SPAN><SPAN style="COLOR: yellowgreen">堆</SPAN><FONT color=#000000><SPAN> </SPAN>－－ 一般由程序员分配释放，若程序员不释放，程序结束时可能由<SPAN>OS</SPAN>回收</FONT></FONT></FONT><FONT face=宋体><FONT size=4><SPAN><FONT color=#000000> <BR>&nbsp;&nbsp;&nbsp; 3. </FONT></SPAN><SPAN style="COLOR: yellowgreen">全局区（静态区）</SPAN><FONT color=#000000><SPAN> </SPAN>－－ 全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。</FONT></FONT></FONT><FONT face=宋体><FONT size=4><FONT color=#000000><SPAN> <BR>&nbsp;&nbsp;&nbsp; 4. </SPAN>另外还有一个专门放</FONT><SPAN style="COLOR: yellowgreen">常量</SPAN><FONT color=#000000>的地方。程序结束释放<SPAN> </SPAN></FONT></FONT></FONT></H4>
<H4><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>在函数体中定义的变量通常是在栈上，用<SPAN>malloc, calloc, realloc</SPAN>等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量，加了<SPAN>static</SPAN>修饰符后不管在哪里都存放在全局区（静态区）<SPAN>,</SPAN>在所有函数体外定义的<SPAN>static</SPAN>变量表示在该文件中有效，不能<SPAN>extern</SPAN>到别的文件用，在函数体内定义的<SPAN>static</SPAN>表示只在该函数体内有效。另外，函数中的<SPAN>"adgfdf"</SPAN>这样的字符串存放在常量区。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR></SPAN>比如：</FONT></FONT></FONT></H4>
<H4><FONT face=宋体 color=#000000 size=4>代码</FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN>: <BR>int a = 0; //</SPAN>全局初始化区</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>char *p1; //</SPAN>全局未初始化区</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>main() <BR>{ <BR>int b; //</SPAN>栈</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>char s[] = "abc"; //</SPAN>栈</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>char *p2; //</SPAN>栈</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>char *p3 = "123456"; //123456\0</SPAN>在常量区，<SPAN>p3</SPAN>在栈上。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>static int c = 0</SPAN>；<SPAN> //</SPAN>全局（静态）初始化区</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>p1 = (char *)malloc(10); <BR>p2 = (char *)malloc(20); <BR>//</SPAN>分配得来得<SPAN>10</SPAN>和<SPAN>20</SPAN>字节的区域就在堆区。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>strcpy(p1, "123456"); <BR>//123456\0</SPAN>放在常量区，编译器可能会将它与<SPAN>p3</SPAN>所指向的<SPAN>"123456"</SPAN>优化成一块。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>} <BR><BR><BR>&nbsp;&nbsp;&nbsp; </SPAN>还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>栈的空间大小有限定，<SPAN>vc</SPAN>的缺省是<SPAN>2M</SPAN>。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道，当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的，不用你操心。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>堆是动态分配内存的，并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地<SPAN>malloc</SPAN>和<SPAN>free</SPAN>会产生内存碎片（有点类似磁盘碎片），因为<SPAN>c</SPAN>分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>在栈上存取数据比通过指针在堆上存取数据快些。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>一般大家说的堆栈和栈是一样的，就是栈<SPAN>(stack)</SPAN>，而说堆时才是堆<SPAN>heap. </SPAN>栈是先入后出的，一般是由高地址向低地址生长。</FONT></FONT></FONT></H4>
<H4 align=center><SPAN><FONT face=宋体 color=#000000 size=4>
<HR align=center width="100%" SIZE=2>
</FONT></SPAN></H4>
<H4><FONT color=#000000><FONT face=宋体 size=4>转载的另外一篇：</FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR><BR>&nbsp;&nbsp;&nbsp; </SPAN>堆<SPAN>(heap)</SPAN>和栈<SPAN>(stack)</SPAN>是<SPAN>C/C++</SPAN>编程不可避免会碰到的两个基本概念。首先，这两个概念都可以在讲数据结构的书中找到，他们都是基本的数据结构，虽然栈更为简单一些。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>在具体的<SPAN>C/C++</SPAN>编程框架中，这两个概念并不是并行的。对底层机器代码的研究可以揭示，栈是机器系统提供的数据结构，而堆则是<SPAN>C/C++</SPAN>函数库提供的。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>具体地说，现代计算机<SPAN>(</SPAN>串行执行机制<SPAN>)</SPAN>，都直接在代码底层支持栈的数据结构。这体现在，有专门的寄存器指向栈所在的地址，有专门的机器指令完成数据入栈出栈的操作。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR>&nbsp;&nbsp;&nbsp; </SPAN>机制的特点是效率高，支持的数据有限，一般是整数，指针，浮点数等系统直接支持的数据类型，并不直接支持其他的数据结构。因为栈的这种特点，对栈的使用在程序中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的<SPAN>call</SPAN>指令里隐含了把返回地址推入栈，然后跳转至子程序地址的操作，而子程序中的<SPAN>ret</SPAN>指令则隐含从堆栈中弹出返回地址并跳转之的操作。<SPAN>C/C++</SPAN>中的自动变量是直接利用栈的例子，这也就是为什么当函数返回时，该函数的自动变量自动失效的原因。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR><BR>&nbsp;&nbsp;&nbsp; </SPAN>和栈不同，堆的数据结构并不是由系统<SPAN>(</SPAN>无论是机器系统还是操作系统<SPAN>)</SPAN>支持的，而是由函数库提供的。基本的<SPAN>malloc/realloc/free</SPAN>函数维护了一套内部的堆数据结构。当程序使用这些函数去获得新的内存</FONT></FONT></FONT><SPAN><BR></SPAN><FONT face=宋体 color=#000000 size=4>空 间时，这套函数首先试图从内部堆中寻找可用的内存空间，如果没有可以使用的内存空间，则试图利用系统调用来动态增加程序数据段的内存大小，新分配得到的空 间首先被组织进内部堆中去，然后再以适当的形式返回给调用者。当程序释放分配的内存空间时，这片内存空间被返回内部堆结构中，可能会被适当的处理<SPAN>(</SPAN>比如和其他空闲空间合并成更大的空闲空间<SPAN>)</SPAN>，以更适合下一次内存分配申请。这套复杂的分配机制实际上相当于一个内存分配的缓冲池<SPAN>(Cache)</SPAN>，使用这套机制有如下若干原因：</FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR><BR>&nbsp;&nbsp;&nbsp; 1. </SPAN>系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请求<SPAN>(</SPAN>按页分配<SPAN>)</SPAN>；这样的话对于大量的小内存分类来说会造成浪费。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR><BR>&nbsp;&nbsp;&nbsp; 2. </SPAN>系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。</FONT></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR><BR>&nbsp;&nbsp;&nbsp; 3. </SPAN>没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。</FONT></FONT></FONT><FONT face=宋体><FONT size=4><SPAN><FONT color=#000000> <BR><BR></FONT></SPAN><SPAN style="COLOR: green">堆和栈的对比</SPAN></FONT></FONT><FONT color=#000000><FONT face=宋体><FONT size=4><SPAN> <BR><BR></SPAN>从以上知识可知，</FONT></FONT></FONT></H4>
<H4><FONT color=#000000><FONT size=4><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10pt"><SPAN>·<SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=宋体><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>栈是系统提供的功能，特点是快速高效，缺点是有限制，数据不灵活；而堆是函数库提供的功能，特点是灵活方便，数据适应面广泛，但是效率有一定降低。</FONT></FONT></FONT></H4>
<H4><FONT color=#000000><FONT size=4><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10pt"><SPAN>·<SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=宋体><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>栈是系统数据结构，对于进程<SPAN>/</SPAN>线程是唯一的；堆是函数库内部数据结构，不一定唯一。不同堆分配的内存无法互相操作。</FONT></FONT></FONT></H4>
<H4><FONT color=#000000><FONT size=4><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 10pt"><SPAN>·<SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=宋体><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>栈空间分静态分配和动态分配两种。静态分配是编译器完成的，比如自动变量<SPAN>(auto)</SPAN>的分配。动态分配由<SPAN>malloca</SPAN>函数完成。栈的动态分配无需释放<SPAN>(</SPAN>是自动的<SPAN>)</SPAN>，也就没有释放函数。为可移植的程序起见，栈的动态分配操作是不被鼓励的！堆空间的分配总是动态的，虽然程序结束时所有的数据空间都会被释放回系统，但是精确的申请内存<SPAN>/</SPAN>释放内存匹配是良好程序的基本要素。</FONT></FONT></FONT></H4>
<P><FONT color=#000000><STRONG><FONT size=4><SPAN>堆</SPAN><SPAN><FONT face="Times New Roman">(heap)</FONT></SPAN><SPAN>和堆栈</SPAN><SPAN><FONT face="Times New Roman">(stack)</FONT></SPAN><SPAN>的区别（在</SPAN><SPAN><FONT face="Times New Roman">cu</FONT></SPAN><SPAN>的</SPAN><SPAN><FONT face="Times New Roman">C</FONT></SPAN><SPAN>版看到，觉着好，</SPAN><SPAN><FONT face="Times New Roman">copy</FONT></SPAN><SPAN>过来）</SPAN></FONT></STRONG></FONT><FONT color=#000000><STRONG><FONT size=4><SPAN><FONT face="Times New Roman"> <BR></FONT></SPAN><SPAN>一、预备知识</SPAN><SPAN><FONT face="Times New Roman">—</FONT></SPAN><SPAN>程序的内存分配</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>一个由</SPAN><SPAN><FONT face="Times New Roman">c/C++</FONT></SPAN><SPAN>编译的程序占用的内存分为以下几个部分</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>1</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>、栈区（</SPAN><SPAN><FONT face="Times New Roman">stack</FONT></SPAN><SPAN>）</SPAN><SPAN><FONT face="Times New Roman">— </FONT></SPAN><SPAN>由编译器自动分配释放</SPAN><FONT face="Times New Roman"> </FONT><SPAN>，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>、堆区（</SPAN><SPAN><FONT face="Times New Roman">heap</FONT></SPAN><SPAN>）</SPAN><SPAN><FONT face="Times New Roman"> — </FONT></SPAN><SPAN>一般由程序员分配释放，</SPAN><FONT face="Times New Roman"> </FONT><SPAN>若程序员不释放，程序结束时可能由</SPAN><SPAN><FONT face="Times New Roman">OS</FONT></SPAN><SPAN>回收</SPAN><FONT face="Times New Roman"> </FONT><SPAN>。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>3</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>、全局区（静态区）（</SPAN><SPAN><FONT face="Times New Roman">static</FONT></SPAN><SPAN>）</SPAN><SPAN><FONT face="Times New Roman">—</FONT></SPAN><SPAN>，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，</SPAN><FONT face="Times New Roman"> </FONT><SPAN>未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。</SPAN><SPAN><FONT face="Times New Roman"> - </FONT></SPAN><SPAN>程序结束后有系统释放</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>4</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>、文字常量区</SPAN><SPAN><FONT face="Times New Roman"> —</FONT></SPAN><SPAN>常量字符串就是放在这里的。</SPAN><FONT face="Times New Roman"> </FONT><SPAN>程序结束后由系统释放</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>5</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>、程序代码区</SPAN><SPAN><FONT face="Times New Roman">—</FONT></SPAN><SPAN>存放函数体的二进制代码。</SPAN></FONT></STRONG></FONT><SPAN><BR><BR><BR><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>二、例子程序</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>这是一个前辈写的，非常详细</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>//main.cpp<BR>int a = 0; </STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>全局初始化区</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>char *p1; </STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>全局未初始化区</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>main()<BR>{<BR>int b; </STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>栈</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>char s[] = "abc"; </STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>栈</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>char *p2; </STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>栈</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>char *p3 = "123456"; 123456</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>在常量区，</SPAN><SPAN><FONT face="Times New Roman">p3</FONT></SPAN><SPAN>在栈上。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>static int c =0</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>；</SPAN><FONT face="Times New Roman"> </FONT><SPAN>全局（静态）初始化区</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>p1 = (char *)malloc(10);<BR>p2 = (char *)malloc(20);<BR></STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>分配得来得</SPAN><SPAN><FONT face="Times New Roman">10</FONT></SPAN><SPAN>和</SPAN><SPAN><FONT face="Times New Roman">20</FONT></SPAN><SPAN>字节的区域就在堆区。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>strcpy(p1, "123456"; 123456</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>放在常量区，编译器可能会将它与</SPAN><SPAN><FONT face="Times New Roman">p3</FONT></SPAN><SPAN>所指向的</SPAN><SPAN><FONT face="Times New Roman">"123456"</FONT></SPAN><SPAN>优化成一个地方。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>} <BR></STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>二、堆和栈的理论知识</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2.1</STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>申请方式</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>stack:<BR></STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>由系统自动分配。</SPAN><FONT face="Times New Roman"> </FONT><SPAN>例如，声明在函数中一个局部变量</SPAN><SPAN><FONT face="Times New Roman"> int b; </FONT></SPAN><SPAN>系统自动在栈中为</SPAN><SPAN><FONT face="Times New Roman">b</FONT></SPAN><SPAN>开辟空间</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>heap:<BR></STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>需要程序员自己申请，并指明大小，在</SPAN><SPAN><FONT face="Times New Roman">c</FONT></SPAN><SPAN>中</SPAN><SPAN><FONT face="Times New Roman">malloc</FONT></SPAN><SPAN>函数</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>如</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN><FONT face="Times New Roman">p1 = (char *)malloc(10);<BR></FONT></SPAN><SPAN>在</SPAN><SPAN><FONT face="Times New Roman">C++</FONT></SPAN><SPAN>中用</SPAN><SPAN><FONT face="Times New Roman">new</FONT></SPAN><SPAN>运算符</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>如</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN><FONT face="Times New Roman">p2 = (char *)malloc(10);<BR></FONT></SPAN><SPAN>但是注意</SPAN><SPAN><FONT face="Times New Roman">p1</FONT></SPAN><SPAN>、</SPAN><SPAN><FONT face="Times New Roman">p2</FONT></SPAN><SPAN>本身是在栈中的。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2.2<BR></STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>申请后系统的响应</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，</STRONG></FONT></SPAN><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，这样，代码中的</SPAN><SPAN><FONT face="Times New Roman">delete</FONT></SPAN><SPAN>语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2.3</STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>申请大小的限制</STRONG></FONT></SPAN><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>栈：在</SPAN><SPAN><FONT face="Times New Roman">Windows</FONT></SPAN><SPAN>下</SPAN><SPAN><FONT face="Times New Roman">,</FONT></SPAN><SPAN>栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在</SPAN><SPAN><FONT face="Times New Roman"> WINDOWS</FONT></SPAN><SPAN>下，栈的大小是</SPAN><SPAN><FONT face="Times New Roman">2M</FONT></SPAN><SPAN>（也有的说是</SPAN><SPAN><FONT face="Times New Roman">1M</FONT></SPAN><SPAN>，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示</SPAN><SPAN><FONT face="Times New Roman">overflow</FONT></SPAN><SPAN>。因此，能从栈获得的空间较小。</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2.4</STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>申请效率的比较：</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>栈由系统自动分配，速度较快。但程序员是无法控制的。</STRONG></FONT></SPAN><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>堆是由</SPAN><SPAN><FONT face="Times New Roman">new</FONT></SPAN><SPAN>分配的内存，一般速度比较慢，而且容易产生内存碎片</SPAN><SPAN><FONT face="Times New Roman">,</FONT></SPAN><SPAN>不过用起来最方便</SPAN></FONT></STRONG></FONT><FONT color=#000000><STRONG><FONT size=4><SPAN><FONT face="Times New Roman">.<BR></FONT></SPAN><SPAN>另外，在</SPAN><SPAN><FONT face="Times New Roman">WINDOWS</FONT></SPAN><SPAN>下，最好的方式是用</SPAN><SPAN><FONT face="Times New Roman">VirtualAlloc</FONT></SPAN><SPAN>分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2.5</STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>堆和栈中的存储内容</STRONG></FONT></SPAN><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>栈：</SPAN><FONT face="Times New Roman"> </FONT><SPAN>在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的</SPAN><SPAN><FONT face="Times New Roman">C</FONT></SPAN><SPAN>编译器中，参数是由右往左入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。</STRONG></FONT></SPAN><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>2.6</STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>存取效率的比较</STRONG></FONT></SPAN><SPAN><BR><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>char s1[] = "aaaaaaaaaaaaaaa";<BR>char *s2 = "bbbbbbbbbbbbbbbbb";<BR>aaaaaaaaaaa</STRONG></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>是在运行时刻赋值的；</STRONG></FONT></SPAN><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>而</SPAN><SPAN><FONT face="Times New Roman">bbbbbbbbbbb</FONT></SPAN><SPAN>是在编译时就确定的；</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>但是，在以后的存取中，在栈上的数组比指针所指向的字符串</SPAN><SPAN><FONT face="Times New Roman">(</FONT></SPAN><SPAN>例如堆</SPAN><SPAN><FONT face="Times New Roman">)</FONT></SPAN><SPAN>快。</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>比如：</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>＃</STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN><FONT face="Times New Roman">i nclude ;<BR>void main()<BR>{<BR>char a = 1;<BR>char c[] = "1234567890";<BR>char *p ="1234567890";<BR>a = c[1];<BR>a = p[1];<BR>return;<BR>}<BR></FONT></SPAN><SPAN>对应的汇编代码</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman" color=#000000 size=4><STRONG>10: a = c[1];<BR>00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<BR>0040106A 88 4D FC mov byte ptr [ebp-4],cl<BR>11: a = p[1];<BR>0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<BR>00401070 8A 42 01 mov al,byte ptr [edx+1]<BR>00401073 88 45 FC mov byte ptr [ebp-4],al<BR></STRONG></FONT></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>第一种在读取时直接就把字符串中的元素读到寄存器</SPAN><SPAN><FONT face="Times New Roman">cl</FONT></SPAN><SPAN>中，而第二种则要先把指针值读到</SPAN><SPAN><FONT face="Times New Roman">edx</FONT></SPAN><SPAN>中，在根据</SPAN><SPAN><FONT face="Times New Roman">edx</FONT></SPAN><SPAN>读取字符，显然慢了。</SPAN></FONT></STRONG></FONT><SPAN><BR><FONT face="Times New Roman"><FONT color=#000000 size=4><STRONG>? <BR><BR>2.7</STRONG></FONT></FONT></SPAN><SPAN><FONT color=#000000 size=4><STRONG>小结：</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>堆和栈的区别可以用如下的比喻来看出：</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。</STRONG></FONT></SPAN><SPAN><BR><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>堆和栈的区别主要分：</STRONG></FONT></SPAN><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>操作系统方面的堆和栈，如上面说的那些，不多说了。</STRONG></FONT></SPAN><SPAN><BR></SPAN><FONT color=#000000><STRONG><FONT size=4><SPAN>还有就是数据结构方面的堆和栈，这些都是不同的概念。这里的堆实际上指的就是（满足堆性质的）优先队列的一种数据结构，第</SPAN><SPAN><FONT face="Times New Roman">1</FONT></SPAN><SPAN>个元素有最高的优先权；栈实际上就是满足先进后出的性质的数学或数据结构。</SPAN></FONT></STRONG></FONT><SPAN><BR></SPAN><SPAN><FONT color=#000000 size=4><STRONG>虽然堆栈，堆栈的说法是连起来叫，但是他们还是有很大区别的，连着叫只是由于历史的原因</STRONG></FONT></SPAN></P></A>]]></description>
</item><item>
<title><![CDATA[C++和JAVA中堆和栈的定义什么，区别是什么？【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41432</link>
<author>shengjorden</author>
<pubDate>2008/11/29 13:03:41</pubDate>
<description><![CDATA[
<P><FONT size=4>转自http://hi.baidu.com/ecgql/blog/item/ba9086253926fa6634a80fe8.html　</FONT></P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>在C++中，内存分成5个区，他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 <BR>栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 <BR>堆，就是那些由new分配的内存块，他们的释放编译器不去管，由我们的应用程序去控制，一般一个new就要对应一个delete。如果程序员没有释放掉，那么在程序结束后，操作系统会自动回收。 <BR>自由存储区，就是那些由malloc等分配的内存块，他和堆是十分相似的，不过它是用free来结束自己的生命的。 <BR>全局/静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的C语言中，全局变量又分为初始化的和未初始化的，在C++里面没有这个区分了，他们共同占用同一块内存区。 <BR>常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改 <BR>一般认为在c中分为这几个存储区： <BR>1. 栈 －－有编译器自动分配释放 <BR>2. 堆 －－ 一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收 <BR>3. 全局区（静态区） －－ 全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。 <BR>4. 另外还有一个专门放常量的地方。程序结束释放 <BR>在函数体中定义的变量通常是在栈上，用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量，加了static修饰符后不管在哪里都存放在全局区（静态区）,在所有函数体外定义的static变量表示在该文件中有效，不能extern到别的文件用，在函数体内定义的static表示只在该函数体内有效。另外，函数中的"adgfdf"这样的字符串存放在常量区。 <BR>比如： <BR>代码: <BR>int a = 0; //全局初始化区 <BR>char *p1; //全局未初始化区 <BR>main() <BR>{ <BR>int b; //栈 <BR>char s[] = "abc"; //栈 <BR>char *p2; //栈 <BR>char *p3 = "123456"; //123456\0在常量区，p3在栈上。 <BR>static int c = 0； //全局（静态）初始化区 <BR>p1 = (char *)malloc(10); <BR>p2 = (char *)malloc(20); <BR>//分配得来得10和20字节的区域就在堆区。 <BR>strcpy(p1, "123456"); <BR>//123456\0放在常量区，编译器可能会将它与p3所指向的"123456"优化成一块。 <BR>}<BR>参考资料：</FONT><A href="http://hi.baidu.com/zhanghui625/blog/item/1f7c9f34a6fd493e5bb5f5a7.html" target=_blank><FONT size=4>http://hi.baidu.com/zhanghui625/blog/item/1f7c9f34a6fd493e5bb5f5a7.html</FONT></A></P>
<P><FONT size=4>Java中堆栈的概念当然是逻辑上的，在完全符合Java规范的Java处理器面世之前，所有Java虚拟机提供的内容都是由软件模拟出来的。 <BR><BR>什么叫堆？你用十几个麻将牌竖直叠成一摞这叫堆，你可以从上面、下面、中间任意抽出一张牌，也可以任意插入一张。 <BR><BR>什么叫栈？AK-47的弹匣就是一个栈，在上面的子弹没被取出之前，你无法取出下面的子弹——尽管你可以从边上的透明部分读出里面装的是什么型号、颜色的子弹。 <BR><BR>堆很灵活，但是不安全。对于对象，我们要动态地创建、销毁，不能说后创建的对象没有销毁，先前创建的对象就不能销毁，那样的话我们的程序就寸步难行，所以Java中用堆来存储对象。而一旦堆中的对象被销毁，我们继续引用这个对象的话，就会出现著名的 NullPointerException，这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现。 <BR><BR>栈不灵活，但是很严格，是安全的，易于管理。因为只要上面的引用没有销毁，下面引用就一定还在，所以，在栈中，上面引用永远可以通过下面引用来查找对象，同时如果确认某一区间的内容会一起存在、一起销毁，也可以上下互相引用。在大部分程序中，都是先定义的变量、引用先进栈，后定义的后进栈，同时，区块内部的变量、引用在进入区块时压栈，区块结束时出栈，理解了这种机制，我们就可以很方便地理解各种编程语言的作用域的概念了，同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。 <BR><BR>在Java中，引用可以理解为一个永远指向对象的指针，Java没有指向指针的指针。 <BR><BR>关于堆栈的资料几乎每个讲数据结构的书上都有，而至于Java中堆、栈的具体机制你可以参考一些关于Java虚拟机原理的书，不过这个好像比较难理解，我是没指望理解的了。 <BR><BR>以上都是我的个人观点，仅供参考。</FONT></P>]]></description>
</item><item>
<title><![CDATA[Seam 例子 Hello World【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41426</link>
<author>shengjorden</author>
<pubDate>2008/11/28 22:59:23</pubDate>
<description><![CDATA[<A><FONT size=4></FONT></A>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">转自</SPAN><SPAN lang=EN-US><FONT face=Calibri>http://hi.baidu.com/yanru8402/blog/item/a3b3ad543f5b4b1a3a293593.html</FONT></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center><FONT size=4><SPAN lang=EN-US><FONT face=Calibri></FONT></SPAN></FONT>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center><FONT size=4><SPAN lang=EN-US><FONT face=Calibri></FONT></SPAN></FONT>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>Seam </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">例子</SPAN><FONT face=Calibri><SPAN lang=EN-US> Hello World</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">JBoss Seam</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">是<SPAN lang=EN-US>EJB3</SPAN>和<SPAN lang=EN-US>JSF</SPAN>中间的粘合剂，这是<SPAN lang=EN-US>Jboss Seam</SPAN>最基本的和最广泛的应用。通过被<SPAN lang=EN-US>Seam</SPAN>管理的组件，<SPAN lang=EN-US>Seam</SPAN>允许这两个框架之间无缝<SPAN lang=EN-US>(</SPAN>不是有意双关的<SPAN lang=EN-US>)</SPAN>的集成。它为整个<SPAN lang=EN-US>web</SPAN>应用拓展了基于注解的<SPAN lang=EN-US>EJB3 POJO</SPAN>编程模型。在层与层之间，没有了必需的手动<SPAN lang=EN-US>JNDI</SPAN>查找，没有了冗长的<SPAN lang=EN-US>JSF</SPAN>支持<SPAN lang=EN-US>bean</SPAN>的声明，没有了过多<SPAN lang=EN-US>facade</SPAN>方法，没有了艰辛的对象传递，快哉！<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><FONT size=4><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">继续在<SPAN lang=EN-US>Seam</SPAN>中使用<SPAN lang=EN-US>JavaEE</SPAN>模式</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>在传统的<SPAN lang=EN-US>java EE</SPAN>应用中，一些设计模式，例如<SPAN lang=EN-US>JNDI</SPAN>查找、<SPAN lang=EN-US>XML</SPAN>声明组件、值对象、<SPAN lang=EN-US>facade</SPAN>是被强制使用的。<SPAN lang=EN-US>Seam</SPAN>用基于注解的<SPAN lang=EN-US>POJO</SPAN>消除了这些人为的需求。但是，当<SPAN lang=EN-US>Seam</SPAN>应用中真正需要它们的时候，仍然可以自由地使用这些模式。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>编写一个<SPAN lang=EN-US>Seam web</SPAN>应用概念上很简单。你只需要编码出下列组件：<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<UL type=disc>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>实体对象代表数据模型。实体对象可能是<SPAN lang=EN-US>JPA</SPAN>或者<SPAN lang=EN-US>Hibernate</SPAN>中的<SPAN lang=EN-US>POJO</SPAN>对象。它们自动地映射到关系数据库表。 <SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SF web</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">页面展示了用户界面。页面通过表单捕获用户的输入，并且显示结果。表单域与其数据显示数据库表，这些表被映射到实体<SPAN lang=EN-US>bean</SPAN>或者实体<SPAN lang=EN-US>bean</SPAN>的集合上。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">EJB3 </SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">会话<SPAN lang=EN-US>bean</SPAN>或者注解过的<SPAN lang=EN-US>Seam POJO</SPAN>可以作为<SPAN lang=EN-US>JSF Web</SPAN>页面的<SPAN lang=EN-US>UI</SPAN>事件处理器。它们处理封装在实体<SPAN lang=EN-US>bean</SPAN>中的用户输入，为下一步（或者页面）生成显示的数据对象。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI></UL>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>所有以上组件均由<SPAN lang=EN-US>Seam</SPAN>自行管理，它们在运行时被自动注入到正确的页面或者对象。例如，当用户单击按钮提交一个<SPAN lang=EN-US>JSF</SPAN>表单，<SPAN lang=EN-US>Seam</SPAN>就会自动解析表单域并构造一个实体<SPAN lang=EN-US>bean</SPAN>。然后，<SPAN lang=EN-US>Seam</SPAN>将实体<SPAN lang=EN-US>bean</SPAN>传入同样被<SPAN lang=EN-US>Seam</SPAN>构造的事件处理器会话<SPAN lang=EN-US>bean</SPAN>中来处理。开发者不需要在代码中管理组件的生命周期和组件之间的相互关系。依赖处理过程中，没有样板代码和<SPAN lang=EN-US>XML</SPAN>文件。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>本章中，我们使用<SPAN lang=EN-US>hello world</SPAN>一例来明确展示<SPAN lang=EN-US>Seam</SPAN>如何粘合一个<SPAN lang=EN-US>web</SPAN>应用。该例子工作如下：用户能在<SPAN lang=EN-US>web</SPAN>表单中输入其名字来<SPAN lang=EN-US>“</SPAN>问候<SPAN lang=EN-US>”Seam</SPAN>。一旦她提交了表单，应用则保存她的名字到一个关系数据库中，并且显示所有已经<SPAN lang=EN-US>“</SPAN>问候<SPAN lang=EN-US>”</SPAN>过<SPAN lang=EN-US>Seam</SPAN>的用户。该项目示例在该书下载的源代码中的<SPAN lang=EN-US>HelloWorld</SPAN>文件夹中。为了建立它，你必须安装<SPAN lang=EN-US>Apache ANT 1.6</SPAN>版本以上<SPAN lang=EN-US> (http://ant.apache.org/)</SPAN>。进入<SPAN lang=EN-US>HelloWorld</SPAN>目录，运行命令<SPAN lang=EN-US>ant</SPAN>，则会生成<SPAN lang=EN-US>build/jars/helloworld.ear</SPAN>文件，可以直接拷贝该文件到<SPAN lang=EN-US>Jboss AS</SPAN>实例的<SPAN lang=EN-US>server/default/deploy</SPAN>目录下。现在，启动<SPAN lang=EN-US>JBoss AS</SPAN>并且打开网址<SPAN lang=EN-US>http://localhost:8080/helloworld/</SPAN>。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>为了运行本书中的例子，我们建议您使用<SPAN lang=EN-US>JEMS GUI</SPAN>安装程序安装一个与<SPAN lang=EN-US>Seam</SPAN>兼容的<SPAN lang=EN-US>JBoss AS</SPAN>。您可以从<SPAN lang=EN-US><A href="http://labs.jboss.com/portal/jemsinstaller/downloads"><SPAN style="COLOR: blue">http://labs.jboss.com/portal/jemsinstaller/downloads</SPAN></A></SPAN>下载<SPAN lang=EN-US>JEMS</SPAN>安装程序。如果您需要更多安装<SPAN lang=EN-US>JBoss AS</SPAN>和应用部署帮助，请参见附录<SPAN lang=EN-US>A</SPAN>，<SPAN lang=EN-US>“</SPAN>安装和部署<SPAN lang=EN-US>JBoss AS”<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>欢迎使用示例作为模板，快速开始你自己<SPAN lang=EN-US>Seam</SPAN>项目（参见附录<SPAN lang=EN-US>B “</SPAN>使用应用示例作为模板<SPAN lang=EN-US>”</SPAN>）。或者，你能使用命令行工具<SPAN lang=EN-US>Seam Gen (</SPAN>参见第四章<SPAN lang=EN-US>“</SPAN>快速应用开发工具<SPAN lang=EN-US>”)</SPAN>自动生成项目模板，包括所有的配置文件。本章中，我将花少量的时间来阐释源代码项目中的目录结构。相反，我们将集中讨论代码和配置，这也是开发者建立一个<SPAN lang=EN-US>Seam </SPAN>应用必需的。如此，我们就能将知识应用到任何一个项目结构，而不需要受模板的限制。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><FONT size=4><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">源代码目录</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>一个<SPAN lang=EN-US>Seam</SPAN>应用由<SPAN lang=EN-US>java</SPAN>类和<SPAN lang=EN-US>XML</SPAN>或文本配置文件组成。本书的项目例子中，<SPAN lang=EN-US>java</SPAN>源代码文件在<SPAN lang=EN-US>src</SPAN>目录中，网页在<SPAN lang=EN-US>view </SPAN>目录中，所有的配置文件都在<SPAN lang=EN-US>resources</SPAN>目录中。更多信息请看附件<SPAN lang=EN-US>B,</SPAN>使用应用示例作为模板。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1. </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">创建一个数据模型</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Helloworld</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">应用中的数据模型仅仅是一个有<SPAN lang=EN-US>name</SPAN>和<SPAN lang=EN-US>id</SPAN>属性的<SPAN lang=EN-US>person </SPAN>类。注解<B><SPAN lang=EN-US>@Entity</SPAN></B>告诉容器映射该类到一个关系数据库表，每个属性对应表中一个字段，每个<SPAN lang=EN-US>person</SPAN>实例相当于表中的一条记录。因为<SPAN lang=EN-US>Seam</SPAN>采用非常规的配置方式，容器为表名和字段中仅仅使用类名和属性名。属性<SPAN lang=EN-US>id</SPAN>上的<B><SPAN lang=EN-US>@Id</SPAN></B>和<B><SPAN lang=EN-US>@GeneratedValue</SPAN></B>注解暗示<SPAN lang=EN-US>id</SPAN>字段是主键，它的值是应用服务器为每个保存到数据库的<SPAN lang=EN-US>peron</SPAN>对象自动生成。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>@Entity<BR>@Name("person")<BR>public class Person implements Serializable {<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private long id;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private String name;<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>@Id @GeneratedValue<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public long getId() { return id;}<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public void setId(long id) { this.id = id; }<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public String getName() { return name; }<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public void setName(String name) {this.name = name;}<BR>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Person</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">类中最重要的注解是<SPAN lang=EN-US>@Name</SPAN>，它为这个将要注册于<SPAN lang=EN-US>Seam</SPAN>中的<SPAN lang=EN-US>Person bean</SPAN>指定了名称。在其他<SPAN lang=EN-US>Seam</SPAN>组件中（例如，页面和会话<SPAN lang=EN-US>bean</SPAN>）中，开发者能指直接使用<SPAN lang=EN-US>“<B>person</B>”</SPAN>来引用被管理的<B><SPAN lang=EN-US>Person bean</SPAN></B>。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2. </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">将数据模型映射到<SPAN lang=EN-US>web</SPAN>表单</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>在<SPAN lang=EN-US>JSF</SPAN>页面中，我们使用<SPAN lang=EN-US>Person bean</SPAN>来支持表单输入文本域。<B><SPAN lang=EN-US>#{person.name}</SPAN></B>符号指代名为<SPAN lang=EN-US>“<B>person</B>”</SPAN>的<SPAN lang=EN-US>Seam</SPAN>组件的<SPAN lang=EN-US>name</SPAN>属性，名为<SPAN lang=EN-US>“<B>person</B>”</SPAN>的<SPAN lang=EN-US>Seam</SPAN>组件是<B><SPAN lang=EN-US>Person</SPAN></B>实体<SPAN lang=EN-US>bean</SPAN>的一个实例。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>&lt;h:form&gt;<BR>Please enter your name:&lt;br/&gt;<BR>&lt;h:inputText value="#{person.name}" size="15"/&gt;&lt;br/&gt;<BR>&lt;h:commandButton type="submit" value="Say Hello"<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>action="#{manager.sayHello}"/&gt;<BR>&lt;/h:form&gt;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>通过以下的实体表单，<SPAN lang=EN-US>JSF</SPAN>页面显示了数据库中所有已经向<SPAN lang=EN-US>Seam</SPAN>说<SPAN lang=EN-US>“hello”</SPAN>的用户。用户名单列表存储在一个名为<SPAN lang=EN-US>“<B>fans</B>”</SPAN>的<SPAN lang=EN-US>Seam</SPAN>组件中，它是一个<B><SPAN lang=EN-US>List </SPAN></B>对象。<SPAN lang=EN-US>JSF<B>dataTable</B></SPAN>通过遍历列表，每一行显示一个<B><SPAN lang=EN-US>Person</SPAN></B>对象。<B><SPAN lang=EN-US>Fan</SPAN></B>标记是<B><SPAN lang=EN-US>fans</SPAN></B>列表的迭代子。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>&lt;h:dataTable value="#{fans}" var="fan"&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;h:column&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>&lt;h:outputText value="#{fan.name}"/&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;/h:column&gt;<BR>&lt;/h:dataTable&gt;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-no-proof: yes"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><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:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id=图片_x0020_1 style="VISIBILITY: visible; WIDTH: 363pt; HEIGHT: 3in; mso-wrap-style: square" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://www.infoq.com/resource/articles/jboss-seam/zh/resources/image1.png;jsessionid=3285E4AB358CC2659D13A1E3FB5A04A3"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif" o:title="image1"><FONT size=4></FONT></v:imagedata></v:shape></SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>图<SPAN lang=EN-US>2.1</SPAN>显示了<SPAN lang=EN-US>Hello World</SPAN>网页<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>当用户点击<SPAN lang=EN-US>“Say Hello”</SPAN>按钮提交表单，<SPAN lang=EN-US>Seam</SPAN>用输入数据构造了该<SPAN lang=EN-US>person</SPAN>组件。然后它调用了名为<SPAN lang=EN-US>“<B>manager</B>”</SPAN>的<SPAN lang=EN-US>Seam </SPAN>组件的<SPAN lang=EN-US>sayhello()</SPAN>的方法<SPAN lang=EN-US>(</SPAN>像这样，<B><SPAN lang=EN-US>#{manager.sayHello}</SPAN></B>是表单提交按钮的<SPAN lang=EN-US>UI</SPAN>事件处理器<SPAN lang=EN-US>)</SPAN>，这就在数据库中保存了<B><SPAN lang=EN-US>person</SPAN></B>对象并且刷新了<B><SPAN lang=EN-US>fans</SPAN></B>列表。名为<B><SPAN lang=EN-US>manager</SPAN></B>的组件是一个<SPAN lang=EN-US>EJB3</SPAN>的会话<SPAN lang=EN-US>bean, </SPAN>我们将在下节讨论该话题。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2. </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">处理<SPAN lang=EN-US>web</SPAN>事件</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Seam </SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">中的名为<SPAN lang=EN-US>manager</SPAN>的组件是会话<SPAN lang=EN-US>bean <B>ManagerAction</B></SPAN>，正如该类中<B><SPAN lang=EN-US>@Name</SPAN></B>注解指定的。<B><SPAN lang=EN-US>ManagerAction</SPAN>类</B>有<B><SPAN lang=EN-US>person</SPAN></B>和<B><SPAN lang=EN-US>fans</SPAN></B>两个属性，这两个属性被<B><SPAN lang=EN-US>@In</SPAN></B>和<B><SPAN lang=EN-US>@Out</SPAN></B>所注解。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>@Stateless<BR>@Name("manager")<BR>public class ManagerAction implements Manager {<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>@In @Out<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private Person person;<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>@Out<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private List &lt;Person&gt; fans;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>注解<SPAN lang=EN-US>@In</SPAN>和<SPAN lang=EN-US>@Out</SPAN>在<SPAN lang=EN-US>Seam</SPAN>编程模型中处于核心。因此，让我们看看到底它们在这里是做什么的。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>注解<SPAN lang=EN-US>@In</SPAN>告诉<SPAN lang=EN-US>Seam</SPAN>，在此会话<SPAN lang=EN-US>bean</SPAN>中，执行任何一个方法之前，<SPAN lang=EN-US>Seam</SPAN>就会把由<SPAN lang=EN-US>JSF</SPAN>表单构造的名为<SPAN lang=EN-US>person</SPAN>组件赋给该<SPAN lang=EN-US>person</SPAN>字段（通过依赖注入）。开发者能为<SPAN lang=EN-US>@In</SPAN>中的注入的组件指定一个任意的名称，但是如果没有指定，如这里所示，<SPAN lang=EN-US>Seam</SPAN>会将同类型以及同名称的组件注入到该字段中。注解<SPAN lang=EN-US>@Out</SPAN>告诉<SPAN lang=EN-US>Seam</SPAN>，在执行任何方法后，<SPAN lang=EN-US>Seam</SPAN>会将属性<SPAN lang=EN-US>fans</SPAN>值和属性<SPAN lang=EN-US>person</SPAN>的值都赋给被<SPAN lang=EN-US>Seam</SPAN>管理的同名的组件。在<SPAN lang=EN-US>Seam</SPAN>中，我们将这个操作称作<SPAN lang=EN-US> “</SPAN>依赖抛出<SPAN lang=EN-US>”</SPAN>。以此，在<SPAN lang=EN-US>ManagerAction.sayHello()</SPAN>方法中，我们仅仅需要更新属性<SPAN lang=EN-US>fans</SPAN>和属性<SPAN lang=EN-US>person</SPAN>的值，它们会自动显示在页面上。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><FONT size=4><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">什么是双向映射</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>在<SPAN lang=EN-US>Seam </SPAN>文件中，有时你就会看到术语<SPAN lang=EN-US>“</SPAN>双向映射<SPAN lang=EN-US>”</SPAN>。它指的是被<SPAN lang=EN-US>Seam</SPAN>管理的组件和<SPAN lang=EN-US>Seam</SPAN>管理上下之间的注入和抛出。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>因为<B><SPAN lang=EN-US>person</SPAN></B>属性已经通过注入持有了表单数据，<B><SPAN lang=EN-US>sayHello()</SPAN></B>方法仅仅是通过<SPAN lang=EN-US>JPA <B>EntityManager</B></SPAN>将它保存到数据库中，<SPAN lang=EN-US>JPA <B>EntityManager</B></SPAN>也是通过<B><SPAN lang=EN-US>@PersistenceContext</SPAN></B>注入的。当方法返回之后，它便更新了<B><SPAN lang=EN-US>fans</SPAN></B>和<B><SPAN lang=EN-US>person</SPAN></B>对象并且把这两个对象抛出。方法<B><SPAN lang=EN-US>sayHello()</SPAN></B>一般会返回<SPAN lang=EN-US>null</SPAN>，预示着在调用之后，更新的数据模型将在当前的<SPAN lang=EN-US>JSF</SPAN>页面显示。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>@PersistenceContext<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private EntityManager em;<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public String sayHello () {<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>em.persist (person);<BR><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>person = new Person ();<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>fans = em.createQuery("select p from Person p")<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>.getResultList();<BR><BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>return null;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>除了一些细节，我们基本完成了。可能你已经注意到，<SPAN lang=EN-US>ManagerAction bean</SPAN>类实现了<SPAN lang=EN-US>Manager</SPAN>接口。为了符合<SPAN lang=EN-US>EJB3</SPAN>会话<SPAN lang=EN-US>bean </SPAN>规范，我需要一个能列出<SPAN lang=EN-US>bean</SPAN>中所有业务方法的方法。下面是接口<SPAN lang=EN-US>Manager</SPAN>代码，幸运的是，用任何高级<SPAN lang=EN-US>IDE</SPAN>工具都能轻松地自动生成这个接口。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>@Local<BR>public interface Manager {<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public String sayHello ();<BR>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>这就是在<SPAN lang=EN-US>Hello World</SPAN>例子中需要的所有代码。后面两章小节将涵盖<SPAN lang=EN-US>Seam</SPAN>应用的其他方法和配置。如果开发者为了自己的小型数据库应用想立即编码和定制<SPAN lang=EN-US>helloworld</SPAN>项目，那么现在就可以跳过本章的剩余部分。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4. </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">更易于理解的<SPAN lang=EN-US>seam</SPAN>编程模型</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>现在我们已经大致了解了<SPAN lang=EN-US>Hello World</SPAN>的应用。但是我们还有一些重要的话题继续，例如其他折中途径以及前面代码没有涉及到重要特性，我们将在本节讨论这些话题。它们能帮助开发者对<SPAN lang=EN-US>seam</SPAN>更深刻的理解，但是如果你没有耐心，可以直接跳过本节，需要的时再来阅读。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 4" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4.1 Seam POJO</SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">组件<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>上例中，我们用一个<SPAN lang=EN-US>EJB3</SPAN>会话<SPAN lang=EN-US>bean</SPAN>实现了应用逻辑，但是我们并不局限于<SPAN lang=EN-US>EJB3</SPAN>组件。事实上，<SPAN lang=EN-US>Seam</SPAN>中任何一个有<B><SPAN lang=EN-US>@Name</SPAN></B>注解的<SPAN lang=EN-US>POJO</SPAN>都能被转化为一个可管理的组件。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>例如，我们能将<B><SPAN lang=EN-US>ManagerAction</SPAN></B>转化为一个<SPAN lang=EN-US> POJO</SPAN>，而不是一个<SPAN lang=EN-US>EJB3 session bean</SPAN>。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>@Name("manager")<BR>public class ManagerAction {<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>@In (create=true)<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private EntityManager em;<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>... ...<BR>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>使用<SPAN lang=EN-US>POJO</SPAN>取代<SPAN lang=EN-US>EJB3 bean</SPAN>有正反两方面意见，使用<SPAN lang=EN-US>POJO</SPAN>编程时很简单，因为它们不需要<SPAN lang=EN-US>EJB3</SPAN>特有的注解和接口（参见上文）。如果你的所有业务组件都是<SPAN lang=EN-US>Seam POJO, </SPAN>那么你就能不依赖<SPAN lang=EN-US>EJB3</SPAN>应用服务器，运行你的<SPAN lang=EN-US>Seam </SPAN>应用（参见<SPAN lang=EN-US>23</SPAN>章，没有<SPAN lang=EN-US>EJB3</SPAN>的<SPAN lang=EN-US>Seam)</SPAN>。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>但是，<SPAN lang=EN-US>POJO</SPAN>比<SPAN lang=EN-US>EJB3</SPAN>的功能少，因为<SPAN lang=EN-US>POJO</SPAN>不能获得<SPAN lang=EN-US>EJB3</SPAN>容器服务。在不依赖<SPAN lang=EN-US>EJB3</SPAN>的<SPAN lang=EN-US>Seam </SPAN>中丧失的<SPAN lang=EN-US>EJB3</SPAN>服务就包括以下几点：<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<UL type=disc>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">@PersistenceContext</SPAN></B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">注入在<SPAN lang=EN-US>POJO</SPAN>中不在管用。为了在一个<SPAN lang=EN-US>Seam POJO</SPAN>中得到<SPAN lang=EN-US>EntityManager</SPAN>，开发者不得不在<SPAN lang=EN-US>Seam</SPAN>配种文件中初始化<SPAN lang=EN-US>EntityManager</SPAN>，然后使用<SPAN lang=EN-US>Seam</SPAN>注解<SPAN lang=EN-US>@In</SPAN>将它注入到<SPAN lang=EN-US>POJO</SPAN>中。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">POJOs</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">中将不在支持方法级别事务声明（<SPAN lang=EN-US>declarative method-level transaction</SPAN>）。相反，你可以配置<SPAN lang=EN-US>Seam</SPAN>来划分事务，可以从收到<SPAN lang=EN-US>web</SPAN>请求开始直到响应页面产生结束。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Seam POJO</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">不是消息驱动组件。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>不支持注解为<B><SPAN lang=EN-US>@Asynchronous</SPAN></B>的方法。 <SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>不支持容器安全管理。 <SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>没有事务或者组件级别的持久上下文。<SPAN lang=EN-US>Seam POJO</SPAN>中的所有的持久上下文都是经过拓展的（更多细节请参见<SPAN lang=EN-US>7.1 “</SPAN>默认的对话作用域<SPAN lang=EN-US>”</SPAN>）。 <SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>没有集成容器管理的体系结构（例如，<SPAN lang=EN-US>JMX</SPAN>控制台服务）。 <SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Seam POJO</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">方法中没有<SPAN lang=EN-US>Java RMI</SPAN>。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Seam POJO</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">不能是注解为<B><SPAN lang=EN-US>@WebService</SPAN></B>组件。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></LI>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>没有<SPAN lang=EN-US>JCA</SPAN>集成。 <SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></LI></UL>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>所以当在<SPAN lang=EN-US>EJB3</SPAN>容器中进行部署时，为什么每个人都想使用<SPAN lang=EN-US>POJO</SPAN>组件？答案就是，<SPAN lang=EN-US>POJO</SPAN>组件对于纯<SPAN lang=EN-US>“</SPAN>业务逻辑<SPAN lang=EN-US>”</SPAN>组件非常有益。<SPAN lang=EN-US>POJO</SPAN>为其他组件代理了数据访问、消息传递和其他基本功能。例如，我们能使用<SPAN lang=EN-US>POJO</SPAN>组件操纵<SPAN lang=EN-US>Seam</SPAN>数据访问对象，这对<SPAN lang=EN-US>“</SPAN>业务逻辑<SPAN lang=EN-US>”POJO</SPAN>是非常有用的，因为它们可以在需要的时候，在其他框架中被重用。但是总的来说，它们的应用要比<SPAN lang=EN-US>EJB3</SPAN>组件少，特别是在中小型应用中。所以，本书的大多数例子我们都使用<SPAN lang=EN-US>EJB3</SPAN>组件。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 4" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4.2 </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">易于测试<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>我们已经在第一章中提到，<SPAN lang=EN-US>Seam</SPAN>为了不依赖容器的方便的测试，进行了重新设计。在<B><SPAN lang=EN-US>helloworld</SPAN></B>项目中，我们在测试文件夹中包括了单元测试和集成测试这两个测试用例。在纯<SPAN lang=EN-US>Java SE</SPAN>环境下，<SPAN lang=EN-US>Seam </SPAN>测试体系模拟了数据库、<SPAN lang=EN-US>JSF</SPAN>、<SPAN lang=EN-US>Seam</SPAN>上下文以及其他应用服务器服务，只要运行<SPAN lang=EN-US>ant test</SPAN>命令就能运行所有的测试。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 4" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4.3 </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">基于<SPAN lang=EN-US>Getter</SPAN>和<SPAN lang=EN-US>Setter</SPAN>的双向映射<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>在<SPAN lang=EN-US>Hello World</SPAN>一例中，我们已经展示了通过成员变量对<SPAN lang=EN-US>Seam</SPAN>组件进行的双向映射，你也能通过<SPAN lang=EN-US>Getter</SPAN>和<SPAN lang=EN-US>Setter</SPAN>方法对组件进行双向映射。例如，以下代码就工作的很好。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>private Person person;<BR>private List &lt;Person&gt; fans;<BR><BR>@In<BR>public void setPerson (Person person) {<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>this.person = person;<BR>}<BR>@Out<BR>public Person getPerson () {<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>return person;<BR>}<BR>@Out<BR>public List &lt;Person&gt; getFans () {<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>return fans;<BR>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>虽然以上的<SPAN lang=EN-US>getter</SPAN>和<SPAN lang=EN-US>setter</SPAN>方法看似轻微，利用<SPAN lang=EN-US>getter</SPAN>和<SPAN lang=EN-US>setter</SPAN>方法的双向映射真正的价值在于能其加入定制逻辑来操纵双向映射的过程。例如，你可以验证被注入的对象或者快速地从数据库重新得到被抛出的对象。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 4" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4.4</SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">避免过度的双向映射<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>在<SPAN lang=EN-US>Hello World</SPAN>一例中<SPAN lang=EN-US> ,</SPAN>通过将数据组件作为业务组件的属性，可以轻易的减少或者消除双向映射。在<SPAN lang=EN-US>JSF</SPAN>页面中，通过这种方式，开发者只需要引用业务组件，而不需要在业务组件和数据组件之间的双向映射。例如，开发者可以修改<SPAN lang=EN-US> ManagerAction</SPAN>类为以下所述。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>依赖双向映射是一个非常实用的设计模式。但是，正如其他设计模式，过度使用就会有害。过度的依赖双向映射让代码变得难以阅读，因为开发者必须理解每个注入的组件出自何处。过度的依赖双向映射也能增加性能消耗，因为双向映射是在运行时进行。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>@Stateless<BR>@Name("manager")<BR>public class ManagerAction implements Manager {<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private Person person;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public Person getPerson () {return person;}<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public void setPerson (Person person) {<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>this.person = person;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}<BR><BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private List &lt;Person&gt; fans;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public List&lt;Person&gt; getFans () {return fans;}<BR><BR>...<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>...<BR>}<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>接下来，我们在页面上引用的属性如下：<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>&lt;h:form&gt;<BR><BR>Please enter your name:&lt;br/&gt;<BR><BR>&lt;h:inputText value="#{manager.person.name}"/&gt;<BR>&lt;br/&gt;<BR>&lt;h:commandButton type="submit" value="Say Hello"<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>action="#{manager.sayHello}"/&gt;<BR>&lt;/h:form&gt;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>... ...<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>&lt;h:dataTable value="#{manager.fans}" var="fan"&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;h:column&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>&lt;h:outputText value="#{fan.name}"/&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;/h:column&gt;<BR>&lt;/h:dataTable&gt;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>最后，具有了依赖管理的<SPAN lang=EN-US>Seam</SPAN>是多用的。通常用数据访问业务组件封装数据是一项好的实践，特别是针对有状态业务组件。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 4" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4.5 JSF</SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">中的页面导航<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>本例中，只有一个页面。每次点击按钮后，<SPAN lang=EN-US>JSF</SPAN>页面会重新显示更新过的数据模型。显然，大多数<SPAN lang=EN-US>web</SPAN>应用多于一个页面。在<SPAN lang=EN-US>JSF</SPAN>中，一个用户界面事件处理器能通过返回导航规则名称，决定下一步该显示哪个页面。例如，开发者可以在<B><SPAN lang=EN-US>navigation.xml</SPAN></B>中定义以下导航规则。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>&lt;navigation-case&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;from-outcome&gt;anotherPage&lt;/from-outcome&gt;<BR><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;to-view-id&gt;/anotherPage.jsp&lt;/to-view-id&gt;<BR>&lt;/navigation-case&gt;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><FONT size=4>之后，如果<SPAN lang=EN-US>sayHello()</SPAN>方法返回一个名为<SPAN lang=EN-US>“another page”</SPAN>的字符串，<SPAN lang=EN-US>JSF</SPAN>下一步就该展示<SPAN lang=EN-US>anotherPage.jsp</SPAN>。<SPAN lang=EN-US>UI</SPAN>事件处理器决定了接下来要显示哪个页面，从而为我们带来了有步骤的控制。<SPAN lang=EN-US><o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 4" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4.6 </SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">通过<SPAN lang=EN-US>EntityManager</SPAN>访问数据库<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">JPA</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">（<SPAN lang=EN-US>Java Persistence API</SPAN>）<B><SPAN lang=EN-US>EntityManager</SPAN></B>管理着关系数据库表与实体<SPAN lang=EN-US>bean </SPAN>之间的映射。<B><SPAN lang=EN-US>EntityManager</SPAN></B><SPAN lang=EN-US> </SPAN>在运行时由应用服务器创建。你能使用注解<SPAN lang=EN-US>@PersistenceContext</SPAN>，注入一个<SPAN lang=EN-US>EntityManager</SPAN>的实例。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT size=4><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; ms]]></description>
</item><item>
<title><![CDATA[教你咋使war文件【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41420</link>
<author>shengjorden</author>
<pubDate>2008/11/28 10:45:50</pubDate>
<description><![CDATA[<P><FONT size=4>　转自</FONT></P>
<P><FONT size=4>http://blog.163.com/zhangqian_sms/blog/static/54448338200872511318352/</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>作者：臭p孩儿 转载请注明出处及作者 三球<IMG src="http://www.phpx.com/happy/images/smilies/lol.gif" border=0></FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>不知道你听说过没有war文件？啥？可不是“战争”文件哦，没听过？好就让我告诉你它是干啥跌。。。。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>如果你了解些java，那么jar文件肯定知道，那war文件到底是干啥的捏？</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>当你一个web应用程序很多的时候，如果你想把它部署到别的机器上，来回拷这些文件是件挺郁闷的事情，如果要是一个文件就好了。。。那么war文件就可以满足你这个小小的要求。它的打包方式跟jar很相似，也是用jar命令,代开命令提示符（cmd），来到你的项目目录下（比如你的项目名叫web1）执行如下命令：</FONT></P>
<P style="TEXT-INDENT: 2em">
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD>
<P><FONT size=4></FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>CODE:</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>jar -cvf web1.war *</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4></FONT></P></TD></TR></TBODY></TABLE></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>哎。。。就这么简单，完事儿鸟，这回你再执行以下dir，看看web1目录下是不是多了个web1.war文件，如果你想看里面都包含了啥文件，你可以用：</FONT></P>
<P style="TEXT-INDENT: 2em">
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD>
<P><FONT size=4></FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>CODE:</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>jar -tf web1.war</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4></FONT></P></TD></TR></TBODY></TABLE></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>察看，或者用winrar软件，虽然它本身没有支持war，你强行用它打开也中。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>有了war文件就好办多鸟~~把这个war文件放到你的tomcat安装目录下的webapps目录下，然后启动tomcat，直接浏览那个项目所在的目录，比如http://localhost:8080/web1/,出来了吧，^_^</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>注:在一个资料上看到,说在tomcat安装目录下的conf目录下有个server.xml，打开搜索“unpackWARs”关键字，你会看到在<HOST>标签中会有对其的设置，是这样说的，如果设置成true，那么tomcat在启动的时候，会在webapps目录下自动解压你那个war文件；如果设置成false，则tomcat直接访问war文件（这个我在测试的时候，无论设置成true or false，都没有解压那个war文件，都是直接读取war，有心的朋友可以测试下，如果果然是这样可以告诉偶一下咋回事儿，我的tomcat版本是5.0.28）</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>那有的朋友会说了，“那个war跟jar有啥区别啊？”恭喜你，已经会抢答啦，咔咔。。。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>区别就是，当你的项目在没有完全竣工的时候，不适合使用war文件，因为你的类会由于调试之类的经常改，这样来回删除、创建war文件很不爽，最好是你的项目已经完成了，不改了，那么就打个war包吧，这个时候一个war文件就相当于一个web应用程序鸟；而jar文件就是把类和一些相关的资源封装到一个包中，便于程序中引用。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>温馨Tips:在建立war文件的时候，不用将源码也压缩到其中，把src目录移走即可。</FONT></P>]]></description>
</item><item>
<title><![CDATA[工作以后十不要【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41337</link>
<author>shengjorden</author>
<pubDate>2008/11/24 21:16:30</pubDate>
<description><![CDATA[<A><FONT size=4>　</FONT></A>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma"><FONT size=4>工作以后十不要</FONT></SPAN></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 face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第一：不要认为停留在心灵的舒适区域内是可以原谅的。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">每个人都有一个舒适区域，在这个区域内是很自我的，不愿意被打扰，不愿意被</SPAN><SPAN lang=EN-US><FONT face=Calibri>push</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，不愿意和陌生的面孔交谈，不愿意被人指责，不愿意按照规定的时限做事，不愿意主动的去关心别人，不愿意去思考别人还有什么没有想到。这在学生时代是很容易被理解的，有时候这样的同学还跟</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">冷酷</SPAN><SPAN lang=EN-US><FONT face=Calibri>”“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个性</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这些字眼沾边，算作是褒义。然而相反，在工作之后，你要极力改变这一现状。否则，你会很快变成鸡尾酒会上唯一没有人理睬的对象，或是很快因为压力而内分泌失调。但是，如果你能很快打破之前学生期所处的舒适区域，比别人更快的处理好业务、人际、舆论之间的关系，那就能很快的脱颖而出。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>在会议上，一个停留在心灵舒适区域的人会消极的听取领导的话语，消极的待命，很死的完成上级交给的事情，但从来不关心此事以外的任何事情，更不会想到多做一步，让接下来的别人的工作更加容易上手。而敢于打破这个舒适区域的人，敢于在适当的时候提出自己的看法和不理解，并在得到上级认可和指点之后把手头的工作尽快的完成，并随时接受别人的批评和调整。（注意：永远不要等待别人把你的想法说出来，这是典型的前者）</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>在工作上，当前者遇到一名新的同事，他会装作没有看见，继续自己的工作。殊不知新来的同事不久就变成了自己的上司。而后者则大方客气的自我介绍，并了解对方和自己的关系。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>在聚会上，前者总是等待别人发言，并喜欢私下里评论对方的言语；如果这个桌子上没有人发言，那直到用餐结束，也没有人认识你。而后者是勇敢的和一同吃饭的开始介绍和闲谈，这看起来很困难，有时候会有失面子，但往往你会发现，对方是多么希望能和你说几句话。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">以上只是很小的几个例子，但是要说明的是，大学生在走出校园的同时就要在工作上把校园中的</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">随意性</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">从身边赶走，尽早的冲出自己的舒适区域，开始做好和这个社会交流的准备。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">第二：不要把</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">好像</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">；</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有人会</SPAN><SPAN lang=EN-US><FONT face=Calibri>……”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">；</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">大概</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">；</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">晚些时候</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">；</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">或者</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">；</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">说不定</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">之类放在嘴边。尤其是和上级谈论工作的时候。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">我十分痛恨听到的一句话是：</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">我晚些时候会把这个文件发给所有的人</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">；因为这往往预示着我必须时刻提醒他不要忘记。同样，以下这些言辞也会让人觉得厌恶至极：</SPAN></FONT><SPAN lang=EN-US><BR><FONT face=Calibri size=4>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>到时候有人会把那些东西都准备好</FONT></SPAN><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>”<BR>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">大概是明天</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>”<BR>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">明天或者后天客户会过来拜访</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>”<BR>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">好像他说</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>……”<BR><BR></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">一般是人都会这样说话的，因为这样第一给自己留下了广阔的余地，第二也不会给别人造成很大的压迫感，好像什么事情一定要弄个水落石出似的。说实话大学里面再用功的人都有一半是混的。一个人要么是在课堂上是混的，要么下课之后是混的。两个都没有带有混的色彩的人，要么是超级牛人，要么是神经病。所以，就因为人人都在混的，所以校园是一个浪漫的地方，校园也容易让人单纯。所以学生社团的工作往往是效率很低的，我现在回想起学校里做的工作，当时还觉得挺卖力的，但工作了之后才开始感觉到什么是效率。当你进入了用金钱计算时间的地方之后，你要尽可能的避免在学校里养成的这种习惯。如果上级问你什么时候能实施你给他的承诺，而你回答</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">今晚或者明天早上</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这样的答案对于他来说完全等同于你没有回答，并且还给他留下了一个坏印象。（当然，这样的回答往往在学校社团，学生会工作中是常见的）</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有一个寓言故事，一只小老鼠刚刚出世不久，老鼠妈妈问小老鼠：你现在能看见了吗？</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">小老鼠说：能。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">老鼠妈妈说：那你能看到那块红薯吗？</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">小老鼠说：是的。老鼠妈妈说：那是一块石头，这说明你不但还看不见东西，你连嗅觉都还没有。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>似是而非的应答往往一样会暴露出你更多的弱点。可能是以下中的一个或几个：</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>1.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你之前没有想到这个工作，或者一直在拖延。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>2.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你没有责任心，认为这些并不重要。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>3.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你应付上级。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>4.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你不敢说真话。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>5.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你喜欢逞能，答应一些做不到的事情。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>6.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你不能独立工作。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>当你的上级在以上选项中怀疑的时候，潜意识中你已经同时具备了以上所有的弱点了。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>相反的看来，这样的回答，总是让上司恼火。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第一，他的问题没有得到回答，只是起到了提醒你的作用。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第二，他依然需要记住提醒你，因为他不知道你是否真正已经落实了工作。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第三，他不知道有多少你已经做了的事情中，都是这样没有落实的。（这点非常致命）</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第四，往往因为没有得到满意的答案，上司自己的计划不得不被耽搁或推迟或不能给出明朗的结束时间。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>所以</FONT></SPAN><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>---------<BR></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">甲问：你什么时候能把要这个漏洞修好？</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>乙说：我已经通知他们了，他们大概明天就会来修的。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>一天后</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>甲问：维修公司什么时候回来，你找的是哪家维修公司？</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>乙说：好像他们说安排不出人来，如果可以的话，今天晚上或者明天下午就能过来。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>一天后</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>甲问：漏洞怎么还没有修好？</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>乙说：我晚点再问问他们。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">甲说：今天下午之前不解决，明天不用来上班了。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第三：不要拖延工作</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">很多人喜欢在学习和玩耍之间先选择后者，然后在最后时间一次性赶工把考试要复习的东西突击完成。但是在工作中请不要养成这样的习惯，因为工作是永远做不完的，容不得你</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">突击</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。又或者，当你在徘徊和彷徨如何实施的时候，你的领导已经看不下去，自己去做了。</SPAN><SPAN lang=EN-US><FONT face=Calibri>----</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这是一个危险的信号。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">往往我们总是想把事情从头到尾全部想好了，才开始走第一步</SPAN><SPAN lang=EN-US><FONT face=Calibri>-----</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">就摔倒了。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">举个例子：</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">我小学的时候第一次给我一个喜欢的女孩子打电话的时候，想象了各种情况</SPAN><SPAN lang=EN-US><FONT face=Calibri>-------1</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，她接电话的时候在做作业。</SPAN><SPAN lang=EN-US><FONT face=Calibri>2</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，她在做作业，她妈妈接的电话。</SPAN><SPAN lang=EN-US><FONT face=Calibri>3.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她也很无聊，很想找人说话。</SPAN><SPAN lang=EN-US><FONT face=Calibri>4.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她正在被父母训斥。</SPAN><SPAN lang=EN-US><FONT face=Calibri> 5.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她正在想另外一个男孩。</SPAN><SPAN lang=EN-US><FONT face=Calibri>6.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她父亲接电话。</SPAN><SPAN lang=EN-US><FONT face=Calibri> 7.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她家正好来了什么亲戚，亲戚接了电话。</SPAN><SPAN lang=EN-US><FONT face=Calibri> 8.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她接了电话，但父母就在身边，说话不方便。。。。。等等等等。我整整想了一个下午，想好了各种情况的心理准备和应对的策略。然后勇敢的拿起电话机，按下了那几个按钮。结果</SPAN><SPAN lang=EN-US><FONT face=Calibri>-------</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">她不在家。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>所以，当你徘徊不前而手足无措的时候，你要意识到你正在拖延工作。徘徊是因为害怕这个事情可能发生的后果需要自己承担或应付。工作的时候需要一种起码的自信，相信自己有能力，不管下一步是什么状况，我都能把它引导到我需要的那条线上去的。另外，告诉自己，不要想太多时间，如果不知道，就赶快求助，或想办法，苦恼和忧虑会给你更多的压力也会把剩下的时间蚕食殆尽。</FONT></SPAN><SPAN lang=EN-US><BR><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">另外，警告一下：永远不要想，我知道了，先把上级派的事情放一下，等这集《越狱》看完再说。</SPAN><SPAN lang=EN-US><FONT face=Calibri>----90%</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的情况下，你会忘记，或者来不及，因为这件事需要比你原先想象要更多的时间。说做就做，一直是很好的习惯。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第四：不要认为理论上可以实施就大功告成了！</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>这点太重要了，往往当真正实施的人开始做了才会发现计划完全等于鬼话。如果不亲自实践，做计划的人会早晚被实施的鄙视。永远需要提升自己的办实事的能力，而不是空谈。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>首先，如果你是做办公室工作的，或者做策划和计划的。请千万不要把你自己都认为不太可能或者很难做到的事情，让别人试试看。比如，用一个下午的时间在人流量很少的地方举办露天歌唱会。这会让执行的人觉得你在玩他，拿他做实验。没错，理论上，在任何地方都能举办歌唱会，但是，在不同的地方，执行的人的心情是不一样的。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>其次，和执行的人讨论你的安排。比如，新来的你的下属，你可以安排她坐在任何地方，但是如果那是一个很难和大家接触的角落，这可能比你什么都不安排更差。的确，理论上一个人要坐下来，需要的只是空间。但事实上远远不止那些。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">再次，不要奢望一切会随着你的计划进行。理论上这个会议会持续两个小时，但是，这是</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不考虑在开场后的</SPAN><SPAN lang=EN-US><FONT face=Calibri>30</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">分钟全场都在调试话筒</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，或者</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">场下没有提出如此尖锐的问题</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的前提下的状态。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">大学生已经习惯了把事情做到</SPAN><SPAN lang=EN-US><FONT face=Calibri>&nbsp;&nbsp;"</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">理论上看上去很美</SPAN><SPAN lang=EN-US><FONT face=Calibri>"</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的程度了。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">论文，</SPAN><SPAN lang=EN-US><FONT face=Calibri>ppt</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">讲演，考试，辩论赛</SPAN><SPAN lang=EN-US><FONT face=Calibri>…… </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这些校园智商大比拼，都是教我们如何完美的做好</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">纸上谈兵</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的功夫。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">你一定要相信自己能</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">搞定</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">事情的能力比想象的弱。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>如果你是在学校的学生，测试一下自己，能否能搞定以下这些状况：</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>1.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>学校要制作一套校服，由你去寻找供应商，砍价，至少有三家公司的报价。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>2.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>学校保安抓住一个学生偷窃，怎么处理？</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>3.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>学校的一个很重要路段的路灯坏了，你能否让它三天内继续亮起来。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>4.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>食堂需要请一位专门烧清真菜的厨师，一周内到岗位。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当你开始思考以上这样的问题的时候，你会发现，他的思路和</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">看过去两年这个公司的业绩趋向，做出一个下个季度的市场策划方案</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">要相差极大。你会发现后者只要你做到</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">看上去很完美</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，没有人知道按照你这样做结果会怎样。而上述的工作你只要一想，就会体会到不少的压力。因为你不处理好，结果就是明显的失败更大的问题就会相继发生。</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">对了，这种感觉就是</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">工作</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">给你的感觉！这就是</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">工作</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">纸上谈兵</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的差别！</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第五：不要让别人等你</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>在任何情况下都不要让别人放下手头的工作来等你。在大学中可能只是同寝室的人的几句半开玩笑的抱怨，在工作上很可能导致你的潜在合作伙伴的丢失。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>你在做一个工作的同时要知道别人的进度，而永远不要落后。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这不像是在考试，你比别人做的慢，别人可以先交卷，你到时间了做不完你自己承受扣分。在工作中的情况是这样的：这是一场没有人能做完的考试，所有的人，都分配做一张试卷的不同部分，有的人分到的是阅读理解，有的人做的是完形填空，有的人做的是语法</SPAN><SPAN lang=EN-US><FONT face=Calibri>…… </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">然后大家做完了相互抄，这样，所有人都做完了。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">如果大家都把各自的部分做完了，而你却还在没有做完，那么做得快的别人会开始做你的那部分题目，然后也是相互抄。慢慢地，大家会发现你的工作量完全可以由另外人来代替，整个团队中可以不需要你，这个时候，没有人从你这里得到试卷的答案，也没有人会给你他们的答案</SPAN><SPAN lang=EN-US><FONT face=Calibri>--------</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">很不幸，你已经没有利用价值了。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">请一定记住这个例子。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第六：不要认为细节不重要</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>在大学里，往往做事粗枝大叶，看看差不多就行了。相反，在企业里管理的精髓就在于将简单的事情做到细节。一个慌忙寻找保险箱钥匙的动作就很有可能丧失你晋升财务主管的机会。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">公司的管理，其实需要的并不是把很难的事情做到</SPAN><SPAN lang=EN-US><FONT face=Calibri>90%----</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">比如，优化管理层的核心工作流程、改变公司在当地政府面前的形象，提高产品质量，改善工作环境</SPAN><SPAN lang=EN-US><FONT face=Calibri>…… </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">而管理要做的是把每个简单的事情做到</SPAN><SPAN lang=EN-US><FONT face=Calibri>100%-----</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">比如，把公司的每个人的档案都按照一定的规律整齐的存放起来、在门卫设立一个外来人员的签到台、把会议室多余的椅子拿走、和电视台讲好下个礼拜三来公司做采访、把试用装送到客户手里、在生产的咖啡上加一个口子、给下一期的封面人物拍照</SPAN><SPAN lang=EN-US><FONT face=Calibri>……</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">等等如此。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">如果你能把所有细节的问题都如实做到，那你才有开口升职的本钱。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">很多人在毕业的时候不知道自己将来要做什么，于是就和自己说：我以后做管理吧！做管理？问一下自己，如果，公司资产被偷窃了，所有员工士气低下，办公室杂乱无章，公司电梯又坏了，打印机没墨了，采购计划超支了，产品滞销了，客户迟到了</SPAN><SPAN lang=EN-US><FONT face=Calibri>……</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">你愿意解决这样的问题，并从小事开始做起吗？想好了这些再考虑是否把管理看得太空洞了。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第七：不要表现得消极，仅仅因为你所做的事情不是你的兴趣所在。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">很显然，在学生时代，当做到自己喜欢的时候，我们会</SPAN><SPAN lang=EN-US><FONT face=Calibri>pay200%</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的精力去创造，但如果是枯燥的事务，我们便懒得理睬，最好能有办法应付过去。但在工作上</SPAN><SPAN lang=EN-US><FONT face=Calibri>80%</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">你所做的事情都是繁琐而看似机械的，如果仅仅为此而表现的闷闷不乐，那么你会郁闷更久。要知道你的上司已经为这个项目够烦恼了，你还想让他看到你的表情吗？</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">学会喜欢自己的工作，并把注意力放在日常工作能学到些什么上去。如果现在你努力的抱怨工作，那么接下来你就是努力的寻找工作。尽量少用</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有趣</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">好奇</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">之类的词语来描述自己想要的工作，而是</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">充实</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有成就感</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">乐意</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>”<BR></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">之类。</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>想想以下职位，你会发现生活中很多工作不是在等你有很好的状态下让你做的很有趣的事情：</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>1.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>高速公路收费口的收费员：一天都是面对一个小窗口，把一张卡片送出去，这样要持续好几年。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>2.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>学校食堂厨师：永远在烧大排和鸡腿。烧一年。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>3.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>作家：交稿期要到了，我还在孕育灵感，两个星期没吃早饭了。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>4.</FONT></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">外科医生：刚刚睡着，马上叫我做一个</SPAN><SPAN lang=EN-US><FONT face=Calibri>3</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">小时的手术。这样至少一周一次。</SPAN></FONT><SPAN lang=EN-US><BR><FONT face=Calibri size=4>5.</FONT></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">门市部销售：产品不好卖，</SPAN><SPAN lang=EN-US><FONT face=Calibri>8</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">点上班来就坐在店门口，一个人，坐到晚上</SPAN><SPAN lang=EN-US><FONT face=Calibri>6</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">点，今天没有一个人来，和昨天一样。</SPAN></FONT><SPAN lang=EN-US><BR><FONT face=Calibri size=4>6.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>公交司机：我开车不用你指挥。这条线路我开了三年了。</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>7.</FONT></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">宠物商店店员：生意不好，还要一早就过来听着</SPAN><SPAN lang=EN-US><FONT face=Calibri>20</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">条狗的叫声一整天，听一年。</SPAN></FONT><SPAN lang=EN-US><BR><FONT face=Calibri size=4>8.</FONT></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">公司职员：晚上两点下班，第二天还要</SPAN><SPAN lang=EN-US><FONT face=Calibri>8</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">点上班。关键是路上还要一小时。这样已经一个月了。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>再想想自己是不是只是接触了这个工作一个月或者才碰到没几个困难，这个时候抱怨的声音最大。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">千万不要想着去选择一个有趣的职业，因为没有那样的工作存在。没有哪一</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">种</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">行业是开心的，因为如果有，那所有人都去干那个了。最多试着问问自己本身的兴趣吧。</SPAN><SPAN lang=EN-US><FONT face=Calibri>self exploration</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第八：绝对不要把改善工作能力仅寄托在公司培训上</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">人绝对不可能经过一次培训就脱胎换骨。相反，集体培训上学到的东西往往是最用不上的信息。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">就像食堂烧大锅菜一样，总没有你最想吃的菜，因为这样做容易，并且不容易得罪人。</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>很多学生很看重所选的公司有没有培训，这说明，你不但不知道这个公司做什么，你甚至不知道怎样学习这些技能。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">我的感悟是如果你不知道怎么学你想要的知识，也不知道你想要的知识是什么，你只会做出两种行为：</SPAN><SPAN lang=EN-US><FONT face=Calibri>1</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。等待别人来教你，并且等待别人发现你不知道的地方。</SPAN><SPAN lang=EN-US><FONT face=Calibri>2.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">寻找现成的答案并且拷贝。期待公司培训的人，就很大概率上是第一种人（不排除极少真正优秀的公司培训）</SPAN></FONT><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>许多的同学有这样的习惯思维：</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>因为，这个公司的培训能结束达到多少多少的程度</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>又因为，这个程度正好是我想达到的</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>所以我尽力进这家公司</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>因为我进了这家公司</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>所以它自然会使我达到了这个期望的程度。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>我们把参加培训和达到效果很幼稚的画上了等号。其实往往集体培训上所得到的信息是最没有实际操作价值的。永远不要期望单靠听课，靠老师把同样的东西给所有的人，你会得到比别人更多。把更多的心思放在观察和思考自己的需要上，找到问题的所在再通过观察和实践得到的答案才是真正的知识。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">所以，刚刚开始工作，什么都不会，不要认为那样是正常的，因为公司还没有培训过呢！等我接受培训了之后，我就全都会了。如果你一无所知还等待别人会可怜你的无知而施舍你知识，那你会为你的无知而付出更多的智商。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>第九：不要推卸责任</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>推卸责任是害怕的条件反射。不要认为别人看不出这点。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>我记得我小学里的一件事情。我一次作业没有带来，老师要训斥我，说：你怎么老是作业不带？</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">我当时说：不是。。。。</SPAN><FONT face=Calibri> </FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当我正要支支吾吾时候，老师说：什么不是？你带来了没有？</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>我说：没有</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>老师说：那不就是没有带！什么不是！就是！</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">之后我就发现，我只是害怕承担责任而条件反射似的就说了</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不是</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，仔细观察一下周围，你会发现，身边有无数的人在用</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不是</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">作为被责问之后的第一反应。</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>其实现在很多人面对工作也是这样，当上级责问的时候，很条件反射的就做出了推卸动作，然而这样的动作，接下来往往是无力的辩解，以及一些很粗糙的借口。这样会让上司感到你这个人很难沟通，并且很不真实。</FONT></SPAN><SPAN lang=EN-US><BR><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>另外一种情况，就是无论什么情况下，我指责一个人，他永远是强调客观。其实这点才是学生最典型的特征。这说明他太容易受到其他事物的影响，并受它们决定。如果你和上司之间会出现以下类型的对话，想想是不是需要改一下你的处事方法。</FONT></SPAN><SPAN lang=EN-US><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>甲：为什么到现在还没有给副总看你的报告！</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">乙：刚才</SPAN><SPAN lang=EN-US><FONT face=Calibri>c</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">在打印，我在等他结束，现在他大概好了吧，我去看看</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>乙：还有点东西要修改</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">乙：</SPAN><SPAN lang=EN-US><FONT face=Calibri>b</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">也要把东西给副总，我因为等他</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">乙：</SPAN><SPAN lang=EN-US><FONT face=Calibri>a</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">他说我报告不用给副总看（</SPAN><SPAN lang=EN-US><FONT face=Calibri>a</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">是乙的同级同事）</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>乙：不知道副总在不在哦，他的门关着。</FONT></SPAN><SPAN lang=EN-US><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">乙：</SPAN><SPAN lang=EN-US><FONT face=Calibri>d</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">他叫我帮他打印文件！怪他！（</SPAN><SPAN lang=EN-US><FONT face=Calibri>d</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">是乙的同级同事）</SPAN></FONT><SPAN lang=EN-US><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>乙：我的杯子突然找不到了，在找杯子。</FONT></SPAN><SPAN lang=EN-US><BR><BR><BR></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不愿意负责任的人的不利在于他会让上司怀疑他的忠诚程度，因为上司给他的命令往往会因为一个小事情而被搁置或者打折执行，转而被他人的意识所改变。</SPAN><FONT face=Calibri> </FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">第十：不要对自己说</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">我是大学生</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri>”<BR><BR></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这点包涵了很多信息。</SPAN></FONT><SPAN lang=EN-US><BR><FONT face=Calibri size=4>1.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>不要认为自己有多清高</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>2.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>不要仍然以学生的标准要求自己</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>3.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>不要感觉低人一等</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>4.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>不要等待别人的关怀</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>5.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>不要把这个作为犯错误自我安慰的借口</FONT></SPAN><SPAN lang=EN-US><BR><FONT face=Calibri size=4>6.</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>不要忘记搞清楚，公司究竟给自己的待遇是多少，老练些，这不是在做志愿者。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><FONT size=4>品格是处理好人际关系的基础，也是确保人际关系质量的关键。除此之外，人际交往的技巧也是尤为重要的。有些人做好事会让人感激一辈子，而有些人帮了别人却可能费力不讨好，不但得不到感激和回报，还让人心存嫉恨。将同样的产品以相同的价格推销给同一个客户，有些业务员可能被粗暴地赶出门，有些业务员却可能签到大单，甚至被客户奉为上宾。</FONT></SPAN><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">人际交往的技巧是一个非常庞杂的话题，囿于篇幅，在这里只能结合我的切身体会做一些简单的列举，挂一漏万在所难免了。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>1. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">多给别人鼓励和表扬，尽量避免批评、指责和抱怨，不要逼别人认错。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>2. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">要学会倾听。不要说得太多，想办法让别人多说。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>3. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">如果你要加入别人的交谈，先要弄清楚别人究竟在说什么。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>4. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">交谈之前尽量保持中立、客观。表明自己的倾向之前先要弄清楚对方真实的倾向。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>5. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">注意对方的社交习惯并适当加以模仿。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>6. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不要轻易打断、纠正、补充别人的谈话。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>7. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">别人有困难时，主动帮助，多多鼓励。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>8. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不要因为对方是亲朋好友而不注意礼节。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>9. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">尽可能谈论别人想要的，教他怎样去得到他想要的。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>10. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">始终以微笑待人。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>11. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">做一个有幽默感的人。但是在讲笑话的时候千万不要只顾着自己笑。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>12. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">做一个脱离低级趣味的人。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>13. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">跟别人说话的时候尽量看着对方的眼睛，不管你是在说还是在听。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>14. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">转移话题要尽量不着痕迹。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>15. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">要学会聆听对方的弦外之音。也要学会通过弦外之音来委婉地表达自己的意思。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>16. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">拜访别人一定要事先通知。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>17. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不要在别人可能忙于工作或者休息的时候打电话过去。除非是非常紧急的事情。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>18. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">给别人打电话的时候，先问对方是否方便通话。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>19. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">一件事情让两个人知道就不再是秘密。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>20. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">你在背后说任何人的坏话都迟早有一天传入这个人的耳朵。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>21. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不要说尖酸刻薄的话。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>22. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">牢记他人的名字。养成偶尔翻看名片簿、电话本的习惯。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>23. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">尝试着跟你讨厌的人交往。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>24. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">一定要尊重对方的隐私，不管是朋友还是夫妻。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>25. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">很多人在一起的时候，当你与其中某个人交谈，请不要无视其他人的存在。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>26. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">要勇于认错。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>27. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">以谦卑的姿态面对身边的每一个人。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>28. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">给予他人同情和谅解。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>29. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">尽可能用</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">建议</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">取代</SPAN><SPAN lang=EN-US><FONT face=Calibri>“</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">命令</SPAN><SPAN lang=EN-US><FONT face=Calibri>”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。</SPAN></FONT><FONT size=4><SPAN lang=EN-US><FONT face=Calibri> <BR>30. </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不要轻易做出承诺。承诺的事情就一定要尽可能做到。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face=Calibri size=4>&nbsp;</FONT></o:p></SPAN></P>]]></description>
</item><item>
<title><![CDATA[有关苹果机的知识扫盲]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41099</link>
<author>shengjorden</author>
<pubDate>2008/11/11 18:53:41</pubDate>
<description><![CDATA[<P><FONT size=4>转自http://baike.baidu.com/view/1531.htm</FONT></P>
<P><A href="http://baike.baidu.com/view/15181.htm" target=_blank><FONT size=4>苹果公司</FONT></A><FONT size=4>出产的</FONT><A href="http://baike.baidu.com/view/13621.htm" target=_blank><FONT size=4>PC</FONT></A><FONT size=4>机，之所以称苹果机，不只是因为其由苹果生产，也因为其核心区别于IBM标准PC（一般为使用</FONT><A href="http://baike.baidu.com/view/4821.htm" target=_blank><FONT size=4>windows</FONT></A><FONT size=4>环境）。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV><FONT size=4>　　苹果机具体的配置也不尽相同，但较IBM标准PC来看，苹果机的往往配置较好，因为苹果机多用于图形领域。此外，苹果机往往代表了潮流和时尚，代表了高端于精美的工业设计，但是由于其并不使用windows操作系统，而使用Mac OS X操作系统，不兼容windows软件，习惯windows的用户很难上手，所以出现了苹果机目前叫好不叫座的情况。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果公司是美国著名老牌计算机公司，成立于1977年，是个人电脑最早的倡导者和著名生产商。它所生产的苹果系列电脑，包括iMac，PowerMac， ibook，Powerbook等产品线的众多硬件产品，一直是个人电脑市场的主流产品之一，并曾提出过很多新概念，其产品也掀起过多次流行潮，风行一时。Mactonish操作系统也是苹果公司出品的著名个人电脑操作系统，苹果电脑与Mactonish OS的配合是图形工作站的最佳选择，其产品在图形图像处理领域，一直有较大的市场份额。除个人电脑以外，该公司在半导体研发方面也有一定实力，曾经参与开发了著名的Power PC芯片。目前，苹果电脑电脑公司在全球几十个国家建立了分公司或代表机构，其产品也行销全世界。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　产品范围：台式电脑、笔记本电脑、操作系统、MP3播放机、网络工具与应用、办公和工具类、多媒体播放软件 . <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　一、从内外观看 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机：现代苹果产品一直被业界认为是工业设计的典范，同时也是业界众多厂商抄袭的对象。可以这样说，现代苹果产品从设计上讲，可以认为是一件艺术品。从内部结构来看，苹果机的内部简洁、清爽令人惊讶，几乎看不见一根电源线与数据线。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　IBM兼容机：没有什么令人动心的设计，但产品多，选择面较广。从内部结构来看，里面总是繁乱无章，密密麻麻的一堆线与卡。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　二、从操作上来看 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机：基本操作与IBM兼容机无异。键盘除个别几个键不太一样，此外苹果专用鼠标是单键的（这也证明苹果机的系统容易操作），当然苹果机同样兼容双键、三键鼠标，当然其它键也是有用处的，可以调用一些快捷菜单，并不是摆设。总之会用IBM兼容机，很快就会用苹果机。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　IBM兼容机：现在大部分人都在用，俺就不多说了-_-! <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　三、从操作系统上来看 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机：操作系统一样可以认为是一件艺术品。苹果机现在使用的是Mac OS X 10.3版本，代号为Panther的操作系统，除了继续延用Mac OS X第一个版本（10.0版本）以来的AQUA界面外，还增加了金属面版的效果。此外还有DOCK放大缩小效果、窗口流动的神奇效果、用户切换特效、 Exposé（一个漂亮但相当实用的效果）等效果。在操作上，系统比Widows系统要简单直观，此外你可以很明显的感受到苹果操作系统的稳定，几乎没有死机崩溃的问题发生。另外，操作系统虽然贵，但比Windows系列要便宜不少。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　IBM兼容机：除了LINUX等系统外，一般都使用微软的Widows系列，Widows XP出来之前，其操作系统界面一直没有什么变化。实际上WIN XP变化也不是相当的大。Widows的界面也不是很漂亮，而且有一部分抄袭他人的作品，为此被法庭罚了不少钱。至于说是要在2006年发布的一些功能，在2001年初Mac OS X 就已经实现了。此外Windows系统的不稳定与漏洞多是众所周知的了~~~ <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　四、从应用软件上看 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机：有人抱怨苹果机上的应用软件太少，实际上在IBM兼容机中常用的应用软件，都有苹果版的或者有相应的代替品。而且苹果上的一些特有应用软件，可以说让你很轻松的完成一些工作，操作之简单令人惊叹。所有软件都有D版，当然并不像IBM兼容机的D版软件那么容易找。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　IBM兼容机：软件多如牛毛，基本上要什么样的，都有众多选择，但仔细想想那么多的软件你又能用多少呢？还是那么常用的几种。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　五、价格与服务 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机：价格相对于IBM兼容机还是有一点贵，但应是可接受范围。售后服务上，中国大陆区的服务可以说是苹果全球服务中最差的。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　IBM兼容机：除了品牌机的价格战外，DIY也是省钱的一个好方法。售后服务水平各层次都有！ <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果不是PC，苹果是一种生活方式 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果电脑用“不同凡想”的创新精神为电脑用户打造了新一代的电脑形象和数码生活核心的概念，为消费者提供更精彩的选择。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果电脑创办人、现任总裁斯蒂夫.乔布斯在为iMac举行的推介仪式上说：“我们正沉陷入数码相机、数码摄影机、MP3播放器越来越难用的境地，我们不能将它们简单地结合在一起，我们需要一个所谓的数码中枢让我们连接这些器材，让我们的数码生活更便利，让数码产品的价值得以提升” <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　他的这番话说出了苹果电脑提倡的“数码生活方式”的核心，他的目的，就是要使苹果电脑成为联结各种数码器材的中心，让用户通过软件，将不同的数码器材有机连在一起。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　眼下，各种各样的数码设备正越来越深入地走入我们的日常生活，它们不但提高了我们的工作效率，也使我们的生活变得更加丰富多彩。可以说，我们正生活在一个数码产品包围的世界。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　全新iMac在人们无限的期待和惊叹中闪亮登场，它不负重望，它带来了电脑界的又一次革命性发展。它有着令人心醉的造型设计，有着让人振奋的强大功能。它从根本上改变了人与电脑以往呆板关系。你可以随意地让它远离你，走近你，配合你的任何姿势，它像葵花一样使我们的数码生活更加明亮、简单和精彩。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　那么，全新iMac究竟是怎样发挥它的数码生活核心作用的呢？苹果四款数码工具软件怎样赋予数码生活以强大的活力呢？ <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　新 iMac 随操作系统一起提供的制作家庭电影的 iMovie 2、制作数码录像光碟的iDVD 2、收听数码音乐的iTunes 2，以及编辑数码相片的 iPhoto 四个新软件，构成了数码生活核心的四大支柱。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　利用这四种软件，你可以在iMac上轻松处理数码照片、听音乐、烧CD、制作DVD，甚至编辑只属于自己的电影。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　全新iMac让你的数码音乐播放器iPod、数码相机、数码摄像机等数码设备有机地结合在一起，成为你数码生活的真正核心。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　自从第一台个人电脑诞生以来，至今已有20年了。苹果公司的MAC电脑作为另外一支力量，被视为电脑世界中的异类。需要说明的是苹果机分为家用和商用两个系列，家用的台式机叫iMAC，家用笔记本电脑叫iBOOK；商用的台式机叫Power MAC，商用笔记本电脑叫Power BOOK；而所有的苹果机则统称为Macintosh，简称为MAC。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　下面就让我们来了解一下苹果电脑，通过比较一下它和PC的差别，来认识苹果电脑本身具有的特色。如果你正准备购买苹果电脑，下文无疑会让你获得必要的知识。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机采用的Power PC芯片是RISC(精简指令集)芯片，而PC机采用的多为CISC(复杂指令集)芯片。Power PC是通过多管线操控配合超标量指令集来运行的，而CISC芯片则是采用单线程方式来运行的。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机的操作系统是MACOSX，这个基于UNIX的核心系统增强了系统的稳定性、性能以及响应能力。它能通过对称多处理技术充分发挥双处理器的优势，提供无与伦比的2D、3D和多媒体图形性能以及广泛的字体支持和集成的PDA功能。MAC OSX通过Classic环境几乎可以支持所有的MACOS9应用程序，直观的Aqua用户界面使MACintosh的易用性又达到了一个全新的水平。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机的外观一向是采用透明装的，这给人高贵典雅的感觉；其iMAC机的设计更是划时代的，把主机和显示器完全整合在一起，再加上那多彩的半透明颜色，很快便风靡全球。MAC在其产品的外壳上加上了高科技的元素，如PowerBOOK笔记本电脑的外壳采用纯度为99.5%的钛合金制成，把航天飞机的材料用在笔记本电脑制造方面算得上首开先河了。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　MAC专用的CPU包括Power PCG3和Power PC G4，它们是由IBM、Motorola等几家大公司联合为苹果电脑设计制造的，尤其是Power PC G4，还可以进行128位运算。它采用0.18微米工艺和铜连接工艺，483针脚的陶瓷CBGA封装，内核集成了3300万个晶体管，工作电压1.8V，而且不用风扇散热就可以稳定工作。PowerMACG4中没有安装CPU散热风扇，只有一个造型独特的散热片，这样就可以减少机器运行的噪音，同时也说明 PowerPC具有奔腾和雷鸟不可比拟的优势。由于它是128位运算，速度令目前那些32位CPU望尘莫及。在运行图形软件时，MAC的速度可以成倍提高。例如Photoshop5.5为发挥PowerMACG4的速度潜能，专门设计了一个外挂程序，可以使整体速度提高2倍多，而某些特效渲染的性能更是提高了10倍。因而，苹果电脑在人们心中一向是图形图像专业应用的代名词，它所具备的浮点运算能力远远超过了普通PC。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果电脑采用的主板分为低端和高端两种，它们都带有三条64位33MHzPCI插槽，两个外部IEEE1394400MbpsFireWire端口，内建10/100Base-T网卡，56KModem，4个DIMM内存插槽。但低端只支持最大1GB的内存容量而且理论带宽也只有400Mbps，而高端则通过更高效率的内存控制器把这两个数字分别提高到2GB和800Mbps，并有一条133MHzAGP2×插槽和内建的一个 IEEE1391400MbpsFireWire端口，将来可升级使用高速的FireWire硬盘。在系统总线方面，低端苹果机工作在100MHz的外频上，而高端的PowerMACG4采用了133MHz的MPX总线架构。MPX总线架构的核心是PowerPCG4处理器和两块相关的集成控制芯片 (Uni-N内存总线控制芯片和KeyLargo输入输出设备控制芯片)，这两块芯片在整个PowerMACG4电脑中所起的作用相当于我们熟知的PC电脑主板的北桥芯片和南桥芯片。在133MHz的MPX总线架构中，Uni-N芯片主管内存、10/100/1000Mbps网络通讯、FireWire接口传输功能和显卡的工作；而KeyLargo芯片则是负责存储功能、无线网路通讯功能、USB传输功能、调制解调通讯功能、音效输出功能以及电源管理功能的正常工作。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　MAC上的内存、硬盘和PC机的差不多，内存是PC133的SDRAM，硬盘是IBMATA66以及ATA100。既然技术相同，那是不是PC的硬件也可以用在MAC上了呢？答案是否定的。如果在MAC上安装PC的兼容硬件，但会引起故障。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　显卡方面，ATI和NIVIDA这两位竞争者，把战火从台式机蔓延到笔记本电脑，又从笔记本电脑蔓延到MAC，ATI在笔记本和MAC占有的统治地位已经开始被NVIDIA动摇了。MAC用的显卡有ATI，也有GeForce2MX的。在三款最新的PowerMACG4电脑中，苹果电脑采用了NVIDIA 专门为苹果机定做的GeForce2MX显卡，不过低端466MHzPowerMACG4、iMAC和笔记本电脑现在还都在用ATIRAGE128作为图形子系统的标准配置。MAC版本的GeForce2MX和PC版本的GeForce2MX相比，在技术参数上没有任何区别。但由于苹果电脑和PC采用了不同的操作平台，所以NVIDIA特别针对MACOS的视频特点设计了专门的驱动程序。MAC版本的GeForce2MX和PC版本的最大差别是在显示信号输出端口上，MAC版本的GeForce2MX配备了两个显示信号输出端(MAC标准的VGA15针端口和ADC显示信号输出端口)。对于只接驳DVI (DigitalVisualInterface)接口的数字平板显示器，PowerMACG4还提供了DVI/ADC转换线，可以让用户毫无困难地使用上DVI数字平板显示器。那么为什么要专门制定一个ADC显示信号输入标准呢？这是因为苹果电脑为了保持PowerMACG4电脑用户桌面的整洁，允许用户通过单条ADC信号线在显示器和主机之间传输显示信号并为显示器供电，这样就无须为显示器单 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　独提供电源线和信号线了，真可谓独具匠心。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　显示器方面，苹果机也用CRT和LCD。用CRT的是MAC中的iMAC系列，其显像管主要是三菱的钻石珑；用LCD的则主要是苹果公司的 PowerMACG4系列。另外，苹果公司还推出了LCD的自有品牌：AppleStudioDisplay，其液晶显示器有15英寸、17英寸、21英寸三款大小。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　音响方面，MAC内置了由苹果与HarmanKardon公司共同设计的高性能Odyssey音响系统。在Odyssey音响系统的内部，有一组非常独特的导音器。这组导音器会像高音喇叭一样传导高频率的声音，塑造出诱人的音场深度效果。虽然这组Odyssey导音器的直径只有34mm，但是它却同时能够发出通常只在高级音响(或是价值不菲的隔音名车)上才听得到的低音效果。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　光驱方面，MAC用的光驱是DVD，普通的CD-ROM已经基本被MAC淘汰了。目前，G3和G4都是CD-RW或DVD；在高端上，苹果公司把 SuperDrive驱动器纳入733MHz的G4机种一起销售。SuperDriver通过苹果公司提供的iDVD刻录软件，可以备份最大4.7GB的个人数据，或者通过400Mbps传输速度的FireWire接口接驳数码摄像机，下载纯净的数字视频和音频信号制作具有互动功能的DVD影音光盘。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　鼠标方面，MAC的AppleProMouse光电鼠标是玻璃外壳，晶莹剔透，十分漂亮。但它的鼠标是没有按键的，事实上整个AppleProMouse 就是一个按键，不需要用手指点击，轻轻按动整个鼠标就行了，而且也不分左、右键。这样，在使用的时候手指不会疲劳。鼠标是正椭圆形的，适合不同习惯的用户使用，左、右手都可以使用。苹果机的单键鼠标于1984年问世，是苹果机“易用”理念的核心部分。但由于缺少其他操作系统具有的“右键”功能，操作时往往要在屏幕和菜单栏之间往返奔波，因而操作起来不那么方便。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　MAC集成了三种网络通讯功能：以太网络通讯、调制解调器通讯和无线网络通讯。其中最引人注目的要数AirPort无线网络通讯功能了。AirPort基地台内部具备一个使用RJ-11接头的56-KbpsV.90数据机，另外也有一个RJ-45接头用以连接10BASE-TEthernet以太网络。有了AirPort高速无线网络技术，你的PowerBookG4便可以在家中或办公室的任何角落上网遨游了。另外，这种传输方式有一个明显的优点：无线电波不像红外线那样，传输的两点之间必须为没有阻隔的直线；因为无线电波可以穿透固体，传送到最远达150米之外的地方。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果公司不但生产MAC的大部分硬件，连MAC所用的操作系统都是它自行开发的，接下来，我们就来了解一下它的操作系统。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　苹果机现在的操作系统已经到了OS10，代号为MACOSX(X为10的罗马数字写法)，这是MAC电脑诞生15年来最大的变化。新系统非常可靠，它的许多特点和服务都体现了苹果公司的理念。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　另外，现在疯狂肆虐的电脑病毒几乎都是针对PC的，由于MAC的架构与PC不同，所以很少受到病毒的袭击。MACOSX操作系统界面非常独特，突出了形象的图标和人机对话(人机对话界面就是由苹果公司最早开创的，后来才被微软的Windows所看中并在PC中广泛应用)。苹果公司能够根据自己的技术标准生产电脑、自主开发相对应的操作系统，可见它的技术和实力非同一般。打个比方，苹果公司就像是INTEL和微软的联合体，在软硬件方面“才貌双全”。 <BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　很多软件企业都为MAC开发了专用版本，现在可供MAC使用的软件也很丰富。如微软就为MAC开发了MAC版的Office，MAC版的IE浏览器。苹果公司还推出了一个软件，通过它能够在MAC上模拟WIin98平台，运行一些针对Win98的软件，不过兼容性一般，运行PC的游戏速度相对较慢。围绕在苹果机周围的软件也多为影像编辑处理专业产品，如能制作DVD光盘的iDVD，可以把CD压缩成MAC式的MP3iTunes，以及制作数字电影的 iMovie2等 </FONT>]]></description>
</item><item>
<title><![CDATA[有关OS/2的知识扫盲]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41098</link>
<author>shengjorden</author>
<pubDate>2008/11/11 18:32:46</pubDate>
<description><![CDATA[<P><FONT size=4>转自http://baike.baidu.com/view/108542.htm</FONT></P>
<P><A><FONT size=4>　</FONT></A><FONT size=4>OS/2</FONT></P>
<DIV class=text_pic style="FLOAT: right; VISIBILITY: visible"><A href="http://imgsrc.baidu.com/baike/pic/item/5beeba0fd7debafeab64571d.jpg" target=_blank><FONT size=4><IMG title="" src="http://imgsrc.baidu.com/baike/abpic/item/5beeba0fd7debafeab64571d.jpg"></FONT></A></DIV>
<DIV id=lemmaContent>
<DIV class=bpctrl><FONT size=4></FONT></DIV><FONT size=4>　　OS/2是由</FONT><A href="http://baike.baidu.com/view/2353.htm" target=_blank><FONT size=4>微软</FONT></A><FONT size=4>和</FONT><A href="http://baike.baidu.com/view/1937.htm" target=_blank><FONT size=4>IBM</FONT></A><FONT size=4>公司共同创造，后来由IBM单独开发的一套</FONT><A href="http://baike.baidu.com/view/880.htm" target=_blank><FONT size=4>操作系统</FONT></A><FONT size=4>。OS/2是"Operating System/2"的缩写，是因为该系统作为IBM第二代个人电脑PS/2系统产品线的理想操作系统引入的。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　在</FONT><A href="http://baike.baidu.com/view/365.htm" target=_blank><FONT size=4>DOS</FONT></A><FONT size=4>于PC上的巨大成功后，以及</FONT><A href="http://baike.baidu.com/view/25309.htm" target=_blank><FONT size=4>GUI</FONT></A><FONT size=4>图形化界面的潮流影响下，IBM和Microsoft共同研制和推出了OS/2这一当时先进的个人电脑上的新一代操作系统。最初它主要是由Microsoft开发的，由于在很多方面的差别，微软最终放弃了OS/2而转向开发</FONT><A href="http://baike.baidu.com/view/4821.htm" target=_blank><FONT size=4>Windows</FONT></A><FONT size=4>“视窗”系统。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/2则由IBM独自开发，在发行了若干个版本后，最大规模的发行版本是于1994年发行的OS/2 Warp 3.0，是取名自星舰迷航记电影中的曲速引擎(Warp drive)，来代表其稳定快速的特色。这个版本是第一个运行于X86体系的PC之上的32位操作系统，早于微软的</FONT><A href="http://baike.baidu.com/view/41207.htm" target=_blank><FONT size=4>Windows 95</FONT></A><FONT size=4>上市。Warp改进了按照界面和加强了对外设的驱动支持，还随系统包含了一组名为“Bonus Pak”，里面有12种应用程序，如文字处理和传真软件等等。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　随后的升级版本是OS/2 Warp 3 Connect——一个加强了网络支持的版本。而代号Merlin的OS/2 Warp 4版，是最后一个公开发行的OS/2版本。在与Windows的竞争中，OS/2最终失败了。随后IBM也发行了若干个版本的升级，但仅仅是小范围的使用。据说在金融和银行等行业中，有部分系统依旧在使用OS/2。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/2 的新希望是在 1999年由 Serenity Systems International 公司取得 IBM 的 OEM 合约，重新打造出 eComStation 1.0，并广受好评，许多旧的 OS/2 系统纷纷升级到 eComStation。而目前最新的版本是 eComStation 2.0，也已在测试阶段。新版的 eComStation 支援 AMD 64 位元 CPU 及可开机的 JFS 档案系统。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　2005年12月23日，IBM宣布不再销售和支持OS/2系统。OS/2的支持者要求IBM将OS/2的原始码开放。尽管目前OS/2仍然拥有部分市场，但是IBM已经宣布，从2006年开始，需要进行特殊预约才可以获得进一步的技术支持。OS/2所有产品的销售将于12月23日停止，而多任务操作系统也将于2006年12月31日前停止销售，并开始向</FONT><A href="http://baike.baidu.com/view/1634.htm" target=_blank><FONT size=4>Linux</FONT></A><FONT size=4>系统转移。 对于IBM来说，这不是什么坏消息。要知道，这种产品已销售达20多年时间，但其从来就没有消停过。从OS/2 Presentation Manager到Warp，每一款产品都受到了微软的挤压。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　<B>OS/2兴衰史</B><BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　在Windows3.x开始为世人接受之初，个人电脑的操作系统中唯一可以与Windows操作系统分庭抗礼的就是OS/2。这套原先是微软与IBM合作生产的操作系统，由于某些时空背景因素，加上微软致力于Windows的开发工作，致使OS/2的命运惨淡。虽然OS/2的销售成绩不如Windows，但是许多专家仍一致推崇OS/2的技术能力。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----谈到OS/2，就得先回头看看当年IBM发展IBMPC与DOS的情景。1981年，当IBM准备推出IBMPersonalComputer与其他众多个人电脑厂商竞争的时候，个人电脑市场才方兴未艾，很少有人能预料到今天的个人电脑市场会这么大。IBM虽然是电脑业界的巨人，早已在大型主机领域纵横多年，拥有丰富的经验与技术，但或许是太低估了这个市场，或许是IBM过去大型主机经营得太成功了，将过去的经验套在个人电脑这个领域反而造成了更大的错误。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----对IBM来说，最不幸的是它太低估个人电脑的市场了！原先打算五年才卖275,000台PC，但在1981年8月12日正式发表PersonalComputer的前一天，也就是IBM在ComputerLand经销商年度大会上做事前展示说明的当天，ComputerLand的经销商就下了大约250,000台的订单！第二天正式发表时，IBM又接到了250,000张订单。错误的预估，导致生产线的生产能力与零件库存严重不足，有很长一段时间，IBM面临空有一大堆订单，却无货可卖的情况。更不幸的是，IBM接下来对个人电脑的预测也几乎都没对过！<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----从一开始，DOS这种单任务的作业环境就不适合我们使用：当我们用WordStar打一份报告，而需要计算数字时，您希望电脑帮您计算吧？很抱歉，请先存档，回到DOS下，执行Lotus123，算出答案之后抄下来，然后回到DOS下，执行WordStar，再将刚才的数字打上去，很笨很蠢吧？没错！所以Borland写了常驻程序SideKick让您可以随时调用计算器等小工具，算是解决了一小部分的问题，但是诸如列表时就不能打字等种种问题实在太多了。到了1984年，IBM也觉得不是办法，于是配合IBMPCAT的推出，IBM宣布将会为IBMPCAT开发一套多任务操作系统，从此开始了与微软合作开发OS/2的工作。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/21.x版本的沿革<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----OS/21.0在1987年12月上市。它可以同时执行数个OS/2程序以及一个DOS程序，但是屏幕上一次只能看到一个程序的运行画面，而且只有文本模式。1988年10月，IBM推出了OS/21.1标准版，为OS/2增加了图形界面PresentationManager，硬盘容量最高可以支持2GB。1989年IBM又发布了ExtendedEdition，增加了DatabaseManager以及CommunicationManager。前者是一个多任务的关系数据库，而后者让大型主机的客户可以通过3270、5250模拟将PC机与大型主机连接。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----1.2版的OS/2加入了HPFS(HighPerformanceFileSystem)以支持长文件名和高容量硬盘，磁盘功能比DOSFAT好很多。OS/21.2ExtendedEdition增加了REXX直译式程序语言，就像是Unix的ShellProgramming一样：REXX可以当作是DOS的批语言来用，也可以用它编写简单的程序。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----IBM此时开始将OS/2分成两条产品线：为了发挥Intel正在设计中的80386芯片的威力，OS/22.0将不再要求与80286兼容，同时IBM将OS/23.0定位成网络服务器操作系统。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----1990年，当IBM与Microsoft还在合作开发OS/2的下一版本时，Microsoft同时也开发出MicrosoftWindows3.0并大量销售。渐渐地，Microsoft的资源、人力以及注意力逐渐由开发OS/2转移到开发Windows。由于两家厂商意见的分歧以及相互间的不信任，为了保证OS/2开发的顺利进展，IBM决定接手OS/21.x以及OS/22.0的开发工作，而Microsoft则负责Windows以及OS/23.0。不久之后，OS/23.0就被Microsoft重新命名为WindowsNT了。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----OS/21.3是第一个全部由IBM独立负责完成的产品，除了原先的程序码之外，所有新添加的功能都是IBM自行开发的。1.3版比先前的版本执行速度快，程序本身也较小，安装、配置比以前也容易多了，而且加入了AdobeTypeI向量缩放字形，支持的屏幕分辨率提高到1024×768。在功能上，IBM也改进了置换文件的演算法，并加入硬盘延迟写入等等。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/22.x版本的沿革<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----OS/22.0是第一套在PC上运行的真正多任务操作系统。1992年，OS/22.0正式发表，IBM很自豪地标榜这一版OS/2为"abetterDOSthanDOSandabetterWindowsthanWindows"。从技术角度来看确实如此：通过80386的虚拟86模式(Virtual86Mode)，OS/22.0可以让每一个DOS程序分别在各自的虚拟DOS机器(VDM,VirtualDOSMachine)上执行，就好像用户同时拥有好几台PC分别执行这些程序一样。不但具有优先式工作模式，不会让任何一个程序占据所有系统资源不放，而且任何一个DOS程序宕机不会造成其他程序一起挂掉。因为Windows也是DOS程序的一种，所以通过OS/2的VDM执行Windows程序也可以获得上述优点，而且不同程序之间仍然可以通过OS/2提供的DDE和剪贴簿交换数据。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----OS/22.0同时将图形界面重新翻新，引进了一套完全面向对象的操作界面：WorkplaceShell(WPS)，不但将操作系统的对象具体化，连文件系统也包含在内。相比之下，Windows系统直到Windows95整个界面才算变得较为面向对象。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----1993年，IBM再接再厉，发表了OS/22.1版，这一版本将整个图形系统重新改写，配合Windows3.1，在WinOS/2（OS/2附带的一个修改过的Windows，可以在里面执行Windows程序）里面加入了对TrueType字型的支持；配合多媒体的发展趋势，加入了MultimediaPresentationManager(MMPM/2)，提供稳定的声音、图像能力；配合笔记本电脑的发展，这一版本也支持PCMCIA、AdvancedPowerManagement电源管理能力。为了降低产品的价格，IBM又另外发售了OS/22.11版，当把该版本安装在已装有Windows3.1的机器上时，安装程序会自动修改原先的Windows，配合OS/2使用。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/23.x版本的沿革<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----1994年10月，OS/23.0正式改名为OS/2Warp3.0。这名称源自当初开发中的代号。Warp是从"星舰迷航记（StarTrek）"中借来的名词，表示这一版本的速度跟光速一样快。Warp的最初设计目标是能在配有4MB内存的PC上顺利执行，但是您若真的照办，那可累了！不过只要有8MB内存，Warp3就可以运行得相当顺畅。这一版本提供相当充足的各种驱动程序，并改进了不少功能，还加入了对TCP/IP的支持(InternetAccessKit)，包含拨号网络、一套浏览器(WebExplorer)、一堆TCP/IP工具(Email、FTP、Telnet等等)。更重要的是增加了一套BonusPak光盘，提供好几套OS/2版本的应用软件，例如IBMWorks，它是一套集成应用软件，包含表格处理、文字处理、数据库和统计图表等功能。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----1995年，IBM又发表了WarpConnect3，这一版本增加了局域网功能，可以和NovellNetware以及IBMLANServer连接，共享打印机、磁盘空间等资源。1996年IBM将Warp和LanServer合并为WarpServer，成为一套完整的网络服务器操作系统，功能包括打印服务器、文件服务器、远程访问、网管(SystemViewforOS/2)等等。不幸的是，Warp3不断地被拿来和当时还没出货的Chicago(Windows95)比较！<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/24.x版本<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----1996年9月，Warp4(Merlin)正式发售。除了将WorkplaceShell全面翻新（有点像Macintosh与LotusSmartCenter的混合体，开发人员是前Apple员工），又增加了一堆新功能。Warp4是第一套内嵌Java、语音识别的操作系统，IBM将Warp4定位成通用的用户端操作系统，可以连接任何网络环境。内嵌的Java让您不用通过浏览器和其他辅助工具就能执行Java程序，通过语音识别系统可以直接用语音操纵操作系统。内置的LANDistance可以让移动电脑通过电话拨回公司，使用公司的内部网络，就像在公司内部的用户一样。而安装程序也进行了相当大的改进，使安装OS/2不再是一件难事。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　OS/24.x版本之后<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----IBM一直没有宣布放弃OS/2。谣传IBM有一套未公开发售的OS/25.0，好像是搭售在IBM的ECommerce产品中，可惜笔者也没看到过，只能道听途说罢了！不过倒是有一套WorkSpaceOnDemand，它是一整套构建在OS/2WarpServer上的工具，目标是作为IBMENetwork的一环，将无盘PC转变成网络运算环境中的用户端。不过只有搭配IBM的整体服务才能获得，换句话说就是没有零售版。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　<B>OS/2已经失败了吗？</B><BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----这真是个敏感的问题。网络上有一大群OS/2的忠实拥护者，一致推崇OS/2的多任务、稳定、高效等优点。要说OS/2失败的话，这些人可能是打死也不承认。但是，如果从OS/2销售的数量、为OS/2设计的软件数量，以及各家硬件厂商编写驱动程序的踊跃程度等因素来看，足以证明OS/2惨败给Windows了。为什么一个设计优秀、有效率、稳定的产品会输给它的对手呢？这个问题的答案有很多，例如当年内存太贵，执行OS/2的需求比Windows需求高；而且OS/2一开始卖得太贵，没有几个人买得起等等，但笔者认为最根本的原因是IBM错估了个人电脑的市场以及种种行销不利的因素。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----从一开始，IBM在大型电脑领域就是以优秀、稳定的产品、完整周全的服务、完好的技术支持和妥善的维护服务著称。而大型企业用户多半有一组人或是信息部门负责企业信息系统，这些人也多半具备电脑程序的编写、维护能力；当IBM踏入个人电脑市场的领域时，仍然沿用大型主机的市场与思考模式来运作，从个人电脑销售量就可以看出差距有多严重。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----个人电脑的使用者几乎都是单一客户，有很多人对电脑完全一窍不通；需求不见得高，却几乎个个不同；除了少数人之外，大部分人都没有编写程序的能力。换句话说，"没有用户愿意购买没有合适软件可用的操作系统！"除非OS/2有足够的应用软件，就像VisiCalc让大家买AppleII、Lotus123让大家买IBMPC、PageMaker和PhotoShop让大家去买Macintosh一样。缺少足够的应用软件，或是不能执行现有的应用软件，就不可能取代Wintel。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----看看GEOS、NeXTStep、SoftWindow、SunWABI(WindowsApplicationBinaryInterface)，我们就知道它们为什么失败了。这些操作系统有的不能执行Windows程序(如GEOS、NeXTStep)，有的只能执行部分Windows程序(如SoftWindow、WABI)。而OS/22.x、OS/2Warp3因为能执行Windows3.1的各种应用软件，所以可以和Windows3.1一搏。但是随着Windows95的出现、Windows程序改为32位(Win32)，而IBM还宣布OS/2Warp4将不会支持Win32时，我们就可以说OS/2大势已去，绝对不可能取得个人电脑市场的领导地位了！<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----个人电脑的用户不像企业用户那样保守、忠诚度高。一个操作系统很昂贵、没有应用软件可用、不能执行Windows的软件，但是不太会宕机、很稳定；另一个操作系统便宜、有一大堆现成的软件可供挑选、能执行所有的Windows软件，但是三天两头出点小问题。请问您会买哪一种？IBM似乎一直不了解这一点，总是将OS/2当作企业用户的产品卖，当然玩不过Windows。OS/2技术支持部门最常被客户问到的一个问题就是：如何在OS/2里面玩DOOM？<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----讲到行销不利的因素，由于OS/2身负的重任太多，反而造成很多误解。举个例子来说，OS/2刚开始出货时，IBM正好在大力推行IBMPS/2电脑系统，搞得大多数人都以为要用OS/2就必须将电脑也换成PS/2。再加上当年内存很贵，OS/2所需的内存又多，要求的其他硬件配置也高，最严重的是没有任何重要的应用软件厂商推出OS/2版的产品（即使今日Lotus已经成为IBM的子公司，也不愿意推出SmartSuiteforOS/2，甚至连Notes5都不打算推出OS/2版），请问这样的操作系统怎能卖得好？<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　----目前看来唯一能取代Windows环境的，恐怕只有新版的Windows本身了。除非还有哪一家公司开发出一套操作系统，可以扫行所有的Windows程序，兼具稳定、快速、便宜等种种优点于一身，那么也许有可能成功，而不会重蹈OS/2的覆辙。</FONT></DIV>]]></description>
</item><item>
<title><![CDATA[有关PC的知识扫盲]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41097</link>
<author>shengjorden</author>
<pubDate>2008/11/11 18:29:42</pubDate>
<description><![CDATA[<P>转自百度百科<A><FONT size=4>　</FONT></A><FONT size=4><STRONG></STRONG></FONT></P>
<P><FONT size=4><STRONG>PC (personal computer)，</STRONG>个人计算机一词源自于1978年</FONT><A href="http://baike.baidu.com/view/1937.htm" target=_blank><FONT size=4>IBM</FONT></A><FONT size=4>的第一部桌上型计算机型号PC，在此之前有</FONT><A href="http://baike.baidu.com/view/694622.htm" target=_blank><FONT size=4>Apple II</FONT></A><FONT size=4>的个人用计算机。能独立运行、完成特定功能的个人计算机。个人计算机不需要共享其他计算机的处理、磁盘和打印机等资源也可以独立工作。今天，个人计算机一词则泛指所有的个人计算机、如桌上型计算机、笔记型计算机、或是兼容于IBM系统的个人计算机等。 <BR></P></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　<B>在计算机的发展史上，曾经有十段时间，计算机依功能与体积大小而被划分为：<A href="http://baike.baidu.com/view/296324.htm" target=_blank>超级计算机</A>、大型计算机（巨型机）、中型计算机、小型计算机、<A href="http://baike.baidu.com/view/22503.htm" target=_blank>微型计算机</A>。</B>计算机在被发明后的20年内，一般以巨型机为主，一般来说，程序员负责编程，而有专门的录入人员负责录入与输出。因此，微型计算机的普及与广泛应用，应归功于Apple电脑的发明（</FONT><A href="http://baike.baidu.com/view/1023136.htm" target=_blank><FONT size=4>苹果电脑公司</FONT></A><FONT size=4>的创始人</FONT><A href="http://baike.baidu.com/view/226002.htm" target=_blank><FONT size=4>乔布斯</FONT></A><FONT size=4>成立公司后的产品），以及IBM公司出品的PC机，因此，PC机与Apple机的区别在于：一个是使用DOS操作系统，另一个则是使用的苹果机专有的操作系统。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　由于</FONT><A href="http://baike.baidu.com/view/1531.htm" target=_blank><FONT size=4>苹果机</FONT></A><FONT size=4>只是独家生产，而IBM公司却将其产品的各个模块组件的标准予以公布，从而，其他公司可以根据这些接口标准生产具备兼容性的计算机，从而，PC机与兼容机的概念开始流行。<BR></FONT>
<DIV class=spctrl></DIV><FONT size=4>　　因此，PC机与苹果机，分别代表两种类型的机器。同时，也产生了兼容机的概念。兼容机是指兼容IBM PC的计算机。<BR></FONT>
<DIV class=spctrl></DIV>
<P><FONT size=4>　　由上可见，PC机与苹果机同属于微型计算机（简称</FONT><A href="http://baike.baidu.com/view/303807.htm" target=_blank><FONT size=4>微机</FONT></A><FONT size=4>）</FONT></P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>1981年8月12日是一个普通的日子，但对全球计算机产业来说则是一个值得纪念的日子。在这一天，IBM公司正式推出了全球第一台个人计算机——<B>IBM PC</B>，该机采用主频4.77MHz的Intel 8088微处理器，运行微软公司专门为IBM PC开发的MS-DOS操作系统。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　虽然早在IBM PC推出之前，天才神童“百科帽子”就已经在自家的车库里拼装出了世界上第一台微型计算机，使计算机从“蠢笨的大铁柜”变成人人伸手可及的小型机器。但是，<B>IBM PC的诞生才真正具有划时代的意义，因为它首创了个人电脑（Personal　Computer）的概念，并为PC制订了全球通用的工业标准。</B>它所用的处理器芯片来自</FONT><A href="http://baike.baidu.com/view/2396.htm" target=_blank><FONT size=4>Intel</FONT></A><FONT size=4>公司，DOS磁盘操作系统来自由32人组成的微软公司，不久之后就催生了微软和Intel这两大PC时代的霸主。直到今天，“IBM PC及其兼容机”始终是PC工业标准的代名词。为促使PC产业的健康发展，IBM对所有厂商开放PC工业标准，从而使得这一产业迅速地发展成为20世纪80年代的主导性产业，并造就了Compaq等一大批IBM PC“兼容机”制造厂商。PC产业由此诞生。</FONT></P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>记录了PC平台在发展和形成的20年风雨历程中所经历的25个重要事件和著名的失误。<BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1981年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1. PC登场：在1981年时投资开发个人计算机是一件风险很大的事情。当时开发的个人计算机有好几种，IBM PC也并不是其中的第一台,但是IBM PC却是由当时备受尊重的公司推出的第一台PC。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1983年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　2. Lotus公司的1-2-3电子表格软件：Lotus公司的1-2-3电子表格软件变成了PC的第一个受到众人喜爱的应用程序。是菜单和屏幕上的帮助这样一些革命性的概念帮助Lotus获得了如此巨大的成功。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　3. 克隆战争：Compaq的便携PC使得PC有了独立于IBM的标准。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　4. 摆脱笨拙的软盘束缚：IBM发布了PC/XT，这是个人计算机第一次有了硬盘驱动器作为标准设备。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　5. PCjr——倒霉的后辈：</B>IBM试图用PCjr进入家用市场。但过高的价格、太低的扩展能力和其臭名昭著的键盘使这个系统失败了。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1984年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　6. Mac开始引导潮流：</B>Apple公司的Macintosh计算机诞生。忠诚于PC的人们对Macintosh的鼠标和图形界面冷嘲热讽，但是后来的PC却越来越朝着Mac的风格发展。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　7. 架构大调整：</B>IBM重新推出的新品是PC AT。这是第一台采用Intel的286芯片的PC，AT也显示了全新的16位总线和内嵌时钟。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1985年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　8. Windows 1.0以失败告终：</B>Windows 1.0发布，这是一次确定无疑的失败。该操作系统的第一个版本一点儿也不讨人喜欢，它不能正确地执行多任务；其运行速度之慢简直就像是一只被黏胶粘着的蜗牛。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1986年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　9. Compaq推出基于386芯片的PC：</B>这一事件代表了两次变革:其一，Compaq用基于Intel的具有绝对优势的386芯片的PC击败了蓝色巨人；其二， IBM的PC市场控制地位开始动摇。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1987年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　10. OS/2欲取代DOS未获成功：</B>IBM公司引入了想要成为DOS替代品的OS/2和PS/2。PS/2是作为基于一种全新的体系结构（称为微通道——MicroChannel）的PC而推出的。无论是OS/2还是PS/2，这两种产品都未能产生长久的影响。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1990年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　11. IBM与Microsoft离婚：</B>两个巨人开始了各自独立的行程。IBM以OS/2为手杖，而Microsoft则全力推行Windows。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　12. 三次努力终于成就了Windows：Windows终于流行起来</B>：这是由于Windows的3.0版本改进了外观，多任务能力更好了。1991年的Windows 3.1和1993年的Windows for Workgroup 3.11延续了这个趋势。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　13. 捆绑办公软件</B>：Microsoft把Word、Excel和PowerPoint绑到一起，改变了应用程序的销售方法，慢慢地削弱竞争对手（例如1-2-3）的实力，使它们跟不上潮流。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1991年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　14. 美国走向在线：一个称为AOL的在线服务企业在这一年走入了PC的世界，人们不再需要借助于技术专家的帮助就可以读e-mail了。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　15. Linux：芬兰的大学生Linus Torvalds开发了一个类似Unix的操作系统，并用自己的名字为其命名，向外分发。全世界都对Linux的出现报以热烈的欢迎。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1992年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　16. 声霸卡面世，多媒体诞生：Creative公司的声卡Sound Blaster 16问世， PC的声音不再意味着只是小小的2英寸喇叭。加上日益流行的CD-ROM驱动器，多媒体诞生了。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1993年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　17. 586 CPU芯片改用Pentium的名字推出：由于法庭判决Intel的竞争对手可以称它们的芯片为386，Intel决定为其功能强大的新</FONT><A href="http://baike.baidu.com/view/2089.htm" target=_blank><FONT size=4>CPU</FONT></A><FONT size=4>命名为</FONT><A href="http://baike.baidu.com/view/163193.htm" target=_blank><FONT size=4>Pentium</FONT></A><FONT size=4>（</FONT><A href="http://baike.baidu.com/view/47924.htm" target=_blank><FONT size=4>奔腾</FONT></A><FONT size=4>）。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　18. </FONT><A href="http://baike.baidu.com/view/41346.htm" target=_blank><FONT size=4>Windows NT</FONT></A><FONT size=4>发布：第一个脱离了</FONT><A href="http://baike.baidu.com/view/365.htm" target=_blank><FONT size=4>DOS</FONT></A><FONT size=4>的</FONT><A href="http://baike.baidu.com/view/4821.htm" target=_blank><FONT size=4>Windows</FONT></A><FONT size=4>——Windows NT发布。但是太庞大，而且有许多Windows应用软件都不能运行，所以Microsoft介绍说，这个</FONT><A href="http://baike.baidu.com/view/34963.htm" target=_blank><FONT size=4>OS</FONT></A><FONT size=4>只是为网络和专业用户使用的。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1994年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　19. </FONT><A href="http://baike.baidu.com/view/153922.htm" target=_blank><FONT size=4>Netscape</FONT></A><FONT size=4>公司免费发布了其浏览器Navigator的β版：正是这件事促使Internet获得了无数人的关注，并开始着迷于网上冲浪。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　20. Pentium芯片被发现运算错误：在极稀少的情况下，Pentium CPU芯片会出错，Intel公司宣布只为能够证明需要在这种极稀少的情况下使用的用户免费调换。后来，它又把这种调换改为可为所有的来访者提供了。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1995年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　21. Windows 95面世：</FONT><A href="http://baike.baidu.com/view/2422.htm" target=_blank><FONT size=4>Microsoft</FONT></A><FONT size=4>公司为Windows 95的面世聘请摇滚歌星进行了声势浩大的宣传。Windows 95把PC的应用平台向前推进了。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1998年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　22. Windows 98内嵌浏览器事件：随着</FONT><A href="http://baike.baidu.com/view/41265.htm" target=_blank><FONT size=4>Windows 98</FONT></A><FONT size=4>的面世，Internet Explorer浏览器变成了操作系统的一个组成部分。Microsoft称，从Windows 98中去掉浏览器是不可能的。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　1999年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　23. Microsoft的反垄断案：美国联邦反托拉斯案的主审法官Thomas Penfield Jackson说，Microsoft已经显示出它将会用其巨大的市场能量和极高的利润伤害竞争对手。Jackson法官决定在2000年与Microsoft公司斗争。到目前为止，这个案子还处在诉讼过程之中。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　24. AMD的Athlon芯片性能超过相同时钟速度的奔腾III：AMD一向以克隆Intel的低速、廉价CPU著称。但AMD在1999年发布的Athlon芯片在性能上却超过了相同时钟速度的奔腾III。 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　2000年 <BR></FONT></P>
<DIV class=spctrl><FONT size=4></FONT></DIV>
<P><FONT size=4>　　25. 在两种Windows间受折磨：在向消费者承诺只有一个基于NT的Windows版本多年之后，Microsoft发布了两个新版本的Windows，但是却违反了其诺言。Windows 2000仍然是一个商业的OS，而Windows Me却依然以Windows 95为核心。</FONT></P>]]></description>
</item><item>
<title><![CDATA[VC入门读后感]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41090</link>
<author>shengjorden</author>
<pubDate>2008/11/11 13:25:53</pubDate>
<description><![CDATA[<P><FONT size=4>读了下面这篇文章，了解了一下东西，摘录如下：</FONT></P>
<P><FONT color=#ffcc33 size=4>学语言，与练武道理也差不多。VC、VB、Dlphi、VFP，以及其他的Windows编程语言，都属于同一个门派：Windows门，虽然招式不同，但内功都是一样的，这就是WindowsAPI(应用编程接口)，大概是两千个函数。任何武功，招式即使再复杂，通常也能在很短时间内记下来；但内功就不是一朝一夕的事。而且，各门派的内功不同，Unix、Linux门有Uinx的内功，Apple(苹果)门有Mac的内功，Java更是自成一派。我们这里说的学VC，只是学招式，学招式一个月差不多就够了，聪明的两个星期就可以掌握。光学招式，吓唬人是够了，但和高手一过招，非出丑不可。要想精通VC，必须熟悉WindowsAPI。</FONT></P>
<P><FONT color=#ffcc33 size=4>一门高级语言与一门自然语言是类似的。关键要素有三：</FONT></P>
<P><FONT color=#ffcc33 size=4>语法：了解C和C++基本语法，这是比较容易的。</FONT></P>
<P><FONT color=#ffcc33 size=4>修辞：编程的艺术和风格。通常，这是与软件工程联系起来的。算法上的小伎俩并非是关键的。严谨，严格按照规范去做，同时又能发挥出极大的创造性，才是语言学家的本色。</FONT></P>
<P><FONT color=#ffcc33 size=4>词汇：如何利用别人的工作？如何利用自己以前的工作？这是一个软件工程师成功的关键。如果词汇量不丰富，就写不出好文章，就会有想法表达不出。一个人的语法在上小学之前就基本上学成了，修辞水平也在年轻时就确定了，惟有词汇量需要根据需要不断学习、不断扩充。VC编程中，拥有大的词汇量就意味着要掌握较多的类、函数和其他编程组件。如：WindowsSDK,<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>,以及你所专攻的领域的现成的SDK，比如3D编程中的OpenGL,多媒体编程中的DirectX，图像处理中的Victor库。另外，ActiveX控件的掌握往往也是成败的关键。我们这几年的工作也总结成了一个类库，叫IPX（图像处理框架），大大简化了图像处理的工作；不过现在还有很多细节问题要解决，如果有同学感兴趣可以参与这方面的工作。</FONT></P>
<P><FONT size=4>　</FONT></P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>转自</FONT><A href="http://sentven.bokee.com/3647789.html"><FONT size=4>http://sentven.bokee.com/3647789.html</FONT></A></P>
<H2 class=diaryTitle><FONT size=4>VC入门</FONT></H2><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>
<P>
<BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px">
<P><FONT color=#ffcc33 size=4><A href="http://www.vczx.com/minute/vc_jsnm.php#8">http://www.vczx.com/minute/vc_jsnm.php#8</A></FONT></P>
<P><FONT color=#ffcc33 size=4>一、VC是什么？学VC是学什么？</FONT></P>
<P><FONT color=#ffcc33 size=4>首先VC是一个软件（IDE集成开发环境）（编译、编辑、调试）</FONT></P>
<P><FONT color=#ffcc33 size=4>C和C++。但C++中的有些特性是不用的，例如I/O流，多态继承</FONT></P>
<P><FONT color=#ffcc33 size=4>WindowsSDK（软件开发工具）</FONT></P>
<P><FONT color=#ffcc33 size=4>VC的灵魂：<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>（微软基础类库）</FONT></P>
<P><FONT color=#ffcc33 size=4>ATL（ActiveX模板类库）</FONT></P>
<P><FONT color=#ffcc33 size=4>其他的SDK，如OpenGL,DirectX,ActiveMoive,DrawDib(WinG)</FONT></P>
<P><BR><FONT color=#ffcc33 size=4>VC是许许多多技术的综合，就好象少林72般绝技，一般在应用中学会其中很少一部分就够了。我们的现在目的，其实不过是学一套少林长拳。这套长拳应包括：</FONT></P>
<P><FONT color=#ffcc33 size=4>1、养成一种严谨的软件开发习惯，熟悉软件工程的基本原则。</FONT></P>
<P><FONT color=#ffcc33 size=4>2、C语言基础</FONT></P>
<P><FONT color=#ffcc33 size=4>3、C++最基本内容：类、继承性、封装性、多态性的概念</FONT></P>
<P><FONT color=#ffcc33 size=4>4、如何用向导建立一个程序框架</FONT></P>
<P><FONT color=#ffcc33 size=4>5、设计菜单</FONT></P>
<P><FONT color=#ffcc33 size=4>6、设计工具条</FONT></P>
<P><FONT color=#ffcc33 size=4>7、设计和使用对话框，熟悉最常用的对话框控件：按钮、静态文本、编辑框等</FONT></P>
<P><FONT color=#ffcc33 size=4>8、知道怎样新建类、成员函数、成员变量、消息处理函数。</FONT></P>
<P><FONT color=#ffcc33 size=4>9、了解最常用的Windows消息：如WM_PAINT(重绘窗口)，鼠标按下、弹起、移动，初始化对话框，等。</FONT></P>
<P><FONT color=#ffcc33 size=4>10、了解最简单的GDI(图形设备接口)：写文字、画框、画点、画线、</FONT><A name=1></A><FONT color=#ffcc33><FONT size=4><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">画圆</B>，设置画笔、画刷。</FONT></FONT></P>
<P><FONT color=#ffcc33 size=4>11、熟悉最常用的<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>类：</FONT></P>
<P><FONT color=#ffcc33 size=4>CWnd</FONT></P>
<P><FONT color=#ffcc33 size=4>CDocument</FONT></P>
<P><FONT color=#ffcc33 size=4>CView</FONT></P>
<P><FONT color=#ffcc33 size=4>CDC</FONT></P>
<P><FONT color=#ffcc33 size=4>CDialog</FONT></P>
<P><FONT color=#ffcc33 size=4>CWinApp</FONT></P>
<P><FONT color=#ffcc33 size=4>CGdiObject及子类</FONT></P>
<P><FONT color=#ffcc33 size=4>CString、CPoint、CRect、CSize等简单数据类型</FONT></P>
<P><FONT color=#ffcc33 size=4>CFile</FONT></P>
<P><FONT color=#ffcc33 size=4>以上提到的这些内容，是每个人都会用到的内容。</FONT></P>
<P><BR><FONT color=#ffcc33 size=4>二、<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>简介</FONT></P>
<P><FONT color=#ffcc33 size=4>上述主要内容都是与实际操作关系非常密切的，在此不可能讲清楚；而且，这些在一般的书里都会讲到。我主要将最重要的<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>介绍一下。</FONT></P>
<P><FONT color=#ffcc33><FONT size=4><B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>是对WindowsAPI的封装，大大简化了我们的工作；学VC主要就是要学<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>，大约有100多个类，但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂；当然不要死记，要通过看帮助、看例子、动手练习来学会它们；而且，并非每个类的内部的所有函数都要学会，要日积月累。如果真的想成为高手，做个笔记本把自己认为重要的类、函数记下来，随时学习，也是很好的突击方法。</FONT></FONT></P>
<P><FONT color=#ffcc33 size=4>下面介绍最重要的<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>。</FONT></P>
<P><FONT color=#ffcc33 size=4>CWnd：窗口，它是大多数“看得见的东西”的父类（Windows里几乎所有看得见的东西都是一个窗口，大窗口里有许多小窗口），比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton，etc;一个例外是菜单（CMenu）不是从窗口派生的。该类很大，一开始也不必学，知道就行了。</FONT></P>
<P><FONT color=#ffcc33 size=4>CDocument文档，负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument（写盘）,Serialize（读写）</FONT></P>
<P><FONT color=#ffcc33 size=4>CView视图，负责内存数据与用户的交互。包括数据的显示、用户操作的响应（如菜单的选取、鼠标的响应）。最重要的是OnDraw(重画窗口)，通常用CWnd::Invalidate()来启动它。另外，它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面，你打交道最多的就是它。</FONT></P>
<P><FONT color=#ffcc33 size=4>CDC设备文本。无论是显示器还是打印机，都是画图给用户看。这图就抽象为CDC。CDC与其他GDI（图形设备接口）一起，完成文字和图形、图像的显示工作。把CDC想象成一张纸，每个窗口都有一个CDC相联系，负责画窗口。CDC有个常用子类CClientDC（窗口客户区），画图通常通过CClientDC完成。</FONT></P>
<P><FONT color=#ffcc33 size=4>CDialog对话框</FONT></P>
<P><FONT color=#ffcc33 size=4>CWinApp应用程序类。似于C中的main函数，是程序执行的入口和管理者，负责程序建立、消灭，主窗口和文档模板的建立。最常用函数InitInstance（）：初始化。</FONT></P>
<P><FONT color=#ffcc33 size=4>CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。</FONT></P>
<P><FONT color=#ffcc33 size=4>CPen笔，画线</FONT></P>
<P><FONT color=#ffcc33 size=4>CBrush刷子，填充</FONT></P>
<P><FONT color=#ffcc33 size=4>CFont字体，控制文字输出的字体</FONT></P>
<P><FONT color=#ffcc33 size=4>CBitmap位图</FONT></P>
<P><FONT color=#ffcc33 size=4>CPalette调色板</FONT></P>
<P><FONT color=#ffcc33 size=4>CRgn区域，指定一块区域可以用于做特殊处理。</FONT></P>
<P><FONT color=#ffcc33 size=4>CFile文件。最重要的不外是Open（打开）,Read（读入）,Write（写）</FONT></P>
<P><FONT color=#ffcc33 size=4>CString字符串。封装了C中的字符数组，非常实用。</FONT></P>
<P><FONT color=#ffcc33 size=4>CPoint点，就是（x,y）对</FONT></P>
<P><FONT color=#ffcc33 size=4>CRect矩形，就是（left,top,right,bottom）</FONT></P>
<P><FONT color=#ffcc33 size=4>CSize大小，就是（cx,cy）对（宽、高）</FONT></P>
<P><FONT color=#ffcc33 size=4>三、用好MSDN和例子</FONT></P>
<P><FONT color=#ffcc33 size=4>作为提高，推荐看的例子有：</FONT></P>
<P><FONT color=#ffcc33 size=4>nHello最简单的程序框架</FONT></P>
<P><FONT color=#ffcc33 size=4>nScribble鼠标绘图。教程：编程基础，GDI</FONT></P>
<P><FONT color=#ffcc33 size=4>nDiblook图像处理最简范例</FONT></P>
<P><FONT color=#ffcc33 size=4>n<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>IE因特网浏览器</FONT></P>
<P><FONT color=#ffcc33 size=4>nEnroll数据库</FONT></P>
<P><FONT color=#ffcc33 size=4>nDaoviewDao(数据访问对象）范例。树型和列视控件</FONT></P>
<P><FONT color=#ffcc33 size=4>nCubeOpenGL范例，画一个不断旋转的方块</FONT></P>
<P><FONT color=#ffcc33 size=4>nHierSvrOLE服务器</FONT></P>
<P><FONT color=#ffcc33 size=4>nOclientOLE包容器</FONT></P>
<P><FONT color=#ffcc33 size=4>nDrawcli鼠标绘图。也包括OLE。</FONT></P>
<P><FONT color=#ffcc33 size=4>nWordPad写字板。OLE</FONT></P>
<P><FONT color=#ffcc33 size=4>四、几点经验</FONT></P>
<P><FONT color=#ffcc33 size=4>A.为什么要用Windows而不是DOS编程</FONT></P>
<P><FONT color=#ffcc33 size=4>Windows编程并不比DOS编程难很多，只是在刚刚接触的时候感到头绪繁多，不知从何下手。实际上，如果你会C语言，你会发现Windows编程的难度并不比当年学C语言时大。DOS编程要想成为高手，也需要学习几百个函数（无论是TC、BC、MicrosoftC），并要深入了解汇编语言级的DOS功能调用。而现在在Windows下，付出相同的工作量，你却可以获得几倍的收益。如果你以前熟悉DOS编程，现在再搞Windows编程，只要两个星期肯定会感到巨大的优越性：在DOS下，每一件事都要自己干，而且还有64K内存、显示精度等的限制，实在是事倍功半了。</FONT></P>
<P><BR><FONT color=#ffcc33 size=4>B.为什么要用VC而不是其他Windows编程语言</FONT></P>
<P><FONT color=#ffcc33 size=4>n大多数大型软件（包括Windows自己）都是用C、C++编的，所以可以利用的源代码特别多。例如Photoshop，就有VC的编程接口。的其他的语言都不如VC有历史优势。而且VC的开发工具特别多，从控件公司到硬件开发商，其产品很少敢不提供VC接口的。</FONT></P>
<P><FONT color=#ffcc33 size=4>nVC适合组织大工程（VB就不行）</FONT></P>
<P><FONT color=#ffcc33 size=4>nBorlandC++或C++Builder也很不错，并不比VC差。但BC的版本兼容性不好，从3.1到4.0就出现“代沟”，而且VC提供了极为丰富的文档和范例,VC的参考资料也远比BC多。并且VC与其他的VisualStudio成员可以协调工作，对软件工程有利。</FONT></P>
<P><FONT color=#ffcc33 size=4>n</FONT></P>
<P><FONT color=#ffcc33 size=4>C.开始不要学WinAPI编程，但以后最好学学WinAPI</FONT></P>
<P><FONT color=#ffcc33 size=4>特别要注意，开始不要买讲WindowsSDK编程的书。一个臭名昭著的例子就是“HelloWorld”。各种计算机语言在入门课中往往都给出一个例子，显示一行文字“HelloWorld”，无论是在Basic、C、Pascal，甚至汇编中，这个最简单的小程序都几行就可以写完。但在早期的Windows编程中，刚才讲到的“HelloWin”这个有名的例子就要组织一个工程、写上几百行代码才能实现。这就吓跑了很多想学Windows编程的人。实际上，在Windows下显示“Helloworld”,最简单的方法只要5行就够了：</FONT></P>
<P><FONT color=#ffcc33 size=4>#include“windows.h”</FONT></P>
<P><BR><FONT color=#ffcc33 size=4>voidWinMain()</FONT></P>
<P><FONT color=#ffcc33 size=4>{</FONT></P>
<P><FONT color=#ffcc33 size=4>MessageBox(NULL,”HelloWorld!”,”MyFirstWindowsApplication”,MB_OK);</FONT></P>
<P><FONT color=#ffcc33 size=4>}</FONT></P>
<P><FONT color=#ffcc33 size=4>当然这个程序只建立了一个最简单的对话框，但这已经够了。</FONT></P>
<P><FONT color=#ffcc33 size=4>如果你没有SDK编程的经验，学VC就是要利用<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>绕过Windows编程的许多细节。有好的工具为什么不用呢？现在你在VC写一个”HelloWorld”，只要写一行代码就可以了。</FONT></P>
<P><FONT color=#ffcc33 size=4>voidCYourView::OnDraw(CDC*pDC)</FONT></P>
<P><FONT color=#ffcc33 size=4>{</FONT></P>
<P><FONT color=#ffcc33 size=4>//…….其他的代码</FONT></P>
<P><FONT color=#ffcc33 size=4>pDC-&gt;TextOut(100,100,”HelloWorld!”);</FONT></P>
<P><FONT color=#ffcc33 size=4>}</FONT></P>
<P><FONT color=#ffcc33 size=4>但<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>不是万能的，WinAPI和VC中有很多功能在<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>中并不能反映出来。在入门后，要想发挥VC的完全能力，WindowsAPI还是非常重要的。而且，这些API在其他Windows语言中也用得到。</FONT></P>
<P><FONT color=#ffcc33 size=4>学语言，与练武道理也差不多。VC、VB、Dlphi、VFP，以及其他的Windows编程语言，都属于同一个门派：Windows门，虽然招式不同，但内功都是一样的，这就是WindowsAPI(应用编程接口)，大概是两千个函数。任何武功，招式即使再复杂，通常也能在很短时间内记下来；但内功就不是一朝一夕的事。而且，各门派的内功不同，Unix、Linux门有Uinx的内功，Apple(苹果)门有Mac的内功，Java更是自成一派。我们这里说的学VC，只是学招式，学招式一个月差不多就够了，聪明的两个星期就可以掌握。光学招式，吓唬人是够了，但和高手一过招，非出丑不可。要想精通VC，必须熟悉WindowsAPI。</FONT></P>
<P><BR><FONT color=#ffcc33 size=4>D.高级语言与自然语言</FONT></P>
<P><FONT color=#ffcc33 size=4>一门高级语言与一门自然语言是类似的。关键要素有三：</FONT></P>
<P><FONT color=#ffcc33 size=4>语法：了解C和C++基本语法，这是比较容易的。</FONT></P>
<P><FONT color=#ffcc33 size=4>修辞：编程的艺术和风格。通常，这是与软件工程联系起来的。算法上的小伎俩并非是关键的。严谨，严格按照规范去做，同时又能发挥出极大的创造性，才是语言学家的本色。</FONT></P>
<P><FONT color=#ffcc33 size=4>词汇：如何利用别人的工作？如何利用自己以前的工作？这是一个软件工程师成功的关键。如果词汇量不丰富，就写不出好文章，就会有想法表达不出。一个人的语法在上小学之前就基本上学成了，修辞水平也在年轻时就确定了，惟有词汇量需要根据需要不断学习、不断扩充。VC编程中，拥有大的词汇量就意味着要掌握较多的类、函数和其他编程组件。如：WindowsSDK,<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">MFC</B>,以及你所专攻的领域的现成的SDK，比如3D编程中的OpenGL,多媒体编程中的DirectX，图像处理中的Victor库。另外，ActiveX控件的掌握往往也是成败的关键。我们这几年的工作也总结成了一个类库，叫IPX（图像处理框架），大大简化了图像处理的工作；不过现在还有很多细节问题要解决，如果有同学感兴趣可以参与这方面的工作。</FONT></P>
<P><FONT color=#ffcc33 size=4>学习VC，千万不要用我们在学校里学英语的方法，而要用小孩学说话的方法。所谓学英语的方法，就是我们在本科时学C语言的那种模式：详细搞懂每一个细节，背大量的规则，很少上机实践，没有实际问题供解决，最后由考试来断定学习成果。这种模式的后果大家都清楚：我们学了十几年英语，可有不少人还只会四五千个单词，写百把字的文章，不会说，不能听；尤其要命的是，看不懂VC的帮助文档。我们要象婴儿一样，在使用中学会语法、修辞和词汇；一开始肯定只能编出最糟糕的，就好象小孩开始只会说：“爸爸坐车车”；但“爸爸”“车车”这些词对小孩是最需要的，学习的效率反而最高。学VC的时候，应从我的需要出发，先做一个最简单的东西，然后一点一点复杂起来，象滚雪球一样。</FONT></P>
<P><FONT color=#ffcc33 size=4>学习VC尤其要和别人交流，你苦苦思考不明白的，也许别人早就解决了。一定要善于学习：从书店找出有用的书；向身边的高手学习；寻找可以利用的源代码、类库、组件、控件、库；如果能上互连网，那就更加能解决问题了。</FONT></P></BLOCKQUOTE>]]></description>
</item><item>
<title><![CDATA[MFC还是Winform 微软的下一代用户界面技术WPF【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41085</link>
<author>shengjorden</author>
<pubDate>2008/11/10 21:25:58</pubDate>
<description><![CDATA[<P><FONT size=4>转自http://blog.163.com/peiz_anhui/blog/static/82554214200852332115938/　</FONT></P>
<P><FONT size=4></FONT>&nbsp;</P>
<P style="TEXT-INDENT: 2em"><FONT size=4>WPF简介</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>WPF的全称是Windows Presentation Foundation，是微软新发布的Vista操作系统的三大核心开发库之一，其主要负责的是图形显示，所以叫Presentation（呈现）。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>作为新的图形引擎，WPF是基于DirectX的，当然增加了很多新的功能。其2D和3D引擎的强大看看Vista的界面就明白了，再加上其对Aero图形引擎的支持，更加让你刚到神奇。顺便提一下，Aero是专门为3D桌面开发的引擎，可以让桌面实现神奇的3D翻转，这绝对是操作系统有史以来的一次神奇尝试，虽然对硬件配置的要求也是惊人的，此前已有相关报道称，Vista对显卡十分挑剔就是出于运行Aero的考虑。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　微软公司早在2003年洛杉矶的PDC上就公布了Avalon，他们将其视为下一代用户界面技术，并且得到了开发者和用户的一致赞同。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　在2005年的PDC上，微软公司展示了比2003年更加完整的Avalon版本，并给它取了一个官方新名称：Windows Presentation Foundation(WPF)。在此之前，它已经完成了从演示软件到开始阶段alpha版本的API的转变。到了几个月之后的今天，它又成长成为更加先进的beta版本--你可以使用它来开发你的下一代用户界面程序了。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　那么，WPF是什么，为什么它那么重要呢？</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　首先，它清晰而又有效的将用户界面和程序实现分开。它使得设计可视化的用户界面的设计者和编写内部核心代码的开发人员可以并行工作。这是非常重要的：</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　·将两者分开，软件开发公司可以使得设计者们集中精力将设计工作做得更好，同时让开发者支持他们。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　·随着软件外包和订购的逐渐风行，WPF使得一些商业的设计者们能够更好的从事界面设计工作，并集成一些简单的功能，而购买的核心代码能够独立的完成内部的一些关键逻辑而不干扰设计过程。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　·它更好的支持应用软件的国际化。不同的独立的界面可以使用不同的本地化方案，而内部的代码是通用的。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　·它支持软件的"空标签"：可以为不同的用户采用定制的界面而保持核心的逻辑不变。开发者们创建程序逻辑，然后为不同的用户使用不同的界面并贴上他们的商标等。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　WPF使用一种基于XML的语言来定义用户界面从而完成上述的工作。这种语言被称为XAML，XML应用程序标记语言。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　其次，WPF使用一种基于向量而不是基于光栅的绘制引擎，这和曹其的Windows的绘制引擎是截然不同的。光栅绘制引擎通过在屏幕上绘制象素点来绘制表面。象素只是点；这样的话，如果屏幕分辨率(DPI，每英寸点)增加了，它的效果就会变差。随着现在屏幕都采用超高DPI的分辨率，字体必须使用成百上千个DPI来达到一定的浏览效果。比如微软Word里缺省的英文字体12号的Times New Roman，在现在的普通分辨率情况下效果还可以但是到了超高分辨率的显示器上效果就不行了。管理这些基于光栅的图像的点将会消耗大量的处理能力，同时也是很浪费的。而采用基于向量的方式来替代象素，在一个可扩展的坐标系里绘制字体和其他线型，使得它们可以独立于DPI。想想Windows Metafile（WMF）和位图文件（BMP）之间的差距你就明白了。同时，向量图也使得一些变换如3D，旋转和动画变得更加方便和易于操作。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　作为新的图形引擎，WPF是基于DirectX的，当然增加了很多新的功能。其2D和3D引擎的强大看看Vista的界面就明白了，再加上其对Aero图形引擎的支持，更加让你感到神奇。顺便提一下，Aero是专门为3D桌面开发的引擎，可以让桌面实现神奇的3D翻转，这绝对是操作系统有史以来的一次神奇尝试，虽然对硬件配置的要求也是惊人的，此前已有相关报道称，Vista对显卡十分挑剔就是出于运行Aero的考虑。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　WPF前景分析 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　WPF 其实不仅仅是图形引擎而已，它将给Windows应用程序的开发带来一次革命，因为新的架构提供了一种全新的开发模式。当然对于普通用户而言，最直观的就是界面越来越漂亮，看起来越来越舒服了；但对于开发人员而言，界面显示和代码将更好的得到分离，这与从前的桌面应用程序开发有很多不同（界面设置和代码是融合在一起的），这是比较具有革命性的改变之一。还有就是桌面应用程序和浏览器应用程序的融合，根据ms的承诺，正在开发中的WPF/E，即WPF Everywhere版本，将为基于WPF的应用程序提供全面的浏览器支持，这意味着未来开发出的应用程序将可以基于浏览器在不同的操作系统上运行（也就是说桌面应用程序和浏览器应用程序将会融合！！），当然由于目前还在开发中，我们并不确定会不会有一定的限制，根据WPF/E开发组的定义，WPF/E仍然是WPF的子集，而不是后继版本。总体而言，WPF的前景应该是一片光明。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　目前开发界的对WPF响应程度 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　目前已有很多人开始考虑或者已经转向 WPF，一场新的学习热潮已经开始。但根据我最近的学习和了解，国内关于WPF的资料很少，除了msdn提供的资料以外，基本都是来自国外的资料，有些则是国外开发人员blog上的资料，当然都是英文的。因此如果现在能够引进一些WPF的书绝对是很好的时机。而且国外目前的几本WPF书也是刚刚上市，如果我们可以尽快引进的话，绝对可以帮助国内开发人员在最短时间内赶上国际步伐。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　目前微软针对WPF提供的服务和支持 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　随着Vista RTM的发布，微软新一轮的技术推广已经开始。其实在此之前，WPF已经有很大的推广，因为CTP版本已经发布了有一段日子了。当然很多开发人员主要以技术研究为主，也有少数公司已经开始从事基于WPF的产品研发工作。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　1. 目前WPF的正式版本已经发布（随.net framework 3.0正式版发布），你可以从msdn上免费下载 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　2. 相应的技术支持已经开始，但目前仅限于大客户，主要做售前技术支持，对于普通开发人员的技术支持可能要等到明年2月份才会开始（个人知道的情况，请以微软官方技术支持网站发布的信息为准） </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　3. WPF的VS2005插件目前还只有社区预览版（CTP版），也是从msdn上免费下载的，但正式版恐怕还要等一段时间，但使用CTP版本确实已经可以在VS2005中进行所见即所得的WPF开发。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>　　　　4. WPF/E CTP版本已经发布，你可以在msdn上免费下载。同时发布的还有WPF/E Sample Pack for CTP。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>微软就发布了WPF/E的最新CTP测试版。“Flash杀手”正在一步步走近。 </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>WPF/E是微软新Windows图形子系统“Windows Presentati&nbsp; &nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>on Foundation”(代号Avalon)的一个子集，最早现身于PDC 2005大会，今年初的MIX 06上又进行了深入展示。WPF/E基于跨浏览器网络技术，依赖XAML语言和JavaScript脚本创建页面，与Flash一样作为浏览器插件工作，同样能显示矢量图形、动画和视频，可以运行在多种操作系统甚至移动设备上。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>WPF/E的2月CTP版增加了一些新特性，具体包括MP3支持、键盘输入、鼠标指针支持、全屏模式、JavaScript API改进、性能调整等等。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>WPF/E与Flash角逐的野心很明显，不过微软也强代了WPF/E的一个重要区别：WPF/E程序不像Flash那样采用二元制编译，从而仅限于Flash播放器，而是所有代码都基于标准而来，图像方面还使用了XAML。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>对比MFC ，winform ，wpf </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>分析：</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>MFC 生成本机代码，自然是很快。可是，消息循环，减缓了界面显示速度，</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>winform 封装了 win32 的api，多次进行P/invoke 操作 （大部分使用p/invoke操作封装），速度慢 。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>wpf是一种新的模型，不再使用win32 模型，自己新建模型，使用dx 作为新的显示技术，直接访问驱动程序，加快了运行速度，可是，这种模型，需要支持dx 9 的显卡，硬件要求高（你还能找到现代机器不支持dx9 的吗？）</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>MFC ，winform ，wpf </FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>开发效率上，MFC&lt;WPF&lt;winform&nbsp;&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>尽管MFC开发界面执行效率高但是开发效率低，作为现在的项目开发来说</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>时间跟开发效率往往能决定项目的成败，所以除非有特别的需求，否则都回尽量避免用mfc来做开发，MFC只是一个弱封装器</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>开发成本，MFC〉wpf〉winform</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>用MFC开发成本太高，对开发者能力要求更高，作为客服当然希望开发的费用越少越好，开发者当然希望钱赚得越多越好，这样一比，这也是MFC没落的一个很大的原因</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>界面执行效率上，MFC==WPF〉winform</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>随着计算机硬件的性能提高，多核cpu的普及，它们的差距会越来越小</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>开发灵活性上：wpf〉MFC〉winform</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>美观上：Wpf〉winform〉MFC</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>这一项中MFC下要开发出一个华丽的ui极其困难，也许你可以说你可以用控件，但是商业开发控件是要收费的！！Wpf很容易就可以做出vista那样的ui特效</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>mfc要写出这种效果不知要写到何年何月</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>这样一来MFC存在的价值就更低了。效率和美观不如Wpf，开发效率又不如winform，预计不出10年，随着vista取代xp，mfc将会退出历史舞台</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>内存使用上：wpf〉winform〉MFC</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>随着计算机硬件的性能提高wpf这个缺点会被忽略</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>使用范围：wpf〉MFC==winform</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=4>有以上可知：WPF 大有取代winform 和MFC之势，从未来net的发展来看，MFC以后只会变成一种经典，作为一种技术来供开发者学习，winform和WPF两者会并存发展，但最终都会被WPF取代，最终实现桌面应用程序和浏览器应用程序的统一</FONT></P>]]></description>
</item><item>
<title><![CDATA[追MM与设计模式【转】]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=shengjorden&amp;id=41072</link>
<author>shengjorden</author>
<pubDate>2008/11/10 10:41:41</pubDate>
<description><![CDATA[<P><FONT size=4>转自</FONT></P>
<P><FONT size=4>http://hi.baidu.com/bluecosmoschief/blog/item/525f49d7f1310fdca144df1f.html</FONT><A><FONT size=4>　</FONT></A></P>
<P><FONT size=4></FONT>&nbsp;</P>
<DIV class=tit><FONT size=4>追MM与设计模式</FONT></DIV>
<DIV class=date><FONT size=4>2007-05-12 00:13</FONT></DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt id=blog_text>
<P><FONT size=4>这些都是最简单的介绍，要学习的话建议你看一下《java与模式》这本书。</FONT></P>
<P><FONT size=4>创建型模式</FONT></P>
<P><FONT size=4>1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory</FONT></P>
<P><FONT size=4>　　工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。</FONT></P>
<P><FONT size=4>2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。（这一定比美军在伊拉克用的翻译机好卖）</FONT></P>
<P><FONT size=4>　　建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。</FONT></P>
<P><FONT size=4>3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。</FONT></P>
<P><FONT size=4>　　工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。</FONT></P>
<P><FONT size=4>4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要）</FONT></P>
<P><FONT size=4>　　原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。</FONT></P>
<P><FONT size=4>5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事)</FONT></P>
<P><FONT size=4>　　单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。</FONT></P>
<P><BR><FONT size=4>结构型模式</FONT></P>
<P><FONT size=4>6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)</FONT></P>
<P><FONT size=4>　　适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。</FONT></P>
<P><FONT size=4>7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了</FONT></P>
<P><FONT size=4>　　桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。</FONT></P>
<P><FONT size=4>8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有？</FONT></P>
<P><FONT size=4>　　合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。</FONT></P>
<P><FONT size=4>9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？</FONT></P>
<P><FONT size=4>　　装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。</FONT></P>
<P><FONT size=4>10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。</FONT></P>
<P><FONT size=4>　　门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。</FONT></P>
<P><FONT size=4>11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。</FONT></P>
<P><FONT size=4>　　享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。</FONT></P>
<P><FONT size=4>12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。</FONT></P>
<P><FONT size=4>　　代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。</FONT></P>
<P><BR><FONT size=4>行为模式</FONT></P>
<P><FONT size=4>13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑!</FONT></P>
<P><FONT size=4>　　责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。</FONT></P>
<P><FONT size=4>14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。”，:-(</FONT></P>
<P><FONT size=4>　　命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。</FONT></P>
<P><FONT size=4>15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。</FONT></P>
<P><FONT size=4>　　解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。</FONT></P>
<P><FONT size=4>16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mary：“想要我跟你结婚，得答应我的条件”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我：“什么条件我都答应，你说吧”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mary：“我看上了那个一克拉的钻石”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我：“我买，我买，还有吗？”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mary：“我看上了湖边的那栋别墅”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我：“我买，我买，还有吗？”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mary：“你的小弟弟必须要有50cm长”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我脑袋嗡的一声，坐在椅子上，一咬牙：“我剪，我剪，还有吗？”</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ……</FONT></P>
<P><FONT size=4>　　迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。</FONT></P>
<P><FONT size=4>17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。</FONT></P>
<P><FONT size=4>　　调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。</FONT></P>
<P><FONT size=4>18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。</FONT></P>
<P><FONT size=4>　　备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。</FONT></P>
<P><FONT size=4>19、OBSERVER—想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦</FONT></P>
<P><FONT size=4>　　观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。</FONT></P>
<P><FONT size=4>20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么？”，已经喜欢上你的MM就会说“几点钟？看完电影再去泡吧怎么样？”，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。</FONT></P>
<P><FONT size=4>　　状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。</FONT></P>
<P><FONT size=4>21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。</FONT></P>
<P><FONT size=4>　　策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。</FONT></P>
<P><FONT size=4>22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗？女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)；</FONT></P>
<P><FONT size=4>　　模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。</FONT></P>
<P><FONT size=4>23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了；</FONT></P>
<P><FONT size=4>　　访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。</FONT></P></DIV></TD></TR></TBODY></TABLE>]]></description>
</item>
</channel>
</rss>