本节介绍已知的 Web 容器问题和相应的解决办法。
web.xml 中的可选 load-on-startup Servlet 元素表示相关的 Servlet 将在启动对其进行声明的 Web 应用程序期间被装入和初始化。
此限制仅适用于基于 Servlet 2.4 的 web.xml;可以使用基于 Servlet 2.5 的 web.xml 指定空 load-on-startup 元素。
此元素的可选内容是一个整数,用于表示该 Servlet 相对于 Web 应用程序的其他 Servlet 而被装入和初始化的顺序。空 <load-on-startup/> 表示顺序无关紧要,只要该 Servlet 在其包含的 Web 应用程序启动期间被装入并进行了初始化即可。
web.xml 的 Servlet 2.4 模式不再支持空 <load-on-startup/>,这意味着在使用基于 Servlet 2.4 的 web.xml 时,必须指定一个整数。如果指定空的 <load-on-startup/>,如 <load-on-startup/>,则 web.xml 将无法针对 web.xml 的 Servlet 2.4 模式进行验证,从而导致 Web 应用程序的部署失败。
向下兼容性问题:指定空的 <load-on-startup/> 在基于 Servlet 2.3 的 web.xml 中仍起作用。
在使用基于 Servlet 2.4 的 web.xml 时指定 <load-on-startup/>0</load-on-startup/>,以表明 Servlet 装入顺序无关紧要。
已访问 JSP 页面但无法进行编译,并且服务器日志包含错误消息“无法执行命令”以及以下堆栈跟踪:
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec (Execute.java:655) at org.apache.tools.ant.taskdefs.Execute.launch (Execute.java:416) at org.apache.tools.ant.taskdefs.Execute.execute (Execute.java:427) at org.apache.tools.ant.taskdefs.compilers. DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter. java:448) at org.apache.tools.ant.taskdefs.compilers.JavacExternal. execute(JavacExternal.java:81) at org.apache.tools.ant.taskdefs.Javac. compile(Javac.java:842) at org.apache.tools.ant.taskdefs.Javac.execute (Javac.java:682) at org.apache.jasper.compiler.Compiler.generateClass (Compiler.java:396)
将 JSP 编译开关 fork 设置为 false。
可以通过以下两种方式之一来实现:
在全局范围内,通过将 ${S1AS_HOME}/domains/domain1/config/default-web.xml 中 JspServlet 的 fork init 参数设置为 false:
<servlet\> <servlet-name\>jsp</servlet-name\> <servlet-class\>org.apache. jasper.servlet.JspServlet</servlet-class\> .... <init-param\> <param-name\> fork</param-name\> <param-value\>false</param-value\> </init-param\> .... </servlet\>
在每个 Web 应用程序基础上,通过将 sun-web.xml 中的 fork JSP 配置属性设置为 false:
<sun-web-app\> <jsp-config\> <property name="fork" value="false" /\> </jsp-config\> </sun-web-app\>
以上任何一种设置都将阻止 ant 产生用于 javac 编译的新进程。
访问 JSP 时,在某些情况下可能会记录以下异常:
java.lang.AbstractMethodError: org.apache.xerces.dom.DeferredDocumentImpl. setDocumentURI(Ljava/lang/String;)V |
将以下系统属性添加到 domain.xml 文件中:
<jvm-options>-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces. \ internal.jaxp.DocumentBuilderFactoryImpl</jvm-options> |
或者,也可以从 Web 应用程序的 WEB-INF/lib 中删除包含 org.apache.xerces 包的 JAR 文件。
捆绑在 EAR 文件中的 JAR 封装的 JSP 标记库无法由作为 EAR 一部分的 WAR 文件的 JSP 页面引用,即使该 WAR 文件的 META-INF/MANIFEST.MF 资源在其 Class-Path 清单属性中列出了标记库 JAR 文件。
访问 JSP 页面(在其中导入了在 EAR 文件的一个 JAR 文件中封装的标记库)时,类似于以下内容的错误消息将在服务器日志中显示,并且 JSP 页面将无法进行编译:
The absolute uri: <taglib_uri> cannot be resolved in either web.xml or the jar files deployed with this application |
将任何 JSP 标记库 JAR 文件捆绑到其 JSP 页面导入这些标记库的任何 WAR 文件的 WEB-INF/lib 目录中。
有关此错误的更多信息可以在 Glassfish 站点 (https://glassfish.dev.java.net/issues/show_bug.cgi?id=590) 上找到。