在<ui:repeat>中重复<f:verbatim> </ui:repeat> </f:verbatim>

时间:2011-04-10 16:29:40

标签: java jsf jsf-2 facelets

我有一个@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>,但无所事事。

任何解决方案?

2 个答案:

答案 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数据模型?

在JEE5(JSF 1.2)中的

- 可以是由seam进行管理的@Factory("bean.list") List<> produceList()...它将是视图范围的(实际上是页面范围的)。

并且在JEE6(JSF 2.0)中,您可以使用与CDI相同的模式。

或者您可以为列表实现相同的生命周期并创建自己的解决方案。