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>
动作事件
在按钮上使用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>