WebLogic 与 Struts 的兼容性
在讨论完 WebLogic 与 Spring 框架的兼容性后,下面详述与 Struts 的兼容性。
调试和日志记录 Struts 应用程序
WebLogic 提供了它自己的日志子系统,该系统是 WebLogic 的缺省日志框架。不过, 也可以将 WebLogic 与其它日志框架(如 Log4j)一起使用。缺省情况下,Struts 将把所有 消息记录到 WebLogic 日志框架。要在开发 Struts 应用程序过程中进行最有效的记录日 志,需要确保将“Logging Message”严重性级别设置为“INFO”;这样将记录所有 INFO 级别以上的日志,从而可以在出错时进行有效的调试。
还建议将所有 system.out.println() 消息都重定向到 WebLogic 日志,以方便调 试。可以指定记录这些消息的 stdout 文件。只需编辑 WebLogic Server 脚本,使 JAVA_OPTIONS 变量做以下指定:
-Dweblogic.Stdout="stdout-filename" -Dweblogic.Stderr="stderr-filename"
要查看所有发出的 HTTP 请求的日志,可以参考 WebLogic Server 生成的访问日志 (access log)。该日志提供了访问请求的一些详细信息,比如时间戳、访问的 URL 和 HTTP 返回代码等。
例如:
127.0.0.1 - - [13/Jul/2004:21:39:46 -0615] "GET /struts- sample/preregisterCab.do?IndiReport=true HTTP/1.1" 200 4173 127.0.0.1 - - [13/Jul/2004:21:41:14 -0615] "POST /struts- sample/getIndiData.do;jsessionid=A05R5lY5jLRJokg8BRMYgLwCOvfuVzC7KEE4AsCZijqD7l 6A22Re!-237055073 HTTP/1.1" 200 4667 127.0.0.1 - - [16/Jul/2004:00:07:58 -0615] "GET /struts- sample/preregisterCab.do?IndiReport=true HTTP/1.1" 200 4173 127.0.0.1 - - [16/Jul/2004:00:08:26 -0615] "POST /struts- sample/getIndiData.do;jsessionid=A32LikMTeXrS5Bnbp7p1TASmcLHkuko9Sudr8LjatWw2Aq eP6zkt!1759102893 HTTP/1.1" 200 8893 127.0.0.1 - - [19/Jul/2004:04:39:36 -0615] "GET /struts- sample/preregisterCab.do?IndiReport=true HTTP/1.1" 200 4173 127.0.0.1 - - [19/Jul/2004:04:40:16 -0615] "POST /struts- sample/getIndiData.do;jsessionid=A7yxT3KtTy01T7A39DLSup2RPqxvV9uWay325WxBLqtj1d lx3Ewa!-431463598 HTTP/1.1" 200 5416 127.0.0.1 - - [14/Aug/2004:22:36:24 -0615] "GET /struts- sample/preregisterCab.do?IndiReport=true HTTP/1.1" 200 4173 127.0.0.1 - - [14/Aug/2004:22:36:58 -0615] "POST /struts- sample/getIndiData.do;jsessionid=Be2WKm1nP7DGdX1uIY8PraQdx51wBZTjVSswGHdcbL4njc jXOdJh!1670519755 HTTP/1.1" 200 4684 127.0.0.1 - - [14/Aug/2004:22:36:59 -0615] "GET /struts- sample/pages/STFull.jpg HTTP/1.1" 304 0
调试 WebLogic 类加载器
在开发 Struts 应用程序的过程中,必然会遇到类加载器问题。调试那些 NoClassDefFoundError 和 ClassNotFoundException 的确是一件麻烦事。无法在父类加载 器和子类加载器中找到类时,会发生 ClassNotFoundException;这很可能是打包问题造成 的。 加载了请求的类但无法找到依赖类时,会抛出 NoClassDefFoundError。父类加载器 中的类从不引用子类加载器中的类。类加载器会先请求它们的父类加载器加载类,然后才 会尝试自行加载类,因此在此类情况下可能会遇到 NoClassDefFoundError。
为调试 WebLogic 类加载器,WebLogic 提供了类加载器特定的调试标志。设置这些调 试标志的方法:
编辑 StartWeblogic 脚本,添加以下内容作为启动 WebLogic 时的命令行参数。 Dweblogic.Debug=debug.lineNumbers,debug.methodNames,weblogic.ClassLoade rVerbose,weblogic.ClassLoader
确保在控制台的“Logging”选项中将“Debug to Stdout”选项设置为 “enabled”。
启用这些调试选项后,您就会注意到当应用程序加载任何类都将有相应的类似如下的 日志:
[GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : () Classloader object id (weblogic.utils.classloaders.GenericClassLoader@10d3f0d finder: weblogic.utils.classloaders.MultiClassFinder@1510d96 annotation: ) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found. [GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : () Classloader object id (weblogic.utils.classloaders.GenericClassLoader@1ce64f6 finder: weblogic.utils.classloaders.MultiClassFinder@52fecf annotation: ApplicationClassLoader@) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found. [GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : (C:\APP-INF\classes) Classloader object id (weblogic.utils.classloaders.GenericClassLoader@1d6d61d finder: weblogic.utils.classloaders.MultiClassFinder@d6ee28 annotation: struts-example@) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found [ChangeAwareClassLoader] : weblogic.utils.classloaders.ChangeAwareClassLoader@18a6890 finder: weblogic.utils.classloaders.MultiClassFinder@ad8bb4 annotation: struts- example@struts-example about to loadClass(org.apache.struts.taglib.html.ImgTag) [GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag ..
上例中 Struts 应用程序寻找的是 org.apache.struts.taglib.html.ImgTag 类。首先 在父类加载器中寻找该类,然后在应用程序加载器中寻找,最后在 war 类加载器中寻找。 如果在类加载器中找不到某个类,您会注意到日志中产生了下面这样的消息:
[GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : () Classloader object id (weblogic.utils.classloaders.GenericClassLoader@10d3f0d finder: weblogic.utils.classloaders.MultiClassFinder@1510d96 annotation: ) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found. [GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : () Classloader object id (weblogic.utils.classloaders.GenericClassLoader@1ce64f6 finder: weblogic.utils.classloaders.MultiClassFinder@52fecf annotation: ApplicationClassLoader@) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found. [GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : (C:\APP-INF\classes) Classloader object id (weblogic.utils.classloaders.GenericClassLoader@1d6d61d finder: weblogic.utils.classloaders.MultiClassFinder@d6ee28 annotation: struts-example@) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found. [ChangeAwareClassLoader] : weblogic.utils.classloaders.ChangeAwareClassLoader@18a6890 finder: weblogic.utils.classloaders.MultiClassFinder@ad8bb4 annotation: struts- example@struts-example about to loadClass(org.apache.struts.taglib.html.ImgTag) [GenericClassLoader] : Looking for class: org.apache.struts.taglib.html.ImgTag .. With classpath of : (C:\bea-plat- 81sp3\user_projects\domains\sqlservdomain\myserver\.wlnotdelete\extract\myserve r_struts-example_struts-example\jarfiles\WEB-INF\lib\log4j.jar;C:\bea-plat- 81sp3\user_projects\domains\sqlservdomain\myserver\.wlnotdelete\extract\myserve r_struts-example_struts-example\jarfiles\WEB-INF\lib\log4j-core.jar) Classloader object id (weblogic.utils.classloaders.ChangeAwareClassLoader@18a6890 finder: weblogic.utils.classloaders.MultiClassFinder@ad8bb4 annotation: struts- example@struts-example) [GenericClassLoader] : Class org.apache.struts.taglib.html.ImgTag not found. <[ServletContext(id=28746180,name=struts-example,context-path=/struts-example)] Root cause of ServletException java.lang.NoClassDefFoundError: org/apache/struts/taglib/html/ImgTag at jsp_servlet.__index._jspService(__index.java:434) at weblogic.servlet.jsp.JspBase.service(JspBase.java:33) atweblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(Ser vletStubImpl.java:996) at weblogic.servlet.internal.ServletStubImpl.invokeServlet (ServletStubImpl.java:419) at weblogic.servlet.internal.ServletStubImpl.invokeServlet (ServletStubImpl.java:463) at weblogic.servlet.internal.ServletStubImpl.invokeServlet (ServletStubImpl.java:315) at weblogic.servlet.internal.WebAppServletContext $ServletInvocationAction.run (WebAppServletContext.java:6452) atweblogic.security.acl.internal.AuthenticatedSubject.doAs (AuthenticatedSubject.java:321)