【问题标题】:<f:param> tags in composite component for surrounding <h:outputLink> and strange behaviour of <c:forEach>复合组件中的 <f:param> 标记用于围绕 <h:outputLink> 和 <c:forEach> 的奇怪行为
【发布时间】:2014-01-09 11:47:11
【问题描述】:

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

现在有两个问题:

  1. &lt;f:param /&gt; 标签不影响周围&lt;h:outputLink&gt; 生成的URL
  2. &lt;c:forEach&gt; 不会遍历从请求属性中检索到的列表。

总的来说,整个组件的行为有点奇怪,因为我可以访问列表的特定元素并输出它的值。但是,一旦涉及到&lt;c:forEach&gt;,循环就不会输出任何内容。

组件目前如下所示:

<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>

我的问题:

  • 为什么我可以访问特定的列表项,但 &lt;c:forEach&gt; 却什么也没做?
  • 为什么链接 URL 至少不受单个 &lt;f:param&gt; 标记的影响?
  • 是否甚至可以将&lt;f:param&gt;标签从内部复合组件输出到周围的链接?

【问题讨论】:

  • 嘿,marius,希望您已经解决了所描述的问题。如果是这样,请确认下面的答案。 :-)
  • 我当然会,刚回到办公室。我试过&lt;ui:repeat&gt; 并没有改变任何东西。所以不可能生成影响周围链接的&lt;f:param&gt;标签。我最终只使用了一个带有静态参数名称的&lt;f:param&gt;

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


【解决方案1】:

对于 JSF,复合组件是一个自己的 UIContainer。所以h:outputLink-tag 不会将&lt;f:param /&gt; 视为其自身的直接子代,这就是为什么会忽略它的原因。您可以通过将标签实现为复合组件而不是 Facelet 自定义组件来解决此问题(参见 "how-to-make-a-grid-of-jsf-composite-component" 示例)。 taglib-xml 或多或少只是指向要包含的,这并不是更多的偏移量。

关于&lt;c:forEach /&gt;:JSTL-Core 属性在某些位置破坏了 JSFcode,因为它们在 JSF 之前被渲染。在这种情况下,为什么不尝试将&lt;c:forEach /&gt; 替换为&lt;ui:repeat /&gt; 呢?

希望对你有帮助...

【讨论】:

  • 我想过一个自定义组件,但认为它可能太重了,但显然不是。不幸的是,您的回答被截断了。我应该用什么替换&lt;c:foreach&gt;
  • 嗨,马吕斯。好的,纠正错字。好吧,自定义组件并没有那么多工作。有时我什至更喜欢它,因为它处理给定的参数(方法、bean 等)比复合组件更好,更容易出错。如果我找到一个很好的教程,我会把它附在答案上,太......祝你工作顺利! L.
猜你喜欢
  • 2021-10-20
  • 2012-01-06
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多