我有一个@ViewScoped
bean,其中List<String>
包含纯HTML。我想迭代这个列表并输出普通的html:
<c:forEach items="#{bean.list}" var="html">
<f:verbatim>#{html}</f:verbatim>
</c:forEach>
上面的代码片段运行良好但是当刷新页面时,会调用bean costrunctor。此问题/错误已知:JSTL c:forEach causes @ViewScoped bean to invoke @PostConstruct on every request
因此建议将<c:forEach>
替换为<ui:repeat>
。
<ui:repeat value="#{bean.list}" var="html">
<f:verbatim>#{html}</f:verbatim>
</ui:repeat>
但这不起作用。我有一个空白页面。我尝试了<h:dataTable>
,<a4j:repeat>
和<rich:dataTable>
,但无所事事。
任何解决方案?
答案 0 :(得分:4)
改为使用<h:outputText escape="false">
。
<ui:repeat value="#{bean.list}" var="html">
<h:outputText value="#{html}" escape="false" />
</ui:repeat>
<f:verbatim>
是一个旧的面向JSP的标记,它旨在能够在JSF 1.0 / 1.1中的JSF组件中嵌入纯HTML。没有它,所有纯HTML都将在 JSF组件树之前呈现。这种不直观的行为在JSF 1.2中得到修复,这使得标签变得多余。在Facelets中它也是多余的,在Facelets 2.0(对于JSF 2.0)中,甚至已弃用。另请参阅tag documentation的介绍性文本。不要使用它。如果您想渲染未转义的HTML,请使用上面示例中建议的<h:outputText escape="false">
。如果您想有条件地呈现内联HTML片段,请改为使用<h:panelGroup>
或<ui:fragment>
。
答案 1 :(得分:0)
为什么不使用ViewScoped
数据模型?
- 可以是由seam进行管理的@Factory("bean.list") List<> produceList()...
它将是视图范围的(实际上是页面范围的)。
并且在JEE6(JSF 2.0)中,您可以使用与CDI相同的模式。
或者您可以为列表实现相同的生命周期并创建自己的解决方案。