Jsf Primefaces向导从以前的选项卡中删除信息

Jsf Primefaces向导从以前的选项卡中删除信息,jsf,primefaces,wizard,Jsf,Primefaces,Wizard,我是JSF新手。我试图使用Primefaces官方网站上的向导组件,但我遇到了一个问题:当移动到下一个选项卡时,上一个选项卡上的信息会被删除。 除了用户bean之外,我使用了该站点的代码。当我进行调试时,我看到每次按下Next按钮时,都会调用每个字段的setter,但是在前面的步骤中设置的字段都是null。 我使用的是primefaces 3.5版本、jsf api和jsf impl 2.1.18 代码如下: 用户向导: @ManagedBean(name="userWizardBean") @

我是JSF新手。我试图使用Primefaces官方网站上的向导组件,但我遇到了一个问题:当移动到下一个选项卡时,上一个选项卡上的信息会被删除。 除了用户bean之外,我使用了该站点的代码。当我进行调试时,我看到每次按下Next按钮时,都会调用每个字段的setter,但是在前面的步骤中设置的字段都是null。 我使用的是primefaces 3.5版本、jsf api和jsf impl 2.1.18

代码如下:

用户向导:

@ManagedBean(name="userWizardBean")
@SessionScoped
public class UserWizard {

private User user = new User();
private boolean skip;

private static Logger logger = Logger.getLogger(UserWizard.class.getName());

public User getUser() {
    return user;
}

public void setUser(User user) {
   this.user = user;
}

public void save(ActionEvent actionEvent) {
    //Persist user

    FacesMessage msg = new FacesMessage("Successful", "Welcome :" + user.getFirstname());
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public boolean isSkip() {
    return skip;
}

public void setSkip(boolean skip) {
    this.skip = skip;
}

public String onFlowProcess(FlowEvent event) {
    logger.info("Current wizard step:" + event.getOldStep());
    logger.info("Next step:" + event.getNewStep());

    if(skip) {
        skip = false;   //reset in case user goes back
        return "confirm";
    }
    else {
        return event.getNewStep();
    }
}

}
用户:

以及xhtml文件:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
</h:head>
<h:body>
  <h:form>

    <p:growl id="growl" sticky="true" showDetail="true"/>

    <p:wizard widgetVar="wiz"
              flowListener="#{userWizard.onFlowProcess}">

        <p:tab id="personal" title="Personal">

            <p:panel header="Personal Details">

                <h:messages errorClass="error"/>

                <h:panelGrid columns="2" columnClasses="label, value" styleClass="grid">
                    <h:outputText value="Firstname: *" />
                    <p:inputText required="true" label="Firstname"
                                 value="#{userWizard.user.firstname}" />

                    <h:outputText value="Lastname: *" />
                    <p:inputText required="true" label="Lastname"
                                 value="#{userWizard.user.lastname}" />

                    <h:outputText value="Age: " />
                    <p:inputText value="#{userWizard.user.age}" />

                    <h:outputText value="Skip to last: " />
                    <h:selectBooleanCheckbox value="#{userWizard.skip}" />
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="address" title="Address">
            <p:panel header="Adress Details">

                <h:messages errorClass="error"/>

                <h:panelGrid columns="2" columnClasses="label, value">
                    <h:outputText value="Street: " />
                    <p:inputText value="#{userWizard.user.street}" />

                    <h:outputText value="Postal Code: " />
                    <p:inputText value="#{userWizard.user.postalCode}" />

                    <h:outputText value="City: " />
                    <p:inputText value="#{userWizard.user.city}" />

                    <h:outputText value="Skip to last: " />
                    <h:selectBooleanCheckbox value="#{userWizard.skip}" />
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="contact" title="Contact">
            <p:panel header="Contact Information">

                <h:messages errorClass="error"/>

                <h:panelGrid columns="2" columnClasses="label, value">
                    <h:outputText value="Email: *" />
                    <p:inputText required="true" label="Email"
                                 value="#{userWizard.user.email}" />

                    <h:outputText value="Phone: " />
                    <p:inputText value="#{userWizard.user.phone}"/>

                    <h:outputText value="Additional Info: " />
                    <p:inputText value="#{userWizard.user.info}"/>
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="confirm" title="Confirmation">
            <p:panel header="Confirmation">

                <h:panelGrid id="confirmation" columns="6">
                    <h:outputText value="Firstname: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.firstname}" />

                    <h:outputText value="Lastname: " />
                    <h:outputText  styleClass="outputLabel"
                                   value="#{userWizard.user.lastname}"/>

                    <h:outputText value="Age: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.age}" />>

                    <h:outputText value="Street: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.street}" />

                    <h:outputText value="Postal Code: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.postalCode}" />

                    <h:outputText value="City: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.city}" />

