【问题标题】:Serving javascript/jsf resources from a jsf app从 jsf 应用程序提供 javascript/jsf 资源
【发布时间】:2011-08-27 14:21:04
【问题描述】:

我有一个“/js/ajax-error.js”文件,我将以“richfaces 方式”提供该文件,如下所示:“/js/ajax-error.js.jsf”这样我就可以在我的 js 文件中使用这种 jsf 变量:"#{facesContext.externalContext.requestContextPath}"

这可能吗?我尝试在我的 js 文件前加上 xhtml:它不起作用。

我使用richfaces + jsf 2.0 + servlet 3.0

有人可以帮忙吗?

(补充)难道没有干净的JSF方式来达到想要的效果吗?

【问题讨论】:

    标签: javascript file jsf richfaces


    【解决方案1】:

    可以这样做,但我强烈建议您不要这样做。保持 JavaScript 干净且可缓存。

    用于安排服务器端数据对 JavaScript 可用的一种常见模式是将值放入 HTML 适当部分的“data-”属性中。例如,“全局”信息(例如,关于用户会话的内容,如用户名、公司名称等)可以附加到 <body>

    <body data-username='John Phillip Sousa' data-registered='05 Jul 1903'>
    

    现在,JavaScript 可以通过从&lt;body&gt; 标记中获取数据属性来找出用户名和注册日期。像这样编辑

    var body = document.getElementsByTagName('body')[0];
    var username = body.getAttribute("data-username");
    var registrationDate = body.getAttribute("data-registered");
    

    【讨论】:

    • "现在 JavaScript 可以通过从 标记中获取数据属性来找出用户名和注册日期。"谢谢。你是怎么做到的?
    • 这取决于您是否使用 JavaScript 框架,但它们只是属性 - 我会更新答案。
    【解决方案2】:

    如果您的唯一目的是使用“Richfaces 方式”(实际上是 JSF 2.0 方式),请使用&lt;h:outputScript&gt;。将文件放在公共网页内容的/resources/js/ajax-error.js 中(主路径/resources 为必填项,名称不可更改)。然后引用如下:

    <h:outputScript name="js/ajax-error.js" />
    

    无论它在模板中的位置如何,它都会生成到 HTML &lt;head&gt; 中,如下所示,假设您的 FacesServlet 映射到 *.jsf

    <script type="text/javascript" src="/contextname/javax.faces.resource/js/ajax-error.js.jsf"></script>
    

    但这并不能为您提供 EL 支持!您将无法在该脚本中使用 #{}。仅在 &lt;h:outputStylesheet&gt; 包含的样式表中,支持 #{} 以便以 JSF 2.0 #{resource['logo.png']} 方式定位背景图像,但仅此而已。

    在您的特定情况下,我宁愿在 HTML &lt;base&gt; 标记或一些全局 JS 变量或 HTML data 属性中引用 #{facesContext.externalContext.requestContextPath}(或其更短且更流行的对应物 #{request.contextPath})。如果设置为&lt;base&gt;,则所有相对链接都将是相对于它的,在JS中也是如此。

    另见:

    【讨论】:

    • 感谢 BalusC。能否请您详细说明如何使用 标签和全局 js 变量?
    • 查看&lt;base&gt; 示例的“另请参阅”链接。至于全局 JS 变量,只需将 &lt;script&gt;var base = '#{request.contextPath}';&lt;/script&gt; 之类的内容添加到您的 &lt;head&gt; 即可。在初始化该行后调用的所有 JavaScript 中,它将作为全局变量 base 可用。
    • 谢谢。好的我明白了。我意识到我没有包含有关我的问题的足够信息,我认为打开第二个线程会更合适。
    • 哇,我试图用类似 window.location.pathname.split('/')[1] == '' 的东西在 Javascript 中获取上下文? '' : '/'+window.location.pathname.split('/')[1];这当然是有缺陷的。 很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2013-12-13
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多