我有 Login.xhtml
和 Home.xhtml
.我在 web.xml
中配置了 url 模式如下
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>Login.xhtml</welcome-file>
</welcome-file-list>
当我运行整个项目时,登录页面
URL
是这样的http://localhost:8080/fran/Login.xhtml
,这里fran
是我的项目名称..但是,我希望它是
http://localhost:8080/fran/Login/
而不是 http://localhost:8080/fran/Login.xhtml
.我怎样才能做到这一点?是否可以定制
<url-pattern>
为每一页去掉.xhtml
扩展?
最佳答案
如果您的唯一原因是摆脱 .xhtml
扩展名,那么根据您使用的 JSF 版本,有多种方法。
JSF 2.3+
JSF 2.3 提供了一个新的 API 来收集所有 View : ViewHandler#getViews()
.将此与 ServletRegistration#addMapping()
结合使用在 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' Blog和 The Definitive Guide to 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 .它通过将 View 文件放置在
/WEB-INF/faces-views/
中,提供了一种零配置的方式来实现这一点。文件夹。否则,如果您不打算修改您的项目结构并希望将您的 View 文件保留在通常的位置并仍然受益于无扩展名的 URL,那么只需添加以下上下文参数:<context-param>
<param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
<param-value>/*.xhtml</param-value>
</context-param>
如果您不想使用 OmniFaces,而是想自己开发,只需查看 source code OmniFaces。它是在 Apache 2.0 许可下开源的。它只是不是单线。
关于jsf - 自定义 FacesServlet <url-pattern> 去掉 .xhtml 扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18508329/