【发布时间】:2017-11-17 09:39:24
【问题描述】:
我的 JAR 组件的以下文件夹下有一个 javascript 文件: /src/main/resources/META-INF/resources/default/javascript/jquery.marquee.js
如果我使用以下 @ResourceDependency 注释创建自定义 JSF 组件:
@ResourceDependency(library = "default", name = "javascript/jquery.marquee.js", target = "head")
找不到 javascript 文件,在浏览器中我可以看到 两个 奇怪的 URL,其中 undefined.css 和 undefined.js 为URL 的一部分,还引用了 PrimeFaces 库??
http://localhost:8080/acio/javax.faces.resource/undefined/undefined.css.xhtml?ln=primefaces&v=5.3
http://localhost:8080/acio/javax.faces.resource/undefined/undefined.js.xhtml?ln=primefaces&v=5.3
但是,如果我手动将脚本包含在 XHTML 模板中,如下所示:
<h:outputScript library="default" name="javascript/jquery.marquee.js" />
然后一切都像预期的那样工作,预期的 URL 如下:
http://localhost:8080/acio/javax.faces.resource/javascript/jquery.marquee.js.xhtml?ln=default
我对此完全感到困惑。
为什么,如果我使用 @ResourceDependency 注释,我会得到 两个 错误的 URL,一个关于 CSS,另一个关于 JS,与 PrimeFaces 资源相关,当我肯定我自己的 JS 文件的位置是正确的? (否则 h:outputScript 将无法正常工作)
使用 WildFly 10.1.0.Final 随附的 Mojarra 2.2.13.SP1 和 WildFly 9.0.2.Final 随附的 Mojarra 2.2.12 测试
任何帮助将不胜感激!
[更新]
看起来问题可能与我们处理页面导航的方式有关。我们使用的是 SPA 方法,Facelet 模板内部有一个大面板组区域,并带有动态 JSF include 指令。页面是在 AJAX 执行后动态包含在模板面板组中的 XHTML 片段。
似乎 @ResourceDependency 仅在第一次创建视图时呈现相应的 HTML 资源链接。当我们使用 SPA 时,从 JSF 的角度来看,我们的视图永远不会改变。我们使用 include 指令处理所有带有 AJAX 片段更新的页面导航。
作为测试,我将组件的标记放置在 Facelet 模板本身中,而不是 XHTML 片段中......并且链接按预期呈现!
如果有人能确认这种行为,那就太好了......如果有任何优雅的解决方案。
到目前为止,我们必须在模板定义中手动包含所需的 HTML 资源。
【问题讨论】:
-
感谢 Kukeltje。我很清楚如何使用 h:outputScript。我已经更新了我的问题。无论我采用哪种方法,它总是有效的。仅当尝试使用 @ResourceDependency 注释自动将 javascript 包含在我的组件中时,才会出现此问题。在这种情况下,无法包含 javascript。我仍然无法理解这里出了什么问题......
-
在使用 @ResourceDependency 和使用 outputScript 时,我已经用 URL 更新了我的问题。是的,它们是不同的。但问题是......为什么????
-
你可以在没有 PrimeFaces 的项目中尝试吗?你可以试试PF 6.1吗?也许PF“头部渲染器”搞砸了。 (只是“猜测”,没有时间尝试复制自己)或者您的组件是否扩展了 PrimeFaces 基础组件?
-
是的,我的组件从 Widget 类扩展,渲染器从 CoreRenderer 扩展......但是......我想出了一个可能的原因......我正在使用 SPA 方法,页面只是通过 AJAX 在面板组上使用 JSF 包含指令更新 XHTML 片段。如果组件在这样的 SPA 片段中使用,那么 @ResourceDependency 注释似乎根本不起作用。如果我在 JSF 模板上使用该组件,该组件在第一次创建视图时呈现......那么它按预期工作......我稍后会尝试用这些发现更新我的问题。
-
如果您不在@ResourceDependency 上使用
target = "head"怎么办?但是例如target="body"或 @this 或 parent 或...
标签: single-page-application jsf-2.2 custom-component