我需要编写一个放在<h:outputLink>...</h:outputLink>
标记内并输出<f:param ... />
标记的复合组件。生成的<f:param />
标记的来源是由过滤器设置的请求属性,其中包含提供属性name
和value
的值的对象列表。
现在有两个问题:
<f:param />
代码不会影响周围<h:outputLink>
<c:forEach>
不会迭代从请求属性中检索到的列表。一般情况下,整个组件的行为有点奇怪,因为我可以访问列表的特定元素并输出其值。但是,一旦涉及<c:forEach>
,循环就不会输出任何内容。
该组件目前看起来如下:
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:cc="http://xmlns.jcp.org/jsf/composite"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- INTERFACE -->
<cc:interface>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<!-- works, outputs e.g. 'confirmationData' -->
#{activeContentThreadList[0].name}
<!-- does not work, link URL is unaffected -->
<f:param name="#{activeContentThreadList[0].displayName}"
value="#{activeContentThreadList[0].token}" />
<!-- works, outputs e.g. '[some.package.class@7951a73c]' -->
<h:outputText value="#{activeContentThreadList}" />
<!-- does not work, nothing is outputted -->
<c:forEach items="#{activeContentThreadList}" var="asd">
<h:outputText value="#{asd.name}" />
<h:outputText value="test in loop" />
</c:forEach>
</cc:implementation>
</f:view>
该组件使用如下:
<h:outputLink value="#{request.contextPath}/confirmation/fields/ordersearch.xhtml" styleClass="ext">
<cst:activeThreads />
</h:outputLink>
我的问题:
<c:forEach>
没有做任何事情?<f:param>
代码?<f:param>
标签到周围的链接吗?答案 0 :(得分:1)
对于JSF,Composite Components是一个自己的UIContainer。因此,h:outputLink
- 标记看不到<f:param />
是其自身的直接子项,这就是为什么会忽略它。您可以通过将标记实现为复合组件而不是Facelet自定义组件来解决这个问题(请参阅"how-to-make-a-grid-of-jsf-composite-component"作为示例)。 taglib-xml或多或少仅指向要包含的xhtml,这不是更多的偏移量。
关于<c:forEach />
:JSTL-Core属性在某些位置上破坏了JSFcode,因为它们在JSF之前呈现。在这种情况下,为什么不尝试将<c:forEach />
替换为<ui:repeat />
?
希望它有所帮助...