- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试显示在数据库中保存为 StreamedContent
的图像字节在<p:graphicImage>
如下:
<p:graphicImage value="#{item.imageF}" width="50" id="grpImage" height="80"/>
private StreamedContent content; // getter and setter
public StreamedContent getImageF() {
if (student.getImage() != null) {
InputStream is = new ByteArrayInputStream(student.getImage());
System.out.println("Byte :"+student.getImage());
content = new DefaultStreamedContent(is, "", student.getStuID());
System.out.println("ddd ------------------------------- " + content);
return content;
}
return content;
}
这将返回一个空白图像。这是怎么引起的,我该如何解决?
标准输出打印以下内容:
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@b0887b
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1d06a92
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@39a60
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@8c3daa
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1dbe05b
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@66a266
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1293976
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@17b7399
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1e245a5
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@4a7153
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1561bfd
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@47a8c2
最佳答案
<p:graphicImage>
需要一个特殊的 getter 方法。也就是说,每个生成的图像都会调用两次,每次都在完全不同的 HTTP 请求中。
请求 JSF 页面的 HTML 结果的第一个 HTTP 请求将首次调用 getter 以生成 HTML <img>
在 src
中具有正确的唯一且自动生成的 URL 的元素属性,其中包含有关每当 Web 浏览器将要请求图像时应准确调用哪个 bean 和 getter 的信息。请注意,此时 getter 不需要返回图像的内容。它不会以任何方式使用,因为这不是 HTML 的工作方式(图像在 HTML 输出中不是“内联”的,而是单独请求的)。
一旦网络浏览器检索到作为 HTTP 响应的 HTML 结果,它将解析 HTML 源代码,以便将结果直观地呈现给最终用户。一旦网络浏览器遇到 <img>
元素在解析 HTML 源期间,然后它将在其 src
中指定的 URL 上发送一个全新的 HTTP 请求。属性以便下载该图像的内容并将其嵌入到视觉呈现中。这将第二次调用 getter 方法,该方法又应返回实际 图像内容。
在您的特殊情况中,PrimeFaces 显然无法识别和调用 getter 以检索实际图像内容,或者 getter 没有返回预期的图像内容。 #{item}
的用法变量名称和日志中的大量调用表明您在 <ui:repeat>
中使用它或 <h:dataTable>
.最有可能的是,支持 bean 是请求范围的,并且数据模型在图像请求期间没有正确保存,并且 JSF 将无法在正确的迭代轮次中调用 getter。 View 范围的 bean 也不会工作,因为当浏览器实际请求图像时,JSF View 状态无处可用。
要解决此问题,最好的办法是重写 getter 方法,以便它可以在每个请求的基础上调用,其中您将唯一图像标识符作为 <f:param>
传递。而不是依赖一些在后续 HTTP 请求期间可能会“不同步”的支持 bean 属性。为此使用一个单独的应用程序范围的托管 bean 是完全有意义的,它没有任何状态。此外,InputStream
只能读取一次,不能读取多次。
换句话说:永远不要声明StreamedContent
也没有任何 InputStream
甚至 UploadedFile
作为 bean 属性;只在无状态的 getter 中创建全新的 @ApplicationScoped
bean 当网络浏览器实际请求图像内容时。
例如
<p:dataTable value="#{bean.students}" var="student">
<p:column>
<p:graphicImage value="#{studentImages.image}">
<f:param name="studentId" value="#{student.id}" />
</p:graphicImage>
</p:column>
</p:dataTable>
哪里StudentImages
支持 bean 可以如下所示:
@Named // Or @ManagedBean
@ApplicationScoped
public class StudentImages {
@EJB
private StudentService service;
public StreamedContent getImage() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
// So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
return new DefaultStreamedContent();
}
else {
// So, browser is requesting the image. Return a real StreamedContent with the image bytes.
String studentId = context.getExternalContext().getRequestParameterMap().get("studentId");
Student student = studentService.find(Long.valueOf(studentId));
return new DefaultStreamedContent(new ByteArrayInputStream(student.getImage()));
}
}
}
请注意,这是一个非常特殊的情况,考虑到 <p:graphicImage>
如何在 getter 方法中执行业务逻辑是完全合法的。在幕后工作。在 getter 中调用业务逻辑通常是不受欢迎的,另请参见 Why JSF calls getters multiple times .不要将这种特殊情况用作其他标准(非特殊)情况的借口。另请注意,您不能像这样使用 EL 2.2 传递方法参数的功能 #{studentImages.image(student.id)}
因为此参数不会以图像 URL 结尾。因此,您确实需要将它们作为 <f:param>
传递.
如果你碰巧使用OmniFaces 2.0 or newer ,然后考虑使用其 <o:graphicImage>
相反,它可以更直观地使用,应用程序范围的 getter 方法直接委托(delegate)给服务方法并支持 EL 2.2 方法参数。
因此:
<p:dataTable value="#{bean.students}" var="student">
<p:column>
<o:graphicImage value="#{studentImages.getImage(student.id)}" />
</p:column>
</p:dataTable>
与
@Named // Or @ManagedBean
@ApplicationScoped
public class StudentImages {
@EJB
private StudentService service;
public byte[] getImage(Long studentId) {
return studentService.find(studentId).getImage();
}
}
另见 the blog关于这个问题。
关于database - 使用 p :graphicImage and StreamedContent 显示来自数据库或远程源的动态图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8207325/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!