Java 如何在内部获取BuffereImage<;h:graphicImage/>;

Java 如何在内部获取BuffereImage<;h:graphicImage/>;,java,jsf,Java,Jsf,我们可以将bImageFromConvert值转换为吗?或者在显示内部之前,在获取缓冲区图像之前还有其他步骤。不幸的是,这里还没有通用的解决方案。但通过检测ResourceHandler,您可以通过正式方式实现这一点(自JSF2以来): 公共类TestResourceHandler扩展ResourceHandlerWrapper{ 公共静态最终类TestResource扩展了资源{ @凌驾 公共InputStream getInputStream()引发IOException{ 返回null;

我们可以将bImageFromConvert值转换为
吗?或者在显示内部

之前,在获取缓冲区图像之前还有其他步骤。不幸的是,这里还没有通用的解决方案。但通过检测ResourceHandler,您可以通过正式方式实现这一点(自JSF2以来):

公共类TestResourceHandler扩展ResourceHandlerWrapper{
公共静态最终类TestResource扩展了资源{
@凌驾
公共InputStream getInputStream()引发IOException{
返回null;
}
@凌驾
公共地图getResponseHeaders(){
返回新的HashMap();
}
@凌驾
公共字符串getRequestPath(){
FacesContext context=FacesContext.getCurrentInstance();
返回context.getApplication().getViewHandler().getResourceURL(
上下文“/faces”+RESOURCE_IDENTIFIER+”/test.gif?ln=test);
}
@凌驾
公共URL getURL(){
返回null;
}
@凌驾
公共布尔userAgentNeedsUpdate(FacesContext上下文){
返回true;
}
}
私有资源管理器;
公共TestResourceHandler(ResourceHandler包装){
this.wrapped=wrapped;
}
@凌驾
公共资源处理程序getWrapped(){
返回包装;
}
@凌驾
公共资源createResource(字符串resourceName、字符串libraryName){
如果(“测试”。等于(库名))
返回新的TestResource();
返回super.createResource(resourceName,libraryName);
}
@凌驾
公共布尔库存在(字符串库名称){
如果(“测试”。等于(库名))
返回true;
返回super.libraryExists(libraryName);
}
@凌驾
public void handleResourceRequest(FacesContext上下文)引发IOException{
String library=context.getExternalContext().getRequestParameterMap().get(“ln”);
如果(“测试”。等于(库)){
BuffereImage image=ImageIO.read(getClass().getResource(“/info.png”);
context.getExternalContext().setResponseContentType(“image/gif”);
write(图像,“gif”,context.getExternalContext().getResponseOutputStream());
context.responseComplete();
}否则{
包装。HandlerResourceRequest(上下文);
}
}
}
并在faces-config.xml中注册:

public class TestResourceHandler extends ResourceHandlerWrapper {
    public static final class TestResource extends Resource {
        @Override
        public InputStream getInputStream() throws IOException {
            return null;
        }

        @Override
        public Map<String, String> getResponseHeaders() {
            return new HashMap<>();
        }

        @Override
        public String getRequestPath() {
            FacesContext context = FacesContext.getCurrentInstance();
            return context.getApplication().getViewHandler().getResourceURL(
                context, "/faces" + RESOURCE_IDENTIFIER + "/test.gif?ln=test");
        }

        @Override
        public URL getURL() {
            return null;
        }

        @Override
        public boolean userAgentNeedsUpdate(FacesContext context) {
            return true;
        }
    }

    private ResourceHandler wrapped;

    public TestResourceHandler(ResourceHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ResourceHandler getWrapped() {
        return wrapped;
    }

    @Override
    public Resource createResource(String resourceName, String libraryName) {
        if ("test".equals(libraryName))
            return new TestResource();
        return super.createResource(resourceName, libraryName);
    }

    @Override
    public boolean libraryExists(String libraryName) {
        if ("test".equals(libraryName))
            return true;
        return super.libraryExists(libraryName);
    }

    @Override
    public void handleResourceRequest(FacesContext context) throws IOException {
        String library = context.getExternalContext().getRequestParameterMap().get("ln");
        if ("test".equals(library)) {
            BufferedImage image = ImageIO.read(getClass().getResource("/info.png"));
            context.getExternalContext().setResponseContentType("image/gif");
            ImageIO.write(image, "gif", context.getExternalContext().getResponseOutputStream());
            context.responseComplete();
        } else {
            wrapped.handleResourceRequest(context);
        }
    }
}

...
com.intersult.test.util.TestResourceHandler
...
通过/faces/javax.faces.resource/test.gif?ln=test或


此解决方案既适用于应用程序本身,也适用于基础应用程序WAR中包含的任何JSF库。

另一种解决方法是使用Base64图像编码,例如:

<faces-config>
    <application>
        ...
        <resource-handler>com.intersult.test.util.TestResourceHandler</resource-handler>
    </application>
    ...
</faces-config>
(此代码需要Java 7)

然后在经典的HTML

<faces-config>
    <application>
        ...
        <resource-handler>com.intersult.test.util.TestResourceHandler</resource-handler>
    </application>
    ...
</faces-config>
byte[] imageBytes = Files.readAllBytes(myFile.toPath());
this.myImageBase64 = "data:" + contentType + ";base64," + DatatypeConverter.printBase64Binary(imageBytes);
<img src="${myBean.myImageBase64}" alt="" />