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

cur*_*ous 0 resources jsf el

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

<img src="#{resource['img/bla.svg']}"/>
Run Code Online (Sandbox Code Playgroud)

像这样工作

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

LogoHandler.getLogo(String type)
Run Code Online (Sandbox Code Playgroud)

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

<img src="#{resource["#{logoHandler.getLogo("A1")}"]}"/>
Run Code Online (Sandbox Code Playgroud)

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

你能帮我吗?

Bal*_*usC 5

<img src="#{resource["#{logoHandler.getLogo("A1")}"]}"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

否则,您将不得不避免使用双引号,这会使表达式更难以阅读。

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

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

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

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

<h:graphicImage name="#{logoHandler.getLogo('A1')}"/>
Run Code Online (Sandbox Code Playgroud)

也可以看看: