Jsf 是否有关于获取<;p:graphicImage>;?

Jsf 是否有关于获取<;p:graphicImage>;?,jsf,primefaces,graphicimage,Jsf,Primefaces,Graphicimage,基本上,我的问题与五年前的回答相同:我想从输出服务器提供的图像的URL,但只输出URL,而不是标记。我正在寻找的是这样一种解决方案: <span id="imageData" data-image="http://localhost:8080/contextPath/javax.faces.resource/dy... (这是不起作用的代码,只是为了举例说明:) 只是看了一眼,想弄清楚他们是如何生成那个动态URL的。他们在其上使用静态方法: 那么,为什么不在p:graphicImage

基本上,我的问题与五年前的回答相同:我想从
输出服务器提供的图像的URL,但只输出URL,而不是
标记。我正在寻找的是这样一种解决方案:

<span id="imageData" data-image="http://localhost:8080/contextPath/javax.faces.resource/dy...
(这是不起作用的代码,只是为了举例说明:)


只是看了一眼,想弄清楚他们是如何生成那个动态URL的。他们在其上使用静态方法:

那么,为什么不在
p:graphicImage
组件上重现这个调用呢? 我将首先
将它绑定到
RequestScoped
bean的一个属性,然后从该bean获取URI,该bean再现了上述呈现器的行为:

XHTML代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
<h:head/>
<body>
    <p:graphicImage binding="#{myBean.imgComponent}"
        value="#{myBean.img}" />
    <h:outputText id="imageData" pt:data-image="#{myBean.getImgUri()}" />
</body>
</html>
或者,我们可以使用
GraphicImageRenderer
并发布
受保护的
方法
getImageSrc

public class MyBean {
  // ...
  public String getImgUri() throws Exception {
    assert null != imgComponent;
    if (null == imgUri) {
        imgUri = new GraphicImageRendererXtension().getPublicImageSrc(FacesContext.getCurrentInstance(),
                imgComponent);
    }
    return imgUri;
  }
}

public class GraphicImageRendererXtension extends GraphicImageRenderer {
    // publish the protected GraphicImageRenderer#getImageSrc method:
    public String getPublicImageSrc(FacesContext context, GraphicImage image) throws Exception {
        return getImageSrc(context, image);
    }
}
但是为什么我要写
{myBean.getImgUri()}
而不是
{myBean.imgUri}
?我仍然不确定,但使用后者会产生一个
PropertyNotFoundException

javax.el.PropertyNotFoundException: /myView.xhtml @20,46 value="#{myBean.imgUri}": ELResolver did not handle type: [null] with property of [imgUri]
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:117)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:200)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:187)
    at javax.faces.component.UIOutput.getValue(UIOutput.java:179)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:360)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:171)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1912)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:309)
    at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:114)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:86)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:73)
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1912)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491)
    at javax.faces.view.ViewDeclarationLanguageWrapper.renderView(ViewDeclarationLanguageWrapper.java:126)
...
Caused by: javax.el.PropertyNotFoundException: ELResolver did not handle type: [null] with property of [imgUri]
    at org.apache.el.parser.AstValue.getValue(AstValue.java:174)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
    at org.apache.webbeans.el22.WrappedValueExpression.getValue(WrappedValueExpression.java:68)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115)
    ... 122 more
可能调用
DynamicContentSrcBuilder.build()
方法会以某种方式扰乱值表达式
{myBean.imgUri}
的持续解析,而
{myBean.getImgUri()}
不受影响

回到你的问题:不,没有新闻。生成动态URI,并在渲染时直接发送到浏览器。
GraphicImage
组件不为此提供任何getter。我在这里介绍的是一种服务器端变通方法,无需创建新的servlet

编辑:

当然,您也可以参数化
getImageUri
方法,并将图像组件绑定到某个任意变量,这将使您更接近演示
var=“…”
示例:

public class MyBean {
  // ...
  public String getImgUri(GraphicImage imgComponent) throws Exception {
    assert null != imgComponent;
    String imgUri = new GraphicImageRendererXtension().getPublicImageSrc(FacesContext.getCurrentInstance(),
                imgComponent);
    return imgUri;
  }
}
然后通过以下方式使用此方法:

