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

mak*_*aks 2 jsf-2

我用的时候

<h:outputStylesheet library="css" name="styles.css"> 
Run Code Online (Sandbox Code Playgroud)

要么

<h:graphicImage library="images" name="image.jpg">
Run Code Online (Sandbox Code Playgroud)

然后在HTML中我得到这样的东西

<link type="text/css" rel="stylesheet" href="/appName/javax.faces.resource/styles.css.xhtml?ln=css" />
Run Code Online (Sandbox Code Playgroud)

因此用户可以看到用于编写此应用程序的框架.如何避免javax.faces.resource/styles.css.xhtml?ln=css向用户显示,但仍然使用facelets(不是html,如<link rel=...>)?当用户只是看到css文件的路径时,它会很好resources/css/styles.css

Bal*_*usC 7

这不是直接可能没有重新实现整个ResourceHandler带的帮助下ResourceHandlerWrapper作为对这个问题回答lu4242,这不完全是一个很简单的工作.这是一个硬编码public static final在现场不断ResourceHandler类的ResourceHandler#RESOURCE_IDENTIFIER.您可能希望发布一个功能请求,使其可以NamingContainer在JSF 1.2到JSF 2.0步骤中对分隔符进行外部配置.

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


lu4*_*242 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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