我有一个 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;
此时调用传递 'item' 的方法 #{transactions_byaccount.updateCategory('', item)} 按预期工作。
用户还可以通过选择绑定到上面 accountId 字段的页面上的下拉菜单并单击刷新按钮来更改帐户 ID,该按钮将调用相关 DAO 以获取所选帐户的交易列表。但是,当用户单击按钮调用 #{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>