【问题标题】:Refactor common string values in page to some EL constant将页面中的常用字符串值重构为某个 EL 常量
【发布时间】:2011-10-28 11:52:56
【问题描述】:

在 JSF 组件中,“重构”公共常量的最佳方式是什么,例如<h:graphicImage> 标记中的名称/路径到单个本地临时属性?

<ui:composite>

  <h:graphicImage library="mylib" name="/a/b/c/img1.png"/>
  <h:graphicImage library="mylib" name="/a/b/c/img2.png"/>
  <h:graphicImage library="mylib" name="/a/b/c/img3.png"/>
  <!-- ... lots of repetitions -->

</ui:composite>

应该是

<ui:composite>

  <-- assign /a/b/c/ to path -->

  <h:graphicImage library="mylib" name="#{path}img1.png"/>
  <h:graphicImage library="mylib" name="#{path}img2.png"/>
  <h:graphicImage library="mylib" name="#{path}img3.png"/>
  <!-- ... lots of repetitions -->

</ui:composite>

【问题讨论】:

  • 更准确地说:除了使用静态实体...想象一下“路径”beeing计算。

标签: jsf jsf-2 el


【解决方案1】:

在应用程序范围内使用&lt;c:set&gt;。这基本上将变量存储在application map中。

<c:set var="path" value="a/b/c/" scope="application" />
<h:graphicImage library="mylib" name="#{path}img1.png"/>
<h:graphicImage library="mylib" name="#{path}img2.png"/>
<h:graphicImage library="mylib" name="#{path}img3.png"/>

确保var="path" 不与现有托管 bean 名称或隐式 EL 变量等冲突。如有必要,您可以使用约定为它加上 _ 前缀。

<c:set var="_path" value="a/b/c/" scope="application" />
<h:graphicImage library="mylib" name="#{_path}img1.png"/>
<h:graphicImage library="mylib" name="#{_path}img2.png"/>
<h:graphicImage library="mylib" name="#{_path}img3.png"/>

【讨论】:

  • 虽然这有点违反直觉,但它确实有效。所以 ui:param 只是将评估结果写入请求范围?
  • 有些话会很好地说明为什么这是最好的选择,以及这是否最适合所有情况下的常量!
【解决方案2】:

为什么不使用复合组件。然后,当发生变化时,您不必在整个地方更改 img1.png、img2.png 等。路径可以作为参数提供。

【讨论】:

  • 这是来自自动迁移 - 我对与原始代码匹配的成语只有有限的选择。无论如何,谢谢你的提示。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多