﻿<?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-小海贼的夜晚</title><link>http://www.blogjava.net/pirate/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 13:22:38 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 13:22:38 GMT</pubDate><ttl>60</ttl><item><title>死锁</title><link>http://www.blogjava.net/pirate/archive/2005/08/11/9779.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 11 Aug 2005 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/08/11/9779.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/9779.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/08/11/9779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/9779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/9779.html</trackback:ping><description><![CDATA[<P>select object_id,session_id,locked_mode from v$locked_object;</P>
<P><BR>select t2.username,t2.sid,t2.serial#,t2.logon_time<BR>&nbsp;from v$locked_object t1,v$session t2<BR>&nbsp;where t1.session_id=t2.sid order by t2.logon_time;</P>
<P>alter system kill session '60,333';</P><img src ="http://www.blogjava.net/pirate/aggbug/9779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-08-11 10:41 <a href="http://www.blogjava.net/pirate/archive/2005/08/11/9779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用gzip压缩页面</title><link>http://www.blogjava.net/pirate/archive/2005/08/03/9140.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Wed, 03 Aug 2005 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/08/03/9140.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/9140.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/08/03/9140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/9140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/9140.html</trackback:ping><description><![CDATA[<P>gzip就是GNU ZIP了,很多浏览器都支持这种压缩格式的content,需要加上response.addHeader("Content-Encoding", "gzip");不过避免某些不支持的浏览器出现错误,需要检查request.getHeaders("Accept-Encoding");里面是否包含了gizp.</P>
<P>压缩处理的工序是在过滤链里面处理的,在自己的应用的web.xml里面描述:</P>
<P>GzipFilter<BR>compressionFilters.CompressionFilter</P>
<P><BR>GzipFilter<BR>*</P>
<P>这里CompressionFilter是Filter接口的类,在实现doFilter方法的时候:<BR>wrappedResponse = new CompressionServletResponseWrapper((HttpServletResponse)response);<BR>chain.doFilter(request, wrappedResponse);<BR>实际上是用CompressionServletResponseWrapper来处理服务器端的response,我们都知道jsp显示的内容是 response里面的out输出的流产生出来的,那么用CompressionServletResponseWrapper将out的流采用gzip压缩下就可以完成任务了:CompressionResponseStream stream = new CompressionResponseStream(response);<BR>在CompressionResponseStream里面将outputstream封装了一下<BR>GZIPOutputStream gzipstream = new GZIPOutputStream(output);<BR>response.addHeader("Content-Encoding", "gzip");<BR>具体代码应该在网上也能找到了.</P><img src ="http://www.blogjava.net/pirate/aggbug/9140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-08-03 17:25 <a href="http://www.blogjava.net/pirate/archive/2005/08/03/9140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10  [转]</title><link>http://www.blogjava.net/pirate/archive/2005/08/03/9130.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Wed, 03 Aug 2005 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/08/03/9130.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/9130.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/08/03/9130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/9130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/9130.html</trackback:ping><description><![CDATA[Tomcat配置技巧Top 10 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：Jason Brittain &amp; Ian F. Darwin 译者：陈光 发文时间：2004.11.08
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。希望对你有所帮助。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1． 配置系统管理（Admin Web Application） </P>
<P>&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; 大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web Application最初在4.1版本时出现，当时的功能包括管理context、data <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。（译者注：CATALINA_BASE即tomcat安装目录下的server目录） </P>
<P>&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; 你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application的context，效果是一样的。你不能管理Admin Web <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。 </P>
<P><BR>&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; 如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下： </P>
<P>&lt;role name="admin"/&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）： </P>
<P>&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt;</P>
<P><BR>&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; 当你完成这些步骤后，请重新启动Tomcat，访问<A href="http://localhost:8080/admin">http://localhost:8080/admin</A>，你将看到一个登录界面。Admin <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web Application采用基于容器管理的安全机制，并采用了Jakarta <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2．配置应用管理（Manager Web Application） </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manager Web Application让你通过一个比Admin Web <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application更为简单的用户界面，执行一些简单的Web应用任务。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manager Web Application被被定义在一个自动部署文件中： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CATALINA_BASE/webapps/manager.xml 。 </P>
<P>&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; 你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。（译者注：CATALINA_HOME即tomcat安装目录） </P>
<P><BR>&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; 如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中： </P>
<P><BR>&lt;role name=”manager”&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）： </P>
<P>&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt;</P>
<P><BR>&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; 然后重新启动Tomcat，访问<A href="http://localhost/manager/list">http://localhost/manager/list</A>，将看到一个很朴素的文本型管理界面，或者访问<A href="http://localhost/manager/html/list">http://localhost/manager/html/list</A>，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web Application现在已经启动了。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manager <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL）。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manager <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误??“503 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - This application is not currently available”。 </P>
<P>&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; 移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3．部署一个web应用 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有两个办法可以在系统中部署web服务。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到CATALINA_BASE/webapps目录下。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。 </P>
<P><BR>&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; 如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 部署web应用的另一种方式是写一个Context <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断： </P>
<P><BR>&lt;!-- <BR>Context fragment for deploying MyWebApp.war <BR>--&gt; <BR>&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <BR>debug="0" privileged="true"&gt; <BR>&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" <BR>resourceName="UserDatabase"/&gt; <BR>&lt;/Context&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。 </P>
<P>&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; 这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4．配置虚拟主机（Virtual Hosts） </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。 </P>
<P><BR>&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; 基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and Bind》一书，作者是Paul Albitz and Cricket Liu <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。 </P>
<P>&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; 在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下： </P>
<P><BR>&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt; <BR>&lt;Service name="Tomcat-Standalone"&gt; <BR>&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <BR>port="8080" minProcessors="5" maxProcessors="75" <BR>enableLookups="true" redirectPort="8443"/&gt; <BR>&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <BR>port="8443" minProcessors="5" maxProcessors="75" <BR>acceptCount="10" debug="0" scheme="https" secure="true"/&gt; <BR>&lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" <BR>clientAuth="false" protocol="TLS" /&gt; <BR>&lt;/Connector&gt; <BR>&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt; <BR>&lt;!-- This Host is the default Host --&gt; <BR>&lt;Host name="localhost" debug="0" appBase="webapps" <BR>unpackWARs="true" autoDeploy="true"&gt; <BR>&lt;Context path="" docBase="ROOT" debug="0"/&gt; <BR>&lt;Context path="/orders" docBase="/home/ian/orders" debug="0" <BR>reloadable="true" crossContext="true"&gt; <BR>&lt;/Context&gt; <BR>&lt;/Host&gt; </P>
<P>&lt;!-- This Host is the first "Virtual Host": <A href="http://www.example.com/">http://www.example.com/</A> --&gt; <BR>&lt;Host name="<A href="http://www.example.com/">www.example.com</A>" appBase="/home/example/webapp"&gt; <BR>&lt;Context path="" docBase="."/&gt; <BR>&lt;/Host&gt; </P>
<P>&lt;/Engine&gt; <BR>&lt;/Service&gt; <BR>&lt;/Server&gt;</P>
<P><BR>&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; Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5．配置基础验证（Basic Authentication） </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Basic <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：使用Basic <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Authentication还是非常易于设置和使用的。只需要添加和两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件中添加适当的和即可，然后重新启动Tomcat。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。 </P>
<P>&lt;!-- <BR>Define the Members-only area, by defining <BR>a "Security Constraint" on this Application, and <BR>mapping it to the subdirectory (URL) that we want <BR>to restrict. <BR>--&gt; <BR>&lt;security-constraint&gt; <BR>&lt;web-resource-collection&gt; <BR>&lt;web-resource-name&gt; <BR>Entire Application <BR>&lt;/web-resource-name&gt; <BR>&lt;url-pattern&gt;/members/*&lt;/url-pattern&gt; <BR>&lt;/web-resource-collection&gt; <BR>&lt;auth-constraint&gt; <BR>&lt;role-name&gt;member&lt;/role-name&gt; <BR>&lt;/auth-constraint&gt; <BR>&lt;/security-constraint&gt; <BR>&lt;!-- Define the Login Configuration for this Application --&gt; <BR>&lt;login-config&gt; <BR>&lt;auth-method&gt;BASIC&lt;/auth-method&gt; <BR>&lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt; <BR>&lt;/login-config&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6．配置单点登录（Single Sign-On） </P>
<P>&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; 一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tomcat 4的“single <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valve元素即可，如下所示： </P>
<P>&lt;Valve className="org.apache.catalina.authenticator.SingleSignOn" <BR>debug="0"/&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用single sign-on valve有一些重要的限制： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&gt; 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&gt; 不能被context中的realm覆盖。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&gt; 单点登录需要使用cookies。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7．配置用户定制目录（Customized User Directores） </P>
<P>&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; 一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如： </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://www.cs.myuniversity.edu/~username">http://www.cs.myuniversity.edu/~username</A> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://members.mybigisp.com/~username">http://members.mybigisp.com/~username</A> </P>
<P>&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; Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射类。 </P>
<P>&lt;Listener className="org.apache.catalina.startup.UserConfig" <BR>directoryName="public_html" <BR>userClass="org.apache.catalina.startup.PasswdUserDatabase"/&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; web文件需要放置在像/home/users/ian/public_html 或者 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。 </P>
<P>&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; 实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。 </P>
<P><BR>&lt;Listener className="org.apache.catalina.startup.UserConfig" <BR>directoryName="public_html" homeBase="/home" <BR>userClass="org.apache.catalina.startup.HomesUserDatabase"/&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一来，web文件就可以位于像/home/ian/public_html 或者 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8．在Tomcat中使用CGI脚本 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gateway <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了使Tomcat能够运行CGI，你必须做如下几件事： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 把servlets-cgi.renametojar <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CGI的那段的注释去掉（默认情况下，该段位于第241行）。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. 你可以把CGI脚本放置在WEB-INF/cgi <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. 重新启动Tomcat，你的CGI就可以运行了。 </P>
<P>&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; 在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9．改变Tomcat中的JSP编译器（JSP Compiler） </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Tomcat <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下： </P>
<P>&lt;servlet&gt; <BR>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt; <BR>&lt;servlet-class&gt; <BR>org.apache.jasper.servlet.JspServlet <BR>&lt;/servlet-class&gt; <BR>&lt;init-param&gt; <BR>&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt; <BR>&lt;param-value&gt;WARNING&lt;/param-value&gt; <BR>&lt;/init-param&gt; <BR>&lt;init-param&gt; <BR>&lt;param-name&gt;compiler&lt;/param-name&gt; <BR>&lt;param-value&gt;jikes&lt;/param-value&gt; <BR>&lt;/init-param&gt; <BR>&lt;load-on-startup&gt;3&lt;/load-on-startup&gt; <BR>&lt;/servlet&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10．限制特定主机访问（Restricting Access to Specific Hosts） </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有时，你可能想限制对Tomcat <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和RemoteAddrValve。 </P>
<P>&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; 通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。 </P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如你可以把Admin Web application设置成只允许本地访问，设置如下： </P>
<P>&lt;Context path="/path/to/secret_files" ...&gt; <BR>&lt;Valve className="org.apache.catalina.valves.RemoteAddrValve" <BR>allow="127.0.0.1" deny=""/&gt; <BR>&lt;/Context&gt;</P>
<P><BR>&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; 如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。 <BR></P><img src ="http://www.blogjava.net/pirate/aggbug/9130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-08-03 15:00 <a href="http://www.blogjava.net/pirate/archive/2005/08/03/9130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一篇关于Web事件的文章- </title><link>http://www.blogjava.net/pirate/archive/2005/08/03/9124.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Wed, 03 Aug 2005 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/08/03/9124.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/9124.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/08/03/9124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/9124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/9124.html</trackback:ping><description><![CDATA[<H5>概述：</H5><BR>&nbsp;&nbsp;&nbsp;在Servlet2.3规范中，Web应用事件是新增加的部分。它让你能最大程度地控制你的Web应用。在本文中，我们将学习两个很重要的应用事件：<BR>
<LI>应用的启动和停止<BR>
<LI>Session的创建和失效<BR>如它们的名字那样，应用启动事件发生在你的应用第一次被servlet容器装载和启动的时候；停止事件发生在Web应用停止的时候。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Session创建事件发生在每次一个新的session创建的时候，类似地Session失效事件发生在每次一个Session失效的时候。为了使用这些Web应用事件为你做些有用的事情，我们必须创建和使用一些特殊的“监听”类。下面，我们将研究这些监听类到地是什么以及我们如何去使用它们。<BR>&nbsp;<BR>
<H5>监听类：</H5><BR>它们是实现了下边两个接口中任何一个接口的简单的java类：<BR>
<LI>javax.servlet.ServletContextListener&nbsp;<BR>
<LI>javax.servlet.http.HttpSessionListener&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果你想让你的类监听应用的启动和停止事件，你就得实现ServletContextListener接口;如果你想让你的类去监听Session的创建和失效事件，那你就得实现HttpSessionListener接口。&nbsp;让我们看看在这些接口中你必须要实现的方法。<BR><B>1.ServletContextListener&nbsp;:</B><BR>接口包括如下两个方法：<BR>
<LI>public&nbsp;void&nbsp;contextInitialized(ServletContextEvent&nbsp;sce);&nbsp;<BR>
<LI>public&nbsp;void&nbsp;contextDestroyed(ServletContextEvent&nbsp;sce);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;如果你实现了一个接口，那你就必须实现它所有的方法。因此，如果你想利用应用的启动和停止事件，你就需要创建一个Java类并实现ServletContextListener接口。下边是这样的一个类的例子：<BR>&nbsp;<BR>/*File&nbsp;:&nbsp;ApplicationWatch.java*/<BR>import&nbsp;javax.servlet.ServletContextListener;<BR>import&nbsp;javax.servlet.ServletContextEvent;<BR>public&nbsp;class&nbsp;ApplicationWatch&nbsp;implements&nbsp;ServletContextListener&nbsp;{<BR>public&nbsp;static&nbsp;long&nbsp;applicationInitialized&nbsp;=&nbsp;0L;<BR>/*&nbsp;应用启动事件&nbsp;*/<BR>public&nbsp;void&nbsp;contextInitialized(ServletContextEvent&nbsp;ce)&nbsp;{<BR>applicationInitialized&nbsp;=&nbsp;System.currentTimeMillis();<BR>}<BR>/*应用停止事件&nbsp;*/<BR>public&nbsp;void&nbsp;contextDestroyed(ServletContextEvent&nbsp;ce)&nbsp;{}<BR>}<BR><BR>&nbsp;&nbsp;&nbsp;在上边的代码中，ApplicationWatch类实现了ServletContextListener接口。它实现了接口中的两个方法，但只用了其中的一个方法，另一个方法中没有写任何代码。这个类把应用启动的时间记录在一个可以从其它应用类中存取应用启动时间的public&nbsp;static变量中。&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;我将很快解释如何告诉服务器我们有这个监听类，但首先让我们看看HttpSessionListener接口有什么不同的方法。<BR><B>2.HttpSessionListener&nbsp;:</B><BR>这个接口也只包含两个方法，分别对应于Session的创建和失效：<BR>
<LI>public&nbsp;void&nbsp;sessionCreated(HttpSessionEvent&nbsp;se);&nbsp;<BR>
<LI>public&nbsp;void&nbsp;sessionDestroyed(HttpSessionEvent&nbsp;se);<BR><BR>&nbsp;&nbsp;&nbsp;如上边的ApplicationWatch例子那样，我们也创建了一个实现HttpSessionListener接口的类。如下：<BR>/*File&nbsp;:&nbsp;SessionCounter.java*/<BR>import&nbsp;javax.servlet.http.HttpSessionListener;<BR>import&nbsp;javax.servlet.http.HttpSessionEvent;<BR>public&nbsp;class&nbsp;SessionCounter&nbsp;implements&nbsp;HttpSessionListener&nbsp;{<BR>private&nbsp;static&nbsp;int&nbsp;activeSessions&nbsp;=0;<BR>/*&nbsp;Session创建事件&nbsp;*/<BR>public&nbsp;void&nbsp;sessionCreated(HttpSessionEvent&nbsp;se)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;activeSessions++;<BR>}<BR>/*&nbsp;Session失效事件&nbsp;*/<BR>public&nbsp;void&nbsp;sessionDestroyed(HttpSessionEvent&nbsp;se)&nbsp;{<BR>if(activeSessions&gt;0)activeSessions--;<BR>}<BR><BR>public&nbsp;static&nbsp;int&nbsp;getActiveSessions()&nbsp;{<BR>return&nbsp;activeSessions;<BR>}<BR>}<BR><BR>&nbsp;&nbsp;&nbsp;在上边的代码中，SessionCounter类实现了HttpSessionListener接口，其目的是计算活动会话的数量。<BR>&nbsp;&nbsp;&nbsp;好了，我们已经学习了什么是Web应用事件，有什么接口可以用以及看到了一些实现这些接口的例子。让我们看看如何告诉应用服务器我们有这些监听类。<BR><BR>
<H5>Web.xml&nbsp;:</H5><BR>&nbsp;&nbsp;&nbsp;我们通过把类路径加入/WEB-INF/web.xml文件的标签&lt;listener&gt;中来告诉服务器我们的监听类。下边是一个web.xml文件的例子：<BR>&lt;!--&nbsp;Web.xml&nbsp;--&gt;<BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"?&gt;<BR>&lt;!DOCTYPE&nbsp;web-appPUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN""http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"&gt;<BR>&lt;web-app&gt;<BR>&lt;!--&nbsp;Listeners&nbsp;--&gt;<BR>&lt;listener&gt;<BR>&lt;listener-class&gt;<BR>com.stardeveloper.web.listener.SessionCounter<BR>&lt;/listener-class&gt;<BR>&lt;/listener&gt;<BR>&lt;listener&gt;<BR>&lt;listener-class&gt;<BR>com.stardeveloper.web.listener.ApplicationWatch&lt;/listener-class&gt;<BR>&lt;/listener&gt;<BR>&lt;/web-app&gt;<BR>&nbsp;&nbsp;&nbsp;如上所示，在web.xml文件中声明监听类是非常简单的。现在，每次的服务器的启动和停止，会话的创建和失效，配置好的监听类的相应的方法就会被调用。就这么简单！<BR><BR>
<H5>总结：</H5><BR>&nbsp;&nbsp;&nbsp;在本文中我们学习了什么是Web应用事件和我们如何通过创建特殊的“监听”类来使用它们。之后我们分别创建了两个实现了ServletContextListener和HttpSessionListener接口的类。我们也学习了如何在web.xml文件中使用专门的&lt;listener&gt;和&lt;listener-class&gt;标签来声明这些监听类。<BR></LI><img src ="http://www.blogjava.net/pirate/aggbug/9124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-08-03 14:36 <a href="http://www.blogjava.net/pirate/archive/2005/08/03/9124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate入门 - Transaction</title><link>http://www.blogjava.net/pirate/archive/2005/07/29/8720.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Fri, 29 Jul 2005 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/29/8720.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8720.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/29/8720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8720.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是对</SPAN><SPAN lang=EN-US>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的轻量级对象封装，</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身是不具备</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理功能的，</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际上是底层的</SPAN><SPAN lang=EN-US>JDBC Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的封装，或者是</SPAN><SPAN lang=EN-US>JTA Transaction</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>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以配置为</SPAN><SPAN lang=EN-US>JDBCTransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者是</SPAN><SPAN lang=EN-US>JTATransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这取决于你在</SPAN><SPAN lang=EN-US>hibernate.properties</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的配置</SPAN><SPAN lang=EN-US>:</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你什么都不配置，默认情况下使用</SPAN><SPAN lang=EN-US>JDBCTransaction</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>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将使用</SPAN><SPAN lang=EN-US>JTATransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不管你准备让</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>JDBCTransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，还是</SPAN><SPAN lang=EN-US>JTATransaction</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>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在下面的分析中我会给出原因。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、</SPAN><SPAN lang=EN-US>JDBC Transaction</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看看使用</SPAN><SPAN lang=EN-US>JDBC Transaction</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>Session session = sf.openSession();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Transaction tx = session.beginTransactioin();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>session.flush();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>tx.commit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>session.close();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是默认的情况，当你在代码中使用</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候实际上就是</SPAN><SPAN lang=EN-US>JDBCTransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。那么</SPAN><SPAN lang=EN-US>JDBCTransaction</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><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><B>Hibernate2.0.3</B></SPAN><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源代码中的类</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>net.sf.hibernate.transaction.JDBCTransaction:</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>public void begin() throws HibernateException {<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if (toggleAutoCommit) session.connection().setAutoCommit(false);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是启动</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法，看到</SPAN><SPAN lang=EN-US>connection().setAutoCommit(false) </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了吗？是不是很熟悉？</SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再来看</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>public void commit() throws HibernateException {<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>try {</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>try {</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>session.connection().commit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>committed = true;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>toggleAutoCommit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是提交方法，看到</SPAN><SPAN lang=EN-US>connection().commit() </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了吗？下面就不用我多说了，这个类代码非常简单易懂，通过阅读使我们明白</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都在干了些什么？我现在把用</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写的例子翻译成</SPAN><SPAN lang=EN-US>JDBC</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>Connection conn = ...;<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>&lt;---<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>session = sf.openSession();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>conn.setAutoCommit(false);<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>&lt;---<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>tx = session.beginTransactioin();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>&lt;---<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>conn.commit();<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>&lt;---<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>tx.commit(); (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对应左边的两句</SPAN><SPAN lang=EN-US>)</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>conn.setAutoCommit(true);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>conn.close();<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>&lt;---<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>session.close();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看明白了吧，</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>JDBCTransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根本就是</SPAN><SPAN lang=EN-US>conn.commit</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而已，根本毫无神秘可言，只不过在</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打开的时候，就会自动</SPAN><SPAN lang=EN-US>conn.setAutoCommit(false)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不像一般的</SPAN><SPAN lang=EN-US>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，默认都是</SPAN><SPAN lang=EN-US>true</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，所以你最后不写</SPAN><SPAN lang=EN-US>commit</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也没有关系，由于</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经把</SPAN><SPAN lang=EN-US>AutoCommit</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给关掉了，所以用</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候，你在程序中不写</SPAN><SPAN lang=EN-US>Transaction</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 style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、</SPAN><SPAN lang=EN-US>JTATransaction</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你在</SPAN><SPAN lang=EN-US>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中使用</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，或者准备用</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来管理跨</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的长事务，那么就需要使用</SPAN><SPAN lang=EN-US>JTATransaction</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>javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Session s1 = sf.openSession();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s1.flush();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s1.close();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Session s2 = sf.openSession();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s2.flush();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s2.close();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>tx.commit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是标准的使用</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码片断，</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是跨</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，它的生命周期比</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要长。如果你在</SPAN><SPAN lang=EN-US>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中使用</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，那么是最简单不过的了，你什么</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码统统都不要写了，直接在</SPAN><SPAN lang=EN-US>EJB</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><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在我们来分析一下</SPAN><SPAN lang=EN-US>JTATransaction</SPAN></B><B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的源代码</SPAN></B><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>net.sf.hibernate.transaction.JTATransaction:</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>public void begin(InitialContext context, ...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>ut = (UserTransaction) context.lookup(utName);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看清楚了吗？</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和我上面写的代码</SPAN><SPAN lang=EN-US> tx = new Initial </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>Context?().lookup("javax.transaction.UserTransaction"); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不是完全一样？</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>public void commit() ...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>if (newTransaction) ut.commit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>...</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>JTATransaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的控制稍微复杂，不过仍然可以很清楚的看出来</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是如何封装</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</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 style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是你现在是否看到了什么问题？</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">仔细想一下，</SPAN><SPAN lang=EN-US>Hibernate Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是从</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中获得的，</SPAN><SPAN lang=EN-US>tx = session.beginTransaction()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，最后要先提交</SPAN><SPAN lang=EN-US>tx</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后再</SPAN><SPAN lang=EN-US>session.close</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这完全符合</SPAN><SPAN lang=EN-US>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的操作顺序，但是这个顺序是和</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transactioin</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作顺序彻底矛盾的！！！</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是先启动</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后启动</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，关闭</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，最后提交</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因此当你使用</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候，那么就千万不要使用</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而是应该像我上面的</SPAN><SPAN lang=EN-US>JTA</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 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><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、在</SPAN><SPAN lang=EN-US>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上使用</SPAN><SPAN lang=EN-US>Hibernate </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">必须写上</SPAN><SPAN lang=EN-US>Hibernate Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码，否则数据库没有反应。此时</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是</SPAN><SPAN lang=EN-US>Connection.commit</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><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、在</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上使用</SPAN><SPAN lang=EN-US>Hibernate </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码，不要写</SPAN><SPAN lang=EN-US>Hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</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><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、在</SPAN><SPAN lang=EN-US>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上使用</SPAN><SPAN lang=EN-US>Hibernate </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么</SPAN><SPAN lang=EN-US>Transactioin</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码都不要写，在</SPAN><SPAN lang=EN-US>EJB</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>|---CMT(Container Managed Transaction)</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>|</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>|---BMT(Bean Managed Transaction)</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>|</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>|----JDBC Transaction</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>|</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>|----JTA Transaction</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提问：</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction"); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Session s1 = sf.openSession(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>... </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s1.flush(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s1.close(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>... </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Session s2 = sf.openSession(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>... </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s2.flush(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s2.close(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>tx.commit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不关闭，使用</SPAN><SPAN lang=EN-US>s2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行操作的代码中使用</SPAN><SPAN lang=EN-US>s1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可不可以（我觉得这样更加节约资源，不需要反复的连接、关闭）但</SPAN><SPAN lang=EN-US>sf.opengSession()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，并没有</SPAN><SPAN lang=EN-US>setAutoCommit(false)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我想问的是，如果不编写任何事务代码，如：</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Session s = sf.openSession(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>...... </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>s.close(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库会不会有反应（此时应该是默认</SPAN><SPAN lang=EN-US>AutoCommit</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</SPAN><SPAN lang=EN-US>true</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 style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不会有反应。在</SPAN><SPAN lang=EN-US>sf.openSession() </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建</SPAN><SPAN lang=EN-US>Session</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例的时候，就已经调用了</SPAN><SPAN lang=EN-US>conn.setAutoCommit(false)</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 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><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>&lt;code&gt; </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>1. s.flush()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不是必须的</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>2. s.close()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不是一定要关闭</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>&lt;/code&gt;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回答：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>s.flush</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是必须的，</SPAN><SPAN lang=EN-US>s.close()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会调用一次</SPAN><SPAN lang=EN-US>s.flush()</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>s.close()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正常情况下应该关闭，除非你是用</SPAN><SPAN lang=EN-US>ThreadLocal</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理</SPAN><SPAN lang=EN-US>Session</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; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt"><SPAN lang=EN-US>s1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不关闭，使用</SPAN><SPAN lang=EN-US>s2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行操作的代码中使用</SPAN><SPAN lang=EN-US>s1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可不可以（我觉得这样更加节约资源，不需要反复的连接、关闭）</SPAN><SPAN lang=EN-US>&lt;/code&gt;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这个例子中看不出来</SPAN><SPAN lang=EN-US>JTA</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 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>&lt;code&gt;Class A<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>{</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>find() {</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>Session s1 = sf.openSession(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>... </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>s1.flush(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>s1.close(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>}&lt;/code&gt;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&lt;code&gt;Class B<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>{</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>find() {</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>Session s2 = sf.openSession(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>... </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>s2.flush(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>s2.close(); </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Main {</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>tx = ...;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>A.find();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>B.find();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>tx.commit();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看明白了吗？</SPAN><SPAN lang=EN-US>JTA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Transaction</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/pirate/aggbug/8720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-29 10:46 <a href="http://www.blogjava.net/pirate/archive/2005/07/29/8720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一个Hibernate例子</title><link>http://www.blogjava.net/pirate/archive/2005/07/29/8710.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Fri, 29 Jul 2005 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/29/8710.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8710.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/29/8710.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8710.html</trackback:ping><description><![CDATA[<P>这是一个简单的例子</P>
<P>1. 在mySQL中建立一张USER表。</P>
<P>CREATE TABLE USER ( <BR>&nbsp;&nbsp;&nbsp; user_id CHAR(32) NOT NULL PRIMARY KEY, <BR>&nbsp;&nbsp;&nbsp; name VARCHAR(16) NOT NULL, <BR>&nbsp;&nbsp;&nbsp; sex CHAR(1), <BR>&nbsp;&nbsp;&nbsp; age INT <BR>);</P>
<P>2. 建立一个pojo</P>
<P>package com.xy;</P>
<P>public class User { <BR>&nbsp;&nbsp;&nbsp; private String id; <BR>&nbsp;&nbsp;&nbsp; private String name; <BR>&nbsp;&nbsp;&nbsp; private char sex; <BR>&nbsp;&nbsp;&nbsp; private int age; </P>
<P>&nbsp;&nbsp;&nbsp; public int getAge() { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public String getId() { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return id; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public String getName() { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public char getSex() { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sex; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public void setAge(int i) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age = i; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public void setId(String string) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id = string; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public void setName(String string) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = string; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; public void setSex(char c) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sex = c; <BR>&nbsp;&nbsp;&nbsp; } <BR>}</P>
<P>3. hibernate.cfg.xml文件</P>
<P>&lt;?xml version='1.0' encoding='utf-8'?&gt; <BR>&lt;!DOCTYPE hibernate-configuration <BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" <BR>&nbsp;&nbsp;&nbsp; "<A href="http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd</A>"&gt; </P>
<P>&lt;hibernate-configuration&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;session-factory&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 显示实际操作数据库时的SQL --&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="show_sql"&gt;true&lt;/property&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- SQL方言，这里设定的是MySQL --&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dialect"&gt;net.sf.hibernate.dialect.MySQLDialect&lt;/property&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- JDBC驱动程式 --&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- JDBC URL --&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.url"&gt;jdbc:mysql://localhost/jiejie&lt;/property&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 用户名 --&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.username"&gt;root&lt;/property&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 密码--&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.password"&gt;&lt;/property&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 映射文件 --&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping resource="User.hbm.xml"/&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt; </P>
<P>&lt;/hibernate-configuration&gt; </P>
<P>4. User.hbm.xml</P>
<P>&lt;?xml version="1.0"?&gt; <BR>&lt;!DOCTYPE hibernate-mapping <BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" <BR>&nbsp;&nbsp;&nbsp; "<A href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</A>"&gt; </P>
<P>&lt;hibernate-mapping&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;class name="com.xy.User" table="USER"&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="string" unsaved-value="null"&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="user_id" sql-type="char(32)" /&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex"/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name" type="string" not-null="true"&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="16" not-null="true"/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sex" type="char"/&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="age" type="int"/&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;/class&gt; </P>
<P>&lt;/hibernate-mapping&gt;</P>
<P>5. 测试文件</P>
<P>package com.xy;</P>
<P>import java.util.List;<BR>import java.util.ListIterator;</P>
<P>import org.apache.commons.logging.Log;<BR>import org.apache.commons.logging.LogFactory;</P>
<P>import net.sf.hibernate.*;<BR>import net.sf.hibernate.cfg.*;</P>
<P>public class HibernateTest {<BR>&nbsp;private static Log log = LogFactory.getLog(HibernateTest.class); <BR>&nbsp;public void find() {<BR>&nbsp;&nbsp;SessionFactory sessionFactory;<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;sessionFactory = new Configuration().configure()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buildSessionFactory();</P>
<P>&nbsp;&nbsp;&nbsp;Session session = sessionFactory.openSession();</P>
<P>&nbsp;&nbsp;&nbsp;List users = session.find("from User");</P>
<P>&nbsp;&nbsp;&nbsp;session.close();<BR>&nbsp;&nbsp;&nbsp;sessionFactory.close();</P>
<P>&nbsp;&nbsp;&nbsp;for (ListIterator iterator = users.listIterator(); iterator<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.hasNext();) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;User user = (User) iterator.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user.getName() + "\n\tAge: " + user.getAge()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "\n\tSex: " + user.getSex());<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;} catch (HibernateException e) {<BR>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}</P>
<P>&nbsp;public void insert() {</P>
<P>&nbsp;&nbsp;SessionFactory sessionFactory;<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;sessionFactory = new Configuration().configure()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buildSessionFactory();</P>
<P>&nbsp;&nbsp;&nbsp;User user = new User();<BR>&nbsp;&nbsp;&nbsp;user.setName("caterpillar");<BR>&nbsp;&nbsp;&nbsp;user.setSex('M');<BR>&nbsp;&nbsp;&nbsp;user.setAge(23);</P>
<P>&nbsp;&nbsp;&nbsp;Session session = sessionFactory.openSession();<BR>&nbsp;&nbsp;&nbsp;Transaction tx = session.beginTransaction();<BR>&nbsp;&nbsp;&nbsp;session.save(user);<BR>&nbsp;&nbsp;&nbsp;tx.commit();<BR>&nbsp;&nbsp;&nbsp;session.close();<BR>&nbsp;&nbsp;&nbsp;sessionFactory.close();</P>
<P>&nbsp;&nbsp;&nbsp;System.out.println("插入数据OK!请在MySQL查看结果！");<BR>&nbsp;&nbsp;} catch (HibernateException e) {<BR>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
<P>&nbsp;public static void main(String[] args) throws HibernateException {</P>
<P>&nbsp;&nbsp;new HibernateTest().find();<BR>&nbsp;&nbsp;new HibernateTest().insert();</P>
<P>&nbsp;}<BR>}<BR></P>
<P>6. 文件结构和所用到的jar包<BR><BR><IMG src="file:///C:/Documents%20and%20Settings/Administrator/桌面/1.jpg"><BR>&nbsp;<BR>7. 操作结果<BR><BR>log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).<BR>log4j:WARN Please initialize the log4j system properly.<BR>Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_<BR>caterpillar<BR>&nbsp;Age: 28<BR>&nbsp;Sex: M<BR>caterpillar<BR>&nbsp;Age: 28<BR>&nbsp;Sex: M<BR>caterpillar<BR>&nbsp;Age: 28<BR>&nbsp;Sex: M<BR>caterpillar<BR>&nbsp;Age: 23<BR>&nbsp;Sex: M<BR>qqqqq<BR>&nbsp;Age: 20<BR>&nbsp;Sex: M<BR>www<BR>&nbsp;Age: 21<BR>&nbsp;Sex: M<BR>yyy<BR>&nbsp;Age: 20<BR>&nbsp;Sex: M<BR>yyy<BR>&nbsp;Age: 20<BR>&nbsp;Sex: M<BR>yyy<BR>&nbsp;Age: 20<BR>&nbsp;Sex: M<BR>yyy<BR>&nbsp;Age: 20<BR>&nbsp;Sex: M<BR>Hibernate: insert into USER (name, sex, age, user_id) values (?, ?, ?, ?)<BR>插入数据OK!请在MySQL查看结果！<BR></P><img src ="http://www.blogjava.net/pirate/aggbug/8710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-29 10:07 <a href="http://www.blogjava.net/pirate/archive/2005/07/29/8710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一个AXIS WEB服务程序- </title><link>http://www.blogjava.net/pirate/archive/2005/07/28/8663.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 28 Jul 2005 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/28/8663.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8663.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/28/8663.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8663.html</trackback:ping><description><![CDATA[<P>在我们的项目成功应用了Hessian作为远程函数调用的技术方案之后，我又产生了新的疑问，它是除EJB和RMI-OP之外的唯一RPC选择吗？据说AXIS才是Web Service的正选，不管是否应用它，都应该去试试和了解它。那今天就上第一课吧，先做一个HelloWorld程序吧！</P>
<P>1）在<A href="http://ws.apache.org/axis/index.html">http://ws.apache.org/axis/index.html</A>下载AXIS的BIN版本，并将其解压后将其中的webapps\axis目录拷贝到你的tomcat目录下的webapps目录之下。</P>
<P>2）将以下jar拷贝至你的axis/WEB-INF/lib目录下：</P>
<P>activation.jar 、mail.jar 、xalan-2.4.0.jar 、xerces-2.4.0.jar 、 xercesImpl.jar</P>
<P>3）在axis目录下建立以下文件Hello.jws，内容如下：</P>
<P>public class Hello{<BR>&nbsp;public String hello(String name){<BR>&nbsp; if(name==null)<BR>&nbsp;&nbsp; name = "";<BR>&nbsp; return "hello,"+name+"!";<BR>}<BR>}<BR></P>
<P>4）创建JAVA接口程序，在命令行下进入到axis\WEB-INF目录下，在DOS提示符下输入：</P>
<P>Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl<BR></P>
<P>该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws，该目录下有四个JAVA源文件，它们分别是： </P>
<P>Hello.java 定义了Web服务接口，此例中只有一个hello方法。 </P>
<P>HelloService.java 定义了用于获取Web服务接口的方法。 </P>
<P>HelloServiceLocator.java 接口HelloService的具体实现。 </P>
<P>HelloSoapBindingStub.java Web服务客户端桩，通过该类与服务器交互。</P>
<P>5）编写调用示例程序Main.java如下：</P>
<P>package localhost.axis.Hello_jws;</P>
<P>public class Main {<BR>&nbsp;public static void main(String[] args) throws Exception {<BR>&nbsp;&nbsp;HelloService service = new HelloServiceLocator();<BR>&nbsp;&nbsp;Hello hello = service.getHello();<BR>&nbsp;&nbsp;System.out.println(hello.hello("sunbeam"));<BR>&nbsp;}<BR>}<BR></P>
<P>6）编译后运行，如果输出以下结果，恭喜你已经成功的完成了你的第一个AXIS WEB Serive程序啦。</P>
<P>&gt; hello,sunbeam</P>
<P>附注：</P>
<P>1）建议使用Eclipse进行开发，将axis目录设为tomcat project工程位置，将WEB-INF下的localhost目录设为源文件目录。并将生成接口程序的命令行程序定为Extend Tool外部程序。这样的生产效率最高也最方便。具体做法今天就懒得写了，以后再补好啦。</P>
<P>2）我顺便写个程序测试一下它所能承载的数据量和运行速度，感觉速度明显低于Hessian（估计接近一个数量级），传输的对象大小也大约是Hessian的1/5-1/10左右，究其原因我推论是Hessian是二进制方式传输数据，Axis的WEB服务是文本型的SOAP协议传输，而且再加上XML标签所占用的大量数据而已。下次再评估一下其它的RPC方法。</P><img src ="http://www.blogjava.net/pirate/aggbug/8663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-28 18:28 <a href="http://www.blogjava.net/pirate/archive/2005/07/28/8663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一个Hessian应用-</title><link>http://www.blogjava.net/pirate/archive/2005/07/28/8662.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 28 Jul 2005 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/28/8662.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8662.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/28/8662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8662.html</trackback:ping><description><![CDATA[<P>Hessian是一个简单的二进制的Web服务方案（其实我觉得它更多的是一种二进制对象传递方式），它只需要一个客户端接口和服务端程序就可以轻松实现程序的远程调用啦。<BR>下面就以Hessian主页上的例子来show一下这种简单的RPC应用方案啦</P>
<P><BR><STRONG><FONT size=3>1、在tomcat下创建一个应用test，在其下的WEB-INF/src目录下编写以下程序文件。</FONT></STRONG></P>
<P><FONT size=3><STRONG>2、创建服务端程序文件example/BasicService.java，内容如下：</STRONG><BR></FONT>package example;</P>
<P>public class BasicService implements Basic {<BR>&nbsp; private String _greeting = "Hello, world";</P>
<P>&nbsp; public void setGreeting(String greeting)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; _greeting = greeting;<BR>&nbsp; }</P>
<P>&nbsp; public String hello()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; return _greeting;<BR>&nbsp; }<BR>}</P>
<P><FONT size=3><STRONG>3、创建一个本地接口，example/Basic.java，内容如下：</STRONG></FONT><BR>package example;</P>
<P>public interface Basic {<BR>&nbsp;&nbsp; public String hello();&nbsp;//与服务端的hello方法对应<BR>}</P>
<P><BR><STRONG><FONT size=3>4、创建客户端测试程序，example/BasicClient.java，内容如下：</FONT></STRONG></P>
<P>package example;</P>
<P>import com.caucho.hessian.client.HessianProxyFactory;</P>
<P>public class BasicClient {<BR>&nbsp; public static void main(String []args)<BR>&nbsp;&nbsp;&nbsp; throws Exception<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String url = "<A href="http://127.0.0.1:8080/test/hello">http://127.0.0.1:8080/test/hello</A>";</P>
<P>&nbsp;&nbsp;&nbsp; HessianProxyFactory factory = new HessianProxyFactory();<BR>&nbsp;&nbsp;&nbsp; Basic basic = (Basic) factory.create(Basic.class, url);</P>
<P>&nbsp;&nbsp;&nbsp; System.out.println("Hello: " + basic.hello());<BR>&nbsp; }<BR>}</P>
<P><FONT size=3><STRONG>5、修改WEB-INF下的web.xml文件，填充以下内容：</STRONG></FONT></P>
<P>&nbsp; &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</P>
<P>&lt;!DOCTYPE web-app<BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<BR>&nbsp;&nbsp;&nbsp; "<A href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</A>"&gt;<BR>&nbsp;&lt;web-app&gt;<BR>&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp; &lt;servlet-name&gt;hello&lt;/servlet-name&gt;<BR>&nbsp;&nbsp; &lt;servlet-class&gt;com.caucho.hessian.server.HessianServlet&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;home-class&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;example.BasicService&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;home-api&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;example.Basic&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp; &lt;/servlet&gt;</P>
<P>&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/hello&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;hello&lt;/servlet-name&gt;<BR>&nbsp; &lt;/servlet-mapping&gt;<BR>&lt;/web-app&gt;<BR></SERVLET-MAPPING /><BR></P></WEB-APP />
<P><STRONG><FONT size=3>6、启动tomcat后，运行一下BasicClient类</FONT></STRONG></P>
<P>看一看，是不是输出以下的内容啦，如果有恭喜你，已经成功创建你的第一个RPC Hessian应用了。<BR>&gt; Hello: Hello, world<BR></P><img src ="http://www.blogjava.net/pirate/aggbug/8662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-28 18:20 <a href="http://www.blogjava.net/pirate/archive/2005/07/28/8662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>soap简单使用</title><link>http://www.blogjava.net/pirate/archive/2005/07/28/8660.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Thu, 28 Jul 2005 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/28/8660.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8660.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/28/8660.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8660.html</trackback:ping><description><![CDATA[开始之前，我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论SOAP技术，我们将尽可能的讲得通俗易懂一些，所以，我们引入了一个普通的“Hello World”范例来给读者说明它们是怎么运作的，让读者知道它们的运作方式。我认为，如果光看官方文档是很难开始学习这门新技术的，官方文档中包含大量的范例，并解释了所有的特性和优点，但是没解释它们的运作方式。在这篇文章中，我不打算只肤浅的解释SOAP技术的定义，我们假设读者熟悉JAVA语言，Web技术，具有XML语言，XML Namespaces，XML Schema的基础。在这种情况下，理解本文将不存在任何困难。然而，即使没有这些知识，你也不必担心，我们将尽可能的解释得简单，但是当你开始做自己的SOAP应用程序时会遇到一些问题和麻烦。因此，花费一定时间来学习上面的知识是很有必要的。 <BR><BR>　　从技术的角度来说，有必要提一下我们的调试环境。我们使用的是Windows XP操作系统，安装有JAVA 2 SDK 1.4.1，Apache SOAP 2.3.1，JAF 1.0.2，JAVAMAIL 1.3.1和Xerces 2.6.0。上面所提及的都能在Tcomcat 4.1.29 JSP/Servlet容器中正常运行。所有的软件都是免费自由软件，因此你能够很容易的下载它们并自己在任何你喜欢的平台如Windows或UNIX上安装它们。Java SDK，JAF和JAVAMAIL位于SUN的官方网站（http://java.sun.com），其他的软件在Jakarta项目组的官方网站（http://jakarta.apache.org）上有down的。可能你在看到我们需要这么多不同的包（package）时已经有点担心和不安了，但是实际上你不应该担心这些的。一旦你懂了基础，那么对你将相当容易。安装不是一件很难的事情，你只需要在设置环境变量的时候仔细些，比如CATALINA_HOME, CLASSPATH, JAVA_HOME 等等，所有这些步骤都是手工的。由于我仅仅是想将你的注意力再次集中到它们身上，所以你能很快的就完成以上配置过程。我只是添加下面的一些字符串到Tomcat的bin/setclasspath.bat文件中： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>...<BR>set CATALINA_HOME=C:\Tomcat4.1.29<BR>set CLASSPATH=%JAVA_HOME%\lib\tools.jar<BR>set CLASSPATH=%JAVA_HOME%\soap-2.3.1\lib\soap.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar<BR>set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar<BR>set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar<BR>set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\tools.jar<BR>... </TD></TR></TBODY></TABLE><BR>　　如果你的安装路径（installation paths）和上面使用的不同，你需要更正它们，然后关闭和重启Tomcat以使它们生效。这样，你就有为运行SOAP作好了准备。但是现在，我要忘记有关的技术部分，来学一点理论知识。<BR><BR>　　SOAP意思是简单对象访问协议（Simple Object Access Protocol）。的确如它的名字一样，SOAP是很简单的。它是一个基于XML的协议，允许程序组件和应用程序彼此使用一种标准的Internet协议--HTTP来通讯。SOAP是一种独立的平台，它不依赖程序语言，它是简单的，弹性的，很容易扩展的。目前，应用程序能够彼此使用一种基于DCOM和CORBA技术的远程过程调用（RPC）来进行相互通讯，但HTTP不被设计为这个目的。RPC在Internet上应用是非常困难的，它们会出现许多兼容性和安全性的问题，因为防火墙和代理服务器通常都会阻断（block）这些类型的流量。应用程序之间最好的通讯方式是通过HTTP协议，因为HTTP是支持所有Internet浏览器和服务器的。基于这个目的，SOAP协议被创建出来。<BR><BR>　　那么，它们是如何运作的呢？比如，一个应用程序（A）需要和另一个应用程序（B）在SOAP的帮助下进行彼此通讯。它们将使用下面的框架图来完成这个过程：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201676.gif';" hspace=3 src="http://www.yesky.com/image20010518/201676.gif" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　这个SOAP信封（SOAP envelope）是一个包含以下内容的XML文档：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201677.gif';" hspace=3 src="http://www.yesky.com/image20010518/201677.gif" align=center vspace=1 border=1></DIV></DIV></TD></TR></TBODY></TABLE><BR>　　正如你看到的，它是非常简单的。它看起来确实就象一个普通的信封或者你的email。你想看看它们是如何动作的吗？下面跟我们一起来吧。其实我们有很多方法是不用SOAP来在创建和运行我们自己的“Hello World”应用程序的，但是因为我们要保持它的简单性，我会给你一个它运作方式的框架图（scheme）。<BR><BR>　　我们的“Hello World”范例会包含一个SOAP Service。我们的SOAP Client将发送它们的名字到该SOAP Service，并试图得到一些答复或响应。这个SOAP Service需要部署到一个SOAP Admin的工具，以至重定位所有请求的SOAP（Proxy） RPC Router能够知道它们应该使用哪种服务来运作。总而言之，这个是以下面的方式来运作的：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201680.gif';" hspace=3 src="http://www.yesky.com/image20010518/201680.gif" align=center vspace=1 border=1></DIV></DIV></TD></TR></TBODY></TABLE><BR>　　现在，我们来一步步的看看到底发生了什么。在Step 1里，HelloWorldClient将连接一个SOAP RPC Router，请求我们的SOAP Service并将包含我们名字的一个字符串传递给它。该SOAP RPC Router会检查是否它已经部署了这个SOAP Service。如果它被发现是被部署的，那么它将传递数据到这个SOAP Service并调用特定的方法，这个是Step 2。然后SOAP Service方法会被执行，将返回某个字符串值（该值就是SOAP Client的答复或者响应）（Step 3）。在Step4中，SOAP RPC Router将仅仅只是重定向这个数据到SOAP Client。所有在Step1和Step4里传输的数据是通过SOAP Envelope来完成的。正如你所看到的，算法是相当简单的，因此我们只准备关心实际的代码。 <BR>首先，我们要创建一个SOAP Service。下面是它的代码，请不要忘记将它放入HelloWorld/ 目录中（必须被包含在你的CLASSPATH中）：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>1: // SOAPService.java<BR>2: package HelloWorld;<BR>3: public class SOAPService {<BR>4: public String sayHi(String x) {<BR>5: return("Hello my friend, " + x + "! Glad to see you!");<BR>6: }<BR>7: } </TD></TR></TBODY></TABLE><BR>　　添加任何注释也是很容易的。要编译它，只需要用下列命令：<BR><BR>　　javac SOAPService.java<BR><BR>　　第二步，一旦我们准备好了SOAP Service，我们需要用SOAP Service Manager来部署它。这个可以通过很多方式来实现，但是为了能让初学SOAP的读者更容易理解SOAP，我提供了一个最容易的方式。我们假设你的Web Server（Tomcat或其他）已经正常运行，并且你已经正确安装了SOAP。那么当浏览器访问http://localhost:8080/soap/，你会看见Apache SOAP的欢迎页面。点击Run the admin client ，然后 Deploy。你会得到一个屏幕显示，在那里你需要填入ID，Scope，Method，Provider Type和JAVA Provider的信息到表单域中。你能忽略其他所有的表单域，除非你真的需要它们的信息。我们的“HelloWorld”例子不需要它们，所以，我们填的下面的值：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>ID: urn:HelloWorld_SOAPService <BR>Scope: Application <BR>Methods: sayHi <BR>Provider Type: java <BR>Java Provider - Provider Class: HelloWorld.SOAPService <BR>Java Provider - Static? No </TD></TR></TBODY></TABLE><BR>　　一些注释：ID是我们要从SOAP Client标识我们的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java类的名字。<BR><BR>　　现在，点击Deploy 按钮，那么你的服务会被部署。再次强调，请注意正确设置CLASSPATH环境变量。然后，你的HelloWorld.SOAPService类能够被找到，并且所有必需的jar包也能被找到。这是个几乎每个人都会犯的普通错误。现在，你能够点击 List ，将会看见你的服务已经被部署进来。恭喜！<BR><BR>　　最后，让我们来创建一个SOAP Client。代码看起来有点复杂，但是在现实中不会只有这么点长。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>1: // HelloWorldClient.java<BR>2: import java.io.*;<BR>3: import java.net.*;<BR>4: import java.util.*;<BR>5: import org.apache.soap.*;<BR>6: import org.apache.soap.rpc.*;<BR>7: public class HelloWorldClient {<BR>8: public static void main(String[] arg) throws Exception {<BR>9: Call c = null;<BR>10: URL url = null;<BR>11: Vector params = null;<BR>12: Response rep = null;<BR>13: String ourName = "Superman";<BR>14: String ourUrn = "urn:HelloWorld_SOAPService";<BR>15: String ourMethod = "sayHi";<BR>16: url = new URL("http://localhost:8080/soap/servlet/<BR>rpcrouter");<BR>17: System.out.println("Passing to our deployed "+ourUrn+"<BR>our name ("+ourName+"): ");<BR>18: c = new Call();<BR>19: c.setTargetObjectURI(ourUrn);<BR>20: c.setMethodName(ourMethod);<BR>21: c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);<BR>22: params = new Vector();<BR>23: params.addElement(new Parameter("ourName", String.class,<BR>ourName, null));<BR>24: c.setParams(params);<BR>25: System.out.print("and its answer is: ");<BR>26: rep = c.invoke(url, "");<BR>27: if (rep.generatedFault()) {<BR>28: Fault fault = rep.getFault();<BR>29: System.out.println("\nCall failed!");<BR>30: System.out.println("Code = " + fault.getFaultCode());<BR>31: System.out.println("String = " + fault.getFaultString());<BR>32: } else {<BR>33: Parameter result = rep.getReturnValue();<BR>34: System.out.print(result.getValue());<BR>35: System.out.println();<BR>36: }<BR>37: }<BR>38:} </TD></TR></TBODY></TABLE><BR>　　下面我要做一些解释。在第13行，我们设置了我们的名字，这个名字将会传递给SOAP Service。在第14行，我们设置了我们将要调用的服务的ID（service ID），和第15行里设置的服务方法（service method）。有了这个ID，服务能够被部署到SOAP服务管理器（SOAP Service Manager）中。我们没有设置任何其他值，仅仅只用刚才那些基础值就可以正常运作了。你能从SOAP的官方文档上得到相关信息，该文档来自SOAP包中，它们的解释超出了本文的范围。<BR><BR>　　用以下方式编译这个SOAP Client：<BR><BR>　　javac HelloWorldClient.java<BR><BR>　　为了圆满完成它，让我们检查一下针对我们的测试，是否所有事情都准备就绪。Tomcat正在运行，所有的环境变量都正确，SOAP Service被编译和部署，SOAP Client被成功编译。OK，让我们运行它，你将看到这个屏幕：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='http://www.yesky.com/image20010518/201681.gif';" hspace=3 src="http://www.yesky.com/image20010518/201681.gif" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　正如你所看到的，我们的SOAP Client使用SOAP协议成功发送它的名字和接收了一个答复。正如前面所说的，SOAP Service发送和接收的是SOAP envelope。这个是SOAP envelope的源代码。<BR><BR>　　被发送到SOAP Service的SOAP Envelope<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>＜?xml version='1.0' encoding='UTF-8'?＞<BR>＜SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/<BR>soap/envelope/"<BR>xmlns:xsi="http://www.w3.org/2001/<BR>XMLSchema-instance"<BR>xmlns:xsd="http://www.w3.org/2001/XMLSchema"＞<BR>＜SOAP-ENV:Body＞<BR>＜ns1:sayHi xmlns:ns1="urn:HelloWorld_SOAPService"<BR>SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/<BR>soap/encoding/"＞<BR>＜ourName xsi:type="xsd:string"＞Superman＜/ourName＞<BR>＜/ns1:sayHi＞<BR>＜/SOAP-ENV:Body＞<BR>＜/SOAP-ENV:Envelope＞: </TD></TR></TBODY></TABLE><BR>　　从SOAP Service接收的SOAP Envelope<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>＜?xml version='1.0' encoding='UTF-8'?＞<BR>＜SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/<BR>soap/envelope/"<BR>xmlns:xsi="http://www.w3.org/2001/<BR>XMLSchema-instance"<BR>xmlns:xsd="http://www.w3.org/2001/XMLSchema"＞<BR>＜SOAP-ENV:Body＞<BR>＜ns1:sayHiResponse xmlns:ns1="urn:HelloWorld_SOAPService"<BR>SOAP-ENV:encodingStyle="http://schemas.xmlsoap.<BR>org/soap/encoding/"＞<BR>＜return xsi:type="xsd:string"＞Hello my friend, Superman!<BR>Glad to see you!＜/return＞<BR>＜/ns1:sayHiResponse＞<BR>＜/SOAP-ENV:Body＞<BR>＜/SOAP-ENV:Envelope＞ </TD></TR></TBODY></TABLE><BR>　　要理解SOAP Envelope中的所有标签的含义，我建议你花一点时间阅读 http://www.w3.org/2001/06/soap-envelope 命名空间规范。<BR><BR>　　我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是简单的，有趣的，强大的，弹性的。它被用在许多Web应用中，这些应用的数量也在不断增加。学习SOAP是值得的，至少你要知道它是什么和它是怎么运作的。 
<DIV class=right>&nbsp;</DIV><img src ="http://www.blogjava.net/pirate/aggbug/8660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-28 18:02 <a href="http://www.blogjava.net/pirate/archive/2005/07/28/8660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中String,Integer,int之间转换</title><link>http://www.blogjava.net/pirate/archive/2005/07/27/8549.html</link><dc:creator>海贼</dc:creator><author>海贼</author><pubDate>Wed, 27 Jul 2005 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/pirate/archive/2005/07/27/8549.html</guid><wfw:comment>http://www.blogjava.net/pirate/comments/8549.html</wfw:comment><comments>http://www.blogjava.net/pirate/archive/2005/07/27/8549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pirate/comments/commentRss/8549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pirate/services/trackbacks/8549.html</trackback:ping><description><![CDATA[<P>String,Integer,int之间转换</P>
<P>String &lt;- int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ""+int;<BR>String &lt;- Integer&nbsp;_Integer.toString();</P>
<P>int &lt;- Integer&nbsp;&nbsp;_Integer.intValue();<BR>int &lt;- String&nbsp;&nbsp;Integer.parseInt(_str);</P>
<P>Integer &lt;- String&nbsp;&nbsp;&nbsp; new Integer(Integer.parseInt(_str));<BR>Integer &lt;- int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ingeger(_int);</P>
<P>其他转换类似。</P><img src ="http://www.blogjava.net/pirate/aggbug/8549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pirate/" target="_blank">海贼</a> 2005-07-27 15:00 <a href="http://www.blogjava.net/pirate/archive/2005/07/27/8549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>