<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[Steve &apos;s blog]]></title>
	  <link>http://xxxzheng.blog.163.com</link>
	  <description><![CDATA[                       长风破浪会有时,直挂云帆济沧海 长风破浪会有时,
直挂云帆济沧海。
秋月已度,春风未闲,新年之际,万象更新。]]></description>
	  <language>zh-CN</language>
	  <pubDate>Mon, 28 Jul 2008 18:43:40 +0800</pubDate>
	  <lastBuildDate>Mon, 28 Jul 2008 18:43:40 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[xxxzheng]]></managingEditor>
	  <webMaster><![CDATA[steve]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[Steve &apos;s blog]]></title>
	  	<url>http://ava.blog.163.com/photo/sH4SSNBfeXqcXXJ9S7_XXw==/4259560822562467857.jpg</url>
	  	<link>http://xxxzheng.blog.163.com</link>
	  </image>
  <item>
  	<title><![CDATA[问天下间情为何物？]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200862864111677</link>
    <description><![CDATA[<div><P>问天下间情为何物？</P>
<P>佛曰：“废物”！</P>
<P>哈哈哈：强！！</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200862864111677</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200862864111677</guid>
    <pubDate>Mon, 28 Jul 2008 18:41:11 +0800</pubDate>
    <dcterms:modified>2008-07-28T18:41:11+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[多么多么伤心，你是他的]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/9674412008431104631733</link>
    <description><![CDATA[<div>多么多么伤心，你是他的</div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/9674412008431104631733</comments>
    <slash:comments>5</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/9674412008431104631733</guid>
    <pubDate>Sat, 31 May 2008 22:46:31 +0800</pubDate>
    <dcterms:modified>2008-05-31T22:46:31+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[炒菜]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/96744120084138343511</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">活中，有些食物的搭配组合已经是由来已久，其美妙的口味也被人们所接受，习惯上也觉得这些种搭配是顺理成章的了。但从健康的角度讲，还是不科学的，人家健康专家可是有着充足的理由呢。这里给您列出12种被健康专家列为错误的菜肴搭配。不过，不这样吃，有的东西还真不好吃，我想少这么吃也许问题不大吧。如果您很重视健康，还是听从专家们的忠告，别总是傻吃、贪吃。 </P>
<P style="TEXT-INDENT: 2em">1.土豆烧牛肉：由于土豆和牛肉在被消化时所需的胃酸的浓度不同，就势必延长食物在胃中的滞留时间，从而引起胃肠消化吸收时间的延长，久而久之，必然导致肠胃功能的紊乱。 <WBR></P>
<P style="TEXT-INDENT: 2em">2.小葱拌豆腐：豆腐中的钙与葱中的草酸，会结合成白色沉淀物--草酸钙，同样造成人体对钙的吸收困难。 <WBR></P>
<P style="TEXT-INDENT: 2em">3.豆浆冲鸡蛋：鸡蛋中的粘液性蛋白会与豆浆中的胰蛋白酶结合，从而失去二者应有的营养价值。 <WBR></P>
<P style="TEXT-INDENT: 2em">4.茶叶煮鸡蛋：茶叶中除生物碱外，还有酸性物质，这些化合物与鸡蛋中的铁元素结合，对胃有刺激作用，且不利于消化吸收。 <WBR></P>
<P style="TEXT-INDENT: 2em">5.炒鸡蛋放味精：鸡蛋本身含有许多与味精成分相同的谷氨酸，所以炒鸡蛋时放味精，不仅增加不了鲜味，反而会破坏和掩盖鸡蛋的天然鲜味。 <WBR></P>
<P style="TEXT-INDENT: 2em">6.红白萝卜混吃：白萝卜中的维生素c含量极高，但红萝卜中却含有一种叫抗坏血酸的分解酵素，它会破坏白萝卜中的维生素c。一旦红白萝卜配合，白萝卜中的维生素c就会丧失殆尽。不仅如此，在与含维生素c的蔬菜配合烹调时，红萝卜都充当了破坏者的角色。还有胡瓜、南瓜等也含有类似红萝卜的分解酵素。 <WBR></P>
<P style="TEXT-INDENT: 2em">7.萝卜水果同吃：近年来科学家们发现，萝卜等十字花科蔬菜进入人体后，经代谢很快就会产生一种抗甲状腺的物质---硫氰酸。该物质产生的多少与摄入量成正比。此时，如果摄入含大量植物色素的水果如橘子、梨、苹果、葡萄等，这些水果中的类黄酮物质在肠道被细菌分解，转化成羟苯甲酸及阿魏酸，它们可加强硫氰酸抑制甲状腺的作用，从而诱发或导致甲状腺肿。 <WBR></P>
<P style="TEXT-INDENT: 2em">8.海味与水果同食：海味中的鱼、虾、藻类，含有丰富的蛋白质和钙等营养物质，如果与含有鞣酸的水果同食，不仅会降低蛋白质的营养价值，且易使海味中的钙质与鞣酸结合成一种新的不易消化的物质，这种物质会刺激胃而引起不适，使人出现肚子痛、呕吐、恶心等症状。含鞣酸较多的水果有柿子、葡萄、石榴、山楂、青果等。因此这些水果不宜与海味菜同时食用，以间隔两个小时为宜。 <WBR></P>
<P style="TEXT-INDENT: 2em">9.牛奶与橘子同食：刚喝完牛奶就吃橘子，牛奶中的蛋白质就会先与橘子中的果酸和维生素c相遇而凝固成块，影响消化吸收，而且还会使人发生腹胀、腹痛、腹泻等症状。 <WBR></P>
<P style="TEXT-INDENT: 2em">10.酒与胡萝卜同食：最近，美国食品专家告诫人们：酒与胡萝卜同食是很危险的。专家指出，因为胡萝卜中丰富的β胡萝卜素与酒精一同进入人体，就会在肝脏中产生毒素，从而引起肝病。特别是在饮用胡萝卜汁后不要马上去饮酒。 <WBR></P>
<P style="TEXT-INDENT: 2em">11.白酒与汽水同饮：因为白酒、汽水同饮后会很快使酒精在全身挥发，并生产大量的二氧化碳，对胃、肠、肝、肾等器官有严重危害，对心脑血管也有损害。 <WBR></P>
<P style="TEXT-INDENT: 2em">12.吃肉时喝茶：有的人在吃肉食、海味等高蛋白食物后，不久就喝茶，以为能帮助消化。殊不知，茶叶中的大量鞣酸与蛋白质结合，会生成具有收敛性的鞣酸蛋白质，使肠蠕动减慢，从而延长粪便在肠道内滞留的时间。既容易形成便秘，又增加有毒和致癌物质被人体吸收的可能性<WBR><WBR><A href="http://imgcache.qq.com/ac/qzone_v4/b.gif"><IMG src="http://imgcache.qq.com/ac/qzone_v4/b.gif" border=0></A><WBR><IMG src="http://imgcache.qq.com/ac/qzone_v4/b.gif" border=0></P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/96744120084138343511</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/96744120084138343511</guid>
    <pubDate>Tue, 13 May 2008 20:03:43 +0800</pubDate>
    <dcterms:modified>2008-05-13T20:03:43+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[告别东莞，踏上新的征程]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200832925520445</link>
    <description><![CDATA[<div><P>要离开东莞了，来东莞也4年多了，想想离开这里也蛮留恋的，这里有我好多好多的朋友，有亲人。</P>
<P>可惜还是要离开了！</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200832925520445</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200832925520445</guid>
    <pubDate>Tue, 29 Apr 2008 14:55:20 +0800</pubDate>
    <dcterms:modified>2008-04-29T14:55:20+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[心态决定一切]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/96744120083219112436</link>
    <description><![CDATA[<div><P>最近郁闷了一段时间，股票深套，把以前赚的一分不少的还给祖国！为祖国印花税添砖加瓦！房子装修少钱了，车库买不起了一连串的事情让我有点喘不过气来！</P>
<P>希望自己快乐起来，不要再失眠了！能每天睡个好觉！有个好的心情！</P>
<P>当心情好了，相信事情就会顺利起来！</P>
<P>呵呵，啊门！</P>
<P>&nbsp;</P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/96744120083219112436</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/96744120083219112436</guid>
    <pubDate>Mon, 21 Apr 2008 21:01:12 +0800</pubDate>
    <dcterms:modified>2008-04-21T21:01:12+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[如果有意中人的请唱唱这首歌]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/9674412008318113528332</link>
    <description><![CDATA[<div><P>做我老婆好不好<BR><BR>这首歌献给我亲爱的柳柳，我会永远等着你！<BR></P>
<P>走过多少路口&nbsp;&nbsp; 听过多少叹息<BR>我认真着&nbsp; 你的不知所措<BR>这种迷茫心情&nbsp;&nbsp;&nbsp; 我想谁都会有<BR>幸运的是能分担你的愁<BR>能不能靠近一点&nbsp; 能不能再近一点<BR>满足我心中小小的虚荣<BR>其实你并不知道 在我心中你最美<BR>就像风雨过后&nbsp; 天边的那道<BR>彩虹<BR>如果明天的路你不知该往哪儿走<BR>就留在我身边做我老婆&nbsp; 好不好<BR>我不够宽阔的臂膀也会是你的<BR>温暖怀抱<BR>如果你疲倦了外面的 风风雨雨<BR>就留在我身边做我老婆&nbsp; 好不好<BR>我一定会承受你偶尔的小脾气<BR>或许我还&nbsp; 能给你一点意外<BR>一份欢笑&nbsp; 一个简单安心的小窝<BR>陪你日出&nbsp; 陪你日落&nbsp;&nbsp; 到老</P>
<P>&nbsp;</P>
<P>能不能靠近一点 能不能再近一点<BR>满足我心中小小的虚荣<BR>其实你并不知道 在我心中你最美<BR>就像风雨过后&nbsp; 天边的那道<BR>彩虹<BR>如果明天的路你不知该往哪儿走<BR>就留在我身边做我老婆&nbsp; 好不好<BR>我不够宽阔的臂膀也会是你的<BR>温暖怀抱<BR>如果你疲倦了外面的&nbsp; 风风雨雨<BR>就留在我身边做我老婆&nbsp; 好不好<BR>我一定会承受你偶尔的小 脾气<BR>或许我还&nbsp; 能给你一点意外<BR>一份欢笑&nbsp; 一个简单安心的小窝<BR>陪你日出&nbsp; 陪你日落&nbsp;&nbsp; 到老</P>
<P>如果明天的路你不知该往哪儿走<BR>就留在我身边做我老婆&nbsp; 好不好<BR>我不够宽阔的臂膀也会是你的<BR>温暖怀抱<BR>如果你疲倦了外面的&nbsp; 风风雨雨<BR>就留在我身边做我老婆&nbsp; 好不好<BR>我一定会承受你偶尔的小脾气<BR>或许我还&nbsp; 能给你一点意外<BR>一份欢笑&nbsp; 一个简单安心的小窝<BR>陪你日出&nbsp; 陪你日落&nbsp;&nbsp; 到老<BR>END<BR>如果哪天 你玩累了 倦了<BR>回到我身边来 我会陪着你一辈子</P>
<P>&nbsp;</P>
<P>我唱唱先。。。。<BR></P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/9674412008318113528332</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/9674412008318113528332</guid>
    <pubDate>Fri, 18 Apr 2008 11:35:28 +0800</pubDate>
    <dcterms:modified>2008-04-18T11:36:17+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[既然否极会泰来，那么乐极当然会生悲]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/9674412008318113118234</link>
    <description><![CDATA[<div><P>既然否极会泰来，那么乐极当然会生悲，看看我们中国股市，难道真没希望了嘛！？</P>
<P>承载了这么多的希望，就这样昙花一现了！</P>
<P>中国石油破发，大盘跌破3100，呵呵！值得纪念的日子！</P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/9674412008318113118234</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/9674412008318113118234</guid>
    <pubDate>Fri, 18 Apr 2008 11:31:18 +0800</pubDate>
    <dcterms:modified>2008-04-18T11:31:18+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[oracle分页（一）]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200831892759882</link>
    <description><![CDATA[<div><BR>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">分页查询格式：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: 宋体">SELECT * FROM <BR>(<BR>SELECT A.*, ROWNUM RN <BR>FROM (SELECT * FROM TABLE_NAME) A <BR>WHERE ROWNUM &lt;= 40<BR>)<BR>WHERE RN &gt;= 21</SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">其中最内层的查询<SPAN lang=EN-US>SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM &lt;= 40和RN &gt;= 21控制分页查询的每页的范围。</SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">上面给出的这个分页查询语句，在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小，将结果尽快的返回。在上面的分页查询语句中，这种考虑主要体现在<SPAN lang=EN-US>WHERE ROWNUM &lt;= 40这句上。</SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">选择第<SPAN lang=EN-US>21到40条记录存在两种方法，一种是上面例子中展示的在查询的第二层通过ROWNUM &lt;= 40来控制最大值，在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM &lt;= 40语句，在查询的最外层控制分页的最小值和最大值。这是，查询语句如下：</SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: 宋体">SELECT * FROM <BR>(<BR>SELECT A.*, ROWNUM RN <BR>FROM (SELECT * FROM TABLE_NAME) A <BR>)<BR>WHERE RN BETWEEN 21 AND 40</SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">对比这两种写法，绝大多数的情况下，第一个查询的效率比第二个高得多。</SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">这是由于<SPAN lang=EN-US>CBO优化模式下，Oracle可以将外层的查询条件推到内层查询中，以提高内层查询的执行效率。对于第一个查询语句，第二层的查询条件WHERE ROWNUM &lt;= 40就可以被Oracle推入到内层查询中，这样Oracle查询的结果一旦超过了ROWNUM限制条件，就终止查询将结果返回了。</SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">而第二个查询语句，由于查询条件<SPAN lang=EN-US>BETWEEN 21 AND 40是存在于查询的第三层，而Oracle无法将第三层的查询条件推到最内层（即使推到最内层也没有意义，因为最内层查询不知道RN代表什么）。因此，对于第二个查询语句，Oracle最内层返回给中间层的是所有满足条件的数据，而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成，显然这个效率要比第一个查询低得多。</SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">上面分析的查询不仅仅是针对单表的简单查询，对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。</SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">这里就不对包含排序的查询进行说明了，下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询，<SPAN lang=EN-US>CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN（MERGE JOIN效率比HASH JOIN效率低，一般CBO不会考虑）。在这里，由于使用了分页，因此指定了一个返回的最大记录数，NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层，而HASH JOIN必须处理完所有结果集（MERGE JOIN也是）。那么在大部分的情况下，对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率（分页查询的时候绝大部分的情况是查询前几页的数据，越靠后面的页数访问几率越小）。</SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体">因此，如果不介意在系统中使用<SPAN lang=EN-US>HINT的话，可以将分页的查询语句改写为：</SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: 宋体">SELECT /*+ FIRST_ROWS */ * FROM <BR>(<BR>SELECT A.*, ROWNUM RN <BR>FROM (SELECT * FROM TABLE_NAME) A <BR>WHERE ROWNUM &lt;= 40<BR>)<BR>WHERE RN &gt;= 21</SPAN></P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200831892759882</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200831892759882</guid>
    <pubDate>Fri, 18 Apr 2008 09:27:59 +0800</pubDate>
    <dcterms:modified>2008-04-18T09:27:59+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[相信自己，勇往直前]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200831710343918</link>
    <description><![CDATA[<div><P>天行健，君子以自强不息</P>
<P>地势坤，君子以厚德载物</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 长此以往，相信会有更好的明天</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200831710343918</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200831710343918</guid>
    <pubDate>Thu, 17 Apr 2008 10:34:39 +0800</pubDate>
    <dcterms:modified>2008-04-17T10:34:39+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[sql查询两连接字段注意]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/96744120083154591483</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp; 在编写sql查询条件时候，需要两个字段连接条件时候不要用 field1 +field2 =''</P>
<P>这样会做全表扫描相加比较。</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/96744120083154591483</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/96744120083154591483</guid>
    <pubDate>Tue, 15 Apr 2008 16:59:14 +0800</pubDate>
    <dcterms:modified>2008-04-15T16:59:14+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[RMI技术]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/96744120083147409994</link>
    <description><![CDATA[<div><P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，远程方法调用（</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Remote Method Invocation</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Enterprise JavaBeans</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的支柱，是建立分布式</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Java</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">应用程序的方便途径。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">是非常容易使用的，但是它非常的强大。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI主要步骤如下<BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">1</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编写并且编译接口的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Java</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">代码</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(<SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">public interface Calculator extends Remote </SPAN>)继承Remote接口<BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">2</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编写并且编译接口实现的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Java</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">代码</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">接口实现</SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(public class CalculatorImpl extends UnicastRemoteObject implements Calculator )<BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break"></SPAN><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">3</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">从接口实现类中生成</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> Stub </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> Skeleton </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">类文件</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">4</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编写远程服务的主运行程序</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">5</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编写</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的客户端程序</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">6</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">安装并且运行</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">系统</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></SPAN></SPAN>&nbsp;</P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
<P style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　这个实现类使用了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">UnicastRemoteObject</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">去联接</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">系统。在我们的例子中，我们是直接的从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">UnicastRemoteObject</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">这个类上继承的，事实上并不一定要这样做，如果一个类不是从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">UnicastRmeoteObject</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">上继承，那必须使用它的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">exportObject()</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">方法去联接到</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　如果一个类继承自</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">UnicastRemoteObject</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，那么它必须提供一个构造函数并且声明抛出一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">RemoteException</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">对象。当这个构造函数调用了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">super()</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，它久激活</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">UnicastRemoteObject</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">中的代码完成</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的连接和远程对象的初始化。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">3</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">Stubs </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">Skeletons <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　下一步就是要使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编译器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">rmic</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">来生成桩和框架文件，这个编译运行在远程服务实现类文件上。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">&gt;rmic <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>com.ldj.socket.rmi.CalculatorImpl <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　在你的目录下运行上面的命令，成功执行完上面的命令你可以发现一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">Calculator_stub.class</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">文件，如果你是使用的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">Java2SDK</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，那么你还可以发现</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">Calculator_Skel.class</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">文件。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">4</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、主机服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　远程</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">服务必须是在一个服务器中运行的。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">CalculatorServer</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">类是一个非常简单的服务器。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR>package com.ldj.socket.rmi;<BR>//CalculatorServer.java <BR>import java.rmi.Naming; <BR><BR>public class CalculatorServer { <BR><BR>public CalculatorServer() { <BR>try { <BR>Calculator c = new CalculatorImpl(); <BR>Naming.rebind("rmi://localhost:1099/CalculatorService", c); <BR>} catch (Exception e) { <BR>System.out.println("Trouble: " + e); <BR>} <BR>} <BR><BR>public static void main(String args[]) { <BR>new CalculatorServer(); <BR>} <BR>} <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　建立这个服务器程序，然后保存到你的目录下，并且编译它。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'">5</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、客户端</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　客户端源代码如下：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'"> <BR><BR>package com.ldj.socket.rmi;</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">//CalculatorClient.java <BR><BR>import java.rmi.Naming; <BR>import java.rmi.RemoteException; <BR>import java.net.MalformedURLException; <BR>import java.rmi.NotBoundException; <BR><BR>public class CalculatorClient { <BR><BR>public static void main(String[] args) { <BR>try { <BR>Calculator c = (Calculator) <BR>Naming.lookup( <BR>"rmi://localhost <BR>/CalculatorService"); <BR>System.out.println( c.sub(4, 3) ); <BR>System.out.println( c.add(4, 5) ); <BR>System.out.println( c.mul(3, 6) ); <BR>System.out.println( c.div(9, 3) ); <BR>} <BR>catch (MalformedURLException murle) { <BR>System.out.println(); <BR>System.out.println( <BR>"MalformedURLException"); <BR>System.out.println(murle); <BR>} <BR>catch (RemoteException re) { <BR>System.out.println(); <BR>System.out.println( <BR>"RemoteException"); <BR>System.out.println(re); <BR>} <BR>catch (NotBoundException nbe) { <BR>System.out.println(); <BR>System.out.println( <BR>"NotBoundException"); <BR>System.out.println(nbe); <BR>} <BR>catch ( <BR>java.lang.ArithmeticException <BR>ae) { <BR>System.out.println(); <BR>System.out.println( <BR>"java.lang.ArithmeticException"); <BR>System.out.println(ae); <BR>} <BR>} <BR>} <BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　保存这个客户端程序到你的目录下（注意这个目录是一开始建立那个，所有的我们的文件都在那个目录下），并且编译他。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">6</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、运行</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">系统</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　现在我们建立了所有运行这个简单</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">系统所需的文件，现在我们终于可以运行这个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">系统啦！来享受吧。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　我们是在命令控制台下运行这个系统的，你必须开启三个控制台窗口，一个运行服务器，一个运行客户端，还有一个运行</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMIRegistry</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　首先运行注册程序</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMIRegistry</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，你必须在包含你刚写的类的那么目录下运行这个注册程序。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&gt;rmiregistry <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　好，这个命令成功的话，注册程序已经开始运行了，不要管他，现在切换到另外一个控制台，在第二个控制台里，我们运行服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">CalculatorService</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，因为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">RMI</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的安全机制将在服务端发生作用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">所以你必须增加一条安全策略。以下是对应安全策略的例子</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR>grant { <BR>permission java.security.AllPermission "", ""; <BR>}; <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　注意</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">:</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">这是一条最简单的安全策略</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">它允许任何人做任何事</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">对于你的更加关键性的应用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">你必须指定更加详细安全策略。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　现在为了运行服务端，你需要除客户类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(CalculatorClient.class)</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">之外的所有的类文件。确认安全策略在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">policy.txt</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">文件之后</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用如下命令来运行服务器。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&gt; java -Djava.security.policy=policy.txt <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>com.ldj.socket.rmi.CalculatorServer <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　这个服务器就开始工作了，把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台，启动我们的客户端。</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <SPAN lang=EN-US><BR><BR></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　为了在其他的机器运行客户端程序你需要一个远程接口</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(Calculator.class) </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">stub(CalculatorImpl_Stub.class)</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">。</SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> </SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用如下命令运行客户端</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> <BR><BR></SPAN><SPAN style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> &gt; java -Djava.security.policy=policy.txt <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>com.ldj.socket.rmi.CalculatorClient <BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break"></SPAN></P>
<P><BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break"></P></SPAN></SPAN></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/96744120083147409994</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/96744120083147409994</guid>
    <pubDate>Mon, 14 Apr 2008 19:40:09 +0800</pubDate>
    <dcterms:modified>2008-04-14T19:40:09+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[JAVA内部类解析]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/9674412008311103639854</link>
    <description><![CDATA[<div>一、什么是嵌套类及内部类？<BR>&nbsp;&nbsp;&nbsp;&nbsp;可以在一个类的内部定义另一个类，这种类称为嵌套类（nested&nbsp;classes）,它有两种类型:<BR>静态嵌套类和非静态嵌套类。静态嵌套类使用很少，最重要的是非静态嵌套类，也即是被称作为<BR>内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种：<BR>&nbsp;&nbsp;&nbsp;&nbsp;其一、在一个类（外部类）中直接定义的内部类；<BR>&nbsp;&nbsp;&nbsp;&nbsp;其二、在一个方法（外部类的方法）中定义的内部类;<BR>&nbsp;&nbsp;&nbsp;&nbsp;其三、匿名内部类。<BR>下面，我将说明这几种嵌套类的使用及注意事项。<BR>二、静态嵌套类<BR>&nbsp;&nbsp;&nbsp;&nbsp;如下所示代码为定义一个静态嵌套类，<BR><BR>public&nbsp;class&nbsp;StaticTest&nbsp;{<BR>private&nbsp;static&nbsp;String&nbsp;name&nbsp;=&nbsp;"javaJohn";<BR>private&nbsp;String&nbsp;id&nbsp;=&nbsp;"X001";<BR><BR>static&nbsp;class&nbsp;Person{<BR>private&nbsp;String&nbsp;address&nbsp;=&nbsp;"swjtu,chenDu,China";<BR>public&nbsp;String&nbsp;mail&nbsp;=&nbsp;"josserchai@yahoo.com";//内部类公有成员<BR>public&nbsp;void&nbsp;display(){<BR>//System.out.println(id);//不能直接访问外部类的非静态成员<BR>System.out.println(name);//只能直接访问外部类的静态成员<BR>System.out.println("Inner&nbsp;"+address);//访问本内部类成员。<BR>}<BR>}<BR><BR>public&nbsp;void&nbsp;printInfo(){<BR>Person&nbsp;person&nbsp;=&nbsp;new&nbsp;Person();<BR>person.display();<BR><BR>//System.out.println(mail);//不可访问<BR>//System.out.println(address);//不可访问<BR><BR>System.out.println(person.address);//可以访问内部类的私有成员<BR>System.out.println(person.mail);//可以访问内部类的公有成员<BR><BR>}<BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>StaticTest&nbsp;staticTest&nbsp;=&nbsp;new&nbsp;StaticTest();<BR>staticTest.printInfo();<BR>}<BR>}<BR>在静态嵌套类内部，不能访问外部类的非静态成员，这是由Java语法中"静态方法不能直接访问非静态成员"所限定。<BR>若想访问外部类的变量，必须通过其它方法解决，由于这个原因，静态嵌套类使用很少。注意，外部类访问内<BR>部类的的成员有些特别，不能直接访问，但可以通过内部类来访问，这是因为静态嵌套内的所有成员和方法默认为<BR>静态的了。同时注意，内部静态类Person只在类StaticTest&nbsp;范围内可见，若在其它类中引用或初始化，均是错误的。<BR>三、在外部类中定义内部类<BR>&nbsp;&nbsp;&nbsp;&nbsp;如下所示代码为在外部类中定义两个内部类及它们的调用关系：<BR><BR>public&nbsp;class&nbsp;Outer{<BR>int&nbsp;outer_x&nbsp;=&nbsp;100;<BR><BR>class&nbsp;Inner{<BR>public&nbsp;int&nbsp;y&nbsp;=&nbsp;10;<BR>private&nbsp;int&nbsp;z&nbsp;=&nbsp;9;<BR>int&nbsp;m&nbsp;=&nbsp;5;<BR>public&nbsp;void&nbsp;display(){<BR>System.out.println("display&nbsp;outer_x:"+&nbsp;outer_x);<BR>}<BR>private&nbsp;void&nbsp;display2(){<BR>System.out.println("display&nbsp;outer_x:"+&nbsp;outer_x);<BR>}<BR><BR>}<BR><BR>void&nbsp;test(){<BR>Inner&nbsp;inner&nbsp;=&nbsp;new&nbsp;Inner();<BR>inner.display();<BR>inner.display2();<BR>//System.out.println("Inner&nbsp;y:"&nbsp;+&nbsp;y);//不能访问内部内变量<BR>System.out.println("Inner&nbsp;y:"&nbsp;+&nbsp;inner.y);//可以访问<BR>System.out.println("Inner&nbsp;z:"&nbsp;+&nbsp;inner.z);//可以访问<BR>System.out.println("Inner&nbsp;m:"&nbsp;+&nbsp;inner.m);//可以访问<BR><BR>InnerTwo&nbsp;innerTwo&nbsp;=&nbsp;new&nbsp;InnerTwo();<BR>innerTwo.show();<BR>}<BR><BR>class&nbsp;InnerTwo{<BR>Inner&nbsp;innerx&nbsp;=&nbsp;new&nbsp;Inner();<BR>public&nbsp;void&nbsp;show(){<BR>//System.out.println(y);//不可访问Innter的y成员<BR>//System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法<BR>innerx.display();//可以访问<BR>innerx.display2();//可以访问<BR>System.out.println(innerx.y);//可以访问<BR>System.out.println(innerx.z);//可以访问<BR>System.out.println(innerx.m);//可以访问<BR>}<BR>}<BR><BR>public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[]){<BR>Outer&nbsp;outer&nbsp;=&nbsp;new&nbsp;Outer();<BR>outer.test();<BR>}<BR>}<BR>以上代码需要说明有，对于内部类，通常在定义类的class关键字前不加public&nbsp;或&nbsp;private等限制符，若加了<BR>没有任何影响，同时好像这些限定符对内部类的变量和方法也没有影响(?)。另外，就是要注意，内部类Inner及<BR>InnterTwo只在类Outer的作用域内是可知的，如果类Outer外的任何代码尝试初始化类Inner或使用它，编译就不<BR>会通过。同时，内部类的变量成员只在内部内内部可见，若外部类或同层次的内部类需要访问，需采用示例程序<BR>中的方法，不可直接访问内部类的变量。<BR><BR>四、在方法中定义内部类<BR>&nbsp;&nbsp;&nbsp;&nbsp;如下所示代码为在方法内部定义一个内部类:<BR><BR>public&nbsp;class&nbsp;FunOuter&nbsp;{<BR>int&nbsp;out_x&nbsp;=&nbsp;100;<BR><BR>public&nbsp;void&nbsp;test(){<BR>class&nbsp;Inner{<BR>String&nbsp;x&nbsp;=&nbsp;"x";<BR>void&nbsp;display(){<BR>System.out.println(out_x);<BR>}<BR>}<BR>Inner&nbsp;inner&nbsp;=&nbsp;new&nbsp;Inner();<BR>inner.display();<BR>}<BR><BR>public&nbsp;void&nbsp;showStr(String&nbsp;str){<BR>//public&nbsp;String&nbsp;str1&nbsp;=&nbsp;"test&nbsp;Inner";//不可定义，只允许final修饰<BR>//static&nbsp;String&nbsp;str4&nbsp;=&nbsp;"static&nbsp;Str";//不可定义，只允许final修饰<BR>String&nbsp;str2&nbsp;=&nbsp;"test&nbsp;Inner";<BR>final&nbsp;String&nbsp;str3&nbsp;=&nbsp;"final&nbsp;Str";<BR>class&nbsp;InnerTwo{<BR>public&nbsp;void&nbsp;testPrint(){<BR>System.out.println(out_x);//可直接访问外部类的变量<BR>//System.out.println(str);//不可访问本方法内部的非final变量<BR>//System.out.println(str2);//不可访问本方法内部的非final变量<BR>System.out.println(str3);//只可访问本方法的final型变量成员<BR>}<BR>}<BR>InnerTwo&nbsp;innerTwo&nbsp;=&nbsp;new&nbsp;InnerTwo();<BR>innerTwo.testPrint();<BR>}<BR><BR>public&nbsp;void&nbsp;use(){<BR>//Inner&nbsp;innerObj&nbsp;=&nbsp;new&nbsp;Inner();//此时Inner己不可见了。<BR>//System.out.println(Inner.x);//此时Inner己不可见了。<BR>}<BR><BR><BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>FunOuter&nbsp;outer&nbsp;=&nbsp;new&nbsp;FunOuter();<BR>outer.test();<BR>}<BR>}<BR><BR>从上面的例程我们可以看出定义在方法内部的内部类的可见性更小，它只在方法内部<BR>可见，在外部类(及外部类的其它方法中)中都不可见了。同时，它有一个特点，就是方法<BR>内的内部类连本方法的成员变量都不可访问，它只能访问本方法的final型成员。同时另一个<BR>需引起注意的是方法内部定义成员，只允许final修饰或不加修饰符，其它像static等均不可用。<BR>五、匿名内部类<BR>&nbsp;&nbsp;&nbsp;&nbsp;如下所示代码为定义一个匿名内部类:匿名内部类通常用在Java的事件处理上<BR><BR><BR>import&nbsp;java.applet.*;<BR>import&nbsp;java.awt.event.*;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;AnonymousInnerClassDemo&nbsp;extends&nbsp;Applet{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;init(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseListener(new&nbsp;MouseAdapter(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;mousePressed(MouseEvent&nbsp;me){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showStatus("Mouse&nbsp;Pressed!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;showStatus(String&nbsp;str){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>在上面的例子中，方法addMouseListener接受一个对象型的参数表达式，于是，在参数里，我们定义了一个匿名内部类这个类是一个MouseAdapter类型的类，同时在这个类中定义了一个继承的方法mousePressed，整个类做为一个参数。这个类没有名称，但是当执行这个表达式时它被自动实例化。同时因为，这个匿名内部类是定义在AnonymousInnerClassDemo&nbsp;类内部的，所以它可以访问它的方法showStatus。这同前面的内部类是一致的。<BR>六、内部类使用的其它的问题<BR><BR>通过以上，我们可以清楚地看出内部类的一些使用方法，同时，在许多时候，内部类是在如Java的事件处理、或做为值对象来使用的。同时，我们需注意最后一个问题，那就是，内部类同其它类一样被定义，同样它也可以继承外部其它包的类和实现外部其它地方的接口。同样它也可以继承同一层次的其它的内部类,甚至可以继承外部类本身。下面我们给出最后一个例子做为结束：<BR><BR><BR><BR>public&nbsp;class&nbsp;Layer&nbsp;{<BR>//Layer类的成员变量<BR>private&nbsp;String&nbsp;testStr&nbsp;=&nbsp;"testStr";<BR><BR>//Person类，基类<BR>class&nbsp;Person{<BR>String&nbsp;name;<BR>Email&nbsp;email;<BR>public&nbsp;void&nbsp;setName(String&nbsp;nameStr){<BR>this.name&nbsp;=&nbsp;nameStr;<BR>}<BR>public&nbsp;String&nbsp;getName(){<BR>return&nbsp;this.name;<BR>}<BR>public&nbsp;void&nbsp;setEmail(Email&nbsp;emailObj){<BR><BR>this.email&nbsp;=&nbsp;emailObj;<BR>}<BR>public&nbsp;String&nbsp;getEmail(){<BR>return&nbsp;this.email.getMailStr();<BR>}<BR>//内部类的内部类，多层内部类<BR>class&nbsp;Email{<BR>String&nbsp;mailID;<BR>String&nbsp;mailNetAddress;<BR>Email(String&nbsp;mailId,String&nbsp;mailNetAddress){<BR>this.mailID&nbsp;=&nbsp;mailId;<BR>this.mailNetAddress&nbsp;=&nbsp;mailNetAddress;<BR>}<BR>String&nbsp;getMailStr(){<BR>return&nbsp;this.mailID&nbsp;+"@"+this.mailNetAddress;<BR>}<BR>}<BR>}<BR>//另一个内部类继承外部类本身<BR>class&nbsp;ChildLayer&nbsp;extends&nbsp;Layer{<BR>void&nbsp;print(){<BR>System.out.println(super.testStr);//访问父类的成员变量<BR>}<BR>}<BR>//另个内部类继承内部类Person<BR>class&nbsp;OfficePerson&nbsp;extends&nbsp;Person{<BR>void&nbsp;show(){<BR>System.out.println(name);<BR>System.out.println(getEmail());<BR>}<BR>}<BR>//外部类的测试方法<BR>public&nbsp;void&nbsp;testFunction(){<BR>//测试第一个内部类<BR>ChildLayer&nbsp;childLayer&nbsp;=&nbsp;new&nbsp;ChildLayer();<BR>childLayer.print();<BR><BR>//测试第二个内部类<BR>OfficePerson&nbsp;officePerson&nbsp;=&nbsp;new&nbsp;OfficePerson();<BR>officePerson.setName("abner&nbsp;chai");<BR>//注意此处，必须用&nbsp;对象.new&nbsp;出来对象的子类对象<BR>//而不是Person.new&nbsp;Email(...)<BR>//也不是new&nbsp;Person.Email(...)<BR>officePerson.setEmail(officePerson.new&nbsp;Email("josserchai","yahoo.com"));<BR><BR>officePerson.show();<BR>}<BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>Layer&nbsp;layer&nbsp;=&nbsp;new&nbsp;Layer();<BR>layer.testFunction();<BR>}<BR>}<BR></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/9674412008311103639854</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/9674412008311103639854</guid>
    <pubDate>Fri, 11 Apr 2008 10:36:39 +0800</pubDate>
    <dcterms:modified>2008-04-11T10:36:39+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[祖国怪事怪人真多--城管警察]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/9674412008310934972</link>
    <description><![CDATA[<div><TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
<TBODY>
<TR>
<TD height=56>
<P><FONT color=#000066>首先来个名词解释：在百度上的字典里：</FONT></P>
<BLOCKQUOTE>城管 发音：cheng guan 释义：名词。<BR>虽然经常会爆出有城管打人等事件，但是，却不能以偏概全，相信绝大多数城管是比较文明的，比较有道德，有修养，有素质，为维护城市健康文明地发展不可或缺的相关服务人员。<BR>绝对临时工词目：城管<BR>　　发音：cheng guan<BR>　　释义：<BR>　　① 名词：以暴力手段维持××形象，专门欺压租不起商铺、办不起执照商贩以及其他弱势群体的黑社会组织。例句：城管上道，鸡飞狗跳。<BR>　　② 形容词：形容残暴、血腥、恐怖。例句：你也太城管了！<BR>　　③ 动词：等同于打、砸、抢。例句：他不老实就城管他一下！<BR>　　④ 叹词：无奈之意。例句：这世道，城管！<BR>　　⑤ 代名词。例句： 关门，放城管 </BLOCKQUOTE></TD></TR>
<TR>
<TD align=middle><SPAN ><FONT size=2>出自 2008年04月10日 08:27 来源：燕赵都市报</FONT></SPAN></TD></TR></TBODY></TABLE><FONT size=2>
</FONT><HR align=center width="90%" noShade SIZE=1>

<TABLE cellSpacing=0 cellPadding=0 width="85%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<P align=center><FONT size=2></FONT>&nbsp;</P></DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><FONT style="FONT-SIZE: 16px; LINE-HEIGHT: 150%">
<P><FONT size=2></FONT>
</P><P>　　"城管警察"就是要赋予城管以警察的权力和地位，以减少暴力抗法的可能。而事实上呢，城管之所以经常遭遇暴力抗法，原因根本不在于城管还不够强势，而在于包括小商小贩在内的所有人都需要一个生存的机会，而城管所欲营造的美好城市环境恰恰砸碎了他们的饭碗。 </P>
<P>　　深圳市政协委员杨立勋提出《关于组建深圳市城管警察的建议》的提案，建议整合现有巡警队伍和城管执法队伍，在市公安局组建副局级城管警察支队，该支队实行公安、城管双重领导，将现有巡警、城管执法队员编入城管警察队伍。杨立勋认为，组建城管警察，可更好防止暴力抗法，同时也可提高执法效率。(4月9日《南方都市报》)</P>
<P>　　“城管警察”听上去真的很别扭———警察是一顶大盖帽，城管是另一顶大盖帽，两顶大盖帽重叠到一起，那该是一顶怎样的大盖帽？或许应该这样来理解“城管警察”———让城管戴上警察的帽子来履行城管的职能。显然，城管戴什么帽子对于缓解日益严重的“城管执法困局”并无助益，其改革意义很难体现于执法相对人的利益维护，而只能体现于城管自身的权力升级。</P>
<P>　　首先，让城管戴上警察帽子，将使城管身份实现真正合法化。长期以来，关于城管是否具有合法性的争议颇多，虽然“城管”是每个地方都有的“执法机构”，但没有任何一部国家法规给过它明确的“准生证”，它并不具备任何一部法律的执法主体资格。城管执法唯一的合法性来源，就是作为一个“依法成立的管理公共事务的事业组织”接受其他行政机关的执法权委托。而一旦城管戴上警察的帽子，无异于获得了法定的执法资格。</P>
<P>　　其次，让城管戴上警察帽子，还是一种明显的扩权行为。此后，城管的执法工具和执法手段将更加完备，面对暴力抗法再也无需求助110了，掏出手铐就可以将不服管理的小贩扣上，甚至于还可以潇洒地掏出手枪鸣枪示警。</P>
<P>　　问题在于，既然城管的职能都交给警察来行使了，那还要城管干什么？所谓“城管警察”岂不是纯属多余？“从国内国外来看，城管队伍向警察转型都是一种趋势”，这其实完全是一种“人造”的虚假趋势，因为人家国外根本就不存在城管组织，而一直就是由警察来行使城市管理执法职能的。因此，“城管警察”的提法实际只能自证城管组织的多余性———原来纳税人一直花钱供养着一个原本可以省略的组织。</P>
<P>　　确实，在纽约、伦敦、巴黎、东京、新加坡、香港、首尔等世界先进城市，既没有城管局，也没有城管执法队，城市管理执法统一由警察行使。但我相信，这些警察绝不是由城管“进化”来的，因此“城管警察”完全是一个多余的概念。如果我们真要学习这些地方，那么正确的做法应该是剥离城管职能交由警察行使并取缔现有城管组织，而不是给城管换一顶警察帽子并让他们继续原来的“执法风格”———这种换汤不换药的形式主义毫无意义。</P>
<P>　　归根到底，“城管警察”就是要赋予城管以警察的权力和地位，目的旨在让他们在面对弱势摊贩时更加强势，以减少暴力抗法的可能。而事实上呢，城管之所以经常遭遇暴力抗法，城管之所以留给公众的社会形象非常不好，原因根本不在于城管还不够强势———不，动辄“打、砸、抢”的城管权力已经够强势了———而在于包括小商小贩在内的所有人都需要一个生存的机会，而城管所欲营造的美好城市环境恰恰砸碎了他们的饭碗。常识告诉我们，人总是要吃饭的，生存的欲望不会因执法者的更加强势而萎缩，别说让城管戴上警察帽子不管用，就是给城管配上更强大的武器也白搭。(舒圣祥) </P></FONT></TD></TR></TBODY></TABLE></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/9674412008310934972</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/9674412008310934972</guid>
    <pubDate>Thu, 10 Apr 2008 09:03:04 +0800</pubDate>
    <dcterms:modified>2008-04-10T09:03:04+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[人生就是如此]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/96744120083252033678</link>
    <description><![CDATA[<div>呵呵，人生就是如此！</div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/96744120083252033678</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/96744120083252033678</guid>
    <pubDate>Wed, 2 Apr 2008 17:20:33 +0800</pubDate>
    <dcterms:modified>2008-04-02T17:20:33+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[烦躁的2008年一切都那么不如意]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200822922551591</link>
    <description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传说中吉祥之年--2008年对我来讲那么多不顺呢！&nbsp;工作，生活，爱情！那么多不如意！唉！&nbsp; </div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200822922551591</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200822922551591</guid>
    <pubDate>Sat, 29 Mar 2008 14:25:51 +0800</pubDate>
    <dcterms:modified>2008-03-29T14:25:51+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[tomcat性能调整]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200822710846148</link>
    <description><![CDATA[<div><STRONG>一.&nbsp;引言<BR></STRONG>性能测试与分析是软件开发过程中介于架构和调整的一个广泛并比较不容易理解的领域，更是一项较为复杂的活动。就像下棋游戏一样，有效的性能测试和分析只能在一个良好的计划策略和具备了对不可预料事件的处理能力的条件下顺利地完成。一个下棋高手赢得比赛靠的不仅仅是对游戏规则的认识，更是靠他的自己的能力和不断地专注于分析自己对手的实力来更加有效地利用和发挥规则的作用。同样一个优秀的性能测试和分析人员将要面对的是来自一个全新的应用程序和环境下带来的整个项目的挑战。本文中作者结合自己的使用经验和参考文档，对Tomcat性能方面的调整做一简要的介绍，并给出Tomcat性能的测试、分析和调整优化的一些方法。<BR><BR><STRONG>二.&nbsp;测量Web服务器的性能</STRONG><BR>测量web服务器的性能是一项让人感到畏缩的任务，但是我们在这里将给出一些需要注意的地方并且指点你了解其中更多的细节性的内容。它不像一些简单的任务，如测量CPU的速率或者是测量程序占用CPU的比例，web服务器的性能优化中包括许调整许多变量来达到目标。许多的测量策略中都包含了一个看似简单的浏览实际上是在向服务器发送大量的请求，我们称之为客户端的程序，来测量响应时间。客户端和服务器端是在同一台机器上吗？服务器在测试的时候还运行着其它的什么程序吗？客户端和服务器端的通讯是通过局域网，100baseT，10baseT还是使用调制解调器？客户端是否一直重复请求相同的页面，还是随机地访问不同的页面？（这些影响到了服务缓存的性能）客户端发送请求的有规律的还是突发的？你是在最终的配置环境下运行服务的还是在调试的配置环境下运行服务的？客户端请求中包含图片还是只有HTML页面？是否有请求是通过servlets和JSP的，CGI程序，服务端包含（Server-Side&nbsp;Includes&nbsp;，SSI是一个可以让你使用动态HTML文件的技术）？所有这些都将是我们要关心的，并且几乎我们不可能精确地把所有的问题都清楚地列出来。<BR><BR><STRONG>1</STRONG>.压力测试工具<BR><BR>“工欲善其事，必先利其器”，压力测试只有借助于一些工具才可得以实施。<BR><BR>大多数web压力测试工具的实现原理都是通过重复的大量的页面请求来模拟多用户对被测系统的并发访问，以此达到产生压力的目的。产生压力的手段都是通过录制或者是编写压力脚本，这些脚本以多个进程或者线程的形式在客户端运行，这样通过人为制造各种类型的压力，我们可以观察被测系统在各种压力状况下的表现，从而定位系统瓶颈，作为系统调优的基础。目前已经存在的性能测试工具林林总总，数量不下一百种，从单一的开放源码的免费小工具如&nbsp;Aapache&nbsp;自带的&nbsp;web&nbsp;性能测试工具&nbsp;Apache&nbsp;Benchmark、开源的Jmeter&nbsp;到大而全的商业性能测试软件如&nbsp;Mercury&nbsp;的&nbsp;LoadRunner&nbsp;等等。任何性能测试工具都有其优缺点，我们可以根据实际情况挑选用最合适的工具。您可以在这里找到一些web压力测试工具http://www.softwareqatest.com/qatweb1.html#LOAD<BR><BR>这里我们所使用的工具要支持web应用服务认证才可以，要支持接收发送cookies，不仅如此Tomcat支持多种认证方式，比如基本认证、基于表单的认证、相互认证和客户端认证，而一些工具仅仅支持HTTP基本认证。真实地模拟用户认证是性能测试工具的一个重要的部分，因为认证机制将对一个web站点的性能特征产生重要的影响。基于你在产品中使用的不同的认证方式，你需要从上面的工具列表中选择使用这种特性的测试工具。<BR><BR>Apache&nbsp;Benchmark和http_load是命令行形式的工具，非常易于使用。Apache&nbsp;Benchmark可以模仿单独的URL请求并且重复地执行，可以使用不同的命令行参数来控制执行迭代的次数，并发用户数等等。它的一个特点是可以周期性地打印出处理过程的信息，而其它工具只能给出一个全局的报告。<BR><BR><STRONG>2</STRONG>.压力测试工具介绍<BR><BR><STRONG>三.&nbsp;外部环境的调整</STRONG><BR>在Tomcat和应用程序进行了压力测试后，如果您对应用程序的性能结果不太满意，就可以采取一些性能调整措施了，当然了前提是应用程序没有问题，我们这里只讲Tomcat的调整。由于Tomcat的运行依赖于JVM，所以在这里我们把Tomcat的调整可以分为两类来详细描述：<BR><BR>　　外部环境调整&nbsp;<BR><BR>　　调整非Tomcat组件，例如Tomcat运行的操作系统和运行Tomcat的java虚拟机。<BR><BR>　　自身调整&nbsp;<BR><BR>　　修改Tomcat自身的参数，调整Tomcat配置文件中的参数。<BR><BR>　　下面我们将详细讲解外部环境调整的有关内容，Tomcat自身调整的内容将在第2部分中阐述。1.JAVA虚拟机性能优化<BR><BR>　　Tomcat本身不能直接在计算机上运行，需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本（只要是符合Sun发布的Java规范的），但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的，因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。<BR><BR>　　可以给Java虚拟机设置使用的内存，但是如果你的选择不对的话，虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。<BR>参数<BR>&nbsp;描述<BR>&nbsp;<BR>-Xms&lt;size&gt;<BR>&nbsp;JVM初始化堆的大小<BR>&nbsp;<BR>-Xmx&lt;size&gt;<BR>&nbsp;JVM堆的最大值<BR>&nbsp;<BR><BR><BR>　　这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，虚拟机就必须重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出，并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。<BR><BR>　　Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。<BR><BR>　　Windows下，在文件{tomcat_home}/bin/catalina.bat，Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：<BR><BR>　　JAVA_OPTS='-Xms【初始化内存大小】&nbsp;-Xmx【可以使用的最大内存】'<BR><BR>　　需要把这个两个参数值调大。例如：<BR><BR>　　JAVA_OPTS='-Xms256m&nbsp;-Xmx512m'<BR><BR>　　表示初始化内存为256MB，可以使用的最大内存为512MB。<BR><BR>　　另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关，应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大，那么完全垃圾收集就会很慢，但是频度会降低。如果你把堆的大小和内存的需要一致，完全收集就很快，但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间，以在特定的时间内最大化处理客户的请求。在基准测试的时候，为保证最好的性能，要把堆的大小设大，保证垃圾收集不在整个基准测试的过程中出现。<BR><BR>　　如果系统花费很多的时间收集垃圾，请减小堆大小。一次完全的垃圾收集应该不超过&nbsp;3-5&nbsp;秒。如果垃圾收集成为瓶颈，那么需要指定代的大小，检查垃圾收集的详细输出，研究&nbsp;垃圾收集参数对性能的影响。一般说来，你应该使用物理内存的&nbsp;80%&nbsp;作为堆大小。当增加处理器时，记得增加内存，因为分配可以并行进行，而垃圾收集不是并行的。<BR><BR>2.操作系统性能优化<BR><BR>　　这里说的操作系统是指运行web服务器的系统软件，当然，不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的，因此在它的内核中有许多的限制来防止不同形式的服务攻击（OpenBSD的一句座右铭是“默认是最安全的”）。这些限制或许更多地用来运行活跃的web服务器。<BR><BR>　　而我们常用的Linux操作系统的目标是易用使用，因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核，表明所有的驱动器都静态地与之相连。这样就使系统易于使用，但是如果你要创建一个自定义的内核来加强其中某些限制，那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之，内存现在变得越来越便宜，所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存，并且在服务器上腾出更多的可用内存。<BR><BR>　　小提示：虽然现在内存已经相当的便宜，但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点，但是从可靠性上来说，性价比会更高一些。<BR><BR>　　如果是在Windows操作系统上使用Tomcat，那么最好选择服务器版本。因为在非服务器版本上，最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑，必须经常给操作系统打上最新的补丁。<BR><BR>　　3.Tomcat与其它web服务器整合使用<BR><BR>　　虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来，将html与jsp的功能部分进行明确分工，让tomcat只处理jsp部分，其它的由apache,IIS等这些web服务器处理，由此大大节省了tomcat有限的工作“线程”。<BR><BR>　　4.负载均衡<BR><BR>　　在负载均衡的思路下，多台服务器为对称方式，每台服务器都具有同等的地位，可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术，将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上，而接收到请求的服务器都独立回应客户机的请求。<BR><BR>　　提供服务的一组服务器组成了一个应用服务器集群(cluster)，并对外提供一个统一的地址。当一个服务请求被发至该集群时，根据一定规则选择一台服务器，并将服务转定向给该服务器承担，即将负载进行均衡分摊。<BR><BR>　　通过应用负载均衡技术，使应用服务超过了一台服务器只能为有限用户提供服务的限制，可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时，负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器，而由其他工作正常的服务器继续提供服务，从而保证了服务的可靠性。<BR><BR>　　负载均衡实现的方式大概有四种：第一是通过DNS，但只能实现简单的轮流分配，不能处理故障，第二如果是基于MS&nbsp;IIS，Windows&nbsp;2003&nbsp;server本身就带了负载均衡服务，第三是硬件方式，通过交换机的功能或专门的负载均衡设备可以实现，第四种是软件方式，通过一台负载均衡服务器进行，上面安装软件。使用Apache&nbsp;Httpd&nbsp;Server做负载平衡器，Tomcat集群节点使用Tomcat就可以做到以上第四种方式。这种方式比较灵活，成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。&nbsp;<BR><BR><STRONG>四.&nbsp;自身调整</STRONG><BR>本节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和方法，无论是在什么操作系统或者何种Java虚拟机上。在有些情况下，您可能没有控制部署环境上的操作系统或者Java虚拟机。在这种情况下，您就需要逐行了解以下的的一些建议，然而你应该在修改后使之生效。我认为以下方法是Tomcat性能自身调整的最佳方式。<BR><BR>　　1.禁用DNS查询<BR><BR>　　当web应用程序向要记录客户端的信息时，它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络，并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程，这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询，方式是修改server.xml文件中的enableLookups参数值：<BR><BR><BR>Tomcat4<BR><BR>&lt;Connector&nbsp;className="org.apache.coyote.tomcat4.CoyoteConnector"&nbsp;port="80"&nbsp;minProcessors="5"&nbsp;maxProcessors="75"&nbsp;enableLookups="false"&nbsp;redirectPort="8443"&nbsp;acceptCount="100"&nbsp;debug="0"&nbsp;connectionTimeout="20000"&nbsp;useURIValidationHack="false"&nbsp;disableUploadTimeout="true"&nbsp;/&gt;<BR><BR>Tomcat5<BR><BR>&lt;Connector&nbsp;port="80"&nbsp;maxThreads="150"&nbsp;minSpareThreads="25"&nbsp;maxSpareThreads="75"&nbsp;enableLookups="false"&nbsp;redirectPort="8443"&nbsp;acceptCount="100"&nbsp;debug="0"&nbsp;connectionTimeout="20000"&nbsp;disableUploadTimeout="true"/&gt;<BR><BR><BR>　　除非你需要连接到站点的每个HTTP客户端的机器名，否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存，而且更小的流量会使日志数据也会变得更少，显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显，但是此举仍不失为一良策。谁又见到一个低流量的网站一夜之间就流量大增呢？<BR><BR>　　2.调整线程数<BR><BR>　　另外一个可通过应用程序的连接器（Connector）进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径，是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序，使空闲时间保持最低，从而接受更多的请求。<BR><BR>　　Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的，但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说，如果一天内每秒仅发生5次单击事件，并且每个请求任务处理需要1秒钟，那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数，指定为参数maxProcessors的值。maxProcessors的值也是有上限的，应防止流量不可控制（或者恶意的服务攻击），从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数，应同时加大这两个参数。web&nbsp;server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。<BR><BR>　　在Tomcat5对这些参数进行了调整，请看下表：<BR>属性名<BR>&nbsp;描述<BR>&nbsp;<BR>maxThreads<BR>&nbsp;Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。<BR>&nbsp;<BR>acceptCount&nbsp;<BR>&nbsp;指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理。<BR>&nbsp;<BR>connnectionTimeout&nbsp;<BR>&nbsp;网络连接超时，单位：毫秒。设置为0表示永不超时，这样设置有隐患的。通常可设置为30000毫秒。<BR>&nbsp;<BR>minSpareThreads&nbsp;<BR>&nbsp;Tomcat初始化时创建的线程数。<BR>&nbsp;<BR>maxSpareThreads&nbsp;<BR>&nbsp;一旦创建的线程超过这个值，Tomcat就会关闭不再需要的socket线程。<BR>&nbsp;<BR><BR><BR>　　最好的方式是多设置几次并且进行测试，观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同，而且并不是所有人的web站点的流量都是一样的，因此没有一刀切的方案来确定线程数的值。<BR><BR><BR>3.加速JSP编译速度<BR><BR>　　当第一次访问一个JSP文件时，它会被转换为Java&nbsp;serverlet源码，接着被编译成Java字节码。你可以控制使用哪个编译器，默认情况下，Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器，但是这里我们将介绍如何优化它们。<BR><BR>　　另外一种方法是不要把所有的实现都使用JSP页面，而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定，但是事实证明至少这种方法是只得研究的。如果你想了解更多有关在Tomcat可使用的模板语言，你可以参考Jason&nbsp;Hunter和William&nbsp;Crawford合著的《Java&nbsp;Servlet&nbsp;Programming&nbsp;》一书（O'Reilly公司出版）。<BR><BR>　　在Tomcat&nbsp;4.0中可以使用流行而且免费的Jikes编译器。Jikes编译器的速度要由于Sun的Java编译器。首先要安装Jikes（可访问http://oss.software.ibm.com/pub/jikes&nbsp;获得更多的信息），接着需要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes以后还需要设置让JSP编译servlet使用Jikes，需要修改web.xml文件中jspCompilerPlugin的值：<BR><BR><BR>&lt;servlet&gt;<BR>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<BR>&lt;servlet-class&gt;<BR>org.apache.jasper.servlet.JspServlet<BR>&lt;/servlet-class&gt;&lt;init-param&gt;<BR>&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<BR>&lt;param-value&gt;WARNING&lt;/param-value&gt;<BR>&lt;/init-param&gt;<BR>&lt;init-param&gt;<BR>&lt;param-name&gt;jspCompilerPlugin&lt;/param-name&gt;<BR>&lt;param-value&gt;<BR>org.apache.jasper.compiler.JikesJavaCompiler<BR>&lt;/param-value&gt;<BR>&lt;/init-param&gt;<BR>&lt;init-param&gt;<BR>&lt;!--&nbsp;&lt;param-name&gt;<BR>org.apache.catalina.jsp_classpath<BR>&lt;/param-name&gt;&nbsp;--&gt;<BR>&lt;param-name&gt;classpath&lt;/param-name&gt;<BR>&lt;param-value&gt;<BR>/usr/local/jdk1.3.1-linux/jre/lib/rt.jar:<BR>/usr/local/lib/java/servletapi/servlet.ja<BR>r&lt;/param-value&gt;<BR>&lt;/init-param&gt;<BR>&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<BR>&lt;/servlet&gt;<BR><BR><BR>　　在Tomcat&nbsp;4.1（或更高版本），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache&nbsp;Ant使用手册的javac&nbsp;page列表。使用起来是容易的，因为你只需要在&nbsp;元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<BR><BR><BR>&lt;servlet&gt;<BR>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<BR>&lt;servlet-class&gt;<BR>org.apache.jasper.servlet.JspServlet<BR>&lt;/servlet-class&gt;<BR>&lt;init-param&gt;<BR>&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<BR>&lt;param-value&gt;WARNING&lt;/param-value&gt;<BR>&lt;/init-param&gt;<BR>&lt;init-param&gt;<BR>&lt;param-name&gt;compiler&lt;/param-name&gt;<BR>&lt;param-value&gt;jikes&lt;/param-value&gt;<BR>&lt;/init-param&gt;<BR>&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<BR>&lt;/servlet&gt;<BR><BR><BR><BR>Ant可用的编译器<BR>名称<BR>&nbsp;别名<BR>&nbsp;调用的编译器<BR>&nbsp;<BR>classic&nbsp;<BR>&nbsp;javac1.1,&nbsp;javac1.2&nbsp;<BR>&nbsp;Standard&nbsp;JDK&nbsp;1.1/1.2&nbsp;compiler&nbsp;<BR>&nbsp;<BR>modern&nbsp;<BR>&nbsp;javac1.3,&nbsp;javac1.4&nbsp;<BR>&nbsp;Standard&nbsp;JDK&nbsp;1.3/1.4&nbsp;compiler&nbsp;<BR>&nbsp;<BR>jikes&nbsp;<BR>&nbsp;　　&nbsp;The&nbsp;Jikes&nbsp;compiler&nbsp;<BR>&nbsp;<BR>JVC&nbsp;Microsoft&nbsp;<BR>&nbsp;Microsoft&nbsp;command-line&nbsp;compiler&nbsp;from&nbsp;the&nbsp;Microsoft&nbsp;SDK&nbsp;for&nbsp;Java/Visual&nbsp;J++&nbsp;<BR>&nbsp;<BR>KJC&nbsp;　　&nbsp;The&nbsp;kopi&nbsp;compiler&nbsp;<BR>&nbsp;<BR>GCJ&nbsp;　　&nbsp;The&nbsp;gcj&nbsp;compiler&nbsp;(included&nbsp;as&nbsp;part&nbsp;of&nbsp;gcc)&nbsp;<BR>&nbsp;<BR>SJ&nbsp;Symantec&nbsp;<BR>&nbsp;Symantec's&nbsp;Java&nbsp;compiler&nbsp;<BR>&nbsp;<BR>extJavac<BR>&nbsp;　　&nbsp;Runs&nbsp;either&nbsp;the&nbsp;modern&nbsp;or&nbsp;classic&nbsp;compiler&nbsp;in&nbsp;a&nbsp;JVM&nbsp;of&nbsp;its&nbsp;own&nbsp;<BR>&nbsp;<BR><BR><BR>　　由于JSP页面在第一次使用时已经被编译，那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上，这个过程完全可以自动化，因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。&nbsp;<BR><BR>在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段，而不是编译阶段，使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。<BR><BR>　　可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet，被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面，可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它J<BR><BR>　　Tomcat提供了一种通过请求来编译JSP页面的功能。例如，你可以在浏览器地址栏中输入http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true，这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得，不失为一种检验页面正确性的捷径。<BR><BR>　　4.&nbsp;其它<BR><BR>　　前面我们提到过操作系统通过一些限制手段来防止恶意的服务攻击，同样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。<BR><BR>　　Tomcat提供了两个参数供你配置：RemoteHostValve&nbsp;和RemoteAddrValve。&nbsp;<BR><BR>　　通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。&nbsp;<BR><BR>　　例如你可以把Admin&nbsp;Web&nbsp;application设置成只允许本地访问，设置如下：<BR><BR><BR>&lt;Context&nbsp;path="/path/to/secret_files"&nbsp;...&gt;&nbsp;<BR>&lt;Valve&nbsp;className="org.apache.catalina.valves.RemoteAddrValve"&nbsp;<BR><BR>allow="127.0.0.1"&nbsp;deny=""/&gt;&nbsp;<BR>&lt;/Context&gt;<BR><BR><BR>　　如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<BR><BR><STRONG>五.&nbsp;容量计划</STRONG><BR>　容量计划是在生产环境中使用Tomcat不得不提的提高性能的另一个重要的话题。如果你没有对预期的网络流量下的硬件和带宽做考虑的话那么无论你如何做配置修改和测试都无济于事。<BR><BR>　　这里先对提及的容量计划作一个简要的定义：容量计划是指评估硬件、操作系统和网络带宽，确定应用服务的服务范围，寻求适合需求和软件特性的软硬件的一项活动。因此这里所说的软件不仅包括Tomcat，也包括与Tomcat结合使用的任何第三方web服务器软件。<BR><BR>　　如果在购买软硬件或部署系统前你对容量计划一无所知，不知道现有的软硬件环境能够支撑多少的访问量，甚至更糟直到你已经交付并且在生产环境上部署产品后才意识到配置有问题时再进行变更可能为时已晚。此时只能增加硬件投入，增加硬盘容量甚至购买更好的服务器。如果事先做了容量计划那么就不会搞的如此焦头烂额了。<BR><BR>　　我们这里只介绍与Tomcat相关的内容。<BR><BR>　　首先为了确定Tomcat使用机器的容量计划，你应该从一下列表项目种着手研究和计划：<BR><BR>　　1.&nbsp;硬件<BR><BR>　　采用什么样的硬件体系？需要多少台计算机？使用一个大型的，还是使用多台小型机？每个计算机上使用几个CPU？使用多少内存？使用什么样的存储设备，I/O的处理速度有什么要求？怎样维护这些计算机？不同的JVM在这些硬件上运行的效果如何（比如IBM&nbsp;AIX系统只能在其设计的硬件系统上运行）？<BR><BR>　　2.&nbsp;网络带宽<BR><BR>　　带宽的使用极限是多少？web应用程序如何处理过多的请求？<BR><BR>　　3.&nbsp;服务端操作系统<BR><BR>　　采用哪种操作系统作为站点服务器最好？在确定的操作系统上使用哪个JVM最好？例如，JVM在这种系统上是否支持本地多线程，对称多处理？哪种系统可使web服务器更快、更稳定，并且更便宜。是否支持多CPU？&nbsp;<BR>4.&nbsp;Tomcat容量计划<BR><BR>　　以下介绍针对Tomcat做容量计划的步骤：<BR><BR>　　1）&nbsp;量化负载。如果站点已经建立并运行，可以使用前面介绍的工具模仿用户访问，确定资源的需求量。<BR><BR>　　2）&nbsp;针对测试结果或测试过程中进行分析。需要知道那些请求造成了负载过重或者使用过多的资源，并与其它请求做比较，这样就确定了系统的瓶颈所在。例如：如果servlet在查询数据库的步骤上耗用较长的时间，那么就需要考虑使用缓冲池来降低响应时间。<BR><BR>　　3）&nbsp;确定性能最低标准。例如，你不想让用户花20秒来等待结果页面的返回，也就是说甚至在达到访问量的极限时，用户等待的时间也不能超过20秒种（从点击链接到看到返第一条返回数据）。这个时间中包含了数据库查询时间和文件访问时间。同类产品性能在不同的公司可能有不同的标准，一般最好采取同行中的最低标准或对这个标准做出评估。<BR><BR>　　4）&nbsp;确定如何合理使用底层资源，并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、操作系统、JVM等等。在各种生产环境上都按顺序进行部署和测试，观察是否符合需求。在测试Tomcat时尽量多采用几种JVM，并且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果，还需针对测试过程中出现的硬件系统瓶颈进行处理确定合理的资源配置。这个过程最为复杂，而且一般由于没有可参考的值所以只能靠理论推断和经验总结。<BR><BR>　　5）&nbsp;如果通过第4步的反复测试如果达到了最优的组合，就可以在相同的生产环境上部署产品了。<BR><BR>　　此外应牢记一定要文档化你的测试过程和结果，因为此后可能还会进行测试，这样就可以拿以前的测试结果做为参考。另外测试过程要反复多次进行，每次的条件可能都不一样，因此只有记录下来才能进行结果比较和最佳条件的选择。<BR><BR>　　这样我们通过测试找到了最好的组合方式，各种资源得到了合理的配置，系统的性能得到了极大的提升。<BR><BR><STRONG>六.&nbsp;附加资料</STRONG><BR>　很显然本文也很难全面而详尽地阐述性能优化过程。如果你进行更多研究的话可能会把性能调优做的更好，比如Java程序的性能调整、操作系统的调整、各种复杂环境与应用系统和其它所有与应用程序相关的东西。在这里提供一些文中提到的一些资源、文中提到的相关内容的链接以及本文的一些参考资料。<BR><BR>　　1.&nbsp;Web性能测试资料及工具<BR><BR>　　1）&nbsp;Jmeter&nbsp;Wiki首页，Jmeter为一个开源的100%Java开发的性能测试工具<BR>　　http://wiki.apache.org/jakarta-jmeter/<BR><BR>　　2）&nbsp;Apache&nbsp;Benchmark使用说明<BR>　　http://httpd.apache.org/docs-2.0/programs/ab.html<BR><BR>　　3）&nbsp;一些Java相关测试工具的介绍，包含可以与Tomcat集成进行测试的工具<BR>　　http://blog.csdn.net/wyingquan/<BR><BR>　　4）&nbsp;LoadRunner?&nbsp;是一种预测系统行为和性能的工业标准级负载测试工具。它通过模拟数据以千万计用户来实施并发负载来对整个企业架构进行测试，来帮助您更快的查找和发现问题。<BR>　　http://www.mercury.com/us/products/performance-center/loadrunner/<BR><BR><BR>　　2.&nbsp;文中介绍的相关内容的介绍<BR><BR>　　1）&nbsp;Apache&nbsp;2.x&nbsp;+&nbsp;Tomcat&nbsp;4.x做负载均衡，描述了如何利用jk配置集群的负载均衡。<BR>　　http://raibledesigns.com/tomcat/index.html<BR><BR>　　2）&nbsp;容量计划的制定，收集了许多有关制定web站点容量计划的例子：<BR>　　http://www.capacityplanning.com/<BR><BR>　　3）&nbsp;评测Tomcat5负载平衡与集群，<BR>　　http://www.javaresearch.org/article/showarticle.jsp?column=556&amp;thread=19777<BR><BR>　　4）&nbsp;Apache与Tomcat的安装与整合之整合篇<BR>　　http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=18139<BR><BR>　　5）&nbsp;性能测试工具之研究，介绍了性能测试工具的原理与思路<BR>　　http://www.51testing.com/emagzine/No2_2.htm<BR><BR>　　6）&nbsp;Java的内存泄漏<BR>　　http://www.matrix.org.cn/resource/article/409.html<BR><BR>　　7）&nbsp;Web服务器和应用程序服务器有什么区别？<BR>　　http://www.matrix.org.cn/resource/article/1429.html<BR><BR>　　8）&nbsp;详细讲解性能中数据库集群的问题<BR>　　http://www.theserverside.com/articles/article.tss?l=DB_Break&nbsp;<BR></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200822710846148</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200822710846148</guid>
    <pubDate>Thu, 27 Mar 2008 10:08:46 +0800</pubDate>
    <dcterms:modified>2008-03-27T10:08:46+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[区分==和equals]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/967441200822795039134</link>
    <description><![CDATA[<div><P>1,==号比较的是对象地址（在行对象比较时），equals()需要看对象的实现方式。比较的同样是对象</P>
<P>String a="ss";String b="ss"&nbsp; ;String c=a;a==b(true)在编译的时候确定是同一个对象，注意String 得equals得实现方法！以上都表示是同一个对象；String d = new String(a);&nbsp; a==d(false)这里不是同一个对象了，在运行时候生成新的对象；</P>
<P>是先比较==，如果==是true就返回true。如果为false 才进行值比较.a.equals(b)==true;</P>
<P>&nbsp;</P>
<P><FONT color=#ff0000>在JAVA对对象的初始化通常有两种方法： <BR>　　１.基本数据类型：如：int&nbsp;i=5; <BR>　　２.普通类型：入God&nbsp;g=new&nbsp;God(); <BR>但是String是其中比较特殊的一个问题。可以用以上两种方法来初始化！ <BR>String&nbsp;st＝“abc”；和String&nbsp;st＝new&nbsp;String（“abc”）；而且前者是更通用的一种简单方法。 <BR>至于二者为什么不相等，其实是JAVA中另外一个问题：JAVA中“＝＝”的用法。 <BR>说到这个问题又牵涉到深层COPE的问题。太复杂，这就就用最简单的话，尽力把事情说明，希望楼主能明白就可以了！ <BR><BR>JAVA中“＝＝”比较的是其两边的对象的物理地址是否相同。 <BR>String&nbsp;st1="abc";String&nbsp;st2="abc";并没有创建一个真正的内存对象，只是将两个String型的引用指向了存放于同一个内存地址的同一个对象“abc”而已。而String&nbsp;st1=new&nbsp;String("abc");String&nbsp;st2=new&nbsp;String("abc");则不同，我们知道，JAVA中new　就是用来开辟一个新的内存空间，然后在这个空间上创建new处理的对象。所以这个引用st1和st2指向的是两个位于不同的内存空间的两个独立的对象。所以他们指向的物理地址是相同的。所以“＝＝”返回true。 </FONT></P>
<P>&nbsp;</P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/967441200822795039134</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/967441200822795039134</guid>
    <pubDate>Thu, 27 Mar 2008 09:50:39 +0800</pubDate>
    <dcterms:modified>2008-03-27T09:50:39+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[servlet过滤器应用]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/9674412008222105133228</link>
    <description><![CDATA[<div><P>一、Servlet过滤器的概念：<BR>***************************************************************************************<BR>Servlet过滤器是在Java&nbsp;Servlet规范2.3中定义的，它能够对Servlet容器的请求和响应对象进行检查和修改。　　　<BR><BR>Servlet过滤器本身并不产生请求和响应对象，它只能提供过滤作用。Servlet过期能够在Servlet被调用之前检查Request对象，修改Request&nbsp;Header和Request内容；在Servlet被调用之后检查Response对象，修改Response&nbsp;Header和Response内容。<BR><BR>Servlet过期负责过滤的Web组件可以是Servlet、JSP或者HTML文件。　<BR>***************************************************************************************<BR><BR><BR>二、Servlet过滤器的特点：<BR>***************************************************************************************<BR>A．Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象<BR>B．Servlet过滤器可以被指定和特定的URL关联，只有当客户请求访问该URL时，才会触发过滤器<BR>C．Servlet过滤器可以被串联在一起，形成管道效应，协同修改请求和响应对象<BR>***************************************************************************************<BR><BR><BR>三、Servlet过滤器的作用：<BR>***************************************************************************************<BR>A．查询请求并作出相应的行动。<BR>B．阻塞请求-响应对，使其不能进一步传递。<BR>C．修改请求的头部和数据。用户可以提供自定义的请求。<BR>D．修改响应的头部和数据。用户可以通过提供定制的响应版本实现。<BR>E．与外部资源进行交互。<BR>***************************************************************************************<BR><BR><BR>四、Servlet过滤器的适用场合：<BR>***************************************************************************************<BR>A．认证过滤<BR>B．登录和审核过滤<BR>C．图像转换过滤&nbsp;<BR>D．数据压缩过滤&nbsp;<BR>E．加密过滤&nbsp;<BR>F．令牌过滤&nbsp;<BR>G．资源访问触发事件过滤&nbsp;<BR>H．XSL/T过滤&nbsp;<BR>I．Mime-type过滤<BR>***************************************************************************************<BR><BR><BR>五、Servlet过滤器接口的构成：<BR>***************************************************************************************<BR>所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法：<BR><BR>A.init(FilterConfig)：<BR>这是Servlet过滤器的初始化方法，Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数<BR><BR>B.doFilter(ServletRequest,ServletResponse,FilterChain)：<BR>这个方法完成实际的过滤操作，当客户请求访问于过滤器关联的URL时，Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器<BR><BR>B.destroy()：<BR>Servlet容器在销毁过滤器实例前调用该方法，这个方法中可以释放Servlet过滤器占用的资源<BR>***************************************************************************************<BR><BR><BR>六、Servlet过滤器的创建步骤：<BR>***************************************************************************************<BR>A．实现javax.servlet.Filter接口<BR>B．实现init方法，读取过滤器的初始化函数<BR>C．实现doFilter方法，完成对请求或过滤的响应<BR>D．调用FilterChain接口对象的doFilter方法，向后续的过滤器传递请求或响应<BR>E．销毁过滤器<BR>***************************************************************************************<BR><BR><BR>七、Servlet过滤器对请求的过滤：<BR>***************************************************************************************<BR>A．Servlet容器创建一个过滤器实例<BR>B．过滤器实例调用init方法，读取过滤器的初始化参数<BR>C．过滤器实例调用doFilter方法，根据初始化参数的值判断该请求是否合法<BR>D．如果该请求不合法则阻塞该请求<BR>E．如果该请求合法则调用chain.doFilter方法将该请求向后续传递<BR>***************************************************************************************<BR><BR><BR>八、Servlet过滤器对响应的过滤：<BR>***************************************************************************************<BR>A．过滤器截获客户端的请求<BR>B．重新封装ServletResponse，在封装后的ServletResponse中提供用户自定义的输出流<BR>C．将请求向后续传递<BR>D．Web组件产生响应<BR>E．从封装后的ServletResponse中获取用户自定义的输出流<BR>F．将响应内容通过用户自定义的输出流写入到缓冲流中<BR>G．在缓冲流中修改响应的内容后清空缓冲流，输出响应内容<BR>***************************************************************************************<BR><BR>九、Servlet过滤器的发布：<BR>***************************************************************************************<BR>A．发布Servlet过滤器时，必须在web.xml文件中加入&lt;filter&gt;元素和&lt;filter-mapping&gt;元素。<BR><BR>B．&lt;filter&gt;元素用来定义一个过滤器：<BR>属性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含义<BR>filter-name&nbsp;&nbsp;&nbsp;&nbsp;指定过滤器的名字<BR>filter-class&nbsp;&nbsp;&nbsp;&nbsp;指定过滤器的类名<BR>init-param&nbsp;&nbsp;&nbsp;&nbsp;为过滤器实例提供初始化参数，可以有多个<BR><BR>C．&lt;filter-mapping&gt;元素用于将过滤器和URL关联：<BR>属性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含义<BR>filter-name&nbsp;&nbsp;&nbsp;&nbsp;指定过滤器的名字<BR>url-pattern&nbsp;&nbsp;&nbsp;&nbsp;指定和过滤器关联的URL，为”/*”表示所有URL<BR>***************************************************************************************<BR><BR><BR>十一、Servlet过滤器使用的注意事项<BR>***************************************************************************************<BR>A．由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下，并非HTTP包所特有的，所以其中所用到的请求、响应对象ServletRequest、ServletResponse在使用前都必须先转换成HttpServletRequest、HttpServletResponse再进行下一步操作。<BR><BR>B．在web.xml中配置Servlet和Servlet过滤器，应该先声明过滤器元素，再声明Servlet元素<BR><BR><BR>C．如果要在Servlet中观察过滤器生成的日志，应该确保在server.xml的localhost对应的&lt;host&gt;元素中配置如下&lt;logger&gt;元素：<BR>&lt;Logger&nbsp;className&nbsp;=&nbsp;“org.apache.catalina.logger.FileLogger”<BR>directory&nbsp;=&nbsp;“logs”prefix&nbsp;=&nbsp;“localhost_log.”suffix=”.txt”<BR>timestamp&nbsp;=&nbsp;“true”/&gt;</P>
<P>&nbsp;</P>
<P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=344 height=86><SPAN ><STRONG><FONT size=2><SPAN >1.Servlet 过滤器是什么？ </SPAN><BR></FONT></STRONG><FONT size=2><FONT color=#2d2d2d>&nbsp;&nbsp;&nbsp;&nbsp;Servlet 过滤器是小型的 Web 组件，它们拦截请求和响应，以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件，这些功能虽然很重要，但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性，等等。过滤器提供一种面向对象的模块化机制，用以将公共任务封装到可插入的组件中，这些组件通过一个配置文件来声明，并动态地处理。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet 过滤器中结合了许多元素，从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说，Servlet 过滤器是：<BR><BR></FONT><SPAN ><FONT color=#0000ff>声明式的</FONT></SPAN></FONT><FONT size=2><FONT color=#2d2d2d>：过滤器通过 Web 部署描述符（web.xml）中的 XML 标签来声明。这样允许添加和删除过滤器，而无需改动任何应用程序代码或 JSP 页面。 <BR><BR></FONT><SPAN ><FONT color=#0000ff>动态的</FONT></SPAN><FONT color=#2d2d2d>：过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。 </FONT></FONT></SPAN></TD>
<TD vAlign=top width=340>



<FONT color=#2d2d2d size=2></FONT></TD></TR></TBODY></TABLE></P>
<P ><SPAN ><FONT color=#0000ff>灵活的</FONT></SPAN>：过滤器在 Web 处理环境中的应用很广泛，涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的，因为它们可用于对来自客户机的直接调用执行预处理和后期处理，以及处理在防火墙之后的 Web 组件之间调度的请求。最后，可以将过滤器链接起来以提供必需的功能。 <BR><BR><SPAN ><FONT color=#0000ff>模块化的</FONT></SPAN>：通过把应用程序处理逻辑封装到单个类文件中，过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。 <BR><BR><SPAN ><FONT color=#0000ff>可移植的</FONT></SPAN>：与 Java 平台的其他许多方面一样，Servlet 过滤器是跨平台和跨容器可移植的，从而进一步支持了 Servler 过滤器的模块化和可重用本质。 <BR><BR><SPAN ><FONT color=#0000ff>可重用的</FONT></SPAN>：归功于过滤器实现类的模块化设计，以及声明式的过滤器配置方式，过滤器可以容易地跨越不同的项目和应用程序使用。 <BR><BR><SPAN ><FONT color=#0000ff>透明的</FONT></SPAN>：在请求/响应链中包括过滤器，这种设计是为了补充（而不是以任何方式替代）servlet 或 JSP 页面提供的核心处理。因而，过滤器可以根据需要添加或删除，而不会破坏 servlet 或 JSP 页面。 <BR><BR><STRONG>2.Servlet 过滤器体系结构</STRONG><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正如其名称所暗示的， Servlet 过滤器用于拦截传入的请求和/或传出的响应，并监视、修改或以某种方式处理正在通过的数据流。过滤器是自包含、模块化的组件，可以将它们添加到请求/响应链中，或者在无需影响应用程序中其他 Web 组件的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理，因而不应该将它们直接嵌入 Web 应用程序框架，除非是通过 Servlet API 中良好定义的标准接口来实现。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Web 资源可以配置为没有过滤器与之关联（这是默认情况）、与单个过滤器关联（这是典型情况），甚至是与一个过滤器链相关联。那么过滤器究竟做什么呢？ 像 servlet 一样，它接受请求并响应对象。然后过滤器会检查请求对象，并决定将该请求转发给链中的下一个组件，或者中止该请求并直接向客户机发回一个响应。如果请求被转发了，它将被传递给链中的下一个资源（另一个过滤器、servlet 或 JSP 页面）。在这个请求设法通过过滤器链并被服务器处理之后，一个响应将以相反的顺序通过该链发送回去。这样就给每个过滤器都提供了根据需要处理响应对象的机会。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当过滤器在 Servlet 2.3 规范中首次引入时，它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源，那就不能向幕后委托的任何请求应用过滤器。2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此，Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间，以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性！<BR><BR><STRONG>3.编写实现类的程序</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;过滤器 API 包含 3 个简单的接口，它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter 、 FilterChain 和 FilterConfig 。从编程的角度看，过滤器类将实现 Filter 接口，然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象，以允许过滤器把控制权传递给链中的下一个资源。 FilterConfig 对象将由容器提供给过滤器，以允许访问该过滤器的初始化数据。 <BR><BR>为了与我们的三步模式保持一致，过滤器必须运用三个方法，以便完全实现 Filter 接口： <BR><BR><SPAN ><FONT color=#0000ff>init()</FONT></SPAN> ：这个方法在容器实例化过滤器时被调用，它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。 <BR><BR><SPAN ><FONT color=#0000ff>doFilter()</FONT></SPAN> ：与 servlet 拥有一个 service() 方法（这个方法又调用 doPost() 或者 doGet() ）来处理请求一样，过滤器拥有单个用于处理请求和响应的方法?D?D doFilter() 。这个方法接受三个输入参数：一个 ServletRequest 、 response 和一个 FilterChain 对象。 <BR><BR><SPAN ><FONT color=#0000ff>destroy() </FONT></SPAN>：正如您想像的那样，这个方法执行任何清理操作，这些操作可能需要在自动垃圾收集之前进行。 <BR><BR>SessionFilter.java<BR>package net.pms.web.filter;<BR><BR>import java.io.IOException;<BR><BR>import javax.servlet.Filter;<BR>import javax.servlet.FilterChain;<BR>import javax.servlet.FilterConfig;<BR>import javax.servlet.ServletException;<BR>import javax.servlet.ServletRequest;<BR>import javax.servlet.ServletResponse;<BR>import javax.servlet.http.HttpServletRequest;<BR>import javax.servlet.http.HttpServletResponse;<BR>import javax.servlet.http.HttpServletResponseWrapper;<BR><BR>/**<BR>* @author jfish<BR>* @since 2006.1.12<BR>*/<BR>public class SessionFilter implements Filter {<BR><BR>&nbsp; &nbsp; &nbsp;public static boolean isContains(String container, String[] regx) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;boolean result = false;<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i &lt; regx.length; i++) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (container.indexOf(regx[i]) != -1) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return result;<BR>&nbsp; &nbsp; &nbsp;}<BR><BR>&nbsp; &nbsp; &nbsp;public FilterConfig config;<BR><BR>&nbsp; &nbsp; &nbsp;public void setFilterConfig(FilterConfig config) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.config = config;<BR>&nbsp; &nbsp; &nbsp;}<BR><BR>&nbsp; &nbsp; &nbsp;public FilterConfig getFilterConfig() {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return config;<BR>&nbsp; &nbsp; &nbsp;}<BR><BR>&nbsp; &nbsp; &nbsp;public void doFilter(ServletRequest request, ServletResponse response,<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FilterChain chain) throws IOException, ServletException {<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpServletRequest httpreq = (HttpServletRequest) request;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpServletResponse httpres = (HttpServletResponse) response;<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(HttpServletResponse) response);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String logonStrings = config.getInitParameter("logonStrings");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String includeStrings = config.getInitParameter("includeStrings");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String redirectPath = httpreq.getContextPath()<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ config.getInitParameter("redirectPath");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String disabletestfilter = config.getInitParameter("disabletestfilter");<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (disabletestfilter.toUpperCase().equals("Y")) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;chain.doFilter(request, response);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String[] logonList = logonStrings.split(";");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String[] includeList = includeStrings.split(";");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Object user = httpreq.getSession().getAttribute("userinfo");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (user == null) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!this.isContains(httpreq.getRequestURI(), includeList)) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;chain.doFilter(request, response);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (this.isContains(httpreq.getRequestURI(), logonList)) {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;chain.doFilter(request, response);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;wrapper.sendRedirect(redirectPath);<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;chain.doFilter(request, response);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<BR>&nbsp; &nbsp; &nbsp;}<BR><BR>&nbsp; &nbsp; &nbsp;public void destroy() {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.config = null;<BR>&nbsp; &nbsp; &nbsp;}<BR><BR>&nbsp; &nbsp; &nbsp;public void init(FilterConfig filterConfig) throws ServletException {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.config = filterConfig;<BR>&nbsp; &nbsp; &nbsp;}<BR>}<BR><BR><FONT color=#0000ff><SPAN >4.配置 Servlet 过滤器</SPAN><BR></FONT>在web.xml中：<BR>&nbsp; &nbsp; &nbsp; &nbsp; &lt;filter&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;filter-name&gt;SessionFilter&lt;/filter-name&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;filter-class&gt;net.pms.web.filter.SessionFilter&lt;/filter-class&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-name&gt;logonStrings&lt;/param-name&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-value&gt;login.jsp&lt;/param-value&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-name&gt;includeStrings&lt;/param-name&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-value&gt;.jsp;.html&lt;/param-value&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-name&gt;redirectPath&lt;/param-name&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-value&gt;/login.jsp&lt;/param-value&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;init-param&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-name&gt;disabletestfilter&lt;/param-name&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;param-value&gt;N&lt;/param-value&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/init-param&gt;<BR>&nbsp; &nbsp; &nbsp;&lt;/filter&gt;<BR>&nbsp; &nbsp; &nbsp; &lt;filter-mapping&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;filter-name&gt;SessionFilter&lt;/filter-name&gt;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<BR>&nbsp; &nbsp; &nbsp;&lt;/filter-mapping&gt;<BR></P></div>]]></description>
	    <author><![CDATA[steve]]></author>
	    <comments>http://xxxzheng.blog.163.com/blog/static/9674412008222105133228</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://xxxzheng.blog.163.com/blog/static/9674412008222105133228</guid>
    <pubDate>Sat, 22 Mar 2008 10:51:33 +0800</pubDate>
    <dcterms:modified>2008-03-22T10:51:33+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[sql server2000 tempdb应用原则与优化]]></title>	
    <link>http://xxxzheng.blog.163.com/blog/static/96744120082229332293</link>
    <description><![CDATA[<div><P>SQL Server会自动创建一个名为tempdb的数据库作为工作空间使用，当您在存储过程中创建一个临时表格时，比如(CREATE TABLE #MyTemp)，无论您正在使用哪个数据库，SQL数据库引擎都会将这个表格创建在tempdb数据库中。</P>
<P>而且，当您对大型的结果集进行排序，比如使用ORDER BY或GROUP BY或UNION或执行一个嵌套的SELECT时，如果数据量超过了系统内存容量，SQL数据库引擎就会在tempdb中创建工作表格。在您运行DBCC REINDEX或者向现有的表格中添加集群序列时， SQL数据库引擎同样会使用tempdb。实际上，任何针对大型表格的ALTER TABLE命令都会在tempdb中吃掉大量的磁盘空间。</P>
<P>在理想状态下，SQL会在完成指定操作后自动清理，并销毁这些临时表格，但是，很多问题都会导致错误。比如，您的代码创建了一个事务，但是却没能执行或重新运行，那么这些孤儿对象将遗留在tempdb中。而且，对大型数据库运行DBCC CHECK时，它还会消耗掉大量的空间，您往往会发现tempdb比设想的要大很多，甚至还会收到SQL即将用完磁盘空间的出错信息。</P>
<P>您有很多方法可以来修正这一情况，但从长远看来，您需要执行其它的步骤来保证正常使用。</P>
<P>为tempdb“减肥”最简单的办法就是关闭SQL数据库引擎然后重新启动，但是在重要的任务中，这样做可能难度很大；另一方面，如果您已经处于无法承受的状态，那么我的建议就是将这个坏消息告知您的上司，然后开始操作。</P>
<P>如果您幸运拥有另外一块磁盘可以用来放置tempdb，可以进行如下的操作：</P>
<P>USE master</P>
<P>GO</P>
<P>ALTER DATABASE tempdb modify file (name = tempdev, filename =’NewDrive:\Path\tempdb.mdf’)</P>
<P>GO</P>
<P>ALTER DATABASE tempdb modify file (name = templog, filename =’NewDrive:\Path\templog.ldf’)</P>
<P>GO</P>
<P>还有三项关于tempdb的属性应该检查：自动增长标记，初始大小和恢复模式，以下是关于这些属性的小窍门：</P>
<P><STRONG>自动增长标记：</STRONG>记住将这个标记设为True。</P>
<P><STRONG>初始大小：</STRONG>tempdb的初始大小要根据常用的工作负载来设定，如果有很多用户在使用GROUP BY、ORDER BY或者对大型表格进行聚合操作，那么您的常用工作负载会相当大。如果服务器脱机时，您可能需要检查日志文件与数据文件是否位于同一磁盘，如果这样的话，应当将需要将它们转移到新的磁盘上，您只需指明相应的数据库并使用相同的命令即可。</P>
<P><STRONG>恢复模式：</STRONG>将恢复模式设定为True意味着让SQL自动截去tempdb的日志文件（在使用了每个表格之后），要找出tempdb所使用的恢复模式，可以使用如下命令：</P>
<P>SELECT DATABASEPROPERTYEX(’tempdb’,’recovery’)</P>
<P>恢复模式有三种选择：简单、完整或大量记录（bulk-logged），如要改变设置，可以使用以下命令：</P>
<P>ALTER DATABASE tempdb SET RECOVERY SIMPLE</P>
<P>这些步骤可以优化您系统中使用的tempdb，除了解决磁盘空间问题外，您还会发现SQL Server系统性能的提升。</P>
<P>&nbsp;</P>
<P>c)tempdb的使用规范：&nbsp; <BR><BR>　　　i.　尽量避免使用distinct、order&nbsp;by、group&nbsp;by、having、join、cumpute，因为这些语句会加重tempdb的负担。&nbsp; <BR><BR>　　　ii.　避免频繁创建和删除临时表，减少系统表资源的消耗。&nbsp; <BR><BR>　　　iii.　在新建临时表时，如果一次性插入数据量很大，那么可以使用select&nbsp;into代替create&nbsp;table，避免log，提高速度；如果数据量不大，为了缓和系统表的资源，建议先create&nbsp;table，然后insert。&nbsp; <BR><BR>　　　iv.　如果临时表的数据量较大，需要建立索引，那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中，这样才能保证系统能够很好的使用到该临时表的索引。&nbsp; <BR><BR>　　　&nbsp;v.　如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先truncate&nbsp;table，然后drop&nbsp;table，这样可以避免系统表的较长时间锁定。&nbsp; <BR><BR>　　　&nbsp;vi.　慎用大的临时表与其他大表的连接查询和修改，减低系统表负担，因为这种操作会在一条语句中多次使用tempdb的系统表。　　&nbsp;</P>
<P>&nbsp;</P>
<H3 >Tempdb 信息</H3>
<P>

<B>tempdb</B> 是一个临时工作区。除其他用途外，SQL Server 还将 <B>tempdb</B> 用于： 
<TABLE ul">
<TBODY>
<TR>
<TD >&#8226;</TD>
<TD >显式创建的临时表的存储。</TD></TR>
<TR>
<TD >&#8226;</TD>
<TD >保存在查询处理和排序过程中创建的中间结果的工作表。</