<p:graphicImage binding="#{myImage}" value="#{myBean.img}" />
<h:outputText id="imageData" pt:data-image="#{myBean.getImgUri(myImage)}" />

这样,就不需要为每个图像创建bean或方法。

只需查看一下,就可以了解它们是如何生成动态URL的。他们在其上使用静态方法:

那么,为什么不在
p:graphicImage
组件上重现这个调用呢? 我将首先
将它绑定到
RequestScoped
bean的一个属性,然后从该bean获取URI,该bean再现了上述呈现器的行为:

XHTML代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
<h:head/>
<body>
    <p:graphicImage binding="#{myBean.imgComponent}"
        value="#{myBean.img}" />
    <h:outputText id="imageData" pt:data-image="#{myBean.getImgUri()}" />
</body>
</html>
或者,我们可以使用
GraphicImageRenderer
并发布
受保护的
方法
getImageSrc

public class MyBean {
  // ...
  public String getImgUri() throws Exception {
    assert null != imgComponent;
    if (null == imgUri) {
        imgUri = new GraphicImageRendererXtension().getPublicImageSrc(FacesContext.getCurrentInstance(),
                imgComponent);
    }
    return imgUri;
  }
}

public class GraphicImageRendererXtension extends GraphicImageRenderer {
    // publish the protected GraphicImageRenderer#getImageSrc method:
    public String getPublicImageSrc(FacesContext context, GraphicImage image) throws Exception {
        return getImageSrc(context, image);
    }
}
但是为什么我要写
{myBean.getImgUri()}
而不是
{myBean.imgUri}
?我仍然不确定,但使用后者会产生一个
PropertyNotFoundException

javax.el.PropertyNotFoundException: /myView.xhtml @20,46 value="#{myBean.imgUri}": ELResolver did not handle type: [null] with property of [imgUri]
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:117)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:200)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:187)
    at javax.faces.component.UIOutput.getValue(UIOutput.java:179)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:360)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:171)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1912)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:309)
    at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:114)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:86)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:73)
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1912)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491)
    at javax.faces.view.ViewDeclarationLanguageWrapper.renderView(ViewDeclarationLanguageWrapper.java:126)
...
Caused by: javax.el.PropertyNotFoundException: ELResolver did not handle type: [null] with property of [imgUri]
    at org.apache.el.parser.AstValue.getValue(AstValue.java:174)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
    at org.apache.webbeans.el22.WrappedValueExpression.getValue(WrappedValueExpression.java:68)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115)
    ... 122 more
可能调用
DynamicContentSrcBuilder.build()
方法会以某种方式扰乱值表达式
{myBean.imgUri}
的持续解析,而
{myBean.getImgUri()}
不受影响

回到你的问题:不,没有新闻。生成动态URI,并在渲染时直接发送到浏览器。
GraphicImage
组件不为此提供任何getter。我在这里介绍的是一种服务器端变通方法,无需创建新的servlet

编辑:

当然,您也可以参数化
getImageUri
方法,并将图像组件绑定到某个任意变量,这将使您更接近演示
var=“…”
示例:

public class MyBean {
  // ...
  public String getImgUri(GraphicImage imgComponent) throws Exception {
    assert null != imgComponent;
    String imgUri = new GraphicImageRendererXtension().getPublicImageSrc(FacesContext.getCurrentInstance(),
                imgComponent);
    return imgUri;
  }
}
然后通过以下方式使用此方法:

<p:graphicImage binding="#{myImage}" value="#{myBean.img}" />
<h:outputText id="imageData" pt:data-image="#{myBean.getImgUri(myImage)}" />


这样,就不需要为每个图像创建bean或方法。

在stackoverflow上有99.5%的确定度重复此操作。@Kukeltje重复OP的问题?他把它连在一起。我应该把我的建议答案贴在那里而不是这里吗?不,这很好,但sinds在未来几天都在我的手机上,我不能很容易地找到一个真正好的答案,但我几乎可以肯定这是一个。但它也可能是“固定”的,无所不在。99.5%的确定度是stackoverflow上的重复。@Kukeltje是OP问题的重复?他把它连在一起。我应该把我的建议答案贴在那里而不是这里吗?不,这很好,但sinds在未来几天都在我的手机上,我不能很容易地找到一个真正好的答案,但我几乎可以肯定这是一个。但它也可能是“修复”了OmniFaces