我有这样的场景:在primefaces向导组件的第一个选项卡中,我有一些字段和一个按钮。该按钮保存一些数据,执行一些业务逻辑,并根据结果设置表单bean(在ViewScope中)的一些属性,这些属性与表单的特定字段无关。我已经检查过,在调用应用程序阶段,值已正确设置 在第二个选项卡中,我有另一个按钮,必须使用第一个设置的值来执行一些业务逻辑,但是,做一些调试,我注意到,即使与表单的任何字段无关,值也会被覆盖我认为在单击第二个按钮时调用的更新模型阶段。
我该如何避免这种情况?有没有办法获得正确的行为?
我环顾四周,但我找不到任何提交多个提交的向导表单的例子。谢谢你的帮助!
<p:wizard widgetVar="wiz" render="true" id="wizard" showNavBar="false">
<p:tab id="step0" title="Step0" step="0">
<!-- Some other fields-->
<p:commandButton value="Save and do some business logic"
action="#{formBean.save}"
oncomplete="wiz.loadStep (wiz.cfg.steps [1], false)">
</p:commandButton>
</p:tab>
<p:tab id="step1" title="Step1" step="1">
<!-- Some other fields-->
<p:commandButton value="Second button: use the previous informations"
action="#{formBean.doSomething}"
oncomplete="wiz.loadStep (wiz.cfg.steps [2], false)">
</p:commandButton>
</p:tab>
</p:wizard>
修改
为了显示一个例子,我可以说我的bean包含一个业务逻辑对象。在第一次提交期间,正在保存此对象,因此数据库(Mysql和Hibernate)会为其分配渐进ID。
在第二次提交期间,当我尝试读取此id时,值为零,显然,我收到错误。
类似的东西:
public class FormBean{
private BLObject object;
// Constructor Getters and setters
// Method executed during the first submission
public void save(ActionEvent actionEvent) {
//Save the object and set his id
PersistanceClass.getInstance().save(object);
}
// Method executed during the second submission
public void doSomethingWhitTheId(ActionEvent actionEvent) {
//Access the id... id=0 returned
int id = object.getId();
}
}
答案 0 :(得分:0)
问题在于,从一个页面导航到另一个页面,Primefaces向导使用String来标识选项卡。返回此String的值(非null或void)会使视图bean超出范围。如果您有一个简单的表单,那就没关系,但是如果您想在流程中设置一些与表单元素无关的属性,它们会在选项卡更改期间被覆盖。
我解决了这个问题,在表单中添加了一个隐藏的参数链接到我想保留的属性。
<h:inputHidden value="formBean.idToPreserve" id="inputHidden" />