【问题标题】:Avoid rendering empty byte array with <o:graphicImage>避免使用 <o:graphicImage> 渲染空字节数组
【发布时间】:2015-08-08 13:57:27
【问题描述】:

我有两个&lt;o:graphicImage&gt; 来显示存储的图像和一个虚拟图像(如果没有图像)。实际上,存储图像的大小可以为零。如果是,则渲染第一个&lt;o:graphicImage,但图像为空且未正确渲染。

<o:graphicImage id="image" alt="Image"
        lastModified="#{userProfile.user.lastModified}"
        rendered="#{not empty images.getImage(userProfile.user.id)}"
        value="#{images.getImage(userProfile.user.id)}"

<o:graphicImage name="images/profile.png" width="125"
        rendered="#{empty images.getImage(userProfile.user.id)}" />

如果用户图像为空或长度/大小为 0,如何显示虚拟图像?

【问题讨论】:

    标签: jsf omnifaces graphicimage conditional-rendering


    【解决方案1】:

    您最好不要在rendered 属性中调用该图像流媒体方法。它在 JSF 生命周期中被多次调用,因此每次都从数据库中获取图像字节的效率很低。

    该模型最初看起来也不正确。建议换个型号。使图像 ID 成为 UserUserProfile 表和实体的 FK。

    @Column(name="image_id")
    private Long imageId;
    

    然后,当用户上传/设置图像时,将图像 ID 保存在那里。这样你就可以像下面这样使用它:

    <o:graphicImage 
        value="#{images.getImage(userProfile.user.imageId)}" 
        rendered="#{not empty userProfile.user.imageId}" />
    
    <h:graphicImage
        name="images/profile.png" 
        rendered="#{empty userProfile.user.imageId}" />
    

    不要忘记更改图像流媒体以通过其自己的 ID 而不是用户 ID 获取图像。

    【讨论】:

    • 我应该如何保存存储的图像ID?上传图片后只需创建一个新的(自动生成的)值?将图像存储为字节数组并通过ApplicationScoped bean 访问它就可以了吗?
    • 只需使用一个PK(每个实体表都应该有一个)。 bean 不应该包含基于请求的变量,它应该是无状态的。
    • 好吧,你在用户表/实体中说FK。所以,我现在有点困惑。我应该将图像存储在新表中吗? ApplicationScoped bean 是因为 &lt;o:graphicImage&gt;。这也是错的吗?
    • 也许您也是 SQL/DB/建模新手?每个表都应该有一个 PK(在 JPA 术语中,@Id)。两个表之间的每个关系都由一个表中的 FK 表示,该表引用另一个表的 PK(在 JPA 术语中,@OneToOne@ManyToOne)。 bean的范围很好。它应该是应用范围的。它应该是无国籍的。它不应该包含请求范围的变量。 &lt;o:graphicImage&gt; 还验证 bean 范围以迫使开发人员三思而后行。常识应该已经告诉您,您不能将请求范围的数据存储在应用程序范围的 bean 中。
    • 嗯,是的。 :) 我的用户实体具有带有 @Id 注释的简单 ID。那么,您的尝试是在这里使用图像 id 作为主键吗?图像 bean 也应该是无状态的?
    猜你喜欢
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2022-06-15
    • 2021-08-04
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多