当我使用
时<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
答案 0 :(得分:7)
如果没有ResourceHandler
作为ResourceHandlerWrapper
的帮助重新实现整个answered by lu4242 on this question,这是不可能直接实现的,这不是一项微不足道的工作。它是ResourceHandler
类ResourceHandler#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实现中。