gpt4 book ai didi

jsf-2 -

not rendering image

转载 作者:行者123 更新时间:2023-12-02 00:19:45 26 4
gpt4 key购买 nike

我有一个 JSF 页面,我想在其中显示图像。图像作为 blob 存储在数据库中。实体看起来像这样:

@Entity
public class Player
{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Lob
private byte[] pictureData;
@Transient
private StreamedContent streamedPicture;

public StreamedContent getStreamedPicture()
{
if (streamedPicture == null && pictureData != null)
{
try
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
os.write(pictureData);
streamedPicture = new DefaultStreamedContent(
new ByteArrayInputStream(
os.toByteArray()),
"image/png");
}
catch (FileNotFoundException e)
{}
catch (IOException e)
{}
}
return streamedPicture;
}
}

JSF 页面是这样的:

<!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://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">

<h:head></h:head>
<body>
<ui:repeat var="player" value="#{playerbean.cachedPlayers}">
<h:outputText value="#{player.id}" />
<p:graphicImage value="#{player.streamedPicture}" rendered="#{player.streamedPicture != null}"/>
</ui:repeat>
</body>
</html>

我调用的 bean 看起来像这样:

@ManagedBean(name = "playerbean")
@SessionScoped
public class PlayerBean
implements Serializable
{
@EJB
private PlayerManager playerManager;
private List<Player> cachedPlayers;

public List<Player> getCachedPlayers()
{
if (cachedPlayers == null)
{
cachedPlayers = playerManager.getAll();
}
return cachedPlayers;
}
}

在调试时,我在 handleResourceRequest() 方法的 PrimeResourceHandler 中设置了一个断点。我正在查看的 PrimeResourceHandler 代码包含以下内容:

try {
String dynamicContentEL = (String) session.get(dynamicContentId);
ELContext eLContext = context.getELContext();
ValueExpression ve = context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(), dynamicContentEL, StreamedContent.class);
StreamedContent content = (StreamedContent) ve.getValue(eLContext);
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

response.setContentType(content.getContentType());

byte[] buffer = new byte[2048];

int length;
InputStream inputStream = content.getStream();
while ((length = (inputStream.read(buffer))) >= 0) {
response.getOutputStream().write(buffer, 0, length);
}

response.setStatus(200);
response.getOutputStream().flush();
context.responseComplete();

} catch(Exception e) {
logger.log(Level.SEVERE, "Error in streaming dynamic resource.");
} finally {
session.remove(dynamicContentId);
}

当传递行时 StreamedContent content = (StreamedContent) ve.getValue(eLContext); content 似乎为空。这当然会导致 NullPointerException。但是在 JSF 页面中,我告诉元素如果值为空则不要呈现。

最佳答案

<p:graphicImage>组件不能有 value指向 SessionScoped bean 中托管属性的属性。该值必须设置为 RequestScoped bean。

这是因为对 image/jpeg 的 HTTP 请求内容类型 HTTP 响应本质上是无状态的。浏览器将对 JSF 页面内容发出初始请求,然后对每个 HTML <img>呈现的标签将对每个 <img> 的动态生成的 url 发出单独的请求。标签来获取这些。在有状态的上下文中获取图像实际上没有任何意义。

关于jsf-2 - <p :graphicImage> not rendering image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11434517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com