如果您的唯一原因是摆脱.xhtml
扩展,那么有多种方法取决于您使用的 JSF 版本。
JSF 2.3+
JSF 2.3 提供了一个新的 API 来收集所有视图:ViewHandler#getViews()
. ServletRegistration#addMapping()
将其与a结合起来,ServletContextListener
如下所示。
@FacesConfig
@WebListener
public class ApplicationConfig implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
addExtensionLessMappings(event.getServletContext(), FacesContext.getCurrentInstance());
}
private void addExtensionLessMappings(ServletContext servletContext, FacesContext facesContext) {
servletContext
.getServletRegistrations().values().stream()
.filter(servlet -> servlet.getClassName().equals(FacesServlet.class.getName()))
.findAny()
.ifPresent(facesServlet -> facesContext
.getApplication()
.getViewHandler()
.getViews(facesContext, "/", ViewVisitOption.RETURN_AS_MINIMAL_IMPLICIT_OUTCOME)
.forEach(view -> facesServlet.addMapping(view))
);
}
}
实际上,这是一个单线。来源:Arjan Tijms 的博客和JSF 权威指南。
如果您使用 MyFaces 作为 JSF 2.3 实现,则可以仅通过以下web.xml
上下文参数透明地激活它:
<context-param>
<param-name>org.apache.myfaces.AUTOMATIC_EXTENSIONLESS_MAPPING</param-name>
<param-value>true</param-value>
</context-param>
Mojarra 还没有等价物。
JSF 2.2-
使用OmniFaces FacesViews。/WEB-INF/faces-views/
它通过将视图文件放在文件夹中提供了一种零配置方式来实现这一点。否则,如果您不打算修改项目结构并希望将视图文件保留在通常的位置并仍然受益于无扩展 URL,那么只需添加以下上下文参数:
<context-param>
<param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
<param-value>/*.xhtml</param-value>
</context-param>
如果您不想使用 OmniFaces,而是想自己开发,只需查看 OmniFaces 的源代码。它在 Apache 2.0 许可下开源。它只是不是单线器。