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

如何使用JSF/OmniFaces/PrimeFaces嵌入SVG图像?,jsf,jsf-2.2,omnifaces,Jsf,Jsf 2.2,Omnifaces,以下是我想做的: 我有一个@ViewScopedJSF bean,在其中我使用Jersey调用一个JAX-RS服务 我请求的资源返回内容类型为image/svg+xml的响应 在Facelet页面中显示它 到目前为止,我的研究使我相信: h:graphicImage(核心JSF)不支持SVG p:graphicImage(PrimeFaces)不支持SVG o:graphicImage(OmniFaces)也不支持SVG 没有办法从支持bean向facelets页面交付SVG图像吗?稍后将扩

以下是我想做的:

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

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

    没有办法从支持bean向facelets页面交付SVG图像吗?稍后将扩展服务SVG图像的服务,以支持交付(以及其他格式)PNG,但我希望直接使用SVG。

    我没有尝试过,但您能使用JSF的
    ui:include
    ?大概是这样的:

    <ui:include src="assets/img/fileFromJersey.svg" />
    
    
    
    设置了默认的内容类型
    图像
    ,但是您的浏览器显然没有接受SVG图像的默认内容类型。根据,我为OmniFaces 2.1添加了对
    的SVG支持,并添加了一个新的
    type
    属性,该属性允许您通过文件扩展名显式指定图像类型:

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

    请具体说明。向我们展示您迄今为止所做的尝试,解释为什么它没有做正确的事情,而不是问“我该怎么做”。据我所知,OP的图像只有
    byte[]
    InputStream
    @BalusC的味道。是的,我想如果不将其写入磁盘,这将不起作用。OmniFaces非常酷,可惜我不能在portlet中使用它。我知道这是技术上的限制。巴卢斯克,谢谢!我认为你在这里一针见血。我明天会测试快照,然后在这里更新。它工作得很好!为了澄清,这里是我的测试示例:EL表达式返回InputStream。不客气。只有
    dataURI=“true”
    在这个构造中是不必要的(相对昂贵)。如果您仍然坚持使用
    dataURI=“true”
    ,那么就不必使用
    type=“svg”
    。从您的文档中可以看出:“当不呈现为数据URI时,InputStream或byte[]属性必须指向无状态@ApplicationScoped bean(支持JSF和CDI作用域)。”这就是我启用它的原因。
    <mime-mapping>
        <extension>svg</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>