更改资源URL的/javax.faces.resource前缀

4
当我使用时,

<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,如 <link rel=...>)? 当用户简单地看到css文件路径时,将会很好,例如: resources/css/styles.css

2个回答

7

如果没有使用ResourceHandlerWrapper以及lu4242在此问题上的回答的帮助,直接实现这一点是不可能的,因为这需要重新实现整个ResourceHandler,这并不是一个简单的工作。ResourceHandler#RESOURCE_IDENTIFIERResourceHandler类中硬编码的public static final字段常量。您可能希望发布一个功能请求,使其像在JSF 1.2到JSF 2.0步骤中发生的NamingContainer分隔符字符一样可以外部配置。

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


谢谢回复。我从未在大多数Web应用程序中看到任何特定于框架的功能,只有带有JavaScript的纯HTML,因此我认为JSF提供了这样的机会。或者,也许我从未在Web上看到过任何JSF Web应用程序。 - maks
1
这个答案是不正确的!!!常量用于默认的ResourceHandler,但这并不意味着您不能在默认的ResourceHandlerWrapper上使用默认的ResourceHandler,并编写一个完整的实现,该实现使用其他不同的前缀结构。我会为这个问题写一个答案。 - lu4242
1
@lu4242:啊对,那个也行,我没想到。但是真的需要用那些感叹号吗?你有被攻击的感觉吗?抱歉,那不是我的意图。 - BalusC
不要误会我;-) 这只是规范被设计成允许可扩展的ResourceHandler实现,就像问题所问的那样。 - lu4242

5
这是可能的。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实现中。


毕竟,一切皆有可能 :) 很不错。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接