仅在内部图像存在时尝试有条件地显示div

时间:2017-04-08 09:56:41

标签: java jsf primefaces jsf-2

基本上我有一个负责显示图像的复合材料。但是此图片包含在<picture>标记内,该标记包含在<div>标记内。而我想要实现的只是在图像存在的情况下才显示外部<div>

我的方法: 一开始我有这个:

<composite:implementation>
    <div class="logo-class">
        <picture>
            <p:graphicImage value="#{bean.logo}" alt="{cc.attrs.name} - #{cc.attrs.location}">
                <f:param name="key" value="#{cc.attrs.key}" />
            </p:graphicImage>
        </picture>
    </div>
</composite:implementation>

使用以下bean:

public StreamedContent getLogo()
{
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE)
        return new DefaultStreamedContent();

    String key = context.getExternalContext().getRequestParameterMap().get("key");
    if (key == null || key.isEmpty())
        return new DefaultStreamedContent();

    try
    {
        Document logo = logosService.read(key);
        if (logo == null)
            return new DefaultStreamedContent();

        return new ByteArrayContent(logo.getContent(), logo.getMimeType(), logo.getFilename());
    }
    catch (ValidationException ve)
    {
        return new DefaultStreamedContent();
    }
}

我修改了我的复合材料看起来像这样。不知道这种方法是否最好......

<c:set var="logo" value="#{bean.getLogo(cc.attrs.key)}" />

<p:outputPanel rendered="#{logo != null}" styleClass="logo-class">
    <picture>
        <p:graphicImage value="#{logo}" alt="#{cc.attrs.name} - #{cc.attrs.location}" />
    </picture>
</p:outputPanel>

当然我创建了一个新的bean方法:

public StreamedContent getLogo(String key)
{
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE)
        return null;

    if (key == null || key.isEmpty())
        return null;

    try
    {
        Document logo= logosService.read(key);
        if (logo== null)
            return null;

        return new ByteArrayContent(logo.getContent(), logo.getMimeType(), logo.getFilename());
    }
    catch (ValidationException ve)
    {
        return null;
    }
}

标记结构是不可修改的。

我遇到的问题是,现在没有显示徽标图像,调试时我无法到达行Document logo = logosService.read(key);。我总是达到第一个条件if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) ......但仅此而已。可能是什么问题呢? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

  1. boolean课程中添加一个属性(bean),告诉您徽标是否存在。

  2. 使用fragment函数呈现<div/>标记。

  3. 示例;

    使用核心JSF标记库xmlns:ui="http://java.sun.com/jsf/facelets"

    将片段包裹在<div/>

    周围
    <ui:fragment rendered="#{bean.logoPresent}">
    
    <div class="logo-class">
            <picture>
                <p:graphicImage value="#{bean.logo}" alt="{cc.attrs.name} - #{cc.attrs.location}">
                    <f:param name="key" value="#{cc.attrs.key}" />
                </p:graphicImage>
            </picture>
        </div>
    </ui:fragment>
    
    1. getLogo()方法不会被执行,因为boolean检查会阻止它。

答案 1 :(得分:0)

您需要一个logoName,一个名为logo的惰性初始化派生字段和validLogo字段来标记徽标中的值已经过验证。当bean.logoName发生更改(再次需要加载)时,validLogo字段应重置为false。

@Named
@ViewScoped
public class MyBean
{
  // Attributes
  private String logoName;

  // Derived attributes
  private boolean validLogo;
  private Document logo;

  public String getLogoName()
  {
    return logoName;
  };

  public void setLogoName( String logoName_ )
  {
    logoName = logoName_;
    validLogo = false;
  };

  public boolean isLogoExist()
  {
    if ( !validLogo )
      validateLogo();
    return logo != null;
  }

  protected void validateLogo()
  {
    // The magic takes place here to load the image into the logo field
  }

}

小脸:

<p:outputPanel rendered="#{myBean.logoExist}" styleClass="logo-class">
  <picture>
    <p:graphicImage value="#{myBean.logo}" alt="#{cc.attrs.name} - #{cc.attrs.location}" />
  </picture>
</p:outputPanel>

在这种情况下,重新呈现的页面不希望从文件中重新加载徽标,直到徽标的名称没有更改(或者您没有离开视图)。