valueChangeListener使用注意事项

运行健康的示例。页面代码

<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 

 

 

转载于:https://my.oschina.net/yeelee/blog/650889

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值