﻿<?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-Sung in Blog-文章分类-Ｔｏｍｃａｔ</title><link>http://www.blogjava.net/qq13367612/category/4134.html</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font class="subhead" size=3&gt;&lt;b&gt;一些技术文章 &amp; 一些生活杂碎&lt;/b&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:41:39 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:41:39 GMT</pubDate><ttl>60</ttl><item><title>Apache2.0.49  + Tomcat 5.0 连接配置</title><link>http://www.blogjava.net/qq13367612/articles/16099.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16099.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16099.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16099.html</trackback:ping><description><![CDATA[Apache + Tomcat 是一个常用的web组合，之所以采用这个方案，是为了扬长避短。Tomcat本身是既可以做web服务器，又可以做应用服务器的，但是它的web服务器比较弱，在性能和效率上都不好，主要表现在tomcat处理静态页面速度不快，健壮性不好，不支持CGI 脚本和API，perl,php等等。而apache可以弥补这些缺陷，Apache负责解析静态页面以及连接请求,Tomcat负责处理Servlet/Jsp.，这样各司其职，达到一个比较好的效果。<BR>下面是具体的配置方法<BR>1． 安装jdk1.4以上版本<BR>2． 安装Apache2.0.49<BR>3． 安装Tomcat 5.0<BR>4． 下载apache-tomcat连接器，现在最新的是jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip,解压后可得到名为mod_jk2.so的文件，将其放入%APACHE_HOME%/modules中即可。下载地址为<IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://www.apache.org/dist/jakarta/tomcat-connectors/jk2/binaries/win32/jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip" target=_blank><U>http://www.apache.org/dist/jakarta/tomcat-connectors/jk2/binaries/win32/jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip</U></A> <BR>5． 配置%TOMCAT_HOME%/conf/jk2.properties<BR>这里使用的是普通socket(normal socket)<BR># Define the communication channel<BR> [channel.socket:localhost:8009]<BR> info=Ajp13 forwarding over socket<BR> tomcatId=localhost:8009<BR> # Map All webapp to the Web server uri space<BR> [uri:/*]<BR> info=Map the whole webapp<BR>6． 配置%APACHE_HOME%/conf/workers2.properties<BR>因为jk2.properties中使用的是普通模式，这里也应该是普通模式<BR>[shm]<BR>file=${serverRoot}/logs/shm.file<BR>size=1048576<BR><BR># Example socket channel, override port and host.<BR>[channel.socket:localhost:8009]<BR>port=8009<BR>host=127.0.0.1<BR><BR># define the worker<BR>[ajp13:localhost:8009]<BR>channel=channel.socket:localhost:8009<BR><BR># Uri mapping<BR>[uri:/*]<BR>worker=ajp13:localhost:8009<BR><BR>注：# Uri mapping是映射到tomcat上的路径信息，也就是当一个请求到来的时候，什么情况下让tomcat来处理，现在配置的是/*,意思是全部匹配，如果是/Examples/*，tomcat只处理<IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://host/Examples/*这样的请求了。jk2.properties和workers2.properties的Uri" target=_blank><U>http://host:80/Examples/*这样的请求了。jk2.properties和workers2.properties的Uri</U></A>  mapping必须一致。<BR><BR>7． 配置%APACHE_HOME%/conf/httpd.conf<BR>在文件最后加上如下一段<BR>LoadModule    jk2_module modules/mod_jk2.so<BR>        ServerAdmin   <A href="mailto:fat3rd@sina.com">fat3rd@sina.com</A><BR>        DocumentRoot  "C:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/ROOT"<BR>        ServerName    fat3rd<BR>对上面解释一下，LoadModule    jk2_module modules/mod_jk2.so是要apache load我们下载的这个连接器模块。<BR>ServerAdmin    <A href="mailto:fat3rd@sina.com">fat3rd@sina.com</A> 是指这个服务器的管理者，当服务器出现异常的时候，会在异常页面上显示此信息，让用户可以联系管理者<BR>DocumentRoot  "C:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/ROOT"<BR>是指apache对应的应用程序根目录，我们把它映射到了tomcat的根目录。<BR>ServerName    fat3rd  ServerName是本机的机器名<BR><BR>8． 当改变了apache的配置的时候，需要重新启动apache<BR>9． 当你输入<IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://localhost:8080能看到tomcat的首页，输入http://localhost也可以看到tomcat的首页的时候，那么整合就成功了" target=_blank><U>http://localhost:8080能看到tomcat的首页，输入http://localhost也可以看到tomcat的首页的时候，那么整合就成功了</U></A> <BR><![CDATA[Apache + Tomcat 是一个常用的web组合，之所以采用这个方案，是为了扬长避短。Tomcat本身是既可以做web服务器，又可以做应用服务器的，但是它的web服务器比较弱，在性能和效率上都不好，主要表现在tomcat处理静态页面速度不快，健壮性不好，不支持CGI 脚本和API，perl,php等等。而apache可以弥补这些缺陷，Apache负责解析静态页面以及连接请求,Tomcat负责处理Servlet/Jsp.，这样各司其职，达到一个比较好的效果。<BR>下面是具体的配置方法<BR>1． 安装jdk1.4以上版本<BR>2． 安装Apache2.0.49<BR>3． 安装Tomcat 5.0<BR>4． 下载apache-tomcat连接器，现在最新的是jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip,解压后可得到名为mod_jk2.so的文件，将其放入%APACHE_HOME%/modules中即可。下载地址为<IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://www.apache.org/dist/jakarta/tomcat-connectors/jk2/binaries/win32/jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip" target=_blank><U>http://www.apache.org/dist/jakarta/tomcat-connectors/jk2/binaries/win32/jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip</U></A> <BR>5． 配置%TOMCAT_HOME%/conf/jk2.properties<BR>这里使用的是普通socket(normal socket)<BR># Define the communication channel<BR> [channel.socket:localhost:8009]<BR> info=Ajp13 forwarding over socket<BR> tomcatId=localhost:8009<BR> # Map All webapp to the Web server uri space<BR> [uri:/*]<BR> info=Map the whole webapp<BR>6． 配置%APACHE_HOME%/conf/workers2.properties<BR>因为jk2.properties中使用的是普通模式，这里也应该是普通模式<BR>[shm]<BR>file=${serverRoot}/logs/shm.file<BR>size=1048576<BR><BR># Example socket channel, override port and host.<BR>[channel.socket:localhost:8009]<BR>port=8009<BR>host=127.0.0.1<BR><BR># define the worker<BR>[ajp13:localhost:8009]<BR>channel=channel.socket:localhost:8009<BR><BR># Uri mapping<BR>[uri:/*]<BR>worker=ajp13:localhost:8009<BR><BR>注：# Uri mapping是映射到tomcat上的路径信息，也就是当一个请求到来的时候，什么情况下让tomcat来处理，现在配置的是/*,意思是全部匹配，如果是/Examples/*，tomcat只处理<IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://host/Examples/*这样的请求了。jk2.properties和workers2.properties的Uri" target=_blank><U>http://host:80/Examples/*这样的请求了。jk2.properties和workers2.properties的Uri</U></A>  mapping必须一致。<BR><BR>7． 配置%APACHE_HOME%/conf/httpd.conf<BR>在文件最后加上如下一段<BR>LoadModule    jk2_module modules/mod_jk2.so<BR>        ServerAdmin   <A href="mailto:fat3rd@sina.com">fat3rd@sina.com</A><BR>        DocumentRoot  "C:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/ROOT"<BR>        ServerName    fat3rd<BR>对上面解释一下，LoadModule    jk2_module modules/mod_jk2.so是要apache load我们下载的这个连接器模块。<BR>ServerAdmin    <A href="mailto:fat3rd@sina.com">fat3rd@sina.com</A> 是指这个服务器的管理者，当服务器出现异常的时候，会在异常页面上显示此信息，让用户可以联系管理者<BR>DocumentRoot  "C:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/ROOT"<BR>是指apache对应的应用程序根目录，我们把它映射到了tomcat的根目录。<BR>ServerName    fat3rd  ServerName是本机的机器名<BR><BR>8． 当改变了apache的配置的时候，需要重新启动apache<BR>9． 当你输入<IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0><A href="http://localhost:8080能看到tomcat的首页，输入http://localhost也可以看到tomcat的首页的时候，那么整合就成功了" target=_blank><U>http://localhost:8080能看到tomcat的首页，输入http://localhost也可以看到tomcat的首页的时候，那么整合就成功了</U></A> <BR>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 23:50 <a href="http://www.blogjava.net/qq13367612/articles/16099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 5.0 与 5.5 配置Web App连接池绑定到JNDI</title><link>http://www.blogjava.net/qq13367612/articles/16100.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16100.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16100.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16100.html</trackback:ping><description><![CDATA[为Tomcat和Hibernate配置数据库连接。Tomcat负责提供JDBC连接池，Hibernate通过JNDI来请求这些连接, Tomcat把连接池绑定到JNDI。
<P>      在Tomcat的主配置文件,TOMCAT/conf/server.xml中增加一个数据库JDBC连接池的资源声明, 按照Hibernate2.1的开发手册配置:</P>
<P><STRONG>在5.0版本下的配置:</STRONG></P>
<P>    <Context path="/myhibernate" docBase="myhibernate"> <BR>    <Resource name="jdbc/myhibernate" scope="Shareable" type="javax.sql.DataSource"/> <BR>    <ResourceParams name="jdbc/myhibernate"> <BR>     <parameter> <BR>      <name>factory</name> <BR>      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> <BR>     </parameter> </P>
<P>     <!-- DBCP database connection settings --> <BR>      ...</P>
<P>     ... </P>
<P>     <!-- DBCP connection pooling options --> <BR>     ...</P>
<P>     ...</P>
<P>    </ResourceParams> <BR>   </Context></P>
<P><STRONG>在5.5版本下的配置:</STRONG></P>
<P><Context path="/myhibernate" docBase="myhibernate"> <BR>  <Resource name="jdbc/myhibernate" <BR>                 auth="Container" type="javax.sql.DataSource" <BR>                 maxActive="100" <BR>                 maxIdle="30" <BR>                 maxWait="10000" <BR>                 username="root" <BR>                 password=""<BR>                 driverClassName="org.gjt.mm.mysql.Driver" <BR>                 url="jdbc:mysql://localhost:3306/myhibernate"/> <BR>  </Context></P>
<P>来使用绑定到JNDI的连接池中提供的连接。我们使用XML格式的Hibernate配置。<BR>XML配置文件放在上下文类路径(WEB-INF/classes)下面，称为hibernate.cfg.xml: </P>
<P><hibernate-configuration><BR>    <session-factory><BR>      <property name="connection.datasource">java:comp/env/jdbc/myhibernate</property><BR>      <property name="show_sql">false</property><BR>      <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property><BR>      <!-- Mapping files --><BR>      <mapping resource="org/site/bean/Member.hbm.xml"/><BR>    </session-factory><BR></hibernate-configuration></P><![CDATA[为Tomcat和Hibernate配置数据库连接。Tomcat负责提供JDBC连接池，Hibernate通过JNDI来请求这些连接, Tomcat把连接池绑定到JNDI。
<P>      在Tomcat的主配置文件,TOMCAT/conf/server.xml中增加一个数据库JDBC连接池的资源声明, 按照Hibernate2.1的开发手册配置:</P>
<P><STRONG>在5.0版本下的配置:</STRONG></P>
<P>    <Context path="/myhibernate" docBase="myhibernate"> <BR>    <Resource name="jdbc/myhibernate" scope="Shareable" type="javax.sql.DataSource"/> <BR>    <ResourceParams name="jdbc/myhibernate"> <BR>     <parameter> <BR>      <name>factory</name> <BR>      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> <BR>     </parameter> </P>
<P>     <!-- DBCP database connection settings --> <BR>      ...</P>
<P>     ... </P>
<P>     <!-- DBCP connection pooling options --> <BR>     ...</P>
<P>     ...</P>
<P>    </ResourceParams> <BR>   </Context></P>
<P><STRONG>在5.5版本下的配置:</STRONG></P>
<P><Context path="/myhibernate" docBase="myhibernate"> <BR>  <Resource name="jdbc/myhibernate" <BR>                 auth="Container" type="javax.sql.DataSource" <BR>                 maxActive="100" <BR>                 maxIdle="30" <BR>                 maxWait="10000" <BR>                 username="root" <BR>                 password=""<BR>                 driverClassName="org.gjt.mm.mysql.Driver" <BR>                 url="jdbc:mysql://localhost:3306/myhibernate"/> <BR>  </Context></P>
<P>来使用绑定到JNDI的连接池中提供的连接。我们使用XML格式的Hibernate配置。<BR>XML配置文件放在上下文类路径(WEB-INF/classes)下面，称为hibernate.cfg.xml: </P>
<P><hibernate-configuration><BR>    <session-factory><BR>      <property name="connection.datasource">java:comp/env/jdbc/myhibernate</property><BR>      <property name="show_sql">false</property><BR>      <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property><BR>      <!-- Mapping files --><BR>      <mapping resource="org/site/bean/Member.hbm.xml"/><BR>    </session-factory><BR></hibernate-configuration></P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 23:45 <a href="http://www.blogjava.net/qq13367612/articles/16100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 5.0 安装和配置记录</title><link>http://www.blogjava.net/qq13367612/articles/16101.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16101.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16101.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16101.html</trackback:ping><description><![CDATA[本文档描述了如何在Windows下安装、配置和运行Apache Jakarta Tomcat服务器。在Linux下要做的工作和下面类似。Apache Jakarta Tomcat的项目主页是：http://jakarta.apache.org/tomcat <BR><BR>Tomcat Installation<BR><BR>从http://jakarta.apache.org/tomcat下载Apache Jakarta Tomcat 5.0.18的zip压缩包 <BR>解压缩到某个目录中，比如D:\app\jakarta-tomcat-5.0.18 <BR>设置环境变量%CATALINA_HOME%为：D:\app\jakarta-tomcat-5.0.18 <BR>进入命令行模式并用以下命令启动Tomcat： <BR>%CATALINA_HOME%\bin\startup.bat<BR>如果在控制台看见信息：Server startup in xxxxx ms，则说明Tomcat已经被启动，它将在端口8080（默认端口）侦听客户请求。 <BR>测试：打开浏览器并访问http://localhost:8080/，如果可以看见Tomcat的首页，那么一切正常。 <BR>进入命令行模式并用以下命令关闭Tomcat： <BR>%CATALINA_HOME%\bin\shutdown.bat<BR><BR>Tomcat Directory Layout<BR>Tomcat的目录结构如下： Directory Explanation <BR>bin 存放启动和关闭Tomcat的可执行脚本 <BR>conf Tomcat的配置文件，如server.xml（Tomcat服务器配置文件）和web.xml（被所有webapps共享的配置文件） <BR>work 存放jsp编译后产生的class文件 <BR>webapps 存放web applications，用户自己需要部署的应用程序也要放到此目录 <BR>logs 存放日志文件 <BR>common 被Tomcat Server本身和所有的web applications共享的库文件（*.jar），如servlet的API就存放在common/lib/servlet-api.jar中 <BR>shared 被所有的web applications（但不被Tomcat Server本身）共享的库文件（*.jar） <BR><BR><BR>Tomcat Components<BR><BR>Server : Tomcat Server是整个Catalina JSP/Servlet容器，它是一个单件（Sinleton）。 <BR>Service : Service是这样一个集合：它由一个或者多个Connector组成，并拥有一个负责处理所有Connector所获得的客户请求的Engine。 <BR>Connector : 一个Connector将在某个指定端口上侦听客户请求，并将获得的请求交给Engine来处理，从Engine处获得回应并返回客户。Tomcat有两个典型的Connector，一个直接侦听来自web浏览器的HTTP请求，一个侦听来自其它WebServer的请求： <BR>Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求。 <BR>Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求。 <BR>Engine : Engine是某个service中的请求处理机，它负责接收和处理来自Connector的请求。Engine下可以配置多个虚拟主机（Virtual Host），每个虚拟主机都有一个域名。当Engine获得一个请求时，它将根据请求中的信息把该请求匹配到某个Host上，然后在该Host配置的环境下处理该请求。Engine有一个默认虚拟主机，当请求无法匹配到任何一个Host上的时候，将交给该默认虚拟主机来处理。 <BR>Host : 一个Host代表一个虚拟主机（Virtual Host），每个虚拟主机和某个域名（Domain Name）相匹配。每个虚拟主机下都可以部署（deploy）一个或者多个web applications，每个web application对应于一个Context，并拥有一个Context path。当Host获得一个针对某个特定的Host的请求时，将在该Host的环境下把请求匹配到某个Context上，然后把请求交给该Context来处理。Context的匹配方法是“最长匹配”，所以一个 path="" 的Context将成为该Host的默认Context，所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。 <BR>Context : 一个Context对应于一个web application，一个web application由一个或者多个Servlet组成。每个Context在创建的时候都将根据配置文件conf/web.xml和webapps/${webapp.home}/WEB-INF/web.xml载入Servlet类和创建映射表（mapping table）。当Context获得请求时，将在自己的映射表中寻找相匹配的Servlet类。如果找到，则执行该类，获得结果并返回。 <BR><BR>Tomcat Server的结构图如下。注意下图只是根据conf/server.xml配置文件画出的结构图，并不保证该图与Tomcat的实现相吻合。<BR><BR><BR>Server Configuration<BR>用户可以通过修改conf/server.xml文件定置Tomcat Server的行为。该文件的描述如下： element attribute explanation <BR>Server port 指定一个端口，这个端口负责监听关闭Tomcat的请求 <BR>shutdown 向以上端口发送的关闭服务器的命令字符串 <BR>Service name service的名称 <BR>Connector port 服务器连接器的端口号，该连接器将在指定端口侦听来自客户端的请求 <BR>minProcessors 服务器启动时创建的处理请求的线程数，每个请求由一个线程负责 <BR>maxProcessors 最多可以创建的处理请求的线程数 <BR>enableLookups 如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名；若为false则不进行DNS查询，而是返回其ip地址 <BR>redirectPort 服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 <BR>acceptCount 当所有可以使用的处理请求的线程都被用光时，可以放到处理队列中的请求数，超过这个数的请求将不予处理，而返回Connection refused错误 <BR>connectionTimeout 等待超时的时间数（以毫秒为单位） <BR>Engine defaultHost 缺省的处理请求的虚拟主机名，它至少与其中的一个Host元素的name属性值是一样的 <BR>Host name 虚拟主机名 <BR>appBase web applications的基本目录 <BR>unpackWARs 如果为true，则tomcat会自动将WAR文件解压；否则不解压，直接从WAR文件中运行应用程序 <BR>Context docBase web application的文件存放路径或者是WAR文件存放路径 <BR>path 表示此web application的URL的前缀，用来匹配一个Context。请求的URL形式为http://localhost:8080/path/* <BR>reloadable 如果为true，则Tomcat将支持热部署，会自动检测web application的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的JSP和Servlet，我们可以在不重起Tomcat的情况下改变web application <BR>注：还有一些元素没有介绍，如Logger，Realm，Valve等，是因为暂时我还没有用到这些元素。你可以通过Tomcat的文档获取这些元素的信息。 <BR><BR>Web Application Configuration<BR>每个web application对应于某个虚拟主机（Host）下的某个Context。一个web application是若干个HTML，JSP和Servlet文件的集合。当一个web application被初始化的时候，它将用自己的ClassLoader载入“部署配置文件” web.xml 中定义的每个Servlet类和映射表。它首先载入在conf/web.xml中定义的Servlet类和映射表，然后载入位于 webapps/${docBase}/WEB-INF/web.xml 下的自己的部署配置文件中定义的servlet类和映射表。 <BR><BR>web.xml文件有两部分：Servlet类定义和映射表定义。每个被载入的Servlet类都有一个名字（不是类名），该名字被填入Context的映射表（mapping table）中，并和某种形式的URL pattern相联系。当某个URL被请求时，将先寻找对应的Host，然后匹配最长的Context，然后查询该Context下的mapping table，找到被请求的Servlet类，并执行之。 <BR><BR>分析一下web.xml文件的结构： element sub-element explanation <BR>servlet servlet-name Servlet名字（不是类名，只是一个标识符） <BR>servlet-class Servlet的类名（全称，包括包名，该名用来定位一个Servlet类） <BR>init-param Servlet的初始化参数，每个参数用一个名值对表示：param-name = param-value <BR>servlet-mapping servlet-name Servlet名字，和servlet中的servlet-name相对应 <BR>url-pattern URL匹配模式，当请求该模式的URL时，指定Servlet将被调用 <BR><BR><BR>分析一下conf/web.xml文件，该文件被所有的web applications共享，其中定义的Servlet类和映射表将被所有的web application载入。 servlet-name url-pattern function <BR>default / 由于对URL进行最长匹配，所以url-pattern为/的该Servlet将在用户的HTTP请求无法匹配任何一个Servlet的时候被调用。该Servlet将返回用户一条错误信息。 <BR>invoker /servlet/* 形式为/servlet/FullClassName的URL会和invoker匹配，invoker将根据FullClassName调用${webapp.home}/WEB-INF/classes/FullClassName类，即使该类没有在${webapp.home}/WEB-INF/web.xml中被声明。注意FullClassName必须包含用点分隔的包的全称。 <BR>jsp *.jsp, *.jspx 当请求的是一个JSP页面的时候（*.jsp），该Servlet被调用。它实质上是一个JSP编译器，将请求的JSP页面映射成相应的Servlet在执行。当该JSP页面还没有编译的时候，jsp还将完成编译工作。 <BR><BR><BR>How Tomcat is Dealing with an HTTP Request<BR>假设来自客户的HTTP请求为：http://localhost:8080/yourContext/yourJSPPage.jsp <BR><BR>请求被发送到本机端口8080，被在那里侦听的Coyote HTTP/1.1 Connector获得 <BR>Connector把该请求交给它所在的Service的Engine来处理，并等待来自Engine的回应 <BR>Engine获得请求localhost/yourContext/yourJSPPage.jsp，匹配它所拥有的所有虚拟主机Host <BR>Engine匹配到名为localhost的Host（即使匹配不到也把请求交给该Host处理，因为该Host被定义为该Engine的默认主机） <BR>localhost Host获得请求/yourContext/yourJSPPage.jsp，匹配它所拥有的所有Context（最长匹配） <BR>Host匹配到路径为/yourContext的Context（如果匹配不到就把该请求交给路径名为""的Context去处理） <BR>path="/yourContext"的Context获得请求/yourJSPPage.jsp，在它的mapping table中寻找对应的Servlet <BR>Context匹配到URL pattern为*.jsp的Servlet，对应于JspServlet类 <BR>构造HttpServletRequest对象和HttpServletResponse对象，作为参数调用JspServlet的doGet或doPost方法（调用什么方法取决于来自客户的HTTP请求是GET请求还是POST请求） <BR>Context把执行完了之后的HttpServletResponse对象返回给Host <BR>Host把HttpServletResponse对象返回给Engine <BR>Engine把HttpServletResponse对象返回给Connector <BR>Connector把HttpServletResponse对象返回给客户的web浏览器 <BR><BR>Tomcat Web Application Manager<BR>通过以下方法可以为自己设置一个manager的权限，用来管理web applications，而不用手工修改配置文件。 <BR><BR>修改conf/tomcat-user.xml文件，在相应位置加入以下行： <BR><user name="heavyz" password="heavyz" roles="standard,manager"/><BR>打开Tomcat首页：http://localhost:8080/，进入Administration / Tomcat Manager <BR>Tomcat使用的应该是基于角色（role）的安全管理，在这方面我涉猎不深，有待进一步研究。<![CDATA[本文档描述了如何在Windows下安装、配置和运行Apache Jakarta Tomcat服务器。在Linux下要做的工作和下面类似。Apache Jakarta Tomcat的项目主页是：http://jakarta.apache.org/tomcat <BR><BR>Tomcat Installation<BR><BR>从http://jakarta.apache.org/tomcat下载Apache Jakarta Tomcat 5.0.18的zip压缩包 <BR>解压缩到某个目录中，比如D:\app\jakarta-tomcat-5.0.18 <BR>设置环境变量%CATALINA_HOME%为：D:\app\jakarta-tomcat-5.0.18 <BR>进入命令行模式并用以下命令启动Tomcat： <BR>%CATALINA_HOME%\bin\startup.bat<BR>如果在控制台看见信息：Server startup in xxxxx ms，则说明Tomcat已经被启动，它将在端口8080（默认端口）侦听客户请求。 <BR>测试：打开浏览器并访问http://localhost:8080/，如果可以看见Tomcat的首页，那么一切正常。 <BR>进入命令行模式并用以下命令关闭Tomcat： <BR>%CATALINA_HOME%\bin\shutdown.bat<BR><BR>Tomcat Directory Layout<BR>Tomcat的目录结构如下： Directory Explanation <BR>bin 存放启动和关闭Tomcat的可执行脚本 <BR>conf Tomcat的配置文件，如server.xml（Tomcat服务器配置文件）和web.xml（被所有webapps共享的配置文件） <BR>work 存放jsp编译后产生的class文件 <BR>webapps 存放web applications，用户自己需要部署的应用程序也要放到此目录 <BR>logs 存放日志文件 <BR>common 被Tomcat Server本身和所有的web applications共享的库文件（*.jar），如servlet的API就存放在common/lib/servlet-api.jar中 <BR>shared 被所有的web applications（但不被Tomcat Server本身）共享的库文件（*.jar） <BR><BR><BR>Tomcat Components<BR><BR>Server : Tomcat Server是整个Catalina JSP/Servlet容器，它是一个单件（Sinleton）。 <BR>Service : Service是这样一个集合：它由一个或者多个Connector组成，并拥有一个负责处理所有Connector所获得的客户请求的Engine。 <BR>Connector : 一个Connector将在某个指定端口上侦听客户请求，并将获得的请求交给Engine来处理，从Engine处获得回应并返回客户。Tomcat有两个典型的Connector，一个直接侦听来自web浏览器的HTTP请求，一个侦听来自其它WebServer的请求： <BR>Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求。 <BR>Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求。 <BR>Engine : Engine是某个service中的请求处理机，它负责接收和处理来自Connector的请求。Engine下可以配置多个虚拟主机（Virtual Host），每个虚拟主机都有一个域名。当Engine获得一个请求时，它将根据请求中的信息把该请求匹配到某个Host上，然后在该Host配置的环境下处理该请求。Engine有一个默认虚拟主机，当请求无法匹配到任何一个Host上的时候，将交给该默认虚拟主机来处理。 <BR>Host : 一个Host代表一个虚拟主机（Virtual Host），每个虚拟主机和某个域名（Domain Name）相匹配。每个虚拟主机下都可以部署（deploy）一个或者多个web applications，每个web application对应于一个Context，并拥有一个Context path。当Host获得一个针对某个特定的Host的请求时，将在该Host的环境下把请求匹配到某个Context上，然后把请求交给该Context来处理。Context的匹配方法是“最长匹配”，所以一个 path="" 的Context将成为该Host的默认Context，所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。 <BR>Context : 一个Context对应于一个web application，一个web application由一个或者多个Servlet组成。每个Context在创建的时候都将根据配置文件conf/web.xml和webapps/${webapp.home}/WEB-INF/web.xml载入Servlet类和创建映射表（mapping table）。当Context获得请求时，将在自己的映射表中寻找相匹配的Servlet类。如果找到，则执行该类，获得结果并返回。 <BR><BR>Tomcat Server的结构图如下。注意下图只是根据conf/server.xml配置文件画出的结构图，并不保证该图与Tomcat的实现相吻合。<BR><BR><BR>Server Configuration<BR>用户可以通过修改conf/server.xml文件定置Tomcat Server的行为。该文件的描述如下： element attribute explanation <BR>Server port 指定一个端口，这个端口负责监听关闭Tomcat的请求 <BR>shutdown 向以上端口发送的关闭服务器的命令字符串 <BR>Service name service的名称 <BR>Connector port 服务器连接器的端口号，该连接器将在指定端口侦听来自客户端的请求 <BR>minProcessors 服务器启动时创建的处理请求的线程数，每个请求由一个线程负责 <BR>maxProcessors 最多可以创建的处理请求的线程数 <BR>enableLookups 如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名；若为false则不进行DNS查询，而是返回其ip地址 <BR>redirectPort 服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 <BR>acceptCount 当所有可以使用的处理请求的线程都被用光时，可以放到处理队列中的请求数，超过这个数的请求将不予处理，而返回Connection refused错误 <BR>connectionTimeout 等待超时的时间数（以毫秒为单位） <BR>Engine defaultHost 缺省的处理请求的虚拟主机名，它至少与其中的一个Host元素的name属性值是一样的 <BR>Host name 虚拟主机名 <BR>appBase web applications的基本目录 <BR>unpackWARs 如果为true，则tomcat会自动将WAR文件解压；否则不解压，直接从WAR文件中运行应用程序 <BR>Context docBase web application的文件存放路径或者是WAR文件存放路径 <BR>path 表示此web application的URL的前缀，用来匹配一个Context。请求的URL形式为http://localhost:8080/path/* <BR>reloadable 如果为true，则Tomcat将支持热部署，会自动检测web application的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的JSP和Servlet，我们可以在不重起Tomcat的情况下改变web application <BR>注：还有一些元素没有介绍，如Logger，Realm，Valve等，是因为暂时我还没有用到这些元素。你可以通过Tomcat的文档获取这些元素的信息。 <BR><BR>Web Application Configuration<BR>每个web application对应于某个虚拟主机（Host）下的某个Context。一个web application是若干个HTML，JSP和Servlet文件的集合。当一个web application被初始化的时候，它将用自己的ClassLoader载入“部署配置文件” web.xml 中定义的每个Servlet类和映射表。它首先载入在conf/web.xml中定义的Servlet类和映射表，然后载入位于 webapps/${docBase}/WEB-INF/web.xml 下的自己的部署配置文件中定义的servlet类和映射表。 <BR><BR>web.xml文件有两部分：Servlet类定义和映射表定义。每个被载入的Servlet类都有一个名字（不是类名），该名字被填入Context的映射表（mapping table）中，并和某种形式的URL pattern相联系。当某个URL被请求时，将先寻找对应的Host，然后匹配最长的Context，然后查询该Context下的mapping table，找到被请求的Servlet类，并执行之。 <BR><BR>分析一下web.xml文件的结构： element sub-element explanation <BR>servlet servlet-name Servlet名字（不是类名，只是一个标识符） <BR>servlet-class Servlet的类名（全称，包括包名，该名用来定位一个Servlet类） <BR>init-param Servlet的初始化参数，每个参数用一个名值对表示：param-name = param-value <BR>servlet-mapping servlet-name Servlet名字，和servlet中的servlet-name相对应 <BR>url-pattern URL匹配模式，当请求该模式的URL时，指定Servlet将被调用 <BR><BR><BR>分析一下conf/web.xml文件，该文件被所有的web applications共享，其中定义的Servlet类和映射表将被所有的web application载入。 servlet-name url-pattern function <BR>default / 由于对URL进行最长匹配，所以url-pattern为/的该Servlet将在用户的HTTP请求无法匹配任何一个Servlet的时候被调用。该Servlet将返回用户一条错误信息。 <BR>invoker /servlet/* 形式为/servlet/FullClassName的URL会和invoker匹配，invoker将根据FullClassName调用${webapp.home}/WEB-INF/classes/FullClassName类，即使该类没有在${webapp.home}/WEB-INF/web.xml中被声明。注意FullClassName必须包含用点分隔的包的全称。 <BR>jsp *.jsp, *.jspx 当请求的是一个JSP页面的时候（*.jsp），该Servlet被调用。它实质上是一个JSP编译器，将请求的JSP页面映射成相应的Servlet在执行。当该JSP页面还没有编译的时候，jsp还将完成编译工作。 <BR><BR><BR>How Tomcat is Dealing with an HTTP Request<BR>假设来自客户的HTTP请求为：http://localhost:8080/yourContext/yourJSPPage.jsp <BR><BR>请求被发送到本机端口8080，被在那里侦听的Coyote HTTP/1.1 Connector获得 <BR>Connector把该请求交给它所在的Service的Engine来处理，并等待来自Engine的回应 <BR>Engine获得请求localhost/yourContext/yourJSPPage.jsp，匹配它所拥有的所有虚拟主机Host <BR>Engine匹配到名为localhost的Host（即使匹配不到也把请求交给该Host处理，因为该Host被定义为该Engine的默认主机） <BR>localhost Host获得请求/yourContext/yourJSPPage.jsp，匹配它所拥有的所有Context（最长匹配） <BR>Host匹配到路径为/yourContext的Context（如果匹配不到就把该请求交给路径名为""的Context去处理） <BR>path="/yourContext"的Context获得请求/yourJSPPage.jsp，在它的mapping table中寻找对应的Servlet <BR>Context匹配到URL pattern为*.jsp的Servlet，对应于JspServlet类 <BR>构造HttpServletRequest对象和HttpServletResponse对象，作为参数调用JspServlet的doGet或doPost方法（调用什么方法取决于来自客户的HTTP请求是GET请求还是POST请求） <BR>Context把执行完了之后的HttpServletResponse对象返回给Host <BR>Host把HttpServletResponse对象返回给Engine <BR>Engine把HttpServletResponse对象返回给Connector <BR>Connector把HttpServletResponse对象返回给客户的web浏览器 <BR><BR>Tomcat Web Application Manager<BR>通过以下方法可以为自己设置一个manager的权限，用来管理web applications，而不用手工修改配置文件。 <BR><BR>修改conf/tomcat-user.xml文件，在相应位置加入以下行： <BR><user name="heavyz" password="heavyz" roles="standard,manager"/><BR>打开Tomcat首页：http://localhost:8080/，进入Administration / Tomcat Manager <BR>Tomcat使用的应该是基于角色（role）的安全管理，在这方面我涉猎不深，有待进一步研究。]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 23:35 <a href="http://www.blogjava.net/qq13367612/articles/16101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 5.0 + apache 2.0 完全安装</title><link>http://www.blogjava.net/qq13367612/articles/16102.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16102.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16102.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16102.html</trackback:ping><description><![CDATA[<P>服务器环境:</P>
<P>RedHat Linux 8.0<BR>J2sdk1.4.1_02<BR>Tomcat 4.1.12 binary<BR>Apache 2.0.47 built from source<BR>jk2 connector source from jakarta.apache.org</P>
<P><BR>安装JDK:</P>
<P>下载: j2sdk-1_4_1_02-linux-i586.bin<BR>把jdk 安装在/usr/local/j2sdk1.4.1_02<BR>在/usr/local 下建立 软连接 jdk<BR>#ln -s /usr/local/j2sdk1.4.1_02 /usr/local/jdk</P>
<P>[user@host]# cat /etc/profile.d/java.sh<BR># set java environment<BR>export JAVA_HOME=/usr/local/jdk<BR>export PATH=$PATH:$JAVA_HOME/bin<BR>export CLASSPATH=$JAVA_HOME/lib</P>
<P>#更改shell文件属性:<BR>#chmod 755 /etc/profile.d/java.sh</P>
<P>#查看是否正确<BR>#which java<BR>/usr/local/jdk/bin/java</P>
<P><BR>安装apache :</P>
<P>#cd /usr/local/src/<BR>#tar -xzvf httpd-2.0.47.tar.gz<BR>#cd httpd-2.0.47<BR>#配置apache 支持动态module 加载<BR>#./configure<BR>"--with-layout=Apache"<BR>"--prefix=/usr/local/apache"<BR>"--enable-module=so"<BR>"--enable-module=setenvif"<BR>"--enable-module=rewrite"<BR>"--with-mpm=prefork"</P>
<P>#make<BR>#make install</P>
<P>#修改http.conf 具体的修改请参考apache2.0文档<BR># 或者查看 <A href="http://www.cnfug.org/journal/3/02.html">http://www.cnfug.org/journal/3/02.html</A></P>
<P>StartServers 10<BR>MinSpareServers 25<BR>MaxSpareServers 50<BR>ServerLimit 2000<BR>MaxClients 1500 #Apache可以同时处理的请求<BR>MaxRequestsPerChild 10000</P>
<P>安装Php :<BR>下载: php-4.3.3.tar.gz<BR>#cd /usr/local/src<BR>#tar -xzvf</P>
<P>#php for apache 以apache modules的方式运行<BR>./configure --with-apxs2=/usr/local/apache/bin/apxs</P>
<P>#php run like shell 以单独的shell方式运行<BR>./configure --prefix=/usr/local/php</P>
<P>#php for apache<BR>./configure<BR>--with-apxs2=/usr/local/apache/bin/apxs<BR>--enable-track-vars<BR>--enable-debug<BR>--enable-url-includes<BR>--enable-sockets<BR>--with-config-file-path=/usr/local/apache/conf #php.ini文件放的目录<BR>#下面的参数是安装PHP + gd库<BR>--with-gd=/usr/local<BR>--enable-gd-native-ttf<BR>--with-ttf=/usr/local<BR>--with-jpeg-dir=/usr/local<BR>--with-zlib-dir=/usr/local<BR>--with-png-dir=/usr/local<BR>#make<BR>#make install<BR>#ls -l /usr/local/apache/modules/libphp4.so #存在 安装成功</P>
<P>#修改apache http.conf<BR>添加<BR>LoadModule php4_module modules/libphp4.so<BR>AddType application/x-httpd-php .php</P>
<P>安装Tomcat:<BR>#cd /usr/local<BR>#tar -xzvf jakarta-tomcat-4.1.24.tar.gz<BR>#ln -s jakarta-tomcat-4.1.24 tomcat<BR>#测试Tomcat正常安装:<BR>#/usr/local/tomcat/bin/startup.sh</P>
<P>#通过IE <A href="http://yourIP:8080/">http://yourIP:8080/</A> Tomcat的页面正常显示</P>
<P>安装JK2 :<BR>#cd /usr/local/src<BR>#tar -xzvf jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz<BR>#cd jakarta-tomcat-connectors-jk2-2.0.2-src<BR>#cd jk/native2<BR>#chmod 755 buildconf.sh<BR>#./configure --with-apxs2=/usr/local/apache/bin/apxs --enable-EAPI<BR>#make<BR>#make install<BR>#如果make install 不成功需要手工发布mod_jk2.so<BR>#cd /usr/local/src/jakarta-tomcat-connectors-jk2-2.0.2-src/jk/build/jk2/apache2<BR>#cp *.so /usr/local/apache/modules/</P>
<P>配置$CATLINA/conf/server.xml</P>
<P>debug="0"/><BR>debug="0"/></P>
<P>port="8080" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="100" debug="0" connectionTimeout="-1"<BR>useURIValidationHack="false" disableUploadTimeout="true" /></P>
<P>port="8009" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="10" debug="0" connectionTimeout="-1"<BR>useURIValidationHack="false"<BR>protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/></P>
<P>prefix="catalina_log." suffix=".txt"<BR>timestamp="true"/></P>
<P>unpackWARs="true" autoDeploy="true"></P>
<P>directory="logs" prefix="localhost_log." suffix=".txt"<BR>timestamp="true"/></P>
<P>#编辑<BR>#vi /usr/local/tomcat/conf/jk2.properties<BR># list of needed handlers.<BR>handler.list=channelSocket,request<BR># Override the default port for the channelSocket<BR>channelSocket.port=8009</P>
<P>#编辑文件:</P>
<P>#vi /usr/local/apache/conf/workers2.properties</P>
<P># only at beginnin. In production uncomment it out<BR>[logger.apache2]<BR>level=DEBUG</P>
<P>[shm]<BR>file=/usr/local/apache/logs/shm.file<BR>size=1048576</P>
<P># Example socket channel, override port and host.<BR>[channel.socket:localhost:8009]<BR>port=8009<BR>host=127.0.0.1</P>
<P># define the worker<BR>[ajp13:localhost:8009]<BR>channel=channel.socket:localhost:8009</P>
<P># Uri mapping<BR>[uri:192.168.0.90/*.jsp]<BR>worker=ajp13:localhost:8009</P>
<P>[uri:211.167.83.165/*.jsp]<BR>worker=ajp13:localhost:8009</P>
<P>#编辑http.conf<BR>#修改<BR>DocumentRoot "/usr/local/tomcat/webapps"<BR>#添加index.jsp<BR>DirectoryIndex index.html index.html.var index.jsp</P>
<P>LoadModule jk2_module modules/mod_jk2.so</P>
<P>Order deny,allow<BR>Deny from all</P>
<P>#<BR># Order deny,allow<BR># Deny from all<BR>#</P>
<P>Order Allow,Deny</P>
<P>ServerName <A href="http://www.home.net">www.home.net</A><BR>ServerAlias www<BR>ServerAlias localhost<BR>ServerAlias 192.168.0.90<BR>ServerAlias 211.167.83.165<BR>ServerAdmin <A href="mailto:webmater@5757.com">webmater@5757.com</A><BR>DocumentRoot /usr/local/tomcat/webapps</P>
<P>ErrorLog logs/home.net-errorlog<BR>CustomLog logs/home.net-access.log common</P>
<P>JkUriSet worker ajp13:localhost:8009</P>
<P>在配置server.xml 的时候:<BR>配置管理端口 和连接的端口顺序颠倒一下<BR>在 catalina.out 可以观察到:<BR>这样用apache 连接的时候,就不用等待了.</P>
<P>port="8009" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="10" debug="0" connectionTimeout="0"<BR>useURIValidationHack="false"<BR>protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/></P>
<P>port="8080" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="100" debug="0" connectionTimeout="20000"<BR>useURIValidationHack="false" disableUploadTimeout="true" /></P>
<P>#server.xml 不支持中文的注释<BR>#对 shared/classes 目录下的java进行的修改不能立刻的反应到jsp中标.不能立即起作用.</P>
<P>以上的安装同样适合jakarta-tomcat-5.0.12 在以下的配置中注意</P>
<P>#在配置 jakarta-tomcat-5.0.12 的时候,注意 server.xml 中</P>
<P>没有封闭.</P>
<P>BUG:</P>
<P>在catalina.out 报错误.</P>
<P>总体上感觉tomcat 5.0 比4.x在性能上是有了改进.启动的速度快. </P><![CDATA[<P>服务器环境:</P>
<P>RedHat Linux 8.0<BR>J2sdk1.4.1_02<BR>Tomcat 4.1.12 binary<BR>Apache 2.0.47 built from source<BR>jk2 connector source from jakarta.apache.org</P>
<P><BR>安装JDK:</P>
<P>下载: j2sdk-1_4_1_02-linux-i586.bin<BR>把jdk 安装在/usr/local/j2sdk1.4.1_02<BR>在/usr/local 下建立 软连接 jdk<BR>#ln -s /usr/local/j2sdk1.4.1_02 /usr/local/jdk</P>
<P>[user@host]# cat /etc/profile.d/java.sh<BR># set java environment<BR>export JAVA_HOME=/usr/local/jdk<BR>export PATH=$PATH:$JAVA_HOME/bin<BR>export CLASSPATH=$JAVA_HOME/lib</P>
<P>#更改shell文件属性:<BR>#chmod 755 /etc/profile.d/java.sh</P>
<P>#查看是否正确<BR>#which java<BR>/usr/local/jdk/bin/java</P>
<P><BR>安装apache :</P>
<P>#cd /usr/local/src/<BR>#tar -xzvf httpd-2.0.47.tar.gz<BR>#cd httpd-2.0.47<BR>#配置apache 支持动态module 加载<BR>#./configure<BR>"--with-layout=Apache"<BR>"--prefix=/usr/local/apache"<BR>"--enable-module=so"<BR>"--enable-module=setenvif"<BR>"--enable-module=rewrite"<BR>"--with-mpm=prefork"</P>
<P>#make<BR>#make install</P>
<P>#修改http.conf 具体的修改请参考apache2.0文档<BR># 或者查看 <A href="http://www.cnfug.org/journal/3/02.html">http://www.cnfug.org/journal/3/02.html</A></P>
<P>StartServers 10<BR>MinSpareServers 25<BR>MaxSpareServers 50<BR>ServerLimit 2000<BR>MaxClients 1500 #Apache可以同时处理的请求<BR>MaxRequestsPerChild 10000</P>
<P>安装Php :<BR>下载: php-4.3.3.tar.gz<BR>#cd /usr/local/src<BR>#tar -xzvf</P>
<P>#php for apache 以apache modules的方式运行<BR>./configure --with-apxs2=/usr/local/apache/bin/apxs</P>
<P>#php run like shell 以单独的shell方式运行<BR>./configure --prefix=/usr/local/php</P>
<P>#php for apache<BR>./configure<BR>--with-apxs2=/usr/local/apache/bin/apxs<BR>--enable-track-vars<BR>--enable-debug<BR>--enable-url-includes<BR>--enable-sockets<BR>--with-config-file-path=/usr/local/apache/conf #php.ini文件放的目录<BR>#下面的参数是安装PHP + gd库<BR>--with-gd=/usr/local<BR>--enable-gd-native-ttf<BR>--with-ttf=/usr/local<BR>--with-jpeg-dir=/usr/local<BR>--with-zlib-dir=/usr/local<BR>--with-png-dir=/usr/local<BR>#make<BR>#make install<BR>#ls -l /usr/local/apache/modules/libphp4.so #存在 安装成功</P>
<P>#修改apache http.conf<BR>添加<BR>LoadModule php4_module modules/libphp4.so<BR>AddType application/x-httpd-php .php</P>
<P>安装Tomcat:<BR>#cd /usr/local<BR>#tar -xzvf jakarta-tomcat-4.1.24.tar.gz<BR>#ln -s jakarta-tomcat-4.1.24 tomcat<BR>#测试Tomcat正常安装:<BR>#/usr/local/tomcat/bin/startup.sh</P>
<P>#通过IE <A href="http://yourIP:8080/">http://yourIP:8080/</A> Tomcat的页面正常显示</P>
<P>安装JK2 :<BR>#cd /usr/local/src<BR>#tar -xzvf jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz<BR>#cd jakarta-tomcat-connectors-jk2-2.0.2-src<BR>#cd jk/native2<BR>#chmod 755 buildconf.sh<BR>#./configure --with-apxs2=/usr/local/apache/bin/apxs --enable-EAPI<BR>#make<BR>#make install<BR>#如果make install 不成功需要手工发布mod_jk2.so<BR>#cd /usr/local/src/jakarta-tomcat-connectors-jk2-2.0.2-src/jk/build/jk2/apache2<BR>#cp *.so /usr/local/apache/modules/</P>
<P>配置$CATLINA/conf/server.xml</P>
<P>debug="0"/><BR>debug="0"/></P>
<P>port="8080" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="100" debug="0" connectionTimeout="-1"<BR>useURIValidationHack="false" disableUploadTimeout="true" /></P>
<P>port="8009" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="10" debug="0" connectionTimeout="-1"<BR>useURIValidationHack="false"<BR>protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/></P>
<P>prefix="catalina_log." suffix=".txt"<BR>timestamp="true"/></P>
<P>unpackWARs="true" autoDeploy="true"></P>
<P>directory="logs" prefix="localhost_log." suffix=".txt"<BR>timestamp="true"/></P>
<P>#编辑<BR>#vi /usr/local/tomcat/conf/jk2.properties<BR># list of needed handlers.<BR>handler.list=channelSocket,request<BR># Override the default port for the channelSocket<BR>channelSocket.port=8009</P>
<P>#编辑文件:</P>
<P>#vi /usr/local/apache/conf/workers2.properties</P>
<P># only at beginnin. In production uncomment it out<BR>[logger.apache2]<BR>level=DEBUG</P>
<P>[shm]<BR>file=/usr/local/apache/logs/shm.file<BR>size=1048576</P>
<P># Example socket channel, override port and host.<BR>[channel.socket:localhost:8009]<BR>port=8009<BR>host=127.0.0.1</P>
<P># define the worker<BR>[ajp13:localhost:8009]<BR>channel=channel.socket:localhost:8009</P>
<P># Uri mapping<BR>[uri:192.168.0.90/*.jsp]<BR>worker=ajp13:localhost:8009</P>
<P>[uri:211.167.83.165/*.jsp]<BR>worker=ajp13:localhost:8009</P>
<P>#编辑http.conf<BR>#修改<BR>DocumentRoot "/usr/local/tomcat/webapps"<BR>#添加index.jsp<BR>DirectoryIndex index.html index.html.var index.jsp</P>
<P>LoadModule jk2_module modules/mod_jk2.so</P>
<P>Order deny,allow<BR>Deny from all</P>
<P>#<BR># Order deny,allow<BR># Deny from all<BR>#</P>
<P>Order Allow,Deny</P>
<P>ServerName <A href="http://www.home.net">www.home.net</A><BR>ServerAlias www<BR>ServerAlias localhost<BR>ServerAlias 192.168.0.90<BR>ServerAlias 211.167.83.165<BR>ServerAdmin <A href="mailto:webmater@5757.com">webmater@5757.com</A><BR>DocumentRoot /usr/local/tomcat/webapps</P>
<P>ErrorLog logs/home.net-errorlog<BR>CustomLog logs/home.net-access.log common</P>
<P>JkUriSet worker ajp13:localhost:8009</P>
<P>在配置server.xml 的时候:<BR>配置管理端口 和连接的端口顺序颠倒一下<BR>在 catalina.out 可以观察到:<BR>这样用apache 连接的时候,就不用等待了.</P>
<P>port="8009" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="10" debug="0" connectionTimeout="0"<BR>useURIValidationHack="false"<BR>protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/></P>
<P>port="8080" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"<BR>acceptCount="100" debug="0" connectionTimeout="20000"<BR>useURIValidationHack="false" disableUploadTimeout="true" /></P>
<P>#server.xml 不支持中文的注释<BR>#对 shared/classes 目录下的java进行的修改不能立刻的反应到jsp中标.不能立即起作用.</P>
<P>以上的安装同样适合jakarta-tomcat-5.0.12 在以下的配置中注意</P>
<P>#在配置 jakarta-tomcat-5.0.12 的时候,注意 server.xml 中</P>
<P>没有封闭.</P>
<P>BUG:</P>
<P>在catalina.out 报错误.</P>
<P>总体上感觉tomcat 5.0 比4.x在性能上是有了改进.启动的速度快. </P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 23:29 <a href="http://www.blogjava.net/qq13367612/articles/16102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat中文手册</title><link>http://www.blogjava.net/qq13367612/articles/16103.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16103.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16103.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16103.html</trackback:ping><description><![CDATA[Jakarta-Tomcat 简明中文版用户指南第一部分 
<P></P>
<P>本文档提供关于Tomcat的基础信息.主要内容如下:<BR>Tomcat二进制版本安装<BR>与Tomcat相关的脚本的主要内容<BR>与server.xml相关的主要内容,Tomcat的主要配置文件<BR>如何设置Tomcat与宿主web服务器一起工作的说明<BR>如何应用Tomcat配置一个现实中的web站点<BR>希望此文档足以使新用户可以开始使用Tomcat.如找不到某方面的内容请(按以下顺序)<BR>查找Tomcat faq<BR>查找Tomcat包清单<BR>向Tomcat用户邮件列表发出问题<BR>如此疑问的答案不存在,我们鼓励把对疑问的解答放入Tomcat faq或此文档.如对此文档有意见或建议,请发送到Tomcat的邮件列表.</P>
<P>Getting Started<BR>Tomcat是一个带有jsp环境的servlet容器.servlet容器是一个根据用户的行为可以管理和激活servlet的运行时的shell.<BR>粗略地可以将servlet容器分为如下几类:</P>
<P>独立的servlet容器<BR>内置有web服务器的一部分.指当使用基于Java的web服务器的情形,例如servlet容器是JavaWebServer的一个部分. 独立的servlet容器是Tomcat的默认模式.<BR>大多数的web服务器并非基于Java,因此,我们可以得出如下两种容器的模式.</P>
<P><BR>进程内的servlet容器<BR>servlet容器作为web服务器的插件和Java容器的实现.Web服务器插件在内部地址空间打开一个JVM(java virtual machine)使Java容器得以在内部运行.如有某个需要调用servlet的请求,,插件将取得对此请求的控制并将他传递(使用JNI)给Java容器.进程内容器对于多线程,单进程的服务器非常合适并且提供很好的运行速度,但伸缩性有所不足.</P>
<P><BR>进程外的servlet容器<BR>servlet容器运行于web服务器之外的地址空间且作为web服务器的插件和Java容器的实现的结合.web服务器插件和Java容器 JVM使用IPC机制(通常是TCP/IP)进行通讯.当一个调用servlet的请求到达时,插件将取得对此请求的控制并将其传递(使用IPC等)给Java容器,进程外容器的反应时间或进程外容器引擎不如进程内容器,但进程外容器引擎在许多其他可比的范围内更好(伸缩性,稳定性等).<BR>Tomcat既可作为独立的容器(主要是用于开发与调试)又可作为对现有服务器的附加(当前支持Apache,IIS和Netscape服务器).即任何时候配置Tomcat你都必须决定如何应用他,如选择第二或第三种模式,你还需要安装一个web服务器接口.<BR>Tomcat与Jserv有何区别?Tomcat是Jserv吗?<BR>这是个常见的误解.Jserv是Servlet API2.0兼容并与Apache一起使用的容器.Tomcat是一个完全重写的并与Servlet API2.2和JSP1.1兼容的容器.<BR>Tomcat使用了一些为Jserv而写的代码,特别是Jserv的Apache接口,但这是唯一的相同之处.<BR>怎样安装Tomcat的二进制版本?<BR>非常简单,只需:<BR>下载 zip/tar.gz 任何压缩文件,从http://jakarta.apche.org/download/binindex.html处.<BR>解压缩此文件到某目录(如:foo).将会生成一子目录,名为”tomcat”.<BR>转换到”tomcat”目录设置一新的环境变量(TOMCAT_HOME)指向你安装的tomcat的目录<BR>WIN32平台,键入:<BR>“set TOMCAT_HOME=foo\tomcat”<BR>Unix平台:<BR>如是bash/sh环境, 键入:”TOMCAT_HOME=foo/tomcat;export TOMCAT_HOME”<BR>如是tcsh环境, 键入:”setenv TOMCAT_HOME foo/tomcat”<BR>设置环境变量JAVA_HOME指向你JDK的目录,然后添加JAVA解释器到你的PATH环境变量.<BR>好了!现在可以运行TOMCAT并作为一个独立的Servlet容器(模式一)<BR>启动与关闭Tomcat<BR>使用”bin”目录中的脚本启动与关闭Tomcat.<BR>启动:<BR>uinx:bin/startup.sh<BR>win32:bin\startup<BR>关闭:<BR>unix:bin/shutdown.sh<BR>win32:bin\shutdown<BR>Tomcat目录结构<BR>假设你已将Tomcat解压,你已得到下列目录结构:<BR>目录名--描述 <BR>bin <BR>包含启动/关闭脚本 <BR>conf <BR>包含不同的配置文件,<BR>包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件web.xml<BR>doc<BR>包含各种Tomcat文档 <BR>lib <BR>包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中 <BR>logs <BR>Tomcat摆放日志文件的地方 <BR>src <BR>ServletAPI源文件.先别高兴,这些只有些必须在Servlet容器内实现的空接口和抽象类 <BR>webapps <BR>包含web项目示例 <BR>此外你可以Tomcat会创建如下目录:<BR>work<BR>Tomcat自动生成,放置Tomcat运行时的临时文件(如编译后的JSP文件).如在Tomcat运行时删除此目录.JSP页面将不能运行.<BR>classes<BR>你可以创建此目录来添加一些附加的类到类路径中.任何你加到此目录中的类都可在Tomcat的类路径中找到自身.<BR>Tomcat的脚本<BR>Tomcat是一个Java程序,因此在设置好几个环境变量后即可用命令行的方式运行.然而设置Tomcat使用的每个环境变量和如下的命令行参数乏味且易错.因此,Tomcat开发组提供了一些脚本使启动和关闭Tomcat变得轻松.<BR>注意:这些脚本仅仅是个便利的方法去启动和关闭Tomcat.你可修改他们来定制CLASSPATH,环境变量如PATH,LD_LIBRARY_PATH,等等,只要是生成一个正确的命令行即可.<BR>这些脚本是什么呢?下表列出对一般用户最重要的脚本.<BR>tomcat <BR>主脚本.设置合适的环境变量,包括CLASSPATH,TOMCAT_HOME和JAVA_HOME和用适合的命令行参数启动Tomcat </P>
<P>startup </P>
<P>在后台启动Tomcat.”tomcat start”命令的替换方式 </P>
<P>shutdown </P>
<P>关闭Tomcat.”tomcat stop”命令的替换方式 </P>
<P><BR>对用户最重要的脚本是tomcat(tomcat.bat/tomcat.sh).其他Tomcat相关的脚本作为一个简单的面向单任务的指向Tomcat脚本(设置不同的命令行参数等)的入口.</P>
<P><BR>仔细考察tomcat.bat/tomcat.sh,它按以下步骤运行:</P>
<P>在Unix下的步骤：</P>
<P>如未指定,推测 TOMCAT_HOME</P>
<P>如未指定,推测 JAVA_HOME</P>
<P>设置CLASS_PATH包含:</P>
<P>1.${TOMCAT_HOME}/classes目录(如果存在)</P>
<P>2.${TOMCAT_HOME}/lib的一切内容</P>
<P>3.${JAVA_HOME}/lib/tools.jar(此jar文件包含工具javac,我们需要javac处理jsp文件.</P>
<P><BR>运行带有设定Java环境变量的命令行参数的java命令,调入tomcat.home,和org.apache.tomcat.startup.Tomcat 作为启始类.同时也传递命令行参数到org.apache.tomcat.startup.Tomcat ,例如:</P>
<P><BR>执行start/stop/run 等的操作</P>
<P>此Tomcat进程使用指向server.xml的路径,</P>
<P>例如server.xml放置于etc/server_1.xml并且用户意图在后台启动apache,键 入如下命令行:</P>
<P>bin/tomcat.sh start –f /etc/server_1.xml</P>
<P>在Win32下的步骤：(略)</P>
<P><BR>由此可见,win32版的tomcat.bat与Unix版的几乎一致.尤其在它不推测TOMCAT_HOME和JAVA_HOME的值,并且不将所有的jar文件放入类路径中.</P>
<P><BR>Tomcat的配置文件</P>
<P>Tomcat的配置基于两个配置文件:</P>
<P>1.server.xml - Tomcat的全局配置文件</P>
<P>2.web.xml - 在Tomcat中配置不同的关系环境</P>
<P><BR>这一部分将讲述如何使用这些文件.我们不会包含web.xml的内部机制,这些内部机制深入到了Servlet API的细节,因此,我们将讨论涵盖servler.xml内容及web.xml在Tomcat关系环境中的用法.</P>
<P><BR>server.xml</P>
<P>server.xml是Tomcat的主配置文件.完成两个目标:</P>
<P>1 提供Tomcat组件的初始配置.</P>
<P>2 说明Tomcat的结构,含义,使得Tomcat通过实例化组件完成起动及构建自身, 如在server.xml所指定的</P>
<P>下表描述server.xml种的重要元素:<BR></P>
<P>元素及其描述 </P>
<P>Server<BR>server.xml文件中最重要的元素.Server定义了一个Tomcat服务器.一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素类型</P>
<P>Logger<BR>此元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余级别(描述此日志级别)和包含日志文件的路径.通常有servlet的Logger(ServletContext.log()处),JSP和Tomcat运行时的Logger.</P>
<P>ContextManager<BR>ContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配置及结构.ContextManager有几个随同提供的特性:<BR>1. 用来纪录调试信息的调试级别 <BR>2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动. <BR>3. 工作目录的名字</P>
<P>ContextInterceptor&RequestInterceptor<BR>这些侦听器(interceptors)侦听具体发生在ContextManager中的事件.例如,ContextInterceptor侦听Tomcat的启动及终止事件,RequestInterceptor监视在它服务过程中用户请求需要通过的不同阶段.Tomcat的管理员不必知道太多关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实现一个”全局”型的操作(例如安全性及每个请求日志)</P>
<P>Connector<BR>Connector表示一个到用户的联接,不管是通过web服务器或直接到用户浏览器(在一个独立配置中).Connector负责管理Tomcat的工作线程和 读/写 连接到不同用户的端口的 请求/响应.Connector的配置包含如下信息:</P>
<P>1.句柄类</P>
<P>2.句柄监听的TCP/IP端口</P>
<P>3.句柄服务器端口的TCP/IP的backlog.</P>
<P>稍后我们将在此文档中描述如何配置Connector.</P>
<P>Context<BR>每个Context提供一个指向你放置你Web项目的Tomcat的下属目录。每个Context包含如下配置：</P>
<P>1. Context放置的路径,可以是与ContextManager主目录相关的路径.</P>
<P>2.纪录调试信息的调试级别</P>
<P>3.可重载的标志.开发Servlet时,重载更改后的Servlet,这是一个非常便利的特性,你可以调试或用Tomcat测试新代码而不用停止或重新启动Tomcat.要打开重载,把reloadable设为真即可.这虽花费时间但可检测所发生的变化;更重要的事,鉴于,在一个装载类对象装入一个新的servlet时,类装载触发器可能会掷出一些错误.为避免这些问题,你可以设置可重载为假,这将停止重载功能.</P>
<P><BR>　 </P>
<P>从另一个目录中启动Tomcat</P>
<P>作为缺省值将使用TOMCAT_HOME/conf/server.xml作为配置文件.缺省配置将使用TOMCT_HOME作为关系环境的基础.</P>
<P>使用 “-f/你的/目录/server.xml”选项你可改变这种情况,使用另一个服务器配置文件和设置关系环境管理器的目录属性你需要在主目录内设置以下几个文件:</P>
<P>Ø 一个 webapps/目录(如果你已生成) – 所有war文件奖杯界压倒此目录而且所有子目录将作为关系环境添加.</P>
<P>Ø conf/目录 - 你可保存一个特殊的web.xml文件和其他配置文件</P>
<P>Ø logs/ - 所有日志文件将代替TOMCAT_HOME/logs/纪录到此目录中</P>
<P>Ø work/ - 关系环境的工作目录</P>
<P>如server.xml中的ContextManager.home属性有关联,将关联到到当前工作目录.</P>
<P>web。xml</P>
<P>关于web。xml和web项目结构（包括目录服务及配置）的详细描述可在Servlet API Spec的第9，10，14章中找到。</P>
<P>然而有一个与Tomcat有关的小“特性“与web.xml有关。Tomcat可以让用户通过将缺省的web.xml放入conf目录中来定义所有关系环境的web.xml的缺省值.建立一个新的关系环境时,Tomcat使用缺省的web.xml文件作为基本设置和应用项目特定的web.xml(放在应用项目的WEB-INF/web.xml文件)来覆盖这些缺省值.</P>
<P>设置Tomcat与Apache Web 服务器</P>
<P>服务器</P>
<P>到现在为止,我们未讨论作为服务器扩展的Tomcat,只讨论了作为独立运行的服务器.但有一些问题需要说明:</P>
<P>1. 当处理静态页面时,Tomcat不如Apache迅速.</P>
<P>2. Tomcat不象Apache一样可配置.</P>
<P>3. Tomcat不象Apache一样强壮.</P>
<P>4. 有很多网站已在某一特定web server上投入了很长时间,例如,使用CGI脚本/Server API模组/perl/php…我们不能假设这些遗留下来的东西都会被丢弃.</P>
<P>基于以上原因,一个现实的网站建议使用一个Web服务器,如Apache,为网站的静态页面请求提供服务,并使用Tomcat作为一个Servlet/JSP插件.</P>
<P>我们不准备深入的讨论每个不同的配置,我们将:</P>
<P>1. 涵盖Web服务器的基本行为</P>
<P>2. 解释需要何种配置</P>
<P>3. 在Apache上的实例</P>
<P><BR>Web 服务器操作</P>
<P><BR>简单说来，web服务器总是等待来自客户端的HTTP请求。当请求到达时，服务器会提供一切必要的内容来满足此请求。加入一个Servlet容器某种程度上会改变此行为。但服务器仍需处理如下因素：</P>
<P>载入servlet容器接口库并初始化（处理请求之前）。</P>
<P>当收到一个请求时，检查是否属于某Servlet，如是，则接口库接收此请求并处理。</P>
<P>另一方面，接口库需要知道他将服务某种请求，通常是基于请求的URL的某种模式和将此请求导向何处。</P>
<P>当用户想要设置使用虚拟主机的配置时，事情会变得更加复杂，或者想多个开发者在一个服务器上进行开发但使用不同的Servlet容器的JVMs。以下我们将讨论这两个问题。</P>
<P><BR>必需进行的配置</P>
<P><BR>应该考虑的是最明显的配置是servlet URL具有对servlet容器中的servlet具有表示的责任。很明显，你必须知道传递什么到Servlet容器。我们仍需提供附加的配置项目到web-server或servlet-container的结合体中.</P>
<P>l 考虑到Tomcat进程是否可取得，我们仍需提供配置和Tomcat正在监听的TCP/IP 主机名/端口号。</P>
<P>l 需要告知web服务器接口库的位置（因此我们可以在起始时装入）</P>
<P>l 需要设置接口内部信息如将日志记录在何处和如何纪录，等等。</P>
<P>所有此类信息必须出现在web服务器配置里或被接口使用的私有配置文件中。下面将讲述如何在Apache中如何实现这些配置。</P>
<P><BR>Apache上的实现</P>
<P>这一部分演示如何配置Apache与Tomcat一起工作；并试图解释深入到可能会用到的配置规范。在jserv 安装页上可找到其他信息。<BR></P><![CDATA[Jakarta-Tomcat 简明中文版用户指南第一部分 
<P></P>
<P>本文档提供关于Tomcat的基础信息.主要内容如下:<BR>Tomcat二进制版本安装<BR>与Tomcat相关的脚本的主要内容<BR>与server.xml相关的主要内容,Tomcat的主要配置文件<BR>如何设置Tomcat与宿主web服务器一起工作的说明<BR>如何应用Tomcat配置一个现实中的web站点<BR>希望此文档足以使新用户可以开始使用Tomcat.如找不到某方面的内容请(按以下顺序)<BR>查找Tomcat faq<BR>查找Tomcat包清单<BR>向Tomcat用户邮件列表发出问题<BR>如此疑问的答案不存在,我们鼓励把对疑问的解答放入Tomcat faq或此文档.如对此文档有意见或建议,请发送到Tomcat的邮件列表.</P>
<P>Getting Started<BR>Tomcat是一个带有jsp环境的servlet容器.servlet容器是一个根据用户的行为可以管理和激活servlet的运行时的shell.<BR>粗略地可以将servlet容器分为如下几类:</P>
<P>独立的servlet容器<BR>内置有web服务器的一部分.指当使用基于Java的web服务器的情形,例如servlet容器是JavaWebServer的一个部分. 独立的servlet容器是Tomcat的默认模式.<BR>大多数的web服务器并非基于Java,因此,我们可以得出如下两种容器的模式.</P>
<P><BR>进程内的servlet容器<BR>servlet容器作为web服务器的插件和Java容器的实现.Web服务器插件在内部地址空间打开一个JVM(java virtual machine)使Java容器得以在内部运行.如有某个需要调用servlet的请求,,插件将取得对此请求的控制并将他传递(使用JNI)给Java容器.进程内容器对于多线程,单进程的服务器非常合适并且提供很好的运行速度,但伸缩性有所不足.</P>
<P><BR>进程外的servlet容器<BR>servlet容器运行于web服务器之外的地址空间且作为web服务器的插件和Java容器的实现的结合.web服务器插件和Java容器 JVM使用IPC机制(通常是TCP/IP)进行通讯.当一个调用servlet的请求到达时,插件将取得对此请求的控制并将其传递(使用IPC等)给Java容器,进程外容器的反应时间或进程外容器引擎不如进程内容器,但进程外容器引擎在许多其他可比的范围内更好(伸缩性,稳定性等).<BR>Tomcat既可作为独立的容器(主要是用于开发与调试)又可作为对现有服务器的附加(当前支持Apache,IIS和Netscape服务器).即任何时候配置Tomcat你都必须决定如何应用他,如选择第二或第三种模式,你还需要安装一个web服务器接口.<BR>Tomcat与Jserv有何区别?Tomcat是Jserv吗?<BR>这是个常见的误解.Jserv是Servlet API2.0兼容并与Apache一起使用的容器.Tomcat是一个完全重写的并与Servlet API2.2和JSP1.1兼容的容器.<BR>Tomcat使用了一些为Jserv而写的代码,特别是Jserv的Apache接口,但这是唯一的相同之处.<BR>怎样安装Tomcat的二进制版本?<BR>非常简单,只需:<BR>下载 zip/tar.gz 任何压缩文件,从http://jakarta.apche.org/download/binindex.html处.<BR>解压缩此文件到某目录(如:foo).将会生成一子目录,名为”tomcat”.<BR>转换到”tomcat”目录设置一新的环境变量(TOMCAT_HOME)指向你安装的tomcat的目录<BR>WIN32平台,键入:<BR>“set TOMCAT_HOME=foo\tomcat”<BR>Unix平台:<BR>如是bash/sh环境, 键入:”TOMCAT_HOME=foo/tomcat;export TOMCAT_HOME”<BR>如是tcsh环境, 键入:”setenv TOMCAT_HOME foo/tomcat”<BR>设置环境变量JAVA_HOME指向你JDK的目录,然后添加JAVA解释器到你的PATH环境变量.<BR>好了!现在可以运行TOMCAT并作为一个独立的Servlet容器(模式一)<BR>启动与关闭Tomcat<BR>使用”bin”目录中的脚本启动与关闭Tomcat.<BR>启动:<BR>uinx:bin/startup.sh<BR>win32:bin\startup<BR>关闭:<BR>unix:bin/shutdown.sh<BR>win32:bin\shutdown<BR>Tomcat目录结构<BR>假设你已将Tomcat解压,你已得到下列目录结构:<BR>目录名--描述 <BR>bin <BR>包含启动/关闭脚本 <BR>conf <BR>包含不同的配置文件,<BR>包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件web.xml<BR>doc<BR>包含各种Tomcat文档 <BR>lib <BR>包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中 <BR>logs <BR>Tomcat摆放日志文件的地方 <BR>src <BR>ServletAPI源文件.先别高兴,这些只有些必须在Servlet容器内实现的空接口和抽象类 <BR>webapps <BR>包含web项目示例 <BR>此外你可以Tomcat会创建如下目录:<BR>work<BR>Tomcat自动生成,放置Tomcat运行时的临时文件(如编译后的JSP文件).如在Tomcat运行时删除此目录.JSP页面将不能运行.<BR>classes<BR>你可以创建此目录来添加一些附加的类到类路径中.任何你加到此目录中的类都可在Tomcat的类路径中找到自身.<BR>Tomcat的脚本<BR>Tomcat是一个Java程序,因此在设置好几个环境变量后即可用命令行的方式运行.然而设置Tomcat使用的每个环境变量和如下的命令行参数乏味且易错.因此,Tomcat开发组提供了一些脚本使启动和关闭Tomcat变得轻松.<BR>注意:这些脚本仅仅是个便利的方法去启动和关闭Tomcat.你可修改他们来定制CLASSPATH,环境变量如PATH,LD_LIBRARY_PATH,等等,只要是生成一个正确的命令行即可.<BR>这些脚本是什么呢?下表列出对一般用户最重要的脚本.<BR>tomcat <BR>主脚本.设置合适的环境变量,包括CLASSPATH,TOMCAT_HOME和JAVA_HOME和用适合的命令行参数启动Tomcat </P>
<P>startup </P>
<P>在后台启动Tomcat.”tomcat start”命令的替换方式 </P>
<P>shutdown </P>
<P>关闭Tomcat.”tomcat stop”命令的替换方式 </P>
<P><BR>对用户最重要的脚本是tomcat(tomcat.bat/tomcat.sh).其他Tomcat相关的脚本作为一个简单的面向单任务的指向Tomcat脚本(设置不同的命令行参数等)的入口.</P>
<P><BR>仔细考察tomcat.bat/tomcat.sh,它按以下步骤运行:</P>
<P>在Unix下的步骤：</P>
<P>如未指定,推测 TOMCAT_HOME</P>
<P>如未指定,推测 JAVA_HOME</P>
<P>设置CLASS_PATH包含:</P>
<P>1.${TOMCAT_HOME}/classes目录(如果存在)</P>
<P>2.${TOMCAT_HOME}/lib的一切内容</P>
<P>3.${JAVA_HOME}/lib/tools.jar(此jar文件包含工具javac,我们需要javac处理jsp文件.</P>
<P><BR>运行带有设定Java环境变量的命令行参数的java命令,调入tomcat.home,和org.apache.tomcat.startup.Tomcat 作为启始类.同时也传递命令行参数到org.apache.tomcat.startup.Tomcat ,例如:</P>
<P><BR>执行start/stop/run 等的操作</P>
<P>此Tomcat进程使用指向server.xml的路径,</P>
<P>例如server.xml放置于etc/server_1.xml并且用户意图在后台启动apache,键 入如下命令行:</P>
<P>bin/tomcat.sh start –f /etc/server_1.xml</P>
<P>在Win32下的步骤：(略)</P>
<P><BR>由此可见,win32版的tomcat.bat与Unix版的几乎一致.尤其在它不推测TOMCAT_HOME和JAVA_HOME的值,并且不将所有的jar文件放入类路径中.</P>
<P><BR>Tomcat的配置文件</P>
<P>Tomcat的配置基于两个配置文件:</P>
<P>1.server.xml - Tomcat的全局配置文件</P>
<P>2.web.xml - 在Tomcat中配置不同的关系环境</P>
<P><BR>这一部分将讲述如何使用这些文件.我们不会包含web.xml的内部机制,这些内部机制深入到了Servlet API的细节,因此,我们将讨论涵盖servler.xml内容及web.xml在Tomcat关系环境中的用法.</P>
<P><BR>server.xml</P>
<P>server.xml是Tomcat的主配置文件.完成两个目标:</P>
<P>1 提供Tomcat组件的初始配置.</P>
<P>2 说明Tomcat的结构,含义,使得Tomcat通过实例化组件完成起动及构建自身, 如在server.xml所指定的</P>
<P>下表描述server.xml种的重要元素:<BR></P>
<P>元素及其描述 </P>
<P>Server<BR>server.xml文件中最重要的元素.Server定义了一个Tomcat服务器.一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素类型</P>
<P>Logger<BR>此元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余级别(描述此日志级别)和包含日志文件的路径.通常有servlet的Logger(ServletContext.log()处),JSP和Tomcat运行时的Logger.</P>
<P>ContextManager<BR>ContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配置及结构.ContextManager有几个随同提供的特性:<BR>1. 用来纪录调试信息的调试级别 <BR>2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动. <BR>3. 工作目录的名字</P>
<P>ContextInterceptor&RequestInterceptor<BR>这些侦听器(interceptors)侦听具体发生在ContextManager中的事件.例如,ContextInterceptor侦听Tomcat的启动及终止事件,RequestInterceptor监视在它服务过程中用户请求需要通过的不同阶段.Tomcat的管理员不必知道太多关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实现一个”全局”型的操作(例如安全性及每个请求日志)</P>
<P>Connector<BR>Connector表示一个到用户的联接,不管是通过web服务器或直接到用户浏览器(在一个独立配置中).Connector负责管理Tomcat的工作线程和 读/写 连接到不同用户的端口的 请求/响应.Connector的配置包含如下信息:</P>
<P>1.句柄类</P>
<P>2.句柄监听的TCP/IP端口</P>
<P>3.句柄服务器端口的TCP/IP的backlog.</P>
<P>稍后我们将在此文档中描述如何配置Connector.</P>
<P>Context<BR>每个Context提供一个指向你放置你Web项目的Tomcat的下属目录。每个Context包含如下配置：</P>
<P>1. Context放置的路径,可以是与ContextManager主目录相关的路径.</P>
<P>2.纪录调试信息的调试级别</P>
<P>3.可重载的标志.开发Servlet时,重载更改后的Servlet,这是一个非常便利的特性,你可以调试或用Tomcat测试新代码而不用停止或重新启动Tomcat.要打开重载,把reloadable设为真即可.这虽花费时间但可检测所发生的变化;更重要的事,鉴于,在一个装载类对象装入一个新的servlet时,类装载触发器可能会掷出一些错误.为避免这些问题,你可以设置可重载为假,这将停止重载功能.</P>
<P><BR>　 </P>
<P>从另一个目录中启动Tomcat</P>
<P>作为缺省值将使用TOMCAT_HOME/conf/server.xml作为配置文件.缺省配置将使用TOMCT_HOME作为关系环境的基础.</P>
<P>使用 “-f/你的/目录/server.xml”选项你可改变这种情况,使用另一个服务器配置文件和设置关系环境管理器的目录属性你需要在主目录内设置以下几个文件:</P>
<P>Ø 一个 webapps/目录(如果你已生成) – 所有war文件奖杯界压倒此目录而且所有子目录将作为关系环境添加.</P>
<P>Ø conf/目录 - 你可保存一个特殊的web.xml文件和其他配置文件</P>
<P>Ø logs/ - 所有日志文件将代替TOMCAT_HOME/logs/纪录到此目录中</P>
<P>Ø work/ - 关系环境的工作目录</P>
<P>如server.xml中的ContextManager.home属性有关联,将关联到到当前工作目录.</P>
<P>web。xml</P>
<P>关于web。xml和web项目结构（包括目录服务及配置）的详细描述可在Servlet API Spec的第9，10，14章中找到。</P>
<P>然而有一个与Tomcat有关的小“特性“与web.xml有关。Tomcat可以让用户通过将缺省的web.xml放入conf目录中来定义所有关系环境的web.xml的缺省值.建立一个新的关系环境时,Tomcat使用缺省的web.xml文件作为基本设置和应用项目特定的web.xml(放在应用项目的WEB-INF/web.xml文件)来覆盖这些缺省值.</P>
<P>设置Tomcat与Apache Web 服务器</P>
<P>服务器</P>
<P>到现在为止,我们未讨论作为服务器扩展的Tomcat,只讨论了作为独立运行的服务器.但有一些问题需要说明:</P>
<P>1. 当处理静态页面时,Tomcat不如Apache迅速.</P>
<P>2. Tomcat不象Apache一样可配置.</P>
<P>3. Tomcat不象Apache一样强壮.</P>
<P>4. 有很多网站已在某一特定web server上投入了很长时间,例如,使用CGI脚本/Server API模组/perl/php…我们不能假设这些遗留下来的东西都会被丢弃.</P>
<P>基于以上原因,一个现实的网站建议使用一个Web服务器,如Apache,为网站的静态页面请求提供服务,并使用Tomcat作为一个Servlet/JSP插件.</P>
<P>我们不准备深入的讨论每个不同的配置,我们将:</P>
<P>1. 涵盖Web服务器的基本行为</P>
<P>2. 解释需要何种配置</P>
<P>3. 在Apache上的实例</P>
<P><BR>Web 服务器操作</P>
<P><BR>简单说来，web服务器总是等待来自客户端的HTTP请求。当请求到达时，服务器会提供一切必要的内容来满足此请求。加入一个Servlet容器某种程度上会改变此行为。但服务器仍需处理如下因素：</P>
<P>载入servlet容器接口库并初始化（处理请求之前）。</P>
<P>当收到一个请求时，检查是否属于某Servlet，如是，则接口库接收此请求并处理。</P>
<P>另一方面，接口库需要知道他将服务某种请求，通常是基于请求的URL的某种模式和将此请求导向何处。</P>
<P>当用户想要设置使用虚拟主机的配置时，事情会变得更加复杂，或者想多个开发者在一个服务器上进行开发但使用不同的Servlet容器的JVMs。以下我们将讨论这两个问题。</P>
<P><BR>必需进行的配置</P>
<P><BR>应该考虑的是最明显的配置是servlet URL具有对servlet容器中的servlet具有表示的责任。很明显，你必须知道传递什么到Servlet容器。我们仍需提供附加的配置项目到web-server或servlet-container的结合体中.</P>
<P>l 考虑到Tomcat进程是否可取得，我们仍需提供配置和Tomcat正在监听的TCP/IP 主机名/端口号。</P>
<P>l 需要告知web服务器接口库的位置（因此我们可以在起始时装入）</P>
<P>l 需要设置接口内部信息如将日志记录在何处和如何纪录，等等。</P>
<P>所有此类信息必须出现在web服务器配置里或被接口使用的私有配置文件中。下面将讲述如何在Apache中如何实现这些配置。</P>
<P><BR>Apache上的实现</P>
<P>这一部分演示如何配置Apache与Tomcat一起工作；并试图解释深入到可能会用到的配置规范。在jserv 安装页上可找到其他信息。<BR></P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 15:33 <a href="http://www.blogjava.net/qq13367612/articles/16103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat的类载入器 </title><link>http://www.blogjava.net/qq13367612/articles/16104.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16104.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16104.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16104.html</trackback:ping><description><![CDATA[<H3>1 - Tomcat的类载入器的结构 </H3>
<P>Tomcat Server在启动的时候将构造一个ClassLoader树，以保证模块的类库是私有的<BR>Tomcat Server的ClassLoader结构如下：<BR><TT><PRE>        +-----------------------------+
        |         Bootstrap           |
        |             |               |
        |          System             |
        |             |               |
        |          Common             |
        |         /      \            |
        |     Catalina  Shared        |
        |               /    \        |
        |          WebApp1  WebApp2   |
        +-----------------------------+
</PRE></TT><FONT face="宋体, MS Song">其中：<BR>- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar<BR>- System - 载入$CLASSPATH/*.class<BR>- Common - 载入$CATALINA_HOME/common/...，它们对TOMCAT和所有的WEB APP都可见<BR>- Catalina - 载入$CATALINA_HOME/server/...，它们仅对TOMCAT可见，对所有的WEB APP都不可见<BR>- Shared - 载入$CATALINA_HOME/shared/...，它们仅对所有WEB APP可见，对TOMCAT不可见（也不必见）<BR>- WebApp? - 载入ContextBase?/WEB-INF/...，它们仅对该WEB APP可见<BR></FONT>
<P></P>
<H3>2 - ClassLoader的工作原理 </H3>
<P>每个运行中的线程都有一个成员contextClassLoader，用来在运行时动态地载入其它类<BR>系统默认的contextClassLoader是systemClassLoader，所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类<BR>可以使用<TT>Thread.currentThread().setContextClassLoader(...);</TT>更改当前线程的contextClassLoader，来改变其载入类的行为<BR></P>
<P>ClassLoader被组织成树形，一般的工作原理是：<BR>1) 线程需要用到某个类，于是contextClassLoader被请求来载入该类<BR>2) contextClassLoader请求它的父ClassLoader来完成该载入请求<BR>3) 如果父ClassLoader无法载入类，则contextClassLoader试图自己来载入<BR></P>
<P><B>注意</B>：WebApp?ClassLoader的工作原理和上述有少许不同：<BR>它先试图自己载入类（在ContextBase?/WEB-INF/...中载入类），如果无法载入，再请求父ClassLoader完成<BR></P>
<P>由此可得：<BR>- 对于WEB APP线程，它的contextClassLoader是WebApp?ClassLoader<BR>- 对于Tomcat Server线程，它的contextClassLoader是CatalinaClassLoader<BR></P>
<H3>3 - 部分原代码分析 </H3><B>3.1 - org/apache/catalina/startup/Bootstrap.java </B>
<P>Tomcat Server线程的起点<BR>构造ClassLoader树，并设置Tomcat Server线程的contextClassLoader为catalinaloader<BR>载入若干类，然后转入org.apache.catalina.startup.Catalina类中<BR></P>
<P><A href="http://www.huihoo.org/apache/tomcat/heavyz/Bootstrap.java.html" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/src/Bootstrap.java.html">[查看代码]</A> </P><B>3.2 - org/apache/catalina/startup/ClassLoaderFactory.java </B>
<P>根据设置创建并返回StandardClassLoader的实例 </P>
<P><A href="http://www.huihoo.org/apache/tomcat/heavyz/ClassLoaderFactory.java.html" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/src/ClassLoaderFactory.java.html">[查看代码]</A> </P><B>3.3 - org/apache/catalina/loader/StandardClassLoader.java </B>
<P>类载入器 </P><B>3.4 - org/apache/catalina/startup/SecurityClassLoad.java </B>
<P>该类仅包含一个静态方法，用来为catalinaLoader载入一些类 </P>
<P><A href="http://www.huihoo.org/apache/tomcat/heavyz/SecurityClassLoad.java.html" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/src/SecurityClassLoad.java.html">[查看代码]</A> </P>
<H3>Appendix - 参考 </H3>
<P>[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文档Class Loader HOW-TO<BR></P><![CDATA[<H3>1 - Tomcat的类载入器的结构 </H3>
<P>Tomcat Server在启动的时候将构造一个ClassLoader树，以保证模块的类库是私有的<BR>Tomcat Server的ClassLoader结构如下：<BR><TT><PRE>        +-----------------------------+
        |         Bootstrap           |
        |             |               |
        |          System             |
        |             |               |
        |          Common             |
        |         /      \            |
        |     Catalina  Shared        |
        |               /    \        |
        |          WebApp1  WebApp2   |
        +-----------------------------+
</PRE></TT><FONT face="宋体, MS Song">其中：<BR>- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar<BR>- System - 载入$CLASSPATH/*.class<BR>- Common - 载入$CATALINA_HOME/common/...，它们对TOMCAT和所有的WEB APP都可见<BR>- Catalina - 载入$CATALINA_HOME/server/...，它们仅对TOMCAT可见，对所有的WEB APP都不可见<BR>- Shared - 载入$CATALINA_HOME/shared/...，它们仅对所有WEB APP可见，对TOMCAT不可见（也不必见）<BR>- WebApp? - 载入ContextBase?/WEB-INF/...，它们仅对该WEB APP可见<BR></FONT>
<P></P>
<H3>2 - ClassLoader的工作原理 </H3>
<P>每个运行中的线程都有一个成员contextClassLoader，用来在运行时动态地载入其它类<BR>系统默认的contextClassLoader是systemClassLoader，所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类<BR>可以使用<TT>Thread.currentThread().setContextClassLoader(...);</TT>更改当前线程的contextClassLoader，来改变其载入类的行为<BR></P>
<P>ClassLoader被组织成树形，一般的工作原理是：<BR>1) 线程需要用到某个类，于是contextClassLoader被请求来载入该类<BR>2) contextClassLoader请求它的父ClassLoader来完成该载入请求<BR>3) 如果父ClassLoader无法载入类，则contextClassLoader试图自己来载入<BR></P>
<P><B>注意</B>：WebApp?ClassLoader的工作原理和上述有少许不同：<BR>它先试图自己载入类（在ContextBase?/WEB-INF/...中载入类），如果无法载入，再请求父ClassLoader完成<BR></P>
<P>由此可得：<BR>- 对于WEB APP线程，它的contextClassLoader是WebApp?ClassLoader<BR>- 对于Tomcat Server线程，它的contextClassLoader是CatalinaClassLoader<BR></P>
<H3>3 - 部分原代码分析 </H3><B>3.1 - org/apache/catalina/startup/Bootstrap.java </B>
<P>Tomcat Server线程的起点<BR>构造ClassLoader树，并设置Tomcat Server线程的contextClassLoader为catalinaloader<BR>载入若干类，然后转入org.apache.catalina.startup.Catalina类中<BR></P>
<P><A href="http://www.huihoo.org/apache/tomcat/heavyz/Bootstrap.java.html" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/src/Bootstrap.java.html">[查看代码]</A> </P><B>3.2 - org/apache/catalina/startup/ClassLoaderFactory.java </B>
<P>根据设置创建并返回StandardClassLoader的实例 </P>
<P><A href="http://www.huihoo.org/apache/tomcat/heavyz/ClassLoaderFactory.java.html" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/src/ClassLoaderFactory.java.html">[查看代码]</A> </P><B>3.3 - org/apache/catalina/loader/StandardClassLoader.java </B>
<P>类载入器 </P><B>3.4 - org/apache/catalina/startup/SecurityClassLoad.java </B>
<P>该类仅包含一个静态方法，用来为catalinaLoader载入一些类 </P>
<P><A href="http://www.huihoo.org/apache/tomcat/heavyz/SecurityClassLoad.java.html" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/src/SecurityClassLoad.java.html">[查看代码]</A> </P>
<H3>Appendix - 参考 </H3>
<P>[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文档Class Loader HOW-TO<BR></P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 15:18 <a href="http://www.blogjava.net/qq13367612/articles/16104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat启动脚本catalina.sh </title><link>http://www.blogjava.net/qq13367612/articles/16105.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16105.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16105.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16105.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16105.html</trackback:ping><description><![CDATA[<H3>1 - 概述 </H3>
<P>脚本catalina.sh用于启动和关闭tomcat服务器，是最关键的脚本<BR>另外的脚本startup.sh和shutdown.sh都是使用不同的参数调用了该脚本<BR>该脚本的使用方法如下（引自该脚本本身）：<BR></P>
<P><TT><PRE>  echo "Usage: catalina.sh ( commands ... )"
  echo "commands:"
  echo "  debug             Start Catalina in a debugger"
  echo "  debug -security   Debug Catalina with a security manager"
  echo "  embedded          Start Catalina in embedded mode"
  echo "  jpda start        Start Catalina under JPDA debugger"
  echo "  run               Start Catalina in the current window"
  echo "  run -security     Start in the current window with security manager"
  echo "  start             Start Catalina in a separate window"
  echo "  start -security   Start in a separate window with security manager"
  echo "  stop              Stop Catalina"
</PRE></TT>
<P></P>
<H3>2 - 脚本分析 </H3>
<P><TT><PRE>#!/bin/sh

<FONT color=green>
# =============================================================
# 该脚本设置正确的环境变量和系统信息，然后启动或者停止tomcat server
# 具体的操作是：
# 使用命令行参数作为args的实参，调用org.apache.catalina.startup.Bootstrap.main(String[])
# ==============================================================
</FONT>
<FONT color=green>
# -----------------------------------------------------------------------------
# Start/Stop Script for the CATALINA Server
#
# Environment Variable Prequisites
#
#   CATALINA_HOME   May point at your Catalina "build" directory.
#
#   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
#                   of a Catalina installation.  If not present, resolves to
#                   the same directory that CATALINA_HOME points to.
#
#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
#                   "stop", or "run" command is executed.
#
#   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
#                   the JVM should use (java.io.tmpdir).  Defaults to
#                   $CATALINA_BASE/temp.
#
#   JAVA_HOME       Must point at your Java Development Kit installation.
#
#   JAVA_OPTS       (Optional) Java runtime options used when the "start",
#                   "stop", or "run" command is executed.
#
#   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
#                   command is executed. The default is "dt_socket".
#
#   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
#                   command is executed. The default is 8000.
#
#   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension
#                   (JSSE) installation, whose JAR files will be added to the
#                   system class path used to start Tomcat.
#
#   CATALINA_PID    (Optional) Path of the file which should contains the pid
#                   of catalina startup java process, when start (fork) is used
# -----------------------------------------------------------------------------
</FONT>

<FONT color=green>
# OS specific support.  $var _must_ be set to either true or false.
</FONT>
cygwin=false
case "`uname`" in
CYGWIN*) cygwin=true;;
esac

<FONT color=green>
# PRG是被执行的脚本的名称，可以认为PRG=="catalina.sh"，也可能是某个符号链，指向该脚本。
</FONT>
PRG="$0"

<FONT color=green>
# 处理了一下PRG，等循环跳出之后PRG成为 ????
</FONT>
while [ -h "$PRG" ]; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '.*/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done


<FONT color=green>
# PRGDIR是PRG的目录路径名称
</FONT>
PRGDIR=`dirname "$PRG"`

<FONT color=green>
# 执行$CATALINA_HOME/BIN/setenv.sh来设置环境变量
# [ -r filename ] 是判断是否文件存在且可读
</FONT>
CATALINA_HOME=`cd "$PRGDIR/.." ; pwd`
if [ -r "$CATALINA_HOME"/bin/setenv.sh ]; then
  . "$CATALINA_HOME"/bin/setenv.sh
fi


<FONT color=green>
# For Cygwin, 确保所有的路径名都符合UNIX格式
</FONT>
if $cygwin; then
  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
  [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
  [ -n "$JSSE_HOME" ] && JSSE_HOME=`cygpath --path --unix "$JSSE_HOME"`
fi

<FONT color=green>
# 设置用来初始化SystemClassLoader的CLASSPATH变量：通过执行脚本setclasspath.sh完成
# 注意：脚本setclasspath.sh改变了原来的$CLASSPATH变量，而把它设为：
# CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$JAVA_HOME/lib/tools.jar
# 其中bootstrap.jar是package org.apache.catalina.startup的打包文件，
# 含有启动方法org.apache.catalina.startup.Bootstrap.main(String[] args)
# tools.jar含有javac编译器，用来把jsp文件编译成为servlet class
</FONT>
if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
  BASEDIR="$CATALINA_HOME"
  . "$CATALINA_HOME"/bin/setclasspath.sh
else
  echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
  echo "This file is needed to run this program"
  exit 1
fi

<FONT color=green>
# 在CLASSPATH环境变量后面补上一些JAR文件
# [ -n string ] 判断字符串是否长度非0；[ -z string ] 判断字符串是否长度为0
# 它们可以用来判断是否某个环境变量已经被设置
</FONT>
if [ -n "$JSSE_HOME" ]; then
  CLASSPATH="$CLASSPATH":"$JSSE_HOME"/lib/jcert.jar:"$JSSE_HOME"/lib/jnet.jar:"$JSSE_HOME"/lib/jsse.jar
fi
CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar


<FONT color=green>
# 指定CATALINA_BASE变量
# 如果CATALINA_BASE没有值，就让CATALINA_BASE=$CATALINA_HOME
</FONT>

if [ -z "$CATALINA_BASE" ] ; then
  CATALINA_BASE="$CATALINA_HOME"
fi


<FONT color=green>
# 指定CATALINA_TMPDIR变量
# 如果CATALINA_TMPDIR没有值，就让CATALINA_TMPDIR=$CATALINA_BASE/temp
</FONT>
if [ -z "$CATALINA_TMPDIR" ] ; then
  # Define the java.io.tmpdir to use for Catalina
  CATALINA_TMPDIR="$CATALINA_BASE"/temp
fi

<FONT color=green>
# For Cygwin, 在执行java程序前把路径名转换成WINDOWS格式
</FONT>
if $cygwin; then
  JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  CATALINA_HOME=`cygpath --path --windows "$CATALINA_HOME"`
  CATALINA_BASE=`cygpath --path --windows "$CATALINA_BASE"`
  CATALINA_TMPDIR=`cygpath --path --windows "$CATALINA_TMPDIR"`
  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  JSSE_HOME=`cygpath --path --windows "$JSSE_HOME"`
fi


<FONT color=green>
# 显示信息，然后执行命令
echo "Using CATALINA_BASE:   $CATALINA_BASE"
echo "Using CATALINA_HOME:   $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
echo "Using JAVA_HOME:       $JAVA_HOME"
</FONT>

<FONT color=green>
# ......当执行catalina.sh的参数是jpda的时候......
</FONT>
if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="8000"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=n"
  fi
  CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
  shift
fi


<FONT color=green>
# ......当执行catalina.sh的参数是debug的时候......
</FONT>
if [ "$1" = "debug" ] ; then
  shift
  if [ "$1" = "-security" ] ; then
    echo "Using Security Manager"
    shift
    exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -sourcepath "$CATALINA_HOME"/../../jakarta-tomcat-4.0/catalina/src/share \
      -Djava.security.manager \
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
  else
    exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -sourcepath "$CATALINA_HOME"/../../jakarta-tomcat-4.0/catalina/src/share \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
  fi


<FONT color=green>
# ......当执行catalina.sh的参数是embedded的时候......
</FONT>
elif [ "$1" = "embedded" ] ; then
  shift
  echo "Embedded Classpath: $CLASSPATH"
  exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Embedded "$@"


<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数是run的时候......    |
# |  在当前窗口中启动tomcat服务器！！！                |
# +----------------------------------------------------+
</FONT>
elif [ "$1" = "run" ]; then
<FONT color=green>
  # 把参数run去掉
</FONT>
  shift
  
<FONT color=green>
  # 如果参数是run -security，则启动Security Manager
</FONT>
  if [ "$1" = "-security" ] ; then
    echo "Using Security Manager"
    shift
    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Djava.security.manager \
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
      
<FONT color=green>
  # 如果参数是孤单的run，则在本窗口中启动tomcat服务器
  # 在本窗口中启动的方法是使用exec，让当前进程fork一个新进程来启动tomcat，当前进程是tomcat的父进程
  # 启动tomcat的类是org.apache.catalina.startup.Bootstrap.main("start");
</FONT>
  else
    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
  fi

<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数是start的时候......  |
# |  在新窗口中启动tomcat服务器！！！                  |
# +----------------------------------------------------+
</FONT>
elif [ "$1" = "start" ] ; then
<FONT color=green>
  # 把参数start去掉
</FONT>
  shift
<FONT color=green>  
  # 创建一个文件（如果文件不存在的话）$CATALINA_BASE/logs/catalina.out  
</FONT>
  touch "$CATALINA_BASE"/logs/catalina.out
<FONT color=green>
  # 如果参数是start -security，则启动Security Manager
</FONT>
  if [ "$1" = "-security" ] ; then
    echo "Using Security Manager"
    shift
    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Djava.security.manager \
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

      if [ ! -z "$CATALINA_PID" ]; then
        echo $! > $CATALINA_PID
      fi
      
<FONT color=green>
  # 如果参数是孤单的start，那么在新窗口中启动tomcat
</FONT>
  else
    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

      if [ ! -z "$CATALINA_PID" ]; then
        echo $! > $CATALINA_PID
      fi      
  fi

<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数是stop的时候......   |
# |  关闭tomcat服务器！！！                            |
# +----------------------------------------------------+
</FONT>
elif [ "$1" = "stop" ] ; then
<FONT color=green>
  # 把参数stop去掉
</FONT>
  shift
  
<FONT color=green>
  # 关闭tomcat服务器的类是org.apache.catalina.startup.Bootstrap->main("stop");
  # 注意：java -D 是设置系统属性
</FONT>  
  exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap "$@" stop


<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数不可辨认的时候...... |
# |  打印帮助信息，由此查看各种参数代表的意义！！！    |
# +----------------------------------------------------+
</FONT>
else
  echo "Usage: catalina.sh ( commands ... )"
  echo "commands:"
  echo "  debug             Start Catalina in a debugger"
  echo "  debug -security   Debug Catalina with a security manager"
  echo "  embedded          Start Catalina in embedded mode"
  echo "  jpda start        Start Catalina under JPDA debugger"
  echo "  run               Start Catalina in the current window"
  echo "  run -security     Start in the current window with security manager"
  echo "  start             Start Catalina in a separate window"
  echo "  start -security   Start in a separate window with security manager"
  echo "  stop              Stop Catalina"
  exit 1

fi
</PRE></TT><![CDATA[<H3>1 - 概述 </H3>
<P>脚本catalina.sh用于启动和关闭tomcat服务器，是最关键的脚本<BR>另外的脚本startup.sh和shutdown.sh都是使用不同的参数调用了该脚本<BR>该脚本的使用方法如下（引自该脚本本身）：<BR></P>
<P><TT><PRE>  echo "Usage: catalina.sh ( commands ... )"
  echo "commands:"
  echo "  debug             Start Catalina in a debugger"
  echo "  debug -security   Debug Catalina with a security manager"
  echo "  embedded          Start Catalina in embedded mode"
  echo "  jpda start        Start Catalina under JPDA debugger"
  echo "  run               Start Catalina in the current window"
  echo "  run -security     Start in the current window with security manager"
  echo "  start             Start Catalina in a separate window"
  echo "  start -security   Start in a separate window with security manager"
  echo "  stop              Stop Catalina"
</PRE></TT>
<P></P>
<H3>2 - 脚本分析 </H3>
<P><TT><PRE>#!/bin/sh

<FONT color=green>
# =============================================================
# 该脚本设置正确的环境变量和系统信息，然后启动或者停止tomcat server
# 具体的操作是：
# 使用命令行参数作为args的实参，调用org.apache.catalina.startup.Bootstrap.main(String[])
# ==============================================================
</FONT>
<FONT color=green>
# -----------------------------------------------------------------------------
# Start/Stop Script for the CATALINA Server
#
# Environment Variable Prequisites
#
#   CATALINA_HOME   May point at your Catalina "build" directory.
#
#   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
#                   of a Catalina installation.  If not present, resolves to
#                   the same directory that CATALINA_HOME points to.
#
#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
#                   "stop", or "run" command is executed.
#
#   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
#                   the JVM should use (java.io.tmpdir).  Defaults to
#                   $CATALINA_BASE/temp.
#
#   JAVA_HOME       Must point at your Java Development Kit installation.
#
#   JAVA_OPTS       (Optional) Java runtime options used when the "start",
#                   "stop", or "run" command is executed.
#
#   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
#                   command is executed. The default is "dt_socket".
#
#   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
#                   command is executed. The default is 8000.
#
#   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension
#                   (JSSE) installation, whose JAR files will be added to the
#                   system class path used to start Tomcat.
#
#   CATALINA_PID    (Optional) Path of the file which should contains the pid
#                   of catalina startup java process, when start (fork) is used
# -----------------------------------------------------------------------------
</FONT>

<FONT color=green>
# OS specific support.  $var _must_ be set to either true or false.
</FONT>
cygwin=false
case "`uname`" in
CYGWIN*) cygwin=true;;
esac

<FONT color=green>
# PRG是被执行的脚本的名称，可以认为PRG=="catalina.sh"，也可能是某个符号链，指向该脚本。
</FONT>
PRG="$0"

<FONT color=green>
# 处理了一下PRG，等循环跳出之后PRG成为 ????
</FONT>
while [ -h "$PRG" ]; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '.*/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done


<FONT color=green>
# PRGDIR是PRG的目录路径名称
</FONT>
PRGDIR=`dirname "$PRG"`

<FONT color=green>
# 执行$CATALINA_HOME/BIN/setenv.sh来设置环境变量
# [ -r filename ] 是判断是否文件存在且可读
</FONT>
CATALINA_HOME=`cd "$PRGDIR/.." ; pwd`
if [ -r "$CATALINA_HOME"/bin/setenv.sh ]; then
  . "$CATALINA_HOME"/bin/setenv.sh
fi


<FONT color=green>
# For Cygwin, 确保所有的路径名都符合UNIX格式
</FONT>
if $cygwin; then
  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
  [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
  [ -n "$JSSE_HOME" ] && JSSE_HOME=`cygpath --path --unix "$JSSE_HOME"`
fi

<FONT color=green>
# 设置用来初始化SystemClassLoader的CLASSPATH变量：通过执行脚本setclasspath.sh完成
# 注意：脚本setclasspath.sh改变了原来的$CLASSPATH变量，而把它设为：
# CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$JAVA_HOME/lib/tools.jar
# 其中bootstrap.jar是package org.apache.catalina.startup的打包文件，
# 含有启动方法org.apache.catalina.startup.Bootstrap.main(String[] args)
# tools.jar含有javac编译器，用来把jsp文件编译成为servlet class
</FONT>
if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
  BASEDIR="$CATALINA_HOME"
  . "$CATALINA_HOME"/bin/setclasspath.sh
else
  echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
  echo "This file is needed to run this program"
  exit 1
fi

<FONT color=green>
# 在CLASSPATH环境变量后面补上一些JAR文件
# [ -n string ] 判断字符串是否长度非0；[ -z string ] 判断字符串是否长度为0
# 它们可以用来判断是否某个环境变量已经被设置
</FONT>
if [ -n "$JSSE_HOME" ]; then
  CLASSPATH="$CLASSPATH":"$JSSE_HOME"/lib/jcert.jar:"$JSSE_HOME"/lib/jnet.jar:"$JSSE_HOME"/lib/jsse.jar
fi
CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar


<FONT color=green>
# 指定CATALINA_BASE变量
# 如果CATALINA_BASE没有值，就让CATALINA_BASE=$CATALINA_HOME
</FONT>

if [ -z "$CATALINA_BASE" ] ; then
  CATALINA_BASE="$CATALINA_HOME"
fi


<FONT color=green>
# 指定CATALINA_TMPDIR变量
# 如果CATALINA_TMPDIR没有值，就让CATALINA_TMPDIR=$CATALINA_BASE/temp
</FONT>
if [ -z "$CATALINA_TMPDIR" ] ; then
  # Define the java.io.tmpdir to use for Catalina
  CATALINA_TMPDIR="$CATALINA_BASE"/temp
fi

<FONT color=green>
# For Cygwin, 在执行java程序前把路径名转换成WINDOWS格式
</FONT>
if $cygwin; then
  JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  CATALINA_HOME=`cygpath --path --windows "$CATALINA_HOME"`
  CATALINA_BASE=`cygpath --path --windows "$CATALINA_BASE"`
  CATALINA_TMPDIR=`cygpath --path --windows "$CATALINA_TMPDIR"`
  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  JSSE_HOME=`cygpath --path --windows "$JSSE_HOME"`
fi


<FONT color=green>
# 显示信息，然后执行命令
echo "Using CATALINA_BASE:   $CATALINA_BASE"
echo "Using CATALINA_HOME:   $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
echo "Using JAVA_HOME:       $JAVA_HOME"
</FONT>

<FONT color=green>
# ......当执行catalina.sh的参数是jpda的时候......
</FONT>
if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="8000"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=n"
  fi
  CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
  shift
fi


<FONT color=green>
# ......当执行catalina.sh的参数是debug的时候......
</FONT>
if [ "$1" = "debug" ] ; then
  shift
  if [ "$1" = "-security" ] ; then
    echo "Using Security Manager"
    shift
    exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -sourcepath "$CATALINA_HOME"/../../jakarta-tomcat-4.0/catalina/src/share \
      -Djava.security.manager \
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
  else
    exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -sourcepath "$CATALINA_HOME"/../../jakarta-tomcat-4.0/catalina/src/share \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
  fi


<FONT color=green>
# ......当执行catalina.sh的参数是embedded的时候......
</FONT>
elif [ "$1" = "embedded" ] ; then
  shift
  echo "Embedded Classpath: $CLASSPATH"
  exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Embedded "$@"


<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数是run的时候......    |
# |  在当前窗口中启动tomcat服务器！！！                |
# +----------------------------------------------------+
</FONT>
elif [ "$1" = "run" ]; then
<FONT color=green>
  # 把参数run去掉
</FONT>
  shift
  
<FONT color=green>
  # 如果参数是run -security，则启动Security Manager
</FONT>
  if [ "$1" = "-security" ] ; then
    echo "Using Security Manager"
    shift
    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Djava.security.manager \
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
      
<FONT color=green>
  # 如果参数是孤单的run，则在本窗口中启动tomcat服务器
  # 在本窗口中启动的方法是使用exec，让当前进程fork一个新进程来启动tomcat，当前进程是tomcat的父进程
  # 启动tomcat的类是org.apache.catalina.startup.Bootstrap.main("start");
</FONT>
  else
    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start
  fi

<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数是start的时候......  |
# |  在新窗口中启动tomcat服务器！！！                  |
# +----------------------------------------------------+
</FONT>
elif [ "$1" = "start" ] ; then
<FONT color=green>
  # 把参数start去掉
</FONT>
  shift
<FONT color=green>  
  # 创建一个文件（如果文件不存在的话）$CATALINA_BASE/logs/catalina.out  
</FONT>
  touch "$CATALINA_BASE"/logs/catalina.out
<FONT color=green>
  # 如果参数是start -security，则启动Security Manager
</FONT>
  if [ "$1" = "-security" ] ; then
    echo "Using Security Manager"
    shift
    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Djava.security.manager \
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

      if [ ! -z "$CATALINA_PID" ]; then
        echo $! > $CATALINA_PID
      fi
      
<FONT color=green>
  # 如果参数是孤单的start，那么在新窗口中启动tomcat
</FONT>
  else
    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
      -Dcatalina.base="$CATALINA_BASE" \
      -Dcatalina.home="$CATALINA_HOME" \
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

      if [ ! -z "$CATALINA_PID" ]; then
        echo $! > $CATALINA_PID
      fi      
  fi

<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数是stop的时候......   |
# |  关闭tomcat服务器！！！                            |
# +----------------------------------------------------+
</FONT>
elif [ "$1" = "stop" ] ; then
<FONT color=green>
  # 把参数stop去掉
</FONT>
  shift
  
<FONT color=green>
  # 关闭tomcat服务器的类是org.apache.catalina.startup.Bootstrap->main("stop");
  # 注意：java -D 是设置系统属性
</FONT>  
  exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap "$@" stop


<FONT color=green>
# +----------------------------------------------------+
# |  ......当执行catalina.sh的参数不可辨认的时候...... |
# |  打印帮助信息，由此查看各种参数代表的意义！！！    |
# +----------------------------------------------------+
</FONT>
else
  echo "Usage: catalina.sh ( commands ... )"
  echo "commands:"
  echo "  debug             Start Catalina in a debugger"
  echo "  debug -security   Debug Catalina with a security manager"
  echo "  embedded          Start Catalina in embedded mode"
  echo "  jpda start        Start Catalina under JPDA debugger"
  echo "  run               Start Catalina in the current window"
  echo "  run -security     Start in the current window with security manager"
  echo "  start             Start Catalina in a separate window"
  echo "  start -security   Start in a separate window with security manager"
  echo "  stop              Stop Catalina"
  exit 1

fi
</PRE></TT>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-09-20 15:09 <a href="http://www.blogjava.net/qq13367612/articles/16105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat启动分析</title><link>http://www.blogjava.net/qq13367612/articles/16126.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 20 Sep 2005 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16126.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16126.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16126.html</trackback:ping><description><![CDATA[<H3>1 - Tomcat Server的组成部分 </H3>
<P><B>1.1 - Server </B></P>
<P>A Server element represents the entire Catalina servlet container. (Singleton) </P>
<P><B>1.2 - Service </B></P>
<P>A Service element represents the combination of one or more Connector components that share a single Engine<BR>Service是这样一个集合：它由一个或者多个Connector组成，以及一个Engine，负责处理所有Connector所获得的客户请求<BR></P>
<P><B>1.3 - Connector </B></P>
<P>一个Connector将在某个指定端口上侦听客户请求，并将获得的请求交给Engine来处理，从Engine处获得回应并返回客户<BR>TOMCAT有两个典型的Connector，一个直接侦听来自browser的http请求，一个侦听来自其它WebServer的请求<BR>Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求<BR>Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求<BR></P>
<P><B>1.4 - Engine </B></P>
<P>The Engine element represents the entire request processing machinery associated with a particular Service<BR>It receives and processes all requests from one or more Connectors<BR>and returns the completed response to the Connector for ultimate transmission back to the client<BR>Engine下可以配置多个虚拟主机Virtual Host，每个虚拟主机都有一个域名<BR>当Engine获得一个请求时，它把该请求匹配到某个Host上，然后把该请求交给该Host来处理<BR>Engine有一个默认虚拟主机，当请求无法匹配到任何一个Host上的时候，将交给该默认Host来处理<BR></P>
<P><B>1.5 - Host </B>
<P>
<P>代表一个Virtual Host，虚拟主机，每个虚拟主机和某个网络域名Domain Name相匹配<BR>每个虚拟主机下都可以部署(deploy)一个或者多个Web App，每个Web App对应于一个Context，有一个Context path<BR>当Host获得一个请求时，将把该请求匹配到某个Context上，然后把该请求交给该Context来处理<BR>匹配的方法是“最长匹配”，所以一个path==""的Context将成为该Host的默认Context<BR>所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配<BR></P>
<P><B>1.6 - Context </B></P>
<P>一个Context对应于一个Web Application，一个Web Application由一个或者多个Servlet组成<BR>Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类<BR>当Context获得请求时，将在自己的映射表(mapping table)中寻找相匹配的Servlet类<BR>如果找到，则执行该类，获得请求的回应，并返回<BR></P>
<H3>2 - Tomcat Server的结构图 </H3>
<P><IMG src="http://www.huihoo.org/apache/tomcat/heavyz/01-startup.gif" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/01-startup.gif"> </P>
<H3>3 - 配置文件$CATALINA_HOME/conf/server.xml的说明 </H3>
<P>该文件描述了如何启动Tomcat Server </P>
<P><TT><PRE><FONT color=green>
<!----------------------------------------------------------------------------------------------->
</FONT>

<FONT color=green>
<!-- 启动Server
     在端口8005处等待关闭命令
     如果接受到"SHUTDOWN"字符串则关闭服务器
     -->
</FONT>
<Server port="8005" shutdown="SHUTDOWN" debug="0">

<FONT color=green>
  <!-- Listener ???
       目前没有看到这里
       -->
</FONT>
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>

<FONT color=green>
  <!-- Global JNDI resources ???
       目前没有看到这里，先略去
       -->
</FONT>
  <GlobalNamingResources>
    ... ... ... ...
  </GlobalNamingResources>

<FONT color=green>
  <!-- Tomcat的Standalone Service
       Service是一组Connector的集合
       它们共用一个Engine来处理所有Connector收到的请求
       -->
</FONT>
  <Service name="Tomcat-Standalone">

<FONT color=green>
    <!-- Coyote HTTP/1.1 Connector
         className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
         port : 在端口号8080处侦听来自客户browser的HTTP1.1请求
         minProcessors : 该Connector先创建5个线程等待客户请求，每个请求由一个线程负责
         maxProcessors : 当现有的线程不够服务客户请求时，若线程总数不足75个，则创建新线程来处理请求
         acceptCount : 当现有线程已经达到最大数75时，为客户请求排队
                       当队列中请求数超过100时，后来的请求返回Connection refused错误
         redirectport : 当客户请求是https时，把该请求转发到端口8443去
         其它属性略
         -->
</FONT>
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" 
               port="8080" 
               minProcessors="5" maxProcessors="75" acceptCount="100" 
               enableLookups="true" 
               redirectPort="8443" 
               debug="0" 
               connectionTimeout="20000" 
               useURIValidationHack="false" 
               disableUploadTimeout="true" />

<FONT color=green>
    <!-- Engine用来处理Connector收到的Http请求
         它将匹配请求和自己的虚拟主机，并把请求转交给对应的Host来处理
         默认虚拟主机是localhost
         -->
</FONT>
    <Engine name="Standalone" defaultHost="localhost" debug="0">
    
<FONT color=green>
      <!-- 日志类，目前没有看到，略去先 -->
</FONT>
      <Logger className="org.apache.catalina.logger.FileLogger" .../>
<FONT color=green>
      <!-- Realm，目前没有看到，略去先 -->
</FONT>
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>

<FONT color=green>
      <!-- 虚拟主机localhost
           appBase : 该虚拟主机的根目录是webapps/
           它将匹配请求和自己的Context的路径，并把请求转交给对应的Context来处理
           -->
</FONT>
      <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
      
<FONT color=green>
        <!-- 日志类，目前没有看到，略去先 -->
</FONT>
        <Logger className="org.apache.catalina.logger.FileLogger" .../>
      
<FONT color=green>
        <!-- Context，对应于一个Web App
             path : 该Context的路径名是""，故该Context是该Host的默认Context
             docBase : 该Context的根目录是webapps/mycontext/
             -->
</FONT>
        <Context path="" docBase="mycontext" debug="0"/>
        
<FONT color=green>
        <!-- 另外一个Context，路径名是/wsota -->
</FONT>
        <Context path="/wsota" docBase="wsotaProject" debug="0"/>
             
        
      </Host>
      
    </Engine>

  </Service>

</Server>

<FONT color=green>
<!----------------------------------------------------------------------------------------------->
</FONT>
</PRE></TT>
<P></P>
<H3>4 - Context的部署配置文件web.xml的说明 </H3>
<P>一个Context对应于一个Web App，每个Web App是由一个或者多个servlet组成的<BR>当一个Web App被初始化的时候，它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类<BR>它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类<BR>然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类<BR>web.xml文件有两部分：servlet类定义和servlet映射定义<BR>每个被载入的servlet类都有一个名字，且被填入该Context的映射表(mapping table)中，和某种URL PATTERN对应<BR>当该Context获得请求时，将查询mapping table，找到被请求的servlet，并执行以获得请求回应<BR></P>
<P>分析一下所有的Context共享的web.xml文件，在其中定义的servlet被所有的Web App载入<BR></P>
<P><TT><PRE><FONT color=green>
<!----------------------------------------------------------------------------------------------->
</FONT>

<web-app>

<FONT color=green>
  <!-- 概述：
       该文件是所有的WEB APP共用的部署配置文件，
       每当一个WEB A