JSF:使用多个提交操作以向导形式设置属性

时间:2012-11-28 15:30:40

标签: jsf-2 primefaces javabeans

我有这样的场景:在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();

      }
}

1 个答案:

答案 0 :(得分:0)

问题在于,从一个页面导航到另一个页面,Primefaces向导使用String来标识选项卡。返回此String的值(非null或void)会使视图bean超出范围。如果您有一个简单的表单,那就没关系,但是如果您想在流程中设置一些与表单元素无关的属性,它们会在选项卡更改期间被覆盖。
我解决了这个问题,在表单中添加了一个隐藏的参数链接到我想保留的属性。

<h:inputHidden value="formBean.idToPreserve" id="inputHidden" />