复合组件中的<f:param>标签用于包围<h:outputlink>和<c:foreach>的奇怪行为</c:foreach> </h:outputlink> </f:param>

时间:2014-01-09 11:47:11

标签: jsf jsf-2 jstl facelets composite-component

我需要编写一个放在<h:outputLink>...</h:outputLink>标记内并输出<f:param ... />标记的复合组件。生成的<f:param />标记的来源是由过滤器设置的请求属性,其中包含提供属性namevalue的值的对象列表。

现在有两个问题:

  1. <f:param />代码不会影响周围<h:outputLink>
  2. 生成的网址
  3. <c:forEach>不会迭代从请求属性中检索到的列表。
  4. 一般情况下,整个组件的行为有点奇怪,因为我可以访问列表的特定元素并输出其值。但是,一旦涉及<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>标签到周围的链接吗?

1 个答案:

答案 0 :(得分:1)

对于JSF,Composite Components是一个自己的UIContainer。因此,h:outputLink - 标记看不到<f:param />是其自身的直接子项,这就是为什么会忽略它。您可以通过将标记实现为复合组件而不是Facelet自定义组件来解决这个问题(请参阅"how-to-make-a-grid-of-jsf-composite-component"作为示例)。 taglib-xml或多或少仅指向要包含的,这不是更多的偏移量。

关于<c:forEach />:JSTL-Core属性在某些位置上破坏了JSFcode,因为它们在JSF之前呈现。在这种情况下,为什么不尝试将<c:forEach />替换为<ui:repeat />

希望它有所帮助...