0

以下のような一連のトランザクションをリストするViewScoped Beanに裏打ちされたjsfページがあります

<ui:repeat value="#{transactions_byaccount.pageList}" var="item">
            <tr class="dataRow">
                <td class="dataCell cltdtransactionsdatetransaction">
                      <h:outputText value="#{item.datetransaction}" >
                        <f:convertDateTime pattern="EEE dd-MMM-yyyy HH:mm" />
                      </h:outputText>
                </td>
                ...
                ...

                <td colspan="2">
                    <span class="pagerDBspan" style="font-weight: bold;">
                        <h:commandLink action="#{transactions_byaccount.updateCategory('', item)}" >
                            <h:outputText value="Update"></h:outputText>        
                            <f:param name="pageNo" value="#{param.pageNo}" />
                            <f:param name="accountId" value="#{param.accountId}" />
                            <f:param name="sortOrder" value="#{param.sortOrder}" />
                            <f:param name="orderColumn" value="#{param.orderColumn}" />                                                                         
                        </h:commandLink>
                    </span>                                         
                </td>

ユーザーがページに移動すると、リンクには accountId がパラメーターとして渡され、以下のように Bean の管理プロパティにマップされます

@ManagedProperty("#{param.accountId}")
private int accountId;

この時点で #{transactions_byaccount.updateCategory('', item)} メソッドを呼び出して「item」を渡すと、期待どおりに機能します。

ユーザーは、上記の accountId フィールドにバインドされているページのドロップダウンを選択し、関連する DAO を呼び出して選択したアカウントのトランザクションのリストを取得する更新ボタンをクリックすることで、アカウント ID を変更することもできます。ただし、ユーザーがボタンをクリックして #{transactions_byaccount.updateCategory('', item)} を呼び出すと、新しいアカウントのアイテムがリストされず、最初のアカウントのリストのアイテムが使用されます。

問題は、JSF ライフサイクルの復元ビットの時点にあるようです。

どんな助けでも大歓迎です。必要に応じて詳細を追加します。

ありがとうマニ

編集:私の豆

package applogic.transactions;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import applogic.Conns;

import finance.bean.TransactionsListBean;
import finance.dao.AccountsDAO;
import finance.dao.TransactionsDAO;
import finance.daobase.BusinessDAO;
import finance.model.Accounts;
import finance.model.Transactions;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@ManagedBean(name = "transactions_byaccount")
@ViewScoped
public class Transactions_Byaccount extends TransactionsListBean implements Serializable {
    List<Transactions> resultList;

    boolean initialized;

    @ManagedProperty("#{param.accountId}")
    private int accountId;

    public SelectItem[] accountsSelections;

    @ManagedProperty("#{param.sortOrder}")
    private int sortOrder;

    public SelectItem[] sortOrderSelections;

    @ManagedProperty("#{param.orderColumn}")
    private int orderColumn;

    public SelectItem[] orderColumnSelections;

    public Transactions_Byaccount() {
         Connection cons = Conns.getConFinanceDB();
         List<Accounts> accountsList = AccountsDAO.List(cons);
         List<SelectItem> listOfAccountsSelectItems = new
         ArrayList<SelectItem>();

         for( Accounts temp : accountsList ) {
             listOfAccountsSelectItems.add(new SelectItem(temp.getId(), temp.getTitle()));
         }

         accountsSelections = listOfAccountsSelectItems.toArray(new SelectItem[listOfAccountsSelectItems.size()]);

         List<SelectItem> sortOrderList = new ArrayList<SelectItem>();
         sortOrderList.add(new SelectItem(1, "Asc"));
         sortOrderList.add(new SelectItem(2, "Desc"));       
         sortOrderSelections = sortOrderList.toArray(new SelectItem[sortOrderList.size()]);

         List<SelectItem> orderColumnList = new ArrayList<SelectItem>();
         orderColumnList.add(new SelectItem(1, "Transaction Date"));
         orderColumnList.add(new SelectItem(2, "Action Date"));      
         orderColumnList.add(new SelectItem(3, "Reconciled Date"));
         orderColumnSelections = orderColumnList.toArray(new SelectItem[orderColumnList.size()]);
    }

    public String updateCategories(String redirectURL) {
        String result = redirectURL;

        Connection cons = Conns.getConFinanceDB();
        for( Transactions temp : (List<Transactions>)this.getPageList() )
            TransactionsDAO.Update(cons, temp);

        resultList = null;

        if( redirectURL != null && redirectURL.length() == 0 )
            redirectURL = null;

        return redirectURL;
    }

    public String updateCategory(String redirectURL, Transactions arg) {
        String result = redirectURL;

        Connection cons = Conns.getConFinanceDB();
        TransactionsDAO.Update(cons, arg);

        resultList = null;

        if( redirectURL != null && redirectURL.length() == 0 )
            redirectURL = null;

        return result;
    }

    @PostConstruct
    public void refresh() {
        Connection con = Conns.getConFinanceDB();
        resultList = TransactionsDAO.ListByaccount(con, accountId, getCurrentPageNo(), getPageSize(), orderColumn, sortOrder);
        initialized = true;

    }