                    <h:outputText value="Email: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.email}" />

                    <h:outputText value="Phone " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.phone}"/>

                    <h:outputText value="Info: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.info}" />

                    <h:outputText />
                    <h:outputText />
                </h:panelGrid>

                <p:commandButton value="Submit" update="growl"
                                 actionListener="#{userWizard.save}"/>

            </p:panel>
        </p:tab>

    </p:wizard>

 </h:form>
</h:body>
</html>

>
任何帮助或提示都将不胜感激。
谢谢

我已经设法让它工作了:刚刚添加: @ManagedBean(name=“userWizard”) 及 @视域
到UserWizard类,它成功了

实际上,问题在于作用域,因为您提到了作为会话作用域,所以数据只存储在单个会话中,它应该是视图作用域,因为视图内的作用域数据仍然存储,除非您重定向到另一个页面


我希望它能对您有所帮助。

我也尝试过使用'@ConversationScope'和'@ViewScope',但没有任何运气。这对我来说很有效,我所做的唯一一件事就是将bean的名称更改为
userWizard
,就像您在xhtml中所做的那样,我认为这是一个输入错误。我更改了名称,但仍然不起作用。请检查用户字段何时再次获得空值。进行一些调试,看看发生了什么。调试之后,我看到调用了用户bean的构造函数:在开始时调用一次,每个选项卡调用一次,在提交数据时调用一次。这就是信息被删除的原因。不过,我不知道为什么每次都会加载一个新的用户bean。另外,在更改xhtml文件的输出格式之前,请确保清除缓存。否则,上述问题有时会出现。
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
</h:head>
<h:body>
  <h:form>

    <p:growl id="growl" sticky="true" showDetail="true"/>

    <p:wizard widgetVar="wiz"
              flowListener="#{userWizard.onFlowProcess}">

        <p:tab id="personal" title="Personal">

            <p:panel header="Personal Details">

                <h:messages errorClass="error"/>

                <h:panelGrid columns="2" columnClasses="label, value" styleClass="grid">
                    <h:outputText value="Firstname: *" />
                    <p:inputText required="true" label="Firstname"
                                 value="#{userWizard.user.firstname}" />

                    <h:outputText value="Lastname: *" />
                    <p:inputText required="true" label="Lastname"
                                 value="#{userWizard.user.lastname}" />

                    <h:outputText value="Age: " />
                    <p:inputText value="#{userWizard.user.age}" />

                    <h:outputText value="Skip to last: " />
                    <h:selectBooleanCheckbox value="#{userWizard.skip}" />
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="address" title="Address">
            <p:panel header="Adress Details">

                <h:messages errorClass="error"/>

                <h:panelGrid columns="2" columnClasses="label, value">
                    <h:outputText value="Street: " />
                    <p:inputText value="#{userWizard.user.street}" />

                    <h:outputText value="Postal Code: " />
                    <p:inputText value="#{userWizard.user.postalCode}" />

                    <h:outputText value="City: " />
                    <p:inputText value="#{userWizard.user.city}" />

                    <h:outputText value="Skip to last: " />
                    <h:selectBooleanCheckbox value="#{userWizard.skip}" />
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="contact" title="Contact">
            <p:panel header="Contact Information">

                <h:messages errorClass="error"/>

                <h:panelGrid columns="2" columnClasses="label, value">
                    <h:outputText value="Email: *" />
                    <p:inputText required="true" label="Email"
                                 value="#{userWizard.user.email}" />

                    <h:outputText value="Phone: " />
                    <p:inputText value="#{userWizard.user.phone}"/>

                    <h:outputText value="Additional Info: " />
                    <p:inputText value="#{userWizard.user.info}"/>
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="confirm" title="Confirmation">
            <p:panel header="Confirmation">

                <h:panelGrid id="confirmation" columns="6">
                    <h:outputText value="Firstname: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.firstname}" />

                    <h:outputText value="Lastname: " />
                    <h:outputText  styleClass="outputLabel"
                                   value="#{userWizard.user.lastname}"/>

                    <h:outputText value="Age: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.age}" />>

                    <h:outputText value="Street: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.street}" />

                    <h:outputText value="Postal Code: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.postalCode}" />

                    <h:outputText value="City: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.city}" />

                    <h:outputText value="Email: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.email}" />

                    <h:outputText value="Phone " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.phone}"/>

                    <h:outputText value="Info: " />
                    <h:outputText styleClass="outputLabel"
                                  value="#{userWizard.user.info}" />

                    <h:outputText />
                    <h:outputText />
                </h:panelGrid>

                <p:commandButton value="Submit" update="growl"
                                 actionListener="#{userWizard.save}"/>

            </p:panel>
        </p:tab>

    </p:wizard>

 </h:form>
</h:body>
</html>