2

我有一个 Web 应用程序,它最初是一个 JSF 应用程序,但已迁移到纯 HTML/JavaScript。我们现在正在彻底消除 JSF。

我们有物理文件 main.xhtml,它是由“main.jsf”请求的,其中 FacesServlet 在 web.xml 中使用 url-mapping *.jsf 声明。

我们已将内容移至 main.html,并在 main.xhtml 中放置一个元标记 REFRESH 以重定向到 main.html。

现在的问题是,即使我从 web.xml 中删除 FacesServlet,它仍然会将 main.jsf 的请求重定向到 main.xhtml。如果我将文件 main.xhtml 重命名为 main.jsf,请求 main.jsf 会给出 404,并且服务器日志说它找不到文件“main.jsp”。

现在的问题是:如果即使 web.xml 中没有 FacesServlet,它也将 *.jsf 重定向到 *.jsp 或 *.xhtml,那么是什么导致了这种重定向?

我正在使用 GlassFish 3.1.2.2。

4

1 回答 1

2

当在 Servlet 3.0+ 容器上使用 JSF 2.0+ 时,并且webapp 自己没有显式FacesServlet注册web.xml,那么FacesServlet在 webapp 启动期间将自动注册到 URL patterns/faces/*和.*.faces*.jsf

另请参阅它的javadoc

web.xml如果此 servlet 未显式映射到orweb-fragment.xml并且以下一个或多个条件为 ,则必须自动映射该 servlet true

  • 找到一个faces-config.xml文件WEB-INF

  • 在应用程序的类路径中的 jar 目录中可以找到一个faces-config.xml文件。META-INF

  • 在应用程序类路径中的 jar 目录中.faces-config.xml可以找到以结尾的文件名。META-INF

  • javax.faces.CONFIG_FILES上下文参数在web.xmlor中声明web-fragment.xml

  • Set传递给实现onStartup()方法的类ServletContainerInitializer不为空。

如果运行时确定必须自动映射 servlet,则必须将其映射到以下<url-pattern>条目。

  • /faces
  • *.jsf
  • *.faces

JSF 2.3 将向*.xhtml集合添加 URL 模式(在 Mojarra 2.2.11 中向后移植)。

如果你想停止这种行为,并且你不能消除触发器(例如仍然有一个faces-config.xml),那么你最好的选择是FacesServlet*.xhtmlwebapp 自己的web.xml. 这将覆盖默认的自动注册 URL 模式。

于 2015-09-15T09:49:33.070 回答