﻿<?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-我思故我强-文章分类-Tomcat</title><link>http://www.blogjava.net/balajinima/category/26966.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 05 Nov 2007 01:52:14 GMT</lastBuildDate><pubDate>Mon, 05 Nov 2007 01:52:14 GMT</pubDate><ttl>60</ttl><item><title>Tomcat5+Mssql server 2000数据库连接池配置之旅</title><link>http://www.blogjava.net/balajinima/articles/157688.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Fri, 02 Nov 2007 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/157688.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/157688.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/157688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/157688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/157688.html</trackback:ping><description><![CDATA[
		<div class="tit"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>Tomcat相信大家已经很熟悉了，作为一种免费而强大的java web server，得到了很多java爱好者的青睐，最新版本的tomcat5支持servlet2.4和jsp2.0,今天我将采用Tomcat5和Ms sqlserver 000一起来开始<a class="Channel_KeyLink" href="http://www.netbei.com/Article/db/Index.html">数据库</a>连接池配置之旅。<br />需要的准备<br />1、jdk 我使用的版本1.4.01<br />2、Tomcat 5 我使用的是5.0.16版本 下载地址：<a href="http://jakarta.apache.org/site/binindex.cgi"><font color="#000000">http://jakarta.apache.org/site/binindex.cgi</font></a><br />3、Mssql server 2000 <a class="Channel_KeyLink" href="http://www.netbei.com/Article/db/Index.html">数据库</a><br />4、Mssql server 2000的官方jdbc driver ，可以到微软的官方网站免费下载</p>
												<p>好了在安装完上面的软件之后，就进入配置实战了：）</p>
												<p>一、找到jdbc的安装目录，把lib目录下面的msbase.jar和mssqlserver.jar、msutil.jar三个文件一起copy到$CATALINA_HOME/common/lib/（$CATALINA_HOME代表的是你的tomcat5的安装目录）</p>
												<p>二、用文本编辑器，我这是使用editplus(她可是我的挚爱奥)打开$CATALINA_HOME/conf/server.xml文件，找到配置context的地方，把下面的代码<br />粘贴到文件里面</p>
												<p>&lt;Context path="/DBTest" docBase="D:\rautinee work\db\"<br />         debug="5" reloadable="true" crossContext="true"&gt;</p>
												<p>&lt;Logger className="org.apache.catalina.logger.FileLogger"<br />              prefix="localhost_DBTest_log." suffix=".txt"<br />              timestamp="true"/&gt;</p>
												<p>&lt;Resource name="jdbc/TestDB"<br />                auth="Container"<br />                type="javax.sql.DataSource"/&gt;</p>
												<p>&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;</p>
												<p>     &lt;!-- Maximum number of dB connections in pool. Make sure you<br />          configure your mysqld max_connections large enough to handle<br />          all of your db connections. Set to 0 for no limit.<br />          --&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;</p>
												<p>     &lt;!-- Maximum number of idle dB connections to retain in pool.<br />          Set to 0 for no limit.<br />          --&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;</p>
												<p>     &lt;!-- Maximum time to wait for a dB connection to become available<br />          in ms, in this example 10 seconds. An Exception is thrown if<br />          this timeout is exceeded.    Set to -1 to wait indefinitely.<br />          --&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;</p>
												<p>     &lt;!-- MSSQLserver dB username and password for dB connections    --&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;&lt;/value&gt;<br />     &lt;/parameter&gt;</p>
												<p>     &lt;!-- Class name for mssqlserver JDBC driver --&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;</p>
												<p>     &lt;!-- The JDBC connection url for connecting to your mssqlserver dB.--&gt;<br />     &lt;parameter&gt;<br />       &lt;name&gt;url&lt;/name&gt;<br />       &lt;value&gt;jdbc:microsoft:sqlserver://localhost:1433;databasename=Northwind&lt;/value&gt;<br />     &lt;/parameter&gt;<br />&lt;/ResourceParams&gt;<br />&lt;/Context&gt;</p>
												<p>注意：我本地的<a class="Channel_KeyLink" href="http://www.netbei.com/Article/db/Index.html">数据库</a>的sa的密码为空，<a class="Channel_KeyLink" href="http://www.netbei.com/Article/db/Index.html">数据库</a>使用的是Northwind，我的目录名DBTest,他的目录是D:\rautinee work\db\</p>
												<p>打开DBTest下面的web.xml文件，用下面的代码替换原来的内容</p>
												<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />     &lt;!DOCTYPE web-app PUBLIC<br />     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />     "<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><font color="#000000">http://java.sun.com/dtd/web-app_2_3.dtd</font></a>"&gt;<br />&lt;web-app&gt;<br />&lt;description&gt;MSSql server Test App&lt;/description&gt;<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 />&lt;/web-app&gt;</p>
												<p>ok,配置完成，下面的工作是需要编写两个文件测试一下，连接是否成功。</p>
												<p>这里我用了<a href="http://jakarta.apache.org/"><font color="#000000">http://jakarta.apache.org</font></a>上面的例子</p>
												<p>首先是bean文件</p>
												<p>package foo;</p>
												<p>import javax.naming.*;<br />import javax.sql.*;<br />import java.sql.*;</p>
												<p>public class DBTest {</p>
												<p>String foo = "Not Connected";<br />int bar = -1;<br />   <br />public void init() {<br />     try{<br />       Context ctx = new InitialContext();<br />       if(ctx == null ) <br />           throw new Exception("Boom - No Context");</p>
												<p>       DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/TestDB");</p>
												<p>       if (ds != null) {<br />         Connection conn = ds.getConnection();<br />             <br />         if(conn != null)    {<br />             foo = "Got Connection "+conn.toString();<br />             Statement stmt = conn.createStatement();<br />             ResultSet rst = <br />                 stmt.executeQuery("select * from orders");<br />             if(rst.next()) {<br />                foo=rst.getString("CustomerID");<br />                bar=rst.getInt("OrderID");<br />             }<br />             conn.close();<br />         }<br />       }<br />     }catch(Exception e) {<br />       e.printStackTrace();<br />     }<br />}</p>
												<p>public String getFoo() { return foo; }<br />public int getBar() { return bar;}<br />}</p>
												<p>
														<br />然后是index.jsp文件</p>
												<p>&lt;html&gt;<br />&lt;head&gt;<br />     &lt;title&gt;DB Test&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;</p>
												<p>&lt;%<br />     foo.DBTest tst = new foo.DBTest();<br />     tst.init();<br />%&gt;</p>
												<p>&lt;h2&gt;Ms sql server 2000 java search Results&lt;/h2&gt;<br />     Foo &lt;%= tst.getFoo() %&gt;&lt;br/&gt;<br />     Bar &lt;%= tst.getBar() %&gt;</p>
												<p>&lt;/body&gt;<br />&lt;/html&gt;<br />'www.knowsky.com</p>
												<p>编译运行，如果不出意外，应该检索到一条记录，</p>
												<p>我的ie中显示的是<br />Ms sql server 2000 java search Results<br />Foo VINET<br />Bar 10248 </p>
												<p>ok,配制成功！</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/balajinima/aggbug/157688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-11-02 10:53 <a href="http://www.blogjava.net/balajinima/articles/157688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat中的server.xml元素详解</title><link>http://www.blogjava.net/balajinima/articles/157676.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Fri, 02 Nov 2007 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/157676.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/157676.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/157676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/157676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/157676.html</trackback:ping><description><![CDATA[
		<div class="tit"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<div class="cnt">
														<p>
																<br />port<br />指定一个端口，这个端口负责监听关闭tomcat的请求<br /><br />shutdown<br />指定向端口发送的命令字符串<br /><br />service<br />name<br />指定service的名字<br /><br />Connector(表示客户端和service之间的连接)<br />port<br />指定服务器端要创建的端口号，并在这个端口监听来自客户端的请求<br /><br />minProcessors<br />服务器启动时创建的处理请求的线程数<br /><br />maxProcessors<br />最大可以创建的处理请求的线程数<br /><br />enableLookups<br />如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip地址<br /><br />redirectPort<br />指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号<br /><br />acceptCount<br />指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理<br /><br />connectionTimeout<br />指定超时的时间数(以毫秒为单位)<br /><br />Engine(表示指定service中的请求处理机，接收和处理来自Connector的请求)<br />defaultHost<br />指定缺省的处理请求的主机名，它至少与其中的一个host元素的name属性值是一样的<br /><br />Context(表示一个web应用程序，通常为WAR文件，关于WAR的具体信息见servlet规范)<br />docBase<br />应用程序的路径或者是WAR文件存放的路径<br /><br />path<br />表示此web应用程序的url的前缀，这样请求的url为<a href="http://localhost:8080/path/">http://localhost:8080/path/</a>****<br /><br />reloadable<br />这个属性非常重要，如果为true，则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可以在不重起tomcat的情况下改变应用程序<br /><br />host(表示一个虚拟主机)<br />name<br />指定主机名<br /><br />appBase<br />应用程序基本目录，即存放应用程序的目录<br /><br />unpackWARs<br />如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接从WAR文件中运行应用程序<br /><br />Logger(表示日志，调试和错误信息)<br />className<br />指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口<br /><br />prefix<br />指定log文件的前缀<br /><br />suffix<br />指定log文件的后缀<br /><br />timestamp<br />如果为true，则log文件名中要加入时间，如下例:localhost_log.2001-10-04.txt<br /><br />Realm(表示存放用户名，密码及role的数据库)<br />className<br />指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口<br /><br />Valve(功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样)<br />className<br />指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息<br /><br />directory<br />指定log文件存放的位置<br /><br />pattern<br />有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记录的值更多<br /></p>
														<p>
																<br />元素<br />它代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个元素.并且它不能做为任何元素的子元素.</p>
														<p>
																<br />1&gt;className指定实现org.apache.catalina.Server接口的类.默认值为org.apache.catalina.core.StandardServer<br />2&gt;port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.<br />3&gt;shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置</p>
														<p>
																<br />元素<br />该元素由org.apache.catalina.Service接口定义,它包含一个元素,以及一个或多个,这些Connector元素共享用同一个Engine元素</p>
														<p>
														</p>
														<p>第一个处理所有直接由Tomcat服务器接收的web客户请求.<br />第二个处理所有由Apahce服务器转发过来的Web客户请求</p>
														<p>1&gt;className 指定实现org.apahce.catalina.Service接口的类.默认为org.apahce.catalina.core.StandardService<br />2&gt;name定义Service的名字</p>
														<p>
																<br />元素<br />每个Service元素只能有一个Engine元素.元素处理在同一个中所有元素接收到的客户请求.由org.apahce.catalina.Engine接口定义.</p>
														<p>
																<br />1&gt;className指定实现Engine接口的类,默认值为StandardEngine<br />2&gt;defaultHost指定处理客户的默认主机名,在中的子元素中必须定义这一主机<br />3&gt;name定义Engine的名字</p>
														<p>在可以包含如下元素, , , </p>
														<p>
																<br />元素<br />它由Host接口定义.一个Engine元素可以包含多个元素.每个的元素定义了一个虚拟主机.它包含了一个或多个Web应用.</p>
														<p>
																<br />1&gt;className指定实现Host接口的类.默认值为StandardHost<br />2&gt;appBase指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于的相对目录.如果没有此项,默认为/webapps<br />3&gt;autoDeploy如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用<br />4&gt;unpackWARs如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件<br />5&gt;alias指定主机别名,可以指定多个别名<br />6&gt;deployOnStartup如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.如果Web应用中的server.xml没有相应的元素,将采用Tomcat默认的Context<br />7&gt;name定义虚拟主机的名字</p>
														<p>在元素中可以包含如下子元素<br />, , , </p>
														<p>
																<br />元素<br />它由Context接口定义.是使用最频繁的元素.每个可以包含多个元素.每个web应用有唯一<br />的一个相对应的Context代表web应用自身.servlet容器为第一个web应用创建一个<br />ServletContext对象.</p>
														<p>
																<br />1&gt;className指定实现Context的类,默认为StandardContext类<br />2&gt;path指定访问Web应用的URL入口,注意/myweb,而不是myweb了事<br />3&gt;reloadable如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改运.如果监视到有class文件被更新,服务器自重新加载Web应用<br />3&gt;cookies指定是否通过Cookies来支持Session,默认值为true<br />4&gt;useNaming指定是否支持JNDI,默认值为了true</p>
														<p>
																<br />在元素中可以包含如下元素<br />, , , </p>
														<p>
																<br />Connector元素<br />由Connector接口定义.元素代表与客户程序实际交互的给件,它负责接收客户请求,以及向客户返回响应结果.</p>
														<p>
														</p>
														<p>第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求;第二个Connector元素定义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求.</p>
														<p>Connector元素共用属性<br />1&gt;className指定实现Connector接口的类<br />2&gt;enableLookups如果设为true,表示支持域名解析,可以把IP地址解析为主机名.WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为true<br />3&gt;redirectPort指定转发端口.如果当前端口只支持non-SSL请求,在需要安全通信的场命,将把客户请求转发至SSL的redirectPort端口<br />HttpConnector元素的属性<br />1&gt;className实现Connector的类<br />2&gt;port设定Tcp/IP端口,默认值为8080,如果把8080改成80,则只要输入<a href="http://localhost/">http://localhost</a>即可<br />因为TCP/IP的默认端口是80<br />3&gt;address如果服务器有二个以上ip地址,此属性可以设定端口监听的ip地址.默认情况下,端口会监听服务器上所有的ip地址<br />4&gt;bufferSize设定由端口创建的输入流的缓存大小.默认值为2048byte<br />5&gt;protocol设定Http协议,默认值为HTTP/1.1<br />6&gt;maxThreads设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200<br />7&gt;acceptCount设定在监听端口队列的最大客户请求数量,默认值为10.如果队列已满,客户必须等待.<br />8&gt;connectionTimeout定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间<br />JkConnector的属性<br />1&gt;className实现Connector的类<br />2&gt;port设定AJP端口号<br />3&gt;protocol必须设定为AJP/1.3<br /></p>
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/balajinima/aggbug/157676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-11-02 10:38 <a href="http://www.blogjava.net/balajinima/articles/157676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat web.xml详解</title><link>http://www.blogjava.net/balajinima/articles/157673.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Fri, 02 Nov 2007 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/157673.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/157673.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/157673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/157673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/157673.html</trackback:ping><description><![CDATA[1 定义头和根元素<br />部署描述符文件就像所有XML文件一样，必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。
<p>DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本（如2.2或2.3）并指定管理此文件其余部分内容的语法的DTD(Document Type Definition，</p><p>文档类型定义)。</p><p>所有部署描述符文件的顶层（根）元素为web-app。请注意，XML元素不像HTML，他们是大小写敏感的。因此，web-App和WEB-APP都是不合法的，web-app必须用小写。</p><p>2 部署描述符文件内的元素次序<br />XML 元素不仅是大小写敏感的，而且它们还对出现在其他元素中的次序敏感。例如，XML头必须是文件中的第一项，DOCTYPE声明必须是第二项，而web- app元素必须是第三项。在</p><p>web-app元素内，元素的次序也很重要。服务器不一定强制要求这种次序，但它们允许（实际上有些服务器就是这样做的）完全拒绝执行含有次序不正确的元素的Web应用。这表示</p><p>使用非标准元素次序的web.xml文件是不可移植的。</p><p>下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如，此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意，所有这些元素都</p><p>是可选的。因此，可以省略掉某一元素，但不能把它放于不正确的位置。</p><p>2.1 Icon   <br />icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。</p><p>2.2 display-name  <br />display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。</p><p>2.3 description <br />description元素给出与此有关的说明性文本。</p><p>2.4 context-param   <br />context-param元素声明应用范围内的初始化参数。</p><p>2.5 filter <br />过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。</p><p>2.6 filter-mapping <br />一旦命名了一个过滤器，就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。</p><p>2.7 listener <br />servlet API的版本2.3增加了对事件监听程序的支持，事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。</p><p>2.8 servlet <br />在向servlet或JSP页面制定初始化参数或定制URL时，必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。</p><p>2.9 servlet-mapping <br />服务器一般为servlet提供一个缺省的URL：<a href="http://host/webAppPrefix/servlet/ServletName">http://host/webAppPrefix/servlet/ServletName</a>。但是，常常会更改这个URL，以便servlet可以访问初始化参数或更容易地处理相对</p><p>URL。在更改缺省URL时，使用servlet-mapping元素。</p><p>2.10 session-config <br />如果某个会话在一定时间内未被访问，服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值，或者可利用</p><p>session-config元素制定缺省超时值。</p><p>2.11 mime-mapping <br />如果Web应用具有想到特殊的文件，希望能保证给他们分配特定的MIME类型，则mime-mapping元素提供这种保证。</p><p>2.12 welcom-file-list <br />welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时，使用哪个文件。</p><p>2.13 error-page <br />error-page元素使得在返回特定HTTP状态代码时，或者特定类型的异常被抛出时，能够制定将要显示的页面。</p><p>2.14 taglib <br />taglib元素对标记库描述符文件（Tag Libraryu Descriptor file）指定别名。此功能使你能够更改TLD文件的位置，而不用编辑使用这些文件的JSP页面。</p><p>2.15 resource-env-ref <br />resource-env-ref元素声明与资源相关的一个管理对象。</p><p>2.16 resource-ref<br />resource-ref元素声明一个资源工厂使用的外部资源。</p><p>2.17 security-constraint<br />security-constraint元素制定应该保护的URL。它与login-config元素联合使用</p><p>2.18 login-config <br />用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。</p><p>2.19 security-role<br />security-role元素给出安全角色的一个列表，这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为</p><p>容易。</p><p>2.20 env-entry <br />env-entry元素声明Web应用的环境项。</p><p>2.21 ejb-ref <br />ejb-ref元素声明一个EJB的主目录的引用。</p><p>2.22 ejb-local-ref<br />ejb-local-ref元素声明一个EJB的本地主目录的应用。</p><p>3 分配名称和定制的UL<br />在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称，使用servlet-mapping元素将定制的URL与刚分配的名称相关联。</p><p>3.1 分配名称<br />为了提供初始化参数，对servlet或JSP页面定义一个定制URL或分配一个安全角色，必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括</p><p>servlet-name和servlet-class子元素（在web-app元素内），如下所示：</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名称具有两个主要的含义。首先，初始化参数、定制的URL模式以及其</p><p>他定制通过此注册名而不是类名引用此servlet。其次,可在 URL而不是类名中使用此名称。因此，利用刚才给出的定义，URL <a href="http://host/webAppPrefix/servlet/Test">http://host/webAppPrefix/servlet/Test</a> 可用于 </p><p><a href="http://host/webAppPrefix/servlet/moreservlets.TestServlet">http://host/webAppPrefix/servlet/moreservlets.TestServlet</a> 的场所。</p><p>请记住：XML元素不仅是大小写敏感的，而且定义它们的次序也很重要。例如，web-app元素内所有servlet元素必须位于所有servlet- mapping元素（下一小节介绍）之前，而且还</p><p>要位于5.6节和5.11节讨论的与过滤器或文档相关的元素（如果有的话）之前。类似地，servlet 的servlet-name子元素也必须出现在servlet-class之前。5.2节”部署描述符文件</p><p>内的元素次序”将详细介绍这种必需的次序。</p><p>例如，程序清单5-1给出了一个名为TestServlet的简单servlet，它驻留在moreservlets程序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分，所</p><p>以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清单5-2给出将放置在deployDemo/WEB-INF/内的web.xml文件的一部分。此web.xml文件使用</p><p>servlet-name和servlet-class元素将名称Test与TestServlet.class相关联。图 5-1和图5-2分别显示利用缺省URL和注册名调用TestServlet时的结果。</p><p>程序清单5-1 TestServlet.java</p><p>package moreservlets;</p><p>import java.io.*;</p><p>import javax.servlet.*;</p><p>import javax.servlet.http.*;</p><p>/** Simple servlet used to illustrate servlet naming</p><p>* and custom URLs.</p><p>* &lt;P&gt;</p><p>* Taken from More Servlets and JavaServer Pages</p><p>* from Prentice Hall and Sun Microsystems Press,</p><p>* <a href="http://www.moreservlets.com/">http://www.moreservlets.com/</a>.</p><p>* ? 2002 Marty Hall; may be freely used or adapted.</p><p>*/</p><p>public class TestServlet extends HttpServlet {</p><p>public void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>response.setContentType("text/html");</p><p>PrintWriter out = response.getWriter();</p><p>String uri = request.getRequestURI();</p><p>out.println(ServletUtilities.headWithTitle("Test Servlet") +</p><p>"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +</p><p>"&lt;H2&gt;URI: " + uri + "&lt;/H2&gt;\n" +</p><p>"&lt;/BODY&gt;&lt;/HTML&gt;");</p><p>}</p><p>}</p><p>程序清单5-2 web.xml（说明servlet名称的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p>&lt;web-app&gt;</p><p>&lt;!-- … --&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- … --&gt;</p><p>&lt;/web-app&gt;</p><p>3.2 定义定制的URL<br />大多数服务器具有一个缺省的serlvet URL：</p><p><a href="http://host/webAppPrefix/servlet/packageName.ServletName">http://host/webAppPrefix/servlet/packageName.ServletName</a>。虽然在开发中使用这个URL很方便，但是我们常常会希望另一个URL用于部署。例如，可能会需要一个出现在Web应</p><p>用顶层的URL（如，http: //host/webAppPrefix/Anyname），并且在此URL中没有servlet项。位于顶层的URL简化了相对URL的使用。此外，对许多开发人员来说，顶层URL看上去比</p><p>更长更麻烦的缺省URL更简短。</p><p>事实上，有时需要使用定制的URL。比如，你可能想关闭缺省URL映射，以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL，那</p><p>么你怎样访问servlet呢？这时只有使用定制的URL了。</p><p>为了分配一个定制的URL，可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个任意名称，可利用此名称引用相应的servlet；url</p><p>-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必须以斜杠（/）起始。</p><p>下面给出一个简单的web.xml摘录，它允许使用URL <a href="http://host/webAppPrefix/UrlTest">http://host/webAppPrefix/UrlTest</a>而不是<a href="http://host/webAppPrefix/servlet/Test">http://host/webAppPrefix/servlet/Test</a>或</p><p>http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意，仍然需要XML头、 DOCTYPE声明以及web-app封闭元素。此外，可回忆一下，XML元素出现地次序不是随</p><p>意的。特别是，需要把所有servlet元素放在所有 servlet-mapping元素之前。</p><p></p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/UrlTest&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>URL模式还可以包含通配符。例如，下面的小程序指示服务器发送所有以Web应用的URL前缀开始，以..asp结束的请求到名为BashMS的servlet。</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;msUtils.ASPTranslator&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/*.asp&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>3.3 命名JSP页面<br />因为JSP页面要转换成sevlet，自然希望就像命名servlet一样命名JSP页面。毕竟，JSP页面可能会从初始化参数、安全设置或定制的URL中受益，正如普通的serlvet那样。虽然JSP</p><p>页面的后台实际上是servlet这句话是正确的，但存在一个关键的猜疑：即，你不知道JSP页面的实际类名（因为系统自己挑选这个名字）。因此，为了命名JSP页面，可将jsp-file</p><p>元素替换为servlet-calss元素，如下所示：</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;</p><p>&lt;/servlet&gt;</p><p>命名JSP页面的原因与命名servlet的原因完全相同：即为了提供一个与定制设置（如，初始化参数和安全设置）一起使用的名称，并且，以便能更改激活 JSP页面的URL（比方说，</p><p>以便多个URL通过相同页面得以处理，或者从URL中去掉.jsp扩展名）。但是，在设置初始化参数时，应该注意，JSP页面是利用jspInit方法，而不是init方法读取初始化参数的。</p><p>例如，程序清单5-3给出一个名为TestPage.jsp的简单JSP页面，它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo应用的顶层。程序清单5-4给出</p><p>了用来分配一个注册名PageName，然后将此注册名与<a href="http://host/webAppPrefix/UrlTest2/anything">http://host/webAppPrefix/UrlTest2/anything</a> 形式的URL相关联的web.xml文件（即，deployDemo/WEB-INF/web.xml）的一部</p><p>分。</p><p>程序清单5-3 TestPage.jsp</p><p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;</p><p>&lt;HTML&gt;</p><p>&lt;HEAD&gt;</p><p>&lt;TITLE&gt;</p><p>JSP Test Page</p><p>&lt;/TITLE&gt;</p><p>&lt;/HEAD&gt;</p><p>&lt;BODY BGCOLOR="#FDF5E6"&gt;</p><p>&lt;H2&gt;URI: &lt;%= request.getRequestURI() %&gt;&lt;/H2&gt;</p><p>&lt;/BODY&gt;</p><p>&lt;/HTML&gt;</p><p>程序清单5-4 web.xml（说明JSP页命名的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p></p><p>&lt;web-app&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;</p><p>4 禁止激活器servlet<br />对servlet 或JSP页面建立定制URL的一个原因是，这样做可以注册从 init（servlet）或jspInit（JSP页面）方法中读取得初始化参数。但是，初始化参数只在是利用定制URL模式</p><p>或注册名访问 servlet或JSP页面时可以使用，用缺省URL <a href="http://host/webAppPrefix/servlet/ServletName">http://host/webAppPrefix/servlet/ServletName</a> 访问时不能使用。因此，你可能会希望关闭缺省URL，这样就不会有人</p><p>意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet，因为多数服务器具有一个用缺省的servlet URL注册的标准servlet，并激活缺省的URL应用的实际servlet。</p><p>有两种禁止此缺省URL的主要方法：</p><p>l 在每个Web应用中重新映射/servlet/模式。</p><p>4.1 全局关闭激活器servlet。<br />重要的是应该注意到，虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多，但重新映射可以用一种完全可移植的方式来完成。相反，全局禁止激</p><p>活器servlet完全是针对具体机器的，事实上有的服务器（如ServletExec）没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中</p><p>全局禁止激活器servlet的详细内容。</p><p>4.2 重新映射/servlet/URL模式<br />在一个特定的Web应用中禁止以<a href="http://host/webAppPrefix/servlet/">http://host/webAppPrefix/servlet/</a> 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet，并使用前一节讨论的url-pattern</p><p>元素将所有匹配请求转向该 servlet。只要简单地使用：</p><p>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</p><p>作为servlet-mapping元素中的模式即可。</p><p>例如，程序清单5-5给出了将SorryServlet servlet（程序清单5-6）与所有以<a href="http://host/webAppPrefix/servlet/">http://host/webAppPrefix/servlet/</a> 开头的URL相关联的部署描述符文件的一部分。</p><p>程序清单5-5 web.xml（说明JSP页命名的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p>&lt;web-app&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Sorry&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;moreservlets.SorryServlet&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt; Sorry &lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;</p><p>程序清单5-6 SorryServlet.java</p><p>package moreservlets;</p><p>import java.io.*;</p><p>import javax.servlet.*;</p><p>import javax.servlet.http.*;</p><p>/** Simple servlet used to give error messages to</p><p>* users who try to access default servlet URLs</p><p>* (i.e., <a href="http://host/webAppPrefix/servlet/ServletName">http://host/webAppPrefix/servlet/ServletName</a>)</p><p>* in Web applications that have disabled this</p><p>* behavior.</p><p>* &lt;P&gt;</p><p>* Taken from More Servlets and JavaServer Pages</p><p>* from Prentice Hall and Sun Microsystems Press,</p><p>* <a href="http://www.moreservlets.com/">http://www.moreservlets.com/</a>.</p><p>* ? 2002 Marty Hall; may be freely used or adapted.</p><p>*/</p><p>public class SorryServlet extends HttpServlet {</p><p>public void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>response.setContentType("text/html");</p><p>PrintWriter out = response.getWriter();</p><p>String title = "Invoker Servlet Disabled.";</p><p>out.println(ServletUtilities.headWithTitle(title) +</p><p>"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +</p><p>"&lt;H2&gt;" + title + "&lt;/H2&gt;\n" +</p><p>"Sorry, access to servlets by means of\n" +</p><p>"URLs that begin with\n" +</p><p>"<a href="http://host/webAppPrefix/servlet/%20n">http://host/webAppPrefix/servlet/\n</a>" +</p><p>"has been disabled.\n" +</p><p>"&lt;/BODY&gt;&lt;/HTML&gt;");</p><p>}</p><p>public void doPost(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>doGet(request, response);</p><p>}</p><p>}</p><p>4.3 全局禁止激活器：Tomcat<br />Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介绍这两种方法：</p><p>4.3.1      禁止激活器： Tomcat 4Tomcat 4用与前面相同的方法关闭激活器servlet，即利用web.xml中的url-mapping元素进行关闭。不同之处在于Tomcat使用了放在 </p><p>install_dir/conf中的一个服务器专用的全局web.xml文件，而前面使用的是存放在每个Web应用的WEB-INF目录中的标准 web.xml文件。</p><p>因此，为了在Tomcat 4中关闭激活器servlet，只需在install_dir/conf/web.xml中简单地注释出/servlet/* URL映射项即可，如下所示：</p><p></p><p>&lt;!--</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>--&gt;</p><p>再次提醒，应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的，此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。</p><p>4.3.2      禁止激活器：Tomcat3在Apache Tomcat的版本3中，通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省 servlet URL。例如，下面是禁止</p><p>使用缺省servlet URL的server.xml文件的一部分。</p><p>&lt;!--</p><p>&lt;RequsetInterceptor</p><p>className="org.apache.tomcat.request.InvokerInterceptor"</p><p>debug="0" prefix="/servlet/" /&gt;</p><p>--&gt;</p><p>5 初始化和预装载servlet与JSP页面<br />这里讨论控制servlet和JSP页面的启动行为的方法。特别是，说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。</p><p>5.1 分配servlet初始化参数<br />利用init-param元素向servlet提供初始化参数，init-param元素具有param-name和param-value子元素。例如，在下面的例子中，如果initServlet servlet是利用它的注册名</p><p>（InitTest）访问的，它将能够从其方法中调用getServletConfig(). getInitParameter(”param1″)获得”Value 1″，调用getServletConfig().getInitParameter(”param2″</p><p>)获得”2″。</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;InitTest&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;moreservlets.InitServlet&lt;/servlet-class&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;param1&lt;/param-name&gt;</p><p>&lt;param-value&gt;value1&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;param2&lt;/param-name&gt;</p><p>&lt;param-value&gt;2&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>&lt;/servlet&gt;</p><p>在涉及初始化参数时，有几点需要注意：</p><p>ü      返回值。GetInitParameter的返回值总是一个String。因此，在前一个例子中，可对param2使用Integer.parseInt获得一个int。</p><p>ü      JSP中的初始化。JSP页面使用jspInit而不是init。JSP页面还需要使用jsp-file元素代替servlet-class。</p><p>ü      缺省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式访问Servlet时可以使用。因此，在这个例子中，param1和 param2初始化参数将能够在使用URL </p><p><a href="http://host/webAppPrefix/servlet/InitTest">http://host/webAppPrefix/servlet/InitTest</a> 时可用，但在使用URL <a href="http://host/webAppPrefix/servlet/myPackage.InitServlet">http://host/webAppPrefix/servlet/myPackage.InitServlet</a> 时不能使用。</p><p>例如，程序清单5-7给出一个名为InitServlet的简单servlet，它使用init方法设置firstName和emailAddress字段。程序清单5-8给出分配名称InitTest给servlet的web.xml文件。</p><p>程序清单5-7 InitServlet.java</p><p>package moreservlets;</p><p>import java.io.*;</p><p>import javax.servlet.*;</p><p>import javax.servlet.http.*;</p><p>/** Simple servlet used to illustrate servlet</p><p>* initialization parameters.</p><p>* &lt;P&gt;</p><p>* Taken from More Servlets and JavaServer Pages</p><p>* from Prentice Hall and Sun Microsystems Press,</p><p>* <a href="http://www.moreservlets.com/">http://www.moreservlets.com/</a>.</p><p>* ? 2002 Marty Hall; may be freely used or adapted.</p><p>*/</p><p>public class InitServlet extends HttpServlet {</p><p>private String firstName, emailAddress;</p><p>public void init() {</p><p>ServletConfig config = getServletConfig();</p><p>firstName = config.getInitParameter("firstName");</p><p>emailAddress = config.getInitParameter("emailAddress");</p><p>}</p><p>public void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>response.setContentType("text/html");</p><p>PrintWriter out = response.getWriter();</p><p>String uri = request.getRequestURI();</p><p>out.println(ServletUtilities.headWithTitle("Init Servlet") +</p><p>"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +</p><p>"&lt;H2&gt;Init Parameters:&lt;/H2&gt;\n" +</p><p>"&lt;UL&gt;\n" +</p><p>"&lt;LI&gt;First name: " + firstName + "\n" +</p><p>"&lt;LI&gt;Email address: " + emailAddress + "\n" +</p><p>"&lt;/UL&gt;\n" +</p><p>"&lt;/BODY&gt;&lt;/HTML&gt;");</p><p>}</p><p>}</p><p>程序清单5-8 web.xml（说明初始化参数的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p>&lt;web-app&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;InitTest&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;moreservlets.InitServlet&lt;/servlet-class&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;firstName&lt;/param-name&gt;</p><p>&lt;param-value&gt;Larry&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;emailAddress&lt;/param-name&gt;</p><p>&lt;param-value&gt;Ellison@Microsoft.com&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;</p><p>5.2 分配JSP初始化参数<br />给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数。</p><p>1）使用jsp-file而不是servlet-class。因此，WEB-INF/web.xml文件的servlet元素如下所示：</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;/RealPage.jsp&lt;/jsp-file&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;...&lt;/param-name&gt;</p><p>&lt;param-value&gt;...&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>...</p><p>&lt;/servlet&gt;</p><p>2) 几乎总是分配一个明确的URL模式。对servlet，一般相应地使用以<a href="http://host/webAppPrefix/servlet/">http://host/webAppPrefix/servlet/</a> 开始的缺省URL。只需记住，使用注册名而不是原名称即可。这对于JSP</p><p>页面在技术上也是合法的。例如，在上面给出的例子中，可用URL <a href="http://host/webAppPrefix/servlet/PageName">http://host/webAppPrefix/servlet/PageName</a> 访问RealPage.jsp的对初始化参数具有访问权的版本。但在用于</p><p>JSP页面时，许多用户似乎不喜欢应用常规的servlet的URL。此外，如果 JSP页面位于服务器为其提供了目录清单的目录中（如，一个既没有index.html也没有index.jsp文件的目</p><p>录），则用户可能会连接到此 JSP页面，单击它，从而意外地激活未初始化的页面。因此，好的办法是使用url-pattern（5.3节）将JSP页面的原URL与注册的 servlet名相关联。</p><p>这样，客户机可使用JSP页面的普通名称，但仍然激活定制的版本。例如，给定来自项目1的servlet定义，可使用下面的 servlet-mapping定义：</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/RealPage.jsp&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>3）JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此，使用JSP声明提供一个init方法是不合法的，必须制定jspInit方法。</p><p>为了说明初始化JSP页面的过程，程序清单5-9给出了一个名为InitPage.jsp的JSP页面，它包含一个jspInit方法且放置于 deployDemo Web应用层次结构的顶层。一般，</p><p><a href="http://host/deployDemo/InitPage.jsp">http://host/deployDemo/InitPage.jsp</a> 形式的URL将激活此页面的不具有初始化参数访问权的版本，从而将对firstName和emailAddress变量显示null。但是， web.xml文件（程</p><p>序清单5-10）分配了一个注册名，然后将该注册名与URL模式/InitPage.jsp相关联。</p><p>程序清单5-9 InitPage.jsp</p><p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;</p><p>&lt;HTML&gt;</p><p>&lt;HEAD&gt;&lt;TITLE&gt;JSP Init Test&lt;/TITLE&gt;&lt;/HEAD&gt;</p><p>&lt;BODY BGCOLOR="#FDF5E6"&gt;</p><p>&lt;H2&gt;Init Parameters:&lt;/H2&gt;</p><p>&lt;UL&gt;</p><p>&lt;LI&gt;First name: &lt;%= firstName %&gt;</p><p>&lt;LI&gt;Email address: &lt;%= emailAddress %&gt;</p><p>&lt;/UL&gt;</p><p>&lt;/BODY&gt;&lt;/HTML&gt;<br /></p><p><br />&lt;%!</p><p>private String firstName, emailAddress;</p><p>public void jspInit() {</p><p>ServletConfig config = getServletConfig();</p><p>firstName = config.getInitParameter("firstName");</p><p>emailAddress = config.getInitParameter("emailAddress");</p><p>}</p><p>%&gt;</p><p>程序清单5-10 web.xml（说明JSP页面的init参数的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p></p><p>&lt;web-app&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;InitPage&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;/InitPage.jsp&lt;/jsp-file&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;firstName&lt;/param-name&gt;</p><p>&lt;param-value&gt;Bill&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>&lt;init-param&gt;</p><p>&lt;param-name&gt;emailAddress&lt;/param-name&gt;</p><p>&lt;param-value&gt;gates@oracle.com&lt;/param-value&gt;</p><p>&lt;/init-param&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt; InitPage&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/InitPage.jsp&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;<br /></p><p>5.3 提供应用范围内的初始化参数<br />一般，对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的 getInitParameter方法读取这些参数。但是，在某些情形下，希望提供可由任</p><p>意servlet或JSP页面借助ServletContext 的getInitParameter方法读取的系统范围内的初始化参数。</p><p>可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素，如下所示：</p><p>&lt;context-param&gt;</p><p>&lt;param-name&gt;support-email&lt;/param-name&gt;</p><p>&lt;param-value&gt;blackhole@mycompany.com&lt;/param-value&gt;</p><p>&lt;/context-param&gt;</p><p>可回忆一下，为了保证可移植性，web.xml内的元素必须以正确的次序声明。但这里应该注意，context-param元素必须出现任意与文档有关的元素（icon、display-name或</p><p>description）之后及filter、filter-mapping、listener或 servlet元素之前。</p><p>5.4 在服务器启动时装载servlet<br />假如servlet或JSP页面有一个要花很长时间执行的init （servlet）或jspInit（JSP）方法。例如，假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种情况下</p><p>，在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此，可利用servlet的load-on- startup元素规定服务器在第一次启动时装载servlet。</p><p>下面是一个例子。</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt; … &lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt; … &lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;</p><p>&lt;load-on-startup/&gt;</p><p>&lt;/servlet&gt;</p><p>可以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少数目的servlet或JSP页面。例如，下面的</p><p>servlet项（放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素内）将指示服务器首先装载和初始化SearchServlet，然后装载和初始化由位于Web应用的result目录中</p><p>的index.jsp文件产生的 servlet。</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Search&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;myPackage.SearchServlet&lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;</p><p>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;Results&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;/results/index.jsp&lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;</p><p>&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;</p><p>&lt;/servlet&gt;</p><p>6 声明过滤器<br />servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器，但为了使用与过滤器有关的元素，必须在web.xml中使用版本2.3的DTD。</p><p>过滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前，必须执行第一个相关的过滤器的doFilter方法</p><p>。在该过滤器对其FilterChain对象调用doFilter时，执行链中的下一个过滤器。如果没有其他过滤器，servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部</p><p>访问权，因此，它们可以查看客户机名、查找到来的cookie等。为了访问servlet或JSP页面的输出，过滤器可将响应对象包裹在一个替身对象（stand-in object）中，比方说把输</p><p>出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后，过滤器可检查缓冲区，如有必要，就对它进行修改，然后传送到客户机。</p><p>例如，程序清单5-11帝国难以了一个简单的过滤器，只要访问相关的servlet或JSP页面，它就截取请求并在标准输出上打印一个报告（开发过程中在桌面系统上运行时，大多数服</p><p>务器都可以使用这个过滤器）。</p><p>程序清单5-11 ReportFilter.java</p><p>package moreservlets;</p><p>import java.io.*;</p><p>import javax.servlet.*;</p><p>import javax.servlet.http.*;</p><p>import java.util.*;</p><p>/** Simple filter that prints a report on the standard output</p><p>* whenever the associated servlet or JSP page is accessed.</p><p>* &lt;P&gt;</p><p>* Taken from More Servlets and JavaServer Pages</p><p>* from Prentice Hall and Sun Microsystems Press,</p><p>* <a href="http://www.moreservlets.com/">http://www.moreservlets.com/</a>.</p><p>* ? 2002 Marty Hall; may be freely used or adapted.</p><p>*/</p><p>public class ReportFilter implements Filter {</p><p>public void doFilter(ServletRequest request,</p><p>ServletResponse response,</p><p>FilterChain chain)</p><p>throws ServletException, IOException {</p><p>HttpServletRequest req = (HttpServletRequest)request;</p><p>System.out.println(req.getRemoteHost() +</p><p>" tried to access " +</p><p>req.getRequestURL() +</p><p>" on " + new Date() + ".");</p><p>chain.doFilter(request,response);</p><p>}</p><p>public void init(FilterConfig config)</p><p>throws ServletException {</p><p>}</p><p>public void destroy() {}</p><p>}</p><p>一旦建立了一个过滤器，可以在web.xml中利用filter元素以及filter-name（任意名称）、file-class（完全限定的类名）和（可选的）init-params子元素声明它。请注意，元素</p><p>在web.xml的web-app元素中出现的次序不是任意的；允许服务器（但不是必需的）强制所需的次序，并且实际中有些服务器也是这样做的。但这里要注意，所有filter元素必须出</p><p>现在任意filter-mapping元素之前， filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。</p><p>例如，给定上述的ReportFilter类，可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter（位于moreservlets程序包中）相关联。</p><p></p><p>&lt;filter&gt;</p><p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p><p>&lt;filter-class&gt;moresevlets.ReportFilter&lt;/filter-class&gt;</p><p>&lt;/filter&gt;</p><p>一旦命名了一个过滤器，可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。</p><p>首先，可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名（此servlet名必须稍后在相同的 web.xml文件中使用servlet元素声明）关联。例如，下面的</p><p>程序片断指示系统只要利用一个定制的URL访问名为SomeServletName 的servlet或JSP页面，就运行名为Reporter的过滤器。</p><p>&lt;filter-mapping&gt;</p><p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p><p>&lt;servlet-name&gt;SomeServletName&lt;/servlet-name&gt;</p><p>&lt;/filter-mapping&gt;</p><p>其次，可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如，相面的程序片段指示系统只要访问Web应用中的任意URL，就运行名为</p><p>Reporter的过滤器。</p><p>&lt;filter-mapping&gt;</p><p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p><p>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</p><p>&lt;/filter-mapping&gt;</p><p>例如，程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式</p><p>http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节”分配名称和定制的URL”中给出。事实上，程序清单5- 12</p><p>中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项，可看到下面的标准输出形式的调试报告（换行是为了容易阅读）。</p><p>audit.irs.gov tried to access</p><p>mycompany.com/deployDemo/UrlTest2/business/tax-plan.html</p><p>on Tue Dec 25 13:12:29 EDT 2001.</p><p>程序清单5-12 Web.xml（说明filter用法的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p>&lt;web-app&gt;</p><p>&lt;filter&gt;</p><p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p><p>&lt;filter-class&gt;moresevlets.ReportFilter&lt;/filter-class&gt;</p><p>&lt;/filter&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;filter-mapping&gt;</p><p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p><p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p><p>&lt;/filter-mapping&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;/RealPage.jsp&lt;/jsp-file&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;</p><p>7 指定欢迎页<br />假如用户提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目录名但没有包含文件名的URL，会发生什么事情呢？用户能得到一个目录表？一个错误？还</p><p>是标准文件的内容？如果得到标准文件内容，是 index.html、index.jsp、default.html、default.htm或别的什么东西呢？</p><p>Welcome-file-list 元素及其辅助的welcome-file元素解决了这个模糊的问题。例如，下面的web.xml项指出，如果一个URL给出一个目录名但未给出文件名，服务器应该首先试用</p><p>index.jsp，然后再试用index.html。如果两者都没有找到，则结果有赖于所用的服务器（如一个目录列表）。</p><p>&lt;welcome-file-list&gt;</p><p>&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;</p><p>&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;</p><p>&lt;/welcome-file-list&gt;</p><p>虽然许多服务器缺省遵循这种行为，但不一定必须这样。因此，明确地使用welcom-file-list保证可移植性是一种良好的习惯</p><p><br />8 指定处理错误的页面<br />现在我了解到，你在开发servlet和JSP页面时从不会犯错误，而且你的所有页面是那样的清晰，一般的程序员都不会被它们的搞糊涂。但是，是人总会犯错误的，用户可能会提供</p><p>不合规定的参数，使用不正确的URL或者不能提供必需的表单字段值。除此之外，其它开发人员可能不那么细心，他们应该有些工具来克服自己的不足。</p><p>error-page元素就是用来克服这些问题的。它有两个可能的子元素，分别是：error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时使用的</p><p>URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须以/开</p><p>始。location所指出的位置处的页面可通过查找HttpServletRequest对象的两个专门的属性来访问关于错误的信息，这两个属性分别是：javax.servlet.error.status_code和</p><p>javax.servlet.error.message。</p><p>可回忆一下，在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住，error-page出现在web.xml文件的末尾附近，servlet、servlet-name和welcome-file-list之</p><p>后即可。</p><p>9 error-code元素<br />为了更好地了解error-code元素的值，可考虑一下如果不正确地输入文件名，大多数站点会作出什么反映。这样做一般会出现一个404错误信息，它表示不能找到该文件，但几乎没</p><p>提供更多有用的信息。另一方面，可以试一下在<a href="http://www.microsoft.com/">www.microsoft.com</a>、<a href="http://www.ibm.com/">www.ibm.com</a> 处或者特别是在<a href="http://www.bea.com/">www.bea.com</a> 处输出未知的文件名。这是会得出有用的消息，这些消息提供可选</p><p>择的位置，以便查找感兴趣的页面。提供这样有用的错误页面对于Web应用来说是很有价值得。事实上rm-error-page子元素）。由form-login-page给出的HTML表单必须具有一个</p><p>j_security_check的 ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字段。</p><p>例如，程序清单5-19指示服务器使用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将收集用户名和口令，并且失败的登陆将由相同目录中名为login-</p><p>error.jsp的页面报告。</p><p>程序清单5-19 web.xml（说明login-config的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p></p><p>&lt;web-app&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;security-constraint&gt; ... &lt;/security-constraint&gt;</p><p>&lt;login-config&gt;</p><p>&lt;auth-method&gt; FORM &lt;/auth-method&gt;</p><p>&lt;form-login-config&gt;</p><p>&lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;</p><p>&lt;form-error-page&gt;/login-error.jsp&lt;/form-error-page&gt;</p><p>&lt;/form-login-config&gt;</p><p>&lt;/login-config&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;</p><p>9.1 限制对Web资源的访问<br />现在，可以指示服务器使用何种验证方法了。”了不起，”你说道，”除非我能指定一个来收到保护的 URL，否则没有多大用处。”没错。指出这些URL并说明他们应该得到何种保</p><p>护正是security-constriaint元素的用途。此元素在 web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素，分别是：web-resource-collection、 auth-</p><p>constraint、user-data-constraint和display-name。下面各小节对它们进行介绍。</p><p>ü     web-resource-collection</p><p>此元素确定应该保护的资源。所有security-constraint元素都必须包含至少一个web-resource-collection项。此元素由一个给出任意标识名称的web-resource-name元素、一个确</p><p>定应该保护的URL的url-pattern元素、一个指出此保护所适用的 HTTP命令（GET、POST等，缺省为所有方法）的http-method元素和一个提供资料的可选description元素组成。例</p><p>如，下面的 Web-resource-collection项（在security-constratint元素内）指出Web应用的proprietary目录中所有文档应该受到保护。</p><p></p><p>&lt;security-constraint&gt;</p><p>&lt;web-resource-coolection&gt;</p><p>&lt;web-resource-name&gt;Proprietary&lt;/web-resource-name&gt;</p><p>&lt;url-pattern&gt;/propritary/*&lt;/url-pattern&gt;</p><p>&lt;/web-resource-coolection&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/security-constraint&gt;</p><p>重要的是应该注意到，url-pattern仅适用于直接访问这些资源的客户机。特别是，它不适合于通过MVC体系结构利用 RequestDispatcher来访问的页面，或者不适合于利用类似</p><p>jsp:forward的手段来访问的页面。这种不匀称如果利用得当的话很有好处。例如，servlet可利用MVC体系结构查找数据，把它放到bean中，发送请求到从bean中提取数据的JSP页</p><p>面并显示它。我们希望保证决不直接访问受保护的JSP页面，而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允许任何用</p><p>户直接访问JSP页面来提供这种保证。但是，这种不匀称的行为可能让开发人员放松警惕，使他们偶然对应受保护的资源提供不受限制的访问。</p><p>ü     auth-constraint</p><p>尽管web-resource-collention元素质出了哪些URL应该受到保护，但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访</p><p>问权限的用户类别role- name元素，以及包含（可选）一个描述角色的description元素。例如，下面web.xml中的security-constraint元素部门规定只有指定为Administrator或</p><p>Big Kahuna（或两者）的用户具有指定资源的访问权。</p><p></p><p>&lt;security-constraint&gt;</p><p>&lt;web-resource-coolection&gt; ... &lt;/web-resource-coolection&gt;</p><p>&lt;auth-constraint&gt;</p><p>&lt;role-name&gt;administrator&lt;/role-name&gt;</p><p>&lt;role-name&gt;kahuna&lt;/role-name&gt;</p><p>&lt;/auth-constraint&gt;</p><p>&lt;/security-constraint&gt;</p><p>重要的是认识到，到此为止，这个过程的可移植部分结束了。服务器怎样确定哪些用户处于任何角色以及它怎样存放用户的口令，完全有赖于具体的系统。</p><p>例如，Tomcat使用install_dir/conf/tomcat-users.xml将用户名与角色名和口令相关联，正如下面例子中所示，它指出用户joe（口令bigshot）和jane（口令enaj）属于</p><p>administrator和kahuna角色。</p><p></p><p>&lt;tomcat-users&gt;</p><p>&lt;user name="joe" password="bigshot" roles="administrator,kahuna" /&gt;</p><p>&lt;user name="jane" password="enaj" roles="kahuna" /&gt;</p><p>&lt;/tomcat-users&gt;</p><p>ü     user-data-constraint</p><p>这个可选的元素指出在访问相关资源时使用任何传输层保护。它必须包含一个transport-guarantee子元素（合法值为NONE、 INTEGRAL或CONFIDENTIAL），并且可选地包含一个</p><p>description元素。transport-guarantee为NONE值将对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上（并且在未来的</p><p>HTTP版本中），在 INTEGRAL和CONFIDENTIAL之间可能会有差别，但在当前实践中，他们都只是简单地要求用SSL。例如，下面指示服务器只允许对相关资源做 HTTPS连接：</p><p></p><p>&lt;security-constraint&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;user-data-constraint&gt;</p><p>&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;</p><p>&lt;/user-data-constraint&gt;</p><p>&lt;/security-constraint&gt;</p><p>ü     display-name</p><p>security-constraint的这个很少使用的子元素给予可能由GUI工具使用的安全约束项一个名称。</p><p>9.2 分配角色名<br />迄今为止，讨论已经集中到完全由容器（服务器）处理的安全问题之上了。但servlet以及JSP页面也能够处理它们自己的安全问题。</p><p>例如，容器可能允许用户从bigwig或bigcheese角色访问一个显示主管人员额外紧贴的页面，但只允许bigwig用户修改此页面的参数。完成这种更细致的控制的一种常见方法是调用</p><p>HttpServletRequset的isUserInRole方法，并据此修改访问。</p><p>Servlet的 security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如，假如编写了一个调用 request.isUserInRole（”boss”）的servlet，但</p><p>后来该servlet被用在了一个其口令文件调用角色manager而不是boss的服务器中。下面的程序段使该servlet能够使用这两个名称中的任何一个。</p><p></p><p>&lt;servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;security-role-ref&gt;</p><p>&lt;role-name&gt;boss&lt;/role-name&gt; &lt;!-- New alias --&gt;</p><p>&lt;role-link&gt;manager&lt;/role-link&gt; &lt;!-- Real name --&gt;</p><p>&lt;/security-role-ref&gt;</p><p>&lt;/servlet&gt;</p><p>也可以在web-app内利用security-role元素提供将出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色使高级IDE容易处理安全信息。</p><p></p><p>10控制会话超时<br />如果某个会话在一定的时间内未被访问，服务器可把它扔掉以节约内存。可利用HttpSession的setMaxInactiveInterval方法直接设置个别会话对象的超时值。如果不采用这种方法</p><p>，则缺省的超时值由具体的服务器决定。但可利用session-config和session- timeout元素来给出一个适用于所有服务器的明确的超时值。超时值的单位为分钟，因此，下面的例</p><p>子设置缺省会话超时值为三个小时（180分钟）。</p><p>&lt;session-config&gt;</p><p>&lt;session-timeout&gt;180&lt;/session-timeout&gt;</p><p>&lt;/session-config&gt;</p><p>11Web应用的文档化<br />越来越多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio（写此文时，已被</p><p>Macromedia收购）以及IBM VisuaAge for Java等。</p><p>大量的web.xml元素不仅是为服务器设计的，而且还是为可视开发环境设计的。它们包括icon、display-name和discription等。</p><p>可回忆一下，在web.xml内以适当地次序声明web-app子元素很重要。不过，这里只要记住icon、display-name和description是web.xml的web-app元素内的前三个合法元素即可。</p><p>ü     icon</p><p>icon元素指出GUI工具可用来代表Web应用的一个和两个图像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG图像，用large-icon元素指定一幅32 x 32的图像。下面举一</p><p>个例子：</p><p></p><p>&lt;icon&gt;</p><p>&lt;small-icon&gt;/images/small-book.gif&lt;/small-icon&gt;</p><p>&lt;large-icon&gt;/images/tome.jpg&lt;/large-icon&gt;</p><p>&lt;/icon&gt;</p><p>ü     display-name</p><p>display-name元素提供GUI工具可能会用来标记此Web应用的一个名称。下面是个例子。</p><p></p><p>&lt;display-name&gt;Rare Books&lt;/display-name&gt;</p><p></p><p>ü     description</p><p>description元素提供解释性文本，如下所示：</p><p></p><p>&lt;description&gt;</p><p>This Web application represents the store developed for</p><p>rare-books.com, an online bookstore specializing in rare</p><p>and limited-edition books.</p><p>&lt;/description&gt;</p><p>12关联文件与MIME类型<br />服务器一般都具有一种让Web站点管理员将文件扩展名与媒体相关联的方法。例如，将会自动给予名为mom.jpg的文件一个image/jpeg的MIME 类型。但是，假如你的Web应用具有几</p><p>个不寻常的文件，你希望保证它们在发送到客户机时分配为某种MIME类型。mime-mapping元素（具有 extension和mime-type子元素）可提供这种保证。例如，下面的代码指示服务</p><p>器将application/x-fubar的MIME类型分配给所有以.foo结尾的文件。</p><p>&lt;mime-mapping&gt;</p><p>&lt;extension&gt;foo&lt;/extension&gt;</p><p>&lt;mime-type&gt;application/x-fubar&lt;/mime-type&gt;</p><p>&lt;/mime-mapping&gt;</p><p>或许，你的Web应用希望重载（override）标准的映射。例如，下面的代码将告诉服务器在发送到客户机时指定.ps文件作为纯文本（text/plain）而不是作为PostScript</p><p>（application/postscript）。</p><p>&lt;mime-mapping&gt;</p><p>&lt;extension&gt;ps&lt;/extension&gt;</p><p>&lt;mime-type&gt;application/postscript&lt;/mime-type&gt;</p><p>&lt;/mime-mapping&gt;</p><p>13定位TLD<br />JSP taglib元素具有一个必要的uri属性，它给出一个TLD（Tag Library Descriptor）文件相对于Web应用的根的位置。TLD文件的实际名称在发布新的标签库版本时可能会改变，</p><p>但我们希望避免更改所有现有JSP页面。此外，可能还希望使用保持taglib元素的简练性的一个简短的uri。这就是部署描述符文件的taglib元素派用场的所在了。Taglib包含两个</p><p>子元素：taglib-uri和taglib-location。taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素给出TLD文件的实际位置。例如，假如你将文</p><p>件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。现在，假如web.xml在web-app元素内包含下列内容。</p><p>&lt;taglib&gt;</p><p>&lt;taglib-uri&gt;/charts.tld&lt;/taglib-uri&gt;</p><p>&lt;taglib-location&gt;</p><p>/WEB-INF/tlds/chart-tags-1.3beta.tld</p><p>&lt;/taglib-location&gt;</p><p>&lt;/taglib&gt;</p><p>给出这个说明后，JSP页面可通过下面的简化形式使用标签库。</p><p>&lt;%@ taglib uri="/charts.tld" prefix="somePrefix" %&gt;</p><p>14指定应用事件监听程序<br />应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的</p><p>用法。</p><p>注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内，listener-class元素列出监听程序的完整的限定类名，如下所示：</p><p>&lt;listener&gt;</p><p>&lt;listener-class&gt;package.ListenerClass&lt;/listener-class&gt;</p><p>&lt;/listener&gt;</p><p>虽然listener元素的结构很简单，但请不要忘记，必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。</p><p>此外，因为应用生存期监听程序是serlvet规范的2.3版本中的新内容，所以必须使用 web.xml DTD的2.3版本，而不是2.2版本。</p><p>例如，程序清单5-20给出一个名为ContextReporter的简单的监听程序，只要Web应用的Servlet-Context建立（如装载Web应用）或消除（如服务器关闭）时，它就在标准输出上显</p><p>示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。</p><p>程序清单5-20 ContextReporterjava</p><p>package moreservlets;</p><p>import javax.servlet.*;</p><p>import java.util.*;</p><p>/** Simple listener that prints a report on the standard output</p><p>* when the ServletContext is created or destroyed.</p><p>* &lt;P&gt;</p><p>* Taken from More Servlets and JavaServer Pages</p><p>* from Prentice Hall and Sun Microsystems Press,</p><p>* <a href="http://www.moreservlets.com/">http://www.moreservlets.com/</a>.</p><p>* ? 2002 Marty Hall; may be freely used or adapted.</p><p>*/</p><p>public class ContextReporter implements ServletContextListener {</p><p>public void contextInitialized(ServletContextEvent event) {</p><p>System.out.println("Context created on " +</p><p>new Date() + ".");</p><p>}</p><p></p><p>public void contextDestroyed(ServletContextEvent event) {</p><p>System.out.println("Context destroyed on " +</p><p>new Date() + ".");</p><p>}</p><p>}</p><p></p><p>程序清单5-21 web.xml（声明一个监听程序的摘录）</p><p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p>&lt;!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</p><p></p><p>&lt;web-app&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;filter-mapping&gt; … &lt;/filter-mapping&gt;</p><p>&lt;listener&gt;</p><p>&lt;listener-class&gt;package.ListenerClass&lt;/listener-class&gt;</p><p>&lt;/listener&gt;</p><p>&lt;servlet&gt; ... &lt;/servlet&gt;</p><p>&lt;!-- ... --&gt;</p><p>&lt;/web-app&gt;</p><p>15J2EE元素<br />本节描述用作J2EE环境组成部分的Web应用的web.xml元素。这里将提供一个简明的介绍，详细内容可以参阅<a href="http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf">http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf</a>的Java 2 Plantform </p><p>Enterprise Edition版本1.3规范的第5章。</p><p>15.1 distributable<br />distributable 元素指出，Web应用是以这样的方式编程的：即，支持集群的服务器可安全地在多个服务器上分布Web应用。例如，一个可分布的应用必须只使用 Serializable对象</p><p>作为其HttpSession对象的属性，而且必须避免用实例变量（字段）来实现持续性。distributable元素直接出现在discription元素之后，并且不包含子元素或数据，它只是一个如</p><p>下的标志。</p><p>&lt;distributable /&gt;</p><p>15.2 resource-env-ref<br />resource -env-ref元素声明一个与某个资源有关的管理对象。此元素由一个可选的description元素、一个resource-env-ref- name元素（一个相对于java:comp/env环境的JNDI名</p><p>）以及一个resource-env-type元素（指定资源类型的完全限定的类），如下所示：</p><p>&lt;resource-env-ref&gt;</p><p>&lt;resource-env-ref-name&gt;</p><p>jms/StockQueue</p><p>&lt;/resource-env-ref-name&gt;</p><p>&lt;resource-env-ref-type&gt;</p><p>javax.jms.Queue</p><p>&lt;/resource-env-ref-type&gt;</p><p>&lt;/resource-env-ref&gt;</p><p>15.3 env-entry<br />env -entry元素声明Web应用的环境项。它由一个可选的description元素、一个env-entry-name元素（一个相对于java: comp/env环境JNDI名）、一个env-entry-value元素（项值</p><p>）以及一个env-entry-type元素（java.lang程序包中一个类型的完全限定类名，java.lang.Boolean、java.lang.String等）组成。下面是一个例子：</p><p>&lt;env-entry&gt;</p><p>&lt;env-entry-name&gt;minAmout&lt;/env-entry-name&gt;</p><p>&lt;env-entry-value&gt;100.00&lt;/env-entry-value&gt;</p><p>&lt;env-entry-type&gt;minAmout&lt;/env-entry-type&gt;</p><p>&lt;/env-entry&gt;</p><p>15.4 ejb-ref<br />ejb -ref元素声明对一个EJB的主目录的应用。它由一个可选的description元素、一个ejb-ref-name元素（相对于java: comp/env的EJB应用）、一个ejb-ref-type元素（bean的类</p><p>型，Entity或Session）、一个home元素（bean的主目录接口的完全限定名）、一个remote元素（bean的远程接口的完全限定名）以及一个可选的ejb-link元素（当前bean链接的另</p><p>一个 bean的名称）组成。</p><p>15.5 ejb-local-ref<br />ejb-local-ref元素声明一个EJB的本地主目录的引用。除了用local-home代替home外，此元素具有与ejb-ref元素相同的属性并以相同的方式使用</p><img src ="http://www.blogjava.net/balajinima/aggbug/157673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-11-02 10:35 <a href="http://www.blogjava.net/balajinima/articles/157673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用filter解决中文乱码问题 </title><link>http://www.blogjava.net/balajinima/articles/146907.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Thu, 20 Sep 2007 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/146907.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/146907.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/146907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/146907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/146907.html</trackback:ping><description><![CDATA[
		<br />
		<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
				<h2>
						<a title="永久链接：使用filter解决中文乱码问题" href="http://kenshinlk.javaeye.com/blog/59101">
								<font color="#002c99">使用filter解决中文乱码问题</font>
						</a>
				</h2>
		</div>
		<div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px">
				<b>关键字:</b>   使用filter解决中文乱码问题     </div>
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<p>一.在web.xml中配置</p>
												<div class="code_title">xml 代码</div>
												<div class="code_title">
														<span class="tag">
																<span class="tag">
																		<span class="tag">
																				<span class="tag">
																						<span class="tag">
																								<span class="tag">
																										<span class="tag">
																												<span class="tag">
																														<span class="tag">
																																<span class="tag">
																																		<span class="tag">
																																				<span class="tag">
																																						<div class="code_title">
																																								<div class="dp-highlighter">
																																										<div class="bar">
																																										</div>
																																										<ol class="dp-xml">
																																												<li class="alt">
																																														<span>
																																																<span class="tag">&lt;</span>
																																																<span class="tag-name">filter</span>
																																																<span class="tag">&gt;</span>
																																																<span>  </span>
																																														</span>
																																												</li>
																																												<li class="">
																																														<span>        </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">filter-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>EncodingFilter</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">filter-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>        </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">filter-class</span>
																																														<span class="tag">&gt;</span>
																																														<span>com.kenshin.base.SysFilter</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">filter-class</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>        </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">init-param</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>            </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">param-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>encoding</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">param-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>            </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">param-value</span>
																																														<span class="tag">&gt;</span>
																																														<span>UTF-8</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">param-value</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>        </span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">init-param</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>        </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">init-param</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>            </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">param-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>enable</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">param-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>            </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">param-value</span>
																																														<span class="tag">&gt;</span>
																																														<span>true</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">param-value</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>        </span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">init-param</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>    </span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">filter</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>    </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">filter-mapping</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>        </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">filter-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>EncodingFilter</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">filter-name</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="alt">
																																														<span>        </span>
																																														<span class="tag">&lt;</span>
																																														<span class="tag-name">url-pattern</span>
																																														<span class="tag">&gt;</span>
																																														<span>*.do</span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">url-pattern</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																												<li class="">
																																														<span>    </span>
																																														<span class="tag">&lt;/</span>
																																														<span class="tag-name">filter-mapping</span>
																																														<span class="tag">&gt;</span>
																																														<span>  </span>
																																												</li>
																																										</ol>
																																								</div>
																																						</div> </span>
																																		</span>
																																</span>
																														</span>
																												</span>
																										</span>
																								</span>
																						</span>
																				</span>
																		</span>
																</span>
														</span>
												</div>
												<p>二.filter类代码</p>
												<div class="code_title">java 代码</div>
												<div class="dp-highlighter">
														<div class="bar">
														</div>
														<ol class="dp-j">
																<li class="alt">
																		<span>
																				<span class="keyword">package</span>
																				<span> com.kenshin.base;   </span>
																		</span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> java.io.IOException;   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> javax.servlet.Filter;   </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> javax.servlet.FilterChain;   </span>
																</li>
																<li class="alt">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> javax.servlet.FilterConfig;   </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> javax.servlet.ServletException;   </span>
																</li>
																<li class="alt">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> javax.servlet.ServletRequest;   </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> javax.servlet.ServletResponse;   </span>
																</li>
																<li class="alt">
																		<span>  </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> org.apache.commons.logging.Log;   </span>
																</li>
																<li class="alt">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> org.apache.commons.logging.LogFactory;   </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> org.hibernate.Session;   </span>
																</li>
																<li class="alt">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> org.hibernate.SessionFactory;   </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">import</span>
																		<span> org.hibernate.Transaction;   </span>
																</li>
																<li class="alt">
																		<span>  </span>
																</li>
																<li class="">
																		<span>
																		</span>
																		<span class="keyword">public</span>
																		<span> </span>
																		<span class="keyword">class</span>
																		<span> SysFilter </span>
																		<span class="keyword">implements</span>
																		<span> Filter {   </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">protected</span>
																		<span> String sEncodingName;   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">protected</span>
																		<span> FilterConfig sysFilter;   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">protected</span>
																		<span> </span>
																		<span class="keyword">boolean</span>
																		<span> bEnable;   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">protected</span>
																		<span> Log logger = LogFactory.getLog(SysFilter.</span>
																		<span class="keyword">class</span>
																		<span>);   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">public</span>
																		<span> </span>
																		<span class="keyword">void</span>
																		<span> destroy() {   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    }   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">public</span>
																		<span> </span>
																		<span class="keyword">void</span>
																		<span> doFilter(ServletRequest arg0, ServletResponse arg1,   </span>
																</li>
																<li class="">
																		<span>            FilterChain arg2) </span>
																		<span class="keyword">throws</span>
																		<span> IOException, ServletException {   </span>
																</li>
																<li class="alt">
																		<span>        </span>
																		<span class="comment">// TODO Auto-generated method stub </span>
																		<span>  </span>
																</li>
																<li class="">
																		<span>        </span>
																		<span class="keyword">if</span>
																		<span> (</span>
																		<span class="keyword">this</span>
																		<span>.bEnable) {   </span>
																</li>
																<li class="alt">
																		<span>            </span>
																		<span class="keyword">try</span>
																		<span> {   </span>
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>                arg0.setCharacterEncoding(</span>
																		<span class="keyword">this</span>
																		<span>.sEncodingName);   </span>
																</li>
																<li class="">
																		<span>                arg1.setContentType(</span>
																		<span class="string">"text/html;charset="</span>
																		<span> + </span>
																		<span class="keyword">this</span>
																		<span>.sEncodingName);   </span>
																</li>
																<li class="alt">
																		<span>                arg1.setCharacterEncoding(</span>
																		<span class="keyword">this</span>
																		<span>.sEncodingName);   </span>
																</li>
																<li class="">
																		<span>                arg2.doFilter(arg0, arg1);   </span>
																</li>
																<li class="alt">
																		<span>  </span>
																</li>
																<li class="">
																		<span>            } </span>
																		<span class="keyword">catch</span>
																		<span> (Exception e) {   </span>
																</li>
																<li class="alt">
																		<span>                logger.info(</span>
																		<span class="string">"出错了"</span>
																		<span>);   </span>
																</li>
																<li class="">
																		<span>            }   </span>
																</li>
																<li class="alt">
																		<span>            </span>
																		<span class="comment">// session.close(); </span>
																		<span>  </span>
																</li>
																<li class="">
																		<span>        } </span>
																		<span class="keyword">else</span>
																		<span> {   </span>
																</li>
																<li class="alt">
																		<span>            arg2.doFilter(arg0, arg1);   </span>
																</li>
																<li class="">
																		<span>        }   </span>
																</li>
																<li class="alt">
																		<span>    }   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">public</span>
																		<span> </span>
																		<span class="keyword">void</span>
																		<span> init(FilterConfig arg0) </span>
																		<span class="keyword">throws</span>
																		<span> ServletException {   </span>
																</li>
																<li class="">
																		<span>        </span>
																		<span class="comment">// TODO Auto-generated method stub </span>
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>        </span>
																		<span class="keyword">this</span>
																		<span>.sysFilter = arg0;   </span>
																</li>
																<li class="">
																		<span>        </span>
																		<span class="keyword">this</span>
																		<span>.loadFilterSetting();   </span>
																</li>
																<li class="alt">
																		<span>    }   </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>    </span>
																		<span class="keyword">private</span>
																		<span> </span>
																		<span class="keyword">void</span>
																		<span> loadFilterSetting() {   </span>
																</li>
																<li class="">
																		<span>        </span>
																		<span class="keyword">this</span>
																		<span>.sEncodingName = </span>
																		<span class="keyword">this</span>
																		<span>.sysFilter.getInitParameter(</span>
																		<span class="string">"encoding"</span>
																		<span>);   </span>
																</li>
																<li class="alt">
																		<span>        logger.info(</span>
																		<span class="string">"encoding:"</span>
																		<span> + sEncodingName);   </span>
																</li>
																<li class="">
																		<span>        String sEnable = </span>
																		<span class="keyword">this</span>
																		<span>.sysFilter.getInitParameter(</span>
																		<span class="string">"enable"</span>
																		<span>);   </span>
																</li>
																<li class="alt">
																		<span>        </span>
																		<span class="keyword">if</span>
																		<span> (sEnable != </span>
																		<span class="keyword">null</span>
																		<span> &amp;&amp; sEnable.equalsIgnoreCase(</span>
																		<span class="string">"true"</span>
																		<span>)) {   </span>
																</li>
																<li class="">
																		<span>            </span>
																		<span class="keyword">this</span>
																		<span>.bEnable = </span>
																		<span class="keyword">true</span>
																		<span>;   </span>
																</li>
																<li class="alt">
																		<span>        } </span>
																		<span class="keyword">else</span>
																		<span> {   </span>
																</li>
																<li class="">
																		<span>            </span>
																		<span class="keyword">this</span>
																		<span>.bEnable = </span>
																		<span class="keyword">false</span>
																		<span>;   </span>
																</li>
																<li class="alt">
																		<span>        }   </span>
																</li>
																<li class="">
																		<span>    }   </span>
																</li>
																<li class="alt">
																		<span>  </span>
																</li>
																<li class="">
																		<span>  </span>
																</li>
																<li class="alt">
																		<span>}   </span>
																</li>
														</ol>
												</div>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/balajinima/aggbug/146907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-09-20 20:13 <a href="http://www.blogjava.net/balajinima/articles/146907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat5.5下的JNDI数据库配置</title><link>http://www.blogjava.net/balajinima/articles/133495.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Tue, 31 Jul 2007 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/133495.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/133495.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/133495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/133495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/133495.html</trackback:ping><description><![CDATA[JNDI是J2EE中一个很重要的标准，通常我们是在J2EE编程中用到，Tomcat中提供了在JSP和Servelt中直接使用JNDI的方法，主要是通过dbcp连接池，下面谈一下我在Tomcat5.5中配置和使用JNDI的方法。本文的对象是对j2ee编程有所了解的读者.<br /> 一、先在自己应用程序WEB-INF目录下的web.xml添加以下语句：<br /> &lt;resource-ref&gt;<br />    &lt;descrtiption&gt;引用资源说明&lt;/descrtiption&gt;<br />    &lt;res-ref-name&gt;引用资源的JNDI名&lt;/res-ref-name&gt;<br />    &lt;res-type&gt;引用资源的类名&lt;/res-type&gt;<br />    &lt;res-auth&gt;管理者（Container）&lt;/res-auth&gt;&lt;!--Container－容器管理 Application－Web应用管理--&gt;<br />&lt;/resource-ref&gt;<br />      [[[然后在tomcat目录/conf/server.xml文件里相应的&lt;Context&gt;元素里添加如下子元素：]]]//查看下面的建议<br />&lt;Resource name="引用资源的JNDI名" auth="Container" type="javax.sql.DataSource"<br /> driverClassName="com.pointbase.jdbc.jdbcUniversalDriver（自己的jdbc驱动）"<br /> url="jdbc:pointbase:server://localhost/acme（数据库连接url）"<br /> username="root（用户名）" password="root（密码）" maxActive="20（连接池dbcp的相关配置）" maxIdle="10" maxWait="10000"/&gt;<br />     注意，要把你的驱动拷到common/lib下，我用的是pointbase因此我拷的是pbclient44.jar到了common/lib下（对pointbase感兴趣的读者可以看我的另一篇文章pointbase数据库学习，里面也提到了我为什么是用pointbase数据库作为讲解）。<br />二、例子：以下是我的假设的项目ACMEWeb：<br />     在相应程序的web.xml里添加<br />&lt;web-app ....&gt; <br />     .....<br />    &lt;resource-ref&gt;<br />      &lt;res-ref-name&gt;jdbc/AcmeDB&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 />&lt;/web-app&gt;<br />     然后再server.xml里修改：<br />  &lt;Context path="/ACMEWeb" reloadable="true" docBase="E:\eclipseproject\ACMEWeb" workDir="E:\eclipseproject\ACMEWeb\work"&gt;<br />         &lt;Resource name="jdbc/AcmeDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.pointbase.jdbc.jdbcUniversalDriver" url="jdbc:pointbase:server://localhost/acme" username="root" password="root" maxActive="20" maxIdle="10" maxWait="10000"/&gt;<br />&lt;/Context&gt;<br />     ****建议你把上面的内容编写成为一个xml文件，拷到conf/Catalina/&lt;主机名&gt;/文件夹下。<br /><img src ="http://www.blogjava.net/balajinima/aggbug/133495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-07-31 09:08 <a href="http://www.blogjava.net/balajinima/articles/133495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat5.5的基本配置说明 </title><link>http://www.blogjava.net/balajinima/articles/133491.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Tue, 31 Jul 2007 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/133491.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/133491.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/133491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/133491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/133491.html</trackback:ping><description><![CDATA[
		<p>     Tomcat是apache的一个子项目，也是一个开源项目，主要是用于J2EE web容器，由于是一个开源项目，在学习与开发测试中经常被用到（而目前商业最为经常用到的web服务器是BEA WebLogic）。在开源项目中，鼎鼎大名的apache基金会大家肯定有所了解，网站链接：<a href="http://www.apache.org/">http://www.apache.org/</a>，而旗下的Jakarta Project 主要包括了Tomcat、Alexanda等Java项目，有兴趣者可看：<a href="http://jakarta.apache.org/">http://jakarta.apache.org/</a>。考虑到各位学习者的机器配置与学习成本问题，这里选了Tomcat作为我们学习与测试J2EE的环境<br />      以下为一些基本配置：<br /> 一、先从网上下载tomcat，目前最新版本是5.57，下载地址是：<a href="http://apache.freelamp.com/jakarta/tomcat-5/v5.5.7/bin/jakarta-tomcat-5.5.7.zip">http://apache.freelamp.com/jakarta/tomcat-5/v5.5.7/bin/jakarta-tomcat-5.5.7.zip</a>，下载安装完后，在安装目录下有以下目录，主要介绍一下conf、common、webapps：<br />     如果你现在等不急了，就想体验一下tomcat的魅力的话，把你的网页拷到webapps/ROOT目录下，然后再通过浏览器访问即可，默认如下格式：<a href="http://localhost:8080/">http://localhost:8080/</a>&lt;你的网页&gt;<br />     1)webapps文件夹主要用于web应用程序部署，比如你可以把你的应用程序包，如war文件拷到该目录下，容器会自动部署。<br />     2)conf文件夹下主要是放置tomcat的服务器的相关配置文件<br />     3)common文件夹主要是对容器全局变量的文件放置地方，如common/lib下就是放置一些需要全文配置的文件包。</p>
		<p>二、j2ee的相关部署规范：<br />     一般来说作为一个符合规范的web程序，会包括以下文件夹和文件：/WEB-INF/（主要是放置一些配置文件与不希望外部程序访问的隐私文件），在网络上是不允许访问该文件夹的，如当你输入以下<a href="http://localhost:8080/WEB-INF/">http://localhost:8080/WEB-INF/</a>的话就会出现错误。<br />     在WEB-INF文件夹下有一个web.xml文件，这是对当前应用程序的相关设置，资源寻找等，/WEN-INF/文件夹下有个classes子文件夹，该文件夹是应用程序的根路径（等于是classpath的路径），/WEN-INF下还要有个lib文件夹，主要是放置需要引入的包，应用程序导入的包先从这里开始寻找，其次到容器的全局路径下$TOMCAT_HOME/common/lib下寻找。<br />     以下是基本文件夹:<br />/tomcat<br />     /common<br />           /lib<br />           /classes<br />    /conf<br />    /webapps<br />        /ROOT<br />              web.xml            <br />              /WEB-INF<br />                    /lib<br />                    /classes<br />        /你部署的程序包<br />              web.xml            <br />              /WEB-INF<br />                    /lib<br />                    /classes<br />三、容器的配置（server.xml)<br />    到主目录/conf文件夹下server.xml文件是对web服务器的配置：<br />    以下是一些常见的设置，http端口设置，找到以下：<br />&lt;Connector  port="8080"   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />    把8080端口改为你喜欢使用的端口，如常见的80，以后你就可以利用该端口进行访问你的网站了：<a href="http://localhost/">http://localhost/</a> 期中80是默认的，可以不写，其他的一下配置，可以参观相关的内容，入门就是这么简单。<br />    web.xml为servlet的一些相关配置，可以参照一下规范。可以看我写的其他文章。<br />    继续说一下server.xml文件的设置，<br />    找到以下：<br />   &lt;Host name="localhost" appBase="webapps"<br />       unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />     ....<br />  &lt;/Host&gt;<br />     在他们之间可以添加一个&lt;Context&gt;元素，如：&lt;Context path="/axis" reloadable="true" docBase="axis"  workDir="webapps/axis/work"/&gt;，其中属性path代表是网络访问的上下文路径，reloadable表示可以在运行时在classes与lib文件夹下自动加载类包，docBase属性表示你的应用程序的路径，在windows在如：docBase="E:\Sun\axis"，workDir表示是缓存文件的放置地点，可以方便跨平台移植时不用重编译。这样，你的应用程序就可以放到硬盘上的任意地方了。还有一个方法可以做到这点（推荐）：编写一个xml文件，然后放到tomcat目录/conf/Catalina/&lt;相应的网站&gt;/目录下，如：现在我有个应用程序ACMEWeb，我编了一个文件ACMEWeb.xml内容如下：<br />      &lt;Context path="/ACMEWeb" reloadable="true" docBase="E:\eclipseproject\ACMEWeb" workDir="E:\eclipseproject\ACMEWeb\work" /&gt;<br />      我把它放到了tomcat目录/conf/Cataline/localhost下，在浏览器打开<a href="http://localhost/ACMEWeb">http://localhost/ACMEWeb</a> 就会转向我放在E:\eclipseproject\ACMEWeb下的程序了 <br />四、关于taglib的修改： <br />        （1）servlet-2.4之后，web.xml文件就有了一点修改。首先是声明命名空间： <br />                  &lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>"<br />    xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br />    xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a><a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>"<br />    version="2.4"&gt;&lt;/web-app&gt; <br />       （2）其次是taglib，与传统的有所改变，对jsp的配置都被放置到&lt;jsp-config&gt;元素里了。可以使用Altova xmlspy打开web.xml文件，使用taglib的话，按照以下配置： <br />   &lt;jsp-config&gt;<br />       &lt;taglib&gt;<br />           &lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br />           &lt;taglib-location&gt;/WEB-INF/oscache.tld&lt;/taglib-location&gt;<br />     &lt;/taglib&gt;<br /> &lt;/jsp-config&gt; </p>
<img src ="http://www.blogjava.net/balajinima/aggbug/133491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-07-31 09:01 <a href="http://www.blogjava.net/balajinima/articles/133491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样配置tomcat的jndi数据库连接？</title><link>http://www.blogjava.net/balajinima/articles/133489.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Tue, 31 Jul 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/133489.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/133489.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/133489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/133489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/133489.html</trackback:ping><description><![CDATA[
		<p>如果是tomcat5以下，则修改conf/server.xml文件，tomcat5及以上则修改／conf/Catalina/localhost目录中的一个xml文件。在&lt;/Host&gt;行之前插入如下的一段标签： </p>
		<p>(以oralce为例，假设你应用的上下文根是／test,jndi是jdbc/test) </p>
		<p>&lt;Context path="/test" docBase="E:\test" &gt; </p>
		<p>&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;username&lt;/name&gt; <br />&lt;value&gt;system&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;password&lt;/name&gt; <br />&lt;value&gt;manager&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;driverClassName&lt;/name&gt; <br />&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;parameter&gt; <br />&lt;name&gt;url&lt;/name&gt; <br />&lt;value&gt;jdbc:oracle:thin:@192.168.0.27:1521:titan&lt;/value&gt; <br />&lt;/parameter&gt; <br />&lt;/ResourceParams&gt; <br />&lt;/Context&gt;</p>
