我的网站上有两个字段。一个inputtext和一个selectManyCheckbox。用户在输入文本中输入日期,例如30.03.2014。 selectManyCheckbox具有一周中的所有天(星期一,星期二...)。我试图实现这一点,如果用户输入一个日期,则在selectManyCheckbox中选中该日期的星期几。例如,2014年3月30日应该检查星期日。
这是我的jsp的一些代码:
<h:inputText value="#{course.startTime}" onblur="submit()" valueChangeListener="#{course.intervalDayEvent}" immediate="true">
<f:converter converterId="dateConverter" />
</h:inputText>
<h:selectManyCheckbox layout="pageDirection" value="#{course.days}">
<f:selectItems value="#{course.availableDays}" />
</h:selectManyCheckbox>
这是managedBean的一些代码:
private List<String> days = new ArrayList<String>();
private List<SelectItem> availableDays = new ArrayList<SelectItem>();
@PostConstruct
public void init() {
availableDays.add(new SelectItem("Montag", "Montag"));
availableDays.add(new SelectItem("Dienstag", "Dienstag"));
availableDays.add(new SelectItem("Mittwoch", "Mittwoch"));
availableDays.add(new SelectItem("Donnerstag", "Donnerstag"));
availableDays.add(new SelectItem("Freitag", "Freitag"));
availableDays.add(new SelectItem("Samstag", "Samstag"));
availableDays.add(new SelectItem("Sonntag", "Sonntag"));
days.add("Montag");
}
public void intervalDayEvent(ValueChangeEvent event) {
try {
Date date = (Date) event.getNewValue();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int day = cal.get(Calendar.DAY_OF_WEEK);
days.clear();
switch (day) {
case Calendar.MONDAY:
days.add("Montag");
break;
case Calendar.TUESDAY:
days.add("Dienstag");
break;
case Calendar.WEDNESDAY:
days.add("Mittwoch");
break;
case Calendar.THURSDAY:
days.add("Donnerstag");
break;
case Calendar.FRIDAY:
days.add("Freitag");
break;
case Calendar.SATURDAY:
days.add("Samstag");
break;
case Calendar.SUNDAY:
availableDays.get(6).setLabel("Test");
days.add("Sonntag");
break;
}
} catch (Exception ex) {
log.warn(ex.getMessage());
}
FacesContext context = FacesContext.getCurrentInstance();
context.renderResponse();
}
如您所见,星期一(Montag)已被预先检查。如果我在输入文本中输入30.03.2014,则星期日的标签将更改为“测试”。但是,已检查的项目从星期一到星期日没有变化。
希望您能帮到我。 :)
本杰明
最佳答案
我假设输入文本和selectManyCheckbox的格式相同?我看不到JS函数Submit()在做什么,但是我发现它只是在提交整个表单。发生的事情是intervalDayEvent被触发了,但是由于表单已经提交,所以selectManyCheckbox会在后备bean中设置其组件的值。
为了解决这个问题,您需要使这些组件具有2种不同的形式,或者使用一些ajax控件,这些控件只会在值更改时设置输入文本,而不是在整个表单时设置。下面可以通过RichFaces显示一个示例,但是请确保您可以使用其他JSF ajax库来执行此操作:
<h:inputText value="#{course.startTime}" valueChangeListener="#{course.intervalDayEvent}">
<a4j:support event="onblur" reRender="daysChkBox" ajaxSingle="true"></a4j:support>
</h:inputText>
<h:selectManyCheckbox id="daysChkBox" layout="pageDirection" value="#{course.days}">
<f:selectItems value="#{course.availableDays}"></f:selectItems>
</h:selectManyCheckbox>