    public void reload() {
        Connection con = Conns.getConFinanceDB();
        resultList = TransactionsDAO.ListByaccount(con, accountId, getCurrentPageNo(), getPageSize(), orderColumn, sortOrder);
        initialized = true;

    }

    public String reload(String returnUrl) {
        Connection con = Conns.getConFinanceDB();
        resultList = TransactionsDAO.ListByaccount(con, accountId, getCurrentPageNo(), getPageSize(), orderColumn, sortOrder);
        initialized = true;     
        return returnUrl;
    }

    public Object getPageList() {


        return resultList;
    }

    public int getMaxCount() {
        Connection con = Conns.getConFinanceDB();
        int result = TransactionsDAO.CountByaccount(con, accountId);
        return result;
    }

    public int getAccountId() {
        return accountId;
    }

    public void setAccountId(int accountId) {
        this.accountId = accountId;
    }

    public SelectItem[] getAccountsSelections() {
        return accountsSelections;
    }

    public void setAccountsSelections(SelectItem[] accountsSelections) {
        this.accountsSelections = accountsSelections;
    }

    public int getSortOrder() {
        return sortOrder;
    }

    public void setSortOrder(int sortOrder) {
        this.sortOrder = sortOrder;
    }

    public SelectItem[] getSortOrderSelections() {
        return sortOrderSelections;
    }

    public void setSortOrderSelections(SelectItem[] sortOrderSelections) {
        this.sortOrderSelections = sortOrderSelections;
    }

    public int getOrderColumn() {
        return orderColumn;
    }

    public void setOrderColumn(int orderColumn) {
        this.orderColumn = orderColumn;
    }

    public SelectItem[] getOrderColumnSelections() {
        return orderColumnSelections;
    }

    public void setOrderColumnSelections(SelectItem[] orderColumnSelections) {
        this.orderColumnSelections = orderColumnSelections;
    }   

    public boolean isInitialized() {
        return initialized;
    }

    public void setInitialized(boolean initialized) {
        this.initialized = initialized;
    }

    public List<Transactions> getResultList() {
        return resultList;
    }

    public void setResultList(List<Transactions> resultList) {
        this.resultList = resultList;
    }
}

そして今、私のページ

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en">


