﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Sometimes Java</title><link>http://www.blogjava.net/bromon/</link><description>MSN/GTalk: bromon@gmail.com</description><language>zh-cn</language><lastBuildDate>Sat, 02 May 2026 18:25:16 GMT</lastBuildDate><pubDate>Sat, 02 May 2026 18:25:16 GMT</pubDate><ttl>60</ttl><item><title>Websphere MQ 6.0 Cluster指南</title><link>http://www.blogjava.net/bromon/archive/2005/12/16/24193.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Fri, 16 Dec 2005 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/12/16/24193.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/24193.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/12/16/24193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/24193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/24193.html</trackback:ping><description><![CDATA[

<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 16pt;" lang="EN-US">Websphere MQ 6.0 Cluster<o:p></o:p></span></p>




<p class="MsoNormal" style="text-align: right;" align="right"><span style="font-size: 12pt; font-family: 宋体;">bromon原创&nbsp; 请尊重版权</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>





<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">本文主要讲解何搭建一个</span><span style="font-size: 12pt;" lang="EN-US">mq
6.0 cluster</span><span style="font-size: 12pt; font-family: 宋体;">环境。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Websphere MQ(</span><span style="font-size: 12pt; font-family: 宋体;">简称</span><span style="font-size: 12pt;" lang="EN-US">mq)</span><span style="font-size: 12pt; font-family: 宋体;">在多个节点之间的通信上，有两种方案，一是利用远程队列进行</span><span style="font-size: 12pt;" lang="EN-US">p2p</span><span style="font-size: 12pt; font-family: 宋体;">的通信；一是利用</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">远程队列构造网状的拓普结构：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><img alt="图像 “http://blog.yam.com/bromon/8dea2bed.jpg” 因其本身有错无法显示。" src="http://blog.yam.com/bromon/8dea2bed.jpg"></p>




<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">这种结构将导致频繁的节点间通信和大量的维护工作，所以很少采用。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Cluster</span><span style="font-size: 12pt; font-family: 宋体;">构造的拓普简单得多：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><img alt="图像 “http://blog.yam.com/bromon/3adf7888.jpg” 因其本身有错无法显示。" src="http://blog.yam.com/bromon/3adf7888.jpg"></p>




<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">位于同一个群集当中的若干队列管理器之间互相通讯时，不需要在每一个队列管理器上创建消息通道、远程队列管理器以及与通道相关的传输队列的定义，相反，我们只需要为每一个队列器上创建群集通道（</span><span style="font-size: 12pt;" lang="EN-US">MQ</span><span style="font-size: 12pt; font-family: 宋体;">的通道分为三种类型，即服务器与服务器之间的消息通道，客户端与服务器之间的</span><span style="font-size: 12pt;" lang="EN-US">MQI</span><span style="font-size: 12pt; font-family: 宋体;">通道，以及用于群集内部通讯的群集通道）。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">每个</span><span style="font-size: 12pt;" lang="EN-US">mq
cluster</span><span style="font-size: 12pt; font-family: 宋体;">都以一个仓储库</span><span style="font-size: 12pt;" lang="EN-US">(Repository)</span><span style="font-size: 12pt; font-family: 宋体;">为中心，它包含了与该</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">有关的所有信息，这些信息存储在一个名为</span><span style="font-size: 12pt;" lang="EN-US">SYSTEM.CLUSTER.REPOSITORY.QUEUE</span><span style="font-size: 12pt; font-family: 宋体;">的队列中。通常应该在一个</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">中选择两个节点来做仓储库，他们之间会互相备份。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">下面演示如何建立一个二节点的</span><span style="font-size: 12pt;" lang="EN-US">mq
cluster</span><span style="font-size: 12pt; font-family: 宋体;">，</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">的名称是</span><span style="font-size: 12pt;" lang="EN-US">sobey<o:p></o:p></span></p>


<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><span style="">●<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">节点一</span><span style="font-size: 12pt;" lang="EN-US">(tom)<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">队列管理器名称</span><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tom<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">机器</span><span style="font-size: 12pt;" lang="EN-US">ip<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>172.16.0.116<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt;"><!--[if !supportLists]--><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><span style="">●<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">节点二</span><span style="font-size: 12pt;" lang="EN-US">(jerry)<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">队列管理器名称</span><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>jerry<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">机器</span><span style="font-size: 12pt;" lang="EN-US">ip<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>172.16.32.11<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><b style=""><span style="font-size: 12pt; font-family: 宋体;">步骤一</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">将</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US">tom</span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">和</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US">jerry</span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">指定为</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US">cluster</span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">的完整仓储库：</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></b></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">mq</span><span style="font-size: 12pt; font-family: 宋体;">资源管理器中右击“</span><span style="font-size: 12pt;" lang="EN-US">tom</span><span style="font-size: 12pt; font-family: 宋体;">”</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">属性</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">仓储库</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">集群的完整仓储库，填入集群名称</span><span style="font-size: 12pt;" lang="EN-US">”sobey”</span><span style="font-size: 12pt; font-family: 宋体;">，如图：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt;"><img alt="图像 “http://blog.yam.com/bromon/dc5488d3.jpg” 因其本身有错无法显示。" src="http://blog.yam.com/bromon/dc5488d3.jpg"></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><!--[if gte vml 1]><v:shapetype
 id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe">
 <v:stroke joinstyle="miter"/>
 <v:path gradientshapeok="t" o:connecttype="rect"/>
</v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t202" style='position:absolute;
 left:0;text-align:left;margin-left:27pt;margin-top:0;width:351pt;height:1in;
 z-index:1' fillcolor="#ddd"/><![endif]--><!--[if !vml]--><span style="position: relative; z-index: 1;"><span style="position: absolute; left: 35px; top: -1px; width: 474px; height: 102px;">

<table cellpadding="0" cellspacing="0">
 <tbody><tr>
  <td style="border: 0.75pt solid black; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; vertical-align: top;" bgcolor="#dddddd" height="102" width="474"><!--[endif]--><!--[if !mso]--><span style="position: absolute; left: 0pt; z-index: 1;">
  <table cellpadding="0" cellspacing="0" width="100%">
   <tbody><tr>
    <td><!--[endif]-->
    <div v:shape="_x0000_s1026" style="padding: 4.35pt 7.95pt;" class="shape">
    <p class="MsoNormal" style="margin-left: 21pt;"><span style="font-family: 宋体;">以上操作可通过如下命令完成：</span></p>
    <p class="MsoNormal" style="margin-left: 21pt;"><span lang="EN-US">runmqsc tom</span></p>
    
    <p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>alter
    <span style="">&nbsp;</span>qmgr <span style="">&nbsp;</span>repos(sobey)</span></p>
    </div>
    <!--[if !mso]--></td>
   </tr>
  </tbody></table>
  </span><!--[endif]--><!--[if !mso & !vml]-->&nbsp;<!--[endif]--><!--[if !vml]--></td>
 </tr>
</tbody></table>

</span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>









<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt; font-family: 宋体;">在节点二上执行上述操作，将</span><span style="font-size: 12pt;" lang="EN-US">jerry</span><span style="font-size: 12pt; font-family: 宋体;">指定为</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">的完整仓储库</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>





<p class="MsoNormal" style="margin-left: 21pt;"><b style=""><span style="font-size: 12pt; font-family: 宋体;">步骤二</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">建立集群接收通道</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></b></p>





<p class="MsoNormal" style="margin-left: 21pt;"><b style=""><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></b><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">tom</span><span style="font-size: 12pt; font-family: 宋体;">上展开“高级”菜单</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">通道</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">新建</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">集群接收方通道，命名为“</span><span style="font-size: 12pt;" lang="EN-US">to.tom</span><span style="font-size: 12pt; font-family: 宋体;">”</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>





<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在“连接名称”中输入本机</span><span style="font-size: 12pt;" lang="EN-US">ip</span><span style="font-size: 12pt; font-family: 宋体;">或域名，本例为</span><span style="font-size: 12pt;" lang="EN-US">172.16.0.116<o:p></o:p></span></p>





<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在“集群”菜单中选择“在集群中共享”，并且填如集群名</span><span style="font-size: 12pt;" lang="EN-US">”sobey”</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">其中的“</span><span style="font-size: 12pt;" lang="EN-US">clwl</span><span style="font-size: 12pt; font-family: 宋体;">”选项中可以填如</span><span style="font-size: 12pt;" lang="EN-US">0-9</span><span style="font-size: 12pt; font-family: 宋体;">，以指定通道的优先级</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>





<p class="MsoNormal" style="margin-left: 21pt;"><!--[if gte vml 1]><v:shape id="_x0000_s1027"
 type="#_x0000_t202" style='position:absolute;left:0;text-align:left;
 margin-left:36pt;margin-top:0;width:315pt;height:101.4pt;z-index:2'
 fillcolor="#ddd"/><![endif]--><!--[if !vml]--><span style="position: relative; z-index: 2;"><span style="position: absolute; left: 47px; top: -1px; width: 426px; height: 141px;">

<table cellpadding="0" cellspacing="0">
 <tbody><tr>
  <td style="border: 0.75pt solid black; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; vertical-align: top;" bgcolor="#dddddd" height="141" width="426"><!--[endif]--><!--[if !mso]--><span style="position: absolute; left: 0pt; z-index: 2;">
  <table cellpadding="0" cellspacing="0" width="100%">
   <tbody><tr>
    <td><!--[endif]-->
    <div v:shape="_x0000_s1027" style="padding: 4.35pt 7.95pt;" class="shape">
    <p class="MsoNormal"><span style="font-family: 宋体;">以上操作可通过如下命令完成：</span></p>
    <p class="MsoNormal"><span lang="EN-US">runmqsc tom</span></p><p class="MsoNormal"><span lang="EN-US">define <span style="">&nbsp;</span>channel(to.tom) <span style="">&nbsp;</span>chltype(clusrcvr) <span style="">&nbsp;</span>trptype(tcp) </span></p>
    <p class="MsoNormal"><span lang="EN-US">conname(172.16.0.116)<span style="">&nbsp; </span>cluster(sobey)</span></p>
    </div>
    <!--[if !mso]--></td>
   </tr>
  </tbody></table>
  </span><!--[endif]--><!--[if !mso & !vml]-->&nbsp;<!--[endif]--><!--[if !vml]--></td>
 </tr>
</tbody></table>

</span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>





<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">jerry</span><span style="font-size: 12pt; font-family: 宋体;">节点上执行类似操作，将接收通道命名为“</span><span style="font-size: 12pt;" lang="EN-US">to.jerry</span><span style="font-size: 12pt; font-family: 宋体;">”。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><b style=""><span style="font-size: 12pt; font-family: 宋体;">步骤三</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">建立集群发送通道</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></b></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">tom</span><span style="font-size: 12pt; font-family: 宋体;">上展开“高级”菜单</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">通道</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">新建</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">集群发送方通道，命名为“</span><span style="font-size: 12pt;" lang="EN-US">to.jerry</span><span style="font-size: 12pt; font-family: 宋体;">”，在通道的“连接名称”中输入目的地址的</span><span style="font-size: 12pt;" lang="EN-US">ip</span><span style="font-size: 12pt; font-family: 宋体;">或者域名，本例为</span><span style="font-size: 12pt;" lang="EN-US">172.16.32.11<o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><b style=""><span style="font-size: 14pt; font-family: 宋体;">注：发送通道必须与目标地点的接收通道同名</span></b><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><!--[if gte vml 1]><v:shape id="_x0000_s1028"
 type="#_x0000_t202" style='position:absolute;left:0;text-align:left;
 margin-left:36pt;margin-top:7.95pt;width:324pt;height:85.65pt;z-index:3'
 fillcolor="#ddd"/><![endif]--><!--[if !vml]--><span style="">

<table align="left" cellpadding="0" cellspacing="0">
 <tbody><tr>
  <td height="10" width="47"><br>
</td>
 </tr>
 <tr>
  <td><br>
</td>
  <td style="border: 0.75pt solid black; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; vertical-align: top;" bgcolor="#dddddd" height="120" width="438"><!--[endif]--><!--[if !mso]--><span style="position: absolute; left: 0pt; z-index: 3;">
  <table cellpadding="0" cellspacing="0" width="100%">
   <tbody><tr>
    <td><!--[endif]-->
    <div v:shape="_x0000_s1028" style="padding: 4.35pt 7.95pt;" class="shape">
    <p class="MsoNormal"><span style="font-family: 宋体;">以上操作可通过如下命令完成：</span></p>
    <p class="MsoNormal"><span lang="EN-US">runmqsc</span></p><p class="MsoNormal"><span lang="EN-US">define <span style="">&nbsp;</span>channel(to.jerry) <span style="">&nbsp;</span>chltype(clussdr) <span style="">&nbsp;</span>trptype(tcp)</span></p>
    <p class="MsoNormal"><span lang="EN-US">conname(172.16.32.11)<span style="">&nbsp; </span>cluster(sobey)</span></p>
    </div>
    <!--[if !mso]--></td>
   </tr>
  </tbody></table>
  </span><!--[endif]--><!--[if !mso & !vml]-->&nbsp;<!--[endif]--><!--[if !vml]--></td>
 </tr>
</tbody></table>

</span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p><br>
</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">jerry</span><span style="font-size: 12pt; font-family: 宋体;">上执行类似操作，建立名为</span><span style="font-size: 12pt;" lang="EN-US">”to.tom”</span><span style="font-size: 12pt; font-family: 宋体;">的发送通道。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">分别在两个节点上右击发送通道，选择“启动”。如果建立成功，通道的状态会变为“正在运行”，否则为“正在重试”。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><b style=""><span style="font-size: 12pt; font-family: 宋体;">步骤四</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">建立集群队列</span></b><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在任一节点中选择“队列”</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">“新建”</span><span style="font-size: 12pt;" lang="EN-US">---</span><span style="font-size: 12pt; font-family: 宋体;">“本地队列”，在队列的“集群”菜单中，选择“在集群中共享”，并填如集群名“</span><span style="font-size: 12pt;" lang="EN-US">sobey</span><span style="font-size: 12pt; font-family: 宋体;">”。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">在“</span><span style="font-size: 12pt;" lang="EN-US">clwl</span><span style="font-size: 12pt; font-family: 宋体;">”选项中可以填入</span><span style="font-size: 12pt;" lang="EN-US">0-9</span><span style="font-size: 12pt; font-family: 宋体;">，指定队列在</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">中的优先级。</span><span style="font-size: 12pt;" lang="EN-US"><br style="">
<!--[if !supportLineBreakNewLine]--><br style="">
<!--[endif]--><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><!--[if gte vml 1]><v:shape id="_x0000_s1029"
 type="#_x0000_t202" style='position:absolute;left:0;text-align:left;
 margin-left:36pt;margin-top:7.8pt;width:351pt;height:1in;z-index:4'
 fillcolor="#ddd"/><![endif]--><!--[if !vml]--><span style="">

<table align="left" cellpadding="0" cellspacing="0">
 <tbody><tr>
  <td height="9" width="47"><br>
</td>
 </tr>
 <tr>
  <td><br>
</td>
  <td style="border: 0.75pt solid black; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; vertical-align: top;" bgcolor="#dddddd" height="102" width="474"><!--[endif]--><!--[if !mso]--><span style="position: absolute; left: 0pt; z-index: 4;">
  <table cellpadding="0" cellspacing="0" width="100%">
   <tbody><tr>
    <td><!--[endif]-->
    <div v:shape="_x0000_s1029" style="padding: 4.35pt 7.95pt;" class="shape">
    <p class="MsoNormal"><span style="font-family: 宋体;">以上操作可通过如下命令完成：</span></p>
    <p class="MsoNormal"><span lang="EN-US">runmqsc</span></p><p class="MsoNormal"><span lang="EN-US">define <span style="">&nbsp;</span>qlocal(</span><span style="font-family: 宋体;">队列名</span><span lang="EN-US">) <span style="">&nbsp;</span>cluster(sobey)</span></p>
    </div>
    <!--[if !mso]--></td>
   </tr>
  </tbody></table>
  </span><!--[endif]--><!--[if !mso & !vml]-->&nbsp;<!--[endif]--><!--[if !vml]--></td>
 </tr>
</tbody></table>

</span><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>


<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;<br>
<br>
</o:p></span></p><p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt; font-family: 宋体;">集群创建完成。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>





<p class="MsoNormal" style="margin-left: 21pt;"><span style="font-size: 12pt; font-family: 宋体;">如果要把一个新的节点加入到</span><span style="font-size: 12pt;" lang="EN-US">cluster</span><span style="font-size: 12pt; font-family: 宋体;">中，可以按照上述方法，让该节点与任意一个<b style="">完整仓储库节点</b>建立集群连接即可。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<img src ="http://www.blogjava.net/bromon/aggbug/24193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-12-16 13:28 <a href="http://www.blogjava.net/bromon/archive/2005/12/16/24193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> JSF开发实战(二)</title><link>http://www.blogjava.net/bromon/archive/2005/12/16/24190.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Fri, 16 Dec 2005 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/12/16/24190.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/24190.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/12/16/24190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/24190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/24190.html</trackback:ping><description><![CDATA[

			

			JSF开发实战(二)<br>
