我的网站上有两个字段。一个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>

10-06 14:04