﻿<?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/site120/category/27064.html</link><description>凝聚，积累，量变……  &lt;b&gt;心领神会，勤加练习！&lt;/b&gt; 大处着眼，小处着手。</description><language>zh-cn</language><lastBuildDate>Wed, 07 Nov 2007 09:41:40 GMT</lastBuildDate><pubDate>Wed, 07 Nov 2007 09:41:40 GMT</pubDate><ttl>60</ttl><item><title>Jboss下Ejb简介</title><link>http://www.blogjava.net/site120/archive/2007/11/07/158704.html</link><dc:creator>姜利阳</dc:creator><author>姜利阳</author><pubDate>Tue, 06 Nov 2007 23:42:00 GMT</pubDate><guid>http://www.blogjava.net/site120/archive/2007/11/07/158704.html</guid><wfw:comment>http://www.blogjava.net/site120/comments/158704.html</wfw:comment><comments>http://www.blogjava.net/site120/archive/2007/11/07/158704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/site120/comments/commentRss/158704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/site120/services/trackbacks/158704.html</trackback:ping><description><![CDATA[<p>JBoss是一个运行EJB的 J2EE应用服务器。它是开放源代码的项目，遵循最新的J2EE规范。从JBoss项目开始至今，它已经从一个EJB容器发展成为一个基于的J2EE的一 个web 操作系统（operating system for web），它体现了J2EE规范中最新的技术，并且它还在the JavaWorld Editors' Choice 2002评选中获得&#8220;最佳Java应用服务器&#8221;大奖。无论是学习还是应用，JBoss为我们提供了一个非常优秀的平台。有关JBoss的详细信息请参阅其 主页http://www.jboss.org。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开始使用JBoss进行EJB开发时，由于可供参考的资源不是很多，所以有一个比较困难的起步阶段。JBoss的配置和使用没有提供图形向导界面，所以 开发部署EJB相对比较复杂。本文通过尽量具体的演示来对JBoss3.0下的EJB开发和部署的进行一个简单的介绍，从而使刚开始使用JBoss的用户 可以很快地进入到真正的J2EE应用开发中。</p>
<p>由于本文主要介绍JBoss3.0中不同类型EJB的配置和部署，不对基本的EJB开发做太多的描述，所以希望读者具有J2EE和EJB的经验。想要了解有关信息请查阅参考资料1。</p>
<p>2．JBoss3.0中基本的ejb配置和部署<br />
根 据J2EE规范的要求，一个基本的ejb jar包使用的描述文件是ejb-jar.xml。web应用的war包使用的是web.xml。企业应用的ear包使用的是 application.xml。这些配置文件都是中性的和平台无关的。同时应用服务器可以使用一些其他的配置文件用于描述特定服务器的相关信息。在 JBoss中这样的文件有jboss.xml，jboss-web.xml等。JBoss容器中这些文件不是必须的，如果提供了那么jboss.xml和 ejb-jar.xml放在同一目录下，jboss-web.xml和web.xml放在同一目录下。关于jboss.xml和jboss- web.xml的规范请参考JBoss安装目录下docs/dtd/目录下的对应的DTD文件。</p>
<p>2．1 JBoss中关于EJB客户端的配置：<br />
调 用EJB的客户端可以是JSP、Servlet或客户端应用程序。如果客户端和服务器不在同一个Java VM上，那么在客户端必须提供一个jndi.properties文件告诉客户端进行有关JNDI命名服务的信息，并且把这个文件所在目录设定到环境变量 classpath中。</p>
<p>以下是一个jndi.properties的样例：</p>
<p>java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory<br />
java.naming.provider.url=localhost:1099&nbsp; (服务器地址和端口号)<br />
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces<br />
通过这个文件和JBoss的一些客户端类库，就可以使用JBoss提供的EJB对象服务了。</p>
<p>2．2 JBoss中部署EJB：<br />
首先介绍JBoss容器中部署各类EJB对象的两种方法。下面的演示以Session Bean为例，客户端是一个本机上的web应用。这里不对演示程序进行具体介绍。</p>
<p>第一种方式：</p>
<p>把开发好的ejb jar包和web应用的war包公共放在deploy目录下。</p>
<p>演示1：不需要jboss.xml文件和其他任何特殊的设置。</p>
<p>ejb-jar.xml:</p>
<p>&nbsp;</p>
<p>&lt;ejb-jar&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-name&gt;ejbtest&lt;/ejb-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;&lt;/ejb-jar&gt;</p>
<p><br />
客户端：web应用中对web.xml不需要添加ejb信息，不需要jboss-web.xml文件。引用ejb对象的jsp文件如下：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitialContext ctx = new InitialContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object objref&nbsp; = ctx.lookup("ejbtest");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用&lt;ejb-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;</p>
<p>&nbsp;</p>
<p><br />
演示2：使用jboss.xml文件。</p>
<p>在 缺省情况下JBoss的JNDI服务将通过ejb-jar.xml中&lt;ejb-name&gt;XXX&lt;/ejb-name&gt;中的 XXX来使用EJB的home interface。但是如果有多个ejb对象在相同的ejb jar包中，在ejb-jar.xml中通过&lt;ejb-name&gt;XXX&lt;/ejb-name&gt;就可能不能很好的表示某一个 ejb对象，所以一般我们希望可以提供一些附加的信息，例如采用这样的格式"[应用名]/[bean名]"来引用一个EJB对象。这时JNDI服务就可能 不能正确地找到你的ejb对象，我们就需要使用jboss.xml文件，通过它实现jndi 名到ejb名的重定向。这个文件必须和ejb-jar.xml一起放到META-INFO目录下。</p>
<p>ejb-jar.xml:</p>
<p><br />
&lt;ejb-jar&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-name&gt;ejbtest&lt;/ejb-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;&lt;/ejb-jar&gt;</p>
<p><br />
jboss.xml:</p>
<p><br />
&lt;jboss&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-name&gt;ejbtest&lt;/ejb-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;example/ejbtest&lt;/jndi-name&gt;&lt;/jboss&gt;</p>
<p>&nbsp;</p>
<p><br />
客户端：需要使用新的jndi名进行ejb定位。</p>
<p><br />
&#183;&#183;&#183;&#183;&#183;&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitialContext ctx = new InitialContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object objref&nbsp; = ctx.lookup("example/ejbtest");&nbsp;&nbsp; //使用&lt;jndi-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);&#183;&#183;&#183;&#183;&#183;&#183;</p>
<p><br />
第二种方式： </p>
<p>把ejb 和web应用包装成一个企业应用包。部署ear时可以简单地把通过application.xml描述ejb jar包和web应用的war包，同样在web.war中不需要提供特殊的信息就可以和第一种方式一样使用ejb对象。客户端代码也不需要进行改动。这里 不再举例说明。</p>
<p>此外我们可以进行更进一步的部署，这时需要使用到web.xml和jboss-web.xml。jboss-web.xml是JBoss提供的一个针对web应用进行配置的文件。jboss-web.xml和web.xml一起放在web应用的WEB-INF目录下。</p>
<p>演示1：改动web.xml文件，添加&lt;ejb-ref&gt;标记，不使用jboss-web.xml文件。</p>
<p>（注意&lt;ejb-ref&gt;包括内部引用和外部引用。如果是同一个单元的可以通过&lt;ejb-link&gt;直接进行引用，而不用提供其他信息。）</p>
<p>web.xml:</p>
<p><br />
&#183;&#183;&#183;&#183;&#183;&#183;&lt;ejb-ref&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-ref-name&gt;ejb/ejbtest&lt;/ejb-ref-name&gt;&nbsp; &lt;!--采用sun推荐的命名方式--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;home&gt;org.zcx.test.zcxejb1Home&lt;/home&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;remote&gt;org.zcx.test.zcxejb1&lt;/remote&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-link&gt;ejbtest&lt;/ejb-link&gt;&nbsp;&nbsp;&nbsp; &lt;!--必须和被应用的ejb-name匹配--&gt;&lt;/ejb-ref&gt;&#183;&#183;&#183;&#183;&#183;&#183;</p>
<p><br />
客户端：由于在web.xml中引入ejb引用描述这时ejb定位发生了变化：</p>
<p><br />
&#183;&#183;&#183;&#183;&#183;&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitialContext ctx = new InitialContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object objref&nbsp; = ctx.lookup("java:comp/env/ ejb/ejbtest "); //使用java:comp/env命名空间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);&#183;&#183;&#183;&#183;&#183;&#183;</p>
<p>&nbsp;</p>
<p><br />
演示2：联合使用web.xml和jboss-web.xml</p>
<p>web.xml</p>
<p><br />
&#183;&#183;&#183;&#183;&#183;&#183;&lt;ejb-ref&gt;&lt;ejb-ref-name&gt;ejb/ejbtest&lt;/ejb-ref-name&gt;&nbsp; &lt;!--采用sun推荐的命名方式--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;home&gt;org.zcx.test.zcxejb1Home&lt;/home&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;remote&gt;org.zcx.test.zcxejb1&lt;/remote&gt;&lt;/ejb-ref&gt;&#183;&#183;&#183;&#183;&#183;&#183;</p>
<p><br />
jboss-web.xml</p>
<p><br />
&lt;ejb-ref&gt;&lt;ejb-ref-name&gt; ejb/ejbtest &lt;/ejb-ref-name&gt;&lt;jndi-name&gt; example/ejbtest &lt;/jndi-name&gt; &lt;!-- 这里对应ejb对象的jndi名--&gt;&lt;/ejb-ref&gt;</p>
<p><br />
客户端：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nitialContext ctx = new InitialContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object objref&nbsp; = ctx.lookup("java:comp/env/ ejb/ejbtest ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);</p>
<p>&nbsp;</p>
<p><br />
以上的所有演示说明了ejb-jar.xml、jboss.xml、web.xml、jboss-web.xml之间的基本关系和它们的使用方式。它们是部署各类ejb对象的关键文件。接下来介绍针对不同类型的ejb对象所需要的特殊配置。</p>
<p>3．JBoss3.0中对于CMP2.0 Entity Bean的有关配置<br />
JBoss3.0 中JBossCMP引擎实现了EJB2.0 CMP2.0规范。JBoss3.0以前的版本CMP的引擎是Jaws，它通过standardjaws.xml和jaws.xml进行有关的配置。在新 的JBossCMP引擎中Jboss3.0通过standardjbosscmp-jdbc.xml和josscmp-jdbc.xml来配置 Entity Bean。JBoss3.0首先处理standardjbosscmp-jdbc.xml然后根据ejb jar中是否提供jbosscmp-jdbc.xml来做进一步处理。通过standardjbosscmp-jdbc.xml和jbosscmp- jdbc.xml可以为entity bean的部署提供如下的功能有：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定所使用的数据源和对应的类型映射 </p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一些引擎关心的属性</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定引擎如何创建和管理数据库表的原则</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述finder和ejbSelect方法</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定属性和字段的类型映射 </p>
<p>这 里主要根据standardjbosscmp-jdbc.xml/jbosscmp-jdbc.xml介绍CMP2.0的配置方法。JBoss中原有的 Jaws引擎的配置方法和新的JBossCMP的配置方法类似。这些文件的具体的信息可以参考JBoss安装路径下\docs\dtd中对应的DTD文 件。</p>
<p>3．1增加新的数据源<br />
JBoss自带的数据库是Hypersonic数据库，我们可以增加一些新的数据源。具 体的步骤很简单，参照Jboss安装目录下\docs\examples\jca中的*-service.xml文件可以增加找到对应类型的数据库配置样 本文件。以mysql-service.xml文件为例，它可以配置一个MySQL数据库作为Entity Bean的数据源。以下演示创建一个名为MySQLDS的MySQL数据源。</p>
<p>图一是配置好的mysql-service.xml文件的一段代码样本，通过属性设置可以定制数据源的名称和有关连接的其他属性。注意该文件中所有name属性必须保持一致。</p>
<p><br />
图一 mysql-servic.xml的样本代码</p>
<p>在配置好这个文件后，把它部署在JBoss的deploy目录下，把对应的jdbc驱动也放在lib目录下。重新启动Jboss就会加载这个新的数据源。</p>
<p>3．2 Entity Bean 对数据源的使用<br />
第一种方式：</p>
<p>直 接改动standardjbosscmp-jdbc.xml。把原有的数据源java:/DefautlDS屏蔽掉使用新的数据源java: /MySQLDS。（Java前缀是必须的。）不需在其他地方作改动。JBoss会实现新的数据源做为缺省的数据源。图二是一个配置好的文件片断。</p>
<p><br />
图二 standardjbosscmp-jdbc.xml的样本代码</p>
<p>第二种方式：</p>
<p>由 于有可能不同的Entity Bean使用不同的数据源，而不是都使用同样的缺省配置，所以必须为单独的Entity Bean提供定制数据源信息的支持。这时不需要改动standardjbosscmp-jdbc.xml文件，可以通过在Entity Bean的jar包中META-INFO目录下添加新的部署文件jbosscmp-jdbc.xml来完成。通过这个文件可以描述特定的Entity Bean的关于数据源的配置信息。图三是一个配置好的文件片断。</p>
<p><br />
图三 jbosscmp-jdbc.xml的样本代码</p>
<p>4．JBoss3.0中对于Message Driven Bean的配置<br />
在JBoss 中开发MDB需要使用JMS功能。JMS是Sun公司开发的面向消息的中间件API。它的主要目的是创造一种统一的面向消息编程的JavaAPI，从而避 免使用提供商特定的API。现在有几种不同的JMS系统可供使用。JBoss3.0中提供的是JBossMQ。</p>
<p>4．1 JBoss3.0中配置JMS服务<br />
在JBoss3.0 中与JMS服务相关的配置文件包括两个文件：jbossMQ-service.xml和jbossMQ-destinations- service.xml。jbossMQ-service.xml配置了jbossMQ服务中的核心对象信息。一般我们不需要处理这个配置文件。 jbossMQ-destinations-service.xml用于定义具体应用所需的目的地信息。通过编辑它我们可以创建新的Topic和 Queue用于具体的JMS应用的目的地。在JBoss中创建应用特定的Topic和Queues的步骤比较简单，参照jbossMQ- destinations-service.xml文件格式在该文件中添加自己应用程序所需的Topic名为myTestAppTopic和Queue名 为myTestAppQueue。如图四所示。</p>
<p><br />
图四&nbsp; jbossMQ-destinations-service.xml的样本代码</p>
<p>4．2 JBoss3.0中EJB使用JMS服务的配置<br />
在开发MDB 时要在部署文件中指定所使用的JMS服务中的目的地信息。JBoss中通过ejb-jar.xml和jboss.xml共同说明。在jboss.xml中通过&lt;destination-jndi-name&gt;标记描述所使用的目的地信息。</p>
<p>Ejb-jar.xml</p>
<p><br />
&lt;message-driven&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-name&gt;HelloTopicMDB&lt;/ejb-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-class&gt;org.zcx.test.HelloMDB&lt;/ejb-class&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message-selector&gt;&lt;/message-selector&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transaction-type&gt;Container&lt;/transaction-type&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message-driven-destination&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;destination-type&gt;javax.jms.Topic&lt;/destination-type&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;subscription-durability&gt;NonDurable&lt;/subscription-durability&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/message-driven-destination&gt;&lt;/message-driven&gt;</p>
<p><br />
jboss.xml</p>
<p><br />
&nbsp; &lt;message-driven&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ejb-name&gt;HelloTopicMDB&lt;/ejb-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration-name&gt;Standard Message Driven Bean&lt;/configuration-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;destination-jndi-name&gt;topic/myAppTestTopic&lt;/destination-jndi-name&gt;&nbsp;&nbsp;&nbsp; &lt;/message-driven&gt;</p>
<p><br />
客户端：</p>
<p><br />
&#183;&#183;&#183;&#183;&#183;&#183;Context context = new InitialContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the connection factory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the connection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the session&#183;&#183;&#183;&#183;&#183;&#183;// Look up the destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; topic = (Topic)context.lookup("topic/myTestAppTopic");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a publisher// Publish the message&#183;&#183;&#183;&#183;&#183;&#183;</p>
<p><br />
5．JBoss3.0中EJB使用JavaMail服务的配置。<br />
由于JBoss提供了JavaMail服务的实现，所以在JBoss中使用JavaMail是非常方便地。它所需要配置的是mail.service文件。这个文件非常地简单不用多介绍。按照mail.service文件的的注释就可以顺利地完成配置。</p>
<p>图五是使用JavaMail服务的一个sessionBean的代码片断</p>
<p><br />
图五&nbsp; 使用javamail的样本代码</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>以 上通过例子简单的介绍了JBoss3.0中Session Bean、Entity Bean 和Message Drive Bean 最基本的配置和部署方法，通过这些介绍现在已经可以在JBoss中进行基本的EJB应用的开发了。本文中对于EJB应用中比较复杂的一些配置像权限设置、 资源管理和CMP2.0中的众多配置等都没有涉及到，希望大家可以在不断的实践和交流中更好地掌握JBoss的使用和配置。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考资料：<br />
1．&nbsp; http://java.sun.com/j2ee/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J2EE 和 EJB</p>
<p>2．&nbsp; http://www.jboss.org/&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; JBoss项目主页和在线手册</p>
<p>3．&nbsp; 《JBoss3.0 Quick Start》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the JBoss Group</p>
<p>4．&nbsp; 《Mastering Enterprise Java Beans, 2nd Edition》 Ed Roman, Scott Ambler, and Tyler Jewel. <br />
</p>
<img src ="http://www.blogjava.net/site120/aggbug/158704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/site120/" target="_blank">姜利阳</a> 2007-11-07 07:42 <a href="http://www.blogjava.net/site120/archive/2007/11/07/158704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss简介</title><link>http://www.blogjava.net/site120/archive/2007/11/06/158675.html</link><dc:creator>姜利阳</dc:creator><author>姜利阳</author><pubDate>Tue, 06 Nov 2007 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/site120/archive/2007/11/06/158675.html</guid><wfw:comment>http://www.blogjava.net/site120/comments/158675.html</wfw:comment><comments>http://www.blogjava.net/site120/archive/2007/11/06/158675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/site120/comments/commentRss/158675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/site120/services/trackbacks/158675.html</trackback:ping><description><![CDATA[<br />
<strong>解释1:</strong><br />
<br />
　Jboss是 web服务器的一种，主要做ejb容器，和tomcat集成就可以jsp,servlet,ejb通吃了 <br />
　Jboss有两种版本，一种是独立的，一种是和tomcat集成的，当然都是免费的啦 <br />
　EJB(enterprise javabean)，他不是javabean简单的升级，而是一些提供分布式访问的类 <br />
　包括实体bean,会话bean,消息驱动bean <br />
--------------------------------------------------------------- <br />
<strong>JBoss简介 <br />
</strong>　JBoss是一个运行EJB的J2EE应用服务器。它是开放源代码的项目，遵循最新的J2EE规范。从JBoss项目开始至今，它已经从一个EJB容器发展成为一个基于的J2EE的一个web 操作系统（operating system for web），它体现了J2EE规范中最新的技术，并且它还在the JavaWorld Editors' Choice 2002评选中获得&#8220;最佳Java应用服务器&#8221;大奖。无论是学习还是应用，JBoss为我们提供了一个非常优秀的平台。有关JBoss的详细信息请参阅其主页http://www.jboss.org。 <br />
<br />
　刚开始使用JBoss进行EJB开发时，由于可供参考的资源不是很多，所以有一个比较困难的起步阶段。JBoss的配置和使用没有提供图形向导界面，所以开发部署EJB相对比较复杂。本文通过尽量具体的演示来对JBoss3.0下的EJB开发和部署的进行一个简单的介绍，从而使刚开始使用JBoss的用户可以很快地进入到真正的J2EE应用开发中。 <br />
<br />
　Enterprise JavaBean (EJB)规范定义了开发和部署基于事务性、分布式对象应用程序的服务器端软件组件的体系结构。企业组织可以构建它们自己的组件，或从第三方供应商购买组件。这些服务器端组件称作 Enterprise Bean，它们是 Enterprise JavaBean 容器中驻留的分布式对象，为分布在网络中的客户机提供远程服务。<br />
<br />
<strong>解释2:</strong><br />
<br />
　JBoss是一个开源的符合J2EE规范的应用服务器，作为J2EE规范的补充，Jboss中引入了AOP框架，为普通Java类提供了J2EE服务，而无需遵循EJB规范。Jboss通过类载入时，使用Javassist对字节码操作实现动态AOP框架，Javassist是一个开源的编辑字节码的类库。
<p>　Jboss中参考，切入点与方面也由普通Java对象实现，并使用XML文件配置。Jboss的连接点模型与AspectJ略有不同，提供了一系列预定义的切入点，包括类匹配，方法调用，构造器调用，域访问，特定的调用与被调用关系。通过这些切入点的逻辑运算，可以实现更为复杂的切入点。方面为Java类，参考是其中的一个方法，方面中不含切入点，方面主要为各种拦截器（Interceptor），拦截器即为只含一个参考的方面，单一连接点上可由多个拦截器形成拦截器链，拦截器执行额外的操作。对方法的拦截由Advisor类管理，在连接点依次调用拦截器，并最终调用被逻辑的方法。而关于切入点，参考已及方面的信息由AspectManager管理。此外，Jboss提供对元数据的支持，用于为类，方法，构造器以及域添加额外的属性，并可在运行期访问。</p>
<p>　为实现拦截，Jboss需要修改类的字节码，大致过程如下。</p>
<p>　XML配置文件中关于切入点，拦截器，元数据以及混合类的信息在应用程序部署时被读入、解析，并生成相应的对象，这些信息与实例化的对象由AspectManager管理。在需要混入方面代码的类载入时，AspectManager将创建Advisor类，将方面相关信息传递给它，并对类的字节码进行修改，之后将修改过的字节码交给类载入器完成类的装载。字节码的修改主要是对被载入的类添加一系列方法用于代理那些匹配连接点的方法调用，构造器调用，域访问以及方法导入，转为对Advisor类相应方法的调用。类中各方法将重命名，保留原方法体，并添加一个与原方法同名的方法，在这个方法中调用那些代理方法，用来将调用代理给Advisor类，或调用重命名的原方法。对于域访问，分别添加两个方法，对应于读与写操作，将域访问代理至Advisor类，在访问这个域的类中，则需将对域的访问转换为对上述方法的调用。对于构造器调用，则添加一个方法，将调用代理至Advisor类，并对构造对象的类的构造代码作相应转换。对于导入，被导入的类中将添加一个混合类实现的引用，并添加混合类接口中的方法，将对混合类方法的调用代理至Advisor类，并最终调用混合类的实现。相关类载入后，初始化Advisor类，填入拦截器链，以完成整个处理过程。</p>
<p><strong>一、JBoss简介</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 近年来，在J2EE应用服务器领域，JBoss是发展最为迅速的应用服务器。JBoss是免费的，开放源代码J2EE的实现，它通过LGPL许可证进行发布,这使得JBoss广为流行。Boss是一个运行EJB的J2EE应用服务器，例如：数据库访问JDBC、交易(JTA/JTS)、消息机制(JTS)、命名机制(JNDI)和管理支持(JMX)。它是开放源代码的项目，遵循最新的J2EE规范。目前的JBoss发布版2.2.4实现了EJB 1.1和部分EJB 2.0的标准、JMS 1.0.1、Servlet 2.2、JSP 1.1、JMX 1.0、JNDI 1.0、JDBC 1.2和2.0扩充(支持连接池 (Connection Polling))、JavaMail/JAF、JTA 1.0和JAAS1.0标准，JBoss是100%纯Java实现能运行于任何平台。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从JBoss项目开始至今，它已经从一个EJB容器发展成为一个基于的J2EE的一个web 操作系统（operating system for web），它体现了J2EE规范中最新的技术，并且它还在the JavaWorld Editors' Choice 2002评选中获得&#8220;最佳Java应用服务器&#8221;大奖。无论是学习还是应用，JBoss为我们提供了一个非常优秀的平台。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong> 另外，JBoss应用服务器还具有许多优秀的特质:</strong> </p>
<p>它将具有革命性的JMX微内核服务作为其总线结构； <br />
它本身就是面向服务的架构（Service-Oriented Architecture，SOA）； <br />
它还具有统一的类装载器，从而能够实现应用的热部署和热卸载能力。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，它是高度模块化的和松耦合的。JBoss用户的积极反馈告诉我们，JBoss应用服务器是健壮的、高质量的，而且还具有良好的性能。 </p>
<p><strong>二、JBoss的发展</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为满足企业级市场日益增长的需求，JBoss公司从2003年开始就推出了24*7、专业级产品支持服务。同时，为拓展JBoss的企业级市场， JBoss公司还签订了许多渠道合作伙伴。在2004年6月，JBoss公司宣布，JBoss应用服务器通过了Sun公司的J2EE认证。 这是JBoss应用服务器发展史上至今为止最重要的里程碑。与此同时，JBoss一直在紧跟最新的J2EE规范， 而且在某些技术领域引领J2EE规范的开发。因此，无论在商业领域，还是在开源社区， JBoss成为了第一个通过J2EE 1.4认证的主流应用服务器。现在，JBoss应用服务器已经真正发展成具有企业强度（即，支持关键级任务的应用）的应用服务器。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 近年来，Hibernate已经成为了事实上的持久化引擎。JBoss公司致力于将自身发展成为开源项目的社区，最新版的JBoss应用服务器已经将Hibernate集成为JMXMBean服务。这使得用户能够在应用服务器环境中直接使用Hibernate，而不管它是否处于J2EE上下文中。在最新版的JBoss应用服务器中，用户能够直接通过JMXMBean服务访问到JBossCache提供的服务。下一代的JBoss应用服务器（暂定名为，JBoss5.0）将提供大量的新功能。除了支持最新的EJB 3.0规范外，新版的JBoss AOP将同它正式发布。同时，JBoss开发团队还计划开发新的微内核层，即独立于JMX，使得它能够独立使用。 </p>
<p><br />
<strong>三、JBoss的服务器架构概述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBoss的构架和其他J2EE应用服务器的构架有着巨大的不同。JBoss的模块架构是建立在JMX底层上的，下图展现了JBoss主要组件和JMX的联系。 </p>
<p align="center"><img src="http://java.chinaitlab.com/UploadFiles_8734/200706/20070615171106568.jpg" border="0"  alt="" /></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>JMX - 层次</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; JMX是一个可复用框架，它为远程(Remote)和本地(Local)管理工具扩展了应用。它的架构是层式架构。他们是实现层(instrumentation layer)、代理层(agent layer)和发布层(distribution layer)。其中，发布层还在等待未来的标准化。简要的表述是，用户使用管理Bean，MBean来提供获得相应资源的实现方法。实现层实现相关的特性资源并将它发布于JMX相关应用中，它的代理层控制和发布相应的注册在MBeanServer代理上的管理资源。 </p>
<p align="center"><img src="http://java.chinaitlab.com/UploadFiles_8734/200706/20070615171107439.jpg" border="0"  alt="" /></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>JBoss主要模块<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp; 主要的JBoss模块是在MeanServer上的可管理MBean。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1.JBoss EJB容器是JBoss服务器的核心实现。它有两个特性，第一是在运行期产生EJB 对象的Stub和Skeleton类，第二是支持热部署。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2.JBossNS是JBoss命名服务用来定位对象和资源。它实现了JNDI J2EE规范.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 3.JBossTX 是由JTA/JTS支持的交易管理控制. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 4.部署服务支持EJB(jar)、Web应用文档(war)和企业级应用文档(ears)的部署。它会时刻关心J2EE应用的URL情况，一旦它们被改变或出现的时候将自动部署。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 5.JBossMQ使Java 消息规范(JMS)的实现。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 6.JBossSX支持基于JAAS的或不支持JAAS机制的安全实现。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 7.JBossCX实现了部分JCA的功能。JCA制订了J2EE应用组件如何访问基于连接的资源。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 8.Web服务器支持Web容器和Servlet引擎。JBoss 2.4.x版本支持Tomcat 4.0.1，Tomcat 3.23和Jetty 3.x服务.</p>
<p><br />
<strong>四、JBoss架构设计中的两个重要的特性</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一是使用JMX作为一个软件总线垂直的贯穿其所有的服务，通过将新的服务组件遵循JMX规范挂接上"总线"，使得系统扩展现有的服务变得容易。可插入式框架被广泛的运用于服务的实现。开发者可以选择他们需要的服务并编写他们所需要的相应实现，通过定义在部署描述文件中，让JBoss服务器知道。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二是容器被设计成为动态代理机制，这样使容器的实现变得简单和使开发者避免费劲的将jar文件进行预编译以获得stub和skeleton代码。但是这样做潜在的问题是性能和可测性，因为我们知道java反射机制会引起性能的损失。JBoss中存在着相应的优化方案并且在将来的研究中我们会论述该优化方法在什么时候工作并且是如何工作的</p>
<br />
摘自：<font style="font-size: 12pt" color="#1e8dc5"><strong><a href="http://blog.chinaunix.net/u/19919/showart_346600.html" target="_blank"><font style="font-size: 12pt" color="#1e8dc5"><strong>厚积而薄发</strong></font></a></strong></font>
 <img src ="http://www.blogjava.net/site120/aggbug/158675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/site120/" target="_blank">姜利阳</a> 2007-11-06 22:34 <a href="http://www.blogjava.net/site120/archive/2007/11/06/158675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache2.2 配置负载均衡实例说明</title><link>http://www.blogjava.net/site120/archive/2007/11/02/157849.html</link><dc:creator>姜利阳</dc:creator><author>姜利阳</author><pubDate>Fri, 02 Nov 2007 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/site120/archive/2007/11/02/157849.html</guid><wfw:comment>http://www.blogjava.net/site120/comments/157849.html</wfw:comment><comments>http://www.blogjava.net/site120/archive/2007/11/02/157849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/site120/comments/commentRss/157849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/site120/services/trackbacks/157849.html</trackback:ping><description><![CDATA[<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">############################### </span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">修改过的</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">apache</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">动态加载模块</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">################</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial"># AddDefaultCharset gb2312</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">LoadModule proxy_module modules/mod_proxy.so</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">LoadModule proxy_ajp_module modules/mod_proxy_ajp.so</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">LoadModule proxy_balancer_module modules/mod_proxy_balancer.so</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">LoadModule proxy_http_module modules/mod_proxy_http.so</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">NameVirtualHost *:80</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#########################</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">如果没有匹配，</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">则默认系统选择第一个虚拟主机</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#####################################</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&lt;VirtualHost *:80&gt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyRequests Off</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerName localhost</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyPass / balancer://cluster1/</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyPass /&nbsp; balancer://cluster1 stickysession=jsessionid nofailover=On</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Proxy balancer://cluster1/&gt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BalancerMember ajp://site120:8009 route=Tomcat1 </span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BalancerMember ajp://localhost:20009 route=Tomcat2 </span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Proxy&gt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&lt;/VirtualHost&gt;</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&lt;VirtualHost *:80&gt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyRequests Off</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerName site120</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyPass / balancer://cluster1/</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProxyPass /&nbsp; balancer://cluster1 stickysession=jsessionid nofailover=On</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Proxy balancer://cluster1/&gt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BalancerMember ajp://site120:8009 route=Tomcat1 </span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BalancerMember ajp://localhost:20009 route=Tomcat2 </span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Proxy&gt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&lt;/VirtualHost&gt;</span></font></p>
 <img src ="http://www.blogjava.net/site120/aggbug/157849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/site120/" target="_blank">姜利阳</a> 2007-11-02 23:00 <a href="http://www.blogjava.net/site120/archive/2007/11/02/157849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网站提速] - 给Tomcat，Apache配置gzip压缩(HTTP压缩)功能</title><link>http://www.blogjava.net/site120/archive/2007/02/16/100073.html</link><dc:creator>姜利阳</dc:creator><author>姜利阳</author><pubDate>Fri, 16 Feb 2007 10:46:00 GMT</pubDate><guid>http://www.blogjava.net/site120/archive/2007/02/16/100073.html</guid><wfw:comment>http://www.blogjava.net/site120/comments/100073.html</wfw:comment><comments>http://www.blogjava.net/site120/archive/2007/02/16/100073.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/site120/comments/commentRss/100073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/site120/services/trackbacks/100073.html</trackback:ping><description><![CDATA[		<p>
				<strong>背景：<br /></strong>HTTP&#160;压缩可以大大提高浏览网站的速度，它的原理是，在客户端请求网页后，从服务器端将网页文件压缩，再下载到客户端，由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text&#160;，它可以节省40%左右的流量。更为重要的是，它可以对动态生成的，包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩，压缩效率惊人<br /><br /><strong>一，对于Tomcat5.0以后的版本是支持对输出内容进行压缩的.　使用的是gzip压缩格式</strong><br /><br />下面是tomcat5.5.20 中的$tomcat_home$/conf/server.xml的原内容</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">&#160;1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">Connector&#160;</span>
				<span style="COLOR: #ff0000">port</span>
				<span style="COLOR: #0000ff">="80"</span>
				<span style="COLOR: #ff0000">&#160;maxHttpHeaderSize</span>
				<span style="COLOR: #0000ff">="8192"</span>
				<span style="COLOR: #ff0000">
						<br />
				</span>
				<span style="COLOR: #008080">&#160;2</span>
				<span style="COLOR: #ff0000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;maxThreads</span>
				<span style="COLOR: #0000ff">="150"</span>
				<span style="COLOR: #ff0000">&#160;minSpareThreads</span>
				<span style="COLOR: #0000ff">="25"</span>
				<span style="COLOR: #ff0000">&#160;maxSpareThreads</span>
				<span style="COLOR: #0000ff">="75"</span>
				<span style="COLOR: #ff0000">
						<br />
				</span>
				<span style="COLOR: #008080">&#160;3</span>
				<span style="COLOR: #ff0000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;enableLookups</span>
				<span style="COLOR: #0000ff">="false"</span>
				<span style="COLOR: #ff0000">&#160;redirectPort</span>
				<span style="COLOR: #0000ff">="8443"</span>
				<span style="COLOR: #ff0000">&#160;acceptCount</span>
				<span style="COLOR: #0000ff">="100"</span>
				<span style="COLOR: #ff0000">
						<br />
				</span>
				<span style="COLOR: #008080">&#160;4</span>
				<span style="COLOR: #ff0000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;connectionTimeout</span>
				<span style="COLOR: #0000ff">="20000"</span>
				<span style="COLOR: #ff0000">&#160;disableUploadTimeout</span>
				<span style="COLOR: #0000ff">="true"</span>
				<span style="COLOR: #ff0000">&#160;URIEncoding</span>
				<span style="COLOR: #0000ff">="utf-8"</span>
				<span style="COLOR: #ff0000">&#160;</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">&#160;5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">&lt;!--</span>
				<span style="COLOR: #008000">&#160;Note&#160;:&#160;To&#160;disable&#160;connection&#160;timeouts,&#160;set&#160;connectionTimeout&#160;value<br /></span>
				<span style="COLOR: #008080">&#160;6</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;to&#160;0&#160;</span>
				<span style="COLOR: #008000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">&#160;7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;<br /></span>
				<span style="COLOR: #008080">&#160;8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">&lt;!--</span>
				<span style="COLOR: #008000">&#160;Note&#160;:&#160;To&#160;use&#160;gzip&#160;compression&#160;you&#160;could&#160;set&#160;the&#160;following&#160;properties&#160;:<br /></span>
				<span style="COLOR: #008080">&#160;9</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compression="on"&#160;<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compressionMinSize="2048"&#160;<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;noCompressionUserAgents="gozilla,&#160;traviata"&#160;<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compressableMimeType="text/html,text/xml"<br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">--&gt;</span>
		</div>从上面的<font color="#ff1493"><strong>第8行</strong></font>内容可以看出，要使用gzip压缩功能，你可以在Connector实例中加上如下属性即可<br />1) compression="on" 打开压缩功能<br />2) compressionMinSize="2048" 启用压缩的输出内容大小，这里面默认为2KB<br />3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器，不启用压缩&#160;<br />4) compressableMimeType="text/html,text/xml"　压缩类型<br /><br />我这里的配置内容为：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&#160;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">Connector&#160;</span><span style="COLOR: #ff0000">port</span><span style="COLOR: #0000ff">="80"</span><span style="COLOR: #ff0000">&#160;maxHttpHeaderSize</span><span style="COLOR: #0000ff">="8192"</span><span style="COLOR: #ff0000"><br /></span><span style="COLOR: #008080">&#160;2</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;maxThreads</span><span style="COLOR: #0000ff">="150"</span><span style="COLOR: #ff0000">&#160;minSpareThreads</span><span style="COLOR: #0000ff">="25"</span><span style="COLOR: #ff0000">&#160;maxSpareThreads</span><span style="COLOR: #0000ff">="75"</span><span style="COLOR: #ff0000"><br /></span><span style="COLOR: #008080">&#160;3</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;enableLookups</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #ff0000">&#160;redirectPort</span><span style="COLOR: #0000ff">="8443"</span><span style="COLOR: #ff0000">&#160;acceptCount</span><span style="COLOR: #0000ff">="100"</span><span style="COLOR: #ff0000"><br /></span><span style="COLOR: #008080">&#160;4</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;connectionTimeout</span><span style="COLOR: #0000ff">="20000"</span><span style="COLOR: #ff0000">&#160;disableUploadTimeout</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000">&#160;URIEncoding</span><span style="COLOR: #0000ff">="utf-8"</span><span style="COLOR: #ff0000"><br /></span><span style="COLOR: #008080">&#160;5</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compression</span><span style="COLOR: #0000ff">="on"</span><span style="COLOR: #ff0000">&#160;<br /></span><span style="COLOR: #008080">&#160;6</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compressionMinSize</span><span style="COLOR: #0000ff">="2048"</span><span style="COLOR: #ff0000">&#160;<br /></span><span style="COLOR: #008080">&#160;7</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;noCompressionUserAgents</span><span style="COLOR: #0000ff">="gozilla,&#160;traviata"</span><span style="COLOR: #ff0000">&#160;<br /></span><span style="COLOR: #008080">&#160;8</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compressableMimeType</span><span style="COLOR: #0000ff">="text/html,text/xml,text/javascript,text/css,text/plain"</span><span style="COLOR: #ff0000">&#160;&#160;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">&#160;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&#160;Note&#160;:&#160;To&#160;disable&#160;connection&#160;timeouts,&#160;set&#160;connectionTimeout&#160;value<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;to&#160;0&#160;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&#160;Note&#160;:&#160;To&#160;use&#160;gzip&#160;compression&#160;you&#160;could&#160;set&#160;the&#160;following&#160;properties&#160;:<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compression="on"&#160;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compressionMinSize="2048"&#160;<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;noCompressionUserAgents="gozilla,&#160;traviata"&#160;<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;compressableMimeType="text/html,text/xml"<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><strong>二，对于Apache而言，有两种情况<br />&#160;&#160;&#160;</strong>１）针对Apache2.0之前的版本，它原本是不支持的，不过可以通过添加第三方的module_gzip模块来启用<br />&#160;&#160;&#160;２）针对Apache2.0及之后的版本，Apache提供支持, 不过不叫gzip，而叫mod_deflate<br />下面就对Apache2.0及之后的版本作一个说明<br />1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#,<br />2) 添加LoadModule deflate_module modules/mod_deflate.so<br />3) 在VirtualHost中添加<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">Location&#160;</span><span style="COLOR: #ff0000">"/"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SetOutputFilter&#160;DEFLATE<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch&#160;^Mozilla/4&#160;gzip-only-text/html<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch&#160;^Mozilla/4\.0[678]&#160;no-gzip<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch&#160;\bMSIE&#160;!no-gzip&#160;!gzip-only-text/html<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SetEnvIfNoCase&#160;Request_URI&#160;\.(?:gif|jpe?g|png)$&#160;no-gzip&#160;dont-vary<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Header&#160;append&#160;Vary&#160;User-Agent&#160;env=!dont-vary<br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">Location</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />我这里面有一个完整的演示<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&#160;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#&#160;加载deflate模块<br /></span><span style="COLOR: #008080">&#160;2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LoadModule&#160;headers_module&#160;modules/mod_headers.so<br /></span><span style="COLOR: #008080">&#160;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LoadModule&#160;deflate_module&#160;modules/mod_deflate.so<br /></span><span style="COLOR: #008080">&#160;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">VirtualHost&#160;</span><span style="COLOR: #ff0000">*:80</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">&#160;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;DocumentRoot&#160;f:/apacheTest<br /></span><span style="COLOR: #008080">&#160;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">Location&#160;</span><span style="COLOR: #ff0000">"/"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">&#160;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SetOutputFilter&#160;DEFLATE<br /></span><span style="COLOR: #008080">&#160;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch&#160;^Mozilla/4&#160;gzip-only-text/html<br /></span><span style="COLOR: #008080">&#160;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch&#160;^Mozilla/4\.0[678]&#160;no-gzip<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch&#160;\bMSIE&#160;!no-gzip&#160;!gzip-only-text/html<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SetEnvIfNoCase&#160;Request_URI&#160;\.(?:gif|jpe?g|png)$&#160;no-gzip&#160;dont-vary<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Header&#160;append&#160;Vary&#160;User-Agent&#160;env=!dont-vary<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">Location</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">VirtualHost</span><span style="COLOR: #0000ff">&gt;</span></div><br /> <img src ="http://www.blogjava.net/site120/aggbug/100073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/site120/" target="_blank">姜利阳</a> 2007-02-16 18:46 <a href="http://www.blogjava.net/site120/archive/2007/02/16/100073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>