有没有办法在 EL 中的 #{resource} 映射中获取 JSF bean 属性

Is there a way to get JSF bean property inside #{resource} mapping in EL

我正在尝试从这样的资源中获取图像:

<img src="#{resource['img/bla.svg']}"/>

它是这样工作的...

但现在我想概括这个文件,所以它将来自 java class 这样的:

LogoHandler.getLogo(String type)

我试着像这样把它们放在一起:

<img src="#{resource["#{logoHandler.getLogo("A1")}"]}"/>

但当然它不起作用,只是为了向您展示我想要实现的目标。

你能帮帮我吗?

<img src="#{resource["#{logoHandler.getLogo("A1")}"]}"/>

EL 确实不是那样工作的。 #{...} 不能嵌套。 #{...} 实际上代表一个范围,您可以让多个变量和表达式相互交互,产生一个结果。您应该删除内部 #{...} 并确保引号不冲突。

与HTML和JavaScript一样,EL也支持单引号。您可以对内引号使用单引号而不是双引号。

<img src="#{resource[logoHandler.getLogo('A1')]}"/>

否则您必须转义双引号,这会使表达式更难阅读。

<img src="#{resource[logoHandler.getLogo(\"A1\")]}"/>

此外,您为此还取决于所使用的 EL 实现。 single-slash 转义仅适用于 Oracle EL,而在 Apache EL 中您需要两个。因此,您的代码将无法跨使用不同 EL 实现的服务器移植。

<img src="#{resource[logoHandler.getLogo(\"A1\")]}"/>

一种完全不同的方法是使用 JSF-provided <h:graphicImage> 组件。它生成一个 HTML <img> 元素。它的 name 属性表示资源路径。这样您就不再需要 #{resource} 映射。

<h:graphicImage name="#{logoHandler.getLogo('A1')}"/>

另请参阅:

  • How to reference CSS / JS / image resource in Facelets template?