<ui:composition template="/WEB-INF/templates/template_main.xhtml">
    <ui:param name="title" value="transactions"></ui:param>

    <ui:define name="operationalbar">
        <div>
            <span>
                <h:selectOneMenu value="#{transactions_byaccount.accountId}" >
                    <f:selectItems value="#{transactions_byaccount.accountsSelections}"/>
                </h:selectOneMenu>
            </span>
            <span>
                <h:commandLink action="#{transactions_byaccount.reload('')}">
                    <h:outputText value="Reload"></h:outputText>
                    <f:param name="pageNo" value="#{param.pageNo}" />
                    <f:param name="accountId" value="#{param.accountId}" />
                    <f:param name="sortOrder" value="#{param.sortOrder}" />
                    <f:param name="orderColumn" value="#{param.orderColumn}" />
                </h:commandLink>
            </span>         
            <span>
                <h:commandLink action="#{transactions_byaccount.updateCategories('')}">
                    <h:outputText value="Update Categories"></h:outputText>
                    <f:param name="pageNo" value="#{param.pageNo}" />
                    <f:param name="accountId" value="#{param.accountId}" />
                    <f:param name="sortOrder" value="#{param.sortOrder}" />
                    <f:param name="orderColumn" value="#{param.orderColumn}" />
                </h:commandLink>        
            </span>
        </div>
    </ui:define>

    <ui:define name="pagingbar">
        <div>
            <span>
                <h:commandLink title="Go to page first page" >
                    <h:outputText value="first"></h:outputText>
                        <f:param name="pageNo" value="#{transactions_byaccount.firstPage}" />
                        <f:param name="accountId" value="#{param.accountId}" />
                        <f:param name="sortOrder" value="#{param.sortOrder}" />
                        <f:param name="orderColumn" value="#{param.orderColumn}" />             
                </h:commandLink>
            </span>
            <span>
                <h:commandLink title="Go to page prev page">
                    <h:outputText value="prev"></h:outputText>
                        <f:param name="pageNo" value="#{transactions_byaccount.prevPage}" />
                        <f:param name="accountId" value="#{param.accountId}" />
                        <f:param name="sortOrder" value="#{param.sortOrder}" />
                        <f:param name="orderColumn" value="#{param.orderColumn}" />
                </h:commandLink>

            </span>
                <ui:repeat value="#{transactions_byaccount.pages}" var="item">
                    <span style="font-weight: #{item == transactions_byaccount.currentPageNo ? 'bold' : 'lighter' }">
                        <h:commandLink>
                            <h:outputText value="#{item}"></h:outputText>
                            <f:param name="pageNo" value="#{item}" />
                            <f:param name="accountId" value="#{param.accountId}" />
                            <f:param name="sortOrder" value="#{param.sortOrder}" />
                            <f:param name="orderColumn" value="#{param.orderColumn}" />

                        </h:commandLink>
                    </span>
                </ui:repeat>                

            <span>
                <h:commandLink title="Go to page next page">
                    <h:outputText value="next"></h:outputText>
                        <f:param name="pageNo" value="#{transactions_byaccount.nextPage}" />
                        <f:param name="accountId" value="#{param.accountId}" />
                        <f:param name="sortOrder" value="#{param.sortOrder}" />
                        <f:param name="orderColumn" value="#{param.orderColumn}" />
                </h:commandLink>
            </span>
            <span>
                <h:commandLink title="Go to page last page">
                    <h:outputText value="last"></h:outputText>
                        <f:param name="pageNo" value="#{transactions_byaccount.lastPage}" />
                        <f:param name="accountId" value="#{param.accountId}" />
                        <f:param name="sortOrder" value="#{param.sortOrder}" />
                        <f:param name="orderColumn" value="#{param.orderColumn}" />

                </h:commandLink>                
            </span>         
        </div>
        <div class="currentPagerIndex">

        </div>
    </ui:define>
    <ui:define name="maincontent">
        <table class="datatable">
            <thead>
                <tr class="headRow">
                    <td>datetransaction</td>
                    <td>description</td>
                    <td>amount</td>
                    <td>Edit</td>
                    <td>Delete</td>
                </tr>
            </thead>
            <ui:repeat value="#{transactions_byaccount.pageList}" var="item">
                <tr class="dataRow">
                    <td class="dataCell cltdtransactionsdatetransaction">
                          <h:outputText value="#{item.datetransaction}" >
                            <f:convertDateTime pattern="EEE dd-MMM-yyyy HH:mm" />
                          </h:outputText>
                    </td>
                    <td class="dataCell cltdtransactionsdescription">#{item.description}</td>
                    <td class="dataCell cltdtransactionsamount">#{item.amount}</td>
                    <td style="width: 45px">
                        <span class="pagerDBspan" style="font-weight: bold;">                   
                            <h:link outcome="transactions_edit" style="font-weight: bold;">
                                <h:outputText value="Edit"></h:outputText>
                                <f:param name="pageNo" value="#{param.pageNo}" />
                                <f:param name="itemId" value="#{item.id}" />
                            </h:link>
                        </span>                 
                    </td>
                    <td style="width: 45px">
                        <span class="pagerDBspan" style="font-weight: bold;">
                            <h:link  outcome="transactions_edit" >
                                <h:outputText value="Delete"></h:outputText>
                                <f:param name="pageNo" value="#{param.pageNo}" />
                                <f:param name="itemId" value="#{item.id}" />
                                <f:param name="deleteFlag" value="true" />                                  
                            </h:link>       
                        </span>                 
                    </td>
                </tr>
                <tr class="dataRow">
                    <td class="dataCell"></td>
                    <td class="dataCell" colspan="2">
                        <h:selectOneMenu value="#{item.fkCategoriesId}" >
                            <f:selectItems value="#{categories_edit.categories}"/>
                        </h:selectOneMenu>
                    </td>
                    <td colspan="2">
                        <span class="pagerDBspan" style="font-weight: bold;">
                            <h:commandLink action="#{transactions_byaccount.updateCategory('', item)}" >
                                <h:outputText value="Update"></h:outputText>        
                                <f:param name="pageNo" value="#{param.pageNo}" />
                                <f:param name="accountId" value="#{param.accountId}" />
                                <f:param name="sortOrder" value="#{param.sortOrder}" />
                                <f:param name="orderColumn" value="#{param.orderColumn}" />                                                                         
                            </h:commandLink>
                        </span>                                         
                    </td>
                </tr>
                <tr>
                    <td class="cssBottomLine" colspan="0"></td>
                </tr>                   
            </ui:repeat>
        </table>
    </ui:define>

    <ui:define name="bottomoperationalbarhost">
    </ui:define>

</ui:composition>
</html>
4

1 に答える 1

0

#{transactions_byaccount.pageList}これは、フォームの表示中と比較して、フォーム送信の処理中に互換性のない変更が行われた場合に発生します。

フォーム送信を処理する新しいHTTPリクエスト中に、JSFはそれを繰り返して、呼び出されたアクションを見つけ、それ#{item}を渡すための準備をします。したがって、これは、表示用にHTMLフォームをレンダリングするHTTPリクエスト中には準備されないことに注意してください。

この問題は、#{transactions_byaccount.pageList}互換性のない変更を引き起こした古い(または新すぎる)変数に基づいて初期化していることを示しています。あなたはそれをすべきではありません。ポストバックで表示中とまったく同じリストで初期化されるようにBeanロジックを書き直してから、アクションが実際に呼び出されたときのみ(つまり、actionメソッド内で)変更する必要があります。

ビュースコープのBeanを使用している場合、後続のリクエストのすべてのプロパティを実際に記憶しているため、実際にはすでに設定されている必要があります。おそらく、リストのgetterメソッドで初期化を実行しています。getterメソッドでビジネスロジックを実行するべきではありません。これは、(ポスト)コンストラクターまたはアクションメソッドで行う必要があります。

于 2012-12-17T12:32:23.900 に答える