2

commandButton のアクション メソッドにオブジェクトを渡すにはどうすればよいですか? 複合コンポーネントの基礎となるデータテーブルを使用しています。複合コンポーネントは、データテーブルの行に追加されるボタンを交換する可能性を提供する必要があります。私はこれをファセットで実現できると思っていましたが、オブジェクトをデータテーブルリストからアクションメソッドに渡す際に問題があり、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 のセッター メソッドを使用して設定されます。

パラメータとして行を渡す

コントローラーで、モデルをパラメーターとして受け取るメソッドを指定します。

@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 に答える