运行健康的示例。页面代码
请选择课程类别
课程类别: | οnchange="submit()" valueChangeListener="#{course.categoryChanged}" immediate="true"> |
课程: |
categoryChanged方法源码为
public void categoryChanged(ValueChangeEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
if ("language".equals((String) event.getNewValue())) {
courses.clear();
for (int i = 0; i < courseNames[0].length; ++i) {
courses.add(new SelectItem(courseNames[0][i]));
}
} else if ("datebase".equals((String) event.getNewValue())) {
courses.clear();
for (int i = 0; i < courseNames[1].length; ++i) {
courses.add(new SelectItem(courseNames[1][i]));
}
} else {
courses.clear();
}
context.renderResponse();
}
这是一个valueChangeListener可以正常运行的情况,其中有两点要注意:
1、 标签中 immediate="true"不可少。如果缺少该属性则会出现当第一次触发该事件时程序可以正常使用,但当第二次触发时会报
严重: JSF1054: (Phase ID: PROCESS_VALIDATIONS 3, View ID: /actionEvent/event1.jsp) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@32bd65]
2009-6-28 13:47:42 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet Faces Servlet threw exception
java.util.NoSuchElementException
at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:130)
at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:157)
at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:61)
2、在监听方法 categoryChanged 中 context.renderResponse(); 不能少,如果少了该方法,虽然可以成功触发监听时间,但程序后台会有如下警告
信息: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=event1Form:j_id_jsp_1462394538_5[severity=(ERROR 2), summary=(event1Form:j_id_jsp_1462394538_5: Validation Error: Value is not valid), detail=(event1Form:j_id_jsp_1462394538_5: Validation Error: Value is not valid)]
将的globalOnly属性更改为false上述警告消失,但在页面上会打印event1Form:j_id_jsp_1462394538_5: Validation Error: Value is not valid