2

如何将对象传递给命令按钮的操作方法?我使用作为复合组件基础的数据表。复合组件应该提供交换添加到数据表行中的按钮的可能性。我以为我可以通过方面实现这一点,但是我在将对象从数据表列表传递到操作方法时遇到问题,既不是直接通过 EL 也不是通过属性操作侦听器。

看法:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:p="http://primefaces.org/ui"
  xmlns:customer="http://java.sun.com/jsf/composite/components/customer">

<ui:composition template="/WEB-INF/templates/template.xhtml">

  <ui:define name="content">

    <h:form id="customerList">

      <customer:list list="#{customerControllerBean.list}">
        <f:facet name="rowButton">
          <h:commandButton value="#{msg.deleteButtonLabel}"
        action="#{customerControllerBean.delete(customer)}" />

          <h:commandButton value="#{msg.deleteButtonLabel}" action="#{customerControllerBean.deleteCustomer}">
        <f:setPropertyActionListener target="#{customerControllerBean.customer}" value="#{customer}"/>
          </h:commandButton>

          <h:button outcome="customerdetail.jsf?id=#{customer.id}"
        value="#{msg.editButtonLabel}" />
        </f:facet>
      </customer:list>

    </h:form>

  </ui:define>

</ui:composition>

</html>

使用以下复合组件customer:list

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:p="http://primefaces.org/ui"
  xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface>
  <composite:attribute name="list" />
  <composite:facet name="rowButton" />
</composite:interface>

<composite:implementation>

  <p:dataTable id="customer" var="customer" value="#{cc.attrs.list}">
    ...
    <p:column>
      <composite:renderFacet name="rowButton" />
    </p:column>
  </p:dataTable>

</composite:implementation>
</html>

支持bean:

@Named
@ConversationScoped
public class CustomerControllerBean implements Serializable {

    private static final long serialVersionUID = 6168621124401208753L;

    List<Customer> allCustomers = null;
    private Customer customer;

    // setters and getters ...

@PostConstruct
public void loadAllCustomers() {
    // load customers
}

public List<Customer> getList() {
    return allCustomers;
}

    public String delete(Customer customer) {
        // delete customer...
        return "deleted";
    }

    public String deleteCustomer() {
        // delete customer...
        return "deleted";
    }

在这种情况下不能将对象传递给方法吗?

4

1 回答 1

1

由于您使用的是 Primefaces,您可以利用其数据表功能(如属性和事件)来设置模型。

使用 Primefaces 的 DataTable 功能

在您的控制器中,您可以指定模型和要对其执行的操作,在这种情况下,我使用 EJB 作为示例。

@ManagedBean
@ViewScoped
public class CustomerBean 
{
    private Customer model;

    @EJB
    private CustomerService cs;

    public void rowSelected()
    {
        // log or do stuff
    }

    public void delete()
    {
        cs.delete(model);
    }

    // getters & setters
}

然后您在数据表中指定selectionModeselection属性,并将selection其映射到您的模型。

<p:dataTable id="dtModel" var="row" value="#{bean.list}" selectionMode="single" selection="#{bean.model}">
    <p:ajax event="rowSelect" process="@this" listener="#{bean.rowSelected}" update=":content" />
</p:datatable>

在这种情况下,我在标签中使用了一个侦听器,p:ajax但这只是一个示例,如果您希望在选择模型后对其进行某些操作,它可能很有用,但不需要设置您的模型。您的模型将使用 bean 的 setter 方法进行设置。

将行作为参数传递

在您的控制器中,您指定接收模型作为参数的方法。

@ManagedBean
@ViewScoped
public class CustomerBean 
{
    @EJB
    private CustomerService cs;

    public void delete(Customer candidate)
    {
        cs.delete(candidate);
    }

    // getters & setters
}

在您的数据表中,您使用row属性中指定的对象var

<p:dataTable id="dtModel" var="row" value="#{bean.list}">
    <p:column headerText="name">
        <h:outputText value="#{row.name}" />
    </p:column>
    <p:column headerText="delete">
        <p:commandButton value="delete" actionListener="#{bean.delete(row)}" />
    </p:column> 
</p:datatable>

我更喜欢使用第一个示例,因为它允许您通过选择一行然后对其执行各种操作来设置模型,例如删除、编辑或查看其详细信息。您可以通过检查是否选择模型等来启用或禁用 UI 上的按钮...

暗示

您可以使用简单的 Facelets 模板来创建简单的 taglib,而不是复合组件。它们通常工作正常,唯一的缺点是您无法强制使用这些组件的接口。

您还可以查看 PrimeFaces展示,其中有很多有用的示例。

我希望它有所帮助。

于 2012-09-22T22:51:52.107 回答