primefaces:在actionlistener之前调用的托管bean构造函数

时间:2012-06-08 06:44:02

标签: jsf-2 primefaces

我创建了带有两个属性法院(CourtBean.java的对象)和courtAll(List对象包含courtbean的arraylist)的托管bean(CourtUitility.java)。 我的代码如下 CourtUitility.java

@ManagedBean 
@RequestScoped
public class CourtUitility {

private CourtBean court =new CourtBean();
private List<CourtBean> courtAll = new ArrayList<CourtBean>();
/** Creates a new instance of CourtUitility */

public CourtUitility() {
    courtAll = new ArrayList<CourtBean>();
    int userID = Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("USER_ID").toString());
    courtAll = CourtService.GenerateCourtList(userID);
}

public CourtBean getCourt() {
    return court;
}

public void setCourt(CourtBean court) {
    this.court = court;
}

public List<CourtBean> getCourtAll() {
    return courtAll;
}

public void setCourtAll(List<CourtBean> courtAll) {
    this.courtAll = courtAll;
}

public void save(ActionEvent actionEvent) {
     court.setUserID(Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("USER_ID").toString()));
    System.out.println("Court ID : " + court.getCourtID());
    System.out.println("User ID : " + court.getUserID());
    CourtService.AddCourt(court);
    court = new CourtBean();
    courtAll = CourtService.GenerateCourtList(Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("USER_ID").toString()));
    FacesMessage msg = new FacesMessage("Court Record Created", "");
    FacesContext.getCurrentInstance().addMessage(null, msg);
}
}

clientMaster.xhtml

<ui:composition template="/template/mainLayout.xhtml" >
        <ui:define name="pageContent">
 <h:form id="co">
                <p:growl life="5000" showDetail="true" showSummary="true" id="courtmessage" />
                <p:panel id="courtDetail" header="Court Details">
                    <p:messages id="panelMessage" showDetail="true" showSummary="false" autoUpdate="true" globalOnly="true" />

                    <h:panelGrid columns="4" styleClass="grid">
......
<p:commandButton id="addCourt" immediate="true" value="Add Court" actionListener="#{courtUitility.save}" update=":co,:cot" async="true" >
                        </p:commandButton>
                    </h:panelGrid>
                </p:panel>
            </h:form>
<ui:include id="abc" src="CourtEditDatatable.xhtml"/> 
        </ui:define>
    </ui:composition>

当我通过commandbutton输入提交表单时,所有数据在数据库中都为空。 调试后我发现,在提交表单时,托管bean构造函数首先调用,所有属性都重新初始化。在调用该动作侦听器之后,它在数据库中变为null。 我也尝试了视图范围,但问题仍然存在。 有什么方法可以在动作监听器调用???

时停止调用构造函数

还有一件事需要分享我在同一个项目中使用相同模式创建了带向导的客户端主服务器。它工作正常。保存记录时不会导致问题。 是由于巫师?

1 个答案:

答案 0 :(得分:3)

  

当动作监听器调用???

时,有没有办法停止调用构造函数

如果停止构造bean,那么根本就没有bean实例,JSF将无法调用bean上的操作。所以,不,这没有任何意义。

您的问题是由其他地方引起的。太糟糕了,你的表单不完整,但我至少在提交按钮上看到immediate="true"。我不确定为什么你需要在“保存”按钮上,这对于“取消”按钮更为典型。如果在同一表单的任何输入字段中都有此属性,那么它们将处理。

从按钮中删除immediate="true",JSF将处理提交的输入值,并且它们将在更新模型值期间以通常的方式设置在bean中。