Weblogic教程

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)

关注微信获取最新动态