Primefaces p:menuitem将属性传递给actionListener

时间:2012-03-29 11:07:09

标签: java jsf jsf-2 primefaces

我想将一些属性传递给actionListener方法。

我的实施就像......

<c:forEach items="${customerProductsBean.userProductList}" var="userProduct">
    <p:panel toggleable="#{true}" toggleSpeed="500" header="#{userProduct.product}" >
       // Some Code... Data Table and Tree Table

        <f:facet name="options">
            <p:menu>
                <p:menuitem value="ProductSetup" actionListener="#{customerProductsBean.getProductSetupData}" >
                      <f:attribute name="userIdParam" value="#{data.userId}"/>
                      <f:attribute name="geCustomerIdParam" value="#{data.geCustomerId}"/>
                      <f:attribute name="acpProductParam" value="#{data.acpProduct}"/>
                </p:menuitem>
                <p:menuitem value="Remove Product" url="#" onclick=""/>
            </p:menu>
        </f:facet>
    </p:panel>
</c:forEach>

在Java Action Listener中

public void getProductSetupData(ActionEvent actionEvent) {
      try {
          String userIdParam = 
     (String)actionEvent.getComponent().getAttributes().get("userIdParam");
          String geCustomerIdParam =
     (String)actionEvent.getComponent().getAttributes().get("geCustomerIdParam");
          String acpProductParam =
     (String)actionEvent.getComponent().getAttributes().get("acpProductParam");
      } catch(Exception e) {
           // Exception
      }
}

我使用<f:attribute><f:param>尝试了它,但无法在Java中获取值。

在java中它为每个值显示null。

1 个答案:

答案 0 :(得分:3)

如果#{data}引用迭代JSF组件(例如<h:dataTable var>)的迭代变量,则无效。 <f:attribute>在JSF视图构建期间设置,而不是在JSF视图渲染时间期间设置。但是,<h:dataTable var>在视图构建期间不可用,它仅在视图渲染时可用。

如果您的环境支持EL 2.2,请改为

<p:menuitem ... actionListener="#{customerProductsBean.getProductSetupData(data)}" />

public void getProductSetupData(Data data) {
    // ...
}

如果您的环境没有,请改为

public void getProductSetupData(ActionEvent event) {
    FacesContext context = FacesContext.getCurrentInstance();
    Data data = context.getApplication().evaluateExpressionGet(context, "#{data}", Data.class);
    // ...
}