jsf - 自定义 FacesServlet <url-pattern> 去掉 .xhtml 扩展名

标签 jsf jsf-2 friendly-url

我有 Login.xhtmlHome.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' BlogThe 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/

相关文章:

jsf - EE4J、JSF 规范、MyFaces 和 future 方向

java - 在hibernate spring jsf和primefaces的集成中将primefaces数据表编辑到数据库后保存数据

javascript - 向 JSF a4j :jsFunction oncomplete event 发送回调

javascript - 删除 iis 服务器上 URL 中的扩展名

jsf - 使用 FacesServlet 解析 Javascript 中的 EL 变量

javascript - 在 primefaces 数据表上使用监听器执行行单击

jquery - 在不修改 JAR 的情况下升级 primefaces.jar 中的 jquery.js

c# - 如何在 DotNetNuke 中创建带有自定义页面名称的友好 URL?

javascript - 用于单页 Web 应用程序的 ExtJS 5 架构

java - JSF/Hibernate NotBlank 验证