【问题标题】:Where is #{resource} EL specified?#{resource} EL 在哪里指定?
【发布时间】:2015-12-24 01:39:48
【问题描述】:

在一个 JSF 页面中,我使用 EL 来定位一个放在 /resource/images/ 文件夹中的图像。

<h:graphicImage value="#{resource['images:logo.gif']}"

EL如何定位图像? 也许一个规范定义了规则,但我不知道是哪个规范。 我尝试在JSR-000344 JavaServer Faces 2.2JSR-000342 Java Platform, Enterprise Edition 7JSR-000341 Expression Language 3.0中找到它,但没有找到。

【问题讨论】:

    标签: jsf resources el specifications


    【解决方案1】:

    JSF 2.0 specification中,第2.6.2章第一次提到:

    2.6.2 渲染资源

    图像、样式表和脚本等资源使用第 2.6.1 节中概述的资源处理机制 “打包资源”。所以,例如:

    <h:graphicImage name=”Planets.gif” library=”images”/>
    <h:graphicImage value=”#{resource[‘images:Planets.gif’]}”/>
    

    这些条目呈现完全相同的标记。除了使用namelibrary 属性,样式表和 脚本资源可以“重新定位”到视图的其他部分。例如,我们可以指定一个脚本资源是 在页面中的 HTML“head”、“body”或“form”元素中呈现。

    然后在第 5.6.2.5 章:

    5.6.2.5 资源 ELResolver

    此解析器是一种将Resource 实例编码到面孔请求中的方法,以便后续面孔 来自浏览器的资源请求可以使用第 2.6 节“资源”中所述的 ResourceHandler 来满足 处理”.

    ELResolver方法实现要求

    如果 base 和 property 不为 null,并且 base 是 ResourceHandler 的实例(情况将如此) 使用 #{resource[‘ajax.js’]} 等表达式, 执行以下操作。 (注:这是可能的,因为 到ImplicitObjectELResolver 返回 ResourceHandler,参见第 5.6.2.1 节“隐式 面向 Facelets 和 Programmatic 的对象 ELResolver 访问”)

    • 如果属性不包含冒号 字符‘:’,将属性视为 resourceName 并将属性传递给 ResourceHandler.createResource(resourceName)
    • 如果属性包含一个冒号 字符‘:’,将‘:’之前的内容视为 libraryName 和‘:’后面的内容 作为resourceName 并将两者都传递给 ResourceHandler.createResource(resourceName, libraryName)
    • 如果属性包含多个冒号 字符‘:’,抛出一个本地化的 ELException,包括财产。

    如果上述步骤之一导致创建 非空Resource 实例,调用 ELContext.setPropertyResolved(true) 并返回 调用getRequestPath() 方法的结果 Resource 实例。

    在 JSF 2.1 和 2.2 规范的相同章节中也提到过。

    与具体问题无关images 是一个非常糟糕的资源库名称示例。不要从规范示例中接管它。

    另见:

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多