0

Web アプリケーションのプロファイル エディション フォームに少し問題があります。3 つの selectOneMenu (日、月、年) を使用して誕生日を変更します。新しい月の範囲が異なる場合、ajaxリスナーを使用して日の値をレンダリングします。プロファイル エディションに入ると、ユーザーの誕生日が DB から読み込まれ、selectOneMenu が入力されます。日のみを変更すると、編集はエラーなしで完了します。月を変更するたびに、日が 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 を変更し、日が新しい月の日の範囲外の場合は 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