<br>
bromon原创　请尊重版权<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;JSF开发实战的第一篇(<a href="http://bromon.blog.com.cn/user1/1760/archives/2005/69483.shtml" target="_blank" class="l2">http://www.blogjava.net/bromon/archive/2005/12/16/24189.html</a>)演示了如何建立一个最简单的JSF应用，从那个例子中我们可以观察到JSF的页面组件是如何与后台的javabean绑定的，也看到了JSF标签的最基本使用。在本文中我们会演示一个更加复杂的应用，它包含了更丰富的JSF标签。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;要开发的例子是一个用户管理程序，管理员输入帐号与密码登陆，然后它可以看到所有用户的列表，并且可以修改或者删除其中的一些数据。利用myeclipse所带的jsf-config.xml设计器，页面流程如下：<br>
<br>
<img src="http://bromon.blog.com.cn/user1/1760/upload/200510272232.jpg">&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;可以看出，这个应用设计到的业务逻辑有：<br>
<br>
用户登陆、修改用户信息、增加新用户、删除用户<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;我们在后台的数据库操作中使用hibernate框架来辅助开发，相关的技术细节请自行查阅文档。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;首先建立pojo文件：User.java，它包含几个基本属性：<br>
<br>
private&nbsp;int&nbsp;id;<br>
private&nbsp;String&nbsp;name;<br>
private&nbsp;String&nbsp;password;<br>
private&nbsp;int&nbsp;power;<br>
<br>
请自行完成set/get方法，并且编写对应的hbm.xml文件。<br>
<br>
我
们的主要工作之一，是要建立好供jsf页面组件使用的javabean，把它命名为UMDelegater.java。它会调用UserManager来
完成业务逻辑，这里是一个代理模式。UserManager的内容只是简单的增/删/查/改的操作，这里不再具体列出。UMDelegater的内容是：<br>
package&nbsp;org.bromon.jsf.control;<br>
<br>
import&nbsp;java.util.List;<br>
<br>
import&nbsp;javax.faces.model.DataModel;<br>
import&nbsp;javax.faces.model.ListDataModel;<br>
<br>
import&nbsp;org.bromon.jsf.model.UserManager;//自行建立的工具类，负责所有的hibernate操作<br>
import&nbsp;org.bromon.jsf.model.pojo.User;//pojo对象<br>
<br>
public&nbsp;class&nbsp;UMDeletager&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;UserManager&nbsp;um=new&nbsp;UserManager();//所有具体的方法都由它来实现<br>
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;User&nbsp;user=new&nbsp;User();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;DataModel&nbsp;
allUsers=new&nbsp;ListDataModel();//JSF的内置对象，用来封装html中table的数据<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//----------set/get方法---------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;DataModel&nbsp;getAllUsers()&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;allUsers;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setAllUsers(List&nbsp;list)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allUsers.setWrappedData(list);<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;UserManager&nbsp;getUm()&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;um;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setUm(UserManager&nbsp;um)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.um&nbsp;=&nbsp;um;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;User&nbsp;getUser()&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;user;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setUser(User&nbsp;user)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.user&nbsp;=&nbsp;user;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;//-----功能方法---------<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;login()<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s=um.login(this.getUser());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s.equals("ok"))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setAllUsers(um.loadAll());//如果登陆成功，就取出所有的用户信息<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"login:ok";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swapper.setLoginFailInfo(s);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"login:fail";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;edit()<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.user=(User)allUsers.getRowData();//页面中的table自动返回含有id的user对象<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.user=um.loadById(user.getId());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(user!=null)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"edit";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"error";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;update()<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;um.update(this.getUser());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setAllUsers(um.loadAll());//重新取一次数据，目的是更新缓存<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"update:ok";<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;addNew()<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setUser(new&nbsp;User());//生成一个新的user对象，不含任何数据，它会被自动映射成一个没有数据的form<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"add";<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;add()<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;um.add(this.getUser());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setAllUsers(um.loadAll());//重新取一次数据，目的是更新缓存<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"add:ok";<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;在jsf-config.xml中声明这个bean：<br>
<br>
＜managed-bean＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜managed-bean-name＞UMDelegater＜/managed-bean-name＞<br>
＜managed-bean-class＞org.bromon.jsf.control.UMDeletager＜/managed-bean-class＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜managed-bean-scope＞session＜/managed-bean-scope＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜/managed-bean＞<br>
<br>
业务逻辑就设计完成了，下面可以开始编写jsf文件，首先是index.jsp:<br>
<br>
首先引入标签库，并且声明page属性：<br>
<br>
&lt;%@&nbsp;taglib&nbsp;uri="http://java.sun.com/jsf/html"&nbsp;prefix="h"&nbsp;%&gt;<br>
&lt;%@&nbsp;taglib&nbsp;uri="http://java.sun.com/jsf/core"&nbsp;prefix="f"&nbsp;%&gt;<br>
&lt;%@&nbsp;page&nbsp;language="java"&nbsp;import="java.util.*"&nbsp;pageEncoding="UTF-8"%&gt;<br>
<br>
然后是构建页面：<br>
<br>
＜body＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜f:view＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:panelGrid&nbsp;columns="3"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="name"&nbsp;value="帐号:"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:inputText&nbsp;id="name"&nbsp;value="#
{UMDelegater.user.name}"&nbsp;required="true"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="name"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="password"&nbsp;value="密码:"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:inputSecret&nbsp;id="password"&nbsp;value="#
{UMDelegater.user.password}"&nbsp;required="true"&nbsp;/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="password"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:panelGrid＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:panelGroup＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:commandButton&nbsp;value="登陆"&nbsp;action="#
{UMDelegater.login}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:panelGroup＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜/f:view＞<br>
&nbsp;&nbsp;＜/body＞<br>
<br>
页
面中声明了两个文本框，分别映射UMDelegater对象中user对象的name属性，和UMDelegater对象中user对象的
password属性。一旦这个表单被提交，这两个文本框的值就会被自动赋给user对象，我们只需要从user中取数据就行了，不用再去执行麻烦的
request.getParameter(“”)，更改编码，转换数据类型等操作。<br>
<br>
我们同时还声明了一个button，它与
UMDelegater对象的login方法绑定，点击该按钮，系统会执行UMDelegater.login方法，该方法从user对象中取出name
和password，和数据库中的记录进行比较。如果合法，那么就取出所有的数据，放到一个DataModel对象中，具体代码是：<br>
<br>
List&nbsp;userList=UserManager.getAllUser();//取得所有用户数据，放到一个List中<br>
DataModel&nbsp;allUser=new&nbsp;ListDataModel&nbsp;();//DataModel是一个接口，ListDataModel是它的一个实现<br>
<br>
allUsers.setWrappedData(userList);//将数据填充进去备用<br>
<br>
使
用DataModel意义何在呢？JSF中，我们可以把一个html页面上的table和一个DataModel绑定起来，这些数据会自动填充到
table中，我们不必再自己去写循环，生成若干的&lt;tr&gt;、&lt;td&gt;来生成一个table。在list.jsp中我们会看到如
何使用DataModel。<br>
<br>
放好数据之后，登陆成功的操作就完成了，返回一个login:ok，就可以重定向到list.jsp。如果用
户登陆失败，那么会返回login:fail，重定向到error.jsp，它的内容就不叙说了。下面我们看看list.jsp里面有什么，下面是它的
&lt;body&gt;代码：<br>
<br>
＜body＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜f:view＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
＜h:dataTable&nbsp;id="users"&nbsp;value="#{UMDelegater.allUsers}"&nbsp;var
="u"&nbsp;border="1"&nbsp;width="80%"&nbsp;＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜f:facet&nbsp;name="header"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:
outputText&nbsp;value="id"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/f:facet＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputText&nbsp;value="#
{u.id}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜f:facet&nbsp;name="header"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:
outputText&nbsp;value="帐号"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/f:facet＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:commandLink&nbsp;action="#
{UMDelegater.edit}"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:
outputText&nbsp;value="#{u.name}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:commandLink＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜f:facet&nbsp;name="header"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:
outputText&nbsp;value="密码"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/f:facet＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputText&nbsp;value="#
{u.password}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜f:facet&nbsp;name="header"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:
outputText&nbsp;value="权限代码"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/f:facet＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputText&nbsp;value="#
{u.power}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:dataTable＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜p＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:commandLink&nbsp;action="#{UMDelegater.addNew}
"&nbsp;value="增加用户"&nbsp;/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/p＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜/f:view＞<br>
&nbsp;&nbsp;＜/body＞<br>
<br>
我
们使用了一个h:dataTable标签，它是JSF独有的东西，它会被翻译为一个html的table，通过指定h:dataTable的value=
"#{UMDelegater.allUsers}"属性，它就与我们刚才生成的DataModel对象关联起来，数据会被自动填充。我们只需要声明
dataTable中的每一列的表头，数据来自哪个字段就可以了，如下：<br>
＜h:column＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜f:facet&nbsp;name="header"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputText&nbsp;value="id"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜/f:facet＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputText&nbsp;value="#{u.id}"/＞<br>
＜/h:column＞<br>
<br>
表格最后还有一个“增加用户”的按钮，它与UMDelegater.addNew绑定，它会把我们重定向到add.jsp。<br>
需要注意的是，每个用户名都是个超链接，点击之后可以重定向到edit.jsp，这个页面可以修改用户资料。这是通过如下代码实现的：<br>
<br>
＜h:commandLink&nbsp;action="#{UMDelegater.edit}"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputText&nbsp;value="#{u.name}"/＞<br>
＜/h:commandLink＞<br>
<br>
可
以看出，实际上系统调用了UMDelegater.edit方法，该方法的功能是根据页面传过来的用户id查询数据库，找到相关记录后返回一个User对
象，然后重定向到edit.jsp，由于我们后面编写edit.jsp的时候会把form元素与User对象绑定，所以该User对象所含有的数据会自动
显示到各个form元素上。<br>
<br>
list.jsp的显示效果如下：<br>
<br>
<img src="http://bromon.blog.com.cn/user1/1760/upload/200510276251.jpg"><br>
<br>
看
到这里你也许会问，那么我如何来美化这个表格？实际上这正式JSF这类框架面临的最大问题，它大量的使用了标签库，目前流行的网页制作工具(如
deamweaver)又没有提供足够的支持，所以只能依靠挖掘dataTable标签的各个属性，并且大量依赖css才能实现页面的美化。如果java
世界能有一个强大的JSF&nbsp;IDE，能够提供vs.net一样的能力，那么JSF也许会更容易流行。<br>
<br>
下面我们来看看edit.jsp的内容，如下：<br>
<br>
＜body＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜f:view＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
＜h:inputHidden&nbsp;id="id"&nbsp;value="#{UMDelegater.user.id}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:panelGrid&nbsp;columns="3"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="name"&nbsp;value="帐号"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:inputText&nbsp;id="name"&nbsp;value="#
{UMDelegater.user.name}"&nbsp;required="true"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="name"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="power"&nbsp;value="权限"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:inputText&nbsp;id="power"&nbsp;value="#
{UMDelegater.user.power}"&nbsp;required="true"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="power"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:panelGrid＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:panelGroup＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;＜h:commandButton&nbsp;value="保存"&nbsp;action="#
{UMDelegater.update}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:panelGroup＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜/f:view＞<br>
&nbsp;&nbsp;＜/body＞<br>
<br>
可以看出，edit.jsp并没有什么特别需要留意的，只是一个最简单的form与bean的绑定，“保存”按钮与UMDelegater.update方法绑定，它的功能是把修改后的form数据写入数据库，然后重新取一次数据，以免缓存做怪，看不到修改的效果。<br>
<br>
Add.jsp也和edit.jsp很类似，它的内容如下：<br>
<br>
＜body＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;＜f:view＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:panelGrid&nbsp;columns="3"＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="name"&nbsp;value=
"帐号:"&nbsp;/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:inputText&nbsp;id="name"&nbsp;value="#
{UMDelegater.user.name}"&nbsp;required="true"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="name"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="password"&nbsp;
value="密码:"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:inputText&nbsp;id="password"&nbsp;value
="#{UMDelegater.user.password}"&nbsp;required="true"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="password"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:outputLabel&nbsp;for="power"&nbsp;value
="权限"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:inputText&nbsp;id="power"&nbsp;value="#
{UMDelegater.user.power}"&nbsp;required="true"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:message&nbsp;for="power"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:panelGrid＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:panelGroup＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜h:commandButton&nbsp;value="保存"&nbsp;
action="#{UMDelegater.add}"/＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:panelGroup＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/h:form＞<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;＜/f:view＞<br>
&nbsp;&nbsp;＜/body＞<br>
<br>
以上代码和edit.jsp几乎相同，请大家自行阅读理解，一口气写了8页，不想再?唆了。<br>
<br>
由于最近时间很不充裕，所以JSF系列暂时打住，无限期搁置。我想这两篇文章已经能够说明很多问题，已经足够引导大家进入JSF的世界，自行研究解决其他细节。<img src ="http://www.blogjava.net/bromon/aggbug/24190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-12-16 13:02 <a href="http://www.blogjava.net/bromon/archive/2005/12/16/24190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> JSF开发实战(一)</title><link>http://www.blogjava.net/bromon/archive/2005/12/16/24189.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Fri, 16 Dec 2005 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/12/16/24189.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/24189.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/12/16/24189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/24189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/24189.html</trackback:ping><description><![CDATA[

			

			JSF开发实战(一)<br>
<br>
bromon原创&nbsp;请尊重版权<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;JSF将是J2EE5.0中所
包含的web开发框架，这应该是第一个成为jcp标准，并且随j2eesdk一起发布的web框架，可以看出sun对它的期望很高。JSF最大的竞争对手
是tapestry，是apache的产品，但是apache又弄出了个myfaces，是对jsf标准的一个实现。也许你也和我一样，在jsf和
tapestry之间犹豫很久，将来从apache的态度上应该可以看出二者的走向。在tss上有一篇比较jsf&nbsp;1.0与tapestry&nbsp;3.0的文
章，内容很扎实到位：<a href="http://www.theserverside.com/articles/article.tss?l=JSFTapestry">http://www.theserverside.com/articles/article.tss?l=JSFTapestry</a><br>
JSF的竞争对手不是struts/webwork之流，它们基本上已经是不同阶段上的东西了，放在一起比较意义不大。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;JSF
的开发流程和asp.net中所倡导的code&nbsp;behind方式很相似，核心是事件驱动，组件和标签的封装程度非常高，很多典型应用已经不需要开发者去
处理http。页面操作会被自动映射到对应的java&nbsp;bean中，后台逻辑只需要同java&nbsp;bean发生交互。整个过程是通过“依赖注入(DI)”来
实现的，看来这是目前解偶合的最佳途径啊，spring的影响真是深远。不过正式因为jsf采用了这样的方式，导致开发工作和以前的jsp/struts
等都有非常大的不同，需要一定的时间去学习。学习之前建议先对依赖注入有比较清楚的认识，可以参考我的learn&nbsp;Spring&nbsp;in&nbsp;spring系列
的第一篇。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;本系列将以两个例子来讲解jsf的基本开发，第一个例子当然是hello&nbsp;world。目前可用的jsf&nbsp;ide不
多，ibm要到06年才能放出支持jsf的wtp版本。所以我们的例子基本以手写为主，这样也能让我们有更清楚的认识，同时推荐目前最好的jsf开发工
具：myeclipse&nbsp;4.0&nbsp;GA。后面的例子将会有jsf和hibernate的内容，它都能给予很好的支持。由于myeclipse并不免费，所
以我们除了讲解在ide中如何操作外，还会叙述手动操作的具体内容，以免过于依赖开发工具。用什么服务器都可以，这里采用了jboss&nbsp;4.0.2。如果
你的服务器是高版本的tomcat(5.5+)，那么必须要删除它自带的一些包才能很好的支持jsf，具体细节请查看它的文档。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;请自行下载jsf&nbsp;ri和JSTL&nbsp;1.1。<br>
<br>
废话少说，开始了。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;在myeclipse&nbsp;4.0GA中新建一个web项目，命名为hello，为项目增加对JSTL的支持：<br>
<br>
<img src="http://blog.yam.com/bromon/94ed0325.jpg"><br>
&nbsp;<br>
在JSTL的版本中选择1.1。<br>
该操作实际上是把jstl.jar和standard.jar加到工程中。<br>
<br>
采用类似的操作为项目添加对jsf的支持：myeclipse?add&nbsp;jsf&nbsp;capabilities<br>
如图：<br>
&nbsp;<br>
<img src="http://blog.yam.com/bromon/7623ed1f.jpg"><br>
<br>
其中的jsf&nbsp;implementation是选择使用哪中JSF实现，我们采用的是sun的jsf&nbsp;ri<br>
JSF&nbsp;config&nbsp;path是配置文件的位置，保持不变<br>
URL&nbsp;pattern是jsf&nbsp;servlet的映射方式，有两种选择，具体细节后面说明。<br>
以
上操作上是为项目加入了jsf需要的jar和tld文件，并且创建了一个faces-config.xml的配置文件。涉及到的jar有：commons
-beanutils.jar&nbsp;&nbsp;&nbsp;&nbsp;commons-collections.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commons-digester.jar&nbsp;&nbsp;&nbsp;&nbsp;commons-logging.jar&nbsp;&nbsp;&nbsp;&nbsp;jsf-api.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsf-impl.jar<br>
涉及到了jsf中所有的tld文件。<br>
<br>
当前的faces-config.xml文件的内容是：<br>
&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>
&lt;!DOCTYPE&nbsp;faces-config&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;JavaServer&nbsp;Faces&nbsp;Config&nbsp;1.1//EN"&nbsp;"http://java.sun.com/dtd/web-facesconfig_1_1.dtd"&gt;<br>
<br>
&lt;faces-config&gt;<br>
<br>
&lt;/faces-config&gt;<br>
<br>
环境已经建立好了，现在我们要建立一个程序，它的功能是让用户在表单中输入名字，提交后系统会返回一个问候。使用jsf的以后好处是，开发人员会很自然的把mvc各层分开，不会像使用strtus那样别扭，这一点在后面的开发中感觉得到。<br>
<br>
首先开发model层，它是个很简单的bean：<br>
package&nbsp;org.bromon.jsf.model.hello;<br>
<br>
public&nbsp;class&nbsp;SayHello&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;say(String&nbsp;name)<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"你好,"+name;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
}<br>
<br>
在model层中你可以随意的实现业务的数据逻辑，不需要与web层有任何的关系。<br>
<br>
下面开发控制层，它负责存取web层的数据，并且调用model层的逻辑：<br>
/**<br>
&nbsp;*&nbsp;jsf的控制层方法<br>
&nbsp;*&nbsp;@author&nbsp;bromon<br>
&nbsp;*/<br>
package&nbsp;org.bromon.jsf.control.hello;<br>
<br>
import&nbsp;org.bromon.jsf.model.hello.*;<br>
<br>
public&nbsp;class&nbsp;HelloDelegater&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;//------属性---------<br>
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;name;//表单中的文本框数据会传到这里<br>
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;result;//web页会从这里取得运行结果<br>
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;SayHello&nbsp;sayHello;//model层的对象,并不事例化,由系统注入<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;//-----set/get--------<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getName()&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;name;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setName(String&nbsp;name)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SayHello&nbsp;getSayHello()&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sayHello;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSayHello(SayHello&nbsp;sayHello)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sayHello&nbsp;=&nbsp;sayHello;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getResult()&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setResult(String&nbsp;result)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.result&nbsp;=&nbsp;result;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;//-----逻辑方法---------<br>
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;say()<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setResult(sayHello.say(this.getName()));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"ok";<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
}<br>
<br>
需要注意的是，属性的名字、set/get方法的名字必须严格按照java&nbsp;bean规范编写，因为它们要被注入依赖时使用。sayHello对象并没有被实例化，它会在运行时由系统注入。<br>
<br>
这两个bean当然要在系统中申明，否则无法实现DI。在faces-config.xml文件中添加内容：<br>
&lt;managed-bean&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-name&gt;SayHello&lt;/managed-bean-name&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-class&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.bromon.jsf.model.hello.SayHello<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-bean-class&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-bean&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-name&gt;HelloDelegater&lt;/managed-bean-name&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-class&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.bromon.jsf.control.hello.HelloDelegater<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-bean-class&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-property&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property-name&gt;sayHello&lt;/property-name&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;#{SayHello}&lt;/value&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-property&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-bean&gt;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;在后一个bean中，它的sayHello属性被指定要在运行时注入一个org.bromon.jsf.model.hello.SayHello的实例。<br>
<br>
下面要编写表示层的页面，只有一个index.jsp：<br>
需要引入两个标签库：<br>
<br>
&lt;%@&nbsp;taglib&nbsp;uri="http://java.sun.com/jsf/html"&nbsp;prefix="h"&nbsp;%&gt;<br>
&lt;%@&nbsp;taglib&nbsp;uri="http://java.sun.com/jsf/core"&nbsp;prefix="f"&nbsp;%&gt;<br>
下面是构造jsf标签：<br>
<br>
&lt;body&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;f:view&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h:form&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h:panelGrid&nbsp;columns="3"&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&lt;h:outputLabel&nbsp;for="name"&nbsp;value="姓名:
"/&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h:inputText&nbsp;id="name"&nbsp;value="#{HelloDelegater.name}"&nbsp;required="true"/&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h:message&nbsp;for="name"/&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h:outputLabel&nbsp;value="#{HelloDelegater.result}"/&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/h:panelGrid&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h:panelGroup&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&lt;h:commandButton&nbsp;action="#{HelloDelegater.say}"&nbsp;
value="提交"/&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/h:panelGroup&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/h:form&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/f:view&gt;<br>
&nbsp;&nbsp;&lt;/body&gt;<br>
<br>
页
面中包含了一个文本框和一个label，他们分别被绑定到了HelloDelegater类的两个属性上，具体的绑定工作有系统通过翻转控制的方式调用对
应的set/get方式实现。提交按钮被绑定到了HelloDelegater.say方法，该方法会把计算结果赋给result属性，它会在页面中显示
出来。<br>
<br>
因为我们在url&nbsp;pattern中选择了*.faces,所以我们应该访问如下地址来查看程序:<br>
http://localhost:8080/hello/index.faces<br>
相应的,如果你选择了/faces/*,那么就应该是:<br>
http://localhost:8080/hello/faces/index.jsp<br>
<br>
程序执行结果如下：<br>
<br>
<img src="http://blog.yam.com/bromon/d3cf63f4.jpg"><img src ="http://www.blogjava.net/bromon/aggbug/24189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-12-16 13:01 <a href="http://www.blogjava.net/bromon/archive/2005/12/16/24189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss 4.0.2集群指南(二):建立JMS集群服务</title><link>http://www.blogjava.net/bromon/archive/2005/12/16/24184.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Fri, 16 Dec 2005 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/12/16/24184.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/24184.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/12/16/24184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/24184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/24184.html</trackback:ping><description><![CDATA[<p><font size="3">JBoss 4.0.2集群指南(二)</font></p>
<p align="center"><font size="3">建立JMS集群服务</font></p>
<p align="left"><font size="3">bromon原创　请尊重版权</font></p>
<p><font size="3">　　本问讲解如何在jboss 4.0.2中建立jms消息集群服务器，本文以《jboss 4.0.2集群指南》为基础，请参照阅读。（http://www.blogjava.net/bromon/archive/2005/12/16/24182.html）</font></p>
<p><font size="3">　　Jms集群的意义在于提升系统在处理消息时的并发能力，建立这样的集群，有三个步骤：</font></p>
<p><font size="3">1、&nbsp;配置jms消息持久化所使用的数据库<br>2、&nbsp;配置分布式的jndi环境<br>3、&nbsp;配置分布式jms</font></p>
<p><font size="3">　
　在jboss
4.0.2中，系统采用hibernate的方式来保存消息，所以能够兼容hibernate支持的所有数据库。Jboss默认采用hsql，在我们的例
子中，将使用oracle
9.2。首先需要配置连接到数据库的jndi数据源。方法是把doc\examples\jca下的oracle-ds.xml文件拷贝到server\
all\farm下，并且修改其中的参数，保证数据库能够正确连接。Cluster启动后，该文件能够通过jboss的farm服务，自动拷贝到其他集群
节点，并且自动部署。假设jndi数据源的名称为：GlobalDS将doc\examples\jms下的oracle-jdbc3-
service.xml文件拷贝到server\all\deploy-hasingleton\jms目录下，并且删除该目录下的hsqldb-
jdbc2-service.xml。修改oracle-jdbc3-service.xml，在56行左右指定name的值为数据源的名字：
GlobalDS。这样系统会使用该数据源来保存jms消息。</font></p>
<p><font size="3">使用如下命令启动boss:&nbsp;run –c all</font></p>
<p><font size="3">启动完成后，正常情况下会发现oracle数据库中多出了三张表：<br>1、Jms_message_log&nbsp;&nbsp;该表用于保存所有未处理的点对点消息，表结构是：<br>　　　&nbsp;Messageid &nbsp;&nbsp;消息id<br>　　　Destination&nbsp;&nbsp;目的地<br>　　　Txid&nbsp;&nbsp;&nbsp;事务id<br>　　　Txop&nbsp;&nbsp;&nbsp;消息操作类型(a为新增，d为删除)<br>　　　Messageblob&nbsp;&nbsp;消息内容</font></p>
<p><font size="3">2、JMS_REFERENCE_LOG&nbsp;用于保存所有未处理的topic消息，表结构是：<br>　　　Messageid<br>　　　Destination<br>　　　Txid<br>　　　Txop<br>　　　Messageblob<br>　　　Redelivered&nbsp;&nbsp;消息是否被重发</font></p>
<p><font size="3">3、JMS_TRANSACTION_LOG&nbsp;用于保存处理消息过程中的一些重要的事务</font></p>
<p><font size="3">　　需要注意的是，jboss 3.2之后就不在支持以文件形式保存消息，虽然这样最会比数据库操作快一倍以上。Jboss官方的解释是，使用文件会让系统不可靠。</font></p>
<p><font size="3">　
　客户端在发送jms消息的时候，首先需要向app server查询jndi，在jboss
cluster中，jndi是作为一个分布式的singleton出现的。每个节点除了有自己的jndi环境以外，整个cluster还具有一些全局的
jndi，客户端在进行jndi查询的时候，只需要向这个全局的jndi进行查询，cluster如果在全局jndi中找不到对应的jndi对象，就会按
次序向每个节点询问，看他们的本地jndi中是否有匹配的对象，如果有则返回给客户，如果所有的节点都没有，则抛出异常。所有以all方式启动的
jboss，都会打开1100端口，这个端口是全局jndi的入口，所有节点都是如此。</font></p>
<p><font size="3">　　分布式的jndi有的节点有主次的区别，第一个
启动的jboss是主服务器，它会保存所有的全局jndi，其他的节点如果收到客户查询jndi的请求后，都会向主服务器请求数据。如果主服务器不幸
down掉，那么次节点会发现这个变化，然后启动自己的jndi环境，取代主服务器提供服务。</font></p>
<p><font size="3">　　下面是配置jms的jndi，打开server\all\deploy-hasingleton\jms下的jbossmq-destinations-</font></p>
<p><font size="3">service.xml文件，增加一个名为test的destination，如下：<br><mbean code="org.jboss.mq.server.jmx.Queue">&nbsp; name="jboss.mq.destination:service=Queue,name=test"&gt;<br>&nbsp;&nbsp;&nbsp; <depends></depends></mbean></font></p>
<p><font size="3">name="DestinationManager"&gt;jboss.mq:service=DestinationManager<br>&nbsp; </font></p>
<p><font size="3">　　为了预防主服务器down了之后丢失该jndi，所以最好在每个节点都进行这个配置。</font></p>
<p><font size="3">　　在jboss 4.0.2的默认配置下，是不支持消息bean的集群的，要达到这个目的，必须下载一个jar包才能实现，可以从这里获得: <a href="http://blog.yam.com/bromon/archives/489460.html">http://blog.yam.com/bromon/archives/489460.html</a></font></p>
<p><font size="3">　　得到这个jar文件后，将它命名为cdot-jbossx.jar　文件放到server\all\deploy\jms下。下面编写消息bean，它的功能很简单，接收到来自test队列的消息后，打印消息id。</font></p>
<p><font size="3">public class TestJmsBean<br>&nbsp;&nbsp;&nbsp; implements MessageDrivenBean, MessageListener {<br>&nbsp; MessageDrivenContext messageDrivenContext;<br>&nbsp; public void ejbCreate() {<br>&nbsp;&nbsp;&nbsp; System.out.println("消息bean创建");<br>&nbsp; }</font></p>
<p><font size="3">&nbsp; public void ejbRemove() {<br>&nbsp; }</font></p>
<p><font size="3">&nbsp; public void onMessage(Message msg) {<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(msg.getJMSMessageID());<br>&nbsp;&nbsp;&nbsp; }catch(Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size="3">&nbsp; public void setMessageDrivenContext(MessageDrivenContext messageDrivenContext) {<br>&nbsp;&nbsp;&nbsp; this.messageDrivenContext = messageDrivenContext;<br>&nbsp; }<br>}</font></p>
<p><font size="3">　　把这个消息bean部署到server\all\farm目录下，它会被自动拷贝到cluster的其它节点，并且被自动部署，你会</font></p>
<p><font size="3">看到如下部署信息：</font></p>
<p><font size="3"><img src="http://blog.yam.com/bromon/2ed04320.jpg" alt="" align="bottom" border="0" hspace="0"></font></p>
<p><font size="3">　　上面显示通过farm的方式，部署了一个名为GlobalDS的连接池，以及一个名为TestJms的消息bean。</font></p>
<p><font size="3">下面写个客户端来测试一下：</font></p>
<p><font size="3">SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties p = new Properties();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.put(Context.INITIAL_CONTEXT_FACTORY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "org.jnp.interfaces.NamingContextFactory");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.put(Context.PROVIDER_URL, "172.16.0.116:1100"); // 全局jndi入口<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitialContext ctx = new InitialContext(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ConnectionFactory");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueConnection conn = qcf.createQueueConnection();</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Queue q = (Queue) ctx.lookup("queue/test");//查询名为test的destination<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueSession session = conn.createQueueSession(false,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueSession.AUTO_ACKNOWLEDGE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueSender sender = session.createSender(q);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10000; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextMessage tm = session.createTextMessage(sdf.format(new Date()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.send(tm, DeliveryMode.PERSISTENT, 4, 0);//发送持久化消息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("第" + i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.stop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();</font></p>
<p><font size="3">　　&nbsp;执行一下，可以看到每个节点都创建了若干个消息bean，同时在处理消息，任意关闭一个次服务器，系统会自动fail over。查看Jms_message_log数据表，里面没有任何数据，表示所有的消息都已经被处理。<br>&nbsp;Jboss
的jms cluster功能与websphere
mq比较起来，是非常简陋的，可以配置的地方也很少，毕竟是免费的东西。Jboss的论坛上透露，在jboss 6.0中将会有全新的jboss
messaging服务，不知要等到何年何月。针对这个cluster，我做过简单的测试，800万左右的消息数量，无一丢失，应该说还算比较可靠。响应
时间也还过的去，在简单的网络环境下，能够应付比较高的并发。</font></p>
<img src ="http://www.blogjava.net/bromon/aggbug/24184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-12-16 12:57 <a href="http://www.blogjava.net/bromon/archive/2005/12/16/24184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss 4.0.2集群指南</title><link>http://www.blogjava.net/bromon/archive/2005/12/16/24182.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Fri, 16 Dec 2005 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/12/16/24182.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/24182.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/12/16/24182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/24182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/24182.html</trackback:ping><description><![CDATA[<font size="3">JBoss 4.0.2集群指南<br><br>bromon原创 请尊重版权<br><br>&nbsp;&nbsp; &nbsp;本文主要讲解JBoss cluster的基本知识以及简单的配置方法，其间涉及了一些jboss的补充知识。<br><br>一、材料准备：<br><br>1、&nbsp;&nbsp; &nbsp;JBoss 4.0.2&nbsp;&nbsp; &nbsp;<br><br>JBoss各个版本之间差异比较大，即使同为jboss 4.x的版本，内部组件的版本也不一致，所以请尽量使用同一版本的server。目前已经证明可以配置cluster的版本多为jboss 3.2.6和jboss 4.0.2。<br><br>2、&nbsp;&nbsp; &nbsp;Apache 2.0.54<br><br>3、&nbsp;&nbsp; &nbsp;Apache mod_jk-1-2-13-apache-2-0-54<br><br>二、安装：<br><br>1、&nbsp;&nbsp; &nbsp;jboss4.0.2与apache 2.0.54的安装请自行搞定。假设jboss的安装目录为%jboss%，apache安装目录为%apache%。<br><br>2、&nbsp;&nbsp; &nbsp;mod_jk的安装。<br><br>从apache.org获得文件mod_jk-1-2-13-apache-2-0-54.so，将该文件拷贝到%apache%\ modules。<br><br>三、jboss cluster入门<br><br>&nbsp;&nbsp; &nbsp;Jboss 支持如下类型的cluster：EJB、web、JNDI、JMS，我们主要了解web cluster。<br>Web cluster实际上可以划分为两个话题：负载均衡 (load balance) 和状态同步。它们是互相独立的，单独配置。<br><br>负载均衡的概念比较简单，重要的是负载均衡的粒度。可以选择针对每个request的均衡，或者是针对每个用户的均衡。选择不同的粒度，需要不同的状态同步方式。<br><br>1、基于request的负载均衡<br><br>&nbsp;&nbsp;
&nbsp;该种方式下，负载均衡器 (load balancer)会根据各个node的状况，把每个http
request进行分发。使用这样的均衡策略，就必须在多个node之间复制用户的session，实时保持整个cluster的用户状态同步，这种操作
被称为session复制(session
replication)。Jboss的实现原理是使用拦截器(interceptor)，根据用户的同步策略拦截request，做同步处理后再交给
server产生响应。<br><br>&nbsp;&nbsp; &nbsp;该方法的优点是客户不会被绑定都具体的node，只要还有一个node存活，用户状态都不会丢失，cluster都能够继续工作。缺点是node之间通信频繁，响应速度有影响，多并发、高频操作的情况下性能下降比较厉害。<br><br>2、&nbsp;&nbsp; &nbsp;基于用户的负载均衡<br><br>该
种方式下，当用户发出第一个request后，负载均衡器动态的把该用户分配到某个节点，并记录该节点的jvm路由，以后该用户的所有request都会
被绑定这个jvm路由，用户只会与该server发生交互，这种策略被称为粘性session(session sticky)。<br><br>该方法的优点是响应速度快，多个节点之间无须通信。缺点也很明显，某个node死掉以后，它负责的所有用户都会丢失session。<br><br>四、实战<br><br>1、负载均衡<br><br>&nbsp;&nbsp; &nbsp;Jboss的负载均衡目前有两种方案，一是使用apache的mod_jk，二是使用jboss自带的负载均衡模块。下面分别讲解这两种配置。<br><br>mod_jk的配置<br><br>1、&nbsp;&nbsp; &nbsp;请确认%apache%\modules下已经有mod_jk-1-2-13-apache-2-0-54.so文件。<br>2、&nbsp;&nbsp; &nbsp;修改%apache%\conf\httpd.conf&nbsp;&nbsp; &nbsp;在文件末尾添加:&nbsp;&nbsp; &nbsp;Include conf/mod_jk2.conf<br>3、&nbsp;&nbsp; &nbsp;在%apache%\conf下新建文件&nbsp;&nbsp; &nbsp;mod_jk2.conf&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;文件内容如下：<br><br># Load mod_jk module. Specify the filename<br># of the mod_jk lib you’ve downloaded and<br># installed in the previous section<br>LoadModule jk_module modules/mod_jk-1-2-13-apache-2-0-54.so<br># Where to find workers.properties<br>JkWorkersFile conf/workers2.properties<br># Where to put jk logs<br>JkLogFile logs/mod_jk.log<br># Set the jk log level [debug/error/info]<br>JkLogLevel info<br># Select the log format<br>JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "<br># JkOptions indicate to send SSL KEY SIZE,<br>JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories<br># JkRequestLogFormat set the request format<br>JkRequestLogFormat "%w %V %T"<br>JkMount /* loadbalancer<br><br>其中JkMount /* loadbalancer的意思是，把所有的请求都发给loadbalancer处理。可以通过修改url来控制发送某些request。<br>4、在%apache%\conf下新建文件&nbsp;&nbsp; &nbsp;workers2.properties&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;其内容为：<br><br>worker.list=loadbalancer,server1,server2<br><br># Define the first node...<br>worker.server1.port=8009<br>worker.server1.host=172.16.0.116<br>worker.server1.type=ajp13<br>worker.server1.lbfactor=1<br>worker.server1.local_worker=1<br>worker.server1.cachesize=10<br><br># Define the first node...<br>worker.server2.port=8009<br>worker.server2.host=172.16.32.88<br>worker.server2.type=ajp13<br>worker.server2.lbfactor=1<br>worker.server2.local_worker=1<br>worker.server2.cachesize=10<br><br># Now we define the load-balancing behaviour<br>worker.loadbalancer.type=lb<br>worker.loadbalancer.balanced_workers=server1,server2<br>worker.loadbalancer.sticky_session=1<br><br>其
中对于node的命名规则是worker.节点名.xxxx。所以上述文件定义了两个节点：server1和server2。8009端口是jboss默
认的ajp端口，另外需要注意的是worker.server2.lbfactor参数，它是节点的负载加权，它的值越大，获得负载的机会就越大。可以根
据node的硬件性能进行调整。worker.loadbalancer.sticky_session参数是指定是否使用粘性session。<br><br>所有需要负载均衡的节点，都必须在worker.loadbalancer.balanced_workers参数中列举出来。<br><br>请记住所有node的名称和它对应着哪台机器，后面的配置中会使用。<br><br>尝试启动apache：%apache\bin\apache.exe，正常情况下没有任何提示。如果你使用的jk是2.0的，那么配置文件的写法完全不同，由于mod_jk2已经停止开发，所以apache并没有提供任何讲解，对于配置文件的编写也没有任何指导。<br><br>Jboss自带均衡器的配置<br><br>&nbsp;&nbsp;
&nbsp;将文件夹%jboss%\docs\examples\varia\loadbalancer\loadbalancer.sar拷贝到%jboss%
\server\all\deploy下，并且修改loadbalancer.sar\loadbalancer.sar\META-INF\jboss
-service.xml，在&lt;host&gt;标签中类出所有节点，在&lt;sticky-session&gt;标签中指定是否使用粘性
session。配置完成。<br><br>&nbsp;&nbsp; &nbsp;该均衡器的缺点是负载能力相对不高，配置参数太少，比如无法指定不同节点的负载加权，所以后面都以mod_jk为例，不再讲解jboss自带的负载均衡器的内容。<br>&nbsp;<br><br>&nbsp;&nbsp; &nbsp;负载均衡的配置基本完成，启动jboss，其中过程中会列出DefaultPatition中所有的节点：<br>run.bat&nbsp; -c all<br><br><img src="http://www.linuxfans.org/nuke/modules/Forums/files/1_195.jpg" alt=""><br><br>任何节点的关闭与启动都会在cluster中广播，比如加如一个新节点后，其他节点会得到提示<br><br>2、session sticky配置<br><br>&nbsp;&nbsp;
&nbsp;apache应该会以粘性session的方式分发请求。部署一个应用测试一下，你会发现粘性session没有起作用。因为我们还没有给jboss配
置jvm路由( jvmRoute)，apache就无法知道究竟哪些session是属于哪个节点的。我们继续往下：<br><br>&nbsp;&nbsp; &nbsp;修改server1机器上的jboss的配置文件：%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ META-INF\ jboss-service.xml<br><br>&nbsp;&nbsp; &nbsp;在110行有：&lt;attribute name="UseJK"&gt;false&lt;/attribute&gt;，将它改为true。值得注意的是在这行标签上面有一段注释，要求你在server.xml中必须有：<br>Engine name="jboss.web" jmvRoute="Node1" defaultHost="localhost"<br><br>&nbsp;&nbsp;
&nbsp;请注意这里有一个气死人不偿命的小bug，jboss的官方文档把
jvmRoute写成了jmvRoute，就是v和m两个字母的颠倒让我郁闷了三天，翻遍了jboss.com和theserverside.com。都
是直接拷贝的错，吐血吐到脱水啊。<br><br>&nbsp;&nbsp; &nbsp;下面需要修改server1上的%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ server.xml，在32行左右有：<br><br>&lt;Engine name="jboss.web" defaultHost="localhost"&gt;<br><br>给它增加一个jvmRoute属性：<br><br>&lt;Engine jvmRoute="server1" name="jboss.web" defaultHost="localhost"&gt;<br><br>请注意，jvmRoute的值必须和mod_jk中的节点名字正确对应，否则无法正确路由。Cluster中的所有节点都应该做相应的配置。<br><br>Jboss的配置完成了，下面需要在你的web应用中修改配置文件，让它支持集群。<br><br>在WEB-INF\web.xml中加入属性：&nbsp;&nbsp; &nbsp;&lt;distributable/&gt;<br><br>Ok，基于用户的cluster完成了，每个用户会绑定都某个节点上进行交互。这种绑定是如何完成的呢？原来apache把客户分发到节点后，该节点会在用户的session id后面加上此节点的路由名称，变成这个样子：<br><br>Efdfxxd98daja87daj76da2dka**,server1<br><br>&nbsp;&nbsp; &nbsp;有了这个标志，就能分辨该session属于哪个节点。<br><br>3、session replication配置<br><br>&nbsp;&nbsp;
&nbsp;下面要做的是基于request的cluster，也就让各个节点之间互相复制session状态。有两种复制模式，同步与异步。使用同步的方式，
jboss会把session复制的操作和对request的响应放到一个应用事务(application
transaction)，session复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request，
session复制则会稍有延迟。但是在多框架的web页面中，这样的集群方式会有问题。由于frame在同一时间发出多个request，会造成一些混
乱，这也是采用基于用户的集群方式的原因之一。<br><br>&nbsp;&nbsp; &nbsp;JBoss 4.0.2中采用了Jboss
cache来实现session复制，实际上就是一个分布式缓存，由于session id中包含了jvm
route，所以能够分辨session属于哪个节点。Session的更新类似于hibernate中的乐观锁，有了更新之后就让session的版本
号增加，其他节点通过对比版本号来决定是否同步session状态。<br><br>&nbsp;&nbsp; &nbsp;配置session replication首先需要编辑<br>%jboss% server\all\deploy\jbossweb-tomcat55.sar\META-INF\ jboss-service.xml，88行左右有：<br>&lt;attribute name="SnapshotMode"&gt;instant&lt;/attribute&gt;<br>这
就是刚才提到的复制模式，instant为立即复制，如果设为interval
那么系统会在延迟一段时间再进行复制，时间长度在&lt;attribute
name="SnapshotInterval"&gt;2000&lt;/attribute&gt;中指定，单位是毫秒。<br><br>单独配置这一个地方还不够，在%jboss% server\all\deploy\ tc5-cluster-service.xml中有：<br><br>&lt;attribute name="CacheMode"&gt;REPL_ASYNC&lt;/attribute&gt;<br><br>这里才真正决定复制是同步的还是异步的，可以指定为REPL_ASYNC(异步)或者REPL_SYNC(同步)。<br><br>在
这个文件下面一点，还有一个config标签，里面指定了各个节点在进行session复制的时候如何通信，有udp和tcp两种可选，如果使用udp方
式，那么应该将udp的lookback属性指定为true，因为windows上有一个叫做media sense的东西会影响udp
multicast。注意如果你不了解multi
address的ip规则，请不要随便修改mcast_addr的值。如果采用tcp方式的话，应该指定bind_addr的值为本机ip，并且在
TCPPING标签的initial_hosts属性中列出所有节点，格式是”机器名[端口号]”，比如在我们的例子中，就应该这样配置tcp(以其中一
个节点为例)：<br><br>&lt;config&gt;<br>&lt;TCP bind_addr="172.16.0.116" start_port="7810" loopback="true"/&gt;<br>&lt;TCPPING initial_hosts="172.16.0.116[7810],172.16.32.88[7810]" port_range="3" timeout="3500"<br>num_initial_members="3" up_thread="true" down_thread="true"/&gt;<br>&lt;MERGE2 min_interval="5000" max_interval="10000"/&gt;<br>&lt;FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" /&gt;<br>&lt;VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retransmit_timeout="3000"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false"<br>print_local_addr="true" down_thread="true" up_thread="true"/&gt;<br>&lt;pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/&gt;<br>&lt;/config&gt;<br><br>&nbsp;&nbsp; &nbsp;JBoss的clustering版主建议尽量使用udp。不过在Sobey内部，建议使用tcp方式，经测试可能有不明物体在影响udp通信，导致Timeout异常。<br><br>&nbsp;&nbsp;
&nbsp;在%jboss%\ server\all\deploy\
cluster-service.xml中也有关于udp和tcp的配置信息，在4.0以前版本的jboss中，会以这个文件为主配置，4.0以后都以
tc5-cluster-service.xml为主配置。<br><br>&nbsp;&nbsp; &nbsp;Jboss的配置完成了，最后需要在web应用中增加配置信息，控制session复制的粒度。在WEB-INF\&nbsp;&nbsp; &nbsp;jboss-web.xml中增加以下内容：<br><br>&lt;replication-config&gt;<br>&nbsp;&nbsp;&nbsp; &lt;replication-trigger&gt;SET_AND_NON_PRIMITIVE_GET&lt;/replication-trigger&gt;<br>&nbsp;&nbsp;&nbsp; &lt;replication-granularity&gt;SESSION&lt;/replication-granularity&gt;<br>&nbsp; &lt;/replication-config&gt;<br><br>其中replication-trigger是指定哪些操作引发session的版本更新，它的取值有：<br><br>SET_AND_GET&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>SET_AND_NON_PRIMITIVE_GET<br>SET<br><br>replication-granularity是复制粒度，可以取session或attribute。如果取为attribute有可能导致复制失败，这是目前版本的jboss cache的一个bug，等待修正。<br><br>部署项目，测试，如果配置没有问题，可以在%jboss%\0server\all\log\server.log中发现类似于这样的信息：<br><br>DEBUG
[org.jboss.web.tomcat.tc5.session.JBossCacheManager] check to see if
needs to store and replicate session with id
Im9-qpuaXppMS+xXwE3M+Q**.server1 <br><br>DEBUG
[org.jboss.web.tomcat.tc5.session.ClusteredSession]
processSessionRepl(): session is dirty. Will increment version from: 20
and replicate.<br><br>&nbsp;&nbsp; &nbsp;Session replication配置的成功率比较低，情况也很复杂，请仔细操作。<br><br>五、分布式热部署(distributable hot deploy)<br><br>&nbsp;&nbsp;
&nbsp;在一个节点很多的cluster中，如果部署应用的时候必须把程序文件拷贝到每个机器上的话，那实在太愚蠢了，幸好通过all启动的jboss自动支持
分布式热部署。把支持cluster的应用（通常需要打包成war文件），放到%jboss%\server\all\farm下，那么处于同一
cluster中的其他节点会自动下载并且部署，jboss把这个称为Farm deploy。如下图：<br><br><img src="http://www.linuxfans.org/nuke/modules/Forums/files/farm.jpg" alt=""><br><br>End 2005-7-11 Released by bromon</font><img src ="http://www.blogjava.net/bromon/aggbug/24182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-12-16 12:56 <a href="http://www.blogjava.net/bromon/archive/2005/12/16/24182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tips of  hibernate +weblogic 8.1 + oracle 9.2 / db2 8.1</title><link>http://www.blogjava.net/bromon/archive/2005/07/11/7511.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 11 Jul 2005 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/07/11/7511.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/7511.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/07/11/7511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/7511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/7511.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US><FONT face="Times New Roman">Tips of<SPAN style="mso-spacerun: yes">  </SPAN>hibernate +weblogic 8.1 + oracle 9.2 / db2 8.1</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US><FONT face="Times New Roman"></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US><FONT face="Times New Roman">bromon原创 请尊重版权</FONT></SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近的工作都是在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">webligc 8.1 + hibernate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的平台上做开发，涉及的数据库是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle 9.2</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">db2 8.1</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。对于这两个数据库我的了解都远远不够，所以开发中遇到很多问题，还好问题都解决了，很感谢阿古。有的问题也许大家都会遇到，列出我的解决办法，供大家参考。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-bidi-font-family: 宋体"><SPAN style="mso-list: Ignore">一、</SPAN></SPAN><SPAN lang=EN-US>weblogic 8.1</SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的数据库连接池配置</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face="Times New Roman">weblogic 8.1</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下配置连接池是很容易的，通过</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">console</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全鼠标操作。以前我做过很多次了，驾轻就熟，很快搞定。编写好</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">pojo</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">hbm</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">test</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一下，结果抛出了一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">SQLException</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，具体信息我没有记录，大概意思是说：“事务没有被提交，因为它处于一个分布式事务中，当分布式事务结束后它会被提交。”打开</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，确实没有看到测试数据，整个环境中我没有使用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">JTA</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也不存在分布式数据库。</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Google</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了一下，看见别人的建议有：</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo2; tab-stops: list 57.75pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT face="Times New Roman">1、<SPAN style="FONT: 7pt 'Times New Roman'">              </SPAN></FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">jdbc</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">驱动的时候，不要使用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">xa</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列驱动。这个其实大家都知道，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">xa</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列驱动是为</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">JTA</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准备的，我在配置连接池的时候也确实没有选择这类驱动。排除。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo2; tab-stops: list 57.75pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT face="Times New Roman">2、<SPAN style="FONT: 7pt 'Times New Roman'">              </SPAN></FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">startWeblogic.cmd</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不要启动</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">pointbase</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。查看</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">startWeblogic.cmd</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后没有发现有启动</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">pointbase</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的迹象，在端口列表中也没有发现。排除。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后来找到的解决办法是，配置</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">webloigc</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">data source</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，有这么一个选项：</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN class=dialog-label><SPAN lang=EN-US><FONT face="Times New Roman">Honor Global Transactions </FONT></SPAN></SPAN><SPAN class=dialog-label><SPAN lang=EN-US></P></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN class=dialog-label><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它的相关说明是：</SPAN><SPAN lang=EN-US> </SPAN></SPAN><SPAN class=dialog-label><SPAN lang=EN-US></P></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN class=dialog-help><SPAN lang=EN-US><FONT face="Times New Roman">Specifies whether this data source will participate in existing global (XA) transactions. Unchecking this option while creating the data source should be done rarely and with care. This option can not be changed once the data source is created. </FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN lang=EN-US></P></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN class=dialog-help><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">       </FONT></SPAN></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是它了，把它去掉，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">try again</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">passed</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US> <BR><BR></SPAN></SPAN><SPAN class=dialog-help><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">       </FONT></SPAN></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述问题在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">db2</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中都存在。</SPAN><SPAN lang=EN-US> </SPAN></SPAN><SPAN class=dialog-help><SPAN lang=EN-US></P></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN class=dialog-help><SPAN lang=EN-US style="mso-bidi-font-family: 宋体"><SPAN style="mso-list: Ignore"><FONT face="Times New Roman">二、</FONT></SPAN></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时间字段的处理</SPAN><SPAN lang=EN-US> </SPAN></SPAN><SPAN class=dialog-help><SPAN lang=EN-US></P></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发过程中涉及到了时间的存储和查询，相关的处理要依靠</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">db2</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己的函数，有小小区别。</SPAN><SPAN lang=EN-US> </SPAN></SPAN><SPAN class=dialog-help><SPAN lang=EN-US></P></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">hibernate</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中对</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN></SPAN><SPAN class=dialog-help><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行时间查询的例子</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">: 
<P></P></FONT></SPAN></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">from scene.pojo.TaskInfo as ti where and ti.taskStartTime>=to_date('"+start+"','yyyy-MM-dd HH:mi:ss') and ti.taskEndTime<=to_date('"+end+"','yyyy-MM-dd HH:mi:ss')";</FONT></SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">start</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">end</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量为</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">java.util.Date()</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。使用了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">to_date</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数来做日期转换，很多</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">java</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序员也许会和我一样，直觉的采用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”yyyy-MM-dd HH:mm:ss”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的格式作为时间的正则表达式，但是在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中会引起错误：</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”ORA 01810 </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式代码出现两次</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。原因是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">sql</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中不区分大小写，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">MM</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">mm</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被认为是相同的格式代码，所以</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">oracle</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">sql</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">mi</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代替分钟。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">       </SPAN>DB2</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的查询语句是：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">from scene.pojo.TaskInfo as ti where and ti.taskStartTime>=timestamp('"+s+"') <SPAN style="mso-spacerun: yes"> </SPAN>and ti.taskEndTime<=timestamp('"+e+"')";</FONT></SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">       </SPAN>DB2</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的函数是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">timestamp</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，无须指定时间格式。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-bidi-font-family: 宋体"><SPAN style="mso-list: Ignore">三、</SPAN></SPAN><SPAN lang=EN-US>Hibernate</SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lazy loading</FONT></SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face="Times New Roman">Lazy loading</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是进行集合映射时很有用处的优化选项，但是使用起来容易遇到问题。比如在我们的应用中，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">user->post</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">形成一对多的映射，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">User</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中有一个包含</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">post</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">List</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。同时系统采用了一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">HibernateSession</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来管理</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，它的逻辑是每进行一次数据库操作，就开新的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，操作完成后立即关闭该</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这样做的好处是可以严格关闭</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，避免菜鸟级的错误，但是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">hibernate.org</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并不推荐这么做。因为这不适合</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lazy loading</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也不适合跨方法的事务。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回到我们的例子，在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">User</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，有多个属性：</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">name</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">password</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">phone</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等，还有一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">List</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">posts</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。当我们对</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">posts</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lazy laoding</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">hibernate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会在获得</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">User</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的时候，仅仅返回</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">name,password,phone</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等基本属性，当你访问</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">posts</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候，它才会从数据库中提取</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">posts</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要的数据，这就是所谓</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lazy laoding</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。但是在我们的系统中，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是被立即关闭的，也就是在读取了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">name,password,phone</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等基本属性后，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">close</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了，再进行</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lazy loaiding</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会有异常。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解决办法是在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">close session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前，调用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Hibernate.initialize(user.getPosts())</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，告诉系统，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">user.getPosts()</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是需要</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lazy laoding</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。但是这样做会破坏</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">HibernateSession</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的封装，郁闷。</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后来采用所谓的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">OpenSessionInView</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式，把</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的周期交给</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">servlet filter</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来管理，每当有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">request</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进来，就打开一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">response</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结束之后再关闭它，这样可以让</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存在于整个请求周期中。但是在实际操作过程中，发现一下问题：</SPAN><SPAN lang=EN-US></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face="Times New Roman">Lazy laoding</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应该是两条</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">select</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构成的，但是在使用了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">OpenSessionInView</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式后，系统执行了一条</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">select</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">session</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就被关闭了。相同的代码，放到普通环境中，就执行正常，目前这个问题已经在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">java eye</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">挂了很久，无人解答。望高人指点。</SPAN></P><img src ="http://www.blogjava.net/bromon/aggbug/7511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-07-11 17:31 <a href="http://www.blogjava.net/bromon/archive/2005/07/11/7511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Learn Spring in spring(四)</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2552.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2552.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2552.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2552.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 四、Spring中的事务控制Bromon原创　请尊重版权&nbsp;&nbsp;&nbsp;&nbsp; Spring和EJB一样，提供了两种事务管理方式：编程式和声明式。在考试系统中我们将使用声明式的事务管理，这是spring推荐的做法。使用这种方式可以体验到spring的强大便捷，而且我们无须在Dao类中编写任何特殊的代码，只需要通过配置文件就可以让普通的java类加载到事务管理中，这...&nbsp;&nbsp;<a href='http://www.blogjava.net/bromon/archive/2005/03/28/2552.html'>阅读全文</a><img src ="http://www.blogjava.net/bromon/aggbug/2552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 14:19 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Learn Spring in spring(三)</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2551.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2551.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2551.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2551.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 三、spring中的hibernate开发Bromon原创 请尊重版权　　spring中对hibernate的支持是非常强大的，从一个简单的例子就看得出来，从这个例子中我们还将对所谓的轻量级容器做一些讨论。　　首先需要配置数据源，通常我们有两种方式获得Connection，一是自己编写代码获得连接，二是从JNDI环境中得到DataSource，然后产生一个Conne...&nbsp;&nbsp;<a href='http://www.blogjava.net/bromon/archive/2005/03/28/2551.html'>阅读全文</a><img src ="http://www.blogjava.net/bromon/aggbug/2551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 14:14 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Learn Spring in spring(一)</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2550.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2550.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2550.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2550.html</trackback:ping><description><![CDATA[<H3 class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、</SPAN><SPAN lang=EN-US>spring</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理对象的简单例子</SPAN></H3>
<H3 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN>&nbsp;</H3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>Bromon原创 请尊重版权</FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">任何需要交给</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理的对象，都必须在配置文件中注册，这个过程被称为</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">wiring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，下面做一个最简单的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Hello world</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">演示，我们将要注册的类如下：</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Code>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_23_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_23_Open_Text.style.display='none'; Codehighlighter1_0_23_Closed_Image.style.display='inline'; Codehighlighter1_0_23_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_23_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_23_Closed_Text.style.display='none'; Codehighlighter1_0_23_Open_Image.style.display='inline'; Codehighlighter1_0_23_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_23_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_23_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;创建日期&nbsp;2005-3-22<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;org.bromon.spring.test;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_58_84_Open_Image onclick="this.style.display='none'; Codehighlighter1_58_84_Open_Text.style.display='none'; Codehighlighter1_58_84_Closed_Image.style.display='inline'; Codehighlighter1_58_84_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_58_84_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_58_84_Closed_Text.style.display='none'; Codehighlighter1_58_84_Open_Image.style.display='inline'; Codehighlighter1_58_84_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_58_84_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_58_84_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;Bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;HelloTalker&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_114_190_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_190_Open_Text.style.display='none'; Codehighlighter1_114_190_Closed_Image.style.display='inline'; Codehighlighter1_114_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_114_190_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_190_Closed_Text.style.display='none'; Codehighlighter1_114_190_Open_Image.style.display='inline'; Codehighlighter1_114_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_114_190_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_114_190_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;greeting()<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_150_188_Open_Image onclick="this.style.display='none'; Codehighlighter1_150_188_Open_Text.style.display='none'; Codehighlighter1_150_188_Closed_Image.style.display='inline'; Codehighlighter1_150_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_150_188_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_150_188_Closed_Text.style.display='none'; Codehighlighter1_150_188_Open_Image.style.display='inline'; Codehighlighter1_150_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_150_188_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_150_188_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello&nbsp;world</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后我们来编写一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置文件，文件名任意，在我这里它是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">springConfig.xml</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，需要注意的是这个文件应该存放在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">classpath</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所包含的路径中：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN class=Code><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "</FONT><A href="http://www.springframework.org/dtd/spring-beans.dtd"><FONT color=#000080 size=4>http://www.springframework.org/dtd/spring-beans.dtd</FONT></A><FONT size=4>"&gt;<BR>&lt;beans&gt;<BR>&nbsp;&lt;bean id=”helloTalker” class=” org.bromon.spring.test.HelloTalker”&gt;<BR>&nbsp;&lt;/bean&gt;<BR>&lt;/beans&gt;</FONT></SPAN></SPAN><BR></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>　　</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><FONT size=4>通过使用</FONT><SPAN lang=EN-US><FONT size=4>bean标签，注册了一个HelloTalker对象，它的名字叫做helloTalker。然后我们编写一个测试类，它的工作是利用spring框架提供的接口，加载配置文件，通过指定对象的id，获得一个对象。它的代码如下： </FONT>
<P><FONT size=4></FONT></P></SPAN></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Code>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_23_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_23_Open_Text.style.display='none'; Codehighlighter1_0_23_Closed_Image.style.display='inline'; Codehighlighter1_0_23_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_23_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_23_Closed_Text.style.display='none'; Codehighlighter1_0_23_Open_Image.style.display='inline'; Codehighlighter1_0_23_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_23_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_23_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;创建日期&nbsp;2005-3-17<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;org.bromon.spring.test.junit;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.io.FileInputStream;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.springframework.beans.factory.xml.XmlBeanFactory;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.springframework.context.ApplicationContext;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.bromon.spring.test;<BR><IMG id=Codehighlighter1_322_346_Open_Image onclick="this.style.display='none'; Codehighlighter1_322_346_Open_Text.style.display='none'; Codehighlighter1_322_346_Closed_Image.style.display='inline'; Codehighlighter1_322_346_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_322_346_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_322_346_Closed_Text.style.display='none'; Codehighlighter1_322_346_Open_Image.style.display='inline'; Codehighlighter1_322_346_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_322_346_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_322_346_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;Bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_398_748_Open_Image onclick="this.style.display='none'; Codehighlighter1_398_748_Open_Text.style.display='none'; Codehighlighter1_398_748_Closed_Image.style.display='inline'; Codehighlighter1_398_748_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_398_748_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_398_748_Closed_Text.style.display='none'; Codehighlighter1_398_748_Open_Image.style.display='inline'; Codehighlighter1_398_748_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TestStudentManager&nbsp;extends&nbsp;TestCase&nbsp;</SPAN><SPAN id=Codehighlighter1_398_748_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_398_748_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testHelloTalker()&nbsp;<BR><IMG id=Codehighlighter1_439_746_Open_Image onclick="this.style.display='none'; Codehighlighter1_439_746_Open_Text.style.display='none'; Codehighlighter1_439_746_Closed_Image.style.display='inline'; Codehighlighter1_439_746_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_439_746_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_439_746_Closed_Text.style.display='none'; Codehighlighter1_439_746_Open_Image.style.display='inline'; Codehighlighter1_439_746_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_439_746_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_439_746_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_461_665_Open_Image onclick="this.style.display='none'; Codehighlighter1_461_665_Open_Text.style.display='none'; Codehighlighter1_461_665_Closed_Image.style.display='inline'; Codehighlighter1_461_665_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_461_665_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_461_665_Closed_Text.style.display='none'; Codehighlighter1_461_665_Open_Image.style.display='inline'; Codehighlighter1_461_665_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_461_665_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_461_665_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;context&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ClassPathXmlApplicationContext(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">springConfig.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>HelloTalker&nbsp;ht</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(HelloTalker)context.getBean(“helloTalker”);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(ht.greeting());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_694_739_Open_Image onclick="this.style.display='none'; Codehighlighter1_694_739_Open_Text.style.display='none'; Codehighlighter1_694_739_Closed_Image.style.display='inline'; Codehighlighter1_694_739_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_694_739_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_694_739_Closed_Text.style.display='none'; Codehighlighter1_694_739_Open_Image.style.display='inline'; Codehighlighter1_694_739_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_694_739_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_694_739_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个程序就完成了，因为只有一个对象</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">HelloTalker</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被注册到了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，所以不存在对象间的依赖，当然也就不涉及依赖注入。下面演示一个简单的依赖注入：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4></FONT>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一步是修改</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">HelloTalker</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，增加一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">String name</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Code><SPAN lang=EN-US><FONT face="Times New Roman" size=4>public String name;</FONT></SPAN></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为该属性编写</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">set</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，该方法必须严格遵守</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">javabean</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的命名规则：</SPAN></FONT></P><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Code>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>public void setName(String name)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>{</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>this.name=name;</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>}</FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman" size=4>
<P></P></FONT></SPAN>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">greeting</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法：</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Code>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>public String greeting()</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>{</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>return "hello "+name;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>}</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></SPAN></FONT></SPAN><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman"><BR><FONT size=4>　　</FONT></FONT></SPAN></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如你所见，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">name</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性没有初试化，因为它的值将在运行过程中被</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态注射入。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"> 
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　第二步，修改</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">springConfig.xml</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中唯一的这个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">bean</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置：</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><SPAN class=Code>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">&lt;bean id=</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-ascii-font-family: 宋体; mso-font-kerning: 0pt"><FONT face="Times New Roman">”</FONT></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">helloTalker</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-ascii-font-family: 宋体; mso-font-kerning: 0pt"><FONT face="Times New Roman">”</FONT></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> class=</SPAN><FONT face="Times New Roman"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-ascii-font-family: 宋体; mso-font-kerning: 0pt">”</SPAN><SPAN lang=EN-US> org.bromon.spring.test.HelloTalker</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-ascii-font-family: 宋体; mso-font-kerning: 0pt">”</SPAN></FONT></FONT><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><FONT size=4>&gt; </FONT>
<P><FONT size=4></FONT></P></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>&lt;property name=</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-ascii-font-family: 宋体; mso-font-kerning: 0pt"><FONT face="Times New Roman">”</FONT></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">name</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-ascii-font-family: 宋体; mso-font-kerning: 0pt"><FONT face="Times New Roman">”</FONT></SPAN></FONT><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><FONT size=4>&gt; </FONT>
<P><FONT size=4></FONT></P></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><FONT size=4><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>&lt;value&gt;bromon&lt;/value&gt; </FONT>
<P><FONT size=4></FONT></P></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><FONT size=4><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>&lt;/property&gt; </FONT>
<P><FONT size=4></FONT></P></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><FONT size=4>&lt;/bean&gt;</FONT></SPAN></P></SPAN></SPAN>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman">　　</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改完成。我们将一个名字</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”bromon”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写死在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">springConfig.xml</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，它会被动态的注入到</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">HelloTalker</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">name</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性中，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">greeting</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法将会把它打印出来。重新运行刚才的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">junit</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，可以看到结果。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们只演示了如何注入一个最简单的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">String</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，实际上我们可以注入任何值类型，也可以注入任何类的实例，也可以注入</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">List</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Map</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Properties</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。配置文件管理了所有的对象和对象间的关系，而对象则只负责执行自己的功能，他们的职责越少，藕合度越低，系统就越容易测试，管理维护也更容易。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">&lt;bean&gt;</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标签还有很多属性，用于指定对象如何被实例化，它也有很多子标签用于配置对象的属性，请大家参考相关的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DTD</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和文档，能够很快的掌握。本系列文章不是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">手册，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的基础知识请参考</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring in action</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，足够详细准确。后面的章节更多的讨论系统设计、开发的一些细节和高级特性。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下一篇：在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中进行</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">hibernate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发</SPAN></FONT></P><img src ="http://www.blogjava.net/bromon/aggbug/2550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 14:09 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Learn Spring in spring(一)</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2549.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2549.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2549.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2549.html</trackback:ping><description><![CDATA[<SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Title><SPAN lang=EN-US><FONT face="Times New Roman">
<H3 align=center><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN class=Title><SPAN lang=EN-US><FONT face="Times New Roman">Learn Spring in spring(一)</FONT></SPAN></SPAN></FONT></SPAN></H3></FONT></SPAN></SPAN></FONT></SPAN>
<P class=MsoTitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman" size=4>Bromon原创 请尊重版权</FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT face="Times New Roman">　　</FONT>当前的形势是，非常多的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Java</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序员言必称</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如此大面积的程序员集体叫</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">春</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，体现了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架的威力。春天正是叫春的好时候，你我一起来叫春吧。</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">^_^</FONT></SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">　　</SPAN>Spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计目的是简化</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">J2EE</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发，所以如果我们学习、使用它的时候还需要抓破头皮口吐白沫的话，岂不是个笑话？就我的经验来说，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这方面做得很好，的确是一个很牛叉易用的框架。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前我曾经设计过一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">J2EE</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的考试系统，大量使用了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">EJB</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（详见</SPAN><SPAN lang=EN-US><A href="http://blog.csdn.net/bromon/archive/2004/08/27/86291.aspx"><FONT face="Times New Roman" color=#000080>http://blog.csdn.net/bromon/archive/2004/08/27/86291.aspx</FONT></A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），我打算同样使用一个考试系统做例子，便于比较。两个系统的大致结构都差不多，不过新的版本采用了轻量级的方案，使用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Hibernate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ORM</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架，所有的对象都交给</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来管理。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">IoC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DI</FONT></SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先想说说</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">IoC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Inversion of Control</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，控制倒转）。这是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的核心，贯穿始终。所谓</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">IoC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，对于</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架来说，就是由</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来负责控制对象的生命周期和对象间的关系。这是什么意思呢，举个简单的例子，我们是如何找女朋友的？常见的情况是，我们到处去看哪里有长得漂亮身材又好的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">mm</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后打听她们的兴趣爱好、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">qq</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">号、电话号、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ip</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">号、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">iq</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">号</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">………</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，想办法认识她们，投其所好送其所要，然后嘿嘿</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">……</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个过程是复杂深奥的，我们必须自己设计和面对每个环节。传统的程序开发也是如此，在一个对象中，如果要使用另外的对象，就必须得到它（自己</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">new</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个，或者从</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">JNDI</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中查询一个），使用完之后还要将对象销毁（比如</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等），对象始终会和其他的接口或类藕合起来。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那么</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">IoC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是如何做的呢？有点像通过婚介找女朋友，在我和女朋友之间引入了一个第三者：婚姻介绍所。婚介管理了很多男男女女的资料，我可以向婚介提出一个列表，告诉它我想找个什么样的女朋友，比如长得像李嘉欣，身材像林熙雷，唱歌像周杰伦，速度像卡洛斯，技术像齐达内之类的，然后婚介就会按照我们的要求，提供一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">mm</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我们只需要去和她谈恋爱、结婚就行了。简单明了，如果婚介给我们的人选不符合要求，我们就会抛出异常。整个过程不再由我自己控制，而是有婚介这样一个类似容器的机构来控制。</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所倡导的开发方式就是如此，所有的类都会在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容器中登记，告诉</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你是个什么东西，你需要什么东西，然后</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会在系统运行到适当的时候，把你要的东西主动给你，同时也把你交给其他需要你的东西。所有的类的创建、销毁都由</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来控制，也就是说控制对象生存周期的不再是引用它的对象，而是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。对于某个具体的对象而言，以前是它控制其他对象，现在是所有对象都被</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控制，所以这叫控制反转。如果你还不明白的话，我决定放弃。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">　　</SPAN>IoC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个重点是在系统运行中，动态的向某个对象提供它所需要的其他对象。这一点是通过</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DI</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Dependency Injection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，依赖注入）来实现的。比如对象</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要操作数据库，以前我们总是要在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中自己编写代码来获得一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，有了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们就只需要告诉</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中需要一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，至于这个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">怎么构造，何时构造，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不需要知道。在系统运行时，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会在适当的时候制造一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后像打针一样，注射到</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当中，这样就完成了对各个对象之间关系的控制。</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要依赖</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">才能正常运行，而这个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是由</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注入到</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">A</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的，依赖注入的名字就这么来的。那么</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DI</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是如何实现的呢？</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Java 1.3</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之后一个重要特征是反射（</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">reflection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是通过反射来实现注入的。关于反射的相关资料请查阅</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">java doc</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">　　</FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">理解了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">IoC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DI</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的概念后，一切都将变得简单明了，剩下的工作只是在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的框架中堆积木而已。</SPAN></FONT><SPAN lang=EN-US><FONT face="Times New Roman"></P>
<P><FONT size=4></FONT></P></FONT></SPAN>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下一篇：</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理对象的简单例子</SPAN></FONT></P><img src ="http://www.blogjava.net/bromon/aggbug/2549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 14:06 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JFreeChart制作图形报表</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2548.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2548.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2548.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2548.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用JFreeChart制作图形报表Bromon原创 请尊重版权一、需求分析我家领导认为，在是否嫁给我做老婆的问题上，应该有更加科学的决策模型。如果能够将每天的感情生活量化，且以时间为X轴，生成数据报表，就可以为她的决策提供数据支持。秉着以领导意志为导向的基本原则，开发了本软件，为家庭信息化建设提供新的思路。二、系统概述...&nbsp;&nbsp;<a href='http://www.blogjava.net/bromon/archive/2005/03/28/2548.html'>阅读全文</a><img src ="http://www.blogjava.net/bromon/aggbug/2548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 14:05 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Eclipse开发Hibernate应用程序</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2547.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2547.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2547.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2547.html</trackback:ping><description><![CDATA[<H3 class=postcolor align=center>利用Eclipse开发Hibernate应用程序</H3>
<DIV class=postcolor align=left><BR><FONT size=4>bromon原创 请尊重版权<BR><BR>　　Eclipse是目前非常流行的开发平台，开放扩展的架构让很多程序员找到了自己个性化的工作环境，Hibernate也是目前牛叉得不得了的框架，至少在EJB 3大行其道之前，它是我们在考虑OR映射时非常好的选择。本文主要介绍如何利用Hibernate Syn插件在Eclipse 3.0.1中快速的开发Hibernate应用程序，提高我们的工作效率。关于Hibernate框架的细节，本文不做过多的讨论，请参考相关资料，推荐《Hibernate in action》一书。<BR><BR>　　首先需要安装这个插件，Eclipse 3.0.1为我们提供了更加方便的插件管理方式，选择菜单“<B>帮助—软件更新—查找并安装</B>”（本人的Eclipse使用了语言抱汉化，请英文界面用户自行对照），选择“<B>搜索要安装的新功能部件</B>”，操作界面如下：<BR><BR><IMG onmousewheel="return bbimg(this)" style="WIDTH: 524px; CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://www.linuxbyte.net/bbs/uploads/post-22-1100511647.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　选择“<B>新建远程站点</B>”，填写名称“Hibernate plugin”，下面的URL中填入：<B>http://www.binamics.com/hibernatesync</B><BR>如下图：<BR><BR><IMG onmousewheel="return bbimg(this)" style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://www.linuxbyte.net/bbs/uploads/post-22-1100511670.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　然后在“<B>安装</B>”界面中选中我们刚添加的“Hibernate plugin”，一路Next，Eclipse就可以自己下载完成安装，然后Eclipse自动重启动一次就完成了。<BR><BR>　　下面演示一个最简单的单表操作，可以让我们很快熟悉开发过程。我们选择Mysql数据库来做这个应用，首先建立一个数据表，名为user_info，包含id、name、password三个字段，建表语句如下：</FONT></DIV>
<DIV class=postcolor><FONT size=4></FONT></DIV>
<DIV class=postcolor><B><FONT size=4># Host: localhost<BR># Database: test<BR># Table: 'user_info'<BR># <BR>CREATE TABLE `user_info` (<BR>`id` int(11) NOT NULL auto_increment,<BR>`name` varchar(100) NOT NULL default '',<BR>`password` varchar(100) NOT NULL default '',<BR>PRIMARY KEY&nbsp;&nbsp;(`id`)<BR>);</FONT></B></DIV>
<DIV class=postcolor><FONT size=4></FONT></DIV>
<DIV class=postcolor><FONT size=4>　　然后新建一个普通的Java项目：“<B>新建—项目—Java项目</B>”，注意加入Hibernate的所有lib文件，以及mysql的jdbc驱动文件。下面我们需要在项目中加入一个Hibernate的配置文件，在src目录下选择“<B>新建—其他—hibernate—hibernate configuration file</B>”，如下图：<BR><BR><IMG onmousewheel="return bbimg(this)" style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_3.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　在弹出的界面中，你需要指定要使用的数据库，以及连接数据库所需要的信息，我们对应的选择了数据库为mysql，并配置了数据库的URL和管理员帐号，如下：<BR><BR><IMG onmousewheel="return bbimg(this)" style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_4.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　在上图中，我们还可以指定从JNDI数据源中获得连接，可以点击“<B>Datasource</B>“标签进行配置。<BR><BR>　　“<B>完成</B>”之后系统会自己生成一个名为“hibernate.cfg.xml”的文件，里面包含了基本的配置信息，如果需要高级配置，可以手动添加。<BR><BR>　　下面我们要生成映射文件，首先新建一个包“org.bromon.zizz.pojo”，在这个包下选择“<B>新建—其他—hibernate—hibernate mapping file</B>”，在弹出的界面中点击“刷新”，讲会列出库中所有的数据表，选中我们要使用的“user_info”表，以及我们要生成的pojo文件所在的包：org.bromon.zizz.pojo。如下图：<BR><BR><IMG onmousewheel="return bbimg(this)" style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_5.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　在上述界面的“Properties”标签中可以配置hbm的其他选项，包括文件扩展名，聚合列名，ID生成规则等。完成后，系统会自动生成一个名为“UserInfo.hbm”的文件，我们可以通过这个文件生成相关的存根类。在UserInfo.hbm文件上选择“<B>Hibernate Synchronizer—Synchronize files</B>”：<BR><BR><IMG onmousewheel="return bbimg(this)" style="WIDTH: 524px; CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_6.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　该操作将生成三个包八个类文件，里面封装了Hibernate的操作细节，让我们可以专心面对业务逻辑的开发，仔细阅读这些文件可以提高你对Hibernate的认识，增长应用技巧。<BR><BR>　　然后我们需要在Hibernate的配置文件中添加对UserInfo的相关信息，在UserInfo.hbm上选择“<B>Synchronizer—Add Mapping Reference</B>”。现在我们可以开始编写自己的程序逻辑了，代码可以写在org.bromon.zizz.pojo.dao. UserInfoDAO中，这个类的代码不会被插件修改。我们首先创建一条新的记录，在该类中加入一个main方法：<BR><BR></FONT></DIV>
<DIV class=postcolor><FONT size=4></FONT></DIV>
<DIV class=postcolor><FONT size=4>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_39_427_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_427_Open_Text.style.display='none'; Codehighlighter1_39_427_Closed_Image.style.display='inline'; Codehighlighter1_39_427_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_39_427_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_427_Closed_Text.style.display='none'; Codehighlighter1_39_427_Open_Image.style.display='inline'; Codehighlighter1_39_427_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_39_427_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_39_427_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_59_357_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_357_Open_Text.style.display='none'; Codehighlighter1_59_357_Closed_Image.style.display='inline'; Codehighlighter1_59_357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_59_357_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_357_Closed_Text.style.display='none'; Codehighlighter1_59_357_Open_Image.style.display='inline'; Codehighlighter1_59_357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_59_357_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_59_357_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_RootDAO.initialize();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserInfoDAO&nbsp;uid</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;UserInfoDAO();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.bromon.zizz.pojo.UserInfo&nbsp;ui</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;org.bromon.zizz.pojo.UserInfo();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ui.setName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">bromon</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ui.setPassword(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">123</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid.save(ui);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_384_425_Open_Image onclick="this.style.display='none'; Codehighlighter1_384_425_Open_Text.style.display='none'; Codehighlighter1_384_425_Closed_Image.style.display='inline'; Codehighlighter1_384_425_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_384_425_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_384_425_Closed_Text.style.display='none'; Codehighlighter1_384_425_Open_Image.style.display='inline'; Codehighlighter1_384_425_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_384_425_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_384_425_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV></FONT><BR></DIV>
<DIV class=postcolor><FONT size=4></FONT></DIV>
<DIV class=postcolor><FONT size=4>　　可以看出，插件已经把session操作和事务操作都封装起来了，我们的代码工作得到了极大的简化。而且我们可以利用插件自带的Hibernate editor来编辑hbm文件，非常方便，我们需要把ID的生成方式改为“identity”：<BR><BR><IMG onmousewheel="return bbimg(this)" style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_7.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0><BR><BR>　　要让这个程序正常运行，还需要对配置文件hibernate.cfg.xml作一些修改。值得注意的是，请不要在该插件以外的环境中修改配置文件（比如使用DreamWeaver之类的工具编辑文件），否则会造成系统与资源不同步的错误，这可能是插件的一个bug。使用Eclipse的“<B>文本编辑器</B>”打开该文件，其中有如下的内容：</FONT></DIV>
<DIV class=postcolor><FONT size=4></FONT></DIV>
<DIV class=postcolor><FONT size=4>&lt;property name="hibernate.transaction.factory_class"&gt;<BR>net.sf.hibernate.transaction.JTATransactionFactory<BR>&lt;/property&gt;<BR>&lt;property name="jta.UserTransaction"&gt;<BR>java:comp/UserTransaction<BR>&lt;/property&gt;</FONT></DIV>
<DIV class=postcolor><FONT size=4></FONT></DIV>
<DIV class=postcolor><FONT size=4>　　由于在我们的例子中，并没有使用JTA来控制事务，所以需要将上面的内容注释掉，程序才能正常运行。<BR><BR>　　OK，Run一下，可以看到数据已经被保存到数据库。<BR><BR>　　如果在实际开发工作中，需要重新设计数据表结构，那么只需要在.hbm文件中做相应的修改，然后执行“<B>Synchronize and Overwrite</B>”的操作，插件会重新生成存根文件，我们只需要修改程序逻辑就可以了，非常方便。有了这样的功能插件，我们可以极大的从配置文件的编写、查错中解脱出来，从而提高我们的工作效率。<BR><BR>原文发表于《开发高手》04年12期</FONT></DIV><img src ="http://www.blogjava.net/bromon/aggbug/2547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 14:01 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 3.0.1插件方案</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2545.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2545.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2545.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2545.html</trackback:ping><description><![CDATA[<H3 class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><SPAN lang=EN-US>Eclipse 3.0.1插件方案<BR><BR>Bromon</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">原创</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">请尊重版权<BR></H3></SPAN><SPAN lang=EN-US>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><BR><FONT size=4>　　Eclipse 3.0</FONT></SPAN><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">推出已经好几个月了，但是我一直都在继续使用</SPAN><SPAN lang=EN-US>2.1.4</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，等的就是各种插件的稳定生机。最近在</SPAN><SPAN lang=EN-US>Eclipse 3.0.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的平台上稍有操练，觉得插件的功能更加丰富强大，安装也更加容易，</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体现了它惯有的强悍生命力。聊一聊我所使用的主流插件和基本配置。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT size=4>&nbsp;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先是汉化，作为开发工具，英文界面并没有什么不好，不过我们可以汉化</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">带的大量帮助文档，可以大大提高阅读速度，里面可有不少好东西。首先下载多国语言包，就在</SPAN><SPAN lang=EN-US><A href="http://www.eclipse.org/"><FONT color=#000080>www.eclipse.org</FONT></A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就有，这个语言包只支持</SPAN><SPAN lang=EN-US>Eclipse 3.0.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，对</SPAN><SPAN lang=EN-US>Eclipse 3.0</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无效。不要急着升级</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这可是俺很久以来的经验。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT size=4>&nbsp;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下载之后，解压到</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录下，然后使用</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自带的“安装</SPAN><SPAN lang=EN-US>/</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更新”菜单来升级，这是个很重要的功能，安装插件方便多了。操作过程如下：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT size=4>&nbsp;<o:p></o:p></FONT></SPAN></P><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><FONT size=4>打开菜单：<BR><IMG id=ViewPicture.ascx_GalleryImage style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; BORDER-LEFT: black 2px solid; WIDTH: 362px; BORDER-BOTTOM: black 2px solid; HEIGHT: 163px" alt="" src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_3.jpg">&nbsp;<BR><BR></FONT>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>　　不好意思，我的已经汉化过了，大家自己对照吧。<BR></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><BR><FONT size=4>选择“搜索要安装的新功能部件”，会出现类似下面的界面：<BR><BR><IMG id=ViewPicture.ascx_GalleryImage style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; BORDER-LEFT: black 2px solid; WIDTH: 600px; BORDER-BOTTOM: black 2px solid; HEIGHT: 284px" alt="" src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_1.jpg">&nbsp;<BR><BR></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　你看到的东西会比上面的图片中少很多，因为我自己添加了很多插件，而你没有。点击</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新建本地站点“，然后找到语言包所在的位置，如果位置不对，会有提示。没有错误的话，语言包会出现在列表中，选中它，一路</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">next</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，最后会要求你重启动</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Eclipse</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。启动之后你有可能会发现，汉化效果不好，有些菜单仍然是英文的。解决方法是，新建一个指向</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Eclipse</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动程序的快捷方式，给快捷方式添加一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">clean</FONT></SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>参数：<BR><BR><IMG id=ViewPicture.ascx_GalleryImage style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; BORDER-LEFT: black 2px solid; WIDTH: 367px; BORDER-BOTTOM: black 2px solid; HEIGHT: 415px" alt="" src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_2.jpg">&nbsp;<BR><BR></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>　　用该快捷方式启动一次，重新读取所有配置，速度会慢一些，以后可以将该参数取掉。汉化完成。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>　　我们也可以通过这种方式，直接通过网络远程安装插件，方法是“新建远程站点”，然后填入插件名称和地址，其他方式和上面的一样。我所安装的插件有：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman">　Spring plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US><A href="http://springframework.sourceforge.net/spring-ide/eclipse/updatesite/"><FONT face="Times New Roman" color=#000080>http://springframework.sourceforge.net/spring-ide/eclipse/updatesite/</FONT></A></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman">Spring</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可是非常牛叉的框架啊。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman">　C# plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US><A href="http://www.improve-technologies.com/alpha/updates/site.xml"><FONT face="Times New Roman" color=#000080>http://www.improve-technologies.com/alpha/updates/site.xml</FONT></A></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Eclipse</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中开发</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">c#</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　代码折叠：</SPAN><SPAN lang=EN-US><A href="http://www.coffee-bytes.com/eclipse/update-site/site.xml"><FONT face="Times New Roman" color=#000080>http://www.coffee-bytes.com/eclipse/update-site/site.xml</FONT></A></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>提供多种代码折叠风格</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman">hibernate plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US><A href="http://www.binamics.com/hibernatesync"><FONT face="Times New Roman" color=#000080>http://www.binamics.com/hibernatesync</FONT></A></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以可视化的方式生成数据库配置文件，甚至可以根据数据库表格自动生成</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">hbm</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射文件，很爽</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><FONT face="Times New Roman">　UML 2 plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：这个只能下载下来安装了，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">http://www.omondo.com/</FONT></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　然后还有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Eclipse</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自带的更新站点，里面有个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Visual editor</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以让你在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Eclipse</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中以可视化的方式开发</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Swing/awt</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序，另外在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">C# plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的更新地址中，还带有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Struts editor</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">wsdl viewer</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Axis plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">resin plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等，都是好东西。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在还差一个很重要的插件：</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">lomboz</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这个很简单，下载下来解包，把</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的东西拷贝到</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Eclipse</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">plugin</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下即可。如果安装之后没有效果，再加上</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">clean</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数启动一次就</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">OK</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"><FONT size=4>&nbsp;<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">有了这一堆插件，现在的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Eclipse</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">已经足够强悍，当前流行的开发框架，都已经可以很好的应付。</SPAN></FONT></SPAN></P></SPAN></SPAN><img src ="http://www.blogjava.net/bromon/aggbug/2545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:57 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>俺设计的基于J2EE框架的模拟考试系统</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2544.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2544.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2544.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2544.html</trackback:ping><description><![CDATA[<P align=left><FONT size=4>基于J2EE框架的模拟考试系统<BR><BR>Bromon原创　请尊重版权<BR><BR>一、系统概述<BR><BR>　　本系统拟实现基本的网上模拟考试功能，包括学生登陆、在线考试、教师登陆、在线阅卷等模块。<BR><BR>二、设计目标<BR><BR>　　系统除了包含最基本的在线考试功能外，最主要的目的是演示J2EE框架的完整应用，包括jsp/servlet、java web start、消息Bean、会话Bean、实体Bean等J2EE框架中最核心的技术。系统中大量使用了设计模式中的工厂模式、单例模式、委派模式，以及J2EE核心模式中的DAO模式和Session facade模式，保证了系统的可扩展性和可插入性。<BR><BR>　　本系统针对不同的模块，使用了CMP和Hibernate两种OR映射，也试图通过使用本地接口和异步通信等手段优化系统性能。目标是使本系统在保证性能的同时，具有清晰的层次结构，以及良好的伸缩性和扩展性。这样的设计可能比较疯狂，理论价值大于实际价值。<BR><BR>三、方案描述<BR><BR>　　系统大致结构如下图：<BR><IMG alt="user posted image" src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_Examer.jpg" border=0><BR><BR>　　系统使用了CMP对examer.student(学生数据表)、examer.teacher(教师数据表)、examer.examin(考试数据表）进行了映射，原因是这些数据结构相对简单，数据单纯，不需要进行非常复杂、多样的查询，系统对数据表的操作不频繁，通常情况下对性能不敏感，故采用了CMP。CMP中只提供最基本的查询方法，所有的程序逻辑都封装在对应的会话Bean中，会话Bean和CMP一同部署，故可以采用本地接口访问实体Bean，提高效率。客户端仅仅与会话Bean进行交互。该设计的好处是隐藏了数据逻辑，MVC的结构非常清楚。后期的数据维护也比较简单。<BR><BR>　　系统使用Hibernate框架对examer.question(试题数据表)进行映射，原因是该表格比较复杂，需要进行复杂多样的查询，Hibernate框架可以提供更加灵活的查询，便于扩展。同样的，Hibernate自身不含有商务逻辑，程序逻辑由对应的会话Bean封装，保证多层的隔离。由于系统可能会对底层数据表进行较为频繁的访问，所以可以考虑更改实现方式，由会话Bean直接使用DAO模式访问数据表，提高系统效率。<BR><BR>　　对于examer.answer(答案数据表），系统没有采取OR映射。原因是这个表格的数据保存学生的答题情况，在考试的过程中，该表格会被频繁操作，但是操作多是单向的（添加新数据），进行查询的时候不多。针对这个特点，系统采用消息Bean＋会话Bean，使用DAO模式直接访问数据表，通过使用J2EE的消息服务提供了一种异步调用机制，保证数据安全可靠，同时效率又得到极大改善。<BR><BR>　　由于系统采用EJB开发，所以客户端丰富多样，既可以是基于浏览器的jsp/servlet，也可以是基于awt/swing/swt的桌面应用程序。为了便于多系统的集成，系统将EJB部署到Axis，提供web service接口，便于其他平台、其他语言的应用程序访问。<BR><BR>　　本系统的Model与control已经全部完成，view部分尚未开工。</FONT><B><BR></P></B><img src ="http://www.blogjava.net/bromon/aggbug/2544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:53 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用观察者(Observer)实现对象监听 </title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2542.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2542.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2542.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2542.html</trackback:ping><description><![CDATA[<P align=center><FONT size=4>使用观察者<FONT face="Times New Roman">(Observer)</FONT>实现对象监听 </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4><FONT face="Times New Roman">Bromon</FONT>原创<FONT face="Times New Roman"> </FONT>请尊重版权</FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4><FONT face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>有非常多的时候，我们希望自己的程序能够监视数据的变化，然后做出响应，这种情况非常多，比如探测数据库中数据的变化、检测用户状态的变化等等。通常我们都缺乏一种双工通信的机制，只能选择让程序做论询，隔一段时间检测一次数据变化，记录下来与上一次检测结果做对比，从而判断数据是否发生了变化。毫无疑问这样的方式很笨拙，不仅写起来痛苦，跑起来也耗资源，是典型的用<FONT face="Times New Roman">80%</FONT>的时间解决<FONT face="Times New Roman">20%</FONT>的问题。</FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4><FONT face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>观察者<FONT face="Times New Roman">(Observer)</FONT>是一种模式，也是<FONT face="Times New Roman">Java</FONT>中的一个<FONT face="Times New Roman">API</FONT>，它让一个值对象<FONT face="Times New Roman">(Value Object)</FONT>具备自省的功能，当他发现自己的状态改变了，就向相关的对象发送消息，这样的监听方式当然比轮询好。我感冒了自己会去医院，用不着医生每个月来问一次。禽兽·宇枫曾经给了我一段麻将游戏的服务器端代码，本来是让我研究一下麻将的算法，但是却被其中<FONT face="Times New Roman">Observer</FONT>的使用所吸引，这样写出来的服务器执行效率很高。我曾经用线程池<FONT face="Times New Roman">+</FONT>反射<FONT face="Times New Roman">+</FONT>观察者写了一个即时消息的服务器，既有<FONT face="Times New Roman">socket</FONT>的方便也具备<FONT face="Times New Roman">udp</FONT>的高效，可惜后来因为大幅修改设计代码作废了，不过观察者还是值得研究。</FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4><FONT face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java</FONT>的<FONT face="Times New Roman">Observer API</FONT>是对观察者模式的一个实现。假设我们有一个对象容器，其中存放用户消息，我希望这个容器自省，当有新的消息进来就自动触发观察者作出响应。首先定义消息对象，是个很简单的值对象：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT><FONT size=4><SPAN style="COLOR: #000000">package&nbsp;com.gwnet.smsMessenger.mm.bromon;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;Message&nbsp;<BR><IMG id=Codehighlighter1_66_224_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_224_Open_Text.style.display='none'; Codehighlighter1_66_224_Closed_Image.style.display='inline'; Codehighlighter1_66_224_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_66_224_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_224_Closed_Text.style.display='none'; Codehighlighter1_66_224_Open_Image.style.display='inline'; Codehighlighter1_66_224_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_66_224_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_66_224_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;id;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;String&nbsp;sender;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;String&nbsp;receiver;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;String&nbsp;content;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;String&nbsp;time;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">请自己实现set/get方法</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><BR><FONT size=4>然后写一个存放<FONT face="Times New Roman">Message</FONT>的容器，容器使用<FONT face="Times New Roman">ArrayList</FONT>来存放对象是个很好的选择，也很简单：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG id=Codehighlighter1_0_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_29_Open_Text.style.display='none'; Codehighlighter1_0_29_Closed_Image.style.display='inline'; Codehighlighter1_0_29_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_29_Closed_Text.style.display='none'; Codehighlighter1_0_29_Open_Image.style.display='inline'; Codehighlighter1_0_29_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_29_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_0_29_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;Created&nbsp;on&nbsp;2004-8-11&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;com.gwnet.smsMessenger.mm.bromon;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG id=Codehighlighter1_96_120_Open_Image onclick="this.style.display='none'; Codehighlighter1_96_120_Open_Text.style.display='none'; Codehighlighter1_96_120_Closed_Image.style.display='inline'; Codehighlighter1_96_120_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_96_120_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_96_120_Closed_Text.style.display='none'; Codehighlighter1_96_120_Open_Image.style.display='inline'; Codehighlighter1_96_120_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_96_120_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_96_120_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;@author&nbsp;Bromon&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;MessageList&nbsp;extends&nbsp;Observable&nbsp;<BR><IMG id=Codehighlighter1_168_653_Open_Image onclick="this.style.display='none'; Codehighlighter1_168_653_Open_Text.style.display='none'; Codehighlighter1_168_653_Closed_Image.style.display='inline'; Codehighlighter1_168_653_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_168_653_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_168_653_Closed_Text.style.display='none'; Codehighlighter1_168_653_Open_Image.style.display='inline'; Codehighlighter1_168_653_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_168_653_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_168_653_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;List&nbsp;m</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;ArrayList();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;MessageList&nbsp;ml</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;MessageList()&nbsp;<BR><IMG id=Codehighlighter1_280_287_Open_Image onclick="this.style.display='none'; Codehighlighter1_280_287_Open_Text.style.display='none'; Codehighlighter1_280_287_Closed_Image.style.display='inline'; Codehighlighter1_280_287_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_280_287_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_280_287_Closed_Text.style.display='none'; Codehighlighter1_280_287_Open_Image.style.display='inline'; Codehighlighter1_280_287_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_280_287_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_280_287_Open_Text><SPAN style="COLOR: #000000"><FONT size=4>{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;MessageList&nbsp;getInstance()&nbsp;<BR><IMG id=Codehighlighter1_340_443_Open_Image onclick="this.style.display='none'; Codehighlighter1_340_443_Open_Text.style.display='none'; Codehighlighter1_340_443_Closed_Image.style.display='inline'; Codehighlighter1_340_443_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_340_443_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_340_443_Closed_Text.style.display='none'; Codehighlighter1_340_443_Open_Image.style.display='inline'; Codehighlighter1_340_443_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_340_443_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_340_443_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(ml</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">)&nbsp;<BR><IMG id=Codehighlighter1_372_416_Open_Image onclick="this.style.display='none'; Codehighlighter1_372_416_Open_Text.style.display='none'; Codehighlighter1_372_416_Closed_Image.style.display='inline'; Codehighlighter1_372_416_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_372_416_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_372_416_Closed_Text.style.display='none'; Codehighlighter1_372_416_Open_Image.style.display='inline'; Codehighlighter1_372_416_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_372_416_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_372_416_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ml</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;MessageList();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;ml;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;add(Message&nbsp;msg)&nbsp;<BR><IMG id=Codehighlighter1_485_577_Open_Image onclick="this.style.display='none'; Codehighlighter1_485_577_Open_Text.style.display='none'; Codehighlighter1_485_577_Closed_Image.style.display='inline'; Codehighlighter1_485_577_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_485_577_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_485_577_Closed_Text.style.display='none'; Codehighlighter1_485_577_Open_Image.style.display='inline'; Codehighlighter1_485_577_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_485_577_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_485_577_Open_Text><SPAN style="COLOR: #000000"><FONT size=4>{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.add(msg);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setChanged();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.notifyObservers(m);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;del(Message&nbsp;msg)&nbsp;<BR><IMG id=Codehighlighter1_619_650_Open_Image onclick="this.style.display='none'; Codehighlighter1_619_650_Open_Text.style.display='none'; Codehighlighter1_619_650_Closed_Image.style.display='inline'; Codehighlighter1_619_650_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_619_650_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_619_650_Closed_Text.style.display='none'; Codehighlighter1_619_650_Open_Image.style.display='inline'; Codehighlighter1_619_650_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_619_650_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_619_650_Open_Text><SPAN style="COLOR: #000000"><FONT size=4>{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.remove(msg);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><FONT size=4> </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P align=left><FONT size=4></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4>　　这个类继承了Observable类，并且对其中的<FONT face="Times New Roman">add</FONT>方法做了手脚，很明显，<FONT face="Times New Roman">add</FONT>方法的作用是向<FONT face="Times New Roman">ArrayList</FONT>容器中放入一个对象，这正是我们想监听的操作，所以有了<FONT face="Times New Roman">:</FONT></FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P align=left><FONT size=4><B>uper</B>.setChanged(); </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4><B>super</B>.notifyObservers(m); </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4>　　这意思是一旦调用add方法，这个类自己就会向所有注册过的观察者发送消息，消息内容是什么呢？内容就是m，是存放消息的容器，观察者可以收到这个改变了状态的容器，然后对它进行操作，从而实现了对容器的监听，当然，我们只实现了对add方法的监听，你也可以试试其他的。 </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4>　　需要特别注意的是这是一个不完整的单例类，写成单例是为了要保证整个<FONT face="Times New Roman">jvm</FONT>中只有这一个存放消息的容器，而不写成完整的单例，原因是将来可能要提供另外的实例化方法。所以理解起来可能稍微难一点，大家可以参考一下设计模式中的单例模式。</FONT></P>
<P><FONT size=4></FONT><FONT face="Times New Roman">
<P><FONT size=4></FONT></P></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4>下面就是编写观察者并且注册它：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG id=Codehighlighter1_0_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_29_Open_Text.style.display='none'; Codehighlighter1_0_29_Closed_Image.style.display='inline'; Codehighlighter1_0_29_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_29_Closed_Text.style.display='none'; Codehighlighter1_0_29_Open_Image.style.display='inline'; Codehighlighter1_0_29_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_29_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_0_29_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;Created&nbsp;on&nbsp;2004-8-11&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;com.gwnet.smsMessenger.bromon;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG id=Codehighlighter1_93_117_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_117_Open_Text.style.display='none'; Codehighlighter1_93_117_Closed_Image.style.display='inline'; Codehighlighter1_93_117_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_93_117_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_117_Closed_Text.style.display='none'; Codehighlighter1_93_117_Open_Image.style.display='inline'; Codehighlighter1_93_117_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_93_117_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_93_117_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;@author&nbsp;Bromon&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;MessageObserver&nbsp;implements&nbsp;Observer&nbsp;<BR><IMG id=Codehighlighter1_170_540_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_540_Open_Text.style.display='none'; Codehighlighter1_170_540_Closed_Image.style.display='inline'; Codehighlighter1_170_540_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_170_540_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_540_Closed_Text.style.display='none'; Codehighlighter1_170_540_Open_Image.style.display='inline'; Codehighlighter1_170_540_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_170_540_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_170_540_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{&nbsp;<BR><IMG id=Codehighlighter1_177_280_Open_Image onclick="this.style.display='none'; Codehighlighter1_177_280_Open_Text.style.display='none'; Codehighlighter1_177_280_Closed_Image.style.display='inline'; Codehighlighter1_177_280_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_177_280_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_177_280_Closed_Text.style.display='none'; Codehighlighter1_177_280_Open_Image.style.display='inline'; Codehighlighter1_177_280_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_177_280_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_177_280_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">&nbsp;(non-Javadoc)&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;java.util.Observer#update(java.util.Observable,&nbsp;java.lang.Object)&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;update(Observable&nbsp;arg0,&nbsp;Object&nbsp;arg1)&nbsp;<BR><IMG id=Codehighlighter1_341_537_Open_Image onclick="this.style.display='none'; Codehighlighter1_341_537_Open_Text.style.display='none'; Codehighlighter1_341_537_Closed_Image.style.display='inline'; Codehighlighter1_341_537_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_341_537_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_341_537_Closed_Text.style.display='none'; Codehighlighter1_341_537_Open_Image.style.display='inline'; Codehighlighter1_341_537_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_341_537_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_341_537_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;l</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">(List)arg1;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;m</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(Message)l.</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000">(l.size()</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;receiver</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">m.getReceiver();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">给</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">m.getReceiver()</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">”的新消息:”</SPAN><SPAN style="COLOR: #000000">+</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>m.getContent());&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><FONT size=4> </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P align=left><FONT size=4></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P align=left><FONT size=4>　　这个类继承Oberver接口，update(Observable,Object)是必须提供的方法，在这个方法中我们接收被观察类传过来的数据（含有消息的容器），然后取出其中最后一个，读取它的内容。 </FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P align=left><FONT size=4></FONT>
<P><FONT size=4></FONT></P>
<P><FONT size=4></FONT></P>
<P align=left><FONT size=4>　　Java里的观察者使用起来是非常简单的。我们的例子好处是所有的操作都在内存中进行，而且不需要轮询，效率非常高，缺点是一旦当机内存中的数据就丢失了，所以如果有一套比较完善的对象缓冲机制，就可以应付复杂的应用，写出高效简洁的多线程服务器。</FONT></P><img src ="http://www.blogjava.net/bromon/aggbug/2542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:52 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于消息Bean的EJB异步通信</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2541.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2541.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2541.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2541.html</trackback:ping><description><![CDATA[<P><FONT size=4>基于消息Bean的EJB异步通信<BR><BR>Bromon原创　请尊重版权</FONT></P>
<P><FONT size=4>　　异步通信是一个提升程序执行效率的很重要的手段，而性能问题又是EJB诞生以来一直都很受关注的话题。EJB执行效率不高的原因是客户端需要查询和调用远程接口，而本身在处理数据是很快的，毕竟EJB有比较完善的缓冲机制，几十万的app server也不是白吃内存的。客户端程序如果能够采用异步通信，只负责以消息的形式发送请求和需要处理的数据，不用等待系统查询、调用远程接口，可以节省大量时间，这也是EJB 2.0中引入消息驱动Bean的一个重要原因。J2EE的消息机制允许你以消息的形式传递对象，我们可以利用它实现很多应用。</FONT></P>
<P><FONT size=4>　　在最近正在写的一个考试系统中，系统把学生对每一个题目的回答都实时记录到数据库，这样做会有比较频繁的数据库操作，对性能有比较大的影响，但是可以让学生的每一次答题都得到永久性保存，避免因为意外死机或异常退出造成学生提交的答案丢失。毫无疑问，数据的安全可靠是第一位的，但是上百个学生并发操作，这个负载也是很巨大的。为了在稳定和性能上谋求平衡，我们考虑这样一种模型：</FONT></P>
<P><FONT size=4>　　◆在服务器端建立一个永久性的队列，该队列可以保证数据安全，即使服务器意外重启，里面的对象也不丢失。并且有一种机制保证队列中的对象只会被处理一次。</FONT></P>
<P><FONT size=4>　　◆客户端把答案数据封装成javabean，然后提交到这个队列中，提交之后不必等待数据处理完成，直接进行以后的操作，产生新的数据后继续往队列里存放，不必去关心数据什么时候会被处理。</FONT></P>
<P><FONT size=4>　　◆服务器以FIFO的顺序处理队列中的数据包。</FONT></P>
<P><FONT size=4>结构大致如下图：</FONT></P>
<P><FONT size=4><IMG alt="" hspace=0 src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_消息bean.jpg" align=baseline border=0></FONT></P>
<P><FONT size=4>　　很明显，这里只提供一种单向通信，但是并非被迫，完全可以在建立另外一个队列，存放返回的消息，对应的消息通过消息ID进行关联。以消息bean为核心的java消息服务(JMS)实际上就是这样一个框架。</FONT></P>
<P><FONT size=4>　　首先设计一个操作答案数据表的类：</FONT></P>
<P><FONT size=4><IMG alt="" hspace=0 src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_AnswerAccess.jpg" align=baseline border=0></FONT></P>
<P><FONT size=4>　　它包含增加答案的方法和修改已有答案的方法，在实际的项目中，它由一个映射数据表的CMP Entity Bean和一个封装程序逻辑的SessionBean构成，是一个典型的session facade模式。实际的系统大致是这样：</FONT></P>
<P><A href="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_Examer.jpg"><FONT size=4><IMG alt="" hspace=0 src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_Examer.jpg" align=baseline border=0></FONT></A></P>
<P><FONT size=4>　　在一个系统中同时使用CMP和Hibernate来做映射，是一个非常怪异的设计，这样做只是为了使系统更有研究和讨论的价值，实际应用中恐怕我自己也要仔细考虑是否采用BMP代替Hibernate。</FONT></P>
<P><FONT size=4>　　编写消息bean之前，首先定义消息中要传递的是什么对象：</FONT></P>
<P><FONT size=4><IMG alt="" hspace=0 src="http://blog.csdn.net/images/blog_csdn_net/bromon/29990/r_AnswerOperate.jpg" align=baseline border=0></FONT></P>
<P><FONT size=4>下面是消息Bean的代码：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG id=Codehighlighter1_0_50_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_50_Open_Text.style.display='none'; Codehighlighter1_0_50_Closed_Image.style.display='inline'; Codehighlighter1_0_50_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_50_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_50_Closed_Text.style.display='none'; Codehighlighter1_0_50_Open_Image.style.display='inline'; Codehighlighter1_0_50_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_50_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_0_50_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;消息bean，处理针对Answer的操作<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;Created&nbsp;on&nbsp;2004-7-27<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #008000"><FONT size=4>*/</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;org.bromon.examer.message;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;javax.ejb.MessageDrivenBean;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;javax.jms.</FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.bromon.examer.</SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.bromon.examer.session.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;AnswerMessageBean&nbsp;implements&nbsp;MessageDrivenBean,&nbsp;MessageListener<BR><IMG id=Codehighlighter1_291_866_Open_Image onclick="this.style.display='none'; Codehighlighter1_291_866_Open_Text.style.display='none'; Codehighlighter1_291_866_Closed_Image.style.display='inline'; Codehighlighter1_291_866_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_291_866_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_291_866_Closed_Text.style.display='none'; Codehighlighter1_291_866_Open_Image.style.display='inline'; Codehighlighter1_291_866_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_291_866_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_291_866_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;javax.ejb.MessageDrivenContext&nbsp;messageContext&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">定义上下文</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;setMessageDrivenContext(<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>javax.ejb.MessageDrivenContext&nbsp;messageContext)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>throws&nbsp;javax.ejb.EJBException<BR><IMG id=Codehighlighter1_481_521_Open_Image onclick="this.style.display='none'; Codehighlighter1_481_521_Open_Text.style.display='none'; Codehighlighter1_481_521_Closed_Image.style.display='inline'; Codehighlighter1_481_521_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_481_521_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_481_521_Closed_Text.style.display='none'; Codehighlighter1_481_521_Open_Image.style.display='inline'; Codehighlighter1_481_521_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_481_521_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_481_521_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.messageContext&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;messageContext;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;ejbRemove()<BR><IMG id=Codehighlighter1_548_573_Open_Image onclick="this.style.display='none'; Codehighlighter1_548_573_Open_Text.style.display='none'; Codehighlighter1_548_573_Closed_Image.style.display='inline'; Codehighlighter1_548_573_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_548_573_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_548_573_Closed_Text.style.display='none'; Codehighlighter1_548_573_Open_Image.style.display='inline'; Codehighlighter1_548_573_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_548_573_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_548_573_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>messageContext&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">收到消息后将执行这个方法</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;onMessage(javax.jms.Message&nbsp;message)<BR><IMG id=Codehighlighter1_640_863_Open_Image onclick="this.style.display='none'; Codehighlighter1_640_863_Open_Text.style.display='none'; Codehighlighter1_640_863_Closed_Image.style.display='inline'; Codehighlighter1_640_863_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_640_863_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_640_863_Closed_Text.style.display='none'; Codehighlighter1_640_863_Open_Image.style.display='inline'; Codehighlighter1_640_863_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_640_863_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_640_863_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">try</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG id=Codehighlighter1_646_816_Open_Image onclick="this.style.display='none'; Codehighlighter1_646_816_Open_Text.style.display='none'; Codehighlighter1_646_816_Closed_Image.style.display='inline'; Codehighlighter1_646_816_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_646_816_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_646_816_Closed_Text.style.display='none'; Codehighlighter1_646_816_Open_Image.style.display='inline'; Codehighlighter1_646_816_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></FONT></SPAN><SPAN id=Codehighlighter1_646_816_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><FONT size=4><IMG src="http://www.blogjava.net/images/dot.gif"></FONT></SPAN><SPAN id=Codehighlighter1_646_816_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">(message&nbsp;instanceof&nbsp;ObjectMessage)<BR><IMG id=Codehighlighter1_685_785_Open_Image onclick="this.style.display='none'; Codehighlighter1_685_785_Open_Text.style.display='none'; Codehighlighter1_685_785_Closed_Image.style.display='inline'; Codehighlighter1_685_785_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_685_785_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_685_785_Closed_Text.style.display='none'; Codehighlighter1_685_785_Open_Image.style.display='inline'; Codehighlighter1_685_785_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_685_785_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_685_785_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>AnswerOperate&nbsp;ap</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">(AnswerOperate)((ObjectMessage)message).getObject();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">调用EJB对AnswerOperate对象进行处理</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.printn(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">消息处理完毕</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>catch</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_836_861_Open_Image onclick="this.style.display='none'; Codehighlighter1_836_861_Open_Text.style.display='none'; Codehighlighter1_836_861_Closed_Image.style.display='inline'; Codehighlighter1_836_861_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_836_861_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_836_861_Closed_Text.style.display='none'; Codehighlighter1_836_861_Open_Image.style.display='inline'; Codehighlighter1_836_861_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_836_861_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_836_861_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P><BR><FONT size=4>　　消息如何保障安全呢？有两个手段，一是使用消息验证，客户必须提供匹配的帐号密码才能访问消息中的数据。二是对消息中的对象加密，客户必须持有对应的密钥才能获得对象。<BR></FONT></P><img src ="http://www.blogjava.net/bromon/aggbug/2541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:46 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>澄清Java（一）----接口与继承</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2540.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2540.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2540.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2540.html</trackback:ping><description><![CDATA[<P align=left><FONT size=4>澄清Java（一）----接口与继承<BR><BR>Bromon原创&nbsp;请尊重版权<BR><BR>　　计算机学院研二的兄弟与我讨论Java，一见面，几个问题全是关于接口，接口有什么用？为什么要用接口？什么时候该使用接口？很庆幸他们不是问我Java如何连接SQL&nbsp;Server，或者是如何开发J2EE应用，这类问题有杀伤力，避之则吉。今年计算机学院本科有个毕业设计课题是做J2ME，选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包，这个这个……唉。<BR><BR>　　大多数人认为，接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制，但是却能够实作多个接口。这个说法是很牵强的，接口和继承是完全不同的东西，接口没有能力代替多重继承，也没有这个义务。接口的作用，一言以蔽之，就是标志类的类别（type&nbsp;of&nbsp;class）。把不同类型的类归于不同的接口，可以更好的管理他们。OO的精髓，我以为，是对对象的抽象，最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言（比如c++、java、c#等），就是因为设计模式所研究的，实际上就是如何合理的去抽象。（cowboy的名言是“抽象就是抽去像的部分”，看似调侃，实乃至理）。<BR><BR>　　设计模式中最基础的是工厂模式（Factory），在我最近的一个很简单的应用中，我想尽量的让我的程序能够在多个数据库间移植，当然，这涉及很多问题，单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化，只考虑如何连接不同的数据库。<BR><BR>　　假设我有很多个类，分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java，他们分别连接不同的数据库，统一返回一个Connection对象，并且都有一个close方法，用于关闭连接。只需要针对你的DBMS，选择不同的类，就可以用了，但是我的用户他会使用什么数据库？我不知道，我希望的是尽量少的修改代码，就能满足他的需要。我可以抽象如下接口：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT><FONT size=4><SPAN style="COLOR: #000000">package&nbsp;org.bromon.test;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">interface</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;DB<BR><IMG id=Codehighlighter1_45_129_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_129_Open_Text.style.display='none'; Codehighlighter1_45_129_Closed_Image.style.display='inline'; Codehighlighter1_45_129_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_45_129_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_129_Closed_Text.style.display='none'; Codehighlighter1_45_129_Open_Image.style.display='inline'; Codehighlighter1_45_129_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_45_129_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_45_129_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>java.sql.Connection&nbsp;openDB(String&nbsp;url,String&nbsp;user,String&nbsp;password);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><BR><FONT size=4>　　这个接口只定义两个方法，没有任何有实际意义的代码，具体的代码由实作这个接口的类来给出，比如Mysql.java：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT><FONT size=4><SPAN style="COLOR: #000000">Package&nbsp;org.bromon.test;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.sql.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;Mysql&nbsp;implements&nbsp;DB<BR><IMG id=Codehighlighter1_77_305_Open_Image onclick="this.style.display='none'; Codehighlighter1_77_305_Open_Text.style.display='none'; Codehighlighter1_77_305_Closed_Image.style.display='inline'; Codehighlighter1_77_305_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_77_305_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_77_305_Closed_Text.style.display='none'; Codehighlighter1_77_305_Open_Image.style.display='inline'; Codehighlighter1_77_305_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_77_305_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_77_305_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;url</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">”jdbc:mysql:localhost:</SPAN><SPAN style="COLOR: #000000">3306</SPAN><SPAN style="COLOR: #000000">/</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">test”;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">”root”;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">””;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;Connection&nbsp;conn;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;Connection&nbsp;openDB(url,user,password)<BR><IMG id=Codehighlighter1_257_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_257_270_Open_Text.style.display='none'; Codehighlighter1_257_270_Closed_Image.style.display='inline'; Codehighlighter1_257_270_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_257_270_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_257_270_Closed_Text.style.display='none'; Codehighlighter1_257_270_Open_Image.style.display='inline'; Codehighlighter1_257_270_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_257_270_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_257_270_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">连接数据库的代码</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;close()<BR><IMG id=Codehighlighter1_293_303_Open_Image onclick="this.style.display='none'; Codehighlighter1_293_303_Open_Text.style.display='none'; Codehighlighter1_293_303_Closed_Image.style.display='inline'; Codehighlighter1_293_303_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_293_303_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_293_303_Closed_Text.style.display='none'; Codehighlighter1_293_303_Open_Image.style.display='inline'; Codehighlighter1_293_303_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_293_303_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_293_303_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">关闭数据库</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN></DIV></DIV>
<P align=left><BR><BR><FONT size=4>　　类似的当然还有Oracle.java等等，接口DB给这些类归了个类，在应用程序中我们这样定义对象：<BR><BR>org.bromon.test.DB&nbsp;myDB;<BR><BR>　　使用myDB来操作数据库，就可以不用管实际上我所使用的是哪个类，这就是所谓的“开-闭”原则。但是问题在于接口是不能实例化的，myDB=new&nbsp;DB()，这样的代码是绝对错误的，我们只能myDB=new&nbsp;Mysql()或者myDB=new&nbsp;Oracle()。麻烦了，我还是需要指定具体实例化的是哪个类，用了接口跟没用一样。所以我们需要一个工厂：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT><FONT size=4><SPAN style="COLOR: #000000">package&nbsp;org.bromon.test;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;DBFactory<BR><IMG id=Codehighlighter1_48_123_Open_Image onclick="this.style.display='none'; Codehighlighter1_48_123_Open_Text.style.display='none'; Codehighlighter1_48_123_Closed_Image.style.display='inline'; Codehighlighter1_48_123_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_48_123_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_48_123_Closed_Text.style.display='none'; Codehighlighter1_48_123_Open_Image.style.display='inline'; Codehighlighter1_48_123_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_48_123_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_48_123_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>　　</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;DB&nbsp;Connection&nbsp;getConn()<BR><IMG id=Codehighlighter1_92_121_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_121_Open_Text.style.display='none'; Codehighlighter1_92_121_Closed_Image.style.display='inline'; Codehighlighter1_92_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_92_121_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_121_Closed_Text.style.display='none'; Codehighlighter1_92_121_Open_Image.style.display='inline'; Codehighlighter1_92_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>　　</SPAN><SPAN id=Codehighlighter1_92_121_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_92_121_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>　　　　Return(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;Mysql());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>　　}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><BR><FONT size=4>　　所以实例化的代码变成：myDB=DBFactory.getConn()；<BR>　　这就是23种模式中最基础的普通工厂(Factory)，工厂类负责具体实例化哪个类，而其他的程序逻辑都是针对DB这个接口进行操作，这就是“针对接口编程”。责任都被推卸给工厂类了，当然你也可以继续定义工厂接口，继续把责任上抛，这就演变成抽象工厂(Abstract&nbsp;Factory)。<BR><BR>　　整个过程中接口不负责任何具体操作，其他的程序要连接数据库的话，只需要构造一个DB对象就OK，而不管工厂类如何变化。这就是接口的意义----抽象。<BR><BR>　　继承的概念不用多说，很好理解。为什么要继承呢？因为你想重用代码？这绝对不是理由，继承的意义也在于抽象，而不是代码重用。如果对象A有一个run()方法，对象B也想有这个方法，所以有人就Class&nbsp;B&nbsp;extends&nbsp;A。这是不经大脑的做法。如果在B中实例化一个A，调用A的Run()方法，是不是可以达到同样的目的？如下：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT><FONT size=4><SPAN style="COLOR: #000000">Class&nbsp;B<BR><IMG id=Codehighlighter1_8_33_Open_Image onclick="this.style.display='none'; Codehighlighter1_8_33_Open_Text.style.display='none'; Codehighlighter1_8_33_Closed_Image.style.display='inline'; Codehighlighter1_8_33_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_8_33_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_33_Closed_Text.style.display='none'; Codehighlighter1_8_33_Open_Image.style.display='inline'; Codehighlighter1_8_33_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_8_33_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_8_33_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>A&nbsp;&nbsp;a</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;A();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>a.run();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN></DIV></DIV>
<P align=left><BR><BR><FONT size=4>　　这就是利用类的聚合来重用代码，是委派模式的雏形，是GoF一贯倡导的做法。<BR><BR>　　那么继承的意义何在？其实这是历史原因造成的，最开始的OO语言只有继承，没有接口，所以只能以继承来实现抽象，请一定注意，继承的本意在于抽象，而非代码重用（虽然继承也有这个作用），这是很多Java烂书最严重的错误之一，它们所造成的阴影，我至今还没有完全摆脱，坏书害人啊，尤其是入门类的，流毒太大。什么时候应该使用继承？只在抽象类中使用，其他情况下尽量不使用。抽象类也是不能实例化的，它仅仅提供一个模版而已，这就很能说明问题。<BR><BR>　　软件开发的万恶之源，一是重复代码而不是重用代码，二是烂用继承，尤以c++程序员为甚。Java中取缔多重继承，目的就是制止烂用继承，实是非常明智的做法，不过很多人都不理解。Java能够更好的体现设计，这是让我入迷的原因之一。</FONT><B><BR></P></B><img src ="http://www.blogjava.net/bromon/aggbug/2540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:40 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用xmlhttp和Java session监听改善站内消息系统</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2539.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2539.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2539.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2539.html</trackback:ping><description><![CDATA[<P align=left><FONT size=4>使用xmlhttp和Java session监听改善站内消息系统<BR><BR>Bromon原创&nbsp;请尊重版权<BR><BR>　　这个题目含有许多需要解释的概念，最容易说明的是“站内消息”，这是很多论坛都有的功能，可以通过web向其他的在线用户发送消息，很多用户都使用过。站内消息的第一个好处是大家都不需要安装客户端，你不用知道对方的MSN或者QQ，就能与他联系，称赞他的观点或者是给他一顿臭骂。第二个好处是客户管理方便，利用session来维护在线名单，各种脚本都已经把session操作封装得很易用了，不用像其他无状态的即时通信工具（比如使用UDP通信的工具）一样，要费一些脑细胞来解决在线名单的问题。缺点嘛，就是实时性不好，一般是在用户跳转或者刷新页面才能探测消息、更新在线名单。<BR><BR>　　Session监听嘛，没什么好解释的，java提供了很灵活的事件机制来监听session，可以监听session的创建和销毁，监控session所携带数据的创建、变化和销毁，可以监听session的锐化和钝化（了解对象序列化的兄弟应该知道这个），其他的平台是个什么情况我不太清楚，估计也差不多吧。如果能够对所有客户的session进行监控，就不用再去操作麻烦而危险的Application了。<BR><BR>　　Xmlhttp是MS推的一项技术，功能很复杂，可以做很多事情，比如客户端可以在简单的HTML中打开HTTP连接，主动向server请求数据并获得返回数据，是DOM技术一个非常重要的应用，利用它来写无刷新的动态页面简直是so&nbsp;easy，做过web开发的兄弟应该明白它的意义有多么重大。<BR><BR>一、 session监听<BR><BR>　　servlet中对session的监听有很多接口，功能很灵活，最常用的是监听Session和Attribute。这里要澄清一下概念，servlet中的session监听和Attribute监听含义有差别，session监听指的不是我们一般所理解的放置一个session或者销毁一个session，这是Attribute监听的功能，因为servlet中放置session的语法是session.setAttribute(“session名”,要放入的对象)。而session监听，监听的是HTTP连接，只要有用户与server连接，就算连接的是一个空白的jsp页面，也会触发session事件，所以此处的session实际上指的是connection，用来统计当前在线用户数最合适了。不知道我说清楚了没有。下面分别讲解这两种监听方式。<BR><BR>1、 session监听<BR><BR>首先编写一个session监听类，实作HttpSessionListener接口，它的作用是计算当前有多少个在线用户：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG id=Codehighlighter1_0_31_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_31_Open_Text.style.display='none'; Codehighlighter1_0_31_Closed_Image.style.display='inline'; Codehighlighter1_0_31_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_31_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_31_Closed_Text.style.display='none'; Codehighlighter1_0_31_Open_Image.style.display='inline'; Codehighlighter1_0_31_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_31_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_0_31_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*@Author&nbsp;bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*2004-6-12<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #008000"><FONT size=4>*/</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;org.bromon.test;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;javax.servlet.</FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;javax.servlet.http.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;SessionCount&nbsp;implements&nbsp;HttpSessionListener<BR><IMG id=Codehighlighter1_170_485_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_485_Open_Text.style.display='none'; Codehighlighter1_170_485_Closed_Image.style.display='inline'; Codehighlighter1_170_485_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_170_485_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_485_Closed_Text.style.display='none'; Codehighlighter1_170_485_Open_Image.style.display='inline'; Codehighlighter1_170_485_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_170_485_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_170_485_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;count</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;sessionCreated(HttpSessionEvent&nbsp;se)<BR><IMG id=Codehighlighter1_249_315_Open_Image onclick="this.style.display='none'; Codehighlighter1_249_315_Open_Text.style.display='none'; Codehighlighter1_249_315_Closed_Image.style.display='inline'; Codehighlighter1_249_315_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_249_315_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_249_315_Closed_Text.style.display='none'; Codehighlighter1_249_315_Open_Image.style.display='inline'; Codehighlighter1_249_315_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_249_315_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_249_315_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>count</SPAN><SPAN style="COLOR: #000000">++</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(“session创建：”</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;java.util.Date());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;sessionDestroyed(HttpSessionEvent&nbsp;se)<BR><IMG id=Codehighlighter1_368_434_Open_Image onclick="this.style.display='none'; Codehighlighter1_368_434_Open_Text.style.display='none'; Codehighlighter1_368_434_Closed_Image.style.display='inline'; Codehighlighter1_368_434_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_368_434_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_368_434_Closed_Text.style.display='none'; Codehighlighter1_368_434_Open_Image.style.display='inline'; Codehighlighter1_368_434_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_368_434_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_368_434_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>count</SPAN><SPAN style="COLOR: #000000">--</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(“session销毁:”</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;java.util.Date());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;getCount()<BR><IMG id=Codehighlighter1_466_483_Open_Image onclick="this.style.display='none'; Codehighlighter1_466_483_Open_Text.style.display='none'; Codehighlighter1_466_483_Closed_Image.style.display='inline'; Codehighlighter1_466_483_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_466_483_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_466_483_Closed_Text.style.display='none'; Codehighlighter1_466_483_Open_Image.style.display='inline'; Codehighlighter1_466_483_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_466_483_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_466_483_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">return</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>(count);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><BR><FONT size=4>　　怎么样，是不是一目了然？count被定义为static，是因为要保证整个系统只有这一个count。如果你实在不放心，可以把它写成一个单例类。<BR><BR>然后在web.xml中声明这个监听器：<BR>&lt;listener&gt;<BR>&lt;listener-class&gt;<BR>org.bromon.test.SessionCount<BR>&lt;/listener-class&gt;<BR>&lt;/listener&gt;<BR><BR>编写一个测试页面test.jsp，内容是获得count：<BR>&lt;%<BR>int&nbsp;count=org.bromon.test.SessionCount.getCount();<BR>out.println(count);<BR>%&gt;<BR><BR>　　需要注意的是，这里根本不涉及任何session的操作。重启动App&nbsp;server，试着连接test.jsp，可以看到监听器已经开始工作。<BR><BR>2、 Attribute监听<BR>　　作为一个站内消息系统，肯定要获得所有登陆者的ID，才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块，用户通过身份验证之后会产生一个session，保存它的相关信息，比如：<BR>//check.jsp<BR>&lt;%<BR>String&nbsp;name=request.getParameter(“name”);<BR>Name=new&nbsp;String(name.getBytes(“ISO8859-1”));<BR>session.setAttribute(“user”,name);<BR>%&gt;<BR><BR>　　做过jsp的兄弟应该对这段代码再熟悉不过了，下面写个监听器来监听用户登陆，把所有用户的ID保存到一个List当中，这个监听器实作HttpSessionAttributeListener接口：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG id=Codehighlighter1_0_31_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_31_Open_Text.style.display='none'; Codehighlighter1_0_31_Closed_Image.style.display='inline'; Codehighlighter1_0_31_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_31_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_31_Closed_Text.style.display='none'; Codehighlighter1_0_31_Open_Image.style.display='inline'; Codehighlighter1_0_31_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_31_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_0_31_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*@Author&nbsp;bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*2004-6-12<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #008000"><FONT size=4>*/</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;org.bromon.test;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;javax.servlet.</FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;javax.servlet.http.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;OnlineList&nbsp;implements&nbsp;HttpSessionAttributeListener<BR><IMG id=Codehighlighter1_197_597_Open_Image onclick="this.style.display='none'; Codehighlighter1_197_597_Open_Text.style.display='none'; Codehighlighter1_197_597_Closed_Image.style.display='inline'; Codehighlighter1_197_597_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_197_597_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_197_597_Closed_Text.style.display='none'; Codehighlighter1_197_597_Open_Image.style.display='inline'; Codehighlighter1_197_597_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_197_597_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_197_597_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;List&nbsp;list</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;ArrayList();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;attributeAdded(HttpSessionBindingEvent&nbsp;se)<BR><IMG id=Codehighlighter1_297_360_Open_Image onclick="this.style.display='none'; Codehighlighter1_297_360_Open_Text.style.display='none'; Codehighlighter1_297_360_Closed_Image.style.display='inline'; Codehighlighter1_297_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_297_360_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_297_360_Closed_Text.style.display='none'; Codehighlighter1_297_360_Open_Image.style.display='inline'; Codehighlighter1_297_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_297_360_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_297_360_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">(“user”.equals(se.getName()))<BR><IMG id=Codehighlighter1_331_358_Open_Image onclick="this.style.display='none'; Codehighlighter1_331_358_Open_Text.style.display='none'; Codehighlighter1_331_358_Closed_Image.style.display='inline'; Codehighlighter1_331_358_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_331_358_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_331_358_Closed_Text.style.display='none'; Codehighlighter1_331_358_Open_Image.style.display='inline'; Codehighlighter1_331_358_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_331_358_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_331_358_Open_Text><SPAN style="COLOR: #000000"><FONT size=4>{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>list.add(se.getValue());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;attributeRemoved(HttpSessionBindingEvent&nbsp;se)<BR><IMG id=Codehighlighter1_420_486_Open_Image onclick="this.style.display='none'; Codehighlighter1_420_486_Open_Text.style.display='none'; Codehighlighter1_420_486_Closed_Image.style.display='inline'; Codehighlighter1_420_486_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_420_486_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_420_486_Closed_Text.style.display='none'; Codehighlighter1_420_486_Open_Image.style.display='inline'; Codehighlighter1_420_486_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_420_486_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_420_486_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">(“user”.equals(se.getName()))<BR><IMG id=Codehighlighter1_454_484_Open_Image onclick="this.style.display='none'; Codehighlighter1_454_484_Open_Text.style.display='none'; Codehighlighter1_454_484_Closed_Image.style.display='inline'; Codehighlighter1_454_484_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_454_484_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_454_484_Closed_Text.style.display='none'; Codehighlighter1_454_484_Open_Image.style.display='inline'; Codehighlighter1_454_484_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_454_484_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_454_484_Open_Text><SPAN style="COLOR: #000000"><FONT size=4>{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>list.remove(se.getValue());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_546_547_Open_Image onclick="this.style.display='none'; Codehighlighter1_546_547_Open_Text.style.display='none'; Codehighlighter1_546_547_Closed_Image.style.display='inline'; Codehighlighter1_546_547_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_546_547_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_546_547_Closed_Text.style.display='none'; Codehighlighter1_546_547_Open_Image.style.display='inline'; Codehighlighter1_546_547_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;attributeReplaced(HttpSessionBindingEvent&nbsp;se)</SPAN><SPAN id=Codehighlighter1_546_547_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_546_547_Open_Text><SPAN style="COLOR: #000000">{}</SPAN></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;List&nbsp;getList()<BR><IMG id=Codehighlighter1_579_595_Open_Image onclick="this.style.display='none'; Codehighlighter1_579_595_Open_Text.style.display='none'; Codehighlighter1_579_595_Closed_Image.style.display='inline'; Codehighlighter1_579_595_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_579_595_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_579_595_Closed_Text.style.display='none'; Codehighlighter1_579_595_Open_Image.style.display='inline'; Codehighlighter1_579_595_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_579_595_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_579_595_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">return</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>(list);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><BR><FONT size=4>写个简单的jsp来得到用户列表：<BR>&lt;%<BR>java.util.List&nbsp;list=org.bromon.test.OnlineList.getList();<BR>out.println(“共有”+list.size()+”名用户已登陆：”);<BR>for(int&nbsp;I=0;I&lt;lise.size();i++)<BR>{<BR>out.println(list.get(i));<BR>}<BR>%&gt;<BR><BR>也许你说，这有什么神奇呢，监听session而已，不着急，看看xmlhttp。<BR><BR>二、 XMLHTTP<BR><BR>　　XMLHTTP的用处很多，这里只说我们需要的，就是无刷新的与server通信，看这段代码：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">script&nbsp;language</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">javascript</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>xml&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ActiveXObject(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Microsoft.XMLHTTP</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;post</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">构造要携带的数据&nbsp;</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">xml.open(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">POST</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://localhost:7001/TestWL/index.jsp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">使用POST方法打开一个到服务器的连接，以异步方式通信&nbsp;</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">xml.setrequestheader(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">content-length</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">,post.length);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>xml.setrequestheader(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">content-type</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">application/x-www-form-urlencoded</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>xml.send(post);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">发送数据&nbsp;</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;res&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;xml.responseText;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">接收服务器返回的数据&nbsp;</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">document.write(res);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">script</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P align=left><BR><FONT size=4>　　豁然开朗，这段代码就是打开一个HTTP连接，以标准的HTTP格式传递数据，如果你喜欢，可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一个轮询，每隔一段时间刷新一次用户列表，当然，是不需要刷新页面的：<BR><BR>&lt;html&gt;<BR>&lt;head&gt;&lt;title&gt;探测器&lt;/title&gt;<BR>&lt;script&nbsp;language="javascript"&gt;<BR>function&nbsp;detect()<BR>{<BR>xml&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLHTTP");&nbsp;<BR>var&nbsp;post="&nbsp;";//构造要携带的数据&nbsp;<BR>xml.open("POST","<IMG alt="" hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0></FONT><A href="http://blog.csdn.net/bromon/archive/2004/06/22/'http://localhost:7001/TestWL/index.jsp" target=_blank 使用POST方法打开一个到服务器的连接，以异步方式通信?? ,false);><FONT color=#002c99 size=4>http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打开一个到服务器的连接，以异步方式通信</FONT></A><FONT size=4> <BR>xml.setrequestheader("content-length",post.length);&nbsp;<BR>xml.setrequestheader("content-type","application/x-www-form-urlencoded");&nbsp;<BR>xml.send(post);//发送数据&nbsp;<BR>var&nbsp;res&nbsp;=&nbsp;xml.responseText;//接收服务器返回的数据&nbsp;<BR>list.innerText=res;<BR>setTimeout(“detect()”,5000);//每隔5秒钟轮询一次<BR>}&nbsp;<BR>&lt;/script&gt;<BR>&lt;body&nbsp;onload=”detect()”&gt;<BR>&lt;a&nbsp;id=”list”&gt;&lt;/a&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;<BR><BR>　　这样的通信方式数据量很小，不用重新传递整个页面，5秒钟轮一次，普通PC也能承受较大的在线数。构造一个探测器来监听在线列表和消息，效果是很好的，即使你的客户坐在电脑前袖手旁观，键鼠都不碰一下，也能保证数据即时传递，页面也不会发生跳转和刷新。<BR><BR>Session监听加上XMLHTTP通信，开发一个较为完善的站内消息系统实在易如反掌。</FONT><B><BR></P></B><img src ="http://www.blogjava.net/bromon/aggbug/2539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:37 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java操作Excel的一种方法</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2538.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2538.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2538.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2538.html</trackback:ping><description><![CDATA[<FONT size=4>Java操作Excel的一种方法 </FONT>
<P></P>
<P><FONT size=4>&nbsp;bromon原创&nbsp;版权所有</FONT></P>
<P><FONT size=4>　　MS的电子表格（Excel）是Office的重要成员，是保存统计数据的一种常用格式。作为办公文档，势必要涉及到的电子文档的交换，Excel是一种在企业中非常通用的文件格式，打印和管理也比较方便。在一个Java应用中，将一部分数据生成Excel格式，是与其他系统无缝连接的重要手段。</FONT></P>
<P><FONT size=4>　　在开源世界中，有两套比较有影响的API可供使用，一个是POI，一个是jExcelAPI。其中jExcelAPI是一个韩国程序员的作品，虽然没有POI那样血统高贵，但是在笔者的使用过程中，感觉简单方便，对中文支持非常好，功能也比较强大。它的下载地址是：<IMG alt="" hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0></FONT><A href="http://www.andykhan.com/jexcelapi/" target=_blank><FONT color=#002c99 size=4>http://www.andykhan.com/jexcelapi/</FONT></A><FONT size=4> &nbsp;当前的最高版本是2.4。作者的网站上对它的特征有如下描述：</FONT></P>
<P><FONT size=4>&nbsp;●&nbsp;支持Excel&nbsp;95-2000的所有版本<BR>&nbsp;●&nbsp;生成Excel&nbsp;2000标准格式<BR>&nbsp;●&nbsp;支持字体、数字、日期操作<BR>&nbsp;●&nbsp;能够修饰单元格属性<BR>&nbsp;●&nbsp;支持图像和图表</FONT></P>
<P><FONT size=4>　　应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的，并不依赖Windows系统，即使运行在Linux下，它同样能够正确的处理Excel文件。另外需要说明的是，这套API对图形和图表的支持很有限，而且仅仅识别PNG格式。</FONT></P>
<P><FONT size=4>&nbsp;　　搭建环境</FONT></P>
<P><FONT size=4>　　将下载后的文件解包，得到jxl.jar，放入classpath，安装就完成了。</FONT></P>
<P><FONT size=4>　　基本操作</FONT></P>
<P><FONT size=4>&nbsp;一、创建文件</FONT></P>
<P><FONT size=4>　　拟生成一个名为“测试数据.xls”的Excel文件，其中第一个工作表被命名为“第一页”，大致效果如下：</FONT></P>
<P><FONT size=4>&nbsp;代码（CreateXLS.java）：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">生成Excel的类</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;jxl.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;jxl.write.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;CreateXLS<BR><IMG id=Codehighlighter1_93_724_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_724_Open_Text.style.display='none'; Codehighlighter1_93_724_Closed_Image.style.display='inline'; Codehighlighter1_93_724_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_93_724_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_724_Closed_Text.style.display='none'; Codehighlighter1_93_724_Open_Image.style.display='inline'; Codehighlighter1_93_724_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_93_724_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_93_724_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_136_721_Open_Image onclick="this.style.display='none'; Codehighlighter1_136_721_Open_Text.style.display='none'; Codehighlighter1_136_721_Closed_Image.style.display='inline'; Codehighlighter1_136_721_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_136_721_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_136_721_Closed_Text.style.display='none'; Codehighlighter1_136_721_Open_Image.style.display='inline'; Codehighlighter1_136_721_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_136_721_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_136_721_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG id=Codehighlighter1_144_666_Open_Image onclick="this.style.display='none'; Codehighlighter1_144_666_Open_Text.style.display='none'; Codehighlighter1_144_666_Closed_Image.style.display='inline'; Codehighlighter1_144_666_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_144_666_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_144_666_Closed_Text.style.display='none'; Codehighlighter1_144_666_Open_Image.style.display='inline'; Codehighlighter1_144_666_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</FONT></SPAN><SPAN id=Codehighlighter1_144_666_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><FONT size=4><IMG src="http://www.blogjava.net/images/dot.gif"></FONT></SPAN><SPAN id=Codehighlighter1_144_666_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">打开文件</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;&nbsp;WritableWorkbook&nbsp;book</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Workbook.createWorkbook(</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>new</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;File(“测试.xls”));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">生成名为“第一页”的工作表，参数0表示这是第一页</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;WritableSheet&nbsp;sheet</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">book.createSheet(“第一页”,</SPAN><SPAN style="COLOR: #000000">0</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN></FONT><FONT size=4><SPAN style="COLOR: #008000">在Label对象的构造子中指名单元格位置是第一列第一行(0,0)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">以及单元格内容为test</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;Label&nbsp;label</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Label(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">,”test”);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">将定义好的单元格添加到工作表中</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;sheet.addCell(label);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_455_521_Open_Image onclick="this.style.display='none'; Codehighlighter1_455_521_Open_Text.style.display='none'; Codehighlighter1_455_521_Closed_Image.style.display='inline'; Codehighlighter1_455_521_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_455_521_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_455_521_Closed_Text.style.display='none'; Codehighlighter1_455_521_Open_Image.style.display='inline'; Codehighlighter1_455_521_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_455_521_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN></FONT><SPAN id=Codehighlighter1_455_521_Open_Text><SPAN style="COLOR: #008000"><FONT size=4>/*</FONT></SPAN><FONT size=4><SPAN style="COLOR: #008000">生成一个保存数字的单元格<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;必须使用Number的完整包路径，否则有语法歧义<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;单元格位置是第二列，第一行，值为789.123</SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;jxl.write.Number&nbsp;number&nbsp;</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;jxl.write.Number(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">789.123</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;sheet.addCell(number);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">写入数据并关闭文件</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;&nbsp;&nbsp;book.write();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;book.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>catch</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_688_718_Open_Image onclick="this.style.display='none'; Codehighlighter1_688_718_Open_Text.style.display='none'; Codehighlighter1_688_718_Closed_Image.style.display='inline'; Codehighlighter1_688_718_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_688_718_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_688_718_Closed_Text.style.display='none'; Codehighlighter1_688_718_Open_Image.style.display='inline'; Codehighlighter1_688_718_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_688_718_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_688_718_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>&nbsp;　　编译执行后，会在当前位置产生一个Excel文件。</FONT></P>
<P><FONT size=4>&nbsp;三、读取文件</FONT></P>
<P><FONT size=4>&nbsp;　　以刚才我们创建的Excel文件为例，做一个简单的读取操作，程序代码如下：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">读取Excel的类</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;jxl.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;ReadXLS<BR><IMG id=Codehighlighter1_70_428_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_428_Open_Text.style.display='none'; Codehighlighter1_70_428_Closed_Image.style.display='inline'; Codehighlighter1_70_428_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_70_428_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_428_Closed_Text.style.display='none'; Codehighlighter1_70_428_Open_Image.style.display='inline'; Codehighlighter1_70_428_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_70_428_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_70_428_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_113_425_Open_Image onclick="this.style.display='none'; Codehighlighter1_113_425_Open_Text.style.display='none'; Codehighlighter1_113_425_Closed_Image.style.display='inline'; Codehighlighter1_113_425_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_113_425_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_425_Closed_Text.style.display='none'; Codehighlighter1_113_425_Open_Image.style.display='inline'; Codehighlighter1_113_425_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_113_425_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_113_425_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG id=Codehighlighter1_123_370_Open_Image onclick="this.style.display='none'; Codehighlighter1_123_370_Open_Text.style.display='none'; Codehighlighter1_123_370_Closed_Image.style.display='inline'; Codehighlighter1_123_370_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_123_370_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_123_370_Closed_Text.style.display='none'; Codehighlighter1_123_370_Open_Image.style.display='inline'; Codehighlighter1_123_370_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</FONT></SPAN><SPAN id=Codehighlighter1_123_370_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><FONT size=4><IMG src="http://www.blogjava.net/images/dot.gif"></FONT></SPAN><SPAN id=Codehighlighter1_123_370_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Workbook&nbsp;book</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Workbook.getWorkbook(</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>new</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;File(“测试.xls”));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">获得第一个工作表对象</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;Sheet&nbsp;sheet</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">book.getSheet(</SPAN><SPAN style="COLOR: #000000">0</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">得到第一列第一行的单元格</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;Cell&nbsp;cell1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">sheet.getCell(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;String&nbsp;result</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">cell1.getContents();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>.println(result);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;book.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>catch</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_392_422_Open_Image onclick="this.style.display='none'; Codehighlighter1_392_422_Open_Text.style.display='none'; Codehighlighter1_392_422_Closed_Image.style.display='inline'; Codehighlighter1_392_422_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_392_422_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_392_422_Closed_Text.style.display='none'; Codehighlighter1_392_422_Open_Image.style.display='inline'; Codehighlighter1_392_422_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_392_422_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_392_422_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>&nbsp;程序执行结果：test</FONT></P>
<P><FONT size=4>&nbsp;四、修改文件</FONT></P>
<P><FONT size=4>&nbsp;　　利用jExcelAPI可以修改已有的Excel文件，修改Excel文件的时候，除了打开文件的方式不同之外，其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">修改Excel的类，添加一个工作表</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;jxl.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;jxl.write.</SPAN><SPAN style="COLOR: #000000">*</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;UpdateXLS<BR><IMG id=Codehighlighter1_101_544_Open_Image onclick="this.style.display='none'; Codehighlighter1_101_544_Open_Text.style.display='none'; Codehighlighter1_101_544_Closed_Image.style.display='inline'; Codehighlighter1_101_544_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_101_544_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_101_544_Closed_Text.style.display='none'; Codehighlighter1_101_544_Open_Image.style.display='inline'; Codehighlighter1_101_544_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_101_544_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_101_544_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_144_541_Open_Image onclick="this.style.display='none'; Codehighlighter1_144_541_Open_Text.style.display='none'; Codehighlighter1_144_541_Closed_Image.style.display='inline'; Codehighlighter1_144_541_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_144_541_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_144_541_Closed_Text.style.display='none'; Codehighlighter1_144_541_Open_Image.style.display='inline'; Codehighlighter1_144_541_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_144_541_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_144_541_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG id=Codehighlighter1_154_486_Open_Image onclick="this.style.display='none'; Codehighlighter1_154_486_Open_Text.style.display='none'; Codehighlighter1_154_486_Closed_Image.style.display='inline'; Codehighlighter1_154_486_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_154_486_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_486_Closed_Text.style.display='none'; Codehighlighter1_154_486_Open_Image.style.display='inline'; Codehighlighter1_154_486_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</FONT></SPAN><SPAN id=Codehighlighter1_154_486_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><FONT size=4><IMG src="http://www.blogjava.net/images/dot.gif"></FONT></SPAN><SPAN id=Codehighlighter1_154_486_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Excel获得文件</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;Workbook&nbsp;wb</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">Workbook.getWorkbook(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;File(“测试.xls”));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">打开一个文件的副本，并且指定数据写回到原文件</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;WritableWorkbook&nbsp;book</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Workbook.createWorkbook(</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>new</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;File(“测试.xls”),wb);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">添加一个工作表</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;WritableSheet&nbsp;sheet</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">book.createSheet(“第二页”,</SPAN><SPAN style="COLOR: #000000">1</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;sheet.addCell(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Label(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>,”第二页的测试数据”));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;book.write();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;book.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #0000ff"><FONT size=4>catch</FONT></SPAN><FONT size=4><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_508_538_Open_Image onclick="this.style.display='none'; Codehighlighter1_508_538_Open_Text.style.display='none'; Codehighlighter1_508_538_Closed_Image.style.display='inline'; Codehighlighter1_508_538_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_508_538_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_508_538_Closed_Text.style.display='none'; Codehighlighter1_508_538_Open_Image.style.display='inline'; Codehighlighter1_508_538_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_508_538_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_508_538_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P><FONT size=4></FONT>&nbsp;</P>
<P><FONT size=4>&nbsp;执行结果如图：</FONT></P>
<P><FONT size=4>&nbsp;高级操作</FONT></P>
<P><FONT size=4>&nbsp;一、&nbsp;数据格式化</FONT></P>
<P><FONT size=4>&nbsp;　　在Excel中不涉及复杂的数据类型，能够比较好的处理字串、数字和日期已经能够满足一般的应用。</FONT></P>
<P><FONT size=4>&nbsp;1、&nbsp;字串格式化</FONT></P>
<P><FONT size=4>&nbsp;　　字符串的格式化涉及到的是字体、粗细、字号等元素，这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时，使用如下语句，为方便叙述，我们为每一行命令加了编号：</FONT></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">WritableFont&nbsp;font1</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;WritableFont(WritableFont.TIMES,</SPAN><SPAN style="COLOR: #000000">16</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">,WritableFont.BOLD);&nbsp;①<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;WritableCellFormat&nbsp;format1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">&nbsp;WritableCellFormat(font1);&nbsp;②<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;Label&nbsp;label</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Label(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,”data&nbsp;</SPAN><SPAN style="COLOR: #000000">4</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>&nbsp;test”,format1)&nbsp;③<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV></DIV>
<P><BR><BR><FONT size=4>　　其中①指定了字串格式：字体为TIMES，字号16，加粗显示。WritableFont有非常丰富的构造子，供不同情况下使用，jExcelAPI的java-doc中有详细列表，这里不再列出。</FONT></P>
<P><FONT size=4>　　②处代码使用了WritableCellFormat类，这个类非常重要，通过它可以指定单元格的各种属性，后面的单元格格式化中会有更多描述。</FONT></P>
<P><FONT size=4>　　③处使用了Label类的构造子，指定了字串被赋予那种格式。</FONT></P>
<P><FONT size=4>　　在WritableCellFormat类中，还有一个很重要的方法是指定数据的对齐方式，比如针对我们上面的实例，可以指定：</FONT></P>
<P><FONT size=4>&nbsp;//把水平对齐方式指定为居中<BR>&nbsp;format1.setAlignment(jxl.format.Alignment.CENTRE);</FONT></P>
<P><FONT size=4>&nbsp;//把垂直对齐方式指定为居中<BR>&nbsp;format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);</FONT></P>
<P><FONT size=4>&nbsp;二、单元格操作</FONT></P>
<P><FONT size=4>　　Excel中很重要的一部分是对单元格的操作，比如行高、列宽、单元格合并等，所幸jExcelAPI提供了这些支持。这些操作相对比较简单，下面只介绍一下相关的API。</FONT></P>
<P><FONT size=4>&nbsp;1、&nbsp;合并单元格</FONT></P>
<P><FONT size=4>&nbsp;WritableSheet.mergeCells(int&nbsp;m,int&nbsp;n,int&nbsp;p,int&nbsp;q);&nbsp;</FONT></P>
<P><FONT size=4>&nbsp;作用是从(m,n)到(p,q)的单元格全部合并，比如：<BR>&nbsp;WritableSheet&nbsp;sheet=book.createSheet(“第一页”,0);</FONT></P>
<P><FONT size=4>&nbsp;//合并第一列第一行到第六列第一行的所有单元格<BR>&nbsp;sheet.mergeCells(0,0,5,0);</FONT></P>
<P><FONT size=4>&nbsp;合并既可以是横向的，也可以是纵向的。合并后的单元格不能再次进行合并，否则会触发异常。</FONT></P>
<P><FONT size=4>&nbsp;2、&nbsp;行高和列宽</FONT></P>
<P><FONT size=4>&nbsp;WritableSheet.setRowView(int&nbsp;i,int&nbsp;height);</FONT></P>
<P><FONT size=4>&nbsp;作用是指定第i+1行的高度，比如：</FONT></P>
<P><FONT size=4>&nbsp;//将第一行的高度设为200<BR>&nbsp;sheet.setRowView(0,200);</FONT></P>
<P><FONT size=4>&nbsp;WritableSheet.setColumnView(int&nbsp;i,int&nbsp;width);</FONT></P>
<P><FONT size=4>&nbsp;作用是指定第i+1列的宽度，比如：</FONT></P>
<P><FONT size=4>&nbsp;//将第一列的宽度设为30<BR>&nbsp;sheet.setColumnView(0,30);</FONT></P>
<P><FONT size=4>&nbsp;jExcelAPI还有其他的一些功能，比如插入图片等，这里就不再一一介绍，读者可以自己探索。</FONT></P>
<P><FONT size=4>&nbsp;四川绵阳<BR>&nbsp;原文发表于《开发高手》0405期</FONT></P><img src ="http://www.blogjava.net/bromon/aggbug/2538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:29 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javamail使用指南(二)</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2537.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2537.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2537.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2537.html</trackback:ping><description><![CDATA[&nbsp;二、&nbsp;邮件的收取 <BR>
<P></P>
<P>Bromon原创&nbsp;请尊重版权<BR><BR>&nbsp;　　通常情况下我们都使用pop3协议来收邮件，IMAP嘛现在就不涉及了。收邮件的功能虽然我用了很多时间才基本搞清楚，不过讲起来就so&nbsp;easy了，一个程序就可以基本包括。</P>
<P>&nbsp;　　邮件大致可以分三种：纯文本邮件、含有其他数据的文本邮件、含有附件的邮件。</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_29_Open_Text.style.display='none'; Codehighlighter1_0_29_Closed_Image.style.display='inline'; Codehighlighter1_0_29_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_29_Closed_Text.style.display='none'; Codehighlighter1_0_29_Open_Image.style.display='inline'; Codehighlighter1_0_29_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_29_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_29_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Created&nbsp;on&nbsp;2004-4-26<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;package&nbsp;org.bromon.mail;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.mail.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_121_145_Open_Image onclick="this.style.display='none'; Codehighlighter1_121_145_Open_Text.style.display='none'; Codehighlighter1_121_145_Closed_Image.style.display='inline'; Codehighlighter1_121_145_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_121_145_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_145_Closed_Text.style.display='none'; Codehighlighter1_121_145_Open_Image.style.display='inline'; Codehighlighter1_121_145_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_121_145_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_121_145_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;Bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Receiver<BR><IMG id=Codehighlighter1_171_3183_Open_Image onclick="this.style.display='none'; Codehighlighter1_171_3183_Open_Text.style.display='none'; Codehighlighter1_171_3183_Closed_Image.style.display='inline'; Codehighlighter1_171_3183_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_171_3183_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_3183_Closed_Text.style.display='none'; Codehighlighter1_171_3183_Open_Image.style.display='inline'; Codehighlighter1_171_3183_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_171_3183_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_171_3183_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Folder&nbsp;inbox;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Store&nbsp;store;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">连接邮件服务器，获得所有邮件的列表</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Message[]&nbsp;getMail(String&nbsp;host,String&nbsp;name,String&nbsp;password)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_309_769_Open_Image onclick="this.style.display='none'; Codehighlighter1_309_769_Open_Text.style.display='none'; Codehighlighter1_309_769_Closed_Image.style.display='inline'; Codehighlighter1_309_769_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_309_769_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_309_769_Closed_Text.style.display='none'; Codehighlighter1_309_769_Open_Image.style.display='inline'; Codehighlighter1_309_769_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_309_769_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_309_769_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Properties&nbsp;prop</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Properties();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;prop.put(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">mail.pop3.host</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,host);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Session&nbsp;session</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">Session.getDefaultInstance(prop);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;store</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">session.getStore(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">pop3</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;store.connect(host,name,password);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;inbox</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">store.getDefaultFolder().getFolder(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">INBOX</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;inbox.open(Folder.READ_ONLY);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Message[]&nbsp;msg</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">inbox.getMessages();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;FetchProfile&nbsp;profile</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FetchProfile();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;profile.add(FetchProfile.Item.ENVELOPE);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;inbox.fetch(msg,profile);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">(msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">处理任何一种邮件都需要的方法</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;handle(Message&nbsp;msg)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_842_1001_Open_Image onclick="this.style.display='none'; Codehighlighter1_842_1001_Open_Text.style.display='none'; Codehighlighter1_842_1001_Closed_Image.style.display='inline'; Codehighlighter1_842_1001_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_842_1001_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_842_1001_Closed_Text.style.display='none'; Codehighlighter1_842_1001_Open_Image.style.display='inline'; Codehighlighter1_842_1001_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_842_1001_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_842_1001_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">邮件主题:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">msg.getSubject());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">邮件作者:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">msg.getFrom()[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">].toString());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">发送日期:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">msg.getSentDate());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">处理文本邮件</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;handleText(Message&nbsp;msg)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_1069_1140_Open_Image onclick="this.style.display='none'; Codehighlighter1_1069_1140_Open_Text.style.display='none'; Codehighlighter1_1069_1140_Closed_Image.style.display='inline'; Codehighlighter1_1069_1140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1069_1140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1069_1140_Closed_Text.style.display='none'; Codehighlighter1_1069_1140_Open_Image.style.display='inline'; Codehighlighter1_1069_1140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_1069_1140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1069_1140_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.handle(msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">邮件内容:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">msg.getContent());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">处理Multipart邮件，包括了保存附件的功能</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;handleMultipart(Message&nbsp;msg)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_1231_1712_Open_Image onclick="this.style.display='none'; Codehighlighter1_1231_1712_Open_Text.style.display='none'; Codehighlighter1_1231_1712_Closed_Image.style.display='inline'; Codehighlighter1_1231_1712_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1231_1712_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1231_1712_Closed_Text.style.display='none'; Codehighlighter1_1231_1712_Open_Image.style.display='inline'; Codehighlighter1_1231_1712_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_1231_1712_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1231_1712_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;disposition;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;BodyPart&nbsp;part;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Multipart&nbsp;mp</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(Multipart)msg.getContent();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;mpCount</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">mp.getCount();</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Miltipart的数量,用于除了多个part,比如多个附件</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;m</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;m</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">mpCount;m</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_1411_1709_Open_Image onclick="this.style.display='none'; Codehighlighter1_1411_1709_Open_Text.style.display='none'; Codehighlighter1_1411_1709_Closed_Image.style.display='inline'; Codehighlighter1_1411_1709_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1411_1709_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1411_1709_Closed_Text.style.display='none'; Codehighlighter1_1411_1709_Open_Image.style.display='inline'; Codehighlighter1_1411_1709_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1411_1709_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1411_1709_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.handle(msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;part</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">mp.getBodyPart(m);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;disposition</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">part.getDisposition();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(disposition</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;disposition.equals(Part.ATTACHMENT))</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">判断是否有附件</SPAN><SPAN style="COLOR: #008000"><BR><IMG id=Codehighlighter1_1579_1652_Open_Image onclick="this.style.display='none'; Codehighlighter1_1579_1652_Open_Text.style.display='none'; Codehighlighter1_1579_1652_Closed_Image.style.display='inline'; Codehighlighter1_1579_1652_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1579_1652_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1579_1652_Closed_Text.style.display='none'; Codehighlighter1_1579_1652_Open_Image.style.display='inline'; Codehighlighter1_1579_1652_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1579_1652_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1579_1652_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">this.saveAttach(part);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">这个方法负责保存附件，注释掉是因为附件可能有病毒，请清理信箱之后再取掉注释</SPAN><SPAN style="COLOR: #008000"><BR><IMG id=Codehighlighter1_1657_1705_Open_Image onclick="this.style.display='none'; Codehighlighter1_1657_1705_Open_Text.style.display='none'; Codehighlighter1_1657_1705_Closed_Image.style.display='inline'; Codehighlighter1_1657_1705_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1657_1705_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1657_1705_Closed_Text.style.display='none'; Codehighlighter1_1657_1705_Open_Image.style.display='inline'; Codehighlighter1_1657_1705_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN id=Codehighlighter1_1657_1705_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1657_1705_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(part.getContent());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;saveAttach(BodyPart&nbsp;part)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_1773_2263_Open_Image onclick="this.style.display='none'; Codehighlighter1_1773_2263_Open_Text.style.display='none'; Codehighlighter1_1773_2263_Closed_Image.style.display='inline'; Codehighlighter1_1773_2263_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1773_2263_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1773_2263_Closed_Text.style.display='none'; Codehighlighter1_1773_2263_Open_Image.style.display='inline'; Codehighlighter1_1773_2263_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_1773_2263_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1773_2263_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;temp</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">part.getFileName();</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">得到未经处理的附件名字</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;String&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">temp.substring(</SPAN><SPAN style="COLOR: #000000">11</SPAN><SPAN style="COLOR: #000000">,temp.indexOf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">?=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">去到header和footer<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">文件名一般都经过了base64编码,下面是解码</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;String&nbsp;fileName</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.base64Decoder(s);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">有附件:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">fileName);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;InputStream&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">part.getInputStream();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;FileOutputStream&nbsp;writer</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileOutputStream(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;File(fileName));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">byte</SPAN><SPAN style="COLOR: #000000">[]&nbsp;content</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">byte</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN style="COLOR: #000000">255</SPAN><SPAN style="COLOR: #000000">];<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;read</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">((read</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">.read(content))</SPAN><SPAN style="COLOR: #000000">!=-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_2198_2228_Open_Image onclick="this.style.display='none'; Codehighlighter1_2198_2228_Open_Text.style.display='none'; Codehighlighter1_2198_2228_Closed_Image.style.display='inline'; Codehighlighter1_2198_2228_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2198_2228_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2198_2228_Closed_Text.style.display='none'; Codehighlighter1_2198_2228_Open_Image.style.display='inline'; Codehighlighter1_2198_2228_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2198_2228_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2198_2228_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;writer.write(content);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;writer.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">base64解码</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;base64Decoder(String&nbsp;s)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_2336_2468_Open_Image onclick="this.style.display='none'; Codehighlighter1_2336_2468_Open_Text.style.display='none'; Codehighlighter1_2336_2468_Closed_Image.style.display='inline'; Codehighlighter1_2336_2468_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2336_2468_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2336_2468_Closed_Text.style.display='none'; Codehighlighter1_2336_2468_Open_Image.style.display='inline'; Codehighlighter1_2336_2468_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_2336_2468_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2336_2468_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;sun.misc.BASE64Decoder&nbsp;decoder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;sun.misc.BASE64Decoder();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">byte</SPAN><SPAN style="COLOR: #000000">[]&nbsp;b</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">decoder.decodeBuffer(s);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;String(b));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">关闭连接</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;close()&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_2518_2617_Open_Image onclick="this.style.display='none'; Codehighlighter1_2518_2617_Open_Text.style.display='none'; Codehighlighter1_2518_2617_Closed_Image.style.display='inline'; Codehighlighter1_2518_2617_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2518_2617_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2518_2617_Closed_Text.style.display='none'; Codehighlighter1_2518_2617_Open_Image.style.display='inline'; Codehighlighter1_2518_2617_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_2518_2617_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2518_2617_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(inbox</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_2540_2567_Open_Image onclick="this.style.display='none'; Codehighlighter1_2540_2567_Open_Text.style.display='none'; Codehighlighter1_2540_2567_Closed_Image.style.display='inline'; Codehighlighter1_2540_2567_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2540_2567_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2540_2567_Closed_Text.style.display='none'; Codehighlighter1_2540_2567_Open_Image.style.display='inline'; Codehighlighter1_2540_2567_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2540_2567_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2540_2567_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;inbox.close(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(store</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_2592_2614_Open_Image onclick="this.style.display='none'; Codehighlighter1_2592_2614_Open_Text.style.display='none'; Codehighlighter1_2592_2614_Closed_Image.style.display='inline'; Codehighlighter1_2592_2614_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2592_2614_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2592_2614_Closed_Text.style.display='none'; Codehighlighter1_2592_2614_Open_Image.style.display='inline'; Codehighlighter1_2592_2614_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2592_2614_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2592_2614_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;store.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_2661_3180_Open_Image onclick="this.style.display='none'; Codehighlighter1_2661_3180_Open_Text.style.display='none'; Codehighlighter1_2661_3180_Closed_Image.style.display='inline'; Codehighlighter1_2661_3180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2661_3180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2661_3180_Closed_Text.style.display='none'; Codehighlighter1_2661_3180_Open_Image.style.display='inline'; Codehighlighter1_2661_3180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_2661_3180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2661_3180_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;host</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">pop.163.com</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;name</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">bromon</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">My&nbsp;password</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Receiver&nbsp;receiver</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Receiver();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_2799_3125_Open_Image onclick="this.style.display='none'; Codehighlighter1_2799_3125_Open_Text.style.display='none'; Codehighlighter1_2799_3125_Closed_Image.style.display='inline'; Codehighlighter1_2799_3125_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2799_3125_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2799_3125_Closed_Text.style.display='none'; Codehighlighter1_2799_3125_Open_Image.style.display='inline'; Codehighlighter1_2799_3125_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2799_3125_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2799_3125_Open_Text><SPAN style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Message[]&nbsp;msg</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">receiver.getMail(host,name,password);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">msg.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_2899_3100_Open_Image onclick="this.style.display='none'; Codehighlighter1_2899_3100_Open_Text.style.display='none'; Codehighlighter1_2899_3100_Closed_Image.style.display='inline'; Codehighlighter1_2899_3100_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2899_3100_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2899_3100_Closed_Text.style.display='none'; Codehighlighter1_2899_3100_Open_Image.style.display='inline'; Codehighlighter1_2899_3100_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2899_3100_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2899_3100_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(msg[i].isMimeType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">))</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">判断邮件类型</SPAN><SPAN style="COLOR: #008000"><BR><IMG id=Codehighlighter1_2949_2989_Open_Image onclick="this.style.display='none'; Codehighlighter1_2949_2989_Open_Text.style.display='none'; Codehighlighter1_2949_2989_Closed_Image.style.display='inline'; Codehighlighter1_2949_2989_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2949_2989_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2949_2989_Closed_Text.style.display='none'; Codehighlighter1_2949_2989_Open_Image.style.display='inline'; Codehighlighter1_2949_2989_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2949_2989_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2949_2989_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiver.handleText(msg[i]);<BR><IMG id=Codehighlighter1_2994_3039_Open_Image onclick="this.style.display='none'; Codehighlighter1_2994_3039_Open_Text.style.display='none'; Codehighlighter1_2994_3039_Closed_Image.style.display='inline'; Codehighlighter1_2994_3039_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2994_3039_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2994_3039_Closed_Text.style.display='none'; Codehighlighter1_2994_3039_Open_Image.style.display='inline'; Codehighlighter1_2994_3039_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN id=Codehighlighter1_2994_3039_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_2994_3039_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiver.handleMultipart(msg[i]);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">****************************</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;receiver.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_3147_3177_Open_Image onclick="this.style.display='none'; Codehighlighter1_3147_3177_Open_Text.style.display='none'; Codehighlighter1_3147_3177_Closed_Image.style.display='inline'; Codehighlighter1_3147_3177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_3147_3177_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3147_3177_Closed_Text.style.display='none'; Codehighlighter1_3147_3177_Open_Image.style.display='inline'; Codehighlighter1_3147_3177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_3147_3177_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_3147_3177_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><BR>&nbsp;　　没有习惯读java代码的兄弟可能会觉得麻烦了一点，其中有个小问题，下载的附件会再文件名后面加上一个”#”符号，不知道这是javamail的特别处理还是pop3的规范。通过程序更改文件名很简单，就不说了。对于email还有很多其他的操作，可以自己取查看一下javadoc，我就不影响大家探索的乐趣了。在Properties里配置代理服务器，可以让程序通过代理收发邮件，一般的HTTP、socks&nbsp;4、socks&nbsp;5都支持。</P><img src ="http://www.blogjava.net/bromon/aggbug/2537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:26 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail使用指南(一)</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2536.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2536.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2536.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2536.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2536.html</trackback:ping><description><![CDATA[Bromon原创&nbsp;请尊重版权 
<P></P>
<P>　　怎样才算比较完整的Javamail操作指南？我想应该包括绝大多数基本的email操作，能够应付一般的应用。在本指南中打算囊括以下内容：</P>
<P>&nbsp;●&nbsp;发送email：包括文本邮件、HTML邮件、带附件的邮件、SMTP验证<BR>&nbsp;●&nbsp;接收email：pop3远程连接、收取不同MIME的邮件、处理附件</P>
<P>　　我想有了上述功能的介绍，应该可以应付很多email的相关应用了。所以请允许我给本文拟了一个比较狂妄的名字，这样才能保证收视率，。还是那句话，写这个post的原因就是没有在网上看到更全面的，你看过的话记得要告诉我。</P>
<P>　　下面的所有例子都经过实际测试，你可以说它写得不够OO，不够plugable，但是它的确是可以参考的。自从有了javamail，发垃圾邮件就方便多了。本文代码多说明少，这倒不是我偷懒，而是很多东西都涉及pop3等协议的规范，如果不了解这些规范的话，由的东西我实在不知道怎么跟你解释；如果了解的话，那我基本上就不用再解释。所以本着实用的原则就省略了，由兴趣的话自己去翻翻协议规范。</P>
<P>　　废话少说，首先需要配置环境。需要的包是mail.jar和activation.jar。高版本的J2SDK&nbsp;EE自带。地址嘛，再java.sun.com上搜索一下，很容易找到。放到classpath中就KO。</P>
<P>&nbsp;一、&nbsp;邮件的发送</P>
<P>&nbsp;下面了弄个发邮件的Hello&nbsp;World，热热身：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_140_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_140_Open_Text.style.display='none'; Codehighlighter1_0_140_Closed_Image.style.display='inline'; Codehighlighter1_0_140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_140_Closed_Text.style.display='none'; Codehighlighter1_0_140_Open_Image.style.display='inline'; Codehighlighter1_0_140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_140_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">************<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Name:TextMailSender.java<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Author:Bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Version:1.0<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Date:2004-4-26<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;Note:发送email到bromon@163.com,需要安装SMTP服务器<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;************</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;package&nbsp;org.bromon.mail;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.mail.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.mail.internet.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TextMailSender<BR><IMG id=Codehighlighter1_272_989_Open_Image onclick="this.style.display='none'; Codehighlighter1_272_989_Open_Text.style.display='none'; Codehighlighter1_272_989_Closed_Image.style.display='inline'; Codehighlighter1_272_989_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_272_989_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_272_989_Closed_Text.style.display='none'; Codehighlighter1_272_989_Open_Image.style.display='inline'; Codehighlighter1_272_989_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_272_989_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_272_989_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_315_986_Open_Image onclick="this.style.display='none'; Codehighlighter1_315_986_Open_Text.style.display='none'; Codehighlighter1_315_986_Closed_Image.style.display='inline'; Codehighlighter1_315_986_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_315_986_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_315_986_Closed_Text.style.display='none'; Codehighlighter1_315_986_Open_Image.style.display='inline'; Codehighlighter1_315_986_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_315_986_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_315_986_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_325_931_Open_Image onclick="this.style.display='none'; Codehighlighter1_325_931_Open_Text.style.display='none'; Codehighlighter1_325_931_Closed_Image.style.display='inline'; Codehighlighter1_325_931_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_325_931_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_325_931_Closed_Text.style.display='none'; Codehighlighter1_325_931_Open_Image.style.display='inline'; Codehighlighter1_325_931_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_325_931_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_325_931_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Properties&nbsp;prop</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Properties();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定要使用的SMTP服务器为bromon2k</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;prop.put(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">mail.smtp.host</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">bromon2k</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Session&nbsp;mailSession</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">Session.getDefaultInstance(prop);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">发件人地址</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;InternetAddress&nbsp;from</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;InternetAddress(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">bromon@bromon2k</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">收件人地址</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;InternetAddress&nbsp;to</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;InternetAddress(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">bromon@163.com</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;MimeMessage&nbsp;msg</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MimeMessage(mailSession);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;msg.setFrom(from);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;msg.addRecipient(javax.mail.Message.RecipientType.TO,to);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">发信日期</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;msg.setSentDate(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.Date());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">title</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;msg.setSubject(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">你好</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">邮件正文</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;msg.setText(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello,bromon</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Transport.send(msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_953_983_Open_Image onclick="this.style.display='none'; Codehighlighter1_953_983_Open_Text.style.display='none'; Codehighlighter1_953_983_Closed_Image.style.display='inline'; Codehighlighter1_953_983_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_953_983_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_953_983_Closed_Text.style.display='none'; Codehighlighter1_953_983_Open_Image.style.display='inline'; Codehighlighter1_953_983_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_953_983_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_953_983_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><BR>　　程序很简单，但是它是不能运行的（倒）。除非你的机器上安装了一个SMTP服务器，而且你的机器还叫做bromon2k。写这么一段不能执行的程序不是为了找打，而是让各位对javamail有个基本印象，我就懒得改了。下面演示的是如何通过163、sohu等email服务商提供的免费邮箱来发邮件，基本操作和上面的一样，只是多一个SMTP验证而已：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_29_Open_Text.style.display='none'; Codehighlighter1_0_29_Closed_Image.style.display='inline'; Codehighlighter1_0_29_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_29_Closed_Text.style.display='none'; Codehighlighter1_0_29_Open_Image.style.display='inline'; Codehighlighter1_0_29_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_29_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_29_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Created&nbsp;on&nbsp;2004-4-26<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;package&nbsp;org.bromon.mail;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.mail.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.mail.internet.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_133_157_Open_Image onclick="this.style.display='none'; Codehighlighter1_133_157_Open_Text.style.display='none'; Codehighlighter1_133_157_Closed_Image.style.display='inline'; Codehighlighter1_133_157_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_133_157_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_133_157_Closed_Text.style.display='none'; Codehighlighter1_133_157_Open_Image.style.display='inline'; Codehighlighter1_133_157_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_133_157_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_133_157_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;Bromon<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SenderWithSMTPVer<BR><IMG id=Codehighlighter1_192_1632_Open_Image onclick="this.style.display='none'; Codehighlighter1_192_1632_Open_Text.style.display='none'; Codehighlighter1_192_1632_Closed_Image.style.display='inline'; Codehighlighter1_192_1632_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_192_1632_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_192_1632_Closed_Text.style.display='none'; Codehighlighter1_192_1632_Open_Image.style.display='inline'; Codehighlighter1_192_1632_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_192_1632_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_192_1632_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;String&nbsp;host</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;setHost(String&nbsp;host)<BR><IMG id=Codehighlighter1_285_306_Open_Image onclick="this.style.display='none'; Codehighlighter1_285_306_Open_Text.style.display='none'; Codehighlighter1_285_306_Closed_Image.style.display='inline'; Codehighlighter1_285_306_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_285_306_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_285_306_Closed_Text.style.display='none'; Codehighlighter1_285_306_Open_Image.style.display='inline'; Codehighlighter1_285_306_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_285_306_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_285_306_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.host</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">host;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;setAccount(String&nbsp;user,String&nbsp;password)<BR><IMG id=Codehighlighter1_363_410_Open_Image onclick="this.style.display='none'; Codehighlighter1_363_410_Open_Text.style.display='none'; Codehighlighter1_363_410_Closed_Image.style.display='inline'; Codehighlighter1_363_410_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_363_410_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_363_410_Closed_Text.style.display='none'; Codehighlighter1_363_410_Open_Image.style.display='inline'; Codehighlighter1_363_410_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_363_410_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_363_410_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">user;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">password;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;send(String&nbsp;from,String&nbsp;to,String&nbsp;subject,String&nbsp;content)<BR><IMG id=Codehighlighter1_485_1289_Open_Image onclick="this.style.display='none'; Codehighlighter1_485_1289_Open_Text.style.display='none'; Codehighlighter1_485_1289_Closed_Image.style.display='inline'; Codehighlighter1_485_1289_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_485_1289_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_485_1289_Closed_Text.style.display='none'; Codehighlighter1_485_1289_Open_Image.style.display='inline'; Codehighlighter1_485_1289_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_485_1289_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_485_1289_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Properties&nbsp;props&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Properties();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;props.put(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">mail.smtp.host</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;host);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定SMTP服务器</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;props.put(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">mail.smtp.auth</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">true</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定是否需要SMTP验证</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_635_1231_Open_Image onclick="this.style.display='none'; Codehighlighter1_635_1231_Open_Text.style.display='none'; Codehighlighter1_635_1231_Closed_Image.style.display='inline'; Codehighlighter1_635_1231_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_635_1231_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_635_1231_Closed_Text.style.display='none'; Codehighlighter1_635_1231_Open_Image.style.display='inline'; Codehighlighter1_635_1231_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_635_1231_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_635_1231_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Session&nbsp;mailSession&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Session.getDefaultInstance(props);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;mailSession.setDebug(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">是否在控制台显示debug信息</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Message&nbsp;message</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MimeMessage(mailSession);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;message.setFrom(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;InternetAddress(from));</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">发件人</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;message.addRecipient(Message.RecipientType.TO,</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;InternetAddress(to));</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">收件人</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;message.setSubject(subject);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">邮件主题</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;message.setText(content);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">邮件内容</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;message.saveChanges();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;Transport&nbsp;transport&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;mailSession.getTransport(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">smtp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;transport.connect(host,&nbsp;user,&nbsp;password);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;transport.sendMessage(message,&nbsp;message.getAllRecipients());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;transport.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_1253_1283_Open_Image onclick="this.style.display='none'; Codehighlighter1_1253_1283_Open_Text.style.display='none'; Codehighlighter1_1253_1283_Closed_Image.style.display='inline'; Codehighlighter1_1253_1283_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1253_1283_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1253_1283_Closed_Text.style.display='none'; Codehighlighter1_1253_1283_Open_Image.style.display='inline'; Codehighlighter1_1253_1283_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1253_1283_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1253_1283_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_1333_1628_Open_Image onclick="this.style.display='none'; Codehighlighter1_1333_1628_Open_Text.style.display='none'; Codehighlighter1_1333_1628_Closed_Image.style.display='inline'; Codehighlighter1_1333_1628_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1333_1628_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1333_1628_Closed_Text.style.display='none'; Codehighlighter1_1333_1628_Open_Image.style.display='inline'; Codehighlighter1_1333_1628_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_1333_1628_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1333_1628_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;SenderWithSMTPVer&nbsp;sm</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SenderWithSMTPVer();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;sm.setHost(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">smtp.163.com</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定要使用的邮件服务器</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;sm.setAccount(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">123</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定帐号和密码</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1469_1572_Open_Image onclick="this.style.display='none'; Codehighlighter1_1469_1572_Open_Text.style.display='none'; Codehighlighter1_1469_1572_Closed_Image.style.display='inline'; Codehighlighter1_1469_1572_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1469_1572_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1469_1572_Closed_Text.style.display='none'; Codehighlighter1_1469_1572_Open_Image.style.display='inline'; Codehighlighter1_1469_1572_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1469_1572_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_1469_1572_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@param&nbsp;String&nbsp;发件人的地址<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;String&nbsp;收件人地址<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;String&nbsp;邮件标题<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;String&nbsp;邮件正文<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;sm.send(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc@163.com</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">bromon@163.com</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">标题</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">内容</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;<BR>　　这段程序好像也不需要解释了吧，把SMTP地址、帐号、密码等配置信息写到Properties里面，Java里面很多API都需要这么干，比如再程序中加入对代理服务器的支持等。</P>
<P>　　上面的程序修改一下服务器地址、帐号、密码就可以使用，非常简单。</P>
<P>　　如何发送一个HTML格式的Email呢？也很简单，再邮件正文中写入HTML代码，然后指定邮件的ContentType就OK，下面只给出关键代码：</P>
<P>&nbsp;………..<BR>&nbsp;MimeMessage&nbsp;msg=new&nbsp;MimeMessage(mailSession);<BR>&nbsp;msg.setContent(content,"text/html");<BR>&nbsp;msg.setText(“&lt;html&gt;&lt;body&gt;&lt;h1&gt;下面的，你们好吗?&lt;/body&gt;&lt;/html&gt;”);<BR>&nbsp;………</P>
<P>　　下面是发送带有附件的email，稍微复杂一点，而且和前面的程序有一些不同，请仔细一点，同时需要一点IO的知识。相同的代码就不在列出，只写关键部分，谁都想偷懒不是？</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;javax.mail.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.mail.internet.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;javax.activation.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;java.util.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;……….<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;MimeMessage&nbsp;msg</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MimeMessage(mailSession);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;msg.setSentDate(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Date());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;msg.setSubject(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;MimeBodyPart&nbsp;textBodyPart</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MimeBodyPart();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;textBodyPart.setText(“邮件正文”);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;MimeBodyPart&nbsp;fileBodyPart</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MimeBodyPart();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;FileDataSource&nbsp;fds</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileDataSource(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">GIS.rar</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">要发送的附件</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;fileBodyPart.setDataHandler(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DataHandler(fds));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;fileBodyPart.setFileName(fds.getName());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;Multipart&nbsp;container</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MimeMultipart();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;container.addBodyPart(textBodyPart);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;container.addBodyPart(fileBodyPart);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;msg.setContent(container);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;Transport.send(msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;…………&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><BR>　　这里的msg由两个MimeBodyPart构成，这个东西解释起来基本上比较难，如果不了解相关的规范就不太好解释，如果了解的话，我就不用解释了，这个这个………唉。</P><img src ="http://www.blogjava.net/bromon/aggbug/2536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:22 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的"推"技术</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2534.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2534.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2534.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2534.html</trackback:ping><description><![CDATA[Java中的”推”技术 
<P></P>
<P>&nbsp;bromon原创&nbsp;版权所有</P>
<P>　　在一般的B/S程序中(最典型的是web服务)，工作的方式是客户端(brower)向服务器端(server)发送一个请求，服务器端响应这个请求并发回客户端所请求的数据。在这个过程中服务器端扮演的是一个被动响应的角色，一般的情况下，服务器端是不会主动向客户端写数据的。由于HTTP是一个无连接的协议，也就是说当服务器端完成对客户端的响应后，双方的连接就断开了，直到下一次客户端发出请求时再重新建立连接。这样的HTTP协议是节省网络资源的，但是也给我们带来了一些麻烦，比如客户端不能实时探查服务器端的数据变化，不能作出及时的响应。所以当我们在做一些需要客户端和服务器端互相响应的程序时（比如聊天室、web短信息），不得不在客户端不停的刷新页面，以求获得最新的数据，这样做增加的服务器的负担。如果服务器能在数据发生变化的时候主动向客户端写数据，那么问题就解决了，这就是所谓的“推”技术。<BR><BR>&nbsp;　　在java中，客户端主动向服务器端申请数据，叫做“拉”；服务器主动向客户端写数据，叫做“推”。我们可以在服务器端打开某个端口，监听客户端的连接，就可以向客户端随意写数据，这是我们做C/S程序的原理，“推”技术采用相同的原理，只是客户端是浏览器而已，只要我们按照浏览器能够识别的格式向客户端写数据，客户端就可以通过HTTP与服务器建立连接，并获得数据。<BR>&nbsp;HTTP是一个很庞大的协议，但是我们只需要用到很小一部分。最重要的是要知道按照什么格式写数据，浏览器才认识。当我们浏览一个网站的某一页，比如www.sohu.com/page.htm的时候，我们是在向服务器发送这样一个信息：<BR><BR>&nbsp;GET&nbsp;/page.htm&nbsp;HTTP/1.0</P>
<P>&nbsp;From:&nbsp;someuser@somehost.com</P>
<P>&nbsp;User-Agent:&nbsp;Mozilla/4.0&nbsp;（compatible;&nbsp;MSIE&nbsp;5.0;&nbsp;Windows&nbsp;NT&nbsp;5.0;&nbsp;DigExt）</P>
<P>&nbsp;空行<BR><BR>　　其中第一行是我们要关注的，它由空格分隔成三部分，一是请求的方法(get)，二是请求的页面，三是HTTP的版本。如果请求无误，服务器将返回如下信息：<BR>&nbsp;HTTP/1.0&nbsp;200&nbsp;OK</P>
<P>&nbsp;Date:&nbsp;Thu,&nbsp;8&nbsp;Oct&nbsp;2002&nbsp;14:23:11&nbsp;GMT</P>
<P>&nbsp;Content-Type:&nbsp;text/html</P>
<P>&nbsp;Content-Length:&nbsp;1644</P>
<P>&nbsp;＜html＞<BR>&nbsp;＜body＞<BR>&nbsp;＜h1＞Hello&nbsp;world!＜/h1＞<BR>&nbsp;（其他内容）...<BR>&nbsp;＜/body＞<BR>&nbsp;＜/html＞<BR><BR>　　&nbsp;第一行表示连接成果，然后是返回数据的属性，从&lt;html&gt;开始才是返回给浏览器返回的数据。在我们自己的程序中只需要按照上述格式写数据，就可以实现一个自己的简易web服务器。下面是一个hello,world的例子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">myServer.java</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;java.net.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;myServer<BR><IMG id=Codehighlighter1_79_702_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_702_Open_Text.style.display='none'; Codehighlighter1_79_702_Closed_Image.style.display='inline'; Codehighlighter1_79_702_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_79_702_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_702_Closed_Text.style.display='none'; Codehighlighter1_79_702_Open_Image.style.display='inline'; Codehighlighter1_79_702_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_79_702_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_79_702_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;ServerSocket&nbsp;server</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;OutputStreamWriter&nbsp;ow</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_192_699_Open_Image onclick="this.style.display='none'; Codehighlighter1_192_699_Open_Text.style.display='none'; Codehighlighter1_192_699_Closed_Image.style.display='inline'; Codehighlighter1_192_699_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_192_699_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_192_699_Closed_Text.style.display='none'; Codehighlighter1_192_699_Open_Image.style.display='inline'; Codehighlighter1_192_699_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_192_699_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_192_699_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;port</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">800</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_218_256_Open_Image onclick="this.style.display='none'; Codehighlighter1_218_256_Open_Text.style.display='none'; Codehighlighter1_218_256_Closed_Image.style.display='inline'; Codehighlighter1_218_256_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_218_256_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_256_Closed_Text.style.display='none'; Codehighlighter1_218_256_Open_Image.style.display='inline'; Codehighlighter1_218_256_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_218_256_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_218_256_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;server</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ServerSocket(port);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_278_308_Open_Image onclick="this.style.display='none'; Codehighlighter1_278_308_Open_Text.style.display='none'; Codehighlighter1_278_308_Closed_Image.style.display='inline'; Codehighlighter1_278_308_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_278_308_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_278_308_Closed_Text.style.display='none'; Codehighlighter1_278_308_Open_Image.style.display='inline'; Codehighlighter1_278_308_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_278_308_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_278_308_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_326_696_Open_Image onclick="this.style.display='none'; Codehighlighter1_326_696_Open_Text.style.display='none'; Codehighlighter1_326_696_Closed_Image.style.display='inline'; Codehighlighter1_326_696_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_326_696_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_326_696_Closed_Text.style.display='none'; Codehighlighter1_326_696_Open_Image.style.display='inline'; Codehighlighter1_326_696_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_326_696_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_326_696_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_338_637_Open_Image onclick="this.style.display='none'; Codehighlighter1_338_637_Open_Text.style.display='none'; Codehighlighter1_338_637_Closed_Image.style.display='inline'; Codehighlighter1_338_637_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_338_637_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_338_637_Closed_Text.style.display='none'; Codehighlighter1_338_637_Open_Image.style.display='inline'; Codehighlighter1_338_637_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_338_637_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_338_637_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">server.accept();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;OutputStreamWriter(socket.getOutputStream());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow.write(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">HTTP/1.0&nbsp;200&nbsp;ok&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow.write(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Content-Type:text/html&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow.write(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;html&gt;&lt;body&gt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow.write(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello,world</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow.write(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;/body&gt;&lt;/html&gt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ow.flush();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;socket.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_660_692_Open_Image onclick="this.style.display='none'; Codehighlighter1_660_692_Open_Text.style.display='none'; Codehighlighter1_660_692_Closed_Image.style.display='inline'; Codehighlighter1_660_692_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_660_692_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_660_692_Closed_Text.style.display='none'; Codehighlighter1_660_692_Open_Image.style.display='inline'; Codehighlighter1_660_692_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_660_692_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_660_692_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN></DIV></DIV>
<P><BR>&nbsp;编译：javac&nbsp;myServer.java<BR>&nbsp;运行：java&nbsp;myServer<BR>&nbsp;然后打开浏览器，输入<IMG alt="" hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://localhost:800，将会返回一个”hello,world”/" target=_blank><FONT color=#002c99>http://localhost:800，将会返回一个”hello,world”</FONT></A> <BR>&nbsp;以上就是一个“推”技术的简单实现，将它扩展一下，比如加入多线程响应，就可以实现无刷新的聊天室，请读者自己考虑。</P>
<P>&nbsp;原文发表于《程序春秋》0301期&nbsp;</P><img src ="http://www.blogjava.net/bromon/aggbug/2534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:19 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDOM使用详解</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2533.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2533.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2533.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2533.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2533.html</trackback:ping><description><![CDATA[bromon原创&nbsp;请尊重版权&nbsp;<BR><BR>　　JDom是不错的API，算得上简单高效，最重要是已经成为jcp的一部分，这个咱得弄弄。不<A href="http://www.jdom.org">www.jdom.org</A>上写文档的人实在太懒，文档出奇的少，流传得最广的恐怕是IBM上面的一篇《JDom让java&nbsp;XML变得容易》，不过这篇文章只涉及基本的读写操作，远不能胜任实际工作。花了两天时间，把JDom的基本操作整理出来了，涵盖了大部分的操作：元素、属性、命名空间、PI、DTD、Schema，应付一般的应用没什么问题。反正我没有在网上见到更加详尽的版本，你见过的话，请留下连接。暂时来不及编写详细的说明，先帖几段程序，对有经验的Java开发者来说，已经足够了。程序都已经经过了实际的测试，我使用的JDom是0.9版。
<P>&nbsp;1、创建XML文档：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.input.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.output.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CreateXML<BR><IMG id=Codehighlighter1_117_1365_Open_Image onclick="this.style.display='none'; Codehighlighter1_117_1365_Open_Text.style.display='none'; Codehighlighter1_117_1365_Closed_Image.style.display='inline'; Codehighlighter1_117_1365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_117_1365_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_1365_Closed_Text.style.display='none'; Codehighlighter1_117_1365_Open_Image.style.display='inline'; Codehighlighter1_117_1365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_117_1365_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_117_1365_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Create()<BR><IMG id=Codehighlighter1_144_1260_Open_Image onclick="this.style.display='none'; Codehighlighter1_144_1260_Open_Text.style.display='none'; Codehighlighter1_144_1260_Closed_Image.style.display='inline'; Codehighlighter1_144_1260_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_144_1260_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_144_1260_Closed_Text.style.display='none'; Codehighlighter1_144_1260_Open_Image.style.display='inline'; Codehighlighter1_144_1260_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_144_1260_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_144_1260_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_156_1180_Open_Image onclick="this.style.display='none'; Codehighlighter1_156_1180_Open_Text.style.display='none'; Codehighlighter1_156_1180_Closed_Image.style.display='inline'; Codehighlighter1_156_1180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_156_1180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_1180_Closed_Text.style.display='none'; Codehighlighter1_156_1180_Open_Image.style.display='inline'; Codehighlighter1_156_1180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_156_1180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_156_1180_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Document();&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ProcessingInstruction&nbsp;pi</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ProcessingInstruction(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">xml-stylesheet</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">type=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">xsl</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;href=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.xsl</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;doc.addContent(pi);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Namespace&nbsp;ns&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Namespace.getNamespace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://www.bromon.org</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Namespace&nbsp;ns2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Namespace.getNamespace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">other</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://www.w3c.org</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">根元素</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;ns);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;root.addNamespaceDeclaration(ns2);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;doc.setRootElement(root);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;el1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素一</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;el1.setAttribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">属性</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">属性一</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Text&nbsp;text1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Text(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素值</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;em&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素二</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).addContent(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">第二个元素</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;el1.addContent(text1);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el1.addContent(em);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;el2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素三</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).addContent(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">第三个元素</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addContent(el1);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addContent(el2);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">缩进四个空格,自动换行,gb2312编码</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter&nbsp;outputter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLOutputter(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">GB2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileWriter(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_1209_1253_Open_Image onclick="this.style.display='none'; Codehighlighter1_1209_1253_Open_Text.style.display='none'; Codehighlighter1_1209_1253_Closed_Image.style.display='inline'; Codehighlighter1_1209_1253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1209_1253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1209_1253_Closed_Text.style.display='none'; Codehighlighter1_1209_1253_Open_Image.style.display='inline'; Codehighlighter1_1209_1253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1209_1253_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1209_1253_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_1317_1356_Open_Image onclick="this.style.display='none'; Codehighlighter1_1317_1356_Open_Text.style.display='none'; Codehighlighter1_1317_1356_Closed_Image.style.display='inline'; Codehighlighter1_1317_1356_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1317_1356_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1317_1356_Closed_Text.style.display='none'; Codehighlighter1_1317_1356_Open_Image.style.display='inline'; Codehighlighter1_1317_1356_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1317_1356_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1317_1356_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CreateXML().Create();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>&nbsp;2、DTD验证的：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.input.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.output.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWithDTD<BR><IMG id=Codehighlighter1_118_621_Open_Image onclick="this.style.display='none'; Codehighlighter1_118_621_Open_Text.style.display='none'; Codehighlighter1_118_621_Closed_Image.style.display='inline'; Codehighlighter1_118_621_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_118_621_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_621_Closed_Text.style.display='none'; Codehighlighter1_118_621_Open_Image.style.display='inline'; Codehighlighter1_118_621_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_118_621_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_118_621_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;validate()<BR><IMG id=Codehighlighter1_147_534_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_534_Open_Text.style.display='none'; Codehighlighter1_147_534_Closed_Image.style.display='inline'; Codehighlighter1_147_534_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_147_534_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_534_Closed_Text.style.display='none'; Codehighlighter1_147_534_Open_Image.style.display='inline'; Codehighlighter1_147_534_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_147_534_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_147_534_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_159_471_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_471_Open_Text.style.display='none'; Codehighlighter1_159_471_Closed_Image.style.display='inline'; Codehighlighter1_159_471_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_159_471_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_471_Closed_Text.style.display='none'; Codehighlighter1_159_471_Open_Image.style.display='inline'; Codehighlighter1_159_471_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_159_471_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_159_471_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SAXBuilder(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;builder.setFeature(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://xml.org/sax/features/validation</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;,</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;builder.build(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileReader(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">author.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">搞掂</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter&nbsp;outputter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLOutputter();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_494_526_Open_Image onclick="this.style.display='none'; Codehighlighter1_494_526_Open_Text.style.display='none'; Codehighlighter1_494_526_Closed_Image.style.display='inline'; Codehighlighter1_494_526_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_494_526_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_494_526_Closed_Text.style.display='none'; Codehighlighter1_494_526_Open_Image.style.display='inline'; Codehighlighter1_494_526_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_494_526_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_494_526_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_579_615_Open_Image onclick="this.style.display='none'; Codehighlighter1_579_615_Open_Text.style.display='none'; Codehighlighter1_579_615_Closed_Image.style.display='inline'; Codehighlighter1_579_615_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_579_615_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_579_615_Closed_Text.style.display='none'; Codehighlighter1_579_615_Open_Image.style.display='inline'; Codehighlighter1_579_615_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_579_615_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_579_615_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWithDTD().validate();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>&nbsp;　　需要说明的是，这个程序没有指明使用哪个DTD文件。DTD文件的位置是在XML中指定的，而且DTD不支持命名空间，一个XML只能引用一个DTD，所以程序直接读取XML中指定的DTD，程序本身不用指定。不过这样一来，好象就只能使用外部式的DTD引用方式了？高人指点。</P>
<P>&nbsp;3、XML&nbsp;Schema验证的：<BR>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.input.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.output.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWithSchema<BR><IMG id=Codehighlighter1_121_766_Open_Image onclick="this.style.display='none'; Codehighlighter1_121_766_Open_Text.style.display='none'; Codehighlighter1_121_766_Closed_Image.style.display='inline'; Codehighlighter1_121_766_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_121_766_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_766_Closed_Text.style.display='none'; Codehighlighter1_121_766_Open_Image.style.display='inline'; Codehighlighter1_121_766_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_121_766_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_121_766_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;xml</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;schema</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test-schema.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;validate()<BR><IMG id=Codehighlighter1_210_760_Open_Image onclick="this.style.display='none'; Codehighlighter1_210_760_Open_Text.style.display='none'; Codehighlighter1_210_760_Closed_Image.style.display='inline'; Codehighlighter1_210_760_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_210_760_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_210_760_Closed_Text.style.display='none'; Codehighlighter1_210_760_Open_Image.style.display='inline'; Codehighlighter1_210_760_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_210_760_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_210_760_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_222_689_Open_Image onclick="this.style.display='none'; Codehighlighter1_222_689_Open_Text.style.display='none'; Codehighlighter1_222_689_Closed_Image.style.display='inline'; Codehighlighter1_222_689_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_222_689_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_222_689_Closed_Text.style.display='none'; Codehighlighter1_222_689_Open_Image.style.display='inline'; Codehighlighter1_222_689_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_222_689_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_222_689_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SAXBuilder(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定约束方式为XML&nbsp;schema</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;builder.setFeature(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://apache.org/xml/features/validation/schema</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;,&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">导入schema文件</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;builder.setProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;,schema);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;builder.build(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileReader(xml));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">搞掂</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter&nbsp;outputter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLOutputter();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_712_752_Open_Image onclick="this.style.display='none'; Codehighlighter1_712_752_Open_Text.style.display='none'; Codehighlighter1_712_752_Closed_Image.style.display='inline'; Codehighlighter1_712_752_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_712_752_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_712_752_Closed_Text.style.display='none'; Codehighlighter1_712_752_Open_Image.style.display='inline'; Codehighlighter1_712_752_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_712_752_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_712_752_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">验证失败:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>&nbsp;上面的程序就指出了要引入的XML&nbsp;Schema文件的位置。</P>
<P>&nbsp;系统默认输出是UTF-8，这有可能导致出现乱码。</P>
<P>&nbsp;读XML文档的技巧在网上已经泛滥，这里就没有再列出来。</P><img src ="http://www.blogjava.net/bromon/aggbug/2533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 13:17 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再次准备装修新家</title><link>http://www.blogjava.net/bromon/archive/2005/03/28/2522.html</link><dc:creator>Sometimes Java</dc:creator><author>Sometimes Java</author><pubDate>Mon, 28 Mar 2005 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/bromon/archive/2005/03/28/2522.html</guid><wfw:comment>http://www.blogjava.net/bromon/comments/2522.html</wfw:comment><comments>http://www.blogjava.net/bromon/archive/2005/03/28/2522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bromon/comments/commentRss/2522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bromon/services/trackbacks/2522.html</trackback:ping><description><![CDATA[是在无法忍受csdn的blog服务器了，决定搬家。工程比较浩大，准备中......<img src ="http://www.blogjava.net/bromon/aggbug/2522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bromon/" target="_blank">Sometimes Java</a> 2005-03-28 12:01 <a href="http://www.blogjava.net/bromon/archive/2005/03/28/2522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>