您的位置:首页 > 产品设计 > UI/UE

valueChangeListener使用注意事项

2009-06-28 13:43 441 查看
运行健康的示例。页面代码

<f:view>
<h:form id="event1Form">
<h3>请选择课程类别</h3>
<table>
<tr>
<td>课程类别:</td>
<td><h:selectOneMenu value="#{course.category}"
onchange="submit()" valueChangeListener="#{course.categoryChanged}"
immediate="true">
<f:selectItem itemValue="null" itemLabel="--choose--" />
<f:selectItems value="#{course.categoies}" />
</h:selectOneMenu></td>
</tr>
<tr>
<td>课程:</td>
<td><h:selectOneMenu value="#{course.course}">
<f:selectItems value="#{course.courses}" />
</h:selectOneMenu></td>
</tr>
</table>
</h:form>
<h:messages globalOnly="true"></h:messages>
</f:view>

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、<h:selectOneMenu /> 标签中 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)]

将<h:messages globalOnly="true"></h:messages>的globalOnly属性更改为false上述警告消失,但在页面上会打印event1Form:j_id_jsp_1462394538_5: Validation Error: Value is not valid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: