jsf - 如何防止 JSF 自动初始化?

标签 jsf tomcat mojarra

当我从头开始创建 Web 应用程序并将 jsf-api-2.2.11.jar 和 jsf-impl-2.2.11.jar 添加到 pom.xml(将它们添加到应用程序类路径)并将其部署到 Tomcat 7 时, JSf 正在自动初始化:

INFO [j.e.r.w.j.config] - Mojarra 2.2.11 ( 20150505-0732 https://svn.java.net/svn/mojarra~svn/tags/2.2.11@14688) ..... initialized.

在旧版本中,我过去常常通过在 web.xml(监听器+servlet)中定义它来以声明方式启动它。所以我已经将它们注释掉并将“metadata-complete”设置为“true”(这甚至会停止类路径扫描吗?),但它仍在加载。

在这种情况下,我不想加载它,同时将 Jars 留在类路径中,即 web-inf 中的 faces-config.xml。

什么仍在触发初始化?

最佳答案

它是通过 Servlet 3.0 加载的 ServletContainerInitializer JSF 实现 JAR 文件中的实现(对于 Mojarra,它是 com.sun.faces.config.FacesInitializer )。它将自动注册 FacesServlet关于 URL 模式 *.jsf , *.faces/faces/* (JSF 2.3 会将 *.xhtml 添加到 URL 模式列表中)。最新的 JSF 2.1 实现和所有 JSF 2.2 实现都将在部署到 Servlet 3.0 兼容容器时执行此操作。有关此新 Servlet 3.0 的详细信息 ServletContainerInitializer事情,前往这个答案:ServletContainerInitializer vs ServletContextListener .

停止它的正确方法是从依赖项中删除 JSF 实现(请注意,您不需要也删除 JSF API)。您似乎没有以任何方式使用它。毕竟,正确设计的 Web 应用程序不应该具有任何 JSF 实现特定的依赖项。我只是想知道,为什么要保留 JSF API?将第三方基于 JSF 的库用于非 JSF 目的?这可能表明并最终导致其他(架构)问题。

停止它的另一种方法是通过编辑 <web-app> 将您的 Web 应用程序降级为 Servlet 2.5 目标web.xml 中的根声明相应地遵守那个版本。但这会产生许多其他副作用,当打算开发与 Servlet 3.0 兼容的 Web 应用程序时,这些副作用可能是不可取的。


您所指的“监听器”实际上不是必需的,它只是为了解决在解析 TLD 文件时出现时间错误的错误容器,例如早期的 GlassFish v3 和 Jetty 版本。另见 a.o. Configuration of com.sun.faces.config.ConfigureListener .

关于jsf - 如何防止 JSF 自动初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30642575/

相关文章:

jsf - 将新组件动态添加到 JSF 组件树时重复 id

jsf-2 - 在 Apache Tomcat 7.0.42 及更高版本上部署 Mojarra 2.1.x 和 2.2 会导致 java.lang.UnsupportedOperationException

jsf - 从 RuntimeException 继承的类的错误页面问题

java - REST WebService 动态提供图像?

javascript - 更改 <p :commandButton> value with JavaScript

java - JIRA 是否支持 Tomcat 8?

eclipse - JSF 与 eclipse、maven 和 glassfish - 错误 : com. sun.faces.context.FacesFileNotFoundException

java - 指定默认 a4j :commandButton when press Enter in JSF form

java - Spring Integration 不响应

java - 如何在 Spring MVC 中进行通配符 bean 映射?