﻿<?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-風向逆轉 - 就要爪哇-文章分类-Web/App Server</title><link>http://www.blogjava.net/iKingQu/category/8712.html</link><description>Java菜鸟升级中...</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:26:03 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:26:03 GMT</pubDate><ttl>60</ttl><item><title>[收藏]Tomcat中的开发应用系统常见的配置 </title><link>http://www.blogjava.net/iKingQu/articles/38738.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38738.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38738.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38738.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<div>
						<p>
								<strong>1.设置环境变量<br /></strong>Linux系统，修改catalina.sh和catalina.50.sh<br />JAVA_HOME=/usr/local/j2sdk1.4.2_06<br />JAVA_OPTS='-Xms512m -Xmx512m'<br />CATALINA_HOME=/usr/local/jakarta-tomcat-5.0.28<br />Windows系统，修改catalina.bat和catalina.50.bat<br />set JAVA_HOME=D:j2sdk1.4.2_06<br />set CATALINA_HOME=D:jakarta-tomcat-5.0.28</p>
						<p> </p>
						<p>
								<strong>2. 如何加大tomcat连接数<br /></strong>在tomcat配置文件server.xml中的&lt;Connector /&gt;配置中，和连接数相关的参数有：<br />minProcessors：最小空闲连接线程数，用于提高系统处理性能，默认值为10<br />maxProcessors：最大连接线程数，即：并发处理的最大请求数，默认值为75<br />acceptCount：允许的最大连接数，应大于等于maxProcessors，默认值为100<br />enableLookups：是否反查域名，取值为：true或false。为了提高处理能力，应设置为false<br />connectionTimeout：网络连接超时，单位：毫秒。设置为0表示永不超时，这样设置有隐患的。通常可设置为30000毫秒。<br />其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数，应同时加大这两个参数。<br />web server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。tomcat5中的配置示例：<br />    &lt;Connector port="8080"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               debug="0" connectionTimeout="20000" <br />               disableUploadTimeout="true" /&gt;<br />对于其他端口的侦听配置，以此类推。<br /></p>
						<p> </p>
						<p>
								<strong>3. tomcat中如何禁止列目录下的文件<br /></strong>在{tomcat_home}/conf/web.xml中，把listings参数设置成false即可，如下：<br />&lt;init-param&gt;<br />&lt;param-name&gt;listings&lt;/param-name&gt;<br />&lt;param-value&gt;false&lt;/param-value&gt;<br />&lt;/init-param&gt;<br /></p>
						<p> </p>
						<p>
								<strong>4.如何加大tomcat可以使用的内存<br /></strong>tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。<br />Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：<br />JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'<br />需要把这个两个参数值调大。例如：<br />JAVA_OPTS='-Xms256m -Xmx512m'<br />表示初始化内存为256MB，可以使用的最大内存为512MB <br /></p>
						<p> </p>
						<p>
								<strong>5. 如何添加默认访问页面<br /></strong>修改文件web.xml，在welcome-file里面加入需要的页面即可。<br />&lt;welcome-file-list&gt;<br />    &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />    &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />    &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&lt;/welcome-file-list&gt;<br /></p>
						<p> </p>
						<p>
								<strong>6. 如何添加出错页面</strong>
						</p>
						<p>修改文件web.xml，在location里面加入出错页面<br /> &lt;error-page&gt;<br />  &lt;error-code&gt;404&lt;/error-code&gt;<br />  &lt;location&gt;/error.jsp&lt;/location&gt;<br /> &lt;/error-page&gt;<br /> &lt;error-page&gt;<br />  &lt;error-code&gt;500&lt;/error-code&gt;<br />  &lt;location&gt;/error.jsp&lt;/location&gt;<br /> &lt;/error-page&gt; </p>
						<p> </p>
						<p>
								<strong>7.如何配置虚拟主机 <br /></strong>为了实现基于域名（IP地址）的虚拟主机，修改文件server.xml，加入以下内容：<br />      &lt;Host appBase="C:/webapp1" name="www.test1.com" unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />      &lt;Alias&gt;www.test1.com&lt;/Alias&gt;<br />      &lt;Alias&gt;192.168.1.110&lt;/Alias&gt;<br />      &lt;/Host&gt;<br />      &lt;Host appBase="C:/webapp2" name="www.test2.com" unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />      &lt;Alias&gt;www.test2.com&lt;/Alias&gt;<br />      &lt;Alias&gt;192.168.1.120&lt;/Alias&gt;<br />      &lt;/Host&gt;<br />在confCatalina目录下建立文件夹，文件夹的名称为”www.test1.com”和“www.test2.com”，然后在这两个目录下建立文件ROOT.xml，其“www.test1.com“目录下ROOT.xml内容为：<br />&lt;?xml version='1.0' encoding='utf-8'?&gt;<br />&lt;!--<br /> Context configuration file for the test1 App<br />--&gt;<br />&lt;Context displayName=www.test1.com path="/"  docBase="" useNaming="false"&gt;<br />        debug="0" privileged="true" reloadable="true"&gt;<br />    &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />                 directory="C:/webapp1/WEB-INF/logs" prefix="test1_log."<br />                 suffix=".txt" timestamp="true"/&gt;<br />    &lt;Valve className="org.apache.catalina.valves.AccessLogValve"<br />                 directory="logs"  prefix="test1_access_log." suffix=".txt"<br />                 pattern="combined" resolveHosts="false"/&gt;<br />&lt;/Context&gt;</p>
						<p> </p>
						<p>
								<strong>8. 如何配置mysql数据源<br /></strong>在本机建立数据库test，将mysql的JDBC驱动mysql-connector-java-3.0.9-stable-bin.jar拷贝到目录commonlib下，<br />修改文件web.xml，加入以下内容：<br />&lt;resource-ref&gt;<br />  &lt;description&gt;MySQL Datasource example&lt;/description&gt;<br />  &lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt;<br />  &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />  &lt;res-auth&gt;Container&lt;/res-auth&gt; <br /> &lt;/resource-ref&gt;<br /><br />在WEB应用的配置文件里加入以下内容：<br />&lt;Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/&gt; <br /> &lt;ResourceParams name="jdbc/test"&gt;   <br />  &lt;parameter&gt;<br />   &lt;name&gt;factory&lt;/name&gt;   <br />   &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br /> &lt;!-- Class name for mm.mysql JDBC driver --&gt;  <br />  &lt;parameter&gt;    <br />   &lt;name&gt;driverClassName&lt;/name&gt;      <br />   &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;   <br />  &lt;/parameter&gt; <br /> &lt;!-- The JDBC connection url for connecting to your MySQL dB.       <br />  The autoReconnect=true argument to the url makes sure that the mm.mysql JDBC Driver will automatically reconnect if mysqld closed the connection.  mysqld by default closes idle connections after 8 hours. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;url&lt;/name&gt;<br />   &lt;value&gt;jdbc:mysql://localhost:3306/test?autoReconnect=true&lt;/value&gt;<br />  &lt;/parameter&gt; <br /> &lt;!-- MySQL dB username and password for dB connections  --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;username&lt;/name&gt;   <br />   &lt;value&gt;root&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br />  &lt;parameter&gt;   <br />   &lt;name&gt;password&lt;/name&gt; <br />   &lt;value&gt;&lt;/value&gt;   <br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.  --&gt;<br />  &lt;parameter&gt;    <br />   &lt;name&gt;maxActive&lt;/name&gt;   <br />   &lt;value&gt;100&lt;/value&gt;   <br />  &lt;/parameter&gt;  <br /> &lt;!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;maxIdle&lt;/name&gt;<br />   &lt;value&gt;30&lt;/value&gt;<br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum time to wait for a dB connection to become available in ms, in this example 10 seconds. An Exception is thrown if this timeout is exceeded.  Set to -1 to wait indefinitely.  --&gt;   <br />  &lt;parameter&gt;     <br />   &lt;name&gt;maxWait&lt;/name&gt;<br />   &lt;value&gt;10000&lt;/value&gt;  <br />  &lt;/parameter&gt;<br />&lt;/ResourceParams&gt;&lt;resource-ref&gt;<br />  &lt;description&gt;MySQL Datasource example&lt;/description&gt;<br />  &lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt;<br />  &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />  &lt;res-auth&gt;Container&lt;/res-auth&gt; <br /> &lt;/resource-ref&gt;<br /><br />在WEB应用的配置文件里加入以下内容：<br />&lt;Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/&gt; <br /> &lt;ResourceParams name="jdbc/test"&gt;   <br />  &lt;parameter&gt;<br />   &lt;name&gt;factory&lt;/name&gt;   <br />   &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br /> &lt;!-- Class name for mm.mysql JDBC driver --&gt;  <br />  &lt;parameter&gt;    <br />   &lt;name&gt;driverClassName&lt;/name&gt;      <br />   &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;   <br />  &lt;/parameter&gt; <br /> &lt;!-- The JDBC connection url for connecting to your MySQL dB.       <br />  The autoReconnect=true argument to the url makes sure that the mm.mysql JDBC Driver will automatically reconnect if mysqld closed the connection.  mysqld by default closes idle connections after 8 hours. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;url&lt;/name&gt;<br />   &lt;value&gt;jdbc:mysql://localhost:3306/test?autoReconnect=true&lt;/value&gt;<br />  &lt;/parameter&gt; <br /> &lt;!-- MySQL dB username and password for dB connections  --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;username&lt;/name&gt;   <br />   &lt;value&gt;root&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br />  &lt;parameter&gt;   <br />   &lt;name&gt;password&lt;/name&gt; <br />   &lt;value&gt;&lt;/value&gt;   <br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.  --&gt;<br />  &lt;parameter&gt;    <br />   &lt;name&gt;maxActive&lt;/name&gt;   <br />   &lt;value&gt;100&lt;/value&gt;   <br />  &lt;/parameter&gt;  <br /> &lt;!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;maxIdle&lt;/name&gt;<br />   &lt;value&gt;30&lt;/value&gt;<br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum time to wait for a dB connection to become available in ms, in this example 10 seconds. An Exception is thrown if this timeout is exceeded.  Set to -1 to wait indefinitely.  --&gt;   <br />  &lt;parameter&gt;     <br />   &lt;name&gt;maxWait&lt;/name&gt;<br />   &lt;value&gt;10000&lt;/value&gt;  <br />  &lt;/parameter&gt;<br />&lt;/ResourceParams&gt; </p>
						<p> </p>
						<p>
								<strong>9. </strong>
								<strong>tomcat连接池的配置</strong>
						</p>
						<p>&lt;Resource name="jdbc/testDB" auth="Container"<br />               type="javax.sql.DataSource"/&gt; <br />&lt;ResourceParams name="jdbc/testDB"&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;factory&lt;/name&gt;<br />     &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;driverClassName&lt;/name&gt;<br />     &lt;value&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;url&lt;/name&gt;<br />     </p>
						<p>&lt;value&gt;jdbc:microsoft:sqlserver://218.246.85.65:1433;DatabaseName=ZCMIS&lt;/v</p>
						<p>alue&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;username&lt;/name&gt;<br />     &lt;value&gt;sa&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;password&lt;/name&gt;<br />     &lt;value&gt;sa&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;maxActive&lt;/name&gt;<br />     &lt;value&gt;30&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;maxIdle&lt;/name&gt;<br />     &lt;value&gt;10&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;maxWait&lt;/name&gt;<br />     &lt;value&gt;1000&lt;/value&gt;<br />   &lt;/parameter&gt;<br />&lt;/ResourceParams&gt;</p>
						<p>
								<br />把下面的东西加到web.xml中<br />   &lt;resource-ref&gt;<br />      &lt;description&gt;DB Connection&lt;/description&gt;<br />      &lt;res-ref-name&gt;jdbc/testDB&lt;/res-ref-name&gt;<br />      &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />      &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />  &lt;/resource-ref&gt;<br />类的内部实现</p>
						<p> try{<br />                      <br />          Context initCtx = new InitialContext();<br />          Context ctx = (Context) initCtx.lookup("java:comp/env");<br />                //获取连接池对象<br />          Object obj = (Object) ctx.lookup("jdbc/testDB");    <br />          javax.sql.DataSource ds = (javax.sql.DataSource)obj;<br />          Connection conn = ds.getConnection();</p>
						<p>    }<br /> catch(Exception e)<br /> {  <br />   System.out.print(e.toString());<br /> }</p>
				</div>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=646544</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/38738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:32 <a href="http://www.blogjava.net/iKingQu/articles/38738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat性能调整 </title><link>http://www.blogjava.net/iKingQu/articles/38737.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38737.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38737.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38737.html</trackback:ping><description><![CDATA[
		<div class="postText">外部环境调整 <br /><br />　　调整非Tomcat组件，例如Tomcat运行的操作系统和运行Tomcat的java虚拟机。<br /><br />　　自身调整 <br /><br />　　修改Tomcat自身的参数，调整Tomcat配置文件中的参数。<br /><br />　　下面我们将详细讲解外部环境调整的有关内容，Tomcat自身调整的内容将在第2部分中阐述。<br /><br />　　<strong>1</strong>.JAVA虚拟机性能优化<br /><br />　　Tomcat本身不能直接在计算机上运行，需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本（只要是符合Sun发布的Java规范的），但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的，因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。<br /><br />　　可以给Java虚拟机设置使用的内存，但是如果你的选择不对的话，虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。<br /><table style="WIDTH: 342px; HEIGHT: 73px" cellspacing="1" cellpadding="1" width="342" border="1"><tbody><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">参数</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">描述</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">-Xms&lt;size&gt;</font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">JVM</span><span style="FONT-FAMILY: 宋体">初始化堆的大小</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">-Xmx&lt;size&gt;</font></span></p></font></span></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">JVM</span><span style="FONT-FAMILY: 宋体">堆的最大值</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr></tbody></table><br /><br />　　这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，虚拟机就必须重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出，并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。<br /><br />　　Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。<br /><br />　　Windows下，在文件{tomcat_home}/bin/catalina.bat，Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：<br /><br />　　JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'<br /><br />　　需要把这个两个参数值调大。例如：<br /><br />　　JAVA_OPTS='-Xms256m -Xmx512m'<br /><br />　　表示初始化内存为256MB，可以使用的最大内存为512MB。<br /><br />　　另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关，应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大，那么完全垃圾收集就会很慢，但是频度会降低。如果你把堆的大小和内存的需要一致，完全收集就很快，但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间，以在特定的时间内最大化处理客户的请求。在基准测试的时候，为保证最好的性能，要把堆的大小设大，保证垃圾收集不在整个基准测试的过程中出现。<br /><br />　　如果系统花费很多的时间收集垃圾，请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈，那么需要指定代的大小，检查垃圾收集的详细输出，研究 垃圾收集参数对性能的影响。一般说来，你应该使用物理内存的 80% 作为堆大小。当增加处理器时，记得增加内存，因为分配可以并行进行，而垃圾收集不是并行的。<br />　<strong>2、操作系统</strong>性能优化<br /><br />　　这里说的操作系统是指运行web服务器的系统软件，当然，不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的，因此在它的内核中有许多的限制来防止不同形式的服务攻击（OpenBSD的一句座右铭是“默认是最安全的”）。这些限制或许更多地用来运行活跃的web服务器。<br /><br />　　而我们常用的Linux操作系统的目标是易用使用，因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核，表明所有的驱动器都静态地与之相连。这样就使系统易于使用，但是如果你要创建一个自定义的内核来加强其中某些限制，那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之，内存现在变得越来越便宜，所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存，并且在服务器上腾出更多的可用内存。<br /><br />　　<u>小提示</u>：虽然现在内存已经相当的便宜，但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点，但是从可靠性上来说，性价比会更高一些。<br /><br />　　如果是在Windows操作系统上使用Tomcat，那么最好选择服务器版本。因为在非服务器版本上，最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑，必须经常给操作系统打上最新的补丁。<br /><br />　　<strong>3</strong>.Tomcat与其它web服务器整合使用<br /><br />　　虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来，将html与jsp的功能部分进行明确分工，让tomcat只处理jsp部分，其它的由apache,IIS等这些web服务器处理，由此大大节省了tomcat有限的工作“线程”。<br /><br />　　<strong>4</strong>.负载均衡<br /><br />　　在负载均衡的思路下，多台服务器为对称方式，每台服务器都具有同等的地位，可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术，将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上，而接收到请求的服务器都独立回应客户机的请求。<br /><br />　　提供服务的一组服务器组成了一个应用服务器集群(cluster)，并对外提供一个统一的地址。当一个服务请求被发至该集群时，根据一定规则选择一台服务器，并将服务转定向给该服务器承担，即将负载进行均衡分摊。<br /><br />　　通过应用负载均衡技术，使应用服务超过了一台服务器只能为有限用户提供服务的限制，可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时，负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器，而由其他工作正常的服务器继续提供服务，从而保证了服务的可靠性。<br /><br />　　负载均衡实现的方式大概有四种：第一是通过DNS，但只能实现简单的轮流分配，不能处理故障，第二如果是基于MS IIS，Windows 2003 server本身就带了负载均衡服务，第三是硬件方式，通过交换机的功能或专门的负载均衡设备可以实现，第四种是软件方式，通过一台负载均衡服务器进行，上面安装软件。使用Apache Httpd Server做负载平衡器，Tomcat集群节点使用Tomcat就可以做到以上第四种方式。这种方式比较灵活，成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。 
