如何使用JSF / OmniFaces / PrimeFaces嵌入SVG图像?

时间:2015-02-04 15:59:35

标签: jsf jsf-2.2 omnifaces

这是我正在尝试做的事情:

  1. 我有一个@ViewScoped JSF bean,我在其中使用Jersey调用JAX-RS服务。
  2. 我请求的资源返回内容类型为image/svg+xml的回复。
  3. 在Facelet页面中显示。
  4. 到目前为止,我的研究让我相信:

    • h:graphicImage(核心JSF)不支持SVG
    • p:graphicImage(PrimeFaces)不支持SVG
    • o:graphicImage(OmniFaces)也不支持SVG。

    是否无法从支持bean向facelets页面提供SVG图像?提供服务SVG图像的服务将在以后扩展,以支持提供(以及其他格式)PNG但我希望直接使用SVG。

2 个答案:

答案 0 :(得分:4)

<o:graphicImage>设置的默认内容类型为image,但您的浏览器显然没有吞下SVG图片的内容类型。根据{{​​3}},我为OmniFaces 2.1添加了对<o:graphicImage dataURI="true">的SVG支持,并且我添加了一个新的type属性,允许您通过以下方式明确指定图像类型文件扩展名:

<o:graphicImage value="#{bean.image}" type="svg" />

如果它像这样抛出一个IllegalArgumentException

  

java.lang.IllegalArgumentException:o:graphicImage&#39; type&#39; attribute必须表示有效的文件扩展名。遇到了无效的&#39; svg&#39;。

然后,这意味着您的服务器不会将其识别为已注册的mime映射。然后,您应该将新的mime映射添加到服务器或webapp&#39; web.xml,如下所示:

<mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg+xml</mime-type>
</mime-mapping>

答案 1 :(得分:0)

我还没试过,但是你可以使用JSF的ui:include吗?像这样:

<ui:include src="assets/img/fileFromJersey.svg" />