<img src ="http://www.blogjava.net/balajinima/aggbug/133489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-07-31 08:55 <a href="http://www.blogjava.net/balajinima/articles/133489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Tomcat5建立虚拟目录</title><link>http://www.blogjava.net/balajinima/articles/133433.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Mon, 30 Jul 2007 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/133433.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/133433.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/133433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/133433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/133433.html</trackback:ping><description><![CDATA[
		<p>在Tomcat5.0.X里面可以在\conf\Catalina\localhost下面自己定义一个.xml文件，比如test.xml，里面写</p>
		<p>&lt;Context path="/testWeb" docBase="E:\WorkSpace\Test\testWeb"  debug="0" reloadable="true"&gt;<br />&lt;/Context&gt;</p>
		<p>这样我就可以把源文件放在E盘下面，打开Tomcat后，可以输入“Http://localhost:8080:/testWeb”来进行访问。</p>
		<p>Tomcat5.5.X里在conf文件加下server.xml中配置的虚礼目录<br />&lt;Context path="/message" docBase="D:\JSP" debuy="0" reloadable="true"/&gt;<br />上面是我配置的一个虚礼目录</p>
		<p>注意 需要放在&lt;Host&gt;&lt;/Host&gt;之间</p>
		<p>站点这样：<br />      &lt;Host name="127.0.0.2" appBase="D:\zqdl"<br />       unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />       &lt;Context path="/zqdl" docBase="D:\zqdl\zqdl" debuy="0" reloadable="true"/&gt;<br />       &lt;/Host&gt;</p>
<img src ="http://www.blogjava.net/balajinima/aggbug/133433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-07-30 21:13 <a href="http://www.blogjava.net/balajinima/articles/133433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat5配置MySQLJDBC数据库连接池</title><link>http://www.blogjava.net/balajinima/articles/133426.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Mon, 30 Jul 2007 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/133426.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/133426.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/133426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/133426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/133426.html</trackback:ping><description><![CDATA[如果只是对MySQL感兴趣可以照抄这篇短文，如果想配置其他数据库类型的连接池，也可以做简单修改参数即可使用。<br />　　<br />　　1、安装Tomcat<br />　　参考Tomcat for window 的安装向导，基本直接安装即可，注意：安装时会提示输入管理用户名和密码，这是以后会用到的用户名和密码，切记。<br />　　<br />　　2、安装MySQL<br />　　默认安装即可。<br />　　<br />　　3、使用Tomcat的Web管理应用配置数据源<br />　　启动Tomcat服务器，打开浏览器，输入<a href="http://localhost:8080/admin/">http://localhost:8080/admin/</a>（其中localhost可能是一台机器的IP或是服务器名称），进入管理界面的登陆页面，这时候请输入原来安装时要求输入的用户名和密码，登陆到管理界面，<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 />　　要求输入的JNDI Name等信息，其中除了JDBC DriverClass之外，其他的可以根据你的需要填写。比如Data Source URL的内容可能是：jdbc:mysql:// IP或是名称/DataBaseName，其中DataBaseName是你的数据库名称，IP是你的数据库的所在的服务器的IP或是名称。最后点击Save－&gt;Commit Change.这样你的数据源的基本资料配置一半了。<br />　　<br />　　4、web.xml和%TOMCAT_HOME%\conf\Catalina\localhost下对应你的引用的配置文件修改<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 />　　注意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 />　　5、其他注意事项<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 />　　6、编写测试代码<br />　　在应用的目录下建立一个Test.JSP文件，代码如下：<br />　　<br />　　&lt;!doctype html public "-//w3c//dtd html 4.0 transitional//en"<br />　　<br />　　"<a href="http://www.w3.org/TR/REC-html40/strict.dtd">http://www.w3.org/TR/REC-html40/strict.dtd</a>"&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 />　　我的测试开始12345678我的测试结束，因为我的rs.getString(1) 在数据库就是存放12345678<br />　　<br />　　7、总结<br />　　配置过程及其简单明了，这些配置免除了以往开发人员自己动手写数据源连接池的痛苦，这也是对开发过程的有力支持。 <img src ="http://www.blogjava.net/balajinima/aggbug/133426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-07-30 20:37 <a href="http://www.blogjava.net/balajinima/articles/133426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>