0

リストから入力されるデータテーブルを含むページがあります。リストには多くの ID があり、これを Bean メソッドに渡してデータベース操作を実行する必要があります。コマンド ボタンのレンダリングされた属性を使用して、Bean メソッド (findInfo()) を呼び出しています。ブール値を取得できるように、ID (myBean.testList.id) をリストから一度に 1 つずつこの Bean メソッドに渡す必要があります。まず、ID を (Bean の findInfo メソッドに) 渡す方法がわかりません。次に、タグを使用すると、1 つの ID だけを送信することになります。誰でも私に解決策を提案してもらえますか。以下のようなコードでやってみました。

マイビーン

@ManagedBean(name="myBean")
public class MyBean(){

  public boolean findInfo(Integer indId){
    boolean var = dataProvider.isIdPresent(indId); // database operation
    if (var)
        return true;
    else 
        return false;
  }
}

xhtml ページ

<h:dataTable value="#{myBean.testList}" var="t" >

  <h:column>
    <f:facet name="header">
        <h:outputText value="Actions" />
    </f:facet>

    <h:commandButton value = "Add"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == false}"/>

    <h:commandButton value = "View"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == true}"/>

</h:column>
<h:column>
...
</h:column>
</h:dataTable>

更新: BalusC が説明した (kolossus が投稿した) という回答に従おうとしましたが、f:param で ID を null として渡すことになります。助言がありますか。私の更新されたコード:

<h:dataTable value="#{myBean.testList}" var="t" >

<h:column>
    <f:facet name="header">
        <h:outputText value="Actions" />
    </f:facet>


    <h:commandButton value = "Add"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == false}">
        <f:param name="id" value="#{t.id}" /> 

    </h:commandButton>

    <h:commandButton value = "View"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == true}">
        <f:param name="id" value="#{t.id}" /> 
    </h:commandButton>

</h:column>
<h:column>
...
</h:column>

私の更新された Bean

@ManagedBean(name="myBean")
@RequestScoped
public class MyBean(){

@ManagedProperty("#{param.id}")
private Integer indId;

public boolean findInfo(){
    boolean var = dataProvider.isIndIdPresent(indId);
    if (var)
        return true;
    else 
        return false;
}
}

また、同じビュー内のデータ テーブルから Bean を呼び出しているため、f:ViewParam を使用できないと思います。

4

1 に答える 1

2

まず、Bean を として宣言する必要があります@ViewScoped。次に、findInfo次のようにメソッドを保持できます。

@ManagedBean(name="myBean")
@ViewScoped
public class MyBean(){
    private List testList;    

    public boolean findInfo(Integer indId){ ... }

    // Getters and Setters
}

次のスニペットは、仕事をする必要があります。

<h:dataTable value="#{myBean.testList}" var="t" >
    <h:column>
        <h:commandButton value="Add" action="#{someBean.loadReport}"
                         rendered="#{not myBean.findInfo(t.id)}" />

        <h:commandButton value="View" action="#{someBean.loadReport}"
                         rendered="#{myBean.findInfo(t.id)}" />
    </h:column>
</h:dataTable>

更新: EL 2.2 を使用していないため、テーブルをレンダリングする前に各行のブール値を処理する必要がある場合があります。ブール値を含むダミーオブジェクトの内部にオブジェクトをラップするとtestList、仕事をする必要があります:)。このようなもの:

@ManagedBean(name="myBean")
@ViewScoped
public class MyBean(){
    private List<DummyObject> testList;    

    @PostConstruct
    public boolean prepareTestList(){ 
        // Initiate test list
        List<AnObject> oriList = ....;

        // Process oriList to create a testList
        this.testList = new LinkedList();
        for (AnObject o : oriList) {
            DummyObject do = new DummyObject();
            do.setObject(o);
            do.setIdPresent(findInfo(o.getId()));
            this.testList.add(do);
        }
    }

    public boolean findInfo(Integer indId) { ... }

    public class DummyObject {
       private boolean  idPresent;
       private AnObject object;

       // Getters and Setters
    }

    // Getters and Setters
}

次に、rendered属性は次のようになります。

<h:commandButton value="View" action="#{someBean.loadReport}"
                 rendered="#{t.idPresent}" />
于 2013-03-29T07:42:05.323 に答える