“监听HttpSession对象的状态的综合实例”编写时遇到的问题

程序运行环境:MyEclipse+Tomcat6.0.20

写“监听HttpSession对象的状态的综合实例”(《JavaWeb开发速学宝典》第12章Servlet监听器)时,按照书上的步骤在tomcat根目录\conf\server.xm文件中的<Host>节点中加入了一段“指定HttpSession对象钝化前的空闲时间”功能的代码

指定HttpSession对象钝化前的空闲时间
1 <!-- 指定HttpSession对象钝化前的空闲时间-->
2  <Context crossContext="true" docBase="demo" path="/demo" reloadable="true" source="org.eclipse.jst.jee.server:demo">
3 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
4 <Store className="org.apache.catalina.session.FileStore" directory="d:\tomcat"/>
5 </Manager>
6  </Context>

 然而在MyEclipse中的Servers窗口中不能正常启动Tomcat,却在Console窗口中出现了以下警告信息

2010-6-15 11:22:32 org.apache.catalina.startup.Catalina load
警告: Catalina.start using conf/server.xml:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
 at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
 at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1644)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:521)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:555)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412)
2010-6-15 11:22:32 org.apache.catalina.startup.Catalina load
警告: Catalina.start using conf/server.xml:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
 at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
 at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1644)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:521)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:575)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2010-6-15 11:22:32 org.apache.catalina.startup.Catalina start
信息: Server startup in 0 ms
java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.NullPointerException
 at org.apache.catalina.startup.Catalina.await(Catalina.java:647)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:607)
 ... 6 more

我知道问题出在刚刚编写过的server.xml上,仔细和书上的代码对比,没发现不一致的地方,上网Google了一通发现问题出在“由于你修改的某个配置文件中出现了中文汉字才导致的。”后来才意识到我原先在server.xml中加入了中文注释,去掉中文注释后再运行Tomcat,Tomcat虽然能运行,但在Console窗口中又出现了如下警告信息

2010-6-15 19:15:45 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:demo' did not find a matching property.
2010-6-15 19:15:45 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;F:\Java\Tools\Apache Tomcat 6.0.20\bin
2010-6-15 19:15:45 org.apache.coyote.http11.Http11Protocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2010-6-15 19:15:45 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 779 ms
2010-6-15 19:15:45 org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2010-6-15 19:15:45 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/6.0.20
表示</demo>的ServletContext对象被创建
2010-6-15 19:15:47 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
2010-6-15 19:15:47 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
2010-6-15 19:15:47 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2010-6-15 19:15:47 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2010-6-15 19:15:47 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/35  config=null
2010-6-15 19:15:47 org.apache.catalina.startup.Catalina start
信息: Server startup in 1588 ms

虽然部署的程序能正常运行,但看到有这样红色的警告信息总让人感到不爽,因此又Google了一番,发现了如下的解决方案“出现SetPropertiesRule警告的原因是Tomcat在server.xml的Context节点中不支持source属性。解决方法是在Servers视图里双击创建的server,然后在其server的配置界面中选中"Publish module contexts to separate XML files"选项。”我在MyEclipse的Servers视图中双击创建的Server没有响应,可能在Eclipse中这样操作才有用。正当犯愁时,又看到了这样一段文字

  “这几天一直在看tomcat 6的有关内容,在其文档中看到tomcat 5,6关于context的配置不同于tomcat 4,不推荐在server.xml中进行配置,在context.xml文件中进行配置才是更好的方法。回想以前所有的项目都是在server.xml中配置context的,每次部署一个新的应用或者修改context内容都要重新启动tomcat,导致应用总是要中断服务一小段时间,比较不方便,而且多个context都在server.xml中,显得有些杂乱。于是决定使用在context.xml中进行配置应用的方式。在tomcat_home\ conf目录下有一个context..xml文件,修改其中内容之后,tomcat 能够自动reload所有的应用。我的应用是在 tomcat_home\webapps下部署了多个应用,这多个应用的context配置是不同的。于是我把原来server.xml有关 context的部分(多个)复制出来,粘贴到context.xml中,保存之后,启动tomcat ,发现启动的时候出错,看来tomcat是不支持在一个context.xml中配置多个不同应用的。上网上google有关在context.xml中配置多个应用的方法,遗憾的是,始终无法找到。后来仔细阅读tomcat 文档,终于找到了解决方法,在应用下面的META-INF文件夹下建立context.xml文件就可以满足应用的定制需求。具体路径就是: tomcat_home\webapps\yourApp\META-INF\context.xml,这样每个应用都可以拥有各自的配置,修改了该文件中的内容,tomcat可以自动重新装载该应用,非常的方便。”

  于是,我在WebRoot\META-INF下新建了Context.xml文件,加上了“HttpSession对象钝化前的空闲时间”功能的代码。再次运行Tomcat,终于能正常运行。-_-

原文地址:https://www.cnblogs.com/guoqi/p/1758752.html