我正在尝试将JSP页面转换为JSF(不允许使用JSP代码),但偶然发现了一个问题。 注意:这是学术性的,所以没有“脏”的解决方案。
我有jsp代码,根据各种条件设置图像的图像源和替代文本。有连接和切换条件。这是一个循环。
现在,我可以重现遍历所有值的循环,如下所示:
<ui:repeat value="#{gameapi.game.fieldsList}" var="field">
<h:graphicImage id="field#{field.fieldNr}" styleClass="field#{field.fieldNr}"
url="..." alt="" title=""/>
</ui:repeat>
但是,图片网址和替代文字共有20多种组合。显然,我怀疑为每种可能性编写一个有条件渲染或选择的graphicImage标签是一个优雅的解决方案,因为这只会使每个额外的组合变得更加丑陋。 我也无法在底层java代码中创建这些字符串,因为这会违反分离视图,模型和控制器的想法。
那么这样做的最佳解决方案是什么?这似乎是JSF的巨大弱点。
答案 0 :(得分:1)
考虑使用MVVM模式的变体。您可以拥有专用于查看与业务逻辑托管bean分离的逻辑的托管bean。
<ui:repeat value="#{bizBean.list}" var="_row">
<h:graphicImage
url="#{viewModelBean.images[_row.outcome]}"
alt="#{viewModelBean.alts[_row.outcome]}"
title="#{viewModelBean.titles[_row.outcome]}" />
</ui:repeat>
viewModelBean
可以是具有一堆地图属性的应用程序范围类型。这假设一个相对简单的情况,但该模式适合更复杂的要求。
注意:重复控件应为NamingContainer,因此尝试在VDL中设置client identifier是多余的。有关详情,请参阅here。