<div><strong>自身调整<br /><br /></strong>　　本节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和方法，无论是在什么<a href="http://tech.163.com/special/O/000915A0/OS.html"><font color="#0066cc">操作系统</font></a>或者何种Java虚拟机上。在有些情况下，您可能没有控制部署环境上的操作系统或者Java虚拟机。在这种情况下，您就需要逐行了解以下的的一些建议，然而你应该在修改后使之生效。我认为以下方法是Tomcat性能自身调整的最佳方式。<br /><br />　　<strong>1</strong>.禁用DNS查询<br /><br />　　当web应用程序向要记录客户端的信息时，它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络，并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程，这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询，方式是修改server.xml文件中的enableLookups参数值：<br /><p>Tomcat4<br /><br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" /&gt;<br /><br />Tomcat5<br /><br />&lt;Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/&gt;</p><br />　　除非你需要连接到站点的每个HTTP客户端的机器名，否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存，而且更小的流量会使日志数据也会变得更少，显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显，但是此举仍不失为一良策。谁又见到一个低流量的网站一夜之间就流量大增呢？<br /><br />　　<strong>2</strong>.调整线程数<br /><br />　　另外一个可通过应用程序的连接器（Connector）进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径，是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序，使空闲时间保持最低，从而接受更多的请求。<br /><br />　　Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的，但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说，如果一天内每秒仅发生5次单击事件，并且每个请求任务处理需要1秒钟，那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数，指定为参数maxProcessors的值。maxProcessors的值也是有上限的，应防止流量不可控制（或者恶意的服务攻击），从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数，应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。<br /><br />　　在Tomcat5对这些参数进行了调整，请看下表：<br /><table style="WIDTH: 525px; HEIGHT: 219px" cellspacing="1" cellpadding="1" width="525" border="1"><tbody><tr><td align="middle"><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">属性名</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td><td align="middle"><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">描述</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">maxThreads</font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">使用线程来处理接收的每个请求。这个值表示</span><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">可创建的最大的线程数。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">acceptCount </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">connnectionTimeout </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">网络连接超时，单位：毫秒。设置为</span><span lang="EN-US" style="FONT-FAMILY: Arial">0</span><span style="FONT-FAMILY: 宋体">表示永不超时，这样设置有隐患的。通常可设置为</span><span lang="EN-US" style="FONT-FAMILY: Arial">30000</span><span style="FONT-FAMILY: 宋体">毫秒。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">minSpareThreads </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">初始化时创建的线程数。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">maxSpareThreads </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">一旦创建的线程超过这个值，</span><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">就会关闭不再需要的</span><span lang="EN-US" style="FONT-FAMILY: Arial">socket</span><span style="FONT-FAMILY: 宋体">线程。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr></tbody></table><br /><br />　　最好的方式是多设置几次并且进行测试，观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同，而且并不是所有人的web站点的流量都是一样的，因此没有一刀切的方案来确定线程数的值。<br /></div>　　<strong>3</strong>.加速JSP编译速度<br /><br />　　当第一次访问一个JSP文件时，它会被转换为Java serverlet源码，接着被编译成Java字节码。你可以控制使用哪个编译器，默认情况下，Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器，但是这里我们将介绍如何优化它们。<br /><br />　　另外一种方法是不要把所有的实现都使用JSP页面，而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定，但是事实证明至少这种方法是只得研究的。如果你想了解更多有关在Tomcat可使用的模板语言，你可以参考Jason Hunter和William Crawford合著的《Java Servlet Programming 》一书（O'Reilly公司出版）。<br /><br />　　在Tomcat 4.0中可以使用流行而且免费的Jikes编译器。Jikes编译器的速度要由于Sun的Java编译器。首先要安装Jikes（可访问http://oss.software.ibm.com/pub/jikes 获得更多的信息），接着需要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes以后还需要设置让JSP编译servlet使用Jikes，需要修改web.xml文件中jspCompilerPlugin的值：<br /><p>&lt;servlet&gt;<br />&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;<br />org.apache.jasper.servlet.JspServlet<br />&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />&lt;param-value&gt;WARNING&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;jspCompilerPlugin&lt;/param-name&gt;<br />&lt;param-value&gt;<br />org.apache.jasper.compiler.JikesJavaCompiler<br />&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;!-- &lt;param-name&gt;<br />org.apache.catalina.jsp_classpath<br />&lt;/param-name&gt; --&gt;<br />&lt;param-name&gt;classpath&lt;/param-name&gt;<br />&lt;param-value&gt;<br />/usr/local/jdk1.3.1-linux/jre/lib/rt.jar:<br />/usr/local/lib/java/servletapi/servlet.ja<br />r&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;</p><br />　　在Tomcat 4.1（或更高版本），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<br /><p>&lt;servlet&gt;<br />&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;<br />org.apache.jasper.servlet.JspServlet<br />&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />&lt;param-value&gt;WARNING&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;compiler&lt;/param-name&gt;<br />&lt;param-value&gt;jikes&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;</p><br /><br />Ant可用的编译器<br /><table style="WIDTH: 485px; HEIGHT: 269px" cellspacing="1" cellpadding="1" width="485" border="1"><tbody><tr><td><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">名称</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td><td><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">别名</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td><td><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">调用的编译器</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">classic </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">javac1.1, javac1.2 </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Standard JDK 1.1/1.2 compiler </font></span></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">modern </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">javac1.3, javac1.4 </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Standard JDK 1.3/1.4 compiler </font></span></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">jikes </font></span></p></td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">The Jikes compiler </font></span></p></td></tr><tr><td>JVC</td><td><p style="TEXT-INDENT: 8.2pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3"><a href="http://tech.163.com/special/2/000915N4/20050630microsoft.html"><font color="#0066cc">Microsoft</font></a></font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++ </font></span></p></td></tr><tr><td>KJC</td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">The kopi compiler </font></span></p></td></tr><tr><td>GCJ</td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">The gcj compiler (included as part of gcc) </font></span></p></td></tr><tr><td>SJ</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Symantec </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Symantec's Java compiler </font></span></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">extJavac</font></span></p></td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Runs either the modern or classic compiler in a JVM of its own </font></span></p></td></tr></tbody></table><p><br /><br />　　由于JSP页面在第一次使用时已经被编译，那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上，这个过程完全可以自动化，因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。 </p><p>　在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段，而不是编译阶段，使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。<br /><br />　　可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet，被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面，可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它J<br /><br />　　Tomcat提供了一种通过请求来编译JSP页面的功能。例如，你可以在浏览器地址栏中输入<a href="http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true"><font color="#0066cc">http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true</font></a>，这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得，不失为一种检验页面正确性的捷径。<br /><br />　　<strong>4</strong>. 其它<br /><br />　　前面我们提到过<a href="http://tech.163.com/special/O/000915A0/OS.html"><font color="#0066cc">操作系统</font></a>通过一些限制手段来防止恶意的服务攻击，同样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。<br /><br />　　Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。 <br /><br />　　通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。 <br /><br />　　例如你可以把Admin Web application设置成只允许本地访问，设置如下：<br /></p><p>&lt;Context path="/path/to/secret_files" ...&gt; <br />&lt;Valve className="org.apache.catalina.valves.RemoteAddrValve" <br /><br />allow="127.0.0.1" deny=""/&gt; <br />&lt;/Context&gt;</p><p><br />　　如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br /></p><p> </p><p> Tomcat容量计划<br /><br />　　以下介绍针对Tomcat做容量计划的步骤：<br /><br />　　1） 量化负载。如果站点已经建立并运行，可以使用前面介绍的工具模仿用户访问，确定资源的需求量。<br /><br />　　2） 针对测试结果或测试过程中进行分析。需要知道那些请求造成了负载过重或者使用过多的资源，并与其它请求做比较，这样就确定了系统的瓶颈所在。例如：如果servlet在查询数据库的步骤上耗用较长的时间，那么就需要考虑使用缓冲池来降低响应时间。<br /><br />　　3） 确定性能最低标准。例如，你不想让用户花20秒来等待结果页面的返回，也就是说甚至在达到访问量的极限时，用户等待的时间也不能超过20秒种（从点击链接到看到返第一条返回数据）。这个时间中包含了数据库查询时间和文件访问时间。同类<a href="http://tech.163.com/production/"><font color="#0066cc">产品</font></a>性能在不同的公司可能有不同的标准，一般最好采取同行中的最低标准或对这个标准做出评估。<br /><br />　　4） 确定如何合理使用底层资源，并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、<a href="http://tech.163.com/special/O/000915A0/OS.html"><font color="#0066cc">操作系统</font></a>、JVM等等。在各种生产环境上都按顺序进行部署和测试，观察是否符合需求。在测试Tomcat时尽量多采用几种JVM，并且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果，还需针对测试过程中出现的硬件系统瓶颈进行处理确定合理的资源配置。这个过程最为复杂，而且一般由于没有可参考的值所以只能靠理论推断和经验总结。<br /><br />　　5） 如果通过第4步的反复测试如果达到了最优的组合，就可以在相同的生产环境上部署产品了。<br /><br />　　此外应牢记一定要文档化你的测试过程和结果，因为此后可能还会进行测试，这样就可以拿以前的测试结果做为参考。另外测试过程要反复多次进行，每次的条件可能都不一样，因此只有记录下来才能进行结果比较和最佳条件的选择。<br /><br />　　这样我们通过测试找到了最好的组合方式，各种资源得到了合理的配置，系统的性能得到了极大的提升。<br /><br /><br /><strong> 附加资料</strong><br /><br />　　很显然本文也很难全面而详尽地阐述性能优化过程。如果你进行更多研究的话可能会把性能调优做的更好，比如Java程序的性能调整、操作系统的调整、各种复杂环境与应用系统和其它所有与应用程序相关的东西。在这里提供一些文中提到的一些资源、文中提到的相关内容的链接以及本文的一些参考资料。<br /><br />　　<strong>1</strong>. Web性能测试资料及工具<br /><br />　　1） Jmeter Wiki首页，Jmeter为一个开源的100%Java开发的性能测试工具<br />　　<a href="http://wiki.apache.org/jakarta-jmeter/"><font color="#0066cc">http://wiki.apache.org/jakarta-jmeter/</font></a><br /><br />　　2） Apache Benchmark使用说明<br />　　<a href="http://httpd.apache.org/docs-2.0/programs/ab.html"><font color="#0066cc">http://httpd.apache.org/docs-2.0/programs/ab.html</font></a><br /><br />　　3） 一些Java相关测试工具的介绍，包含可以与Tomcat集成进行测试的工具<br />　　<a href="http://blog.csdn.net/wyingquan/"><font color="#0066cc">http://blog.csdn.net/wyingquan/</font></a><br /><br />　　4） LoadRunner® 是一种预测系统行为和性能的工业标准级负载测试工具。它通过模拟数据以千万计用户来实施并发负载来对整个企业架构进行测试，来帮助您更快的查找和发现问题。<br />　　<a href="http://www.mercury.com/us/products/performance-center/loadrunner/"><font color="#0066cc">http://www.mercury.com/us/products/performance-center/loadrunner/</font></a><br /><br /><br />　　<strong>2</strong>. 文中介绍的相关内容的介绍<br /><br />　　1） Apache 2.x + Tomcat 4.x做负载均衡，描述了如何利用jk配置集群的负载均衡。<br />　　<a href="http://raibledesigns.com/tomcat/index.html"><font color="#0066cc">http://raibledesigns.com/tomcat/index.html</font></a><br /><br />　　2） 容量计划的制定，收集了许多有关制定web站点容量计划的例子：<br />　　<a href="http://www.capacityplanning.com/"><font color="#0066cc">http://www.capacityplanning.com/</font></a><br /><br />　　3） 评测Tomcat5负载平衡与集群，<br />　　<a href="http://www.javaresearch.org/article/showarticle.jsp?column=556&amp;thread=19777"><font color="#0066cc">http://www.javaresearch.org/article/showarticle.jsp?column=556&amp;thread=19777</font></a><br /><br />　　4） Apache与Tomcat的安装与整合之整合篇<br />　　<a href="http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=18139"><font color="#0066cc">http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=18139</font></a><br /><br />　　5） 性能测试工具之研究，介绍了性能测试工具的原理与思路<br />　　<a href="http://www.51testing.com/emagzine/No2_2.htm"><font color="#0066cc">http://www.51testing.com/emagzine/No2_2.htm</font></a><br /><br />　　6） Java的内存泄漏<br />　　<a href="http://www.matrix.org.cn/resource/article/409.html"><font color="#0066cc">http://www.matrix.org.cn/resource/article/409.html</font></a><br /><br />　　7） Web服务器和应用程序服务器有什么区别？<br />　　<a href="http://www.matrix.org.cn/resource/article/1429.html"><font color="#0066cc">http://www.matrix.org.cn/resource/article/1429.html</font></a><br /><br />　　8） 详细讲解性能中数据库集群的问题<br />　　<a href="http://www.theserverside.com/articles/article.tss?l=DB_Break"><font color="#0066cc">http://www.theserverside.com/articles/article.tss?l=DB_Break</font></a><br clear="all" /></p><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=646524</p></div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/38737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:31 <a href="http://www.blogjava.net/iKingQu/articles/38737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat的server.xml（中文版）</title><link>http://www.blogjava.net/iKingQu/articles/37488.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 26 Mar 2006 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/37488.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/37488.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/37488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/37488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/37488.html</trackback:ping><description><![CDATA[
		<div class="postcontent">&lt;!-- Example Server Configuration File --&gt;<br />&lt;!-- Tomcat服务器配置示例文件 --&gt;<br /><br />&lt;!-- Note that component elements are nested corresponding to their<br />     parent-child relationships with each other --&gt;<br />&lt;!-- 注意，这些组件的构成是根据相互之间的父子关系进行嵌套的。--&gt;<br /><br />&lt;!-- A "Server" is a singleton element that represents the entire JVM,<br />     which may contain one or more "Service" instances. The Server<br />     listens for a shutdown command on the indicated port.<br /><br />     Note: A "Server" is not itself a "Container", so you may not<br />     define subcomponents such as "Valves" or "Loggers" at this level.<br /> --&gt;<br />&lt;!-- 一个“Server”是一个提供完整的JVM的独立组件，它可以包含一个或多个<br />     “Service”实例。服务器在指定的端口上监听shutdown命令。<br />     <br />     注意：一个“Server”自身不是一个“Container”（容器），因此在这里你<br />     不可以定义诸如“Valves”或者“Loggers”子组件<br />--&gt;<br /><br />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br /><br /><br />  &lt;!-- Comment these entries out to disable JMX MBeans support --&gt;<br />  &lt;!-- 这些指令组件关闭JMX MBeans支持 --&gt;<br />  <br />  &lt;!-- You may also configure custom components (e.g. Valves/Realms) by<br />       including your own mbean-descriptor file(s), and setting the<br />       "descriptors" attribute to point to a ';' seperated list of paths<br />       (in the ClassLoader sense) of files to add to the default list.<br />       e.g. descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"<br />  --&gt;<br />  &lt;!-- 你也可以通过包含你自己的mbean描述文件配置自定义的组件，然后设置<br />       “descriptors”属性为以“；”为分隔的文件名列表严将它添加到默认列表<br />       中，例如：descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"。<br /> --&gt;<br />       <br />  &lt;Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"<br />            debug="0"/&gt;<br />  &lt;Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"<br />            debug="0"/&gt;<br /><br />  &lt;!-- Global JNDI resources --&gt;<br />  &lt;!-- 全局JNDI资源 --&gt;<br />  &lt;GlobalNamingResources&gt;<br /><br />    &lt;!-- Test entry for demonstration purposes --&gt;<br />    &lt;!-- 出于示例目的的测试入口 --&gt;<br />    &lt;Environment name="simpleValue" type="java.lang.Integer" value="30"/&gt;<br /><br />    &lt;!-- Editable user database that can also be used by<br />         UserDatabaseRealm to authenticate users --&gt;<br />    &lt;!-- 可编辑的，用来通过UserDatabaseRealm认证用户的用户数据库 --&gt;<br />    <br />    &lt;Resource name="UserDatabase" auth="Container"<br />              type="org.apache.catalina.UserDatabase"<br />       description="User database that can be updated and saved"&gt;<br />    &lt;/Resource&gt;<br />    &lt;ResourceParams name="UserDatabase"&gt;<br />      &lt;parameter&gt;<br />        &lt;name&gt;factory&lt;/name&gt;<br />        &lt;value&gt;org.apache.catalina.users.MemoryUserDatabaseFactory&lt;/value&gt;<br />      &lt;/parameter&gt;<br />      &lt;parameter&gt;<br />        &lt;name&gt;pathname&lt;/name&gt;<br />        &lt;value&gt;conf/tomcat-users.xml&lt;/value&gt;<br />      &lt;/parameter&gt;<br />    &lt;/ResourceParams&gt;<br /><br />  &lt;/GlobalNamingResources&gt;<br /><br />  &lt;!-- A "Service" is a collection of one or more "Connectors" that share<br />       a single "Container" (and therefore the web applications visible<br />       within that Container). Normally, that Container is an "Engine",<br />       but this is not required.<br /><br />       Note: A "Service" is not itself a "Container", so you may not<br />       define subcomponents such as "Valves" or "Loggers" at this level.<br />   --&gt;<br />  &lt;!-- 一个“Service”是一个或多个共用一个单独“Container”(容器)的“Connectors”<br />       组合（因此，应用程序在容器中可见）。通常，这个容器是一个“Engine”<br />       （引擎），但这不是必须的。<br />       <br />       注意：一个“Service”自身不是一个容器，因此，在这个级别上你不可定义<br />       诸如“Valves”或“Loggers”子组件。<br />  --&gt;<br /><br />  &lt;!-- Define the Tomcat Stand-Alone Service --&gt;<br />  &lt;!-- 定义Tomcat的标准独立服务 --&gt;<br />  &lt;Service name="Catalina"&gt;<br /><br />    &lt;!-- A "Connector" represents an endpoint by which requests are received<br />         and responses are returned. Each Connector passes requests on to the<br />         associated "Container" (normally an Engine) for processing.<br /><br />         By default, a non-SSL HTTP/1.1 Connector is established on port 8080.<br />         You can also enable an SSL HTTP/1.1 Connector on port 8443 by<br />         following the instructions below and uncommenting the second Connector<br />         entry. SSL support requires the following steps (see the SSL Config<br />         HOWTO in the Tomcat 5 documentation bundle for more detailed<br />         instructions):<br />         * If your JDK version 1.3 or prior, download and install JSSE 1.0.2 or<br />           later, and put the JAR files into "$JAVA_HOME/jre/lib/ext".<br />         * Execute:<br />             %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)<br />             $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (Unix)<br />           with a password value of "changeit" for both the certificate and<br />           the keystore itself.<br /><br />         By default, DNS lookups are enabled when a web application calls<br />         request.getRemoteHost(). This can have an adverse impact on<br />         performance, so you can disable it by setting the<br />         "enableLookups" attribute to "false". When DNS lookups are disabled,<br />         request.getRemoteHost() will return the String version of the<br />         IP address of the remote client.<br />    --&gt;<br />    &lt;!-- 一个“Connector”（连接器）代表一个请求被接收和应答所需要的端点。每个连<br />         接器通过相关的“Container”（容器）处理请求。<br />         <br />         默认情况下，一个非SSL的HTTP/1.1的连接器被绑定在端口8080。你也可以通过<br />         根据后面的使用说明并取消第二个连接器入口的注释，在端口8443上建立一个<br />         SSL HTTP/1.1的连接器。开放SSL支持需要下面几步（参见Tomcat 5文档中怎样<br />         配置SSL的说明以取得更多的详细信息）：<br />         * 如果你的JDK是1.3或1.3以前的版本，下载安装JSSE 1.0.2或以后版本，并放<br />           置JAR文件到“$JAVA_HOME/jre/lib/ext”目录下。<br />         * 带一个“changeit”的口令值执行：<br />             %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)<br />             $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)<br />           来生成它自己的证书私钥。<br />           <br />         默认情况下，当一个web应用程序调用请求时，DNS查询是可行的。这将对性能造<br />         成一些不利的影响，因此，你可以将“enableLookups”设置为“false”来关闭DNS<br />         查询。当DNS查询被关闭时，request.getRemoteHost()将返回包含远程客户IP地<br />         址的字符串。<br />  --&gt;<br /><br />    &lt;!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&gt;<br />    &lt;!-- 在8080端口上定义一个非SSL的HTTP/1.1连接器 --&gt;<br />    &lt;Connector port="8080"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               debug="0" connectionTimeout="20000"<br />               disableUploadTimeout="true" /&gt;<br />    &lt;!-- Note : To disable connection timeouts, set connectionTimeout value<br />     to 0 --&gt;<br />    &lt;!-- 注意，要关闭连接超时，将connectionTimeout设置为0 --&gt;<br /><br />&lt;!-- Note : To use gzip compression you could set the following properties :<br /><br />compression="on"<br />compressionMinSize="2048"<br />noCompressionUserAgents="gozilla, traviata"<br />compressableMimeType="text/html,text/xml"<br />--&gt;<br />&lt;!-- 注意：要使用gzip压缩需要设置如下属性：<br /><br />compression="on"<br />compressionMinSize="2048"<br />noCompressionUserAgents="gozilla,traviata"<br />compressableMimeType="text/html,text/xml"<br />--&gt;<br /><br />    &lt;!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --&gt;<br />    &lt;!-- 在端口8443上定义一个SSL的HTTP/1.1的连接器 --&gt;<br />    &lt;!--<br />    &lt;Connector port="8443"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" disableUploadTimeout="true"<br />               acceptCount="100" debug="0" scheme="https" secure="true"<br />               clientAuth="false" sslProtocol="TLS" /&gt;<br />    --&gt;<br /><br />    &lt;!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --&gt;<br />    &lt;!-- 在端口8009上定义一个Coyote/JK2 AJP 1.3连接器 --&gt;<br />    &lt;Connector port="8009"<br />               enableLookups="false" redirectPort="8443" debug="0"<br />               protocol="AJP/1.3" /&gt;<br /><br />    &lt;!-- Define a Proxied HTTP/1.1 Connector on port 8082 --&gt;<br />    &lt;!-- 在8082端口上定义一个代理HTTP/1.1连接器 --&gt;<br />    &lt;!-- See proxy documentation for more information about using this. --&gt;<br />    &lt;!-- 参见代理文档以取得这里使用属性的更多的信息。 --&gt;<br />    &lt;!--<br />    &lt;Connector port="8082"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false"<br />               acceptCount="100" debug="0" connectionTimeout="20000"<br />               proxyPort="80" disableUploadTimeout="true" /&gt;<br />    --&gt;<br /><br />    &lt;!-- An Engine represents the entry point (within Catalina) that processes<br />         every request. The Engine implementation for Tomcat stand alone<br />         analyzes the HTTP headers included with the request, and passes them<br />         on to the appropriate Host (virtual host). --&gt;<br />    &lt;!-- 一个“Engine”（引擎）代表处理每个请求的入口点（在Catalina内）。这个Tomcat<br />         的标准独立引擎实现分析包含在请求中的HTTP头信息，并将请求传送到适当的主机<br />         或虚拟主机上。--&gt;<br /><br />    &lt;!-- You should set jvmRoute to support load-balancing via JK/JK2 ie :<br />    &lt;Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1"&gt;<br />    --&gt;<br />    &lt;!-- 你应该这样设置jvmRoute以便在JK/JK2通道上支持负载平衡：<br />    &lt;Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1"&gt;<br />    --&gt;<br />         <br />    &lt;!-- Define the top level container in our container hierarchy --&gt;<br />    &lt;!-- 在我们的容器体系中定义最高级别的容器 --&gt;<br />    &lt;Engine name="Catalina" defaultHost="localhost" debug="0"&gt;<br /><br />      &lt;!-- The request dumper valve dumps useful debugging information about<br />           the request headers and cookies that were received, and the response<br />           headers and cookies that were sent, for all requests received by<br />           this instance of Tomcat. If you care only about requests to a<br />           particular virtual host, or a particular application, nest this<br />           element inside the corresponding &lt;Host&gt; or &lt;Context&gt; entry instead.<br /><br />           For a similar mechanism that is portable to all Servlet 2.4<br />           containers, check out the "RequestDumperFilter" Filter in the<br />           example application (the source for this filter may be found in<br />           "$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters").<br /><br />           Request dumping is disabled by default. Uncomment the following<br />           element to enable it. --&gt;<br />      &lt;!-- 请求转储器值转储非常有用的通过Tomcat这个实例接收到的所有请求的，关于<br />           接收到的请求头和cookies，以及发送出的回应头和cookies的调试信息。如果<br />           你只在意一个特定的虚拟主机或者一个特定应用程序的请求，在对应的&lt;Host&gt;<br />           或&lt;Context&gt;入口中套用这个元素。<br />           <br />           对于所有的Servlet（小服务程序）2.4来所，在示例程序中检验<br />           “RequestDumperFilter”过滤是非常容易的（这个过滤器源代码可以在<br />           “$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters”下找到。<br />           <br />           请求转储默认情况下是关闭的，如果要使用它，取消下面行的注释符。--&gt;<br />      &lt;!--<br />      &lt;Valve className="org.apache.catalina.valves.RequestDumperValve"/&gt;<br />      --&gt;<br /><br />      &lt;!-- Global logger unless overridden at lower levels --&gt;<br />      &lt;!-- 全局日志设置，除非在更低的级别上覆盖它的设置 --&gt;<br />      &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />              prefix="catalina_log." suffix=".txt"<br />              timestamp="true"/&gt;<br /><br />      &lt;!-- Because this Realm is here, an instance will be shared globally --&gt;<br />      &lt;!-- 因为这个Realm（区域）在这儿，因此这个实例将被全局共享。 --&gt;<br /><br />      &lt;!-- This Realm uses the UserDatabase configured in the global JNDI<br />           resources under the key "UserDatabase". Any edits<br />           that are performed against this UserDatabase are immediately<br />           available for use by the Realm. --&gt;<br />      &lt;!-- 这个Realm（区域）使用在全局JNDI资源下，由“UserDatabase”配置的用户<br />           数据库。通过使用Realm将使对于这个用户数据库的任何编辑都将会立即可用<br />      &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"<br />                 debug="0" resourceName="UserDatabase"/&gt;<br /><br />      &lt;!-- Comment out the old realm but leave here for now in case we<br />           need to go back quickly --&gt;<br />      &lt;!-- 注释掉旧有的Realm以便我们能很快速的恢复旧有配置。 --&gt;<br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.MemoryRealm" /&gt;<br />      --&gt;<br /><br />      &lt;!-- Replace the above Realm with one of the following to get a Realm<br />           stored in a database and accessed via JDBC --&gt;<br />      &lt;!-- 下面的属性用于从储存在数据库或从JDBC通道中得到的Realm以取代上面的<br />           Realm配置。--&gt;<br /><br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"<br />             driverName="org.gjt.mm.mysql.Driver"<br />          connectionURL="jdbc:mysql://localhost/authority"<br />         connectionName="test" connectionPassword="test"<br />              userTable="users" userNameCol="user_name" userCredCol="user_pass"<br />          userRoleTable="user_roles" roleNameCol="role_name" /&gt;<br />      --&gt;<br /><br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"<br />             driverName="oracle.jdbc.driver.OracleDriver"<br />          connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"<br />         connectionName="scott" connectionPassword="tiger"<br />              userTable="users" userNameCol="user_name" userCredCol="user_pass"<br />          userRoleTable="user_roles" roleNameCol="role_name" /&gt;<br />      --&gt;<br /><br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"<br />             driverName="sun.jdbc.odbc.JdbcOdbcDriver"<br />          connectionURL="jdbc:odbc:CATALINA"<br />              userTable="users" userNameCol="user_name" userCredCol="user_pass"<br />          userRoleTable="user_roles" roleNameCol="role_name" /&gt;<br />      --&gt;<br /><br />      &lt;!-- Define the default virtual host<br />           Note: XML Schema validation will not work with Xerces 2.2.<br />       --&gt;<br />      &lt;!-- 定义默认的虚拟主机<br />           注意：XML模式确认将不能与Xerces 2.2同工作。<br />      --&gt;<br />      &lt;Host name="localhost" debug="0" appBase="webapps"<br />       unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br /><br />        &lt;!-- Defines a cluster for this node,<br />             By defining this element, means that every manager will be changed.<br />             So when running a cluster, only make sure that you have webapps in there<br />             that need to be clustered and remove the other ones.<br />             A cluster has the following parameters:<br />             为这个结点定义一个群集，通过定义这个元素，意味着每个管理员都将被改变。<br />             因此，当运行一个群集时，只有确认在必须被聚集和移除其他的地方有你的<br />             web软件。<br />             一个群集有下面这些参数：<br /><br />             className = the fully qualified name of the cluster class<br />             className = 这个群集类的全限定名<br /><br />             name = a descriptive name for your cluster, can be anything<br />             name = 你的群集的描述名，可以是任何描述<br /><br />             debug = the debug level, higher means more output<br />             debug = 调试级别，更高意味着更多的输出<br /><br />             mcastAddr = the multicast address, has to be the same for all the nodes<br />             mcastAddr = 多播地址，所有的节点都必须有同样的多播地址<br /><br />             mcastPort = the multicast port, has to be the same for all the nodes<br />             mcastPort = 多播端口，对所有的节点都必须有同样的多播端口<br />             <br />             mcastBindAddr = bind the multicast socket to a specific address<br />             mcastBindAddr = 绑定多播套接字到一个指定的地址<br />             <br />             mcastTTL = the multicast TTL if you want to limit your broadcast<br />             mcastTTL = 多播生存期，如果你想要限制你的广播的话<br />             <br />             mcastSoTimeout = the multicast readtimeout<br />             mcastSoTimeout = 多播读取超时<br /><br />             mcastFrequency = the number of milliseconds in between sending a "I'm alive" heartbeat<br />             mcastFrequency = 发送“I'm alive”（我还活着）信息的间隔毫秒数<br /><br />             mcastDropTime = the number a milliseconds before a node is considered "dead" if no heartbeat is received<br />             mcastDropTime = 多长时间没有收到“I'm alive”就将这个节点标识为死节点（单位：毫秒）<br /><br />             tcpThreadCount = the number of threads to handle incoming replication requests, optimal would be the same amount of threads as nodes<br />             tcpThreadCount = 用于处理重复引入请求的线程数，最好是每个节点都有相同的线程数<br /><br />             tcpListenAddress = the listen address (bind address) for TCP cluster request on this host,<br />                                in case of multiple ethernet cards.<br />                                auto means that address becomes<br />                                InetAddress.getLocalHost().getHostAddress()<br />             tcpListenAddress = 在有多块以太网卡的主机上的监听TCP群集请求的地址（绑定地址），<br />                                auto意味着地址由InetAddress.getLocalHost().getHostAddress()取得。<br /><br />             tcpListenPort = the tcp listen port<br />             tcpListenPort = tcp监听端口<br /><br />             tcpSelectorTimeout = the timeout (ms) for the Selector.select() method in case the OS<br />                                  has a wakup bug in java.nio. Set to 0 for no timeout<br />             tcpSelectorTimeout = 在操作系统中有java.nio唤醒错的情况下，使用Selector.select()的超时<br />                                  毫秒数。设为0则没有超时限制<br /><br />             printToScreen = true means that managers will also print to std.out<br />             printToScreen = true意味着管理员的相关信息也将打印输出到std.out<br /><br />             expireSessionsOnShutdown = true means that<br />             expireSessionsOnShutdown = true 意味着?????<br /><br />             useDirtyFlag = true means that we only replicate a session after setAttribute,removeAttribute has been called.<br />                            false means to replicate the session after each request.<br />                            false means that replication would work for the following piece of code:<br />                            &lt;%<br />                            HashMap map = (HashMap)session.getAttribute("map");<br />                            map.put("key","value");<br />                            %&gt;<br />             useDirtyFlag = true意味着我们只能在调用setAttribute，removeAttribute后才能复制一个会话；<br />                            false意味着在每个请求后复制会话。<br />                            false意味着复制将以下列代码方式工作：<br />                            &lt;%<br />                            HashMap map = (HashMap)session.getAttribute("map");<br />                            map.put("key","value");<br />                            %&gt;<br />                            <br />             replicationMode = can be either 'pooled', 'synchronous' or 'asynchronous'.<br />                               * Pooled means that the replication happens using several sockets in a synchronous way. Ie, the data gets replicated, then the request return. This is the same as the 'synchronous' setting except it uses a pool of sockets, hence it is multithreaded. This is the fastest and safest configuration. To use this, also increase the nr of tcp threads that you have dealing with replication.<br />                               * Synchronous means that the thread that executes the request, is also the<br />                               thread the replicates the data to the other nodes, and will not return until all<br />                               nodes have received the information.<br />                               * Asynchronous means that there is a specific 'sender' thread for each cluster node,<br />                               so the request thread will queue the replication request into a "smart" queue,<br />                               and then return to the client.<br />                               The "smart" queue is a queue where when a session is added to the queue, and the same session<br />                               already exists in the queue from a previous request, that session will be replaced<br />                               in the queue instead of replicating two requests. This almost never happens, unless there is a<br />                               large network delay.<br />             replicationMode = 可以是“pooled”、“synchronous”或者“asynchronous”<br />                               * Pooled意味着在多个套接字上同步进行复制。例如，先复制数据，然后请求返回。<br />                               这与“synchronous”相同，除了它使用一个套接字池，因此，它是多线程的。它是<br />                               最快和最高级的设置，使用这个配置也增加了处理复制的tcp线程的域。<br />                               * Synchronous指执行请求的线程，它也是向其他节点复制数据的线程，并且直到<br />                               所有的节点都己经收到信息后才返回。<br />                               * Asynchronous，对每个群集节点而言，这是一个特别的“sender”（发送者）线程，<br />                               因此请求线程将复制请求排队到一个小队列中，然后，返回给用户。<br />                               这个小队列是一个当会话被添加到队列中，而从先前的请求中，同一个会话己经存在<br />                               ，这个会话将被放置在队列中以代替重复的两个请求。这几乎从不会发生，除非存在<br />                               较大的网络延迟。<br />        --&gt;<br />        &lt;!--<br />            When configuring for clustering, you also add in a valve to catch all the requests<br />            coming in, at the end of the request, the session may or may not be replicated.<br />            A session is replicated if and only if all the conditions are met:<br />            1. useDirtyFlag is true or setAttribute or removeAttribute has been called AND<br />            2. a session exists (has been created)<br />            3. the request is not trapped by the "filter" attribute<br /><br />            The filter attribute is to filter out requests that could not modify the session,<br />            hence we don't replicate the session after the end of this request.<br />            The filter is negative, ie, anything you put in the filter, you mean to filter out,<br />            ie, no replication will be done on requests that match one of the filters.<br />            The filter attribute is delimited by ;, so you can't escape out ; even if you wanted to.<br /><br />            filter=".*\.gif;.*\.js;" means that we will not replicate the session after requests with the URI<br />            ending with .gif and .js are intercepted.<br />        --&gt;<br />        &lt;!-- 当配置群集时，你也添加一个值来捕获所有传入的请求，在请求结束时，这个会话可能被子复制，<br />             也可能不被复制。一个会话是否复制取决于下列条件是否发生：<br />             1. useDirtyFlag为真，或者setAttribute或者removeAttribute己经被调用。<br />             2. 会话己经存在（己经被创建了）。<br />             3. 请求没有被“filter”属性所捕获。<br />             <br />             这个filter（过滤器）属性用于过滤那些不能修改会话的请求，因此，我们在这个请求结束后不复制<br />             会主。这个过滤器是消极的，例如，你向过滤器发送了一些东西，然后被过滤出去，在那个匹配的过<br />             滤器上不会发生复制。<br />             过滤器属性以分号为分隔，因此你不能换行，即使你想这么做。<br />             <br />             filter=".*\.gif;.*\.js;"意味着在进行以.gif和.js结束的URI请求后不复制会话。<br />        <br />        &lt;!--<br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"&gt;<br /><br />            &lt;Membership<br />                className="org.apache.catalina.cluster.mcast.McastService"<br />                mcastAddr="228.0.0.4"<br />                mcastPort="45564"<br />                mcastFrequency="500"<br />                mcastDropTime="3000"/&gt;<br /><br />            &lt;Receiver<br />                className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />                tcpListenAddress="auto"<br />                tcpListenPort="4001"<br />                tcpSelectorTimeout="100"<br />                tcpThreadCount="6"/&gt;<br /><br />            &lt;Sender<br />                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />                replicationMode="pooled"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/&gt;<br />        &lt;/Cluster&gt;<br />        --&gt;<br /><br /><br /><br />        &lt;!-- Normally, users must authenticate themselves to each web app<br />             individually. Uncomment the following entry if you would like<br />             a user to be authenticated the first time they encounter a<br />             resource protected by a security constraint, and then have that<br />             user identity maintained across *all* web applications contained<br />             in this virtual host. --&gt;<br />        &lt;!-- 通常，对每一个应用程序，用户必须逐个的认证他们自己。当他们遇到被<br />             某种安全约束所保护的资源时，如果你想让用户只在第一次被认证，那么，<br />             取消下面入口行的注释，然后在这个虚拟主机中包含这个用户的，横跨所有<br />             web应用程序的用户身份识别。--&gt;<br />             <br />        &lt;!--<br />        &lt;Valve className="org.apache.catalina.authenticator.SingleSignOn"<br />                   debug="0"/&gt;<br />        --&gt;<br /><br />        &lt;!-- Access log processes all requests for this virtual host. By<br />             default, log files are created in the "logs" directory relative to<br />             $CATALINA_HOME. If you wish, you can specify a different<br />             directory with the "directory" attribute. Specify either a relative<br />             (to $CATALINA_HOME) or absolute path to the desired directory.<br />        --&gt;<br />        &lt;!-- 这个虚拟主机的所有请求的访问日志过程。默认情况下，日志文件被创建在相对<br />             于$CATALINA_HOME目录下的logs目录下。通过directory属性，你也可以指定一个<br />             不同的目录，如果你想的话。可以使用相对路径（相对于$CATALINA_HOME），也<br />             可以使用绝对路径。--&gt;<br />        &lt;!--<br />        &lt;Valve className="org.apache.catalina.valves.AccessLogValve"<br />                 directory="logs" prefix="localhost_access_log." suffix=".txt"<br />                 pattern="common" resolveHosts="false"/&gt;<br />        --&gt;<br /><br />        &lt;!-- Logger shared by all Contexts related to this virtual host. By<br />             default (when using FileLogger), log files are created in the "logs"<br />             directory relative to $CATALINA_HOME. If you wish, you can specify<br />             a different directory with the "directory" attribute. Specify either a<br />             relative (to $CATALINA_HOME) or absolute path to the desired<br />             directory.--&gt;<br />        &lt;!-- 与这个虚拟主机有关系所有上下文所共享的日志。默认情况下（使用FileLogger时），<br />             日志文件被创建在相对于$CATALINA_HOME目录下的logs目录下。如果你希望，你也可<br />             以给directory指定一个不同的路径。可以使用相对于$CATALINA_HOME的相对路径，也<br />             可以使用绝对路径。<br />        &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />                 directory="logs" prefix="localhost_log." suffix=".txt"<br />            timestamp="true"/&gt;<br /><br />      &lt;/Host&gt;<br /><br />    &lt;/Engine&gt;<br /><br />  &lt;/Service&gt;<br /><br />&lt;/Server&gt; </div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/37488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-26 18:20 <a href="http://www.blogjava.net/iKingQu/articles/37488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]在Tomcat下JSP、Servlet和JavaBean环境的配置</title><link>http://www.blogjava.net/iKingQu/articles/36754.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:19:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36754.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36754.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36754.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<font face="Verdana">
						<span class="Title">
								<font face="Verdana">在Tomcat下JSP、Servlet和JavaBean环境的配置</font>
						</span>
				</font>
				<p>
						<font face="verdana, arial, helvetica">
								<span class="javascript" id="text2366143">
										<font size="2">创建时间: 2004-11-30<br />文章提交: 孤独<br />经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题，于是总结了一下如何tomcat下配置jsp、servlet和ben，希望对那些初学者有所帮助。 <br /><br />第一步：下载j2sdk和tomcat：到sun官方站点（</font>
										<a href="http://java.sun.com/j2se/1.4.2/download.html" target="_blank">
												<font size="2">http://java.sun.com/j2se/1.4.2/download.html</font>
										</a>
										<font size="2">）下载j2sdk，注意下载版本为Windows Offline Installation的SDK，同时最好下载J2SE 1.4.2 Documentation，然后到tomcat官方站点（</font>
										<a href="http://www.apache.org/dist/jakarta/tomcat-4/" target="_blank">
												<font size="2">http://www.apache.org/dist/jakarta/tomcat-4/</font>
										</a>
										<font size="2">）下载tomcat（下载最新4.1.x版本的tomcat）； <br /><br />第二步：安装和配置你的j2sdk和tomcat：执行j2sdk和tomcat的安装程序，然后按默认设置进行安装即可。 <br />1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.4.2）： <br />JAVA_HOME=c:\j2sdk1.4.2 <br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为它代表当前路径) <br />path=%JAVA_HOME%\bin <br />接着可以写一个简单的java程序来测试J2SDK是否已安装成功： <br />public class Test{ <br />public static void main(String args[]){ <br />System.out.println("This is a test program."); <br />} <br />} <br />将上面的这段程序保存为文件名为Test.java的文件。 <br />然后打开命令提示符窗口，cd到你的Test.java所在目录，然后键入下面的命令 <br />javac Test.java <br />java Test <br />此时如果看到打印出来This is a test program.的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。 <br /><br />2.安装Tomcat后，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat）： <br />CATALINA_HOME=c:\tomcat; <br />CATALINA_BASE=c:\tomcat; <br />然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去，修改后的classpath如下： <br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar; <br />接着可以启动tomcat，在IE中访问</font>
										<a href="http://localhost:8080/" target="_blank">
												<font size="2">http://localhost:8080</font>
										</a>
										<font size="2">
												<br />如果看到tomcat的欢迎页面的话说明安装成功了。<br /><br />第三步：建立自己的jsp app目录 <br />1.到Tomcat的安装目录的webapps目录，可以看到ROOT，examples, tomcat-docs之类Tomcat自带的的目录； <br />2.在webapps目录下新建一个目录，起名叫myapp； <br />3.myapp下新建一个目录WEB-INF，注意，目录名称是区分大小写的； <br />4.WEB-INF下新建一个文件web.xml，内容如下： <br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br /><br />&lt;!DOCTYPE web-app <br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br /><br />&lt;web-app&gt; <br />&lt;display-name&gt;My Web Application&lt;/display-name&gt; <br />&lt;description&gt; <br />A application for test. <br />&lt;/description&gt; <br />&lt;/web-app&gt; <br />5.在myapp下新建一个测试的jsp页面，文件名为index.jsp，文件内容如下： <br />&lt;html&gt;&lt;body&gt;&lt;center&gt; <br />Now time is: &lt;%=new java.util.Date()%&gt; <br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; <br />6.重启Tomcat <br />7.打开浏览器，输入</font>
										<a href="http://localhost:8080/myapp/index.jsp" target="_blank">
												<font size="2">http://localhost:8080/myapp/index.jsp</font>
										</a>
										<font size="2">看到当前时间的话说明就成功了。 <br /><br />第四步：建立自己的Servlet： <br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个servlet程序，文件名为Test.java，文件内容如下： <br />package test; <br />import java.io.IOException; <br />import java.io.PrintWriter; <br />import javax.servlet.ServletException; <br />import javax.servlet.http.HttpServlet; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br />public class Test extends HttpServlet { <br />protected void doGet(HttpServletRequest request, HttpServletResponse response) <br />throws ServletException, IOException { <br />PrintWriter out=response.getWriter(); <br />out.println("&lt;html&gt;&lt;body&gt;&lt;h1&gt;This is a servlet test.&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;"); <br />out.flush(); <br />} <br />} <br />2 .编译 <br />将Test.java放在c:\test下，使用如下命令编译： <br />C:\Test&gt;javac Test.java <br />然后在c:\Test下会产生一个编译后的servlet文件：Test.class <br />3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下，也就是剪切那个test目录到classes目录下，如果classes目录不存在，就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构 <br />4 .修改webapps\myapp\WEB-INF\web.xml，添加servlet和servlet-mapping <br />编辑后的web.xml如下所示，红色为添加的内容: <br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br /><br />&lt;!DOCTYPE web-app <br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br /><br />&lt;web-app&gt; <br />&lt;display-name&gt;My Web Application&lt;/display-name&gt; <br />&lt;description&gt; <br />A application for test. <br />&lt;/description&gt; <br />&lt;servlet&gt; <br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt; <br />&lt;display-name&gt;Test&lt;/display-name&gt; <br />&lt;description&gt;A test Servlet&lt;/description&gt; <br />&lt;servlet-class&gt;test.Test&lt;/servlet-class&gt; <br />&lt;/servlet&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/Test&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&lt;/web-app&gt; <br />这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet“映射”到地址/Test上 <br />5 .好了，启动Tomcat，启动浏览器，输入</font>
										<a href="http://localhost:8080/myapp/Test" target="_blank">
												<font size="2">http://localhost:8080/myapp/Test</font>
										</a>
										<font size="2">如果看到输出This is a servlet test.就说明编写的servlet成功了。 <br />注意：修改了web.xml以及新加了class，都要重启Tomcat <br /><br />第四步：建立自己的Bean： <br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个java程序，文件名为TestBean.java，文件内容如下： <br />package test; <br />public class TestBean{ <br />private String name = null; <br />public TestBean(String strName_p){ <br />this.name=strName_p; <br />} <br />public void setName(String strName_p){ <br />this.name=strName_p; <br />} <br />public String getName(){ <br />return this.name; <br />} <br />} <br />2 .编译 <br />将TestBean.java放在c:\test下，使用如下命令编译： <br />C:\Test&gt;javac TestBean.java <br />然后在c:\Test下会产生一个编译后的bean文件：TestBean.class <br />3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下， <br />4 .新建一个TestBean.jsp文件，文件内容为： <br />&lt;%@ page import="test.TestBean" %&gt; <br />&lt;html&gt;&lt;body&gt;&lt;center&gt; <br />&lt;% <br />TestBean testBean=new TestBean("This is a test java bean."); <br />%&gt; <br />Java bean name is: &lt;%=testBean.getName()%&gt; <br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; <br />5 .好了，重启Tomcat，启动浏览器，输入</font>
										<a href="http://localhost:8080/myapp/TestBean.jsp" target="_blank">
												<font size="2">http://localhost:8080/myapp/TestBean.jsp</font>
										</a>
										<font size="2">如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。 <br /><br />这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码以增强自己在这方面开发的能力了。</font>
								</span>
						</font>
				</p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=625190</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:19 <a href="http://www.blogjava.net/iKingQu/articles/36754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat启动分析</title><link>http://www.blogjava.net/iKingQu/articles/36503.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36503.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36503.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36503.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<h3>1 - Tomcat Server的组成部分 </h3>
				<p>
						<strong>1.1 - Server </strong>
				</p>
				<p>A Server element represents the entire Catalina servlet container. (Singleton) </p>
				<p>
						<strong>1.2 - Service </strong>
				</p>
				<p>A Service element represents the combination of o­ne or more Connector components that share a single Engine<br />Service是这样一个集合：它由一个或者多个Connector组成，以及一个Engine，负责处理所有Connector所获得的客户请求<br /></p>
				<p>
						<strong>1.3 - Connector </strong>
				</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>
						<strong>1.4 - Engine </strong>
				</p>
				<p>The Engine element represents the entire request processing machinery associated with a particular Service<br />It receives and processes all requests from o­ne 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>
						<strong>1.5 - Host </strong>
				</p>
				<p> </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>
						<strong>1.6 - Context </strong>
				</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 alt="" src="http://www.huihoo.com/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>
						</tt>
				</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>
						</tt>
				</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</p>
				<p> </p>
				<pre>
						<font color="#008000">&lt;!------------------------------------------------&gt; </font>
				</pre>
				<pre>&lt;web-app&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- 概述：        <br />该文件是所有的WEB APP共用的部署配置文件，        <br />每当一个WEB APP被DEPLOY，该文件都将先被处理，然后才是WEB APP自己的/WEB-INF/web.xml--&gt; </font>
						<font color="#008000">
						</font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +-------------------------+  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  |    servlet类定义部分    |  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +-------------------------+  --&gt; </font>
						<font color="#008000">
						</font>
				</pre>
				<pre>
						<font color="#008000">&lt;!-- DefaultServlet 当用户的HTTP请求无法匹配任何一个servlet的时候，该servlet被执行        <br />URL PATTERN MAPPING : /        --&gt; </font>
				</pre>
				<pre>&lt;servlet&gt;</pre>
				<pre>&lt;servlet-name&gt;default&lt;/servlet-name&gt;         </pre>
				<pre>&lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;</pre>
				<pre>&lt;init-param&gt;</pre>
				<pre>&lt;param-name&gt;debug&lt;/param-name&gt;</pre>
				<pre>&lt;param-value&gt;0&lt;/param-value&gt;</pre>
				<pre>&lt;/init-param&gt;</pre>
				<pre>&lt;init-param&gt;</pre>
				<pre>&lt;param-name&gt;listings&lt;/param-name&gt;</pre>
				<pre>&lt;param-value&gt;true&lt;/param-value&gt;</pre>
				<pre>&lt;/init-param&gt;</pre>
				<pre>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</pre>
				<pre>&lt;/servlet&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- InvokerServlet 处理一个WEB APP中的匿名servlet <br />当一个servlet被编写并编译放入/WEB-INF/classes/中，却没有在/WEB-INF/web.xml中定义的时候<br />该servlet被调用，把匿名servlet映射成/servlet/ClassName的形式<br />URL PATTERN MAPPING : /servlet/*        --&gt; </font>
				</pre>
				<pre>&lt;servlet&gt;         </pre>
				<pre>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;         </pre>
				<pre>&lt;servlet-class&gt;org.apache.catalina.servlets.InvokerServlet&lt;/servlet-class&gt;</pre>
				<pre>&lt;init-param&gt;</pre>
				<pre>&lt;param-name&gt;debug&lt;/param-name&gt;             </pre>
				<pre>&lt;param-value&gt;0&lt;/param-value&gt;         </pre>
				<pre>&lt;/init-param&gt;        </pre>
				<pre>&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;     </pre>
				<pre>&lt;/servlet&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- JspServlet  当请求的是一个JSP页面的时候（*.jsp）该servlet被调用        <br />它是一个JSP编译器，将请求的JSP页面编译成为servlet再执行        <br />URL PATTERN MAPPING : *.jsp        --&gt; </font>
				</pre>
				<pre>&lt;servlet&gt;         </pre>
				<pre>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;         </pre>
				<pre>&lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;         </pre>
				<pre>&lt;init-param&gt;             </pre>
				<pre>&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;             </pre>
				<pre>&lt;param-value&gt;WARNING&lt;/param-value&gt;         </pre>
				<pre>&lt;/init-param&gt;         </pre>
				<pre>&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;     </pre>
				<pre>&lt;/servlet&gt;   <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!--  +---------------------------+  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  |    servlet映射定义部分    |  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +---------------------------+  --&gt; </font>
				</pre>
				<pre>&lt;servlet-mapping&gt;         </pre>
				<pre>&lt;servlet-name&gt;default&lt;/servlet-name&gt;         </pre>
				<pre>&lt;url-pattern&gt;/&lt;/url-pattern&gt;     </pre>
				<pre>&lt;/servlet-mapping&gt;      </pre>
				<pre>&lt;servlet-mapping&gt;         </pre>
				<pre>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;         </pre>
				<pre>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;     </pre>
				<pre>&lt;/servlet-mapping&gt;      </pre>
				<pre>&lt;servlet-mapping&gt;         </pre>
				<pre>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;         </pre>
				<pre>&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;     </pre>
				<pre>&lt;/servlet-mapping&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!--  +------------------------+  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  |    其它部分，略去先    |  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +------------------------+  --&gt; </font>
				</pre>
				<pre>... ... ... ...  </pre>
				<pre>&lt;/web-app&gt;  </pre>
				<pre>
						<font color="#008000">&lt;!-----------------------------------&gt; </font>
				</pre>
				<p> </p>
				<pre>
						<font color="#008000">&lt;!-------------------------------------------------------------------------&gt; </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!-- 启动Server 在端口8005处等待关闭命令  如果接受到"SHUTDOWN"字符串则关闭服务器      --&gt; </font>
				</pre>
				<pre>&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Listener ???        目前没有看到这里        --&gt; </font>
				</pre>
				<pre>&lt;Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/&gt;   </pre>
				<pre>&lt;Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Global JNDI resources ???        目前没有看到这里，先略去        --&gt; </font>
				</pre>
				<pre>&lt;GlobalNamingResources&gt;     ... ... ... ...   &lt;/GlobalNamingResources&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Tomcat的Standalone Service Service是一组Connector的集合 <br />它们共用一个Engine来处理所有Connector收到的请求--&gt; </font>
				</pre>
				<pre>&lt;Service name="Tomcat-Standalone"&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Coyote HTTP/1.1 Connector  className: 该Connector的实现类是<br />org.apache.coyote.tomcat4.CoyoteConnector <br />port : 在端口号8080处侦听来自客户browser的HTTP1.1请求          <br />minProcessors : 该Connector先创建5个线程等待客户请求，每个请求由一个线程负责          <br />maxProcessors : 当现有的线程不够服务客户请求时，若线程总数不足75个，则创建新线程来处理请求          <br />acceptCount : 当现有线程已经达到最大数75时，为客户请求排队 当队列中请求数超过100时，后来的请求返回Connection refused错误          <br />redirectport : 当客户请求是https时，把该请求转发到端口8443去 其它属性略          --&gt; </font>
				</pre>
				<pre>&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />port="8080"                 <br />minProcessors="5" maxProcessors="75" acceptCount="100"                 <br />enableLookups="true"                 redirectPort="8443"                 <br />debug="0"                 connectionTimeout="20000"                 <br />useURIValidationHack="false"                 disableUploadTimeout="true" /&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Engine用来处理Connector收到的Http请求 <br />它将匹配请求和自己的虚拟主机，并把请求转交给对应的Host来处理          <br />默认虚拟主机是localhost          --&gt; </font>
				</pre>
				<pre>&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;      <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- 日志类，目前没有看到，略去先 --&gt; </font>
				</pre>
				<pre>&lt;Logger className="org.apache.catalina.logger.FileLogger" .../&gt; <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Realm，目前没有看到，略去先 --&gt; </font>
				</pre>
				<pre>&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- 虚拟主机localhost  appBase : 该虚拟主机的根目录是webapps/  <br />它将匹配请求和自己的Context的路径，并把请求转交给对应的Context来处理            --&gt; </font>
				</pre>
				<pre>&lt;Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"&gt;</pre>
				<pre>
						<font color="#008000">&lt;!-- 日志类，目前没有看到，略去先 --&gt; </font>
				</pre>
				<pre>&lt;Logger className="org.apache.catalina.logger.FileLogger" .../&gt;        <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Context，对应于一个Web App   <br />path : 该Context的路径名是""，故该Context是该Host的默认Context              <br />docBase : 该Context的根目录是webapps/mycontext/              --&gt;</font>
				</pre>
				<pre>&lt;Context path="" docBase="mycontext" debug="0"/&gt;</pre>
				<pre>
						<font color="#008000">&lt;!-- 另外一个Context，路径名是/wsota --&gt;</font>
				</pre>
				<pre>&lt;Context path="/wsota" docBase="wsotaProject" debug="0"/&gt;</pre>
				<pre>&lt;/Host&gt;</pre>
				<pre>&lt;/Engine&gt;</pre>
				<pre>&lt;/Service&gt;</pre>
				<pre>&lt;/Server&gt;  </pre>
				<pre>
						<font color="#008000">&lt;!---------------------------------------------------------------&gt; </font>
				</pre>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=615080</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:54 <a href="http://www.blogjava.net/iKingQu/articles/36503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat配置技巧</title><link>http://www.blogjava.net/iKingQu/articles/36502.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36502.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36502.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36502.html</trackback:ping><description><![CDATA[作者：Jason Brittain &amp; Ian F. Darwin <br />出处：<a href="http://www.orielly.com/"><font color="#000080">http://www.orielly.com/</font></a> <br />译者：陈光 <br /><br />编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。 <br /><br />你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。?? Jason Brittain <br /><br /><b>1． 配置系统管理（Admin Web Application）</b> <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 />&lt;role name="admin"/&gt; <br /><br />你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）： <br /><br />&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt; <br /><br />当你完成这些步骤后，请重新启动Tomcat，访问<a href="http://localhost:8080/admin"><font color="#000080">http://localhost:8080/admin</font></a>，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。 <br /><br /><b>2．配置应用管理（Manager Web Application）</b> <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 />&lt;role name=”manager”&gt; <br /><br />你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）： <br /><br />&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt; <br /><br />然后重新启动Tomcat，访问<a href="http://localhost/manager/list"><font color="#000080">http://localhost/manager/list</font></a>，将看到一个很朴素的文本型管理界面，或者访问<a href="http://localhost/manager/html/list"><font color="#000080">http://localhost/manager/html/list</font></a>，将看到一个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 /><b>3．部署一个web应用 </b><br />有两个办法可以在系统中部署web服务。 <br />1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。 <br />2&gt; 为你的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 />&lt;!-- <br />Context fragment for deploying MyWebApp.war <br />--&gt; <br />&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <br />debug="0" privileged="true"&gt; <br />&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" <br />resourceName="UserDatabase"/&gt; <br />&lt;/Context&gt; <br /><br />把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。 <br /><br />这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。 <br /><br /><br /><b>4．配置虚拟主机（Virtual Hosts） </b><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 />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt; <br />&lt;Service name="Tomcat-Standalone"&gt; <br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />port="8080" minProcessors="5" maxProcessors="75" <br />enableLookups="true" redirectPort="8443"/&gt; <br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />port="8443" minProcessors="5" maxProcessors="75" <br />acceptCount="10" debug="0" scheme="https" secure="true"/&gt; <br />&lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" <br />clientAuth="false" protocol="TLS" /&gt; <br />&lt;/Connector&gt; <br />&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt; <br />&lt;!-- This Host is the default Host --&gt; <br />&lt;Host name="localhost" debug="0" appBase="webapps" <br />unpackWARs="true" autoDeploy="true"&gt; <br />&lt;Context path="" docBase="ROOT" debug="0"/&gt; <br />&lt;Context path="/orders" docBase="/home/ian/orders" debug="0" <br />reloadable="true" crossContext="true"&gt; <br />&lt;/Context&gt; <br />&lt;/Host&gt; <br /><br />&lt;!-- This Host is the first "Virtual Host": <a href="http://www.example.com/"><font color="#000080">http://www.example.com/</font></a> --&gt; <br />&lt;Host name="www.example.com" appBase="/home/example/webapp"&gt; <br />&lt;Context path="" docBase="."/&gt; <br />&lt;/Host&gt; <br /><br />&lt;/Engine&gt; <br />&lt;/Service&gt; <br />&lt;/Server&gt; <br /><br />Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。 <br /><br /><b>5．配置基础验证（Basic Authentication） </b><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还是非常易于设置和使用的。只需要添加&lt;security-constraint&gt;和&lt;login-config&gt;两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的&lt;role&gt;和&lt;user&gt;即可，然后重新启动Tomcat。 <br /><br />下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。 <br /><br />&lt;!-- <br />Define the Members-only area, by defining <br />a "Security Constraint" on this Application, and <br />mapping it to the subdirectory (URL) that we want <br />to restrict. <br />--&gt; <br />&lt;security-constraint&gt; <br />&lt;web-resource-collection&gt; <br />&lt;web-resource-name&gt; <br />Entire Application <br />&lt;/web-resource-name&gt; <br />&lt;url-pattern&gt;/members/*&lt;/url-pattern&gt; <br />&lt;/web-resource-collection&gt; <br />&lt;auth-constraint&gt; <br />&lt;role-name&gt;member&lt;/role-name&gt; <br />&lt;/auth-constraint&gt; <br />&lt;/security-constraint&gt; <br />&lt;!-- Define the Login Configuration for this Application --&gt; <br />&lt;login-config&gt; <br />&lt;auth-method&gt;BASIC&lt;/auth-method&gt; <br />&lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt; <br />&lt;/login-config&gt; <br /><br /><b>6．配置单点登录（Single Sign-On）</b> <br />一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。 <br /><br />Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示： <br /><br />&lt;Valve className="org.apache.catalina.authenticator.SingleSignOn" <br />debug="0"/&gt; <br /><br />在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。 <br /><br />使用single sign-on valve有一些重要的限制： <br />1&gt; value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。 <br />2&gt; 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。 <br />3&gt; 不能被context中的realm覆盖。 <br />4&gt; 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的&lt;auth-method&gt;中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。 <br />5&gt; 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。 <br />6&gt; 单点登录需要使用cookies。 <br /><br /><b>7．配置用户定制目录（Customized User Directores） </b><br />一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如： <br /><br /><a href="http://www.cs.myuniversity.edu/~username"><font color="#000080">http://www.cs.myuniversity.edu/~username</font></a> <br /><a href="http://members.mybigisp.com/~username"><font color="#000080">http://members.mybigisp.com/~username</font></a> <br /><br />Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。 <br /><br />&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" <br />userClass="org.apache.catalina.startup.PasswdUserDatabase"/&gt; <br /><br />web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。 <br /><br />实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。 <br /><br />&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" homeBase="/home" <br />userClass="org.apache.catalina.startup.HomesUserDatabase"/&gt; <br /><br />这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。 <br /><br />这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。 <br /><br /><br /><b>8．在Tomcat中使用CGI脚本 </b><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 文件中，把关于&lt;servlet-name&gt; 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 /><b>9．改变Tomcat中的JSP编译器（JSP Compiler）</b> <br />在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在&lt;init-param&gt; 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下： <br /><br />&lt;servlet&gt; <br />&lt;servlet-name&gt;jsp&lt;/servlet-name&gt; <br />&lt;servlet-class&gt; <br />org.apache.jasper.servlet.JspServlet <br />&lt;/servlet-class&gt; <br />&lt;init-param&gt; <br />&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt; <br />&lt;param-value&gt;WARNING&lt;/param-value&gt; <br />&lt;/init-param&gt; <br />&lt;init-param&gt; <br />&lt;param-name&gt;compiler&lt;/param-name&gt; <br />&lt;param-value&gt;jikes&lt;/param-value&gt; <br />&lt;/init-param&gt; <br />&lt;load-on-startup&gt;3&lt;/load-on-startup&gt; <br />&lt;/servlet&gt; <br /><br />当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。 <br /><br /><b>10．限制特定主机访问（Restricting Access to Specific Hosts）</b> <br />有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。 <br /><br />通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。 <br />例如你可以把Admin Web application设置成只允许本地访问，设置如下： <br /><br />&lt;Context path="/path/to/secret_files" ...&gt; <br />&lt;Valve className="org.apache.catalina.valves.RemoteAddrValve" <br />allow="127.0.0.1" deny=""/&gt; <br />&lt;/Context&gt; <br /><br />如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br /><img src ="http://www.blogjava.net/iKingQu/aggbug/36502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:50 <a href="http://www.blogjava.net/iKingQu/articles/36502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat全攻略</title><link>http://www.blogjava.net/iKingQu/articles/36501.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36501.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36501.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36501.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<a name="N10080">
								<span class="smalltitle">
										<strong>
												<font size="3">(一):目录结构</font>
										</strong>
								</span>
						</a>
				</p>
				<p>tomcat的目录结构如下：</p>
				<table cellspacing="0" cellpadding="5" width="100%" border="1">
						<tbody>
								<tr>
										<td>目录名</td>
										<td>简介</td>
								</tr>
								<tr>
										<td>bin</td>
										<td>存放启动和关闭tomcat脚本</td>
								</tr>
								<tr>
										<td>conf</td>
										<td>包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml</td>
								</tr>
								<tr>
										<td>work</td>
										<td>存放jsp编译后产生的class文件</td>
								</tr>
								<tr>
										<td>webapp</td>
										<td>存放应用程序示例，以后你要部署的应用程序也要放到此目录</td>
								</tr>
								<tr>
										<td>logs</td>
										<td>存放日志文件</td>
								</tr>
								<tr>
										<td>lib/japser/common</td>
										<td>这三个目录主要存放tomcat所需的jar文件</td>
								</tr>
						</tbody>
				</table>
				<p>
						<a name="N100CF">
								<span class="smalltitle">
										<strong>
												<font size="3">(二)：server.xml配置简介</font>
										</strong>
								</span>
						</a>
				</p>
				<p>下面我们将讲述这个文件中的基本配置信息，更具体的配置信息见tomcat的文档</p>
				<table cellspacing="0" cellpadding="0" width="80%" border="1">
						<tbody>
								<tr>
										<td width="27%">元素名</td>
										<td width="21%">属性</td>
										<td width="52%">解释</td>
								</tr>
								<tr>
										<td width="27%" rowspan="2">server</td>
										<td width="21%">port</td>
										<td width="52%">指定一个端口，这个端口负责监听关闭tomcat的请求</td>
								</tr>
								<tr>
										<td width="21%">shutdown</td>
										<td width="52%">指定向端口发送的命令字符串</td>
								</tr>
								<tr>
										<td width="27%">service</td>
										<td width="21%">name</td>
										<td width="52%">指定service的名字</td>
								</tr>
								<tr>
										<td width="27%" rowspan="7">Connector (表示客户端和service之间的连接)</td>
										<td width="21%">port</td>
										<td width="52%">指定服务器端要创建的端口号，并在这个断口监听来自客户端的请求</td>
								</tr>
								<tr>
										<td width="21%">minProcessors</td>
										<td width="52%">服务器启动时创建的处理请求的线程数</td>
								</tr>
								<tr>
										<td width="21%">maxProcessors</td>
										<td width="52%">最大可以创建的处理请求的线程数</td>
								</tr>
								<tr>
										<td width="21%">enableLookups</td>
										<td width="52%">如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip地址</td>
								</tr>
								<tr>
										<td width="21%">redirectPort</td>
										<td width="52%">指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号</td>
								</tr>
								<tr>
										<td width="21%">acceptCount</td>
										<td width="52%">指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理</td>
								</tr>
								<tr>
										<td width="21%">connectionTimeout</td>
										<td width="52%">指定超时的时间数(以毫秒为单位)</td>
								</tr>
								<tr>
										<td width="27%">Engine (表示指定service中的请求处理机，接收和处理来自Connector的请求)</td>
										<td width="21%">defaultHost</td>
										<td width="52%">指定缺省的处理请求的主机名，它至少与其中的一个host元素的name属性值是一样的</td>
								</tr>
								<tr>
										<td width="27%" rowspan="3">Context (表示一个web应用程序，通常为WAR文件，关于WAR的具体信息见servlet规范)</td>
										<td width="21%">docBase</td>
										<td width="52%">应用程序的路径或者是WAR文件存放的路径</td>
								</tr>
								<tr>
										<td width="21%">path</td>
										<td width="52%">表示此web应用程序的url的前缀，这样请求的url为http://localhost:8080/path/****</td>
								</tr>
								<tr>
										<td width="21%">reloadable</td>
										<td width="52%">这个属性非常重要，如果为true，则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可以在不重起tomcat的情况下改变应用程序</td>
								</tr>
								<tr>
										<td width="27%" rowspan="3">host (表示一个虚拟主机) </td>
										<td width="21%">name</td>
										<td width="52%">指定主机名</td>
								</tr>
								<tr>
										<td width="21%">appBase</td>
										<td width="52%">应用程序基本目录，即存放应用程序的目录</td>
								</tr>
								<tr>
										<td width="21%">unpackWARs</td>
										<td width="52%">如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接从WAR文件中运行应用程序</td>
								</tr>
								<tr>
										<td rowspan="4">Logger (表示日志，调试和错误信息) </td>
										<td width="21%">className</td>
										<td width="52%">指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口</td>
								</tr>
								<tr>
										<td width="21%">prefix</td>
										<td width="52%">指定log文件的前缀</td>
								</tr>
								<tr>
										<td width="21%">suffix</td>
										<td width="52%">指定log文件的后缀</td>
								</tr>
								<tr>
										<td width="21%">timestamp</td>
										<td width="52%">如果为true，则log文件名中要加入时间，如下例:localhost_log.2001-10-04.txt</td>
								</tr>
								<tr>
										<td width="27%">Realm (表示存放用户名，密码及role的数据库) </td>
										<td width="21%">className</td>
										<td width="52%">指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口</td>
								</tr>
								<tr>
										<td rowspan="3">Valve (功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样) </td>
										<td width="21%">className</td>
										<td width="52%">指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 </td>
								</tr>
								<tr>
										<td width="21%">directory</td>
										<td width="52%">指定log文件存放的位置</td>
								</tr>
								<tr>
										<td width="21%">pattern</td>
										<td width="52%">有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记录的值更多</td>
								</tr>
						</tbody>
				</table>
				<p>注意：1：经过我测试，我设置Context 的path="",reloadable=true，然后放一个WAR文件到webapps目录，结果tomcat不能检测出此文件(重起tomcat可以)，而把此文件解压，则tomcat会自动检测出这个新的应用程序。如果不能自动检测WAR文件，我们可以利用下面管理中讲的方法来部署应用程序。</p>
				<p>2：默认的server.xml中，Realm元素只设置了一个className属性，但此文件中也包含几个通过JDBC连接到数据库进行验证的示例(被注释掉了)，通过Realm元素我们可以实现容器安全管理(Container Managed Security)。</p>
				<p>3：还有一些元素我们没有介绍，如Parameter，loader，你可以通过tomcat的文档获取这些元素的信息。</p>
				<p>
						<a name="N10232">
								<span class="smalltitle">
										<strong>
												<font size="3">(三)：管理</font>
										</strong>
								</span>
						</a>
				</p>
				<p>
						<strong>
								<font size="3">
								</font>
						</strong>
				</p>
				<p>
						<strong>1：配置</strong>
						<br />在进行具体的管理之前，我们先给tomcat添加一个用户，使这个用户有权限来进行管理。 </p>
				<p>打开conf目录下的tomcat-users.xml文件，在相应的位置添加下面一行：</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;user name="zf" password="zf" roles="standard,manager"/&gt; 
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>注意：这一行的最后部分一定是/&gt;,tomcat的文档掉了/符号，如果没有/符号的话，tomcat重起时将无法访问应用程序。通过logs/catalina.out文件你可以看到这个错误的详细信息。</p>
				<p>然后重起tomcat，在浏览器中输入http://localhost:8080/manager/，会弹出对话框，输入上面的用户名和密码即可。</p>
				<p>
						<b>2：应用程序列表</b>
						<br />在浏览器中输入http://localhost:8080/manager/list，浏览器将会显示如下的信息： </p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">OK - Listed applications for virtual host localhost
/ex:running:1
/examples:running:1
/webdav:running:0
/tomcat-docs:running:0
/manager:running:0
/:running:0</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>面的信息分别为应用程序的路径，当前状态(running 或者stopped)，与这个程序相连的session数。</p>
				<p>
						<b>3：重新装载应用程序</b>
						<br />在浏览器中输入 http://localhost:8080/manager/reload?path=/examples，浏览器显示如下： </p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">OK - Reloaded application at context path /examples  
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>表示example应用程序装载成功，如果我们将server.xml的Context元素的reloadable属性设为true(见上面表格)，则没必要利用这种方式重新装载应用程序，因为tomcat会自动装载。</p>
				<p>
						<b>4：显示session信息</b>
						<br />在浏览器中输入http://localhost:8080/manager/sessions?path=/examples，浏览器显示如下： </p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes  
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>
						<b>5：启动和关闭应用程序</b>
						<br />在浏览器中输入http://localhost:8080/manager/start?path=/examples和http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。 </p>
				<p>
						<b>6：部署及撤销部署</b>
						<br />WAR有两种组织方式，一种是按一定的目录结构组织文件，一种是一个后缀为WAR的压缩包，因此它的部署方式也有两种： <br />(1)：在浏览器中输入： <code>http://localhost:8080/manager/install?path=/examples&amp;war=file:/c:\examples</code><br />就会将按目录结构组织的WAR部署 </p>
				<p>(2)：如果输入: <code>http://localhost:8080/manager/install?path=/examples&amp;war=jar:file:/c:\examples.war!/</code><br />就会将按压缩包组织的WAR部署，注意此url后半部分一定要有!/号。 </p>
				<p>部署后就可以用 http://localhost:8080/examples访问了。</p>
				<p>在浏览器中输入： <code>http://localhost:8080/manager/remove?path=/examples</code><br />就会撤销刚才部署的应用程序。 </p>
				<p>
						<a name="N102A6">
								<span class="smalltitle">
										<strong>
												<font size="3">(四)：与apache集成</font>
										</strong>
								</span>
						</a>
				</p>
				<p>虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来。</p>
				<p>我们以linux系统为例介绍.</p>
				<p>从apache网站下载 <a href="http://www.apache.org/dist/httpd/apache_1.3.22.tar.gz"><font color="#5c81a7">apache1.3.22源代码版本</font></a>，然后使用如下命令配置安装apache： </p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">mkdir /usr/local/apache
tar zxvf apache.1.32.tar.gz
cd apache.1.32
./configure --prefix=/usr/local/apache --enable-module=so 
make
make install
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>注意configure命令指定目标安装目录，并且加入DSO(Dynamic Shared Object)支持，注意一定不要忘了这一个选项。</p>
				<p>然后下载 <a href="http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/bin/linux/i386/webapp-module-1.0-tc40-linux-glibc2.2.tar.gz"><font color="#5c81a7">webapp模块</font></a>，将解压后mod_webapp.so文件放入apache的libexec目录，编辑apache的conf目录下的httpd.conf，在这个文件的最后加入下面三行： </p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">LoadModule webapp_module libexec/mod_webapp.so
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples/ 
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>第一行是加入webapp模块，如果编译apache时不增加DSO支持，则无法使用LoadModule指令，第二行指定tomcat与apache的连接，第三行指定部署那个应用，这两个指令使用格式如下：</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">WebAppConnection [connection name] [provider] [host:port]
WebAppDeploy [application name] [connection name] [url path]  
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>其中connection name指定连接名，provider只能是warp，port端口与你的tomcat的配置文件server.xml最后几行指定的要保持一致。文件如下：</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">&lt;Service name="Tomcat-Apache"&gt; 
&lt;Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true"
acceptCount="10" debug="0"/&gt;
******
&lt;/Service&gt; 
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>application name与你在tomcat中部署的应用名一致，url path指定访问这个应用的url。例如上面的例子可以通过http://localhost/examples/来访问tomcat中的examples应用。</p>
				<p>
						<a name="N102DC">
								<span class="smalltitle">
										<strong>
												<font size="3">(五)：中文问题</font>
										</strong>
								</span>
						</a>
				</p>
				<p>一般jsp的乱码问题可以通过在jsp中加入&lt;%@ page contentType="text/html;charset=GB2312" %&gt;来解决，至于servlet的乱码在可以使用servlet2.3中提供的HttpServeletRequest.setCharacterEncoding函数。更详细的中文问题请见 <a href="http://www-128.ibm.com/developerworks/cn/java/jsp_dbcsz/index.shtml"><font color="#5c81a7">JSP/Servlet 中的汉字编码问题</font></a>。 </p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=558756</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:49 <a href="http://www.blogjava.net/iKingQu/articles/36501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat5.0 目录结构 </title><link>http://www.blogjava.net/iKingQu/articles/36498.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36498.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36498.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36498.html</trackback:ping><description><![CDATA[
		<div class="postText">tomcat下有9个目录,分别是bin,common,conf,logs,server,shared,temp,webapps,work 目录,现在对每一目录做介绍.<br />    tomcat根目录在tomcat中叫&lt;CATALINA_HOME&gt;,文章中把tomcat解压后在c:/下.<br />    1.&lt;CATALINA_HOME&gt;/bin: 存放各种平台下启动和关闭Tomcat的脚本文件.其中有个档是catalina.bat,打开这个windos配置文件,在非注释行加入JDK路径,例如 : SET  JAVA_HOME=C:\j2sdk1.4.2_06 保存后,就配置好tomcat环境了. startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件.<br />    2.&lt;CATALINA_HOME&gt;/common: 在common目录下的lib目录,存放Tomcat服务器和所有web应用都能访问的JAR?.<br />    3.&lt;CATALINA_HOME&gt;/shared: 在shared目录下的lib目录,存放所有web应用能访问的,但Tomcat不能访问的JAR?.<br />    4.&lt;CATALINA_HOME&gt;/server: 在server/webapps目录中,存放Tomcat自带的两个APP-admin和manager应用,使用来管理Tomcat-web服务用的.在server/lib目录中,存放tomcat服务器所需要的各,web应用不能访问种jar?.<br />    5.&lt;CATALINA_HOME&gt;/work : Tomcat把各种由jsp生成的servlet文件放在这个目录下.<br />    6.&lt;CATALINA_HOME&gt;/temp : 临时活页夹,Tomcat运行时候存放临时文件用的.<br />    7.&lt;CATALINA_HOME&gt;/logs : 存放Tomcat的日志文件<br />    8.&lt;CATALINA_HOME&gt;/conf : Tomcat的各种配置文件,最重要的是 server.xml;配置tomcat组件的XML文件server.XML其中包括<br />I.顶层类元素[Top Level Elements]: 位于整个配置文件的顶层, 包括&lt;Server&gt;和&lt;Service&gt;;<br />II.连接器类元素[Connectors ]: 客户和服务(容器类元素)间的通讯接口.接受客户请求,返回响应结果;&lt;Connector&gt; <br />II.容器类元素[Containers]: 处理客户请求并且生成响应结果,包含3个:&lt;Engine&gt; &lt;Host&gt; &lt;Context&gt;<br />IV.嵌套类元素[Nested Components]: 可以加入到容器中的元素,包括:&lt;logger&gt; &lt;Valve&gt;&lt;Realm&gt;等<br /><br />一个&lt;Server&gt;包含一个或多个&lt;Service&gt;,一个&lt;Service&gt;包含唯一一个&lt;Engine&gt;和一个或多个&lt;Connector&gt;,多个 &lt;Connector&gt;共享一个&lt;Engine&gt;;一个&lt;Engine&gt;包含多个&lt;Host&gt;,每个&lt;Host&gt;定义一个虚拟主机,包含一个或多个web应用&lt;Context&gt;; &lt;Context&gt;元素是代表一个在虚拟主机上运行的Web应用.&lt;Context&gt;标签的描述<br />Please note that for tomcat 5.x, unlike tomcat 4.x, it is NOT recommended to place &lt;Context&gt; elements directly in the server.xml file. Instead, put them in the META-INF/context.xml directory of your WAR file or the conf directory as described above. <br />    9.&lt;CATALINA_HOME&gt;/webapps: web应用的发布目录,把 java开发的web站点或war文件放入这个目录下就可以通过tomcat服务器访问了.<br /><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=558958</p></div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:48 <a href="http://www.blogjava.net/iKingQu/articles/36498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat的web.xml配置的详细说明</title><link>http://www.blogjava.net/iKingQu/articles/36497.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36497.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36497.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36497.html</trackback:ping><description><![CDATA[1 定义头和根元素<br /><br />部署描述符文件就像所有XML文件一样，必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。<br />DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本（如2.2或2.3）并指定管理此文件其余部分内容的语法的DTD(Document Type Definition，文档类型定义)。<br />所有部署描述符文件的顶层（根）元素为web-app。请注意，XML元素不像HTML，他们是大小写敏感的。因此，web-App和WEB-APP都是不合法的，web-app必须用小写。<br /><br />2 部署描述符文件内的元素次序<br /><br />XML 元素不仅是大小写敏感的，而且它们还对出现在其他元素中的次序敏感。例如，XML头必须是文件中的第一项，DOCTYPE声明必须是第二项，而web- app元素必须是第三项。在web-app元素内，元素的次序也很重要。服务器不一定强制要求这种次序，但它们允许（实际上有些服务器就是这样做的）完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。<br />下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如，此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意，所有这些元素都是可选的。因此，可以省略掉某一元素，但不能把它放于不正确的位置。<br />l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。<br />l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。<br />l description description元素给出与此有关的说明性文本。<br />l context-param context-param元素声明应用范围内的初始化参数。<br />l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。<br />l filter-mapping 一旦命名了一个过滤器，就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。<br />l listener servlet API的版本2.3增加了对事件监听程序的支持，事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。<br />l servlet 在向servlet或JSP页面制定初始化参数或定制URL时，必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。<br />l servlet-mapping 服务器一般为servlet提供一个缺省的URL：<a href="http://host/webAppPrefix/servlet/ServletName"><font color="#000080">http://host/webAppPrefix/servlet/ServletName</font></a>。但是，常常会更改这个URL，以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时，使用servlet-mapping元素。<br />l session-config 如果某个会话在一定时间内未被访问，服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值，或者可利用session-config元素制定缺省超时值。<br />l mime-mapping 如果Web应用具有想到特殊的文件，希望能保证给他们分配特定的MIME类型，则mime-mapping元素提供这种保证。<br />l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时，使用哪个文件。<br />l error-page error-page元素使得在返回特定HTTP状态代码时，或者特定类型的异常被抛出时，能够制定将要显示的页面。<br />l taglib taglib元素对标记库描述符文件（Tag Libraryu Descriptor file）指定别名。此功能使你能够更改TLD文件的位置，而不用编辑使用这些文件的JSP页面。<br />l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。<br />l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。<br />l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用<br />l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。<br />l security-role security-role元素给出安全角色的一个列表，这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。<br />l env-entry env-entry元素声明Web应用的环境项。<br />l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。<br />l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。<br /><br />3 分配名称和定制的UL<br /><br />在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称，使用servlet-mapping元素将定制的URL与刚分配的名称相关联。<br />3.1 分配名称<br />为了提供初始化参数，对servlet或JSP页面定义一个定制URL或分配一个安全角色，必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素（在web-app元素内），如下所示：<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt; <br />这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名称具有两个主要的含义。首先，初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其次,可在 URL而不是类名中使用此名称。因此，利用刚才给出的定义，URL <a href="http://host/webAppPrefix/servlet/Test"><font color="#000080">http://host/webAppPrefix/servlet/Test</font></a> 可用于 <a href="http://host/webAppPrefix/servlet/moreservlets.TestServlet"><font color="#000080">http://host/webAppPrefix/servlet/moreservlets.TestServlet</font></a> 的场所。<br />请记住：XML元素不仅是大小写敏感的，而且定义它们的次序也很重要。例如，web-app元素内所有servlet元素必须位于所有servlet- mapping元素（下一小节介绍）之前，而且还要位于5.6节和5.11节讨论的与过滤器或文档相关的元素（如果有的话）之前。类似地，servlet 的servlet-name子元素也必须出现在servlet-class之前。5.2节"部署描述符文件内的元素次序"将详细介绍这种必需的次序。<br />例如，程序清单5-1给出了一个名为TestServlet的简单servlet，它驻留在moreservlets程序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分，所以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清单5-2给出将放置在deployDemo/WEB-INF/内的web.xml文件的一部分。此web.xml文件使用servlet-name和servlet-class元素将名称Test与TestServlet.class相关联。图 5-1和图5-2分别显示利用缺省URL和注册名调用TestServlet时的结果。<br /><br />程序清单5-1 TestServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to illustrate servlet naming<br />* and custom URLs.<br />* &lt;P&gt;<br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* <a href="http://www.moreservlets.com/"><font color="#000080">http://www.moreservlets.com/</font></a>.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class TestServlet extends HttpServlet {<br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String uri = request.getRequestURI();<br />out.println(ServletUtilities.headWithTitle("Test Servlet") +<br />"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +<br />"&lt;H2&gt;URI: " + uri + "&lt;/H2&gt;\n" +<br />"&lt;/BODY&gt;&lt;/HTML&gt;");<br />}<br />}<br /><br /><br />程序清单5-2 web.xml（说明servlet名称的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- … --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- … --&gt;<br />&lt;/web-app&gt;<br /><br />3.2 定义定制的URL<br />大多数服务器具有一个缺省的serlvet URL：<br />http://host/webAppPrefix/servlet/packageName.ServletName。虽然在开发中使用这个URL很方便，但是我们常常会希望另一个URL用于部署。例如，可能会需要一个出现在Web应用顶层的URL（如，http: //host/webAppPrefix/Anyname），并且在此URL中没有servlet项。位于顶层的URL简化了相对URL的使用。此外，对许多开发人员来说，顶层URL看上去比更长更麻烦的缺省URL更简短。<br />事实上，有时需要使用定制的URL。比如，你可能想关闭缺省URL映射，以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL，那么你怎样访问servlet呢？这时只有使用定制的URL了。<br />为了分配一个定制的URL，可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个任意名称，可利用此名称引用相应的servlet；url-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必须以斜杠（/）起始。<br />下面给出一个简单的web.xml摘录，它允许使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或<br />http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意，仍然需要XML头、 DOCTYPE声明以及web-app封闭元素。此外，可回忆一下，XML元素出现地次序不是随意的。特别是，需要把所有servlet元素放在所有 servlet-mapping元素之前。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/UrlTest&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />URL模式还可以包含通配符。例如，下面的小程序指示服务器发送所有以Web应用的URL前缀开始，以..asp结束的请求到名为BashMS的servlet。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;msUtils.ASPTranslator&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/*.asp&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />3.3 命名JSP页面<br />因为JSP页面要转换成sevlet，自然希望就像命名servlet一样命名JSP页面。毕竟，JSP页面可能会从初始化参数、安全设置或定制的URL中受益，正如普通的serlvet那样。虽然JSP页面的后台实际上是servlet这句话是正确的，但存在一个关键的猜疑：即，你不知道JSP页面的实际类名（因为系统自己挑选这个名字）。因此，为了命名JSP页面，可将jsp-file元素替换为servlet-calss元素，如下所示：<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;<br />&lt;/servlet&gt;<br />命名JSP页面的原因与命名servlet的原因完全相同：即为了提供一个与定制设置（如，初始化参数和安全设置）一起使用的名称，并且，以便能更改激活 JSP页面的URL（比方说，以便多个URL通过相同页面得以处理，或者从URL中去掉.jsp扩展名）。但是，在设置初始化参数时，应该注意，JSP页面是利用jspInit方法，而不是init方法读取初始化参数的。<br />例如，程序清单5-3给出一个名为TestPage.jsp的简单JSP页面，它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo应用的顶层。程序清单5-4给出了用来分配一个注册名PageName，然后将此注册名与http://host/webAppPrefix/UrlTest2/anything 形式的URL相关联的web.xml文件（即，deployDemo/WEB-INF/web.xml）的一部分。<br /><br />程序清单5-3 TestPage.jsp<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;<br />JSP Test Page<br />&lt;/TITLE&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY BGCOLOR="#FDF5E6"&gt;<br />&lt;H2&gt;URI: &lt;%= request.getRequestURI() %&gt;&lt;/H2&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt;<br /><br /><br />程序清单5-4 web.xml（说明JSP页命名的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />4 禁止激活器servlet<br /><br />对servlet或JSP页面建立定制URL的一个原因是，这样做可以注册从 init（servlet）或jspInit（JSP页面）方法中读取得初始化参数。但是，初始化参数只在是利用定制URL模式或注册名访问 servlet或JSP页面时可以使用，用缺省URL http://host/webAppPrefix/servlet/ServletName 访问时不能使用。因此，你可能会希望关闭缺省URL，这样就不会有人意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet，因为多数服务器具有一个用缺省的servlet URL注册的标准servlet，并激活缺省的URL应用的实际servlet。<br />有两种禁止此缺省URL的主要方法：<br />l 在每个Web应用中重新映射/servlet/模式。<br />l 全局关闭激活器servlet。<br />重要的是应该注意到，虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多，但重新映射可以用一种完全可移植的方式来完成。相反，全局禁止激活器servlet完全是针对具体机器的，事实上有的服务器（如ServletExec）没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的详细内容。<br />4.1 重新映射/servlet/URL模式<br />在一个特定的Web应用中禁止以http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet，并使用前一节讨论的url-pattern元素将所有匹配请求转向该 servlet。只要简单地使用：<br />&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />作为servlet-mapping元素中的模式即可。<br />例如，程序清单5-5给出了将SorryServlet servlet（程序清单5-6）与所有以http://host/webAppPrefix/servlet/ 开头的URL相关联的部署描述符文件的一部分。<br /><br />程序清单5-5 web.xml（说明JSP页命名的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Sorry&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.SorryServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt; Sorry &lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />程序清单5-6 SorryServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to give error messages to<br />* users who try to access default servlet URLs<br />* (i.e., http://host/webAppPrefix/servlet/ServletName)<br />* in Web applications that have disabled this<br />* behavior.<br />* &lt;P&gt;<br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class SorryServlet extends HttpServlet {<br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String title = "Invoker Servlet Disabled.";<br />out.println(ServletUtilities.headWithTitle(title) +<br />"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +<br />"&lt;H2&gt;" + title + "&lt;/H2&gt;\n" +<br />"Sorry, access to servlets by means of\n" +<br />"URLs that begin with\n" +<br />"http://host/webAppPrefix/servlet/\n" +<br />"has been disabled.\n" + <br />"&lt;/BODY&gt;&lt;/HTML&gt;");<br />}<br /><br />public void doPost(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />doGet(request, response);<br />}<br />}<br /><br /><br />4.2 全局禁止激活器：Tomcat<br />Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介绍这两种方法：<br />1．禁止激活器： Tomcat 4<br />Tomcat 4用与前面相同的方法关闭激活器servlet，即利用web.xml中的url-mapping元素进行关闭。不同之处在于Tomcat使用了放在 install_dir/conf中的一个服务器专用的全局web.xml文件，而前面使用的是存放在每个Web应用的WEB-INF目录中的标准 web.xml文件。<br />因此，为了在Tomcat 4中关闭激活器servlet，只需在install_dir/conf/web.xml中简单地注释出/servlet/* URL映射项即可，如下所示：<br />&lt;!-- <br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />--&gt;<br />再次提醒，应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的，此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。<br />2．禁止激活器：Tomcat3<br />在Apache Tomcat的版本3中，通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省 servlet URL。例如，下面是禁止使用缺省servlet URL的server.xml文件的一部分。<br />&lt;!-- <br />&lt;RequsetInterceptor <br />className="org.apache.tomcat.request.InvokerInterceptor"<br />debug="0" prefix="/servlet/" /&gt;<br />--&gt;<br /><br />5 初始化和预装载servlet与JSP页面<br /><br />这里讨论控制servlet和JSP页面的启动行为的方法。特别是，说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。<br />5.1 分配servlet初始化参数<br />利用init-param元素向servlet提供初始化参数，init-param元素具有param-name和param-value子元素。例如，在下面的例子中，如果initServlet servlet是利用它的注册名（InitTest）访问的，它将能够从其方法中调用getServletConfig(). getInitParameter("param1")获得"Value 1"，调用getServletConfig().getInitParameter("param2")获得"2"。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;InitTest&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.InitServlet&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;param1&lt;/param-name&gt;<br />&lt;param-value&gt;value1&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;param2&lt;/param-name&gt;<br />&lt;param-value&gt;2&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/servlet&gt;<br />在涉及初始化参数时，有几点需要注意：<br />l 返回值。GetInitParameter的返回值总是一个String。因此，在前一个例子中，可对param2使用Integer.parseInt获得一个int。<br />l JSP中的初始化。JSP页面使用jspInit而不是init。JSP页面还需要使用jsp-file元素代替servlet-class。<br />l 缺省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式访问Servlet时可以使用。因此，在这个例子中，param1和 param2初始化参数将能够在使用URL http://host/webAppPrefix/servlet/InitTest 时可用，但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 时不能使用。<br />例如，程序清单5-7给出一个名为InitServlet的简单servlet，它使用init方法设置firstName和emailAddress字段。程序清单5-8给出分配名称InitTest给servlet的web.xml文件。<br />程序清单5-7 InitServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to illustrate servlet<br />* initialization parameters.<br />* &lt;P&gt;<br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class InitServlet extends HttpServlet {<br />private String firstName, emailAddress;<br /><br />public void init() {<br />ServletConfig config = getServletConfig();<br />firstName = config.getInitParameter("firstName");<br />emailAddress = config.getInitParameter("emailAddress");<br />}<br /><br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String uri = request.getRequestURI();<br />out.println(ServletUtilities.headWithTitle("Init Servlet") +<br />"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +<br />"&lt;H2&gt;Init Parameters:&lt;/H2&gt;\n" +<br />"&lt;UL&gt;\n" +<br />"&lt;LI&gt;First name: " + firstName + "\n" +<br />"&lt;LI&gt;Email address: " + emailAddress + "\n" +<br />"&lt;/UL&gt;\n" + <br />"&lt;/BODY&gt;&lt;/HTML&gt;");<br />}<br />}<br /><br /><br />程序清单5-8 web.xml（说明初始化参数的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;InitTest&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.InitServlet&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;firstName&lt;/param-name&gt;<br />&lt;param-value&gt;Larry&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;emailAddress&lt;/param-name&gt;<br />&lt;param-value&gt;Ellison@Microsoft.com&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br />5.2 分配JSP初始化参数<br />给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数。<br />1）使用jsp-file而不是servlet-class。因此，WEB-INF/web.xml文件的servlet元素如下所示：<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/RealPage.jsp&lt;/jsp-file&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;...&lt;/param-name&gt;<br />&lt;param-value&gt;...&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />...<br />&lt;/servlet&gt;<br />2) 几乎总是分配一个明确的URL模式。对servlet，一般相应地使用以http://host/webAppPrefix/servlet/ 开始的缺省URL。只需记住，使用注册名而不是原名称即可。这对于JSP页面在技术上也是合法的。例如，在上面给出的例子中，可用URL http://host/webAppPrefix/servlet/PageName 访问RealPage.jsp的对初始化参数具有访问权的版本。但在用于JSP页面时，许多用户似乎不喜欢应用常规的servlet的URL。此外，如果 JSP页面位于服务器为其提供了目录清单的目录中（如，一个既没有index.html也没有index.jsp文件的目录），则用户可能会连接到此 JSP页面，单击它，从而意外地激活未初始化的页面。因此，好的办法是使用url-pattern（5.3节）将JSP页面的原URL与注册的 servlet名相关联。这样，客户机可使用JSP页面的普通名称，但仍然激活定制的版本。例如，给定来自项目1的servlet定义，可使用下面的 servlet-mapping定义：<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/RealPage.jsp&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />3）JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此，使用JSP声明提供一个init方法是不合法的，必须制定jspInit方法。<br />为了说明初始化JSP页面的过程，程序清单5-9给出了一个名为InitPage.jsp的JSP页面，它包含一个jspInit方法且放置于 deployDemo Web应用层次结构的顶层。一般，http://host/deployDemo/InitPage.jsp 形式的URL将激活此页面的不具有初始化参数访问权的版本，从而将对firstName和emailAddress变量显示null。但是， web.xml文件（程序清单5-10）分配了一个注册名，然后将该注册名与URL模式/InitPage.jsp相关联。<br /><br />程序清单5-9 InitPage.jsp<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;&lt;TITLE&gt;JSP Init Test&lt;/TITLE&gt;&lt;/HEAD&gt;<br />&lt;BODY BGCOLOR="#FDF5E6"&gt;<br />&lt;H2&gt;Init Parameters:&lt;/H2&gt;<br />&lt;UL&gt;<br />&lt;LI&gt;First name: &lt;%= firstName %&gt;<br />&lt;LI&gt;Email address: &lt;%= emailAddress %&gt;<br />&lt;/UL&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;<br />&lt;%!<br />private String firstName, emailAddress;<br /><br />public void jspInit() {<br />ServletConfig config = getServletConfig();<br />firstName = config.getInitParameter("firstName");<br />emailAddress = config.getInitParameter("emailAddress");<br />}<br />%&gt;<br /><br /><br />程序清单5-10 web.xml（说明JSP页面的init参数的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;InitPage&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/InitPage.jsp&lt;/jsp-file&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;firstName&lt;/param-name&gt;<br />&lt;param-value&gt;Bill&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;emailAddress&lt;/param-name&gt;<br />&lt;param-value&gt;gates@oracle.com&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt; <br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt; InitPage&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/InitPage.jsp&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />5.3 提供应用范围内的初始化参数<br />一般，对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的getInitParameter方法读取这些参数。但是，在某些情形下，希望提供可由任意servlet或JSP页面借助ServletContext的getInitParameter方法读取的系统范围内的初始化参数。<br />可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素，如下所示：<br />&lt;context-param&gt;<br />&lt;param-name&gt;support-email&lt;/param-name&gt;<br />&lt;param-value&gt;blackhole@mycompany.com&lt;/param-value&gt;<br />&lt;/context-param&gt;<br />可回忆一下，为了保证可移植性，web.xml内的元素必须以正确的次序声明。但这里应该注意，context-param元素必须出现任意与文档有关的元素（icon、display-name或description）之后及filter、filter-mapping、listener或 servlet元素之前。<br />5.4 在服务器启动时装载servlet<br />假如servlet或JSP页面有一个要花很长时间执行的init （servlet）或jspInit（JSP）方法。例如，假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种情况下，在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此，可利用servlet的load-on- startup元素规定服务器在第一次启动时装载servlet。下面是一个例子。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt; … &lt;/servlet-name&gt;<br />&lt;servlet-class&gt; … &lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;<br />&lt;load-on-startup/&gt;<br />&lt;/servlet&gt;<br />可以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少数目的servlet或JSP页面。例如，下面的servlet项（放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素内）将指示服务器首先装载和初始化SearchServlet，然后装载和初始化由位于Web应用的result目录中的index.jsp文件产生的 servlet。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Search&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;myPackage.SearchServlet&lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;<br />&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Results&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;/results/index.jsp&lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;<br />&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;<br /><br />6 声明过滤器<br /><br />servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器，但为了使用与过滤器有关的元素，必须在web.xml中使用版本2.3的DTD。<br />过滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前，必须执行第一个相关的过滤器的doFilter方法。在该过滤器对其FilterChain对象调用doFilter时，执行链中的下一个过滤器。如果没有其他过滤器，servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部访问权，因此，它们可以查看客户机名、查找到来的cookie等。为了访问servlet或JSP页面的输出，过滤器可将响应对象包裹在一个替身对象（stand-in object）中，比方说把输出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后，过滤器可检查缓冲区，如有必要，就对它进行修改，然后传送到客户机。<br />例如，程序清单5-11帝国难以了一个简单的过滤器，只要访问相关的servlet或JSP页面，它就截取请求并在标准输出上打印一个报告（开发过程中在桌面系统上运行时，大多数服务器都可以使用这个过滤器）。<br /><br />程序清单5-11 ReportFilter.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.util.*;<br /><br />/** Simple filter that prints a report on the standard output <br />* whenever the associated servlet or JSP page is accessed.<br />* &lt;P&gt;<br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class ReportFilter implements Filter {<br />public void doFilter(ServletRequest request,<br />ServletResponse response,<br />FilterChain chain)<br />throws ServletException, IOException {<br />HttpServletRequest req = (HttpServletRequest)request;<br />System.out.println(req.getRemoteHost() +<br />" tried to access " +<br />req.getRequestURL() +<br />" on " + new Date() + ".");<br />chain.doFilter(request,response);<br />}<br /><br />public void init(FilterConfig config)<br />throws ServletException {<br />}<br /><br />public void destroy() {}<br />}<br /><br />一旦建立了一个过滤器，可以在web.xml中利用filter元素以及filter-name（任意名称）、file-class（完全限定的类名）和（可选的）init-params子元素声明它。请注意，元素在web.xml的web-app元素中出现的次序不是任意的；允许服务器（但不是必需的）强制所需的次序，并且实际中有些服务器也是这样做的。但这里要注意，所有filter元素必须出现在任意filter-mapping元素之前， filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。<br />例如，给定上述的ReportFilter类，可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter（位于moreservlets程序包中）相关联。<br />&lt;filter&gt;<br />&lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />&lt;filter-class&gt;moresevlets.ReportFilter&lt;/filter-class&gt;<br />&lt;/filter&gt;<br />一旦命名了一个过滤器，可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。<br />首先，可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名（此servlet名必须稍后在相同的 web.xml文件中使用servlet元素声明）关联。例如，下面的程序片断指示系统只要利用一个定制的URL访问名为SomeServletName 的servlet或JSP页面，就运行名为Reporter的过滤器。<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />&lt;servlet-name&gt;SomeServletName&lt;/servlet-name&gt;<br />&lt;/filter-mapping&gt;<br />其次，可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如，相面的程序片段指示系统只要访问Web应用中的任意URL，就运行名为Reporter的过滤器。<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />例如，程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节"分配名称和定制的URL"中给出。事实上，程序清单5- 12中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项，可看到下面的标准输出形式的调试报告（换行是为了容易阅读）。<br />audit.irs.gov tried to access <br />http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html<br />on Tue Dec 25 13:12:29 EDT 2001.<br /><br />程序清单5-12 Web.xml（说明filter用法的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;filter&gt;<br />&lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />&lt;filter-class&gt;moresevlets.ReportFilter&lt;/filter-class&gt;<br />&lt;/filter&gt;<br />&lt;!-- ... --&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;<br />&lt;/filter-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/RealPage.jsp&lt;/jsp-file&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />7 指定欢迎页<br /><br />假如用户提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目录名但没有包含文件名的URL，会发生什么事情呢？用户能得到一个目录表？一个错误？还是标准文件的内容？如果得到标准文件内容，是 index.html、index.jsp、default.html、default.htm或别的什么东西呢？<br />Welcome-file-list 元素及其辅助的welcome-file元素解决了这个模糊的问题。例如，下面的web.xml项指出，如果一个URL给出一个目录名但未给出文件名，服务器应该首先试用index.jsp，然后再试用index.html。如果两者都没有找到，则结果有赖于所用的服务器（如一个目录列表）。<br />&lt;welcome-file-list&gt;<br />&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />&lt;/welcome-file-list&gt;<br />虽然许多服务器缺省遵循这种行为，但不一定必须这样。因此，明确地使用welcom-file-list保证可移植性是一种良好的习惯。<br /><br />8 指定处理错误的页面<br /><br />现在我了解到，你在开发servlet和JSP页面时从不会犯错误，而且你的所有页面是那样的清晰，一般的程序员都不会被它们的搞糊涂。但是，是人总会犯错误的，用户可能会提供不合规定的参数，使用不正确的URL或者不能提供必需的表单字段值。除此之外，其它开发人员可能不那么细心，他们应该有些工具来克服自己的不足。<br />error-page元素就是用来克服这些问题的。它有两个可能的子元素，分别是：error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时使用的URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须以/开始。location所指出的位置处的页面可通过查找HttpServletRequest对象的两个专门的属性来访问关于错误的信息，这两个属性分别是：javax.servlet.error.status_code和javax.servlet.error.message。<br />可回忆一下，在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住，error-page出现在web.xml文件的末尾附近，servlet、servlet-name和welcome-file-list之后即可。<br /><br />8.1 error-code元素<br />为了更好地了解error-code元素的值，可考虑一下如果不正确地输入文件名，大多数站点会作出什么反映。这样做一般会出现一个404错误信息，它表示不能找到该文件，但几乎没提供更多有用的信息。另一方面，可以试一下在www.microsoft.com、www.ibm.com 处或者特别是在www.bea.com 处输出未知的文件名。这是会得出有用的消息，这些消息提供可选择的位置，以便查找感兴趣的页面。提供这样有用的错误页面对于Web应用来说是很有价值得。事实上rm-error-page子元素）。由form-login-page给出的HTML表单必须具有一个j_security_check的 ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字段。<br />例如，程序清单5-19指示服务器使用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将收集用户名和口令，并且失败的登陆将由相同目录中名为login-error.jsp的页面报告。<br /><br />程序清单5-19 web.xml（说明login-config的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;security-constraint&gt; ... &lt;/security-constraint&gt;<br />&lt;login-config&gt;<br />&lt;auth-method&gt; FORM &lt;/auth-method&gt;<br />&lt;form-login-config&gt;<br />&lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;<br />&lt;form-error-page&gt;/login-error.jsp&lt;/form-error-page&gt;<br />&lt;/form-login-config&gt;<br />&lt;/login-config&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />9.2 限制对Web资源的访问<br />现在，可以指示服务器使用何种验证方法了。"了不起，"你说道，"除非我能指定一个来收到保护的 URL，否则没有多大用处。"没错。指出这些URL并说明他们应该得到何种保护正是security-constriaint元素的用途。此元素在 web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素，分别是：web-resource-collection、 auth-constraint、user-data-constraint和display-name。下面各小节对它们进行介绍。<br />l web-resource-collection<br />此元素确定应该保护的资源。所有security-constraint元素都必须包含至少一个web-resource-collection项。此元素由一个给出任意标识名称的web-resource-name元素、一个确定应该保护的URL的url-pattern元素、一个指出此保护所适用的 HTTP命令（GET、POST等，缺省为所有方法）的http-method元素和一个提供资料的可选description元素组成。例如，下面的 Web-resource-collection项（在security-constratint元素内）指出Web应用的proprietary目录中所有文档应该受到保护。<br />&lt;security-constraint&gt;<br />&lt;web-resource-coolection&gt;<br />&lt;web-resource-name&gt;Proprietary&lt;/web-resource-name&gt;<br />&lt;url-pattern&gt;/propritary/*&lt;/url-pattern&gt;<br />&lt;/web-resource-coolection&gt;<br />&lt;!-- ... --&gt;<br />&lt;/security-constraint&gt;<br />重要的是应该注意到，url-pattern仅适用于直接访问这些资源的客户机。特别是，它不适合于通过MVC体系结构利用 RequestDispatcher来访问的页面，或者不适合于利用类似jsp:forward的手段来访问的页面。这种不匀称如果利用得当的话很有好处。例如，servlet可利用MVC体系结构查找数据，把它放到bean中，发送请求到从bean中提取数据的JSP页面并显示它。我们希望保证决不直接访问受保护的JSP页面，而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允许任何用户直接访问JSP页面来提供这种保证。但是，这种不匀称的行为可能让开发人员放松警惕，使他们偶然对应受保护的资源提供不受限制的访问。 <br />l auth-constraint<br />尽管web-resource-collention元素质出了哪些URL应该受到保护，但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户类别role- name元素，以及包含（可选）一个描述角色的description元素。例如，下面web.xml中的security-constraint元素部门规定只有指定为Administrator或Big Kahuna（或两者）的用户具有指定资源的访问权。<br />&lt;security-constraint&gt;<br />&lt;web-resource-coolection&gt; ... &lt;/web-resource-coolection&gt;<br />&lt;auth-constraint&gt;<br />&lt;role-name&gt;administrator&lt;/role-name&gt;<br />&lt;role-name&gt;kahuna&lt;/role-name&gt;<br />&lt;/auth-constraint&gt;<br />&lt;/security-constraint&gt;<br />重要的是认识到，到此为止，这个过程的可移植部分结束了。服务器怎样确定哪些用户处于任何角色以及它怎样存放用户的口令，完全有赖于具体的系统。<br />例如，Tomcat使用install_dir/conf/tomcat-users.xml将用户名与角色名和口令相关联，正如下面例子中所示，它指出用户joe（口令bigshot）和jane（口令enaj）属于administrator和kahuna角色。<br />&lt;tomcat-users&gt;<br />&lt;user name="joe" password="bigshot" roles="administrator,kahuna" /&gt;<br />&lt;user name="jane" password="enaj" roles="kahuna" /&gt;<br />&lt;/tomcat-users&gt;<br />l user-data-constraint<br />这个可选的元素指出在访问相关资源时使用任何传输层保护。它必须包含一个transport-guarantee子元素（合法值为NONE、 INTEGRAL或CONFIDENTIAL），并且可选地包含一个description元素。transport-guarantee为NONE值将对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上（并且在未来的HTTP版本中），在 INTEGRAL和CONFIDENTIAL之间可能会有差别，但在当前实践中，他们都只是简单地要求用SSL。例如，下面指示服务器只允许对相关资源做 HTTPS连接：<br />&lt;security-constraint&gt;<br />&lt;!-- ... --&gt;<br />&lt;user-data-constraint&gt;<br />&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;<br />&lt;/user-data-constraint&gt;<br />&lt;/security-constraint&gt;<br />l display-name<br />security-constraint的这个很少使用的子元素给予可能由GUI工具使用的安全约束项一个名称。<br />9.3 分配角色名<br />迄今为止，讨论已经集中到完全由容器（服务器）处理的安全问题之上了。但servlet以及JSP页面也能够处理它们自己的安全问题。<br />例如，容器可能允许用户从bigwig或bigcheese角色访问一个显示主管人员额外紧贴的页面，但只允许bigwig用户修改此页面的参数。完成这种更细致的控制的一种常见方法是调用HttpServletRequset的isUserInRole方法，并据此修改访问。<br />Servlet的 security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如，假如编写了一个调用 request.isUserInRole（"boss"）的servlet，但后来该servlet被用在了一个其口令文件调用角色manager而不是boss的服务器中。下面的程序段使该servlet能够使用这两个名称中的任何一个。<br />&lt;servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;security-role-ref&gt;<br />&lt;role-name&gt;boss&lt;/role-name&gt; &lt;!-- New alias --&gt;<br />&lt;role-link&gt;manager&lt;/role-link&gt; &lt;!-- Real name --&gt;<br />&lt;/security-role-ref&gt;<br />&lt;/servlet&gt;<br />也可以在web-app内利用security-role元素提供将出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色使高级IDE容易处理安全信息。<br /><br />10 控制会话超时<br /><br />如果某个会话在一定的时间内未被访问，服务器可把它扔掉以节约内存。可利用HttpSession的setMaxInactiveInterval方法直接设置个别会话对象的超时值。如果不采用这种方法，则缺省的超时值由具体的服务器决定。但可利用session-config和session- timeout元素来给出一个适用于所有服务器的明确的超时值。超时值的单位为分钟，因此，下面的例子设置缺省会话超时值为三个小时（180分钟）。<br />&lt;session-config&gt;<br />&lt;session-timeout&gt;180&lt;/session-timeout&gt;<br />&lt;/session-config&gt;<br /><br />11 Web应用的文档化<br /><br />越来越多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio（写此文时，已被Macromedia收购）以及IBM VisuaAge for Java等。<br />大量的web.xml元素不仅是为服务器设计的，而且还是为可视开发环境设计的。它们包括icon、display-name和discription等。<br />可回忆一下，在web.xml内以适当地次序声明web-app子元素很重要。不过，这里只要记住icon、display-name和description是web.xml的web-app元素内的前三个合法元素即可。<br />l icon<br />icon元素指出GUI工具可用来代表Web应用的一个和两个图像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG图像，用large-icon元素指定一幅32 x 32的图像。下面举一个例子： <br />&lt;icon&gt;<br />&lt;small-icon&gt;/images/small-book.gif&lt;/small-icon&gt;<br />&lt;large-icon&gt;/images/tome.jpg&lt;/large-icon&gt;<br />&lt;/icon&gt;<br />l display-name<br />display-name元素提供GUI工具可能会用来标记此Web应用的一个名称。下面是个例子。<br />&lt;display-name&gt;Rare Books&lt;/display-name&gt;<br />l description<br />description元素提供解释性文本，如下所示：<br />&lt;description&gt;<br />This Web application represents the store developed for<br />rare-books.com, an online bookstore specializing in rare<br />and limited-edition books.<br />&lt;/description&gt;<br /><br />12 关联文件与MIME类型<br /><br />服务器一般都具有一种让Web站点管理员将文件扩展名与媒体相关联的方法。例如，将会自动给予名为mom.jpg的文件一个image/jpeg的MIME 类型。但是，假如你的Web应用具有几个不寻常的文件，你希望保证它们在发送到客户机时分配为某种MIME类型。mime-mapping元素（具有 extension和mime-type子元素）可提供这种保证。例如，下面的代码指示服务器将application/x-fubar的MIME类型分配给所有以.foo结尾的文件。<br />&lt;mime-mapping&gt;<br />&lt;extension&gt;foo&lt;/extension&gt;<br />&lt;mime-type&gt;application/x-fubar&lt;/mime-type&gt;<br />&lt;/mime-mapping&gt;<br />或许，你的Web应用希望重载（override）标准的映射。例如，下面的代码将告诉服务器在发送到客户机时指定.ps文件作为纯文本（text/plain）而不是作为PostScript（application/postscript）。<br />&lt;mime-mapping&gt;<br />&lt;extension&gt;ps&lt;/extension&gt;<br />&lt;mime-type&gt;application/postscript&lt;/mime-type&gt;<br />&lt;/mime-mapping&gt;<br /><br /><br />13 定位TLD<br /><br />JSP taglib元素具有一个必要的uri属性，它给出一个TLD（Tag Library Descriptor）文件相对于Web应用的根的位置。TLD文件的实际名称在发布新的标签库版本时可能会改变，但我们希望避免更改所有现有JSP页面。此外，可能还希望使用保持taglib元素的简练性的一个简短的uri。这就是部署描述符文件的taglib元素派用场的所在了。Taglib包含两个子元素：taglib-uri和taglib-location。taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素给出TLD文件的实际位置。例如，假如你将文件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。现在，假如web.xml在web-app元素内包含下列内容。<br />&lt;taglib&gt;<br />&lt;taglib-uri&gt;/charts.tld&lt;/taglib-uri&gt;<br />&lt;taglib-location&gt;<br />/WEB-INF/tlds/chart-tags-1.3beta.tld<br />&lt;/taglib-location&gt;<br />&lt;/taglib&gt;<br />给出这个说明后，JSP页面可通过下面的简化形式使用标签库。<br />&lt;%@ taglib uri="/charts.tld" prefix="somePrefix" %&gt;<br /><br />14 指定应用事件监听程序<br /><br />应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的用法。<br />注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内，listener-class元素列出监听程序的完整的限定类名，如下所示：<br />&lt;listener&gt;<br />&lt;listener-class&gt;package.ListenerClass&lt;/listener-class&gt;<br />&lt;/listener&gt;<br />虽然listener元素的结构很简单，但请不要忘记，必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外，因为应用生存期监听程序是serlvet规范的2.3版本中的新内容，所以必须使用 web.xml DTD的2.3版本，而不是2.2版本。<br />例如，程序清单5-20给出一个名为ContextReporter的简单的监听程序，只要Web应用的Servlet-Context建立（如装载Web应用）或消除（如服务器关闭）时，它就在标准输出上显示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。<br /><br />程序清单5-20 ContextReporterjava<br />package moreservlets;<br /><br />import javax.servlet.*;<br />import java.util.*;<br /><br />/** Simple listener that prints a report on the standard output <br />* when the ServletContext is created or destroyed.<br />* &lt;P&gt;<br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class ContextReporter implements ServletContextListener {<br />public void contextInitialized(ServletContextEvent event) {<br />System.out.println("Context created on " +<br />new Date() + ".");<br />}<br /><br />public void contextDestroyed(ServletContextEvent event) {<br />System.out.println("Context destroyed on " +<br />new Date() + ".");<br />}<br />}<br /><br /><br />程序清单5-21 web.xml（声明一个监听程序的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;filter-mapping&gt; … &lt;/filter-mapping&gt;<br />&lt;listener&gt;<br />&lt;listener-class&gt;package.ListenerClass&lt;/listener-class&gt;<br />&lt;/listener&gt;<br />&lt;servlet&gt; ... &lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />15 J2EE元素<br /><br />本节描述用作J2EE环境组成部分的Web应用的web.xml元素。这里将提供一个简明的介绍，详细内容可以参阅http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的Java 2 Plantform Enterprise Edition版本1.3规范的第5章。<br />l distributable<br />distributable 元素指出，Web应用是以这样的方式编程的：即，支持集群的服务器可安全地在多个服务器上分布Web应用。例如，一个可分布的应用必须只使用 Serializable对象作为其HttpSession对象的属性，而且必须避免用实例变量（字段）来实现持续性。distributable元素直接出现在discription元素之后，并且不包含子元素或数据，它只是一个如下的标志。<br />&lt;distributable /&gt;<br />l resource-env-ref<br />resource -env-ref元素声明一个与某个资源有关的管理对象。此元素由一个可选的description元素、一个resource-env-ref- name元素（一个相对于java:comp/env环境的JNDI名）以及一个resource-env-type元素（指定资源类型的完全限定的类），如下所示：<br />&lt;resource-env-ref&gt;<br />&lt;resource-env-ref-name&gt;<br />jms/StockQueue<br />&lt;/resource-env-ref-name&gt;<br />&lt;resource-env-ref-type&gt;<br />javax.jms.Queue<br />&lt;/resource-env-ref-type&gt;<br />&lt;/resource-env-ref&gt;<br />l env-entry<br />env -entry元素声明Web应用的环境项。它由一个可选的description元素、一个env-entry-name元素（一个相对于java: comp/env环境JNDI名）、一个env-entry-value元素（项值）以及一个env-entry-type元素（java.lang程序包中一个类型的完全限定类名，java.lang.Boolean、java.lang.String等）组成。下面是一个例子：<br />&lt;env-entry&gt;<br />&lt;env-entry-name&gt;minAmout&lt;/env-entry-name&gt;<br />&lt;env-entry-value&gt;100.00&lt;/env-entry-value&gt;<br />&lt;env-entry-type&gt;minAmout&lt;/env-entry-type&gt;<br />&lt;/env-entry&gt;<br />l ejb-ref<br />ejb -ref元素声明对一个EJB的主目录的应用。它由一个可选的description元素、一个ejb-ref-name元素（相对于java: comp/env的EJB应用）、一个ejb-ref-type元素（bean的类型，Entity或Session）、一个home元素（bean的主目录接口的完全限定名）、一个remote元素（bean的远程接口的完全限定名）以及一个可选的ejb-link元素（当前bean链接的另一个 bean的名称）组成。<br />l ejb-local-ref<br />ejb-local-ref元素声明一个EJB的本地主目录的引用。除了用local-home代替home外，此元素具有与ejb-ref元素相同的属性并以相同的方式使用 <br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=581385</p><img src ="http://www.blogjava.net/iKingQu/aggbug/36497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:46 <a href="http://www.blogjava.net/iKingQu/articles/36497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat的class加载的优先顺序一览 </title><link>http://www.blogjava.net/iKingQu/articles/36496.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36496.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36496.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36496.html</trackback:ping><description><![CDATA[原文：<a href="http://www.donews.net/lizongbo/archive/2005/03.aspx"><font color="#000080">http://www.donews.net/lizongbo/archive/2005/03.aspx</font></a><br /><br />Tomcat的class加载的优先顺序一览<br /><br />1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。<br /><br />2.环境变量CLASSPATH中的jar和class文件。<br /><br />3.$CATALINA_HOME/common/classes下的class文件。<br /><br />4.$CATALINA_HOME/commons/endorsed下的jar文件。<br /><br />5.$CATALINA_HOME/commons/i18n下的jar文件。<br /><br />6.$CATALINA_HOME/common/lib 下的jar文件。<br />（JDBC驱动之类的jar文件可以放在这里，这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。）<br />7.$CATALINA_HOME/server/classes下的class文件。<br /><br />8.$CATALINA_HOME/server/lib/下的jar文件。<br /><br />9.$CATALINA_BASE/shared/classes 下的class文件。<br /><br />10.$CATALINA_BASE/shared/lib下的jar文件。<br /><br />11.各自具体的webapp /WEB-INF/classes下的class文件。<br /><br />12.各自具体的webapp /WEB-INF/lib下的jar文件。<br /><br />class的搜寻顺序如下：<br />-------------<br />Bootstrap classes of your JVM <br />System class loader classses (described above) <br />/WEB-INF/classes of your web application <br />/WEB-INF/lib/*.jar of your web application <br />$CATALINA_HOME/common/classes <br />$CATALINA_HOME/common/endorsed/*.jar <br />$CATALINA_HOME/common/i18n/*.jar <br />$CATALINA_HOME/common/lib/*.jar <br />$CATALINA_BASE/shared/classes <br />$CATALINA_BASE/shared/lib/*.jar <br />--------------<br /><br /><br />因此放在不同webapp里的class文件，会被classloader加载成不同的实例。<br />例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。<br /><br />package com.lizongbo;<br />public class TestClass {<br />  private String NAME="lizongbo";<br />}<br /><br />package com.lizongbo;<br />public class TestClass {<br />  private String NAME="li_zongbo";<br />}<br /><br />在不同的webapp得到的com.lizongbo.NAME结果是不同的，且互不影响。<br /><br />但是注意，以下包名开头的class例外：<br />javax.* <br />org.xml.sax.* <br />org.w3c.dom.* <br />org.apache.xerces.* <br />org.apache.xalan.* <br /><br />ps,注意.在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对，也会提供jar的加载优先顺序。<br />例如某jar的MAINFEST.MF内容如下：<br />Manifest-Version: 1.0<br />Created-By: lizongbo<br />Class-Path: commons-beanutils.jar<br />Class-Path: commons-collections.jar<br />Class-Path: commons-dbcp.jar<br />Class-Path: commons-digester.jar<br />Class-Path: commons-logging.jar<br />Class-Path: commons-pool.jar<br />Class-Path: commons-services.jar<br />Class-Path: commons-validator.jar<br />Class-Path: jakarta-oro.jar<br />Main-Class: com.lizongbo.MyTestClass<br /><br /><br />那么在加载这个jar的时候，会先在此jar所在目录下依次先加载commons-beanutils.jar，commons-collections.jar。。。等jar文件。<br /><br />在不同的地方放置jar和class可能会产生意想不到的后果,，尤其是不同版本的jar文件，因此在实际应用部署web应用时候要特别留心.<br /><br /><br />例如 使用javamail常见的一个出错信息:<br />javax.mail.NoSuchProviderException: No provider for smtp<br />其真实原因就很可能如下:<br />在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar<br />在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在<br />D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,<br />那么lizongbo这个webapp中使用到javamail进行邮件发送的时候，便会出现No provider for smtp的错误。<br /><br />详情见google：<a href="http://www.google.com/search?hl=zh-CN&amp;inlang=zh-CN&amp;newwindow=1&amp;q=javax.mail.NoSuchProviderException%3A+smtp&amp;btnG=%E6%90%9C%E7%B4%A2&amp;lr=lang_zh-CN"><font color="#000080">http://www.google.com/search?hl=zh-CN&amp;inlang=zh-CN&amp;newwindow=1&amp;q=javax.mail.NoSuchProviderException%3A+smtp&amp;btnG=%E6%90%9C%E7%B4%A2&amp;lr=lang_zh-CN</font></a><br /><br /> <br /><br />其它详情可参考：<br /><a href="http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#JAR%20Manifest"><font color="#000080">http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#JAR%20Manifest</font></a><br /><br /><a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/class-loader-howto.html"><font color="#000080">http://jakarta.apache.org/tomcat/tomcat-5.5-doc/class-loader-howto.html</font></a><br /><img src ="http://www.blogjava.net/iKingQu/aggbug/36496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:45 <a href="http://www.blogjava.net/iKingQu/articles/36496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat配置技巧精华详解</title><link>http://www.blogjava.net/iKingQu/articles/36495.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36495.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36495.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36495.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<span style="COLOR: blue">1、配置系统管理（Admin Web Application）</span>
				<br />　　<br />　　大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。（译者注：CATALINA_BASE即tomcat安装目录下的server目录）<br />　　<br />　　你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA<br />　　<br />　　_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"<br />　　password="deep_dark_secret"<br />　　roles="admin"/＞<br />　　<br />　　当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<br />　　<br />　<span style="COLOR: blue">　2、配置应用管理（Manager Web Application）</span><br />　　<br />　　Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。Manager Web Application被被定义在一个自动部署文件中：<br />　　<br />　　CATALINA_BASE/webapps/manager.xml<br />　　<br />　　你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。（译者注：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"<br />　　password="deep_dark_secret"<br />　　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 />　　<span style="COLOR: blue">3、部署一个web应用</span><br />　　<br />　　有两个办法可以在系统中部署web服务。<br />　　<br />　　1. 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<br />　　<br />　　2. 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。<br />　　<br />　　如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。<br />　　<br />　　接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。<br />　　<br />　　部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。<br />　　<br />　　这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。<br />　　<br />　　举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<br />　　<br />　　＜!--<br />　　Context fragment for deploying MyWebApp.war<br />　　--＞<br />　　＜Context path="/demo"<br />　　docBase="webapps/MyWebApp.war"<br />　　debug="0" privileged="true"＞<br />　　＜Realm className=<br />　　"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 />　　<span style="COLOR: blue">4、配置虚拟主机（Virtual Hosts）</span><br />　　<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 />　　<br />　　在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<br />　　<br />　　＜Server port="8005"<br />　　shutdown="SHUTDOWN" debug="0"＞<br />　　＜Service name="Tomcat-Standalone"＞<br />　　＜Connector className=<br />　　"org.apache.coyote.tomcat4.CoyoteConnector"<br />　　port="8080"<br />　　minProcessors="5" maxProcessors="75"<br />　　enableLookups="true"<br />　　redirectPort="8443"/＞<br />　　＜Connector className=<br />　　"org.apache.coyote.tomcat4.CoyoteConnector"<br />　　port="8443" minProcessors="5"<br />　　maxProcessors="75"<br />　　acceptCount="10" debug="0"<br />　　scheme="https" secure="true"/＞<br />　　＜Factory className="org.apache.coyote.<br />　　tomcat4.CoyoteServerSocketFactory"<br />　　clientAuth="false" protocol="TLS" /＞<br />　　＜/Connector＞<br />　　＜Engine name="Standalone"<br />　　defaultHost="localhost" debug="0"＞<br />　　＜!-- This Host is the default Host --＞<br />　　＜Host name="localhost"<br />　　debug="0" appBase="webapps"<br />　　unpackWARs="true" autoDeploy="true"＞<br />　　＜Context path="" docBase="ROOT" debug="0"/＞<br />　　＜Context path="/orders"<br />　　docBase="/home/ian/orders" debug="0"<br />　　reloadable="true" crossContext="true"＞<br />　　＜/Context＞<br />　　＜/Host＞<br />　　<br />　　＜!-- This Host is the first<br />　　"Virtual Host": http://www.example.com/ --＞<br />　　＜Host name="www.example.com"<br />　　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 />　　<span style="COLOR: blue">5、配置基础验证（Basic Authentication）</span><br />　　<br />　　容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。<br />　　<br />　　注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。<br />　　<br />　　但是，如果你是刚开始使用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<br />　　Members-only area,<br />　　by defining<br />　　a "Security Constraint"<br />　　on this Application, and<br />　　mapping it to the<br />　　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<br />　　Configuration for<br />　　this Application --＞<br />　　＜login-config＞<br />　　＜auth-method＞BASIC＜/auth-method＞<br />　　＜realm-name＞My Club<br />　　Members-only Area＜/realm-name＞<br />　　＜/login-config＞<br />　　<br />　　<span style="COLOR: blue">6、配置单点登录（Single Sign-On）</span><br />　　<br />　　一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。<br />　　<br />　　如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。<br />　　<br />　　Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：<br />　　<br />　　＜Valve className=<br />　　"org.apache.catalina.<br />　　authenticator.SingleSignOn"<br />　　debug="0"/＞<br />　　<br />　　在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。使用single sign-on valve有一些重要的限制：<br />　　<br />　　1＞ value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<br />　　<br />　　2＞ 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<br />　　<br />　　3＞ 不能被context中的realm覆盖。<br />　　<br />　　4＞ 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的＜auth-method＞中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<br />　　<br />　　5＞ 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。<br />　　<br />　　当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<br />　　<br />　　6＞ 单点登录需要使用cookies。<br />　　<br />　　<span style="COLOR: blue">7、配置用户定制目录（Customized User Directores）</span><br />　　<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属性应该是几个映射类之一。<br />　　<br />　　如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。<br />　　<br />　　＜Listener className=<br />　　"org.apache.catalina.startup.UserConfig"<br />　　directoryName="public_html"<br />　　userClass="org.apache.catalina.<br />　　startup.PasswdUserDatabase"/＞<br />　　<br />　　web文件需要放置在像/home/users/ian/public_html或者/users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。<br />　　<br />　　实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。<br />　　<br />　　＜Listener className=<br />　　"org.apache.catalina.startup.UserConfig"<br />　　directoryName="public_html"<br />　　homeBase="/home"<br />　　userClass="org.apache.catalina.<br />　　startup.HomesUserDatabase"/＞<br />　　<br />　　这样一来，web文件就可以位于像/home/ian/public_html或者/home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。<br />　　<br />　　这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。<br />　　<br />　　<span style="COLOR: blue">8、在Tomcat中使用CGI脚本</span><br />　　<br />　　Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。<br />　　<br />　　CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。<br />　　<br />　　当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。<br />　　<br />　　Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。<br />　　<br />　　为了使Tomcat能够运行CGI，你必须做如下几件事：<br />　　<br />　　1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<br />　　<br />　　2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于＜servlet-name＞ CGI的那段的注释去掉（默认情况下，该段位于第241行）。<br />　　<br />　　3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<br />　　<br />　　4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<br />　　<br />　　5. 重新启动Tomcat，你的CGI就可以运行了。<br />　　<br />　　在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。<br />　　<br />　　为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。<br />　　<br />　　<span style="COLOR: blue">9、改变Tomcat中的JSP编译器（JSP Compiler）</span><br />　　<br />　　在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。<br />　　<br />　　这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。<br />　　<br />　　使用起来是容易的，因为你只需要在＜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<br />　　＜/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 />　　<br />　　有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。<br />　　<br />　　通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。例如你可以把Admin Web application设置成只允许本地访问，设置如下：<br />　　<br />　　＜Context path=<br />　　"/path/to/secret_files" ...＞<br />　　＜Valve className="org.apache.<br />　　catalina.valves.RemoteAddrValve"<br />　　allow="127.0.0.1" deny=""/＞<br />　　＜/Context＞<br />　　<br />　　如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=587583</p></div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:43 <a href="http://www.blogjava.net/iKingQu/articles/36495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]About Tomcat</title><link>http://www.blogjava.net/iKingQu/articles/36483.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36483.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36483.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36483.html</trackback:ping><description><![CDATA[tomcat学习笔记<br /><a href="http://www.huihoo.org/apache/tomcat/heavyz/01-startup.html">http://www.huihoo.org/apache/tomcat/heavyz/01-startup.html</a><br /><br />tomcat配置<br /><a href="http://dev.csdn.net/Develop/article/27/27103.shtm">http://dev.csdn.net/Develop/article/27/27103.shtm</a><br /><a href="http://lib.tongyi.net/tomcat/1042173.html">http://lib.tongyi.net/tomcat/1042173.html</a><br />补充：<a href="http://boot.blogchina.com/835336.html">http://boot.blogchina.com/835336.html</a><br />注：其中方法2我在版本5.5.15中用不能成功，信息如下： 
<h1><font size="3">HTTP Status 404 - /myJSP/</font></h1><hr noshade="" size="1" /><p><b><font style="BACKGROUND-COLOR: #525d76" color="#ffffff">type</font></b> Status report</p><p><b><font style="BACKGROUND-COLOR: #525d76" color="#ffffff">message</font></b><u>/myJSP/</u></p><p><b><font style="BACKGROUND-COLOR: #525d76" color="#ffffff">description</font></b><u>The requested resource (/myJSP/) is not available.<br /><br /><font style="BACKGROUND-COLOR: #ff0000"><font style="BACKGROUND-COLOR: #7fffd4">－－错误原因已经找到：<br />请对比：<br />5.5.15<br />&lt;Context path="/myJSP" <br />   reloadable="true" <br />   debug="0"<br />   docBase="E:/My Code/myJSP" <br />   workDir="E:/My Code/myJSP/work"/&gt;<br />5.0.28<br />&lt;Context path="/myJSP" <br />   reloadable="true" <br />   debug="0"<br />   docBase="E:\My Code\myJSP" <br />   workDir="E:\My Code\myJSP\work"/&gt;<br /></font>晕倒啊 ，就是一个“/”和“\”的区别！！！<br /></font><br />tomcat</u>配置数据库连接池<br /><a href="http://fireshort.blogbus.com/logs/2005/02/1022729.html">http://fireshort.blogbus.com/logs/2005/02/1022729.html</a><br /><a href="http://fordesign.sharera.com/blog/BlogTopic/5988.htm">http://fordesign.sharera.com/blog/BlogTopic/5988.htm</a><br /><br /><font color="#0000ff"><u>tomcat + mysql +eclipse 配置jsp开发环境系列（持续关注中）<br /><br /></u><a href="http://blog.csdn.net/cenly60/archive/2006/03/02/613459.aspx">http://blog.csdn.net/cenly60/archive/2006/03/02/613459.aspx</a><script language="javascript"><![CDATA[ocument.title="tomcat + mysql +eclipse 配置jsp开发环境系列(一) - "+document.title]]&gt;</script><br /><br /><font color="#800080"><u>Tomcat中文手册<br /><br />（一）</u><a href="http://blog.csdn.net/baggio785/archive/2006/02/23/607300.aspx">http://blog.csdn.net/baggio785/archive/2006/02/23/607300.aspx</a><br /><br /><u>（二）</u><a href="http://blog.csdn.net/baggio785/archive/2006/02/23/607360.aspx">http://blog.csdn.net/baggio785/archive/2006/02/23/607360.aspx</a><script language="javascript"><![CDATA[ocument.title="Tomcat中文手册(一) - "+document.title]]&gt;</script><u><br /><br /></u></font></font><font color="#000000">Tomcat启动分析<br /><a href="http://www.huihoo.org/apache/tomcat/heavyz/01-startup.html">http://www.huihoo.org/apache/tomcat/heavyz/01-startup.html</a></font></p><img src ="http://www.blogjava.net/iKingQu/aggbug/36483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:24 <a href="http://www.blogjava.net/iKingQu/articles/36483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat中文手册(二) </title><link>http://www.blogjava.net/iKingQu/articles/36476.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36476.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36476.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36476.html</trackback:ping><description><![CDATA[
		<p>下表描述server.xml种的重要元素</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&amp;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 安装页上可找到其他信息。</p>
		<p>
				<a href="http://blog.csdn.net/baggio785/archive/2006/02/23/607300.aspx">
						<font color="#000080">Tomcat中文手册(一)</font>
				</a>
				<br />
		</p>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=607360</p>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:18 <a href="http://www.blogjava.net/iKingQu/articles/36476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat中文手册(一) </title><link>http://www.blogjava.net/iKingQu/articles/36475.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36475.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36475.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36475.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<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服务器插件在诓康刂房占浯蚩桓鯦VM(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>
						<a href="http://blog.csdn.net/baggio785/archive/2006/02/23/607360.aspx">Tomcat中文手册(二)</a>
				</p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=607300</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:17 <a href="http://www.blogjava.net/iKingQu/articles/36475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat5配置Mysql JDBC数据库连接池 </title><link>http://www.blogjava.net/iKingQu/articles/36473.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36473.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36473.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36473.html</trackback:ping><description><![CDATA[
		<div class="postText">如果只是对MySql感兴趣可以照抄这篇短文，如果想配置其他数据库类型的连接池，也可以做简单修改参数即可使用。 <br /><br /><br />1、 安装Tomcat<br /><br />参考Tomcat for window 的安装向导，基本直接安装即可，注意：安装时会提示输入管理用户名和密码，这是以后会用到的用户名和密码，切记。<br /><br /><br />2、 安装MySql<br /><br />默认安装即可。<br /><br /><br />3、 使用Tomcat的Web管理应用配置数据源<br /><br />启动Tomcat服务器，打开浏览器，输入<a href="http://localhost:8080/admin/">http://localhost:8080/admin/</a>（其中localhost可能是一台机器的IP或是服务器名称），进入管理界面的登陆页面，这时候请输入原来安装时要求输入的用户名和密码，登陆到管理界面，<br /><br /><br />选择Resources－Data sources进入配置数据源界面，选择Data Source Actions －&gt;选择Create New Data Source,进入配置详细信息界面，内容如下：<br /><br />JNDI Name: jdbc/mysql<br />Data Source URL: jdbc:mysql://192.168.0.16/SUBRDB <br />JDBC Driver Class: org.gjt.mm.mysql.Driver <br />User Name: root<br />Password: ********<br />Max. Active Connections: 4<br />Max. Idle Connections: 2<br />Max. Wait for Connection: 500<br />Validation Query: <br /><br /><br />要求输入的JNDI Name等信息，其中除了JDBC DriverClass之外，其他的可以根据你的需要填写。比如Data Source URL的内容可能是：jdbc:mysql:// IP或是名称/DataBaseName，其中DataBaseName是你的数据库名称，IP是你的数据库的所在的服务器的IP或是名称。最后点击Save－&gt;Commit Change.这样你的数据源的基本资料配置一半了。<br /><br /><br />4、 web.xml和%TOMCAT_HOME%\conf\Catalina\localhost下对应你的引用的配置文件修改<br /><br />通过文件夹导航到%TOMCAT_HOME%\conf，打开web.xml,在&lt;/web-app&gt;的前面添加以下内容：<br /><br />&lt;resource-ref&gt;<br /><br />&lt;description&gt;DB Connection&lt;/description&gt;<br /><br />&lt;res-ref-name&gt;jdbc/mysql&lt;/res-ref-name&gt;<br /><br />&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br /><br />&lt;res-auth&gt;Container&lt;/res-auth&gt;<br /><br />&lt;/resource-ref&gt;<br /><br /><br />注意res-ref-name填写的内容要与在上文提到的JNDI Name名称一致。 <br /><br />通过文件夹导航到%TOMCAT_HOME%\conf\Catalina\localhost下，找到你的web应用对应的.xml文件，如 ROOT.xml，并在此文件的下添入代码：<br /><br />&lt;ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSourcer"/&gt;<br /><br />到这里，配置工作就基本完成了。<br /><br /><br />5、 其他注意事项<br /><br />别忘了JDBC驱动程序mysql-connector-java-3.0.9-stable-bin.jar一定要放置到Tomcat的对应目录,你的JDBC驱动可能版比笔者高，不过只要能与所使用的MySql对应就可以了，因为我发现版本太低的JDBC驱动不能支持4.0.*版本的MySQL数据库，建议放置在%TOMCAT_HOME%\common\lib和应用的WEB-INF\lib下。两者有什么不同呢？其实一看就明白了，common\li是所有的应用都可以使用的库文件位置。<br /><br />重启你的Tomcat服务。<br /><br /><br /><br />6、 编写测试代码<br /><br />在应用的目录下建立一个Test.jsp文件，代码如下：<br /><br />&lt;!doctype html public "-//w3c//dtd html 4.0 transitional//en" <br /><br />"http://www.w3.org/TR/REC-html40/strict.dtd"&gt;<br /><br />&lt;%@ page import="java.sql.*"%&gt;<br /><br />&lt;%@ page import="javax.sql.*"%&gt;<br /><br />&lt;%@ page import="javax.naming.*"%&gt;<br /><br />&lt;%@ page session="false" %&gt;<br /><br />&lt;html&gt;<br /><br />&lt;head&gt;<br /><br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br /><br />&lt;title&gt;&lt;/title&gt;<br /><br />&lt;% <br /><br />out.print("我的测试开始");<br /><br />DataSource ds = null;<br /><br />try{<br /><br />InitialContext ctx=new InitialContext();<br /><br />ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");<br /><br />Connection conn = ds.getConnection();<br /><br />Statement stmt = conn.createStatement();<br /><br />//提示：users必须是数据库已有的表，<br /><br />//这里的数据库前文提及的Data Source URL配置里包含的数据库。<br /><br />String strSql = " select * from users";<br /><br />ResultSet rs = stmt.executeQuery(strSql);<br /><br />while(rs.next()){<br /><br />out.print(rs.getString(1)); <br /><br />}<br /><br />out.print("我的测试结束");<br /><br />}<br /><br />catch(Exception ex){<br /><br />out.print(“出现例外，信息是:”+ex.getMessage());<br /><br />ex.printStackTrace();<br /><br />}<br /><br />%&gt;<br /><br />&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /><br />运行结果：<br /><br />我的测试开始12345678我的测试结束，因为我的rs.getString(1) 在数据库就是存放12345678<br /><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=613371</p></div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:14 <a href="http://www.blogjava.net/iKingQu/articles/36473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat5配置Mysql/Oracle JDBC数据库连接池</title><link>http://www.blogjava.net/iKingQu/articles/35334.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 14 Mar 2006 18:32:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/35334.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/35334.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/35334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/35334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/35334.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Tomcat5配置Mysql/Oracle JDBC数据库连接池&nbsp; 1、&nbsp; 安装Tomcat&nbsp;在安装了jdk后，参考Tomcat for window 的安装向导，基本直接安装即可，注意：安装时会提示输入管理用户名和密码，这是以后会用到的用户名和密码，切记。&nbsp;&nbsp;&nbsp;2、&nbsp; 安装MySql/Oracl...&nbsp;&nbsp;<a href='http://www.blogjava.net/iKingQu/articles/35334.html'>阅读全文</a><img src ="http://www.blogjava.net/iKingQu/aggbug/35334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-15 02:32 <a href="http://www.blogjava.net/iKingQu/articles/35334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat配置10大技巧</title><link>http://www.blogjava.net/iKingQu/articles/35333.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 14 Mar 2006 18:29:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/35333.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/35333.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/35333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/35333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/35333.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Tomcat配置10大技巧编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。　　你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技...&nbsp;&nbsp;<a href='http://www.blogjava.net/iKingQu/articles/35333.html'>阅读全文</a><img src ="http://www.blogjava.net/iKingQu/aggbug/35333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-15 02:29 <a href="http://www.blogjava.net/iKingQu/articles/35333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat使用技巧</title><link>http://www.blogjava.net/iKingQu/articles/35332.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 14 Mar 2006 18:19:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/35332.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/35332.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/35332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/35332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/35332.html</trackback:ping><description><![CDATA[<P>TOMCAT使用技巧 </P>
<P><BR>1 增加一个虚拟目录<BR>在server.xml文件中增加<BR>&lt;Context path="/oicq" docBase="myweb" debug="0" reloadable="true"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/Context&gt;<BR>myweb说明其相对webapps的位置，是物理存在的目录；<BR>/oicq说明其相对web URL的路径，是一个虚拟的路径，如：<A href="http://localhost/oicq">http://localhost/oicq</A></P>
<P>2 配置服务器的端口<BR>在标准server.xml文件的第56行，修改port = “8080” 为你所希望使用的端口号，如：80</P>
<P>3 web.xml文件的设置</P>
<P>默认(欢迎）文件的设置<BR>在h:\tomcat4\conf\web.xml中，&lt;welcome-file-list&gt;与IIS中的默认文件意思相同。<BR>&lt;welcome-file-list&gt; <BR>&lt;welcome-file&gt;index.html&lt;/welcome-file&gt; <BR>&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt; <BR>&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<BR>&lt;/welcome-file-list&gt;</P>
<P>报错文件的设置<BR>&lt;error-page&gt; <BR>&lt;error-code&gt;404&lt;/error-code&gt;<BR>&lt;location&gt;/notFileFound.jsp&lt;/location&gt;<BR>&lt;/error-page&gt;<BR>&lt;error-page&gt;<BR>&lt;exception-type&gt;java.lang.NullPointerException&lt;/exception-type&gt; <BR>&lt;location&gt;/null.jsp&lt;/location&gt;<BR>&lt;/error-page&gt;<BR>如果某文件资源没有找到，服务器要报404错误，按上述配置则会调用</P>
<P>H:\tomcat\webapps\ROOT\notFileFound.jsp。<BR>如果执行的某个JSP文件产生NullPointException ，则会调用H:\tomcat4\webapps\ROOT\null.jsp</P>
<P>典型的JSP错误页面应该这样写：<BR>&lt;%@ page isErrorPage=”true”%&gt;<BR>出错了：&lt;p&gt; 错误信息: &lt;%= exception.getMessage() %&gt;&lt;/p&gt;</P>
<P>Stack Trace is : <BR>&lt;pre&gt;<BR>&lt;font color="red"&gt;<BR>&lt;%<BR>java.io.CharArrayWriter cw = new java.io.CharArrayWriter();<BR>java.io.PrintWriter pw = new java.io.PrintWriter(cw,true);<BR><A href="http://www.ChinaJavaWorld.com/">http://www.ChinaJavaWorld.com/</A> exception.printStackTrace(pw);<BR>out.println(cw.toString());<BR>%&gt;<BR>&lt;/font&gt;<BR>&lt;/pre&gt;</P>
<P>会话超时的设置<BR>设置session 的过期时间，单位是分钟；<BR>&lt;session-config&gt; <BR>&lt;session-timeout&gt;30&lt;/session-timeout&gt; <BR>&lt;/session-config&gt;</P>
<P>过滤器的设置<BR>&lt;filter&gt;<BR>&lt;filter-name&gt;FilterSource&lt;/filter-name&gt;<BR>&lt;filter-class&gt;project4. FilterSource &lt;/filter-class&gt;<BR>&lt;/filter&gt;<BR>&lt;filter-mapping&gt;<BR>&lt;filter-name&gt;FilterSource&lt;/filter-name&gt;<BR>&lt;url-pattern&gt;/WwwServlet&lt;/url-pattern&gt;<BR>(&lt;url-pattern&gt;/haha/*&lt;/url-pattern&gt;)<BR>&lt;/filter-mapping&gt;</P>
<P>过滤：<BR>1) 身份验证的过滤Authentication Filters<BR>2) 日志和审核的过滤Logging and Auditing Filters<BR>3) 图片转化的过滤Image conversion Filters<BR>4) 数据压缩的过滤Data compression Filters<BR>5) 加密过滤Encryption Filters<BR>6) Tokenizing Filters<BR>7) 资源访问事件触发的过滤Filters that trigger resource access events XSL/T 过滤XSL/T filters<BR>9) 内容类型的过滤Mime-type chain Filter 注意监听器的顺序，如：先安全过滤，然后资源，然后内容类型等，这个顺序可以自己定。<BR>&nbsp;<BR></P><img src ="http://www.blogjava.net/iKingQu/aggbug/35332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-15 02:19 <a href="http://www.blogjava.net/iKingQu/articles/35332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat下中文的彻底解决</title><link>http://www.blogjava.net/iKingQu/articles/35331.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 14 Mar 2006 18:17:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/35331.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/35331.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/35331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/35331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/35331.html</trackback:ping><description><![CDATA[<P>Tomcat下中文的彻底解决 <BR>ponky 原创 <BR>&nbsp;</P>
<P>这些天开发一个项目，服务器是tomcat,操作系统是xp,采用的是MVC架构，模式是采用Facade模式，总是出现乱码，自己也解决了好多天，同事也帮忙解决，也参考了网上众多网友的文章和意见，总算是搞定。但是好记性不如烂笔杆，所以特意记下，以防止自己遗忘，同时也给那些遇到同样问题的人提供一个好的参考途径：<BR>(一)&nbsp;&nbsp;&nbsp; JSP页面上是中文，但是看的是后是乱码：<BR>解决的办法就是在JSP页面的编码的地方&lt;%@ page language="java" contentType="text/html;charset=GBK" %&gt;，因为Jsp转成Java文件时的编码问题，默认的话有的服务器是ISO-8859-1，如果一个JSP中直接输入了中文，Jsp把它当作ISO8859-1来处理是肯定有问题的，这一点，我们可以通过查看Jasper所生成的Java中间文件来确认<BR>(二)&nbsp;&nbsp;&nbsp; 当用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;</P>
<P>/**<BR>&nbsp;* Example filter that sets the character encoding to be used in parsing the<BR>&nbsp;* incoming request<BR>&nbsp;*/<BR>public class SetCharacterEncodingFilter implements Filter {</P>
<P>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Take this filter out of service.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void destroy() {<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Select and set (if specified) the character encoding to be used to<BR>&nbsp;&nbsp;&nbsp;&nbsp; * interpret request parameters for this request.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest request, ServletResponse response,<BR>&nbsp;&nbsp;&nbsp; FilterChain chain)throws IOException, ServletException {</P>
<P>&nbsp;&nbsp;&nbsp; request.setCharacterEncoding("GBK");</P>
<P>&nbsp;&nbsp;&nbsp; // 传递控制到下一个过滤器<BR>&nbsp;&nbsp;&nbsp; chain.doFilter(request, response);<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) throws ServletException {<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>配置web.xml<BR>&lt;filter&gt;<BR>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<BR>&lt;filter-class&gt;SetCharacterEncodingFilter&lt;/filter-class&gt;<BR>&lt;/filter&gt;<BR>&lt;filter-mapping&gt;<BR>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<BR>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<BR>&lt;/filter-mapping&gt;<BR>如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况，你的Form提交的数据是不是用get提交的，一般来说用post提交的话是没有问题的，如果是的话，你就看看第四中解决的办法。<BR>还有就是对含有汉字字符的信息进行处理，处理的代码是：<BR>package dbJavaBean;</P>
<P>public class CodingConvert<BR>{&nbsp;&nbsp; <BR>&nbsp;public CodingConvert()<BR>&nbsp;{<BR>&nbsp; //<BR>&nbsp;}<BR>&nbsp;public String toGb(String uniStr){<BR>&nbsp;&nbsp;&nbsp;&nbsp; String gbStr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(uniStr == null){<BR>&nbsp;&nbsp; uniStr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp; byte[] tempByte = uniStr.getBytes("ISO8859_1");<BR>&nbsp;&nbsp; gbStr = new String(tempByte,"GB2312");<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp; catch(Exception ex){<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; return gbStr;<BR>&nbsp;}<BR>&nbsp;&nbsp; <BR>&nbsp;public String toUni(String gbStr){<BR>&nbsp;&nbsp;&nbsp;&nbsp; String uniStr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(gbStr == null){<BR>&nbsp;&nbsp; gbStr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp; byte[] tempByte = gbStr.getBytes("GB2312");<BR>&nbsp;&nbsp; uniStr = new String(tempByte,"ISO8859_1");<BR>&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception ex){<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return uniStr;<BR>&nbsp;}<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>(三)&nbsp;&nbsp;&nbsp; 在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>&lt;Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/&gt; </P>
<P>2)重启tomcat,一切OK。<BR>需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了。需要注意的是：这个地方如果你要是用UTF-8的时候在传递的过程中在Tomcat中也是要出现乱码的情况，如果不行的话就换别的字符集。</P>
<P>(四)&nbsp;&nbsp;&nbsp; JSP页面上有中文，按钮上面也有中文，但是通过服务器查看页面的时候出现乱码：<BR>&nbsp;&nbsp;&nbsp;&nbsp; 解决的办法是：首先在JSP文件中不应该直接包含本地化的消息文本，而是应该通过&lt;bean:message&gt;标签从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中配置：&lt;message-resources parameter="properties.Application_cn"/&gt;。到这一步，基本上完成了一大半，接着你就要在JSP页面上写&lt;%@ page language="java" contentType="text/html;charset=GBK" %&gt;,到名字的那个label是要写&lt;bean:message key=”name”&gt;,这样的化在页面上出现的时候就会出现中文的姓名，年龄这个也是一样，按钮上汉字的处理也是同样的。<BR>(五)&nbsp;&nbsp;&nbsp; 写入到数据库是乱码：<BR>解决的方法：要配置一个filter,也就是一个Servelet的过滤器，代码如同第二种时候一样。<BR>如果你是通过JDBC直接链接数据库的时候，配置的代码如下：jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&amp;characterEncoding=GBK，这样保证到数据库中的代码是不是乱码。<BR>如果你是通过数据源链接的化你不能按照这样的写法了，首先你就要写在配置文件中，在tomcat 5.0.19中配置数据源的地方是在C:\Tomcat 5.0\conf\Catalina\localhost这个下面，我建立的工程是workshop，放置的目录是webapp下面,workshop.xml的配置文件如下：<BR>&lt;!-- insert this Context element into server.xml --&gt;</P>
<P>&lt;Context path="/workshop" docBase="workshop" debug="0"<BR>reloadable="true" &gt;</P>
<P>&nbsp; &lt;Resource name="jdbc/WorkshopDB"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth="Container"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource" /&gt;</P>
<P>&nbsp; &lt;ResourceParams name="jdbc/WorkshopDB"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;factory&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxActive&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;100&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxIdle&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;30&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;</P>
<P>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxWait&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;10000&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;username&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;root&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;password&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;!-- Class name for mm.mysql JDBC driver --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;driverClassName&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<BR>&lt;/parameter&gt;<BR>&nbsp;&nbsp; &lt;parameter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;url&lt;/name&gt;<BR>&nbsp;&lt;value&gt;&lt;![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&amp;characterEncoding=GBK]]&gt;&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<BR>&nbsp; &lt;/ResourceParams&gt;</P>
<P>&lt;/Context&gt;<BR>粗体的地方要特别的注意，和JDBC直接链接的时候是有区别的，如果你是配置正确的化，当你输入中文的时候到数据库中就是中文了，有一点要注意的是你在显示数据的页面也是要用&lt;%@ page language="java" contentType="text/html;charset=GBK" %&gt;这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的，写了一个Form的时候把他改成了一个jsp，这样有一个地方要注意了，那就是在Dreamver中Action的提交方式是request的，你需要把他该过来，因为在jsp的提交的过程中紧紧就是POST和GET两种方式，但是这两种方式提交的代码在编码方面还是有很大不同的，这个在后面的地方进行说明。3</P>
<P>以上就是我在开发系统中解决中文的问题，不知道能不能解决大家的问题，时间匆忙，没有及时完善，文笔也不是很好，有些地方估计是词不达意。大家可以给我意见，希望能共同进步。<BR>&nbsp;<BR>&nbsp;<BR></P><img src ="http://www.blogjava.net/iKingQu/aggbug/35331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-15 02:17 <a href="http://www.blogjava.net/iKingQu/articles/35331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat5中文问题解决之道</title><link>http://www.blogjava.net/iKingQu/articles/35330.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 14 Mar 2006 18:15:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/35330.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/35330.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/35330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/35330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/35330.html</trackback:ping><description><![CDATA[
		<p>Tomcat5中文问题解决之道 <br />作者：mineral    来自：Jdon</p>
		<p>
				<br />在tomcat5中发现了以前处理tomcat4的方法不能适用于处理直接通过url提交的请求，上网找资料终于发现了最完美的解决办法，不用每个地方都转换了，而且无论get,和post都正常。写了个文档，贴出来希望跟我有同样问题的人不再像我一样痛苦一次:-)</p>
		<p>问题描述：</p>
		<p>1 表单提交的数据，用request.getParameter(“xxx”)返回的字符串为乱码或者？？<br />2 直接通过url如<a href="http://localhost/a.jsp?name">http://localhost/a.jsp?name</a>=中国，这样的get请求在服务端用request. getParameter(“name”)时返回的是乱码；按tomcat4的做法设置Filter也没有用或者用request.setCharacterEncoding("GBK");也不管用</p>
		<p>原因：</p>
		<p>1 tomcat的j2ee实现对表单提交即post方式提示时处理参数采用缺省的iso-8859-1来处理<br />2 tomcat对get方式提交的请求对query-string 处理时采用了和post方法不一样的处理方式。(与tomcat4不一样,所以设置setCharacterEncoding(“gbk”))不起作用。</p>
		<p>解决办法：</p>
		<p>首先所有的jsp文件都加上:</p>
		<p>1 实现一个Filter.设置处理字符集为GBK。(在tomcat的webapps/servlet-examples目录有一个完整的例子。请参考web.xml和SetCharacterEncodingFilter的配置。) </p>
		<p>1)只要把%TOMCAT安装目录%/ webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class文件拷到你的webapp目录/filters下，如果没有filters目录，就创建一个。<br />2)在你的web.xml里加入如下几行：</p>
		<p>    &lt;filter&gt;<br />        &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />        &lt;filter-class&gt;filters.SetCharacterEncodingFilter&lt;/filter-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;encoding&lt;/param-name&gt;<br />            &lt;param-value&gt;GBK&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />    &lt;/filter&gt;<br />        &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;</p>
		<p>3)完成.</p>
		<p>2 get方式的解决办法</p>
		<p>1) 打开tomcat的server.xml文件，找到区块，加入如下一行：URIEncoding=”GBK”</p>
		<p>完整的应如下：</p>
		<p>&lt;Connector port="80"  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               debug="0" connectionTimeout="20000"<br />               disableUploadTimeout="true"<br />               URIEncoding="GBK"/&gt;</p>
		<p>2)重启tomcat,一切OK。</p>
		<p>执行如下jsp页页测试是否成功</p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.util.*"%&gt;<br />&lt;%<br />        String q=request.getParameter("q");<br />        q = q == null? "没有值" : q;<br />%&gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;新闻列表显示&lt;/TITLE&gt;<br />&lt;META http-equiv=Content-Type content="text/html; charset=gb2312"&gt;<br />&lt;META http-equiv=pragma content=no-cache&gt;<br />&lt;body&gt;你提交了：&lt;%=q%&gt;&lt;br&gt;<br />&lt;form action="tcnchar.jsp" method="post"&gt;<br /> 输入中文:&lt;input type="text" name="q"&gt;&lt;input type="submit" value="确定"&gt; &lt;br&gt;<br />&lt;a href="tcnchar.jsp?q=中国"&gt;通过get方式提交&lt;/a&gt;<br />&lt;/form&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt;</p>
		<p>测试结果如果你输入文本框或者点超链都会显示:你提交了”中国”,说明成功!!!!!</p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/iKingQu/aggbug/35330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-15 02:15 <a href="http://www.blogjava.net/iKingQu/articles/35330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>