有没有一种方法可以在EL中的#{resource}映射中获取JSF bean属性

时间:2019-06-19 10:10:56

标签: jsf resources el

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

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

它正在这样工作...

但是现在我想对此文件进行泛化,因此它将来自这样的java类:

LogoHandler.getLogo(String type)

我试图像这样将它们放在一起:

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

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

你能帮我吗?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

此外,为此,您还取决于所使用的EL实现。单斜杠转义仅在Oracle EL中有效,而在Apache EL中则需要两个。因此,您的代码将无法在使用不同EL实现的服务器之间移植。

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

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

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

另请参见: