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

时间:2011-09-08 21:04:14

标签: jsf-2

当我使用

<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=...&gt;)?当用户只是将css文件的路径视为resources/css/styles.css

时,这将是一件好事

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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实现中。