我的网站上有两个字段。 inputtext和selectManyCheckbox。在inputtext中,用户编写日期,如30.03.2014。 selectManyCheckbox包含一周中的所有日子(星期一,星期二......)。我尝试实现,如果用户在日期中写入,则在selectManyCheckbox中检查该日期的星期几。例如30.03.2014应该检查周日。
以下是我的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,则星期日的标签将更改为“Test”。但是经过检查的项目不会从星期一变为星期日。
我希望你能帮助我。 :)
本杰明
答案 0 :(得分:1)
我假设输入文本和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>