中的值不会传递给bean

问题描述:

我的代码存在问题,其中各个值的值不会传递给bean。该代码基本上与我的旧项目(其中一切正常工作都很好)相同,但无论我做什么,bean中的值都不会更新。我想要做的是让用户填写表格以注册一个帐户。我试图做它在两个方面:<p:inputText>中的值不会传递给bean

<p:inputText id="address" value="#{Register.user.address}.../> 

这里Register与用户类,其中有几个属性,包括String地址的属性用户豆。这并没有真正的工作,所以我试图把getter和setter在RegisterBean,并将其设置为这种格式

public String getAddress(){ 
    return user.getAdress(); 
} 

,并使用它们像这样在XHTML

<p:inputText id="address" value="#{Register.address]".../> 

,但它仍然不起作用。试过调试,而且看起来setter从来没有被输入。有人知道为什么这不起作用,并可能如何解决它?

这里是代码的其余部分:

的.xhtml

<h:head> 
     <title>Register</title> 
    </h:head> 
    <body> 
     <ui:composition template="userTemplate.xhtml"> 
      <ui:define name="content"> 
       <h:form> 
        <h:panelGrid id="grid" columns="3" > 
         <f:facet name="header"> 
          Please fill in the required information 
         </f:facet> 
        <p:outputLabel value="Username" /> 
        <p:inputText id="username" value="#{Register.user.username}" validator="#{Register.validateUsername}" required="true" requiredMessage="Cannot be blank!"/> 
        <p:message for="username"/> 
        <p:outputLabel value="Password"/> 
        <p:password id="password" value="#{Register.user.password}" validator="#{Register.validatePasswords}"/> 
        <p:message for="password" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="Repeat password" /> 
        <p:password id="repPassword" value="#{Register.user.repeatPass}" validator="#{Register.validateRepPassword}"/> 
        <p:message for="repPassword" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="First name" /> 
        <p:inputText id="firstName" value="#{Register.user.firstName}"/> 
        <p:message for="firstName" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="Surname" /> 
        <p:inputText id="surname" value="#{Register.user.surname}" required="true" requiredMessage="Cannot be blank!"/> 
        <p:message for="surname" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="Address" /> 
        <p:inputText id="address" value="#{Register.user.address}" required="true" requiredMessage="Cannot be blank!"/> 
        <p:message for="address" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="Postnumber"/> 
        <p:inputText id="postnumber" value="#{Register.user.postnumber}" validatorMessage="Can only be numbers!" required="true" requiredMessage="Cannot be blank!"/> 
        <p:message for="postnumber" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="City"/> 
        <p:inputText id="city" value="#{Register.user.city}" required="true" requiredMessage="Cannot be blank!"/> 
        <p:message for="city" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="E-mail" /> 
        <p:inputText id="email" validator="#{Register.user.validateEmail}" value="#{Register.email}"/> 
        <p:message for="email" showSummary="true" showDetail="false"/> 
        <p:outputLabel value="Phone number" /> 
        <p:inputText id="phone" value="#{Register.user.phone}" required="true" validatorMessage="Phone number must be between 8 and 16 numbers long" requiredMessage="Cannot be blank!"> 
         <f:validateLongRange minimum="8" maximum="16"/> 
        </p:inputText> 
        <p:message for="phone" showDetail="false" showSummary="true"/> 
        <p:commandButton type="submit" id="submitButton" value="submit" update="grid" ajax="true"/> 
        <p/> 
        #{Register.user} 
       </h:panelGrid> 
      </h:form> 
     </ui:define> 
    </ui:composition> 
</body> 
</html> 

豆子:

@SessionScoped 
@ManagedBean(name="Register") 
public class registerBean implements Serializable { 
private User user = new User(); 

public void validateUsername(FacesContext context, UIComponent component, Object value) { 
    String message = ""; 
    String username = (String) value; 
    if(username == null || username.equals("")) { 
     ((UIInput)component).setValid(false); 
     message = "Enter a username"; 
     context.addMessage(component.getClientId(context), new FacesMessage(message)); 
    } 
    //else user.setUsername(username); 
} 

public void validatePasswords(FacesContext context, UIComponent component, Object value) { 
    String message = ""; 
    String password = (String) value; 
    boolean hasNumber = false; 
    for(int i = 0; i < password.length(); i++) { 
     if(Character.isDigit(password.charAt(i))) { 
      hasNumber = true; 
     } 
    } 
    if(!hasNumber && password.length() < 8) { 
     ((UIInput)component).setValid(false); 
     message = "You need to have at least one number and the password must be atleast 8 characters long"; 
     context.addMessage(component.getClientId(context), new FacesMessage(message)); 
    } 
    //else user.setPassword(password); 
} 

public void validateRepPassword(FacesContext context, UIComponent component, Object value) { 
    String message = ""; 
    String repPassword = (String) value; 
    if(!repPassword.equals(user.getPassword())) { 
     ((UIInput)component).setValid(false); 
     message = "The passwords don't match."; 
     context.addMessage(component.getClientId(context), new FacesMessage(message)); 
    } 
    //else user.setRepeatPass(repPassword); 

} 
public void validatePostnumber(FacesContext context, UIComponent component, Object value) { 
    String message = ""; 
    try { 
     Integer postnumber = (Integer) value; 
    } catch (Exception e) { 
     ((UIInput)component).setValid(false); 
     message = "The postnumber can only be numbers"; 
     context.addMessage(component.getClientId(context), new FacesMessage(message)); 
    } 
    //user.setPostnumber(((Integer) value).intValue()); 
} 
public void validateEmail(FacesContext context, UIComponent component, Object value) { 
    String message = ""; 
    try { 
     InternetAddress email = new InternetAddress((String) value); 
     email.validate(); 
    } catch(AddressException ae) { 
     ((UIInput)component).setValid(false); 
     message = "Type a valid email address"; 
     context.addMessage(component.getClientId(context), new FacesMessage(message)); 
    } 
    //user.setEmail((String)value); 
} 
public User getUser() { 
    return user; 
} 
} 

最后正常用户的Java类

public class User { 

private String username; 
private String password; 
private String repeatPass; 
private String address; 
private int postnumber; 
private String city; 
private String firstName; 
private String surname; 
private String email; 
private long phone; 

+setters/getters and a toString() 
} 
+0

尝试在你的commandButton中加入'process =“@ this”'。这是否工作?如果没有,那么你可能在表单提交时有验证错误,并且这些值没有被应用到模型中。要验证这一点,看看commandButton上的'immediate =“true”'是否调用了托管bean setter方法。 – 2013-03-07 19:32:58

+0

您是否尝试在按钮上使用actionListener方法? – Damian 2013-03-08 11:34:21

+0

检查您的浏览器的JavaScript控制台(在网络选项卡上)以观察任何无声验证/转换错误 – kolossus 2013-03-08 13:17:18

我解决了这个问题。我觉得有点愚蠢,但从一开始就没有任何问题。事情是因为所有的验证器和所有的东西,验证在几个领域被设置为false,导致值没有传回。只要我设置了所有正确的信息,它就起作用了。