JSF事件处理

来源:互联网 发布:淘宝客返利要不要关闭 编辑:程序博客网 时间:2024/05/10 06:19

JSF是基于GUI式的事件处理机制的,但是由于http的无状态性,使得JSF的事件处理机制多少与传统的桌面程序有些差别。

JSF中事件的处理给页面上的每一个按钮都绑定一个动作方法,实际上JSF会为其自动产生一个「预定义的ActionListener」来处理事件,根据方法的返回值和导航文件判断想要跳转的页面。

jsf的页面处理流程:

1、重构jsf组建

     依据客户端传过来的session数据或服务器上的session数据,重建jsf视图组件。

2、套用请求值

      jsf视图组件各自获得请求中的属于自己的值,包括旧的值与新的值

3、执行验证

4、更新模型值(更新bean或相关的模型值)

5、唤起应用程序(执行应用程序逻辑)

6、绘制相应页面

但是jsf由于不同的需求,主要分4种事件

1、动作事件

     这是一个完整的jsf处理流程,页面的大部分提交按钮就使用的是这个事件,有的时候多个按钮访问同一个事件,我们需要获得事件的来源,这个时候我们叫应该调用ActionEvent对象

public void verify(ActionEvent e) {
if(!name.equals("justin") ||
!password.equals("123456")) {
errMessage = "名称或密码错误" + e.getSource();
outcome = "failure";
}
else {
outcome = "success";
}
}
public String outcome() {
return outcome;
}

jsp调用代码

<h:commandButton value="送出" actionListener="#{user.verify}" action="#{user.outcome}"/>

调用时,jsf在套用请求值时会判断是否制定了actionListener,如果没有指定则会产生预定义的ActionListener和ActionEvent对象,并将其压入队列,继续执行验证和更新模型bean。

2、即时事件

     有的时候我们需要在不需要验证和设置模型bean值的时候处理事件,例如仅仅是想改变一下显示的语言,他会跳过数据验证和更新模型值,直接唤起应用程序,绘制相应页面。

      调用方法:<h:commandButton value="#{msgs.Text}"   immediate="true"   actionListener="#{user.changeLocale}"/>

3、值变事件

      值变事件是指在用户改变了输入组件的值之后提交表单,他会丢出一个ValueChangeEvent对象,如果想处理这个时间有两种方式

一是直接设定JSF输入组件的valueChangeListener属性

<h:selectOneMenu value="#{user.locale}"
onchange="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()方法

public class SomeListener implements ValueChangeListener {
public void processValueChange(ValueChangeEvent event) {
....
}
....
}

4、phase事件 就是对每一个事件以上不同的处理层次追加一个监听。

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
其中PhaseId.ANY_PHASE指的是任何的阶段转换时,就进行通知;您可以在beforePhase()与afterPhase()中编写阶段前后编写分别想要处理的动作

需向face-config.xml注册

<faces-config>
<lifecycle>
<phase-listener>
onlyfun.caterpillar.ShowPhaseListener
</phase-listener>
</lifecycle>
......
</faces-config>

原创粉丝点击