2013-03-24 55 views
0

我是JSF的新手。我正在尝试使用Primefaces官方网站上的向导组件,并且遇到了一个问题:在移至下一个选项卡时,以前的信息会被删除。 我使用了用户bean以外的网站代码。当我进行调试时,我看到每次按下“下一步”按钮时,都会调用每个字段的setter,但前面步骤中设置的字段为空。 我使用的是primefaces 3.5版本和jsf-api和jsf-impl 2.1.18。Primefaces向导从以前的选项卡中删除信息

下面是代码:

UserWizard:

@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(); 
    } 
} 

} 

用户:

public class User { 

private String firstname; 
private String lastname; 
private Integer age; 
private String street; 
private String city; 
private String postalCode; 
private String info; 
private String email; 
private String phone; 

public User(String firstname, String lastname, Integer age, String street, String city, String postalCode, String info, String email, String phone) { 
    this.firstname = firstname; 
    this.lastname = lastname; 
    this.age = age; 
    this.street = street; 
    this.city = city; 
    this.postalCode = postalCode; 
    this.info = info; 
    this.email = email; 
    this.phone = phone; 
} 

public User() { 

} 

public String getFirstname() { 
    return firstname; 
} 

public void setFirstname(String firstname) { 
    this.firstname = firstname; 
} 

public String getLastname() { 
    return lastname; 
} 

public void setLastname(String lastname) { 
    this.lastname = lastname; 
} 

public Integer getAge() { 
    return age; 
} 

public void setAge(Integer age) { 
    this.age = age; 
} 

public String getStreet() { 
    return street; 
} 

public void setStreet(String street) { 
    this.street = street; 
} 

public String getCity() { 
    return city; 
} 

public void setCity(String city) { 
    this.city = city; 
} 

public String getPostalCode() { 
    return postalCode; 
} 

public void setPostalCode(String postalCode) { 
    this.postalCode = postalCode; 
} 

public String getInfo() { 
    return info; 
} 

public void setInfo(String info) { 
    this.info = info; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPhone() { 
    return phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 
} 

而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> 

任何帮助或尖端,将不胜感激。 感谢

+0

我也试过使用'@ConversationScope'和'@ViewScope',但没有任何运气。 – 2013-03-25 13:18:54

+0

对我而言,我所做的唯一的事情就是将bean的名称更改为'userWizard',就像您在xhtml中所使用的那样,我认为这是一种模糊的方式。这种改变就像一种魅力。 – 2013-03-25 22:04:23

+0

我改了名字 - 仍然没有工作。 – 2013-03-26 08:40:07

回答

1

我已经成功地使其工作:只是说: @ManagedBean(name = “userWizard”) 和 @ViewScoped 到UserWizard类和它的工作。

+0

还请确保在xhtml文件的输出格式发生任何更改之前清除缓存。否则有时会出现上述问题。 – 2013-03-30 15:29:30

0

实际上问题与范围有关,因为您提到会话范围,因此数据仅存储在单个会话中,因此它应该是视图范围视图范围数据保持存储,除非您被重定向到另一个页面。

我希望它能帮助你。