【问题标题】:Change /javax.faces.resource prefix of resource URLs更改资源 URL 的 /javax.faces.resource 前缀
【发布时间】:2011-11-13 08:16:14
【问题描述】:

当我使用时

<h:outputStylesheet library="css" name="styles.css"> 

<h:graphicImage library="images" name="image.jpg">

然后在html中我得到类似的东西

<link type="text/css" rel="stylesheet" href="/appName/javax.faces.resource/styles.css.xhtml?ln=css" />

这样用户就可以看到使用哪个框架来编写这个应用程序。如何避免向用户显示javax.faces.resource/styles.css.xhtml?ln=css,但仍然使用facelets(不是html,如&lt;link rel=...>)?当用户简单地看到css文件的路径为resources/css/styles.css时会很好

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    如果不借助 ResourceHandlerWrapper 将整个 ResourceHandler 重新实现为 answered by lu4242 on this question,这是不可能直接实现的,这并不是一项简单的工作。这是ResourceHandler 类中的硬编码public static final 字段常量ResourceHandler#RESOURCE_IDENTIFIER。您可能希望发布一个功能请求,以使其可在外部配置,就像在 JSF 1.2 到 JSF 2.0 步骤中发生的 NamingContainer 分隔符一样。

    但是你为什么要这样做呢?还有很多其他的东西可以为所使用的框架提供足够的提示。如果 JSF 可以是请求 URL 模式(/faces/**.jsf*.xhtml)、响应标头(X-Powered-By)、特定隐藏表单字段(javax.faces.ViewState)、自动生成的客户端 ID(通过默认woodstocked),使用的JS库(jsf.js)等等。

    【讨论】:

    • 感谢您的回复。我从未在大多数 webapps 中看到任何特定于框架的功能,只是带有 javascript 的普通 html,所以我认为 jsf 提供了这样的机会。或者,也许,我从未在网络上看到过任何 JSF webapp。
    • 这个答案不是真的!!!!该常量用于默认的 ResourceHandler,但这并不意味着您不能在默认的 ResourceHandlerWrapper 上使用默认的 ResourceHandlerWrapper 并编写使用其他不同前缀结构的完整实现。我会为这个写一个答案。
    • @lu4242:啊对,那个也可以,没想到。但是,真的需要扔那些感叹号吗?你有被攻击的感觉吗?抱歉,这不是我的本意。
    • 不,不,不要误会我的意思 ;-) 这只是规范旨在精确地允许可扩展的 ResourceHandler 实现,就像问题所问的那样。
    【解决方案2】:

    这是可能的。 FacesServlet 上的代码如下所示:

        ResourceHandler resourceHandler = facesContext.getApplication().getResourceHandler();
    
        // Call ResourceHandler.isResourceRequest(javax.faces.context.FacesContext).
        if (resourceHandler.isResourceRequest(facesContext))
        {
            // If this returns true call ResourceHandler.handleResourceRequest(javax.faces.context.FacesContext).
            resourceHandler.handleResourceRequest(facesContext);
        }
    

    默认实现默认使用 ResourceHandler#RESOURCE_IDENTIFIER 常量,但技术上可以编写使用其他结构的 ResourceHandlerWrapper。唯一的问题是包装器应该实现所有内容,并且您不能将任何内容委托给默认算法。您可以重复使用 MyFaces Shared 上的代码,但请记住这是内部代码,因此请使用类似 maven shade 插件或硬拷贝来重新定位包名称。

    不可能为现有的 ResourceHandler 实现更改它(例如,使用自定义 ResourceHandler 实现的组件,如 t:captcha 或其他变体),因为所有这些都与常量绑定。

    无论如何,我创建了MFCOMMONS-36 以将其添加到 MyFaces Commons 上添加的扩展 ResourceHandler 实现中。

    【讨论】:

    • 毕竟,一切皆有可能:) 不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多