基本上我有一个负责显示图像的复合材料。但是此图片包含在<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)
......但仅此而已。可能是什么问题呢?
提前谢谢。
答案 0 :(得分:0)
在boolean
课程中添加一个属性(bean
),告诉您徽标是否存在。
使用fragment
函数呈现<div/>
标记。
示例; 强>
使用核心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>
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>
在这种情况下,重新呈现的页面不希望从文件中重新加载徽标,直到徽标的名称没有更改(或者您没有离开视图)。