我的 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