JSF事件处理

JSF事件

动作事件
在按钮上使用action绑定一个动作方法(action  method),实际上JSF会为其自动产生一个「预定义的ActionListener」来处理事件,并根据其传回值来决定导向的页面.
如果您需要使用同一个方法来应付多种事件来源,并想要取得事件来源的相关信息,您可以让处理事件的方法接收一个javax.faces.event.ActionEvent事件参数.

自定义监听事件(实现ActionListener接口)
 public class LogHandler implements ActionListener {
     public void processAction(ActionEvent e) {
         // 监听事件
     }
 }
注册多个ActionListener
<h:commandButton value="送出" action="#{user.outcome}">
    <f:actionListener type="onlyfun.caterpillar.LogHandler"/>
    <f:actionListener type="onlyfun.caterpillar.VerifyHandler"/>
</h:commandButton>
<f:actionListener>会自动产生type所指定的对象,并调用组件的addActionListener()方法注册Listener。


即时事件(Immediate Events)
指JSF视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器
处理、更新模型值等流程

JSF所有的对象调用都是在服务器端执行的,对象调用流程
恢复视图(Restore View)
    依客户端传来的session数据或服务器端上的session数据,重建JSF视图组件
获取请求值(Apply Request Values)
    JSF视图组件各自获得请求中的属于自己的值,包括旧的值与新的值
执行验证(Process Validations)
    转换为对象并进行验证
更新模型值(Update Model Values)
    更新Bean或相关的模型值
调用应用(Invoke Application)
    执行应用程序相关逻辑
渲染响应页面(Render Response)
    对先前的请求处理完之后,产生页面以反应客户端执行结果

对于动作事件(Action  Event)来说,组件的动作事件是在套用请求值阶段就生成ActionEvent对象了,但相关的事件处理并不是马上进行,ActionEvent会先被排入队列,然后必须再通过验证、更新方式值阶段,之后才处理队列中的事件.
<h:commandButton value="#{msgs.Text}" immediate="true" actionListener="#{user.changeLocale}"/>

值改变事件
如果使用者改变了JSF输入组件的值后提交表单,就会发生值变事件(Value Change  Event),这会丢出一javax.faces.event.ValueChangeEvent对象,如果您想要处理这个事件,有两种方式,
一是直接设定JSF输入组件的valueChangeListener属性
<h:selectOneMenu value="#{user.locale}" οnchange="this.form.submit();"
                  valueChangeListener="#{user.changeLocale}">
     <f:selectItem itemValue="zh_CN" itemLabel="Chinese"/>
     <f:selectItem itemValue="en" itemLabel="English"/>
</h:selectOneMenu>
另一个方法是实现javax.faces.event.ValueChangeListener接口,并定义其processValueChange()方法,
例如:
<h:selectOneMenu value="#{user.locale}" οnchange="this.form.submit();">
     <f:valueChangeListener type="onlyfun.caterpillar.SomeListener"/>
     <f:selectItem itemValue="zh_CN" itemLabel="Chinese"/>
     <f:selectItem itemValue="en" itemLabel="English"/>
</h:selectOneMenu>

Phase事件
JSF的请求执行到反应,完整的过程会经过六个阶段
在每个阶段的前后会引发javax.faces.event.PhaseEvent
如果您想尝试在每个阶段的前后捕捉这个事件,以进行一些处理,则可以实现javax.faces.event.PhaseListener,并向javax.faces.lifecycle.Lifecycle登记这个Listener,以在适当的时候通知事件的发生。

PhaseListener有三个必须实现的方法getPhaseId()、beforePhase()与afterPhase()
其中getPhaseId()传回一个PhaseId对象
代表Listener想要被通知的时机,可以设定的时机有
PhaseId.RESTORE_VIEW  
PhaseId.APPLY_REQUEST_VALUES  
PhaseId.PROCESS_VALIDATIONS  
PhaseId.UPDATE_MODEL_VALUES  
PhaseId.INVOKE_APPLICATION  
PhaseId.RENDER_RESPONSE  
PhaseId.ANY_PHASE:指的是任何的阶段转换时,就进行通知

编写好PhaseListener后, 我们可以在faces-config.xml中向Lifecycle进行注册:
<lifecycle>
        <phase-listener>
            onlyfun.caterpillar.ShowPhaseListener
        </phase-listener>
</lifecycle>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值