Jsf 使用f:viewParam发出传递参数

Jsf 使用f:viewParam发出传递参数,jsf,jsf-2,primefaces,actionlistener,Jsf,Jsf 2,Primefaces,Actionlistener,我有一个JSF页面,显示从给定帐户的DB中提取的大量数据项。该页面有一个SelectOne菜单,其中列出了数据库中要选择的所有帐户,还有一个commandButton,用于触发使用新选择的帐户重新加载页面。我的问题是,当我单击commandButton时,页面将重新加载,但不使用新选择的帐户。正在执行方法pullData()中的“else” 我的JSF页面: <f:metadata> <f:viewParam name="account" value="#{accoun

我有一个JSF页面,显示从给定帐户的DB中提取的大量数据项。该页面有一个SelectOne菜单,其中列出了数据库中要选择的所有帐户,还有一个commandButton,用于触发使用新选择的帐户重新加载页面。我的问题是,当我单击commandButton时,页面将重新加载,但不使用新选择的帐户。正在执行方法pullData()中的“else”

我的JSF页面:

<f:metadata>
    <f:viewParam name="account" value="#{accountAnalysisBean.account}" />   
    <f:viewParam name="start" value="#{accountAnalysisBean.start}" />   
    <f:viewParam name="end" value="#{accountAnalysisBean.end}" />       
    <f:event type="preRenderView" listener="#{accountAnalysisBean.pullData}" />  
</f:metadata>

<h:form>
    <p:panelGrid columns="6">
    <f:facet name="header"> 
        <p:selectOneMenu id="pickAccount" value="#{accountAnalysisBean.pickAccount}" required="true">            
            <f:selectItems value="#{editAccountBean.allAccounts}" />                            
            </p:selectOneMenu>        
            <p:calendar id="start" value="#{accountAnalysisBean.start}" />              

        <p:calendar id="end" value="#{accountAnalysisBean.end}" />          

        <p:commandButton value="Get Account" actionListener="#{accountAnalysisBean.updateAccount}" /> 
                <f:param name="start" value="#{accountAnalysisBean.start}"/>
                <f:param name="end" value="#{accountAnalysisBean.end}"/>
                <f:param name="account" value="#{accountAnalysisBean.pickAccount}"/>
            </p:commandButton>
        </f:facet>
    </p:panelGrid>
</h:form>   

我使用的是JSF 2.2和PrimeFaces 4,让我们看看这里可能发生的事情:

  • 将使用定义的setter在初始页面加载时设置
    AccountAnalysisBean
    bean中的值

  • 页面加载完成后,
    AccountAnalysisBean
    就会被销毁:它是一个
    @RequestScoped
    bean

  • 因此,当您单击commandButton时,您将从一个全新的
    AccountAnalysisBean
    副本开始,其中没有任何内容


考虑:

  • 使
    AccountAnalysisBean
    a
    @ViewScoped
    bean
  • 去掉
    actionListener
    ,改用
    action
    属性。根据这里的代码示例,您并不真正需要它
@ManagedBean  
@RequestScoped

public class AccountAnalysisBean {

private String account = "";   
private String id = "";   
private String pickAccount = "";     
private Date start;   
private Date end;  

//----getters and setters----  

public void pullData() {  
    if (account != "") {  
        //pull various fields from database given account value  
    } else {  
        //set default null values           
        }   
}  

public String updateAccount(ActionEvent actionEvent) {  

fix = DAOFactory.getInstance("fix_site2.jdbc");  
datalist = fix.getMyDataDAO();    
account = datalist.findAccountID(pickAccount); //returns an ID from a DB given account selected from menu    

return "/AccountAnalysis.xhtml?includeViewParams=true";  

}  

//remainder of code omitted for clarity  

}