Jsf 2 为什么要在<;h:commandLink>;不';不要在复合组件内工作

Jsf 2 为什么要在<;h:commandLink>;不';不要在复合组件内工作,jsf-2,composite-component,Jsf 2,Composite Component,我有一个非常简单的JSF 2/Facelets页面,如下所示: <ui:repeat value="#{myBean.names}" var="_name"> <h:commandLink value="#{_name}" action="#{myBean.sayHello(_name)}"> <f:ajax execute="@this"/> </h:commandLink> <br/> </ui:repea

我有一个非常简单的JSF 2/Facelets页面,如下所示:

<ui:repeat value="#{myBean.names}" var="_name">
  <h:commandLink value="#{_name}" action="#{myBean.sayHello(_name)}">
    <f:ajax execute="@this"/>
  </h:commandLink>
  <br/>
</ui:repeat>
<my:myComp value="#{bean.names}">
  <f:facet name="content">
    <h:commandLink value="#{_name}" action="#{bean.sayHello(_name)}">
      <f:ajax execute="@this"/>
    </h:commandLink>
    <br/>
  </f:facet>
</my:myComp>


支持bean提供了一个带有名称的
java.util.List
,操作方法只是将一条
“hello”
消息打印到标准输出

这个很好用。我在浏览器中获得了一个名称列表,单击会触发对指定名称打招呼的操作方法

当我想把这段代码放在一个复合组件中进行迭代并通过一个方面呈现实际链接时,问题就出现了:

<ui:component xmlns="http://www.w3.org/1999/xhtml"
              xmlns:f="http://xmlns.jcp.org/jsf/core"
              xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
              xmlns:cc="http://xmlns.jcp.org/jsf/composite">
  <cc:interface>
    <cc:attribute name="value" type="java.util.List" required="true" />
    <cc:facet name="content" />
  </cc:interface>
  <cc:implementation>
   <ui:repeat value="#{cc.attrs.value}" var="_name">
     <cc:renderFacet name="content"/>
   </ui:repeat>
  </cc:implementation>
</ui:component>

我使用的复合组件如下所示:

<ui:repeat value="#{myBean.names}" var="_name">
  <h:commandLink value="#{_name}" action="#{myBean.sayHello(_name)}">
    <f:ajax execute="@this"/>
  </h:commandLink>
  <br/>
</ui:repeat>
<my:myComp value="#{bean.names}">
  <f:facet name="content">
    <h:commandLink value="#{_name}" action="#{bean.sayHello(_name)}">
      <f:ajax execute="@this"/>
    </h:commandLink>
    <br/>
  </f:facet>
</my:myComp>


在浏览器中,我得到了一个与以前一模一样的名字列表。但是现在点击一个链接就会显示一条“hello null”消息。因此,
\u name
属性中得到正确解析,但在
操作
属性中没有正确解析

我还尝试使用
actionListener
而不是
action
标记中的
listener
属性,没有任何区别

在这个问题上,有人能遮掩一下吗

我的环境:

  • WildFly 8.1和
  • JSF2.2.6(莫哈拉)

在本例中,问题与变量的范围有关
\u name
,在处理
时对其进行一次评估。在我的例子中,我运行了你的代码,它生成了
Hello John
,即使他们是我列表中的其他名字。为了解决这个问题,我引入了一个
,其中包含
\u name
的值,并对代码进行了如下修改:

    <h:form>
        <my:myComp value="#{bean.names}">
            <f:facet name="content">
                <h:commandLink value="#{_name}" action="#{bean.sayHello()}">
                    <f:param name="name_" value="#{_name}"/>
                    <f:ajax execute="@this"/>
                </h:commandLink>
                <br/>
            </f:facet>
        </my:myComp>
    </h:form>
您可以在
@ViewScoped
bean中将其更改为更短的内容,以:

 public void sayHello() {
    Map<String, String> params = FacesContext.getCurrentInstance()
            .getExternalContext().getRequestParameterMap();
    String name = params.get("name_");
    System.out.println("Hello " + name);
}
public void sayHello(){
Map params=FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
String name=params.get(“name_”);
System.out.println(“Hello”+name);
}

最终结果是它正确地打印出了名称。

感谢您的回复。你的变通方法是有效的,事实上我已经有了它(想稍后发布)。不幸的是,您没有解释细节,为什么变量一次(为值)解析,而不是另一次(为操作)。这就是我真正感兴趣的。请你也提供这些信息,好吗?这里有一个很好的例子解释:我很确定,这是不同的。我的代码在复合组件外部工作,不调用任何setter。变量似乎被设置为我可以输出它的值。除此之外,我还尝试在您发布的链接中使用类似的包装器,但在行为上没有任何区别。@JohnYearly,我给了您一个解决方案的投票。但实际问题尚未得到回答。