﻿<?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-随笔分类-Tech Flow</title><link>http://www.blogjava.net/bromon/category/886.html</link><description>MSN/GTalk: bromon@gmail.com</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:54:58 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:54:58 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.