0

我的 web 应用程序中的个人资料编辑表单有一点问题。我使用 3 个 selectOneMenu(日、月、年)来修改生日。当新月有不同的天数范围时,我使用 ajax 侦听器来呈现天数。当我进入个人资料版时,从数据库加载用户的生日并填充 selectOneMenu。如果我只更改一天 - 版本完成没有任何错误。每当我更改月份时,day 都会更改为 null,我不知道为什么。这是 .xhtml 代码片段:

<h2>
   #{messages.birthday}:
   <h:selectOneMenu id="daySelect" value="#{profileEdition.dayOfBirth}" >
      <f:selectItems value="#{profileEdition.dateValues.daysList}" var="day" itemLabel="#{day.valueLabel}" itemValue="#{day.valueValue}"/>
      <f:ajax listener="#{profileEdition.dayChanged}" />
   </h:selectOneMenu>
   <h:selectOneMenu value="#{profileEdition.monthOfBirth}">
      <f:selectItems value="#{profileEdition.dateValues.monthsList}" var="month" itemLabel="#{month.valueLabel}" itemValue="#{month.valueValue}"/>
      <f:ajax listener="#{profileEdition.monthChanged}" render="daySelect" />
   </h:selectOneMenu>
   <h:selectOneMenu value="#{profileEdition.yearOfBirth}" >
      <f:selectItems value="#{profileEdition.dateValues.yearsList}" var="year" itemLabel="#{year.valueLabel}" itemValue="#{year.valueValue}"/>
      <f:ajax listener="#{profileEdition.yearChanged}" render="daySelect" />
   </h:selectOneMenu>
</h2>

在我的@ManagedBean 中,我得到了这些侦听器,他们正在更改 daysList 以防万一,并在 day 超出新月份的天数范围时将 dayOfBirth 值更改为 null。我插入了一些 System.out.println(); 在这些侦听器中检查他们是否正在更改 dayOfBirth 值,但事实并非如此。奇怪的是——我已经在我的注册表单中使用了这个机制,它工作正常。

有什么问题?

DayChanged 监听器:

public void dayChanged(){
    System.out.println("DAY HAS CHANGED! \n NEW DATE IS: " + dayOfBirth + "-" + monthOfBirth + "-" + yearOfBirth);
}

MonthChanged 监听器:

public void monthChanged(){
    ResourceBundle bundle = ResourceBundle.getBundle("locale.messages",
        FacesContext.getCurrentInstance().getViewRoot().getLocale());
    String day = bundle.getString("day");
    String month = bundle.getString("month");
    if(monthOfBirth.equals(month)){
        monthOfBirth = null;
    } else {
        int m = Integer.parseInt(monthOfBirth);
        if(m==1 || m==3 || m==5 || m==7 || m==10 || m==12) {   
            dateValues.daysList = new DateValues.Values[32];               
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<10;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"0" + i);
            }
            for(int i=10;i<32;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
        }else if(m==2) {                             
            dateValues.daysList = new DateValues.Values[30];    
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<10;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"0" + i);
            }
            for(int i=10;i<30;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
            if(dateValues.searchForDay(dayOfBirth) == false){ 
                System.out.println("DAY IS OUT OF SELECTED MONTH RANGE!");
                dayOfBirth = null;
            }
        }else {
            dateValues.daysList = new DateValues.Values[31];
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<10;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"0" + i);
            }
            for(int i=10;i<31;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
            if(dateValues.searchForDay(dayOfBirth) == false){
                System.out.println("DAY IS OUT OF SELECTED MONTH RANGE!");
                dayOfBirth = null;
            }
        }
    }
    System.out.println("MONTH HAS CHANGED! \n NEW DATE IS: " 
        + dayOfBirth + "-" + monthOfBirth + "-" + yearOfBirth);
}

YearChanged 监听器:

public void yearChanged(){
    ResourceBundle bundle = ResourceBundle.getBundle("locale.messages",
        FacesContext.getCurrentInstance().getViewRoot().getLocale());
    String day = bundle.getString("day");
    String year = bundle.getString("year");
    if(yearOfBirth.equals(year)){
        yearOfBirth = null;
    }
    if(monthOfBirth !=null && yearOfBirth != null){
        int y = Integer.parseInt(yearOfBirth);
        int m = Integer.parseInt(monthOfBirth);
        if(y%400==0 && m==2){    
            dateValues.daysList = new DateValues.Values[30];  
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<30;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
        } else if(y%100==0 && m==2){         
            dateValues.daysList = new DateValues.Values[29];  
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<29;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
            if(dateValues.searchForDay(dayOfBirth) == false){ 
                System.out.println("DAY IS OUT OF SELECTED MONTH RANGE!");
                dayOfBirth = null;
            }
        } else if(y%4==0 && m==2){               
            dateValues.daysList = new DateValues.Values[30];  
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<30;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
        } else if(m==2) {                    
            dateValues.daysList = new DateValues.Values[29];  
            dateValues.daysList[0] = new DateValues.Values(day,day);
            for(int i=1;i<29;i++){
                dateValues.daysList[i] = new DateValues.Values("" + i,"" + i);
            }
            if(dateValues.searchForDay(dayOfBirth) == false){ 
                System.out.println("DAY IS OUT OF SELECTED MONTH RANGE!");
                dayOfBirth = null;
            }
        }
    }
    System.out.println("YEAR HAS CHANGED! \n NEW DATE IS: " 
        + dayOfBirth + "-" + monthOfBirth + "-" + yearOfBirth);
}

所有这些 if/else 语句都用于确定闰年和特定月份的适当天数范围。感谢 System.out,我已经注意到 dayOfBirth 更改为 null 但就在我提交表单之后。

以防万一我在这里通过提交表单触发我的方法。

   public String editProfile() throws ParseException{
    System.out.println("Edition! You have chosen:");
    System.out.println("Day: " + dayOfBirth);
    System.out.println("Month: " + monthOfBirth);
    System.out.println("Year: " + yearOfBirth);
    birthday = dayOfBirth + "-" + monthOfBirth + "-" + yearOfBirth;
    System.out.println("NEW BIRTHDAY IS: " + birthday);
    if(DateValidator.isValid(birthday) == false){
        ResourceBundle bundle = ResourceBundle.getBundle("locale.messages",
            FacesContext.getCurrentInstance().getViewRoot().getLocale());
        String text = bundle.getString("invalidDate");
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, text, text);
        FacesContext.getCurrentInstance().addMessage("", msg);
        return null;
    }
    Date convertedBirthday = sdf.parse(birthday);
    myAccount.setUrodziny(convertedBirthday);
    mokEndpoint.editAccount(myAccount);
    return "editionSuccess";
}

@ManagedBean 是 @ViewScoped

4

0 回答 0