﻿<?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 APP被DEPLOY，该文件都将先被处理，然后才是WEB APP自己的/WEB-INF/web.xml
       -->
</FONT>

<FONT color=green>
  <!--  +-------------------------+  -->
  <!--  |    servlet类定义部分    |  -->
  <!--  +-------------------------+  -->
</FONT>
  
<FONT color=green>
  <!-- DefaultServlet
       当用户的HTTP请求无法匹配任何一个servlet的时候，该servlet被执行
       URL PATTERN MAPPING : /
       -->
</FONT>
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

<FONT color=green>
  <!-- InvokerServlet
       处理一个WEB APP中的匿名servlet
       当一个servlet被编写并编译放入/WEB-INF/classes/中，却没有在/WEB-INF/web.xml中定义的时候
       该servlet被调用，把匿名servlet映射成/servlet/ClassName的形式
       URL PATTERN MAPPING : /servlet/*
       -->
</FONT>
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

<FONT color=green>
  <!-- JspServlet
       当请求的是一个JSP页面的时候（*.jsp）该servlet被调用
       它是一个JSP编译器，将请求的JSP页面编译成为servlet再执行
       URL PATTERN MAPPING : *.jsp
       -->
</FONT>
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>logVerbosityLevel</param-name>
            <param-value>WARNING</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>


<FONT color=green>
  <!--  +---------------------------+  -->
  <!--  |    servlet映射定义部分    |  -->
  <!--  +---------------------------+  -->
</FONT>
    
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

<FONT color=green>
  <!--  +------------------------+  -->
  <!--  |    其它部分，略去先    |  -->
  <!--  +------------------------+  -->
</FONT>
    ... ... ... ...

</web-app>

<FONT color=green>
<!----------------------------------------------------------------------------------------------->
</FONT>
</PRE></TT>
<P></P>
<H3>5 - Tomcat Server处理一个http请求的过程 </H3>
<P>假设来自客户的请求为：<BR>http://localhost:8080/wsota/wsota_index.jsp<BR></P>
<P>1) 请求被发送到本机端口8080，被在那里侦听的Coyote HTTP/1.1 Connector获得<BR>2) Connector把该请求交给它所在的Service的Engine来处理，并等待来自Engine的回应<BR>3) Engine获得请求localhost/wsota/wsota_index.jsp，匹配它所拥有的所有虚拟主机Host<BR>4) Engine匹配到名为localhost的Host（即使匹配不到也把请求交给该Host处理，因为该Host被定义为该Engine的默认主机）<BR>5) localhost Host获得请求/wsota/wsota_index.jsp，匹配它所拥有的所有Context<BR>6) Host匹配到路径为/wsota的Context（如果匹配不到就把该请求交给路径名为""的Context去处理）<BR>7) path="/wsota"的Context获得请求/wsota_index.jsp，在它的mapping table中寻找对应的servlet<BR>8) Context匹配到URL PATTERN为*.jsp的servlet，对应于JspServlet类<BR>9) 构造HttpServletRequest对象和HttpServletResponse对象，作为参数调用JspServlet的doGet或doPost方法<BR>10)Context把执行完了之后的HttpServletResponse对象返回给Host<BR>11)Host把HttpServletResponse对象返回给Engine<BR>12)Engine把HttpServletResponse对象返回给Connector<BR>13)Connector把HttpServletResponse对象返回给客户browser<BR></P><![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 APP被DEPLOY，该文件都将先被处理，然后才是WEB APP自己的/WEB-INF/web.xml
       -->
</FONT>

<FONT color=green>
  <!--  +-------------------------+  -->
  <!--  |    servlet类定义部分    |  -->
  <!--  +-------------------------+  -->
</FONT>
  
<FONT color=green>
  <!-- DefaultServlet
       当用户的HTTP请求无法匹配任何一个servlet的时候，该servlet被执行
       URL PATTERN MAPPING : /
       -->
</FONT>
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

<FONT color=green>
  <!-- InvokerServlet
       处理一个WEB APP中的匿名servlet
       当一个servlet被编写并编译放入/WEB-INF/classes/中，却没有在/WEB-INF/web.xml中定义的时候
       该servlet被调用，把匿名servlet映射成/servlet/ClassName的形式
       URL PATTERN MAPPING : /servlet/*
       -->
</FONT>
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

<FONT color=green>
  <!-- JspServlet
       当请求的是一个JSP页面的时候（*.jsp）该servlet被调用
       它是一个JSP编译器，将请求的JSP页面编译成为servlet再执行
       URL PATTERN MAPPING : *.jsp
       -->
</FONT>
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>logVerbosityLevel</param-name>
            <param-value>WARNING</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>


<FONT color=green>
  <!--  +---------------------------+  -->
  <!--  |    servlet映射定义部分    |  -->
  <!--  +---------------------------+  -->
</FONT>
    
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

<FONT color=green>
  <!--  +------------------------+  -->
  <!--  |    其它部分，略去先    |  -->
  <!--  +------------------------+  -->
</FONT>
    ... ... ... ...

</web-app>

<FONT color=green>
<!----------------------------------------------------------------------------------------------->
</FONT>
</PRE></TT>
<P></P>
<H3>5 - Tomcat Server处理一个http请求的过程 </H3>
<P>假设来自客户的请求为：<BR>http://localhost:8080/wsota/wsota_index.jsp<BR></P>
<P>1) 请求被发送到本机端口8080，被在那里侦听的Coyote HTTP/1.1 Connector获得<BR>2) Connector把该请求交给它所在的Service的Engine来处理，并等待来自Engine的回应<BR>3) Engine获得请求localhost/wsota/wsota_index.jsp，匹配它所拥有的所有虚拟主机Host<BR>4) Engine匹配到名为localhost的Host（即使匹配不到也把请求交给该Host处理，因为该Host被定义为该Engine的默认主机）<BR>5) localhost Host获得请求/wsota/wsota_index.jsp，匹配它所拥有的所有Context<BR>6) Host匹配到路径为/wsota的Context（如果匹配不到就把该请求交给路径名为""的Context去处理）<BR>7) path="/wsota"的Context获得请求/wsota_index.jsp，在它的mapping table中寻找对应的servlet<BR>8) Context匹配到URL PATTERN为*.jsp的servlet，对应于JspServlet类<BR>9) 构造HttpServletRequest对象和HttpServletResponse对象，作为参数调用JspServlet的doGet或doPost方法<BR>10)Context把执行完了之后的HttpServletResponse对象返回给Host<BR>11)Host把HttpServletResponse对象返回给Engine<BR>12)Engine把HttpServletResponse对象返回给Connector<BR>13)Connector把HttpServletResponse对象返回给客户browser<BR></P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16126.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:06 <a href="http://www.blogjava.net/qq13367612/articles/16126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat下中文的彻底解决</title><link>http://www.blogjava.net/qq13367612/articles/16135.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Mon, 19 Sep 2005 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16135.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16135.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16135.html</trackback:ping><description><![CDATA[这些天开发一个项目，服务器是tomcat,操作系统是xp,采用的是MVC架构，模式是采用Facade模式，总是出现乱码，自己也解决了好多天，同事也帮忙解决，也参考了网上众多网友的文章和意见，总算是搞定。但是好记性不如烂笔杆，所以特意记下，以防止自己遗忘，同时也给那些遇到同样问题的人提供一个好的参考途径：<BR>(一)    JSP页面上是中文，但是看的是后是乱码：<BR>解决的办法就是在JSP页面的编码的地方<%@ page language="java" contentType="text/html;charset=GBK" %>，因为Jsp转成Java文件时的编码问题，默认的话有的服务器是ISO-8859-1，如果一个JSP中直接输入了中文，Jsp把它当作ISO8859-1来处理是肯定有问题的，这一点，我们可以通过查看Jasper所生成的Java中间文件来确认<BR>(二)    当用Request对象获取客户提交的汉字代码的时候，会出现乱码：<BR>解决的办法是：要配置一个filter,也就是一个Servelet的过滤器，代码如下：<BR>import java.io.IOException;<BR>import javax.servlet.Filter;<BR>import javax.servlet.FilterChain;<BR>import javax.servlet.FilterConfig;<BR>import javax.servlet.ServletException;<BR>import javax.servlet.ServletRequest;<BR>import javax.servlet.ServletResponse;<BR>import javax.servlet.UnavailableException;<BR><BR>/**<BR> * Example filter that sets the character encoding to be used in parsing the<BR> * incoming request<BR> */<BR>public class SetCharacterEncodingFilter implements Filter {<BR><BR>    /**<BR>     * Take this filter out of service.<BR>     */<BR>    public void destroy() {<BR>    }<BR>    /**<BR>     * Select and set (if specified) the character encoding to be used to<BR>     * interpret request parameters for this request.<BR>     */<BR>    public void doFilter(ServletRequest request, ServletResponse response,<BR>    FilterChain chain)throws IOException, ServletException {<BR><BR>    request.setCharacterEncoding("GBK");<BR><BR>    // 传递控制到下一个过滤器<BR>    chain.doFilter(request, response);<BR>    }<BR><BR>    public void init(FilterConfig filterConfig) throws ServletException {<BR>    }<BR>}<BR>配置web.xml<BR><filter><BR><filter-name>Set Character Encoding</filter-name><BR><filter-class>SetCharacterEncodingFilter</filter-class><BR></filter><BR><filter-mapping><BR><filter-name>Set Character Encoding</filter-name><BR><url-pattern>/*</url-pattern><BR></filter-mapping><BR>如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况，你的Form提交的数据是不是用get提交的，一般来说用post提交的话是没有问题的，如果是的话，你就看看第四中解决的办法。<BR>还有就是对含有汉字字符的信息进行处理，处理的代码是：<BR>package dbJavaBean;<BR><BR>public class CodingConvert<BR>{   <BR> public CodingConvert()<BR> {<BR>  //<BR> }<BR> public String toGb(String uniStr){<BR>     String gbStr = "";<BR>     if(uniStr == null){<BR>   uniStr = "";<BR>     }<BR>     try{<BR>   byte[] tempByte = uniStr.getBytes("ISO8859_1");<BR>   gbStr = new String(tempByte,"GB2312");<BR>     }<BR>  catch(Exception ex){<BR>    }<BR>     return gbStr;<BR> }<BR>   <BR> public String toUni(String gbStr){<BR>     String uniStr = "";<BR>     if(gbStr == null){<BR>   gbStr = "";<BR>     }<BR>     try{<BR>   byte[] tempByte = gbStr.getBytes("GB2312");<BR>   uniStr = new String(tempByte,"ISO8859_1");<BR>     }catch(Exception ex){<BR>    }<BR>    return uniStr;<BR> }<BR>}<BR>你也可以在直接的转换，首先你将获取的字符串用ISO-8859-1进行编码，然后将这个编码存放到一个字节数组中，然后将这个数组转化成字符串对象就可以了，例如：<BR>String str=request.getParameter(“girl”);<BR>Byte B[]=str.getBytes(“ISO-8859-1”);<BR>Str=new String(B);<BR>通过上述转换的话，提交的任何信息都能正确的显示。<BR>(三)    在Formget请求在服务端用request. getParameter(“name”)时返回的是乱码；按tomcat的做法设置Filter也没有用或者用request.setCharacterEncoding("GBK");也不管用问题是出在处理参数传递的方法上：如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)方法进行处理的话前面即使是写了：<BR>request.setCharacterEncoding("GBK");<BR>response.setContentType("text/html;charset=GBK");<BR>也是不起作用的，返回的中文还是乱码！！！如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。<BR>同样，在用两个JSP页面处理表单输入之所以能显示中文是因为用的是post方法传递的，改成get方法依旧不行。<BR>由此可见在servlet中用doGet()方法或是在JSP中用get方法进行处理要注意。这毕竟涉及到要通过浏览器传递参数信息，很有可能引起常用字符集的冲突或是不匹配。<BR>解决的办法是：<BR>1) 打开tomcat的server.xml文件，找到区块，加入如下一行： <BR>URIEncoding=”GBK” <BR>完整的应如下： <BR><Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/> <BR><BR>2)重启tomcat,一切OK。<BR>需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了。需要注意的是：这个地方如果你要是用UTF-8的时候在传递的过程中在Tomcat中也是要出现乱码的情况，如果不行的话就换别的字符集。<BR><BR>(四)    JSP页面上有中文，按钮上面也有中文，但是通过服务器查看页面的时候出现乱码：<BR>     解决的办法是：首先在JSP文件中不应该直接包含本地化的消息文本，而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本放到Application.properties文件中，这个文件放在WEB-INF/classes/*下，例如我在页面里有姓名，年龄两个label,我首先就是要建一个Application.properties，里面的内容应该是name=”姓名” age=”年龄”,然后我把这个文件放到WEB-INF/classes/properties/下，接下来根据Application.properties文件，对他进行编码转化，创建一个中文资源文件，假定名字是Application_cn.properties。在JDK中提供了native2ascii命令，他能够实现字符编码的转换。在DOS环境中找到你放置Application.properties的这个文件的目录，在DOS环境中执行一下命令，将生成按GBK编码的中文资源文件Application_cn.properties：native2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命令以后将生成如下内容的Application_cn.properties文件：name=\u59d3\u540d age=\u5e74\u9f84,在Struts-config.xml中配置：<message-resources parameter="properties.Application_cn"/>。到这一步，基本上完成了一大半，接着你就要在JSP页面上写<%@ page language="java" contentType="text/html;charset=GBK" %>,到名字的那个label是要写<bean:message key=”name”>,这样的化在页面上出现的时候就会出现中文的姓名，年龄这个也是一样，按钮上汉字的处理也是同样的。<BR>(五)    写入到数据库是乱码：<BR>解决的方法：要配置一个filter,也就是一个Servelet的过滤器，代码如同第二种时候一样。<BR>如果你是通过JDBC直接链接数据库的时候，配置的代码如下：jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK，这样保证到数据库中的代码是不是乱码。<BR>如果你是通过数据源链接的化你不能按照这样的写法了，首先你就要写在配置文件中，在tomcat 5.0.19中配置数据源的地方是在C:\Tomcat 5.0\conf\Catalina\localhost这个下面，我建立的工程是workshop，放置的目录是webapp下面,workshop.xml的配置文件如下：<BR><!-- insert this Context element into server.xml --><BR><BR><Context path="/workshop" docBase="workshop" debug="0"<BR>reloadable="true" ><BR><BR>  <Resource name="jdbc/WorkshopDB"<BR>               auth="Container"<BR>               type="javax.sql.DataSource" /><BR><BR>  <ResourceParams name="jdbc/WorkshopDB"><BR>    <parameter><BR>      <name>factory</name><BR>      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value><BR>    </parameter><BR>    <parameter><BR>      <name>maxActive</name><BR>      <value>100</value><BR>    </parameter><BR>    <parameter><BR>      <name>maxIdle</name><BR>      <value>30</value><BR>    </parameter><BR><BR>    <BR>    <parameter><BR>      <name>maxWait</name><BR>      <value>10000</value><BR>    </parameter><BR><BR>      <parameter><BR>     <name>username</name><BR>     <value>root</value><BR>    </parameter><BR>    <parameter><BR>     <name>password</name><BR>     <value></value><BR>    </parameter><BR><BR>    <!-- Class name for mm.mysql JDBC driver --><BR>    <parameter><BR>       <name>driverClassName</name><BR>       <value>com.mysql.jdbc.Driver</value><BR></parameter><BR>   <parameter><BR>      <name>url</name><BR> <value><![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK]]&gt;</value><BR>    </parameter><BR>  </ResourceParams><BR><BR></Context><BR>粗体的地方要特别的注意，和JDBC直接链接的时候是有区别的，如果你是配置正确的化，当你输入中文的时候到数据库中就是中文了，有一点要注意的是你在显示数据的页面也是要用<%@ page language="java" contentType="text/html;charset=GBK" %>这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的，写了一个Form的时候把他改成了一个jsp，这样有一个地方要注意了，那就是在Dreamver中Action的提交方式是request的，你需要把他该过来，因为在jsp的提交的过程中紧紧就是POST和GET两种方式，但是这两种方式提交的代码在编码方面还是有很大不同的，这个在后面的地方进行说明。3<BR><BR>以上就是我在开发系统中解决中文的问题，不知道能不能解决大家的问题，时间匆忙，没有及时完善，文笔也不是很好，有些地方估计是词不达意。大家可以给我意见，希望能共同进步。<BR><![CDATA[这些天开发一个项目，服务器是tomcat,操作系统是xp,采用的是MVC架构，模式是采用Facade模式，总是出现乱码，自己也解决了好多天，同事也帮忙解决，也参考了网上众多网友的文章和意见，总算是搞定。但是好记性不如烂笔杆，所以特意记下，以防止自己遗忘，同时也给那些遇到同样问题的人提供一个好的参考途径：<BR>(一)    JSP页面上是中文，但是看的是后是乱码：<BR>解决的办法就是在JSP页面的编码的地方<%@ page language="java" contentType="text/html;charset=GBK" %>，因为Jsp转成Java文件时的编码问题，默认的话有的服务器是ISO-8859-1，如果一个JSP中直接输入了中文，Jsp把它当作ISO8859-1来处理是肯定有问题的，这一点，我们可以通过查看Jasper所生成的Java中间文件来确认<BR>(二)    当用Request对象获取客户提交的汉字代码的时候，会出现乱码：<BR>解决的办法是：要配置一个filter,也就是一个Servelet的过滤器，代码如下：<BR>import java.io.IOException;<BR>import javax.servlet.Filter;<BR>import javax.servlet.FilterChain;<BR>import javax.servlet.FilterConfig;<BR>import javax.servlet.ServletException;<BR>import javax.servlet.ServletRequest;<BR>import javax.servlet.ServletResponse;<BR>import javax.servlet.UnavailableException;<BR><BR>/**<BR> * Example filter that sets the character encoding to be used in parsing the<BR> * incoming request<BR> */<BR>public class SetCharacterEncodingFilter implements Filter {<BR><BR>    /**<BR>     * Take this filter out of service.<BR>     */<BR>    public void destroy() {<BR>    }<BR>    /**<BR>     * Select and set (if specified) the character encoding to be used to<BR>     * interpret request parameters for this request.<BR>     */<BR>    public void doFilter(ServletRequest request, ServletResponse response,<BR>    FilterChain chain)throws IOException, ServletException {<BR><BR>    request.setCharacterEncoding("GBK");<BR><BR>    // 传递控制到下一个过滤器<BR>    chain.doFilter(request, response);<BR>    }<BR><BR>    public void init(FilterConfig filterConfig) throws ServletException {<BR>    }<BR>}<BR>配置web.xml<BR><filter><BR><filter-name>Set Character Encoding</filter-name><BR><filter-class>SetCharacterEncodingFilter</filter-class><BR></filter><BR><filter-mapping><BR><filter-name>Set Character Encoding</filter-name><BR><url-pattern>/*</url-pattern><BR></filter-mapping><BR>如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况，你的Form提交的数据是不是用get提交的，一般来说用post提交的话是没有问题的，如果是的话，你就看看第四中解决的办法。<BR>还有就是对含有汉字字符的信息进行处理，处理的代码是：<BR>package dbJavaBean;<BR><BR>public class CodingConvert<BR>{   <BR> public CodingConvert()<BR> {<BR>  //<BR> }<BR> public String toGb(String uniStr){<BR>     String gbStr = "";<BR>     if(uniStr == null){<BR>   uniStr = "";<BR>     }<BR>     try{<BR>   byte[] tempByte = uniStr.getBytes("ISO8859_1");<BR>   gbStr = new String(tempByte,"GB2312");<BR>     }<BR>  catch(Exception ex){<BR>    }<BR>     return gbStr;<BR> }<BR>   <BR> public String toUni(String gbStr){<BR>     String uniStr = "";<BR>     if(gbStr == null){<BR>   gbStr = "";<BR>     }<BR>     try{<BR>   byte[] tempByte = gbStr.getBytes("GB2312");<BR>   uniStr = new String(tempByte,"ISO8859_1");<BR>     }catch(Exception ex){<BR>    }<BR>    return uniStr;<BR> }<BR>}<BR>你也可以在直接的转换，首先你将获取的字符串用ISO-8859-1进行编码，然后将这个编码存放到一个字节数组中，然后将这个数组转化成字符串对象就可以了，例如：<BR>String str=request.getParameter(“girl”);<BR>Byte B[]=str.getBytes(“ISO-8859-1”);<BR>Str=new String(B);<BR>通过上述转换的话，提交的任何信息都能正确的显示。<BR>(三)    在Formget请求在服务端用request. getParameter(“name”)时返回的是乱码；按tomcat的做法设置Filter也没有用或者用request.setCharacterEncoding("GBK");也不管用问题是出在处理参数传递的方法上：如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)方法进行处理的话前面即使是写了：<BR>request.setCharacterEncoding("GBK");<BR>response.setContentType("text/html;charset=GBK");<BR>也是不起作用的，返回的中文还是乱码！！！如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。<BR>同样，在用两个JSP页面处理表单输入之所以能显示中文是因为用的是post方法传递的，改成get方法依旧不行。<BR>由此可见在servlet中用doGet()方法或是在JSP中用get方法进行处理要注意。这毕竟涉及到要通过浏览器传递参数信息，很有可能引起常用字符集的冲突或是不匹配。<BR>解决的办法是：<BR>1) 打开tomcat的server.xml文件，找到区块，加入如下一行： <BR>URIEncoding=”GBK” <BR>完整的应如下： <BR><Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/> <BR><BR>2)重启tomcat,一切OK。<BR>需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了。需要注意的是：这个地方如果你要是用UTF-8的时候在传递的过程中在Tomcat中也是要出现乱码的情况，如果不行的话就换别的字符集。<BR><BR>(四)    JSP页面上有中文，按钮上面也有中文，但是通过服务器查看页面的时候出现乱码：<BR>     解决的办法是：首先在JSP文件中不应该直接包含本地化的消息文本，而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本放到Application.properties文件中，这个文件放在WEB-INF/classes/*下，例如我在页面里有姓名，年龄两个label,我首先就是要建一个Application.properties，里面的内容应该是name=”姓名” age=”年龄”,然后我把这个文件放到WEB-INF/classes/properties/下，接下来根据Application.properties文件，对他进行编码转化，创建一个中文资源文件，假定名字是Application_cn.properties。在JDK中提供了native2ascii命令，他能够实现字符编码的转换。在DOS环境中找到你放置Application.properties的这个文件的目录，在DOS环境中执行一下命令，将生成按GBK编码的中文资源文件Application_cn.properties：native2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命令以后将生成如下内容的Application_cn.properties文件：name=\u59d3\u540d age=\u5e74\u9f84,在Struts-config.xml中配置：<message-resources parameter="properties.Application_cn"/>。到这一步，基本上完成了一大半，接着你就要在JSP页面上写<%@ page language="java" contentType="text/html;charset=GBK" %>,到名字的那个label是要写<bean:message key=”name”>,这样的化在页面上出现的时候就会出现中文的姓名，年龄这个也是一样，按钮上汉字的处理也是同样的。<BR>(五)    写入到数据库是乱码：<BR>解决的方法：要配置一个filter,也就是一个Servelet的过滤器，代码如同第二种时候一样。<BR>如果你是通过JDBC直接链接数据库的时候，配置的代码如下：jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK，这样保证到数据库中的代码是不是乱码。<BR>如果你是通过数据源链接的化你不能按照这样的写法了，首先你就要写在配置文件中，在tomcat 5.0.19中配置数据源的地方是在C:\Tomcat 5.0\conf\Catalina\localhost这个下面，我建立的工程是workshop，放置的目录是webapp下面,workshop.xml的配置文件如下：<BR><!-- insert this Context element into server.xml --><BR><BR><Context path="/workshop" docBase="workshop" debug="0"<BR>reloadable="true" ><BR><BR>  <Resource name="jdbc/WorkshopDB"<BR>               auth="Container"<BR>               type="javax.sql.DataSource" /><BR><BR>  <ResourceParams name="jdbc/WorkshopDB"><BR>    <parameter><BR>      <name>factory</name><BR>      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value><BR>    </parameter><BR>    <parameter><BR>      <name>maxActive</name><BR>      <value>100</value><BR>    </parameter><BR>    <parameter><BR>      <name>maxIdle</name><BR>      <value>30</value><BR>    </parameter><BR><BR>    <BR>    <parameter><BR>      <name>maxWait</name><BR>      <value>10000</value><BR>    </parameter><BR><BR>      <parameter><BR>     <name>username</name><BR>     <value>root</value><BR>    </parameter><BR>    <parameter><BR>     <name>password</name><BR>     <value></value><BR>    </parameter><BR><BR>    <!-- Class name for mm.mysql JDBC driver --><BR>    <parameter><BR>       <name>driverClassName</name><BR>       <value>com.mysql.jdbc.Driver</value><BR></parameter><BR>   <parameter><BR>      <name>url</name><BR> <value><![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK]]&gt;</value><BR>    </parameter><BR>  </ResourceParams><BR><BR></Context><BR>粗体的地方要特别的注意，和JDBC直接链接的时候是有区别的，如果你是配置正确的化，当你输入中文的时候到数据库中就是中文了，有一点要注意的是你在显示数据的页面也是要用<%@ page language="java" contentType="text/html;charset=GBK" %>这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的，写了一个Form的时候把他改成了一个jsp，这样有一个地方要注意了，那就是在Dreamver中Action的提交方式是request的，你需要把他该过来，因为在jsp的提交的过程中紧紧就是POST和GET两种方式，但是这两种方式提交的代码在编码方面还是有很大不同的，这个在后面的地方进行说明。3<BR><BR>以上就是我在开发系统中解决中文的问题，不知道能不能解决大家的问题，时间匆忙，没有及时完善，文笔也不是很好，有些地方估计是词不达意。大家可以给我意见，希望能共同进步。<BR>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16135.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-19 17:04 <a href="http://www.blogjava.net/qq13367612/articles/16135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat下数据源的配置、解释和调用方法 </title><link>http://www.blogjava.net/qq13367612/articles/16212.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Mon, 19 Sep 2005 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16212.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16212.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16212.html</trackback:ping><description><![CDATA[<DIV class=postbody>tomcat的数据库连接池的配置<BR>环境：<BR>1. 数据库：mysql<BR>2. 数据库驱动程序：org.gjt.mm.mysql.Driver<BR>JNDI（Java Naming and Directory Interface）概述：<BR>Tomcat4（5）提供了一个与Java Enterprise Edition应用服务相兼容的JNDI--InitialContext实现实例。它的初始数据设置在$CATALINA_HOME/conf/server.xml文件里，并可能在网页应用环境描述（/WEB-INF/web.xml）里被下列元素引用：<BR>1) <env-entry>--环境入口，设置应用程序如何操作。<BR>2) <resource-ref>--资源参数，一般是数据库驱动程序、JavaMail Session、自定义类工厂等。<BR>3) <resource-env-ref>--在Servlet 2.4里用来简化设置不需认证信息的资源资源如环境参数、resource-ref变量。<BR>InitialContext在网页应用程序初始化时被设置，用来支持网页应用程序组件。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。点击下列网址以获取更多信息：<BR>1) Java命名和目录接口（Java Naming and Directory Interface）<BR>2) J2EE平台说明（J2EE Platform Specification）<BR>设置JNDI资源<BR>设置JNDI资源要在$CATALINA_HOME/conf/server.xml文件里使用下列标志符：<BR>1) <Environment>--设置域个可变的JNDI InitialContext入口的名字和值（同上面说的<env-entry>等价）。<BR>2) <Resource>--设置应用程序可用的资源的名字和类型（同上面说的<resource-ref>等价）。<BR>3) <ResourceParams>--设置Java资源类工厂的名称或将用的JavaBean属性。<BR>4) <ResourceLink>--给全局JNDI环境（JNDI Context）添加一个链接。<BR>上述这些标志符必须放在<Context>和</Context>之间（针对专门的网页应用程序）或<DefaultContext>和</DefaultContext>之间。<BR>此外，设在网页应用环境描述（Web Application Descriptor）（/WEB-INF/web.xml）里的名字和值也在初始环境（Initial Context）里被设置，当被<Environemt>元素值允许时将被重设初始值。<BR>全局变量能在<Server>子元素的<GlobalNamingResources>里设置。<BR>数据库连接池概述：<BR>数据库连接是一种关键的有限的昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。<BR>数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而再不是重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。<BR>数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的连接数超过最大连接数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素：<BR>1) 最小连接数是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费；<BR>2) 最大连接数是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。<BR>3) 如果最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。<BR>配置Tomcat数据库连接池的前提：<BR>1. 必须装有Java运行环境；<BR>2. mysql；<BR>在$CATALINA_HOME/conf/server.xml里设置数据库连接池：<BR>下面是配置的代码，必须放在<Host>和</Host>之间。<BR><Context path="/test" docBase="test" debug="0" reloadable="true" crossContext="true"><BR><Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/><BR><ResourceParams name="jdbc/connectDB"><BR> <parameter><BR>  <name>maxActive</name><BR>  <!-- Maximum number of DB connections in pool.Set to 0 for no limit. --><BR>  <value>100</value><BR> </parameter><BR> <parameter><BR>  <name>maxIdle</name><BR>  <!-- Maximum number of idle DB connections to retain in pool.Set to 0 for no limit. --><BR>  <value>30</value><BR> </parameter><BR> <parameter><BR>  <name>maxWait</name><BR>  <!-- Maximum time to wait for a DB connection to become available in ms.An exception is thrown if this timeout is exceeded.Set to -1 to wait indefinitely. --><BR>  <value>10000</value><BR> </parameter><BR> <parameter><BR>  <name>removeAbandoned</name><BR>  <!-- Abandoned DB connections are removed and recycled --><BR>  <value>true</value><BR> </parameter><BR> <parameter><BR>  <name>removeAbandonedTimeout</name><BR>  <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  --><BR>  <value>60</value><BR> </parameter><BR> <parameter><BR>  <name>logAbandoned</name><BR>  <!-- Log a stack trace of the code which abandoned --><BR>  <value>false</value><BR> </parameter><BR> <parameter><BR>  <name>factory</name><BR>  <!-DBCP Basic Datasource Factory --><BR>  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value><BR> </parameter><BR> <parameter><BR>  <name>username</name><BR>  <!-- Database User Name --><BR>  <value>root</value><BR> </parameter><BR> <parameter><BR>  <name>password</name><BR>  <!-- User Password --><BR>  <value></value><BR> </parameter><BR> <parameter><BR>  <name>driverClassName</name><BR>  <!-- Database Driver Class Name --><BR>  <value>org.gjt.mm.mysql.Driver</value><BR> </parameter><BR> <parameter><BR>  <name>url</name><BR>  <!-- Database Address --><BR>  <value>jdbc:mysql://localhost/test</value><BR> </parameter><BR></ResourceParams><BR></Context><BR>下面是一些参数的说明：<BR><Context path="/test" docBase="test" debug="0" reloadable="true" crossContext="true"><BR>其中：<BR>1) path  指定路径，这里设定的是$CATALINA_HOME/webapps下的test目录；<BR>2) docBase 文件根目录。<BR>3) reloader  当网页被更新时是否重新编译。<BR>4) maxActive 连接池的最大数据库连接数。设为0表示无限制。<BR>5) maxIdle  数据库连接的最大空闲时间。超过此空闲时间，数据库连接将被标记为不可用，然后被释放。设为0表示无限制。<BR>6) maxWait 最大建立连接等待时间。如果超过此时间将接到异常。设为－1表示无限制。<BR>7) removeAbandoned 回收被遗弃的（一般是忘了释放的）数据库连接到连接池中。<BR>8) removeAbandonedTimeout 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。<BR>9) logAbandoned 将被遗弃的数据库连接的回收记入日志。<BR>10) driverClassName JDBC驱动程序。<BR>11) url   数据库连接字符串<BR>在$CATALINA_HOME/webapps/test/WEB-INF/web.xml里设置被引用的资源：<BR>下面是配置代码，必须放在<web-app>和</web-app>里。<BR><!-- Database Config start --><BR><resource-ref><BR><description>connectDB test</description><BR><res-ref-name>jdbc/connectDB</res-ref-name><BR><res-type>javax.sql.DataSource</res-type><BR><res-auth>Container</res-auth><BR></resource-ref><BR><!-- Database Config end --><BR>下面是一下参数的必要说明：<BR>1) description  对被引用的资源的描述。<BR>2) res-ref-name  资源名称。见上面的<ResourceParams name="jdbc/connectDB"><BR>3) res-type  资源类型。见上面的<Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/><BR>为了方便做解释直接在JSP中使用资源：<BR>这是在$CATALINA_HOME/webapps/test下的某级子目录里的jsp网页文件部分代码：<BR><%@ page contentType="text/html;charset=GBK"%><BR><%@ page errorPage="error.jsp"%><BR><%@ page import="javax.naming.*"%><BR><%@ page import="javax.sql.*"%><BR><%@ page import="java.sql.*"%><BR><html><BR> <head><BR> </head><BR> <body onbeforeunload="RunOnBeforeUnload()"><BR>  <% 
<P>   ………………<BR>   ………………</P>
<P>   // 数据库操作<BR>   Context ctx=null;<BR>   Connection cnn=null;<BR>   Statement stmt=null;<BR>   ResultSet rs=null;<BR>   try<BR>   {<BR>    ctx=new InitialContext();<BR>    if(ctx==null)<BR>     throw new Exception("没有匹配的环境");<BR>    DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");<BR>    if(ds==null)<BR>     throw new Exception("没有匹配数据库");<BR>    <BR>    cnn=ds.getConnection();<BR>    stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);<BR>    rs=stmt.executeQuery("select * from table1");</P>
<P>    ………………<BR>    ………………</P>
<P>   }<BR>   finally<BR>   {<BR>    if(rs!=null)<BR>     rs.close();<BR>    if(stmt!=null)<BR>     stmt.close();<BR>    if(cnn!=null)<BR>     cnn.close();<BR>    if(ctx!=null)<BR>     ctx.close();<BR>   }<BR>    %><BR> </body><BR></html><BR>代码说明：<BR>DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");<BR>上面这句应用了刚才设的资源。<BR>资源使用完要释放，尤其是Context资源，见try-catch-finally部分的finally代码段，这是一种好的习惯。资源释放时如果释放了上级资源，下级资源将先被释放。如：释放了ctx，那么资源释放顺序将是rs，stmt，cnn，ctx。换句话说，如果释放了ctx，那么rs，stmt和cnn都将不可用了。<BR>这里的释放资源只是将数据库连接返回连接池中，并不是把资源真正释放掉，见数据库连接池概述。<BR><BR></P>
<P><SPAN id=ArticleContent1_ArticleContent1_lblContent></P>
<P>Datasource对象是由Tomcat提供的，因而需要使用JNDI来获得Datasouce</P>
<P>在Javax.naming 中提供了Context接口，</P>
<P>数据源的配置涉及到Server.xml和web.xml，需要在server.xml中加入如下内容：说明一下：我的数据库是MYsql</P>
<P><Context path="/text" docBase="d:/upload" debug="0"><BR>     <Resource name="jdbc/testDb" auth="Container"<BR>                    type="javax.sql.DataSource"/><BR>          <ResourceParams name="jdbc/testDB">\\数据源的名称<BR>            <parameter><name>username</name><value>root</value></parameter>数据库的名称<BR>            <parameter><name>password</name><value>password</value></parameter>数据库密码<BR>            <parameter><name>driverClassName</name><BR>              <value>org.gjt.mm.mysql.Driver</value></parameter>\\要加载的驱动<BR>            <parameter><name>url</name><BR>              <value>jdbc:mysql://172.20.0.73/rk?</value></parameter>\\要连接的URL<BR>          </ResourceParams><BR>          <BR>   </Context></P>
<P>具体还有一些详细的选项例如：MaxActive等，参加Server.xml中说明</P>
<P>另外在Web.xml中加入如下内容：<BR><description>test connection</description>\\描述<BR>    <res-ref-name>jdbc/testDB</res-ref-name>\\名称与上对应<BR>    <res-type>javax.sql.DataSource</res-type>\\与上对应<BR>    <res-auth>Container</res-auth>\\与上一置<BR>    </resource-ref></P>
<P>配置以上内容后，只要在你的Jsp或Javabean 中按以下方式创建连接，就可以</P>
<P>Context ctx=new InitialContext();<BR>  DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");<BR>  conn = ds.getConnection();</P>
<P>以上代码均测试成功，但是在Server.xml中配置数据库的URL中我不能加入useUnicode=true&characterEncoding=GBK，所以从数据库中取出来的汉字都是？？？？</P>
<P>我用如下代码来解决这个问题：</P>
<P>public static String toChinese(String strvalue) { <BR>  try{ <BR>   if(strvalue==null) <BR>  { <BR>  return null; <BR>  } <BR>  else { <BR>   strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); <BR>   return strvalue; <BR>  } <BR>  }catch(Exception e){ <BR>   return null; <BR>  } <BR> } <BR></P>
<P><STRONG>Step by Step：<BR></STRONG>1。将数据库驱动程序拷贝到tomcat\common\lib目录下面。<BR>2。修改server.xml文件，在Context配置节点下面加上资源节点，如下：<BR><Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"<BR>                 maxActive="100" maxIdle="30" maxWait="10000"<BR>                 username="root" password="" driverClassName="org.gjt.mm.mysql.Driver"<BR>                 url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK&useUnicode=TRUE"/><BR>        注意的是：如果有&字符，需要转移成&（XML文件规范）<BR>3。修改Web应用WEB-INF\web.xml文件，加上Resource-Def，如下：<BR>  <resource-ref><BR>      <description>DB Connection</description><BR>      <res-ref-name>jdbc/TestDB</res-ref-name><BR>      <res-type>javax.sql.DataSource</res-type><BR>      <res-auth>Container</res-auth><BR>  </resource-ref><BR>4。重新启动Web应用，在Web应用中可以通过下面的代码来获取数据源和数据库连接：<BR>javax.naming.InitialContext context = new javax.naming.InitialContext();<BR>DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/TestDB" );<BR>connection = (Connection)ds.getConnection();<BR><BR><STRONG>Problem And Answer：</STRONG><BR>1。Question:如果出现下列提示：<BR>      javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial<BR>        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)，怎么办？<BR>      Answer：检查在Tomcat中conf/server.xml文件，检查<context>是否设置useNaming="false"，如果是，去掉。<BR>2。Question:如果无法找到数据库驱动程序怎么办？<BR>      Answer：检查数据库驱动JDBC程序是否放在了Tomcat\common\lib目录下面</SPAN></P></SPAN></DIV><![CDATA[<DIV class=postbody>tomcat的数据库连接池的配置<BR>环境：<BR>1. 数据库：mysql<BR>2. 数据库驱动程序：org.gjt.mm.mysql.Driver<BR>JNDI（Java Naming and Directory Interface）概述：<BR>Tomcat4（5）提供了一个与Java Enterprise Edition应用服务相兼容的JNDI--InitialContext实现实例。它的初始数据设置在$CATALINA_HOME/conf/server.xml文件里，并可能在网页应用环境描述（/WEB-INF/web.xml）里被下列元素引用：<BR>1) <env-entry>--环境入口，设置应用程序如何操作。<BR>2) <resource-ref>--资源参数，一般是数据库驱动程序、JavaMail Session、自定义类工厂等。<BR>3) <resource-env-ref>--在Servlet 2.4里用来简化设置不需认证信息的资源资源如环境参数、resource-ref变量。<BR>InitialContext在网页应用程序初始化时被设置，用来支持网页应用程序组件。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。点击下列网址以获取更多信息：<BR>1) Java命名和目录接口（Java Naming and Directory Interface）<BR>2) J2EE平台说明（J2EE Platform Specification）<BR>设置JNDI资源<BR>设置JNDI资源要在$CATALINA_HOME/conf/server.xml文件里使用下列标志符：<BR>1) <Environment>--设置域个可变的JNDI InitialContext入口的名字和值（同上面说的<env-entry>等价）。<BR>2) <Resource>--设置应用程序可用的资源的名字和类型（同上面说的<resource-ref>等价）。<BR>3) <ResourceParams>--设置Java资源类工厂的名称或将用的JavaBean属性。<BR>4) <ResourceLink>--给全局JNDI环境（JNDI Context）添加一个链接。<BR>上述这些标志符必须放在<Context>和</Context>之间（针对专门的网页应用程序）或<DefaultContext>和</DefaultContext>之间。<BR>此外，设在网页应用环境描述（Web Application Descriptor）（/WEB-INF/web.xml）里的名字和值也在初始环境（Initial Context）里被设置，当被<Environemt>元素值允许时将被重设初始值。<BR>全局变量能在<Server>子元素的<GlobalNamingResources>里设置。<BR>数据库连接池概述：<BR>数据库连接是一种关键的有限的昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。<BR>数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而再不是重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。<BR>数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的连接数超过最大连接数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素：<BR>1) 最小连接数是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费；<BR>2) 最大连接数是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。<BR>3) 如果最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。<BR>配置Tomcat数据库连接池的前提：<BR>1. 必须装有Java运行环境；<BR>2. mysql；<BR>在$CATALINA_HOME/conf/server.xml里设置数据库连接池：<BR>下面是配置的代码，必须放在<Host>和</Host>之间。<BR><Context path="/test" docBase="test" debug="0" reloadable="true" crossContext="true"><BR><Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/><BR><ResourceParams name="jdbc/connectDB"><BR> <parameter><BR>  <name>maxActive</name><BR>  <!-- Maximum number of DB connections in pool.Set to 0 for no limit. --><BR>  <value>100</value><BR> </parameter><BR> <parameter><BR>  <name>maxIdle</name><BR>  <!-- Maximum number of idle DB connections to retain in pool.Set to 0 for no limit. --><BR>  <value>30</value><BR> </parameter><BR> <parameter><BR>  <name>maxWait</name><BR>  <!-- Maximum time to wait for a DB connection to become available in ms.An exception is thrown if this timeout is exceeded.Set to -1 to wait indefinitely. --><BR>  <value>10000</value><BR> </parameter><BR> <parameter><BR>  <name>removeAbandoned</name><BR>  <!-- Abandoned DB connections are removed and recycled --><BR>  <value>true</value><BR> </parameter><BR> <parameter><BR>  <name>removeAbandonedTimeout</name><BR>  <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  --><BR>  <value>60</value><BR> </parameter><BR> <parameter><BR>  <name>logAbandoned</name><BR>  <!-- Log a stack trace of the code which abandoned --><BR>  <value>false</value><BR> </parameter><BR> <parameter><BR>  <name>factory</name><BR>  <!-DBCP Basic Datasource Factory --><BR>  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value><BR> </parameter><BR> <parameter><BR>  <name>username</name><BR>  <!-- Database User Name --><BR>  <value>root</value><BR> </parameter><BR> <parameter><BR>  <name>password</name><BR>  <!-- User Password --><BR>  <value></value><BR> </parameter><BR> <parameter><BR>  <name>driverClassName</name><BR>  <!-- Database Driver Class Name --><BR>  <value>org.gjt.mm.mysql.Driver</value><BR> </parameter><BR> <parameter><BR>  <name>url</name><BR>  <!-- Database Address --><BR>  <value>jdbc:mysql://localhost/test</value><BR> </parameter><BR></ResourceParams><BR></Context><BR>下面是一些参数的说明：<BR><Context path="/test" docBase="test" debug="0" reloadable="true" crossContext="true"><BR>其中：<BR>1) path  指定路径，这里设定的是$CATALINA_HOME/webapps下的test目录；<BR>2) docBase 文件根目录。<BR>3) reloader  当网页被更新时是否重新编译。<BR>4) maxActive 连接池的最大数据库连接数。设为0表示无限制。<BR>5) maxIdle  数据库连接的最大空闲时间。超过此空闲时间，数据库连接将被标记为不可用，然后被释放。设为0表示无限制。<BR>6) maxWait 最大建立连接等待时间。如果超过此时间将接到异常。设为－1表示无限制。<BR>7) removeAbandoned 回收被遗弃的（一般是忘了释放的）数据库连接到连接池中。<BR>8) removeAbandonedTimeout 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。<BR>9) logAbandoned 将被遗弃的数据库连接的回收记入日志。<BR>10) driverClassName JDBC驱动程序。<BR>11) url   数据库连接字符串<BR>在$CATALINA_HOME/webapps/test/WEB-INF/web.xml里设置被引用的资源：<BR>下面是配置代码，必须放在<web-app>和</web-app>里。<BR><!-- Database Config start --><BR><resource-ref><BR><description>connectDB test</description><BR><res-ref-name>jdbc/connectDB</res-ref-name><BR><res-type>javax.sql.DataSource</res-type><BR><res-auth>Container</res-auth><BR></resource-ref><BR><!-- Database Config end --><BR>下面是一下参数的必要说明：<BR>1) description  对被引用的资源的描述。<BR>2) res-ref-name  资源名称。见上面的<ResourceParams name="jdbc/connectDB"><BR>3) res-type  资源类型。见上面的<Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/><BR>为了方便做解释直接在JSP中使用资源：<BR>这是在$CATALINA_HOME/webapps/test下的某级子目录里的jsp网页文件部分代码：<BR><%@ page contentType="text/html;charset=GBK"%><BR><%@ page errorPage="error.jsp"%><BR><%@ page import="javax.naming.*"%><BR><%@ page import="javax.sql.*"%><BR><%@ page import="java.sql.*"%><BR><html><BR> <head><BR> </head><BR> <body onbeforeunload="RunOnBeforeUnload()"><BR>  <% 
<P>   ………………<BR>   ………………</P>
<P>   // 数据库操作<BR>   Context ctx=null;<BR>   Connection cnn=null;<BR>   Statement stmt=null;<BR>   ResultSet rs=null;<BR>   try<BR>   {<BR>    ctx=new InitialContext();<BR>    if(ctx==null)<BR>     throw new Exception("没有匹配的环境");<BR>    DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");<BR>    if(ds==null)<BR>     throw new Exception("没有匹配数据库");<BR>    <BR>    cnn=ds.getConnection();<BR>    stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);<BR>    rs=stmt.executeQuery("select * from table1");</P>
<P>    ………………<BR>    ………………</P>
<P>   }<BR>   finally<BR>   {<BR>    if(rs!=null)<BR>     rs.close();<BR>    if(stmt!=null)<BR>     stmt.close();<BR>    if(cnn!=null)<BR>     cnn.close();<BR>    if(ctx!=null)<BR>     ctx.close();<BR>   }<BR>    %><BR> </body><BR></html><BR>代码说明：<BR>DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");<BR>上面这句应用了刚才设的资源。<BR>资源使用完要释放，尤其是Context资源，见try-catch-finally部分的finally代码段，这是一种好的习惯。资源释放时如果释放了上级资源，下级资源将先被释放。如：释放了ctx，那么资源释放顺序将是rs，stmt，cnn，ctx。换句话说，如果释放了ctx，那么rs，stmt和cnn都将不可用了。<BR>这里的释放资源只是将数据库连接返回连接池中，并不是把资源真正释放掉，见数据库连接池概述。<BR><BR></P>
<P><SPAN id=ArticleContent1_ArticleContent1_lblContent></P>
<P>Datasource对象是由Tomcat提供的，因而需要使用JNDI来获得Datasouce</P>
<P>在Javax.naming 中提供了Context接口，</P>
<P>数据源的配置涉及到Server.xml和web.xml，需要在server.xml中加入如下内容：说明一下：我的数据库是MYsql</P>
<P><Context path="/text" docBase="d:/upload" debug="0"><BR>     <Resource name="jdbc/testDb" auth="Container"<BR>                    type="javax.sql.DataSource"/><BR>          <ResourceParams name="jdbc/testDB">\\数据源的名称<BR>            <parameter><name>username</name><value>root</value></parameter>数据库的名称<BR>            <parameter><name>password</name><value>password</value></parameter>数据库密码<BR>            <parameter><name>driverClassName</name><BR>              <value>org.gjt.mm.mysql.Driver</value></parameter>\\要加载的驱动<BR>            <parameter><name>url</name><BR>              <value>jdbc:mysql://172.20.0.73/rk?</value></parameter>\\要连接的URL<BR>          </ResourceParams><BR>          <BR>   </Context></P>
<P>具体还有一些详细的选项例如：MaxActive等，参加Server.xml中说明</P>
<P>另外在Web.xml中加入如下内容：<BR><description>test connection</description>\\描述<BR>    <res-ref-name>jdbc/testDB</res-ref-name>\\名称与上对应<BR>    <res-type>javax.sql.DataSource</res-type>\\与上对应<BR>    <res-auth>Container</res-auth>\\与上一置<BR>    </resource-ref></P>
<P>配置以上内容后，只要在你的Jsp或Javabean 中按以下方式创建连接，就可以</P>
<P>Context ctx=new InitialContext();<BR>  DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");<BR>  conn = ds.getConnection();</P>
<P>以上代码均测试成功，但是在Server.xml中配置数据库的URL中我不能加入useUnicode=true&characterEncoding=GBK，所以从数据库中取出来的汉字都是？？？？</P>
<P>我用如下代码来解决这个问题：</P>
<P>public static String toChinese(String strvalue) { <BR>  try{ <BR>   if(strvalue==null) <BR>  { <BR>  return null; <BR>  } <BR>  else { <BR>   strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); <BR>   return strvalue; <BR>  } <BR>  }catch(Exception e){ <BR>   return null; <BR>  } <BR> } <BR></P>
<P><STRONG>Step by Step：<BR></STRONG>1。将数据库驱动程序拷贝到tomcat\common\lib目录下面。<BR>2。修改server.xml文件，在Context配置节点下面加上资源节点，如下：<BR><Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"<BR>                 maxActive="100" maxIdle="30" maxWait="10000"<BR>                 username="root" password="" driverClassName="org.gjt.mm.mysql.Driver"<BR>                 url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK&useUnicode=TRUE"/><BR>        注意的是：如果有&字符，需要转移成&（XML文件规范）<BR>3。修改Web应用WEB-INF\web.xml文件，加上Resource-Def，如下：<BR>  <resource-ref><BR>      <description>DB Connection</description><BR>      <res-ref-name>jdbc/TestDB</res-ref-name><BR>      <res-type>javax.sql.DataSource</res-type><BR>      <res-auth>Container</res-auth><BR>  </resource-ref><BR>4。重新启动Web应用，在Web应用中可以通过下面的代码来获取数据源和数据库连接：<BR>javax.naming.InitialContext context = new javax.naming.InitialContext();<BR>DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/TestDB" );<BR>connection = (Connection)ds.getConnection();<BR><BR><STRONG>Problem And Answer：</STRONG><BR>1。Question:如果出现下列提示：<BR>      javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial<BR>        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)，怎么办？<BR>      Answer：检查在Tomcat中conf/server.xml文件，检查<context>是否设置useNaming="false"，如果是，去掉。<BR>2。Question:如果无法找到数据库驱动程序怎么办？<BR>      Answer：检查数据库驱动JDBC程序是否放在了Tomcat\common\lib目录下面</SPAN></P></SPAN></DIV>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16212.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-19 16:48 <a href="http://www.blogjava.net/qq13367612/articles/16212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOMCAT5.0自带连接池配置</title><link>http://www.blogjava.net/qq13367612/articles/16217.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Sun, 18 Sep 2005 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16217.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16217.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16217.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Tomcat5配置Mysql JDBC数据库连接池  如果只是对MySql感兴趣可以照抄这篇短文，如果想配置其他数据库类型的连接池，也可以做简单修改参数即可使用。 1、  安装Tomcat参考Tomcat for window 的安装向导，基本直接安装即可，注意：安装时会提示输入管理用户名和密码，这是以后会用到的用户名和密码，切记。2、  安装MySql默认安装即可。3、 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/qq13367612/articles/16217.html'>阅读全文</a><img src ="http://www.blogjava.net/qq13367612/aggbug/16217.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-18 11:52 <a href="http://www.blogjava.net/qq13367612/articles/16217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat防止目录泄露 </title><link>http://www.blogjava.net/qq13367612/articles/16218.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Sun, 18 Sep 2005 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16218.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16218.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16218.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>有时不输入页面,直接输入根目录下某个文件夹的名字,这个目录下的文件就会都列出来,这样是不安全的.我们需要在tomcat中进行设置:<BR>打开tomcat的web.xml文件,加入:<BR>&lt;servlet&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;default&lt;/servlet-name&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;listings&lt;/param-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--在这里加一个值--&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;false&lt;/param-value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--改成false就OK了--&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;&nbsp;&nbsp;<BR>&lt;/servlet&gt;</TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/qq13367612/aggbug/16218.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-18 11:49 <a href="http://www.blogjava.net/qq13367612/articles/16218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Tomcat的安装</title><link>http://www.blogjava.net/qq13367612/articles/16258.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Thu, 08 Sep 2005 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16258.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16258.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16258.html</trackback:ping><description><![CDATA[<P style="FONT-SIZE: 20px; FONT-FAMILY: 黑体"><B>Linux下Tomcat的安装</B></P>
<P><B>１．下载Tomcat</B></P>
<P>在下面的地址下载Tomcat的二进制版</P>
<P>    <A href="http://mirrors.ccs.neu.edu/Apache/dist/jakarta/tomcat-4/binaries/">http://mirrors.ccs.neu.edu/Apache/dist/jakarta/tomcat-4/binaries/</A></P>
<P>即下载文件</P>
<P>    tomcat-4.1.18.tar.gz</P>
<P><B>2. 安装</B></P>
<P>首先解压缩</P>
<P>    gunzip tomcat-4.1.18.tar.gz<BR>    tar -zxvf tomcat-4.1.18.tar</P>
<P>得到Tomcat的所有文件.然后把它拷贝到你要安装的位置，如</P>
<P>    /opt/tomcat-4.1.18/</P>
<P>然后为了方便，你可以把目录名tomcat-4.1.18改为tomcat．</P>
<P><B>３．设置</B></P>
<UL>
<LI><B>设置路经<BR></B><BR>在/etc/profile文件中加入如下两行<BR><BR>    export JAVA_HOME=/opt/jdk1.4<BR>    export TOMCAT_HOME=/opt/tomcat<BR><BR>在此我们假设Java JDK安装在/opt/jdk1.4目录下．<BR>　 
<LI><B>激活ROOT</B><BR><BR>ROOT的缺省设置是没有激活(disabled)．为了激活ROOT，打开文件<BR><BR>    tomcat/conf/server.xml<BR><BR>然后把<BR><BR>    <!--<BR>    <Context path="" docBase="ROOT" debug="0"/><BR>    --><BR><BR>的注释去掉，即去掉<!--<SPAN lang=zh-cn>和</SPAN>-->．<BR>  
<LI><B>激活Invoker Servlet</B><BR><BR>即把tomcat/conf/web.xml中的下列字段的注释去掉<BR><BR>    <servlet-mapping><BR>        <servlet-name>invoker</servlet-name><BR>        <url-pattern>/servlet/*</url-pattern><BR>    </servlet-mapping><BR>　 
<LI><B>设置Port</B><BR>Tomcat缺省的Port number是8080．由于Tomcat是一个独立的(Standalone) Web Server，它可以不用Apache而独立工作，所以你可以不安装Apache，这样你可以把Tomcat设置在Port 80．这样你就可以在URL中省略:8080.<SPAN lang=zh-cn> </SPAN>打开文件tomcat/conf/server.xml，找到如下的字段：<BR><BR>    <Connector<SPAN lang=zh-cn> </SPAN>className="org.apache.coyote.tomcat4.CoyoteConnector"<BR>    <B>port="8080"</B> ...<BR>    ... /><BR><BR>然后把8080改成80即可．<BR>　 
<LI><B>创建temp子目录</B><BR>在/opt/tomcat/目录下建立一个temp子目录<BR>    mkdir temp </LI></UL>
<P><B>４．启动Tomcat</B></P>
<P>安装完后，重新启动计算机，以使JAVA_HOME和TOMCAT_HOME的设置生效．然后到</P>
<P>    /opt/tomcat/bin</P>
<P>下，运行命令：</P>
<P>    ./startup.sh</P>
<P>正常情况下可以见到如下的信息：</P>
<P>    Using CATALINA_BASE:   /opt/tomcat<BR>    Using CATALINA_HOME:   /opt/tomcat<BR>    Using CATALINA_TEMDIR: /opt/tomcat/temp<BR>    Using JAVA_HOME:       /opt/jdk1.4</P>
<P>然后用浏览器打开如下的网页</P>
<P>    <A href="http://localhost/">http://localhost/</A></P>
<P>或者</P>
<P>    <A href="http://localhost:8080/">http://localhost:8080/</A>     （如果没有把Port number改为８０）</P>
<P>如果你见到Tomcat的网页（index.jsp），证明Tomcat安装成功，并已经启动．</P>
<P>如要关闭Tomcat，在/opt/tomcat/bin下运行下面的命令即可</P>
<P>    ./shutdown.sh</P>
<P><B>5. 注册你自己的项目（Project）</B></P>
<P>假设你有一个自己的JSP项目，他应该安装在下面的目录下：</P>
<P>    /opt/tomcat/webapps/myproject</P>
<P>你必须在tomcat/conf/server.xml中加入一行</P>
<P>    <Context path="/myproject" docBase="myproject" debug="0"/></P>
<P>在浏览器中对应的地址为：</P>
<P>    <A href="http://localhost/myproject">http://localhost/myproject</A></P><![CDATA[<P style="FONT-SIZE: 20px; FONT-FAMILY: 黑体"><B>Linux下Tomcat的安装</B></P>
<P><B>１．下载Tomcat</B></P>
<P>在下面的地址下载Tomcat的二进制版</P>
<P>    <A href="http://mirrors.ccs.neu.edu/Apache/dist/jakarta/tomcat-4/binaries/">http://mirrors.ccs.neu.edu/Apache/dist/jakarta/tomcat-4/binaries/</A></P>
<P>即下载文件</P>
<P>    tomcat-4.1.18.tar.gz</P>
<P><B>2. 安装</B></P>
<P>首先解压缩</P>
<P>    gunzip tomcat-4.1.18.tar.gz<BR>    tar -zxvf tomcat-4.1.18.tar</P>
<P>得到Tomcat的所有文件.然后把它拷贝到你要安装的位置，如</P>
<P>    /opt/tomcat-4.1.18/</P>
<P>然后为了方便，你可以把目录名tomcat-4.1.18改为tomcat．</P>
<P><B>３．设置</B></P>
<UL>
<LI><B>设置路经<BR></B><BR>在/etc/profile文件中加入如下两行<BR><BR>    export JAVA_HOME=/opt/jdk1.4<BR>    export TOMCAT_HOME=/opt/tomcat<BR><BR>在此我们假设Java JDK安装在/opt/jdk1.4目录下．<BR>　 
<LI><B>激活ROOT</B><BR><BR>ROOT的缺省设置是没有激活(disabled)．为了激活ROOT，打开文件<BR><BR>    tomcat/conf/server.xml<BR><BR>然后把<BR><BR>    <!--<BR>    <Context path="" docBase="ROOT" debug="0"/><BR>    --><BR><BR>的注释去掉，即去掉<!--<SPAN lang=zh-cn>和</SPAN>-->．<BR>  
<LI><B>激活Invoker Servlet</B><BR><BR>即把tomcat/conf/web.xml中的下列字段的注释去掉<BR><BR>    <servlet-mapping><BR>        <servlet-name>invoker</servlet-name><BR>        <url-pattern>/servlet/*</url-pattern><BR>    </servlet-mapping><BR>　 
<LI><B>设置Port</B><BR>Tomcat缺省的Port number是8080．由于Tomcat是一个独立的(Standalone) Web Server，它可以不用Apache而独立工作，所以你可以不安装Apache，这样你可以把Tomcat设置在Port 80．这样你就可以在URL中省略:8080.<SPAN lang=zh-cn> </SPAN>打开文件tomcat/conf/server.xml，找到如下的字段：<BR><BR>    <Connector<SPAN lang=zh-cn> </SPAN>className="org.apache.coyote.tomcat4.CoyoteConnector"<BR>    <B>port="8080"</B> ...<BR>    ... /><BR><BR>然后把8080改成80即可．<BR>　 
<LI><B>创建temp子目录</B><BR>在/opt/tomcat/目录下建立一个temp子目录<BR>    mkdir temp </LI></UL>
<P><B>４．启动Tomcat</B></P>
<P>安装完后，重新启动计算机，以使JAVA_HOME和TOMCAT_HOME的设置生效．然后到</P>
<P>    /opt/tomcat/bin</P>
<P>下，运行命令：</P>
<P>    ./startup.sh</P>
<P>正常情况下可以见到如下的信息：</P>
<P>    Using CATALINA_BASE:   /opt/tomcat<BR>    Using CATALINA_HOME:   /opt/tomcat<BR>    Using CATALINA_TEMDIR: /opt/tomcat/temp<BR>    Using JAVA_HOME:       /opt/jdk1.4</P>
<P>然后用浏览器打开如下的网页</P>
<P>    <A href="http://localhost/">http://localhost/</A></P>
<P>或者</P>
<P>    <A href="http://localhost:8080/">http://localhost:8080/</A>     （如果没有把Port number改为８０）</P>
<P>如果你见到Tomcat的网页（index.jsp），证明Tomcat安装成功，并已经启动．</P>
<P>如要关闭Tomcat，在/opt/tomcat/bin下运行下面的命令即可</P>
<P>    ./shutdown.sh</P>
<P><B>5. 注册你自己的项目（Project）</B></P>
<P>假设你有一个自己的JSP项目，他应该安装在下面的目录下：</P>
<P>    /opt/tomcat/webapps/myproject</P>
<P>你必须在tomcat/conf/server.xml中加入一行</P>
<P>    <Context path="/myproject" docBase="myproject" debug="0"/></P>
<P>在浏览器中对应的地址为：</P>
<P>    <A href="http://localhost/myproject">http://localhost/myproject</A></P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16258.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-08 12:41 <a href="http://www.blogjava.net/qq13367612/articles/16258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat全攻略</title><link>http://www.blogjava.net/qq13367612/articles/16260.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 02 Sep 2005 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16260.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16260.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16260.html</trackback:ping><description><![CDATA[随着java的流行，其在web上的应用也越来越广，tomcat作为一个开源的servlet容器，应用前景越来越广，本文将向你讲述tomcat的一些知识。 <BR>一：简介 <BR>tomcat是jakarta项目中的一个重要的子项目，其被JavaWorld杂志的编辑选为2001年度最具创新的java产品(Most Innovative Java Product)，同时它又是sun公司官方推荐的servlet和jsp容器(具体可以见http://java.sun.com/products/jsp/tomcat/)，因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。 <BR><BR>二：安装及配置 <BR>tomcat最新版本为4.0.1，这个版本用了一个新的servlet容器Catalina，完整的实现了servlet2.3和jsp1.2规范。注意安装之前你的系统必须安装了jdk1.2以上版本。 <BR><BR>(一)：安装 <BR>1：windows平台 <BR>从tomcat网站下载jakarta-tomcat-4.0.1.exe，按照一般的windows程序安装步骤即可安装好tomcat,安装时它会自动寻找你的jdk和jre的位置。 <BR><BR>2：linux平台 <BR>下载jakarta-tomcat-4.0.1.tar.gz，将其解压到一个目录。 <BR><BR>(二)：配置 <BR>运行tomcat需要设置JAVA_HOME变量 <BR><BR>set JAVA_HOME=c:/jdk (win98，在msdos方式下使用，或者放入autoexec.bat中) <BR>export JAVA_HOME=/usr/local/jdk (linux下使用，放到/etc/bashrc或者/etc/profile中) <BR><BR>(三)：运行 <BR>设置完毕后就可以运行tomcat服务器了，进入tomcat的bin目录，win98下用startup启动tomcat，linux下用startup.sh，相应的关闭tomcat的命令为shutdown和shutdown.sh。 <BR><BR>启动后可以在浏览器中输入http://localhost:8080/测试，由于tomcat本身具有web服务器的功能，因此我们不必安装apache，当然其也可以与apache集成到一起，下面会介绍。 <BR><BR>下面你可以测试其自带的jsp和servlet示例。 <BR><BR>三：应用 <BR><BR>(一):目录结构 <BR>tomcat的目录结构如下： <BR><BR>目录名 简介 <BR>bin 存放启动和关闭tomcat脚本 <BR>conf 包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml <BR>work 存放jsp编译后产生的class文件 <BR>webapp 存放应用程序示例，以后你要部署的应用程序也要放到此目录 <BR>logs 存放日志文件 <BR>lib/japser/common 这三个目录主要存放tomcat所需的jar文件 <BR><BR>(二)：server.xml配置简介 <BR>下面我们将讲述这个文件中的基本配置信息，更具体的配置信息见tomcat的文档 <BR><BR>元素名 属性 解释 <BR>server port 指定一个端口，这个端口负责监听关闭tomcat的请求 <BR>shutdown 指定向端口发送的命令字符串 <BR>service name 指定service的名字 <BR>Connector <BR>(表示客户端和service之间的连接) port 指定服务器端要创建的端口号，并在这个断口监听来自客户端的请求 <BR>minProcessors 服务器启动时创建的处理请求的线程数 <BR>maxProcessors 最大可以创建的处理请求的线程数 <BR>enableLookups 如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip地址 <BR>redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 <BR>acceptCount 指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理 <BR>connectionTimeout 指定超时的时间数(以毫秒为单位) <BR>Engine <BR>(表示指定service中的请求处理机，接收和处理来自Connector的请求) defaultHost 指定缺省的处理请求的主机名，它至少与其中的一个host元素的name属性值是一样的 <BR>Context <BR>(表示一个web应用程序，通常为WAR文件，关于WAR的具体信息见servlet规范) docBase 应用程序的路径或者是WAR文件存放的路径 <BR>path 表示此web应用程序的url的前缀，这样请求的url为http://localhost:8080/path/**** <BR>reloadable 这个属性非常重要，如果为true，则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可以在不重起tomcat的情况下改变应用程序 <BR>host <BR>(表示一个虚拟主机) <BR>name 指定主机名 <BR>appBase 应用程序基本目录，即存放应用程序的目录 <BR>unpackWARs 如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接从WAR文件中运行应用程序 <BR>Logger <BR>(表示日志，调试和错误信息) <BR>className 指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口 <BR>prefix 指定log文件的前缀 <BR>suffix 指定log文件的后缀 <BR>timestamp 如果为true，则log文件名中要加入时间，如下例:localhost_log.2001-10-04.txt <BR>Realm <BR>(表示存放用户名，密码及role的数据库) <BR>className 指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口 <BR>Valve <BR>(功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样) <BR>className 指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 <BR><BR>directory 指定log文件存放的位置 <BR>pattern 有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记录的值更多 <BR><BR>注意：1：经过我测试，我设置Context 的path="",reloadable=true，然后放一个WAR文件到webapps目录，结果tomcat不能检测出此文件(重起tomcat可以)，而把此文件解压，则tomcat会自动检测出这个新的应用程序。如果不能自动检测WAR文件，我们可以利用下面管理中讲的方法来部署应用程序。 <BR><BR>2：默认的server.xml中，Realm元素只设置了一个className属性，但此文件中也包含几个通过JDBC连接到数据库进行验证的示例(被注释掉了)，通过Realm元素我们可以实现容器安全管理(Container Managed Security)。 <BR><BR>3：还有一些元素我们没有介绍，如Parameter，loader，你可以通过tomcat的文档获取这些元素的信息。 <BR><BR>(三)：管理 <BR><BR>1：配置 <BR>在进行具体的管理之前，我们先给tomcat添加一个用户，使这个用户有权限来进行管理。 <BR><BR>打开conf目录下的tomcat-users.xml文件，在相应的位置添加下面一行： <BR><BR><user name="zf" password="zf" roles="standard,manager"/> <BR><BR>注意：这一行的最后部分一定是/>,tomcat的文档掉了/符号，如果没有/符号的话，tomcat重起时将无法访问应用程序。通过logs/catalina.out文件你可以看到这个错误的详细信息。 <BR><BR>然后重起tomcat，在浏览器中输入http://localhost:8080/manager/，会弹出对话框，输入上面的用户名和密码即可。 <BR><BR>2：应用程序列表 <BR>在浏览器中输入http://localhost:8080/manager/list，浏览器将会显示如下的信息： <BR><BR>OK - Listed applications for virtual host localhost <BR>/ex:running:1 <BR>/examples:running:1 <BR>/webdav:running:0 <BR>/tomcat-docs:running:0 <BR>/manager:running:0 <BR>/:running:0 <BR><BR>面的信息分别为应用程序的路径，当前状态(running 或者stopped)，与这个程序相连的session数。 <BR><BR>3：重新装载应用程序 <BR>在浏览器中输入 http://localhost:8080/manager/reload?path=/examples，浏览器显示如下： <BR><BR>OK - Reloaded application at context path /examples <BR><BR>表示example应用程序装载成功，如果我们将server.xml的Context元素的reloadable属性设为true(见上面表格)，则没必要利用这种方式重新装载应用程序，因为tomcat会自动装载。 <BR><BR>4：显示session信息 <BR>在浏览器中输入http://localhost:8080/manager/sessions?path=/examples，浏览器显示如下： <BR><BR>OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes <BR><BR>5：启动和关闭应用程序 <BR>在浏览器中输入http://localhost:8080/manager/start?path=/examples和http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。 <BR><BR>6：部署及撤销部署 <BR>WAR有两种组织方式，一种是按一定的目录结构组织文件，一种是一个后缀为WAR的压缩包，因此它的部署方式也有两种： <BR>(1)：在浏览器中输入：http://localhost:8080/manager/install?path=/examples&war=file:/c:\examples <BR>就会将按目录结构组织的WAR部署 <BR><BR>(2)：如果输入:http://localhost:8080/manager/install?path=/examples&war=jar:file:/c:\examples.war!/ <BR>就会将按压缩包组织的WAR部署，注意此url后半部分一定要有!/号。 <BR><BR>部署后就可以用 http://localhost:8080/examples访问了。 <BR><BR>在浏览器中输入：http://localhost:8080/manager/remove?path=/examples <BR>就会撤销刚才部署的应用程序。 <BR><BR>(四)：与apache集成 <BR>虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来。 <BR><BR>我们以linux系统为例介绍. <BR><BR>从apache网站下载apache1.3.22源代码版本，然后使用如下命令配置安装apache： <BR><BR>mkdir /usr/local/apache <BR>tar zxvf apache.1.32.tar.gz <BR>cd apache.1.32 <BR>./configure --prefix=/usr/local/apache --enable-module=so <BR>make <BR>make install <BR><BR>注意configure命令指定目标安装目录，并且加入DSO(Dynamic Shared Object)支持，注意一定不要忘了这一个选项。 <BR><BR>然后下载webapp模块，将解压后mod_webapp.so文件放入apache的libexec目录，编辑apache的conf目录下的httpd.conf，在这个文件的最后加入下面三行： <BR><BR>LoadModule webapp_module libexec/mod_webapp.so <BR>WebAppConnection warpConnection warp localhost:8008 <BR>WebAppDeploy examples warpConnection /examples/ <BR><BR>第一行是加入webapp模块，如果编译apache时不增加DSO支持，则无法使用LoadModule指令，第二行指定tomcat与apache的连接，第三行指定部署那个应用，这两个指令使用格式如下： <BR><BR>WebAppConnection [connection name] [provider] [host:port] <BR>WebAppDeploy [application name] [connection name] [url path] <BR><BR>其中connection name指定连接名，provider只能是warp，port端口与你的tomcat的配置文件server.xml最后几行指定的要保持一致。文件如下： <BR><BR><Service name="Tomcat-Apache"> <BR><Connector className="org.apache.catalina.connector.warp.WarpConnector" <BR>port="8008" minProcessors="5" maxProcessors="75" <BR>enableLookups="true" <BR>acceptCount="10" debug="0"/> <BR>****** <BR></Service> <BR><BR>application name与你在tomcat中部署的应用名一致，url path指定访问这个应用的url。例如上面的例子可以通过http://localhost/examples/来访问tomcat中的examples应用。 <BR><BR>(五)：中文问题 <BR>一般jsp的乱码问题可以通过在jsp中加入<%@ page contentType="text/html;charset=GB2312" %>来解决，至于servlet的乱码在可以使用servlet2.3中提供的HttpServeletRequest.setCharacterEncoding函数。更详细的中文问题请见JSP/Servlet 中的汉字编码问题。 <BR><BR>四：综述 <BR>tomcat作为一个servlet(jsp也被编译为servlet执行)容器，其应用前景是非常好的，如果与jboss结合起来，则可以实现sun的j2ee规范(用jboss作ejb服务器)。jboss的官方网站也提供集成了tomcat3.2*的jboss以供下载。另外一个开源的应用服务器(enhydra) 也是基于tomcat的，其提供了更友好的管理界面，部署应用程序也更简单，功能也更强大。 <BR><![CDATA[随着java的流行，其在web上的应用也越来越广，tomcat作为一个开源的servlet容器，应用前景越来越广，本文将向你讲述tomcat的一些知识。 <BR>一：简介 <BR>tomcat是jakarta项目中的一个重要的子项目，其被JavaWorld杂志的编辑选为2001年度最具创新的java产品(Most Innovative Java Product)，同时它又是sun公司官方推荐的servlet和jsp容器(具体可以见http://java.sun.com/products/jsp/tomcat/)，因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。 <BR><BR>二：安装及配置 <BR>tomcat最新版本为4.0.1，这个版本用了一个新的servlet容器Catalina，完整的实现了servlet2.3和jsp1.2规范。注意安装之前你的系统必须安装了jdk1.2以上版本。 <BR><BR>(一)：安装 <BR>1：windows平台 <BR>从tomcat网站下载jakarta-tomcat-4.0.1.exe，按照一般的windows程序安装步骤即可安装好tomcat,安装时它会自动寻找你的jdk和jre的位置。 <BR><BR>2：linux平台 <BR>下载jakarta-tomcat-4.0.1.tar.gz，将其解压到一个目录。 <BR><BR>(二)：配置 <BR>运行tomcat需要设置JAVA_HOME变量 <BR><BR>set JAVA_HOME=c:/jdk (win98，在msdos方式下使用，或者放入autoexec.bat中) <BR>export JAVA_HOME=/usr/local/jdk (linux下使用，放到/etc/bashrc或者/etc/profile中) <BR><BR>(三)：运行 <BR>设置完毕后就可以运行tomcat服务器了，进入tomcat的bin目录，win98下用startup启动tomcat，linux下用startup.sh，相应的关闭tomcat的命令为shutdown和shutdown.sh。 <BR><BR>启动后可以在浏览器中输入http://localhost:8080/测试，由于tomcat本身具有web服务器的功能，因此我们不必安装apache，当然其也可以与apache集成到一起，下面会介绍。 <BR><BR>下面你可以测试其自带的jsp和servlet示例。 <BR><BR>三：应用 <BR><BR>(一):目录结构 <BR>tomcat的目录结构如下： <BR><BR>目录名 简介 <BR>bin 存放启动和关闭tomcat脚本 <BR>conf 包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml <BR>work 存放jsp编译后产生的class文件 <BR>webapp 存放应用程序示例，以后你要部署的应用程序也要放到此目录 <BR>logs 存放日志文件 <BR>lib/japser/common 这三个目录主要存放tomcat所需的jar文件 <BR><BR>(二)：server.xml配置简介 <BR>下面我们将讲述这个文件中的基本配置信息，更具体的配置信息见tomcat的文档 <BR><BR>元素名 属性 解释 <BR>server port 指定一个端口，这个端口负责监听关闭tomcat的请求 <BR>shutdown 指定向端口发送的命令字符串 <BR>service name 指定service的名字 <BR>Connector <BR>(表示客户端和service之间的连接) port 指定服务器端要创建的端口号，并在这个断口监听来自客户端的请求 <BR>minProcessors 服务器启动时创建的处理请求的线程数 <BR>maxProcessors 最大可以创建的处理请求的线程数 <BR>enableLookups 如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip地址 <BR>redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 <BR>acceptCount 指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理 <BR>connectionTimeout 指定超时的时间数(以毫秒为单位) <BR>Engine <BR>(表示指定service中的请求处理机，接收和处理来自Connector的请求) defaultHost 指定缺省的处理请求的主机名，它至少与其中的一个host元素的name属性值是一样的 <BR>Context <BR>(表示一个web应用程序，通常为WAR文件，关于WAR的具体信息见servlet规范) docBase 应用程序的路径或者是WAR文件存放的路径 <BR>path 表示此web应用程序的url的前缀，这样请求的url为http://localhost:8080/path/**** <BR>reloadable 这个属性非常重要，如果为true，则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可以在不重起tomcat的情况下改变应用程序 <BR>host <BR>(表示一个虚拟主机) <BR>name 指定主机名 <BR>appBase 应用程序基本目录，即存放应用程序的目录 <BR>unpackWARs 如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接从WAR文件中运行应用程序 <BR>Logger <BR>(表示日志，调试和错误信息) <BR>className 指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口 <BR>prefix 指定log文件的前缀 <BR>suffix 指定log文件的后缀 <BR>timestamp 如果为true，则log文件名中要加入时间，如下例:localhost_log.2001-10-04.txt <BR>Realm <BR>(表示存放用户名，密码及role的数据库) <BR>className 指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口 <BR>Valve <BR>(功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样) <BR>className 指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 <BR><BR>directory 指定log文件存放的位置 <BR>pattern 有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记录的值更多 <BR><BR>注意：1：经过我测试，我设置Context 的path="",reloadable=true，然后放一个WAR文件到webapps目录，结果tomcat不能检测出此文件(重起tomcat可以)，而把此文件解压，则tomcat会自动检测出这个新的应用程序。如果不能自动检测WAR文件，我们可以利用下面管理中讲的方法来部署应用程序。 <BR><BR>2：默认的server.xml中，Realm元素只设置了一个className属性，但此文件中也包含几个通过JDBC连接到数据库进行验证的示例(被注释掉了)，通过Realm元素我们可以实现容器安全管理(Container Managed Security)。 <BR><BR>3：还有一些元素我们没有介绍，如Parameter，loader，你可以通过tomcat的文档获取这些元素的信息。 <BR><BR>(三)：管理 <BR><BR>1：配置 <BR>在进行具体的管理之前，我们先给tomcat添加一个用户，使这个用户有权限来进行管理。 <BR><BR>打开conf目录下的tomcat-users.xml文件，在相应的位置添加下面一行： <BR><BR><user name="zf" password="zf" roles="standard,manager"/> <BR><BR>注意：这一行的最后部分一定是/>,tomcat的文档掉了/符号，如果没有/符号的话，tomcat重起时将无法访问应用程序。通过logs/catalina.out文件你可以看到这个错误的详细信息。 <BR><BR>然后重起tomcat，在浏览器中输入http://localhost:8080/manager/，会弹出对话框，输入上面的用户名和密码即可。 <BR><BR>2：应用程序列表 <BR>在浏览器中输入http://localhost:8080/manager/list，浏览器将会显示如下的信息： <BR><BR>OK - Listed applications for virtual host localhost <BR>/ex:running:1 <BR>/examples:running:1 <BR>/webdav:running:0 <BR>/tomcat-docs:running:0 <BR>/manager:running:0 <BR>/:running:0 <BR><BR>面的信息分别为应用程序的路径，当前状态(running 或者stopped)，与这个程序相连的session数。 <BR><BR>3：重新装载应用程序 <BR>在浏览器中输入 http://localhost:8080/manager/reload?path=/examples，浏览器显示如下： <BR><BR>OK - Reloaded application at context path /examples <BR><BR>表示example应用程序装载成功，如果我们将server.xml的Context元素的reloadable属性设为true(见上面表格)，则没必要利用这种方式重新装载应用程序，因为tomcat会自动装载。 <BR><BR>4：显示session信息 <BR>在浏览器中输入http://localhost:8080/manager/sessions?path=/examples，浏览器显示如下： <BR><BR>OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes <BR><BR>5：启动和关闭应用程序 <BR>在浏览器中输入http://localhost:8080/manager/start?path=/examples和http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。 <BR><BR>6：部署及撤销部署 <BR>WAR有两种组织方式，一种是按一定的目录结构组织文件，一种是一个后缀为WAR的压缩包，因此它的部署方式也有两种： <BR>(1)：在浏览器中输入：http://localhost:8080/manager/install?path=/examples&war=file:/c:\examples <BR>就会将按目录结构组织的WAR部署 <BR><BR>(2)：如果输入:http://localhost:8080/manager/install?path=/examples&war=jar:file:/c:\examples.war!/ <BR>就会将按压缩包组织的WAR部署，注意此url后半部分一定要有!/号。 <BR><BR>部署后就可以用 http://localhost:8080/examples访问了。 <BR><BR>在浏览器中输入：http://localhost:8080/manager/remove?path=/examples <BR>就会撤销刚才部署的应用程序。 <BR><BR>(四)：与apache集成 <BR>虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来。 <BR><BR>我们以linux系统为例介绍. <BR><BR>从apache网站下载apache1.3.22源代码版本，然后使用如下命令配置安装apache： <BR><BR>mkdir /usr/local/apache <BR>tar zxvf apache.1.32.tar.gz <BR>cd apache.1.32 <BR>./configure --prefix=/usr/local/apache --enable-module=so <BR>make <BR>make install <BR><BR>注意configure命令指定目标安装目录，并且加入DSO(Dynamic Shared Object)支持，注意一定不要忘了这一个选项。 <BR><BR>然后下载webapp模块，将解压后mod_webapp.so文件放入apache的libexec目录，编辑apache的conf目录下的httpd.conf，在这个文件的最后加入下面三行： <BR><BR>LoadModule webapp_module libexec/mod_webapp.so <BR>WebAppConnection warpConnection warp localhost:8008 <BR>WebAppDeploy examples warpConnection /examples/ <BR><BR>第一行是加入webapp模块，如果编译apache时不增加DSO支持，则无法使用LoadModule指令，第二行指定tomcat与apache的连接，第三行指定部署那个应用，这两个指令使用格式如下： <BR><BR>WebAppConnection [connection name] [provider] [host:port] <BR>WebAppDeploy [application name] [connection name] [url path] <BR><BR>其中connection name指定连接名，provider只能是warp，port端口与你的tomcat的配置文件server.xml最后几行指定的要保持一致。文件如下： <BR><BR><Service name="Tomcat-Apache"> <BR><Connector className="org.apache.catalina.connector.warp.WarpConnector" <BR>port="8008" minProcessors="5" maxProcessors="75" <BR>enableLookups="true" <BR>acceptCount="10" debug="0"/> <BR>****** <BR></Service> <BR><BR>application name与你在tomcat中部署的应用名一致，url path指定访问这个应用的url。例如上面的例子可以通过http://localhost/examples/来访问tomcat中的examples应用。 <BR><BR>(五)：中文问题 <BR>一般jsp的乱码问题可以通过在jsp中加入<%@ page contentType="text/html;charset=GB2312" %>来解决，至于servlet的乱码在可以使用servlet2.3中提供的HttpServeletRequest.setCharacterEncoding函数。更详细的中文问题请见JSP/Servlet 中的汉字编码问题。 <BR><BR>四：综述 <BR>tomcat作为一个servlet(jsp也被编译为servlet执行)容器，其应用前景是非常好的，如果与jboss结合起来，则可以实现sun的j2ee规范(用jboss作ejb服务器)。jboss的官方网站也提供集成了tomcat3.2*的jboss以供下载。另外一个开源的应用服务器(enhydra) 也是基于tomcat的，其提供了更友好的管理界面，部署应用程序也更简单，功能也更强大。 <BR>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16260.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-02 10:12 <a href="http://www.blogjava.net/qq13367612/articles/16260.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/16261.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 02 Sep 2005 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16261.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16261.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16261.html</trackback:ping><description><![CDATA[一、Include的页面乱码<BR><BR>　　现象：include进来的页面出现乱码，其它页面正常。<BR><BR>　　原因：Tomcat在缺省情况下使用ISO-8859-1编码，但是在include时有时Tomcat不能正确根据外层.jsp文件的编码解析include进来的文件，造成include进来的文件中的中文乱码。<BR><BR>　　解决：这儿可以有很多解决办法，但是对于我们的中文环境，从根本上的解决办法是将Tomcat 5.0.19的核心缺省编码从ISO-8859-1修改为GBK 。可以在下面地址下载修改过的jar文件，<BR><A href="http://www.javaresearch.org/dn/tomcat-5.0.19-jar-zh.rar" target=_blank><BR></A>　　jasper-compiler.jar，jasper-runtime.jar位于/common/lib下，其它位于/server/lib下，将新的.jar文件替代原.jar即可。<BR>　　<BR>　　二、提交的数据乱码<BR><BR>　　现象：通过表单提交的数据出现乱码。<BR><BR>　　原因：原因未明。可能是Tomcat在接收到请求后，并没有能够根据request中的信息提前正确的编码方式。<BR><BR>　　解决：可以添加一个设置字符集的Filter。<BR><BR>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD><STRONG>package</STRONG> filters;<BR><BR><B>import</B> java.io.IOException;<BR><B>import</B> javax.servlet.Filter;<BR><B>import</B> javax.servlet.FilterChain;<BR><B>import</B> javax.servlet.FilterConfig;<BR><B>import</B> javax.servlet.ServletException;<BR><B>import</B> javax.servlet.ServletRequest;<BR><B>import</B> javax.servlet.ServletResponse;<BR><B>import</B> javax.servlet.UnavailableException;<BR><BR><B>public</B> <B>class</B> SetCharacterEncodingFilter <B>implements</B> Filter {<BR><B>　protected</B> String encoding = null;<BR><B>　protected</B> FilterConfig filterConfig = null;<BR><B>　protected</B> <B>boolean</B> ignore = <B>true</B>;<BR><BR><B>　public</B> <B>void</B> destroy() {<BR><B>　　this</B>.encoding = null;<BR><B>　　this</B>.filterConfig = null;<BR>　}<BR><BR><B>public</B> <B>void</B> doFilter(ServletRequest request, ServletResponse response,<BR>FilterChain chain)<BR><B>throws</B> IOException, ServletException {<BR><BR><FONT color=#006600><I>　// Conditionally select and set the character encoding to be used</I></FONT><BR><B>　if</B> (ignore || (request.getCharacterEncoding() == null)) {<BR>　　String encoding = selectEncoding(request);<BR><B>　　if</B> (encoding != null)<BR>　　　request.setCharacterEncoding(encoding);<BR>　}<BR><BR><FONT color=#006600><I>　// Pass control on to the next filter</I></FONT><BR>　chain.doFilter(request, response);<BR><BR>}<BR><BR><B>public</B> <B>void</B> init(FilterConfig filterConfig) <B>throws</B> ServletException {<BR><BR><B>　this</B>.filterConfig = filterConfig;<BR><B>　this</B>.encoding = filterConfig.getInitParameter(<FONT color=#000099>"encoding"</FONT>);<BR>　String value = filterConfig.getInitParameter(<FONT color=#000099>"ignore"</FONT>);<BR><B>　if</B> (value == null)<BR><B>　　this</B>.ignore = <B>true</B>;<BR><B>　else</B> <B>if</B> (value.equalsIgnoreCase(<FONT color=#000099>"true"</FONT>))<BR><B>　　this</B>.ignore = <B>true</B>;<BR><B>　else</B> <B>if</B> (value.equalsIgnoreCase(<FONT color=#000099>"yes"</FONT>))<BR><B>　　this</B>.ignore = <B>true</B>;<BR><B>　else</B><BR><B>　　this</B>.ignore = <B>false</B>;<BR><BR>}<BR><BR><B>protected</B> String selectEncoding(ServletRequest request) {<BR><B>　return</B> (<B>this</B>.encoding);<BR>}<BR><BR>}</TD></TR></TBODY></TABLE><BR>　　配置web.xml<BR><BR>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>＜filter＞<BR>　＜filter-name＞Set Character Encoding＜/filter-name＞<BR>　＜filter-class＞filters.SetCharacterEncodingFilter＜/filter-class＞<BR>　＜init-param＞<BR>　　＜param-name＞encoding＜/param-name＞<BR>　　＜param-value＞GBK＜/param-value＞<BR>　＜/init-param＞<BR>＜/filter＞<BR><BR>＜filter-mapping＞<BR>　＜filter-name＞Set Character Encoding＜/filter-name＞<BR>　＜url-pattern＞/*＜/url-pattern＞<BR>＜/filter-mapping＞</TD></TR></TBODY></TABLE><![CDATA[一、Include的页面乱码<BR><BR>　　现象：include进来的页面出现乱码，其它页面正常。<BR><BR>　　原因：Tomcat在缺省情况下使用ISO-8859-1编码，但是在include时有时Tomcat不能正确根据外层.jsp文件的编码解析include进来的文件，造成include进来的文件中的中文乱码。<BR><BR>　　解决：这儿可以有很多解决办法，但是对于我们的中文环境，从根本上的解决办法是将Tomcat 5.0.19的核心缺省编码从ISO-8859-1修改为GBK 。可以在下面地址下载修改过的jar文件，<BR><A href="http://www.javaresearch.org/dn/tomcat-5.0.19-jar-zh.rar" target=_blank><BR></A>　　jasper-compiler.jar，jasper-runtime.jar位于/common/lib下，其它位于/server/lib下，将新的.jar文件替代原.jar即可。<BR>　　<BR>　　二、提交的数据乱码<BR><BR>　　现象：通过表单提交的数据出现乱码。<BR><BR>　　原因：原因未明。可能是Tomcat在接收到请求后，并没有能够根据request中的信息提前正确的编码方式。<BR><BR>　　解决：可以添加一个设置字符集的Filter。<BR><BR>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD><STRONG>package</STRONG> filters;<BR><BR><B>import</B> java.io.IOException;<BR><B>import</B> javax.servlet.Filter;<BR><B>import</B> javax.servlet.FilterChain;<BR><B>import</B> javax.servlet.FilterConfig;<BR><B>import</B> javax.servlet.ServletException;<BR><B>import</B> javax.servlet.ServletRequest;<BR><B>import</B> javax.servlet.ServletResponse;<BR><B>import</B> javax.servlet.UnavailableException;<BR><BR><B>public</B> <B>class</B> SetCharacterEncodingFilter <B>implements</B> Filter {<BR><B>　protected</B> String encoding = null;<BR><B>　protected</B> FilterConfig filterConfig = null;<BR><B>　protected</B> <B>boolean</B> ignore = <B>true</B>;<BR><BR><B>　public</B> <B>void</B> destroy() {<BR><B>　　this</B>.encoding = null;<BR><B>　　this</B>.filterConfig = null;<BR>　}<BR><BR><B>public</B> <B>void</B> doFilter(ServletRequest request, ServletResponse response,<BR>FilterChain chain)<BR><B>throws</B> IOException, ServletException {<BR><BR><FONT color=#006600><I>　// Conditionally select and set the character encoding to be used</I></FONT><BR><B>　if</B> (ignore || (request.getCharacterEncoding() == null)) {<BR>　　String encoding = selectEncoding(request);<BR><B>　　if</B> (encoding != null)<BR>　　　request.setCharacterEncoding(encoding);<BR>　}<BR><BR><FONT color=#006600><I>　// Pass control on to the next filter</I></FONT><BR>　chain.doFilter(request, response);<BR><BR>}<BR><BR><B>public</B> <B>void</B> init(FilterConfig filterConfig) <B>throws</B> ServletException {<BR><BR><B>　this</B>.filterConfig = filterConfig;<BR><B>　this</B>.encoding = filterConfig.getInitParameter(<FONT color=#000099>"encoding"</FONT>);<BR>　String value = filterConfig.getInitParameter(<FONT color=#000099>"ignore"</FONT>);<BR><B>　if</B> (value == null)<BR><B>　　this</B>.ignore = <B>true</B>;<BR><B>　else</B> <B>if</B> (value.equalsIgnoreCase(<FONT color=#000099>"true"</FONT>))<BR><B>　　this</B>.ignore = <B>true</B>;<BR><B>　else</B> <B>if</B> (value.equalsIgnoreCase(<FONT color=#000099>"yes"</FONT>))<BR><B>　　this</B>.ignore = <B>true</B>;<BR><B>　else</B><BR><B>　　this</B>.ignore = <B>false</B>;<BR><BR>}<BR><BR><B>protected</B> String selectEncoding(ServletRequest request) {<BR><B>　return</B> (<B>this</B>.encoding);<BR>}<BR><BR>}</TD></TR></TBODY></TABLE><BR>　　配置web.xml<BR><BR>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>＜filter＞<BR>　＜filter-name＞Set Character Encoding＜/filter-name＞<BR>　＜filter-class＞filters.SetCharacterEncodingFilter＜/filter-class＞<BR>　＜init-param＞<BR>　　＜param-name＞encoding＜/param-name＞<BR>　　＜param-value＞GBK＜/param-value＞<BR>　＜/init-param＞<BR>＜/filter＞<BR><BR>＜filter-mapping＞<BR>　＜filter-name＞Set Character Encoding＜/filter-name＞<BR>　＜url-pattern＞/*＜/url-pattern＞<BR>＜/filter-mapping＞</TD></TR></TBODY></TABLE>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16261.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-02 10:09 <a href="http://www.blogjava.net/qq13367612/articles/16261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse+Tomcat+Lomboz的安装配置说明</title><link>http://www.blogjava.net/qq13367612/articles/16262.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 02 Sep 2005 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16262.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16262.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16262.html</trackback:ping><description><![CDATA[<P>一、软件下载：</P>
<P>1、Java</P>
<P>这里使用的是jdk1.4.2。</P>
<P>下载地址： <A href="http://dlc.sun.com/jdk/j2sdk-1_4_2_07-windows-i586-p.exe">http://dlc.sun.com/jdk/j2sdk-1_4_2_07-windows-i586-p.exe</A>；</P>
<P>2、Tomcat</P>
<P>这里的tomcat的版本是5.0的，安装版或是解压版都是可以的。</P>
<P>下载地址： <A href="http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.28/bin/jakarta-t">http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.28/bin/jakarta-t</A> omcat-5.0.28.exe </P>
<P>3、Tomcat插件</P>
<P>tomcatPluginV3.zip(下载之前需要查看插件是否适合eclipse的版本)</P>
<P>下载地址： <A href="http://www.sysdeo.com/eclipse/tomcatPluginV3.zip">http://www.sysdeo.com/eclipse/tomcatPluginV3.zip</A> </P>
<P>4、Eclipse</P>
<P>开发IDE eclipse-SDK-3.0.1-win32.zip</P>
<P>下载地址： <A href="http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.0.1">http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.0.1</A> -200409161125/download.php?dropFile=eclipse-SDK-3.0.1-win32.zip 语言包 NLpack-eclipse-SDK-3.0.x-win32.zip</P>
<P>下载地址： <A href="http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/L-3.0.1">http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/L-3.0.1</A> _Translations-200409161125/NLpack-eclipse-SDK-3.0.x-win32.zip </P>
<P>5、lomboz插件</P>
<P>lomboz插件需要下载两个部分，一个是emf环境，另一个是lomboz插件</P>
<P>下载地址： <A href="http://eclipse.mirrors.tds.net/tools/emf/downloads/drops/2.0.1/R20040917">http://eclipse.mirrors.tds.net/tools/emf/downloads/drops/2.0.1/R20040917</A> 1617/emf-sdo-runtime-2.0.1.zip</P>
<P>下载地址： <A href="http://download.forge.objectweb.org/lomboz/org.objectweb.lomboz_3.0.1.N2">http://download.forge.objectweb.org/lomboz/org.objectweb.lomboz_3.0.1.N2</A> 0050106.zip</P>
<P>二、软件安装：</P>
<P>1、Java安装</P>
<P>运行可执行文件j2sdk-1_4_2_07-windows-i586-p.exe，安装结束后需配置环境变量，在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量</P>
<P>CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\common\lib</P>
<P>JAVA_HOME: c:\j2sdk1.4.2</P>
<P>PATH: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;%JAVA_HOME%\bin;%TOMCAT_HOME%\bin</P>
<P>2、tomcat安装</P>
<P>解压版的直接解压就可以了，然后配置环境变量TOMCAT_HOME = C:\Program Files\Apache Software Foundation\Tomcat 5.0，安装版的要注意的两点，一个是安装完之后tomcat的服务就能够启动的了，但是还是要配置TOMCAT_HOME；第二个就是需要查看一下安装程序是不是把tomcat服务注册成为windows的启动服务，需要到“服务”里查看，如果有这个选项就把它设置为手动启动，并且先停止这个服务。</P>
<P>[测试]：使用startup.bat命令，服务正常启动之后，IE浏览器里输入<A href="http://localhost:8080/">http://localhost:8080/</A> 如果出现正常的页面，那就应该没有问题了。</P>
<P>3、Eclipse安装</P>
<P>Eclipse的安装很简单，只要解压，然后把Eclipse目录复制到盘符下就可以了，启动的时候，系统会自动寻找Jvm，当然可以再以后配置，但是好像是必须先安装jdk。我这里是放在D:\eclipse下</P>
<P>4、Tomcat插件安装，emf插件安装，lomboz插件安装，tomcatPluginV3.zip解压后将文件夹com.sysdeo.eclipse.tomcat_3.0.0拷贝到D:\eclipse\plugins emf插件和lomboz插件解压后将feature和plugins目录拷贝到 D:\eclipse\ 即可</P>
<P>三、Eclipse配置</P>
<P>配置Java</P>
<P>在Eclipse中点击windows->preferences,在出现的窗口中选择java->Installed JRES,这时可以在右边的窗口中看到己经有一项目，名字为j2re1.4.2_04。我们再在这里点击右面的"Add"按钮，增加一个JRE，在出现的对话框中输入：</P>
<P><BR>JRE  Type:  Standard  VM  <BR>JRE  name:  可以随意输入一个名字  <BR>JRE  home directory:这里选择你的JDK的安装目录，<BR>好比你的JDK装在F:\J2SDK\，<BR>那么这里就是选择F:\J2SDK\这个目录。  <BR>其它的可以都不管，点击OK就新增了一个JRE了<BR> </P>
<P> </P>
<P>这里修改完了之后回到preferences对话框中的Java->Build Path这一项，点击Build Path后，在右面的面板中我们选择Source and output folder下面的Folders这一项，而两个Source folder name和Output folder name的值我们不修改，保存为系统默认值，但是下面的As JRE library use:我们要选择为JRE_LIB variable这一项，不能为默认值JRE container，最后点击下面的Apply按钮。这一步千万不要忘记了，不然刚才的都是白做了。 </P>
<P>4、设置Lomboz </P>
<P>在Preferences窗口中选定Lomboz，然后把右边面板中的JDK Tools.jar选择为你安装好JDK后，在JAVA_HOME\LIB\目录下面的tools.jar文件就可以了，一定不要搞错了，如果你的JDK是安装在F:\J2SDK\下面，那么这里的值就应该是F:\J2SDK\lib\tools.jar，是其它的都不对。其它的保持为默认值。 </P>
<P>接着把Lomboz这一项展开，关键要设置的地方是Server Definitions这一项，另外两项Code Generation和JSP Editor可以不管。 </P>
<P>展开Lomboz的Server Definitions后，在Server types里选择Apache Tomcat v4.1.0(这是按照我的机器上的配置进行设置的，如果你安装的是其它版本的TOMCAT，你就要选择对应的选项)，主要设置如下： </P>
<P>Properties </P>
<P>Application Server Directory:这是我的TOMCAT 4.1.30的安装目录，我装在F:\tomcat下面，所以它的值就是F:/tomcat </P>
<P>Address:127.0.0.1 </P>
<P>Port：80(因为我在TOMCAT中把8080改为80了，所以这里就是80了，以你的TOMCAT的监听端口为准) </P>
<P>Classpath Variable Name: TOMCAT_HOME(可以修改成其它的字符串) </P>
<P>Classpath Variable: F:/tomcat(TOMCAT的安装目录) </P>
<P>然后点击Apply按钮。 </P>
<P>Server Classpath: </P>
<P><BR>JDK_TOOLS  <BR>${classPathVariableName}/bin/bootstrap.jar  <BR>${classPathVariableName}/common/servlet.jar  <BR>${classPathVariableName}/common/jasper-runtime.jar<BR> </P>
<P> </P>
<P>然后点击Apply按钮。 </P>
<P>Client Classpath:这里为空，什么也没有。 </P>
<P>Project Classpath: </P>
<P><BR>JDK_TOOLS  <BR>${classPathVariableName}/bin/bootstrap.jar  <BR>${classPathVariableName}/common/servlet.jar  <BR>${classPathVariableName}/common/jasper-runtime.jar<BR> </P>
<P> </P>
<P>然后点击Apply按钮。 </P>
<P>这里的Server Classpath:和Project Classpath:我设置的是一样的。 </P>
<P>注意：（以上配置 Server Classpath与 Project Classpath时，可能因为tomcat版本的不同而*.jar的文件位置也不同，如果时tomcat5.x版的 ,则${classPathVariableName}/common/servlet.jar 与 ${classPathVariableName}/common/jasper-runtime.jar 应为${classPathVariableName}/common/lib/servlet-api.jar 与 ${classPathVariableName}/common/lib/jasper-runtime.jar ，比4.x版的多了一层lib目录。） </P>
<P>5、修改文件 </P>
<P>把Eclipse_home\plugins\com.objectlearn.jdt.j2ee_3.0.1\servers下面对应的server文件打开，比如我安装的TOMCAT是4.1.30版的，那么就把tomcat410.server这个文件打开，把里面的 </P>
<P><BR>-Djava.endorsed.dirs="$<BR>{<BR>serverRootDirectory}/bin;<BR>$<BR>{<BR>serverRootDirectory<BR>}<BR>/common/endorsed"<BR> </P>
<P> </P>
<P>改成： </P>
<P><BR>-Djava.endorsed.dirs="$<BR>{<BR>serverRootDirectory<BR>}<BR>/common/endorsed"<BR> </P>
<P> </P>
<P>一共有两处，都要修改，修改完之后保存，退出，重新启动Eclipse，这一步很重要，一定要做，不然的话你在Lomboz中启动TOMCAT的时候会再现很多莫明其妙的异常的。 </P>
<P>注意：如果用的是tomcat5.x版的可能没有以上东西要改。 </P>
<P>6、调出Lomboz各个菜单 </P>
<P>启动Eclipse，然后点击windows->Customize Perspective,在出现的对话框中的Shortcuts页面中首先选中左边面板中的Lomboz J2EE Wizards，这时右边的面板中会出现很多选项的，同时也把它们各项前面的对钩打上。 </P>
<P>然后在这个Shortcuts面板中改变Submenus:的值，选择Show View，接着在出现的面板的左边里选中Lomboz J2EE，同时也要把它前面的方框中打上对钩。 </P>
<P>最后是更换Customize Perspective对话框中的面板到Commands这一页：在Commands这一页中选定Lomboz Actions同时也把它们各项前面的对钩打上。所有的设置完毕。 </P>
<P>这样一切做完之后，Eclipse和Lomboz的环境就配置好了，你可以进行开发各种程序了。 </P>
<P>个人体会： </P>
<P>可能在第5步中有些机器上可以不做，因为有不同的TOMCAT版本，不过有些机器一定要改了才行，不然的话是不能正常启动TOMCAT的。我个人使用TOMCAT4.1.30版的，是因为我觉得这个版本的比较小，运行起来也比较快，比5.0以上版本的要快多了，而且也要相对稳定一些(个人看法，不代表其他人的)，还有就是对于Eclipse 3.0的，可以参照上面的说明进行配置，基本上也可以行得通的，没有什么比较大的问题。 <BR></P><![CDATA[<P>一、软件下载：</P>
<P>1、Java</P>
<P>这里使用的是jdk1.4.2。</P>
<P>下载地址： <A href="http://dlc.sun.com/jdk/j2sdk-1_4_2_07-windows-i586-p.exe">http://dlc.sun.com/jdk/j2sdk-1_4_2_07-windows-i586-p.exe</A>；</P>
<P>2、Tomcat</P>
<P>这里的tomcat的版本是5.0的，安装版或是解压版都是可以的。</P>
<P>下载地址： <A href="http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.28/bin/jakarta-t">http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.28/bin/jakarta-t</A> omcat-5.0.28.exe </P>
<P>3、Tomcat插件</P>
<P>tomcatPluginV3.zip(下载之前需要查看插件是否适合eclipse的版本)</P>
<P>下载地址： <A href="http://www.sysdeo.com/eclipse/tomcatPluginV3.zip">http://www.sysdeo.com/eclipse/tomcatPluginV3.zip</A> </P>
<P>4、Eclipse</P>
<P>开发IDE eclipse-SDK-3.0.1-win32.zip</P>
<P>下载地址： <A href="http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.0.1">http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.0.1</A> -200409161125/download.php?dropFile=eclipse-SDK-3.0.1-win32.zip 语言包 NLpack-eclipse-SDK-3.0.x-win32.zip</P>
<P>下载地址： <A href="http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/L-3.0.1">http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/L-3.0.1</A> _Translations-200409161125/NLpack-eclipse-SDK-3.0.x-win32.zip </P>
<P>5、lomboz插件</P>
<P>lomboz插件需要下载两个部分，一个是emf环境，另一个是lomboz插件</P>
<P>下载地址： <A href="http://eclipse.mirrors.tds.net/tools/emf/downloads/drops/2.0.1/R20040917">http://eclipse.mirrors.tds.net/tools/emf/downloads/drops/2.0.1/R20040917</A> 1617/emf-sdo-runtime-2.0.1.zip</P>
<P>下载地址： <A href="http://download.forge.objectweb.org/lomboz/org.objectweb.lomboz_3.0.1.N2">http://download.forge.objectweb.org/lomboz/org.objectweb.lomboz_3.0.1.N2</A> 0050106.zip</P>
<P>二、软件安装：</P>
<P>1、Java安装</P>
<P>运行可执行文件j2sdk-1_4_2_07-windows-i586-p.exe，安装结束后需配置环境变量，在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量</P>
<P>CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\common\lib</P>
<P>JAVA_HOME: c:\j2sdk1.4.2</P>
<P>PATH: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;%JAVA_HOME%\bin;%TOMCAT_HOME%\bin</P>
<P>2、tomcat安装</P>
<P>解压版的直接解压就可以了，然后配置环境变量TOMCAT_HOME = C:\Program Files\Apache Software Foundation\Tomcat 5.0，安装版的要注意的两点，一个是安装完之后tomcat的服务就能够启动的了，但是还是要配置TOMCAT_HOME；第二个就是需要查看一下安装程序是不是把tomcat服务注册成为windows的启动服务，需要到“服务”里查看，如果有这个选项就把它设置为手动启动，并且先停止这个服务。</P>
<P>[测试]：使用startup.bat命令，服务正常启动之后，IE浏览器里输入<A href="http://localhost:8080/">http://localhost:8080/</A> 如果出现正常的页面，那就应该没有问题了。</P>
<P>3、Eclipse安装</P>
<P>Eclipse的安装很简单，只要解压，然后把Eclipse目录复制到盘符下就可以了，启动的时候，系统会自动寻找Jvm，当然可以再以后配置，但是好像是必须先安装jdk。我这里是放在D:\eclipse下</P>
<P>4、Tomcat插件安装，emf插件安装，lomboz插件安装，tomcatPluginV3.zip解压后将文件夹com.sysdeo.eclipse.tomcat_3.0.0拷贝到D:\eclipse\plugins emf插件和lomboz插件解压后将feature和plugins目录拷贝到 D:\eclipse\ 即可</P>
<P>三、Eclipse配置</P>
<P>配置Java</P>
<P>在Eclipse中点击windows->preferences,在出现的窗口中选择java->Installed JRES,这时可以在右边的窗口中看到己经有一项目，名字为j2re1.4.2_04。我们再在这里点击右面的"Add"按钮，增加一个JRE，在出现的对话框中输入：</P>
<P><BR>JRE  Type:  Standard  VM  <BR>JRE  name:  可以随意输入一个名字  <BR>JRE  home directory:这里选择你的JDK的安装目录，<BR>好比你的JDK装在F:\J2SDK\，<BR>那么这里就是选择F:\J2SDK\这个目录。  <BR>其它的可以都不管，点击OK就新增了一个JRE了<BR> </P>
<P> </P>
<P>这里修改完了之后回到preferences对话框中的Java->Build Path这一项，点击Build Path后，在右面的面板中我们选择Source and output folder下面的Folders这一项，而两个Source folder name和Output folder name的值我们不修改，保存为系统默认值，但是下面的As JRE library use:我们要选择为JRE_LIB variable这一项，不能为默认值JRE container，最后点击下面的Apply按钮。这一步千万不要忘记了，不然刚才的都是白做了。 </P>
<P>4、设置Lomboz </P>
<P>在Preferences窗口中选定Lomboz，然后把右边面板中的JDK Tools.jar选择为你安装好JDK后，在JAVA_HOME\LIB\目录下面的tools.jar文件就可以了，一定不要搞错了，如果你的JDK是安装在F:\J2SDK\下面，那么这里的值就应该是F:\J2SDK\lib\tools.jar，是其它的都不对。其它的保持为默认值。 </P>
<P>接着把Lomboz这一项展开，关键要设置的地方是Server Definitions这一项，另外两项Code Generation和JSP Editor可以不管。 </P>
<P>展开Lomboz的Server Definitions后，在Server types里选择Apache Tomcat v4.1.0(这是按照我的机器上的配置进行设置的，如果你安装的是其它版本的TOMCAT，你就要选择对应的选项)，主要设置如下： </P>
<P>Properties </P>
<P>Application Server Directory:这是我的TOMCAT 4.1.30的安装目录，我装在F:\tomcat下面，所以它的值就是F:/tomcat </P>
<P>Address:127.0.0.1 </P>
<P>Port：80(因为我在TOMCAT中把8080改为80了，所以这里就是80了，以你的TOMCAT的监听端口为准) </P>
<P>Classpath Variable Name: TOMCAT_HOME(可以修改成其它的字符串) </P>
<P>Classpath Variable: F:/tomcat(TOMCAT的安装目录) </P>
<P>然后点击Apply按钮。 </P>
<P>Server Classpath: </P>
<P><BR>JDK_TOOLS  <BR>${classPathVariableName}/bin/bootstrap.jar  <BR>${classPathVariableName}/common/servlet.jar  <BR>${classPathVariableName}/common/jasper-runtime.jar<BR> </P>
<P> </P>
<P>然后点击Apply按钮。 </P>
<P>Client Classpath:这里为空，什么也没有。 </P>
<P>Project Classpath: </P>
<P><BR>JDK_TOOLS  <BR>${classPathVariableName}/bin/bootstrap.jar  <BR>${classPathVariableName}/common/servlet.jar  <BR>${classPathVariableName}/common/jasper-runtime.jar<BR> </P>
<P> </P>
<P>然后点击Apply按钮。 </P>
<P>这里的Server Classpath:和Project Classpath:我设置的是一样的。 </P>
<P>注意：（以上配置 Server Classpath与 Project Classpath时，可能因为tomcat版本的不同而*.jar的文件位置也不同，如果时tomcat5.x版的 ,则${classPathVariableName}/common/servlet.jar 与 ${classPathVariableName}/common/jasper-runtime.jar 应为${classPathVariableName}/common/lib/servlet-api.jar 与 ${classPathVariableName}/common/lib/jasper-runtime.jar ，比4.x版的多了一层lib目录。） </P>
<P>5、修改文件 </P>
<P>把Eclipse_home\plugins\com.objectlearn.jdt.j2ee_3.0.1\servers下面对应的server文件打开，比如我安装的TOMCAT是4.1.30版的，那么就把tomcat410.server这个文件打开，把里面的 </P>
<P><BR>-Djava.endorsed.dirs="$<BR>{<BR>serverRootDirectory}/bin;<BR>$<BR>{<BR>serverRootDirectory<BR>}<BR>/common/endorsed"<BR> </P>
<P> </P>
<P>改成： </P>
<P><BR>-Djava.endorsed.dirs="$<BR>{<BR>serverRootDirectory<BR>}<BR>/common/endorsed"<BR> </P>
<P> </P>
<P>一共有两处，都要修改，修改完之后保存，退出，重新启动Eclipse，这一步很重要，一定要做，不然的话你在Lomboz中启动TOMCAT的时候会再现很多莫明其妙的异常的。 </P>
<P>注意：如果用的是tomcat5.x版的可能没有以上东西要改。 </P>
<P>6、调出Lomboz各个菜单 </P>
<P>启动Eclipse，然后点击windows->Customize Perspective,在出现的对话框中的Shortcuts页面中首先选中左边面板中的Lomboz J2EE Wizards，这时右边的面板中会出现很多选项的，同时也把它们各项前面的对钩打上。 </P>
<P>然后在这个Shortcuts面板中改变Submenus:的值，选择Show View，接着在出现的面板的左边里选中Lomboz J2EE，同时也要把它前面的方框中打上对钩。 </P>
<P>最后是更换Customize Perspective对话框中的面板到Commands这一页：在Commands这一页中选定Lomboz Actions同时也把它们各项前面的对钩打上。所有的设置完毕。 </P>
<P>这样一切做完之后，Eclipse和Lomboz的环境就配置好了，你可以进行开发各种程序了。 </P>
<P>个人体会： </P>
<P>可能在第5步中有些机器上可以不做，因为有不同的TOMCAT版本，不过有些机器一定要改了才行，不然的话是不能正常启动TOMCAT的。我个人使用TOMCAT4.1.30版的，是因为我觉得这个版本的比较小，运行起来也比较快，比5.0以上版本的要快多了，而且也要相对稳定一些(个人看法，不代表其他人的)，还有就是对于Eclipse 3.0的，可以参照上面的说明进行配置，基本上也可以行得通的，没有什么比较大的问题。 <BR></P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16262.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-02 10:07 <a href="http://www.blogjava.net/qq13367612/articles/16262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat配置web在线后台管理</title><link>http://www.blogjava.net/qq13367612/articles/16265.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Thu, 01 Sep 2005 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16265.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16265.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16265.html</trackback:ping><description><![CDATA[<P>默认的时候，当我们安装完tomcat后，输入网址：<A href="http://localhost:8080/admin/">http://localhost:8080/admin/</A></P>
<P>会提示“TOMCAT web Server Administrator"下面是要输入用户和密码，因为默认的时候是没有管理用户的权限的用户，所以我们要创建一个：</P>
<P>在你的tomcat/conf/下有个tomcat-users.xml</P>
<P>打开：</P>
<P> <?xml version='1.0' encoding='utf-8'?><BR><tomcat-users><BR>  <role rolename="tomcat"/><BR>  <role rolename="role1"/><BR>  <role rolename="standard"/><BR>  <role rolename="manager"/><BR>  <role rolename="admin"/><BR>    <user username="tomcat" password="tomcat" roles="tomcat"/><BR>    <user username="role1" password="tomcat" roles="role1"/><BR>  <user username="both" password="tomcat" roles="tomcat,role1"/><BR></tomcat-users><BR> </P>
<P><BR>我们看到在tomcat用户配置文件里，有tomcat,manager,admin等几个角色，下面我们增加一个用户，并为他赋予全部权限：</P>
<P><user username="123" password="123" roles="admin,manager,tomcat"/><BR>保存文件，重新启动tomcat,打开<A href="http://localhost:8080/admin/">http://localhost:8080/admin/</A>,输入用户名和密码：</P>
<P>OK!期待中的tomcat web管理后台出现了，可以用它配置数据源，连接池等，相应的配置，tomcat会自动修改server.xml文件。</P><![CDATA[<P>默认的时候，当我们安装完tomcat后，输入网址：<A href="http://localhost:8080/admin/">http://localhost:8080/admin/</A></P>
<P>会提示“TOMCAT web Server Administrator"下面是要输入用户和密码，因为默认的时候是没有管理用户的权限的用户，所以我们要创建一个：</P>
<P>在你的tomcat/conf/下有个tomcat-users.xml</P>
<P>打开：</P>
<P> <?xml version='1.0' encoding='utf-8'?><BR><tomcat-users><BR>  <role rolename="tomcat"/><BR>  <role rolename="role1"/><BR>  <role rolename="standard"/><BR>  <role rolename="manager"/><BR>  <role rolename="admin"/><BR>    <user username="tomcat" password="tomcat" roles="tomcat"/><BR>    <user username="role1" password="tomcat" roles="role1"/><BR>  <user username="both" password="tomcat" roles="tomcat,role1"/><BR></tomcat-users><BR> </P>
<P><BR>我们看到在tomcat用户配置文件里，有tomcat,manager,admin等几个角色，下面我们增加一个用户，并为他赋予全部权限：</P>
<P><user username="123" password="123" roles="admin,manager,tomcat"/><BR>保存文件，重新启动tomcat,打开<A href="http://localhost:8080/admin/">http://localhost:8080/admin/</A>,输入用户名和密码：</P>
<P>OK!期待中的tomcat web管理后台出现了，可以用它配置数据源，连接池等，相应的配置，tomcat会自动修改server.xml文件。</P>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16265.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-01 16:40 <a href="http://www.blogjava.net/qq13367612/articles/16265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧</title><link>http://www.blogjava.net/qq13367612/articles/16266.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Thu, 01 Sep 2005 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/16266.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/16266.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/16266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/16266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/16266.html</trackback:ping><description><![CDATA[现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。<BR><BR>你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。—— Jason Brittain<BR><BR>1． 配置系统管理（Admin Web Application）<BR>大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。<BR><BR>Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。<BR>（译者注：CATALINA_BASE即tomcat安装目录下的server目录）<BR><BR>你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。<BR><BR>如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下：<BR><BR><role name="admin"/><BR><BR>你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）：<BR><BR><user name="admin" password="deep_dark_secret" roles="admin"/><BR><BR>当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<BR><BR>2．配置应用管理（Manager Web Application）<BR>Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。<BR><BR>Manager Web Application被被定义在一个自动部署文件中：<BR><BR>CATALINA_BASE/webapps/manager.xml 。<BR><BR>你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。<BR>（译者注：CATALINA_HOME即tomcat安装目录）<BR><BR>如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中：<BR><BR><role name=”manager”><BR><BR>你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：<BR><BR><user name="manager" password="deep_dark_secret" roles="manager"/><BR><BR>然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。<BR><BR>Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。<BR><BR>Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误——“503 - This application is not currently available”。<BR><BR>移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<BR><BR>3．部署一个web应用<BR>有两个办法可以在系统中部署web服务。<BR>1> 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<BR>2> 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。<BR><BR>如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。<BR><BR>部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。<BR><BR>举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<BR><BR><!--  <BR> Context fragment for deploying MyWebApp.war  <BR>--><BR><Context path="/demo" docBase="webapps/MyWebApp.war" <BR>        debug="0" privileged="true"><BR> <Realm className="org.apache.catalina.realm.UserDatabaseRealm"                <BR>        resourceName="UserDatabase"/> <BR></Context><BR><BR>把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。<BR><BR>这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<BR><BR><BR>4．配置虚拟主机（Virtual Hosts）<BR>关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。<BR><BR>基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<BR>在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<BR><BR><Server port="8005" shutdown="SHUTDOWN" debug="0"><BR> <Service name="Tomcat-Standalone"><BR>   <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<BR>port="8080" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"/><BR>   <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<BR>port="8443" minProcessors="5" maxProcessors="75"<BR>acceptCount="10" debug="0" scheme="https" secure="true"/><BR>     <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<BR>clientAuth="false" protocol="TLS" /><BR>   </Connector><BR>   <Engine name="Standalone" defaultHost="localhost" debug="0"><BR>     <!-- This Host is the default Host --><BR>     <Host name="localhost" debug="0" appBase="webapps"<BR>     unpackWARs="true" autoDeploy="true"><BR>       <Context path="" docBase="ROOT" debug="0"/><BR>       <Context path="/orders" docBase="/home/ian/orders" debug="0"<BR>                      reloadable="true" crossContext="true"><BR>       </Context><BR>     </Host><BR><BR>     <!-- This Host is the first "Virtual Host": www.example.com --><BR>     <Host name="www.example.com" appBase="/home/example/webapp"><BR>       <Context path="" docBase="."/><BR>     </Host><BR><BR>   </Engine><BR> </Service><BR></Server><BR><BR>Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<BR><BR>5．配置基础验证（Basic Authentication）<BR>容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。<BR><BR>注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加<security-constraint>和<login-config>两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的<role>和<user>即可，然后重新启动Tomcat。<BR><BR>下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。<BR><BR><!--<BR> Define the Members-only area, by defining<BR> a "Security Constraint" on this Application, and<BR> mapping it to the subdirectory (URL) that we want<BR> to restrict.<BR>--><BR><security-constraint><BR> <web-resource-collection><BR>   <web-resource-name><BR>     Entire Application<BR>   </web-resource-name><BR>   <url-pattern>/members/*</url-pattern><BR> </web-resource-collection><BR> <auth-constraint><BR>     <role-name>member</role-name><BR> </auth-constraint><BR></security-constraint><BR><!-- Define the Login Configuration for this Application --><BR><login-config><BR> <auth-method>BASIC</auth-method><BR> <realm-name>My Club Members-only Area</realm-name><BR></login-config><BR><BR>6．配置单点登录（Single Sign-On）<BR>一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。<BR><BR>Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：<BR><BR><Valve className="org.apache.catalina.authenticator.SingleSignOn"<BR>      debug="0"/><BR><BR>在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。<BR><BR>使用single sign-on valve有一些重要的限制：<BR>1> value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<BR>2> 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<BR>3> 不能被context中的realm覆盖。<BR>4> 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的<auth-method>中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<BR>5> 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<BR>6> 单点登录需要使用cookies。<BR><BR>7．配置用户定制目录（Customized User Directores）<BR>一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如：<BR><BR>http://www.cs.myuniversity.edu/~username<BR>http://members.mybigisp.com/~username<BR><BR>Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。<BR><BR><Listener className="org.apache.catalina.startup.UserConfig" <BR>directoryName="public_html" <BR>userClass="org.apache.catalina.startup.PasswdUserDatabase"/><BR><BR>web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。<BR><BR>实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。<BR><BR><Listener className="org.apache.catalina.startup.UserConfig" <BR>directoryName="public_html" homeBase="/home" <BR>userClass="org.apache.catalina.startup.HomesUserDatabase"/><BR><BR>这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。<BR><BR>这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。<BR><BR><BR>8．在Tomcat中使用CGI脚本<BR>Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。<BR><BR>Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。<BR><BR>为了使Tomcat能够运行CGI，你必须做如下几件事：<BR>1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<BR>2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于<servlet-name> CGI的那段的注释去掉（默认情况下，该段位于第241行）。<BR>3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<BR>4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<BR>5. 重新启动Tomcat，你的CGI就可以运行了。<BR><BR>在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。<BR><BR>9．改变Tomcat中的JSP编译器（JSP Compiler）<BR>在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在<init-param> 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<BR><BR><servlet><BR>   <servlet-name>jsp</servlet-name><BR>   <servlet-class><BR>     org.apache.jasper.servlet.JspServlet<BR>   </servlet-class><BR>   <init-param><BR>     <param-name>logVerbosityLevel</param-name><BR>     <param-value>WARNING</param-value><BR>   </init-param><BR>   <init-param><BR>     <param-name>compiler</param-name><BR>     <param-value>jikes</param-value><BR>   </init-param><BR>   <load-on-startup>3</load-on-startup><BR></servlet><BR><BR>当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。<BR><BR>10．限制特定主机访问（Restricting Access to Specific Hosts）<BR>有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。<BR><BR>通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。<BR>例如你可以把Admin Web application设置成只允许本地访问，设置如下：<BR><BR><Context path="/path/to/secret_files" ...><BR> <Valve className="org.apache.catalina.valves.RemoteAddrValve"<BR>        allow="127.0.0.1" deny=""/><BR></Context><BR><BR>如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<BR><![CDATA[现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。<BR><BR>你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。—— Jason Brittain<BR><BR>1． 配置系统管理（Admin Web Application）<BR>大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。<BR><BR>Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。<BR>（译者注：CATALINA_BASE即tomcat安装目录下的server目录）<BR><BR>你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。<BR><BR>如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下：<BR><BR><role name="admin"/><BR><BR>你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）：<BR><BR><user name="admin" password="deep_dark_secret" roles="admin"/><BR><BR>当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<BR><BR>2．配置应用管理（Manager Web Application）<BR>Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。<BR><BR>Manager Web Application被被定义在一个自动部署文件中：<BR><BR>CATALINA_BASE/webapps/manager.xml 。<BR><BR>你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。<BR>（译者注：CATALINA_HOME即tomcat安装目录）<BR><BR>如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中：<BR><BR><role name=”manager”><BR><BR>你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：<BR><BR><user name="manager" password="deep_dark_secret" roles="manager"/><BR><BR>然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。<BR><BR>Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。<BR><BR>Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误——“503 - This application is not currently available”。<BR><BR>移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<BR><BR>3．部署一个web应用<BR>有两个办法可以在系统中部署web服务。<BR>1> 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<BR>2> 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。<BR><BR>如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。<BR><BR>部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。<BR><BR>举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<BR><BR><!--  <BR> Context fragment for deploying MyWebApp.war  <BR>--><BR><Context path="/demo" docBase="webapps/MyWebApp.war" <BR>        debug="0" privileged="true"><BR> <Realm className="org.apache.catalina.realm.UserDatabaseRealm"                <BR>        resourceName="UserDatabase"/> <BR></Context><BR><BR>把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。<BR><BR>这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<BR><BR><BR>4．配置虚拟主机（Virtual Hosts）<BR>关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。<BR><BR>基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<BR>在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<BR><BR><Server port="8005" shutdown="SHUTDOWN" debug="0"><BR> <Service name="Tomcat-Standalone"><BR>   <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<BR>port="8080" minProcessors="5" maxProcessors="75"<BR>enableLookups="true" redirectPort="8443"/><BR>   <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<BR>port="8443" minProcessors="5" maxProcessors="75"<BR>acceptCount="10" debug="0" scheme="https" secure="true"/><BR>     <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<BR>clientAuth="false" protocol="TLS" /><BR>   </Connector><BR>   <Engine name="Standalone" defaultHost="localhost" debug="0"><BR>     <!-- This Host is the default Host --><BR>     <Host name="localhost" debug="0" appBase="webapps"<BR>     unpackWARs="true" autoDeploy="true"><BR>       <Context path="" docBase="ROOT" debug="0"/><BR>       <Context path="/orders" docBase="/home/ian/orders" debug="0"<BR>                      reloadable="true" crossContext="true"><BR>       </Context><BR>     </Host><BR><BR>     <!-- This Host is the first "Virtual Host": www.example.com --><BR>     <Host name="www.example.com" appBase="/home/example/webapp"><BR>       <Context path="" docBase="."/><BR>     </Host><BR><BR>   </Engine><BR> </Service><BR></Server><BR><BR>Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<BR><BR>5．配置基础验证（Basic Authentication）<BR>容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。<BR><BR>注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加<security-constraint>和<login-config>两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的<role>和<user>即可，然后重新启动Tomcat。<BR><BR>下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。<BR><BR><!--<BR> Define the Members-only area, by defining<BR> a "Security Constraint" on this Application, and<BR> mapping it to the subdirectory (URL) that we want<BR> to restrict.<BR>--><BR><security-constraint><BR> <web-resource-collection><BR>   <web-resource-name><BR>     Entire Application<BR>   </web-resource-name><BR>   <url-pattern>/members/*</url-pattern><BR> </web-resource-collection><BR> <auth-constraint><BR>     <role-name>member</role-name><BR> </auth-constraint><BR></security-constraint><BR><!-- Define the Login Configuration for this Application --><BR><login-config><BR> <auth-method>BASIC</auth-method><BR> <realm-name>My Club Members-only Area</realm-name><BR></login-config><BR><BR>6．配置单点登录（Single Sign-On）<BR>一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。<BR><BR>Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：<BR><BR><Valve className="org.apache.catalina.authenticator.SingleSignOn"<BR>      debug="0"/><BR><BR>在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。<BR><BR>使用single sign-on valve有一些重要的限制：<BR>1> value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<BR>2> 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<BR>3> 不能被context中的realm覆盖。<BR>4> 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的<auth-method>中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<BR>5> 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<BR>6> 单点登录需要使用cookies。<BR><BR>7．配置用户定制目录（Customized User Directores）<BR>一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如：<BR><BR>http://www.cs.myuniversity.edu/~username<BR>http://members.mybigisp.com/~username<BR><BR>Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。<BR><BR><Listener className="org.apache.catalina.startup.UserConfig" <BR>directoryName="public_html" <BR>userClass="org.apache.catalina.startup.PasswdUserDatabase"/><BR><BR>web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。<BR><BR>实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。<BR><BR><Listener className="org.apache.catalina.startup.UserConfig" <BR>directoryName="public_html" homeBase="/home" <BR>userClass="org.apache.catalina.startup.HomesUserDatabase"/><BR><BR>这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。<BR><BR>这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。<BR><BR><BR>8．在Tomcat中使用CGI脚本<BR>Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。<BR><BR>Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。<BR><BR>为了使Tomcat能够运行CGI，你必须做如下几件事：<BR>1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<BR>2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于<servlet-name> CGI的那段的注释去掉（默认情况下，该段位于第241行）。<BR>3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<BR>4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<BR>5. 重新启动Tomcat，你的CGI就可以运行了。<BR><BR>在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。<BR><BR>9．改变Tomcat中的JSP编译器（JSP Compiler）<BR>在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在<init-param> 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<BR><BR><servlet><BR>   <servlet-name>jsp</servlet-name><BR>   <servlet-class><BR>     org.apache.jasper.servlet.JspServlet<BR>   </servlet-class><BR>   <init-param><BR>     <param-name>logVerbosityLevel</param-name><BR>     <param-value>WARNING</param-value><BR>   </init-param><BR>   <init-param><BR>     <param-name>compiler</param-name><BR>     <param-value>jikes</param-value><BR>   </init-param><BR>   <load-on-startup>3</load-on-startup><BR></servlet><BR><BR>当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。<BR><BR>10．限制特定主机访问（Restricting Access to Specific Hosts）<BR>有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。<BR><BR>通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。<BR>例如你可以把Admin Web application设置成只允许本地访问，设置如下：<BR><BR><Context path="/path/to/secret_files" ...><BR> <Valve className="org.apache.catalina.valves.RemoteAddrValve"<BR>        allow="127.0.0.1" deny=""/><BR></Context><BR><BR>如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<BR>]]&gt;<img src ="http://www.blogjava.net/qq13367612/aggbug/16266.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-01 14:55 <a href="http://www.blogjava.net/qq13367612/articles/16266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>