0

ビュー内の情報を変更することに関する最初の質問(別の.xhtmlページに移動しないこと)。私の.xhtmlはデータテーブル(人のリストを表示)を表示しますが、誰かの名前の先頭を入力テキストに入力してコマンドボタンをクリックすることで、表示される情報の量をユーザーが絞り込めるようにしたいです。コマンドボタンとデータテーブルはどちらも同じBeanメソッドを実行しますが、inputtextにデータがある場合、SQLはLikeを使用します(これはjdbcを使用します)。私のフォームは以下のとおりです。問題は、管理対象Beanが「成功」または「失敗」ではなくオブジェクトのリストを返すため、「from-view-idで一致するナビゲーションケースを見つけることができません」ということです。また、フォーム全体が非効率的です。これはかなり一般的なシナリオのようです。ナビゲーション命令ではなくオブジェクトを返すマネージドBeanのメソッドを呼び出します。エラーメッセージを取り除くにはどうすればよいですか?これを行うためのより良い方法はありますか?

コードは次のとおりです。

<h:head>
    <h:outputStylesheet library="css" name="table-style.css"  />
</h:head>

<h:body>

    <h1>MavenWeb</h1>

    <h:form>
        <h:panelGrid columns="3">
            Select a customer:

            <h:inputText id="listName" value="#{customer.listName}" 
                size="20" >
            </h:inputText>
            <h:commandButton value="Submit"
                                         action="#customer.getCustomerList()}" />

        </h:panelGrid>



    <h:dataTable value="#{customer.getCustomerList()}" var="c"
            styleClass="order-table"
            headerClass="order-table-header"
            rowClasses="order-table-odd-row,order-table-even-row"
        >

        <h:column>
            <f:facet name="header">
                Customer ID
            </f:facet>
                #{c.customerID}
        </h:column>

        <h:column>
            <f:facet name="header">
                Name
            </f:facet>
                #{c.name}
        </h:column>

        <h:column>
            <f:facet name="header">
                Address
            </f:facet>
                #{c.address}
        </h:column>

        <h:column>
            <f:facet name="header">
                Created Date
            </f:facet>
                #{c.created_date}
        </h:column>

    </h:dataTable>
</h:form>
</h:body>
4

1 に答える 1

1

まず、管理対象BeanにViewScopeがあることを確認します。これにより、同じビューにいる間、すべてのリクエストでフォーム値のみが影響を受けます。次に、ajax動作をに追加し、新しい値で<h:commandButton>レンダリングすることができます。<h:datatable>第3に、属性ゲッター内にビジネスロジックを配置しないでください。これは、JSFフレームワークがそれらのゲッターを2回以上呼び出す可能性があるためです(設計によって異なります)。

これらのルールを使用して、次のようにコードを再作成できます。

@ViewScoped
@ManagedBean
public class Customer {
    private String listName;
    private List<CustomerDTO> customerList;

    public Customer() {
        listName = "";
        customerList = null; //maybe you can initialize your list here
    }

    //getters and setters...

    //look that this method returns a void (no need to return a navigation rule)
    public void fillCustomerList() {
        //your method/way to fill the customerList goes here...
        //I'll just put a code example
        customerList = new ArrayList<CustomerDTO>();
        customerList.add(new CustomerDTO(1, "Luiggi Mendoza", "Lima", new Date());
        customerList.add(new CustomerDTO(2, "StackOverflow", "Web", new Date());
    }

}

ページのコードフラグメント

<h:form>
    <h:panelGrid columns="3">
        Select a customer:
        <h:inputText id="listName" value="#{customer.listName}" size="20" />
        <h:commandButton value="Submit" action="#customer.fillCustomerList}">
            <f:ajax execute="@this" render="dtMyDataTable" />
        </h:commandButton>
    </h:panelGrid>

    <h:dataTable id="dtMyDataTable" value="#{customer.customerList}" var="c"
        styleClass="order-table"
        headerClass="order-table-header"
        rowClasses="order-table-odd-row,order-table-even-row">
        <h:column>
            <f:facet name="header">
                Customer ID
            </f:facet>
            #{c.customerID}
        </h:column>
        <h:column>
            <f:facet name="header">
                Name
            </f:facet>
            #{c.name}
        </h:column>
        <h:column>
            <f:facet name="header">
                Address
            </f:facet>
            #{c.address}
        </h:column>
        <h:column>
            <f:facet name="header">
                Created Date
            </f:facet>
            #{c.created_date}
        </h:column>
     </h:dataTable>
</h:form>

この問題に関する詳細情報:

于 2012-07-27T03:18:13.637 に答える