JSF动作事件
事件是在源对象和一个或多个目标侦听器对象之间传递状态变化的机制,如果源对象是按钮,而且单击了按钮,那么它会广播一个事件,表示它的状态改变,而相应的侦听器对象就能响应这个事件.
JSF 用户界面组件可以分为两大类,第一类是能发起动作的组件,例如按钮。这些组件实现接口ActionSource。第二类是容纳值的组件,例如输出或输入字段。这些组件实现ValueHolder或EditableValueHolder接口。对于ActionSource组件,用动作事件和对应的动作侦听器触发和处理事件。对于实际容纳值的组件,则使用值修改事件以及与它关联的值修改侦听器。
在请求处理生命周期中,动作事件是在调用应用程序阶段完成后处理的,值修改事件是在处理验证阶段完成后处理的,如果它们的immediate属性设为true,则会在应用请求值阶段完成后立即执行处理。
JSF支持事件处理模型,虽然由于HTTP本身无状态(stateless)的特性,使得这个模型多少有些地方仍不太相同,但JSF所提供的事件处理模型已足以让一些传统GUI程序的设计人员,可以用类似的模型来开发程序。
在导航中,我们根据动作方法(action method)的结果来决定要导向的网页,这样的作法实际上JSF会为其自动产生一个「预设的ActionListener」来处理事件,并根据其传回值来决定导向的页面。根据动作方法的不同值导向不同的网页,这叫做动态导航,当然也可以直接返回一个页面的url地址,这叫静态导航。
如果您需要使用同一个方法来应付多种事件来源,并想要取得事件来源的相关讯息,您可以让处理事件的方法接收一个javax.faces.event.ActionEvent事件参数。
package com.javachen.actionevent;
import javax.faces.event.ActionEvent;
public class User {
private String name;
private String password;
private String errMessage;
private String outcome;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}
public String getErrMessage() {
return errMessage;
}
public void validate(ActionEvent e) {
if (name.equals("javachen") && password.equals("123456")) {
outcome = "success";
} else {
errMessage = "名称或密码错误" + e.getSource();
System.out.println(name+password);
outcome = "failure";
}
}
public String do() {
return outcome==null?"failure":outcome;
}
}
在上例中,我们让validate方法接收一个ActionEvent对象,当使用者按下按钮,会自动产生ActionEvent对象代表事件来源,我们故意在错误讯息之后如上事件来源的字符串描述,这样就可以在显示错误讯息时一并显示事件来源描述.
而在页面上我们可以这样定义一个按钮:
< h:commandButton value=”送出” actionListener=”#{user.validate}” action=”#{user.do}”/ >
action与actionListener的区别通过上面的User类就可以看出来,action内的do方法不用提供任何参数,而actionListener的
validate方法需要传入一个ActionEvent对象。JSF会先检查是否有指定的actionListener,然后再检查是否指定了动作方法并产生预设的ActionListener,并根据其传回值导航页面。
如果您要注册多个ActionListener,例如当使用者按下按钮时,顺便在记录文件中增加一些记录讯息,您可以实现javax.faces.event.ActionListener接口,然后你就可以通过卷标向组件注册事件。
< h:commandButton value=”提交” action=”#{user.do}” actionListener=”#{user.validate}” >
< f:actionListener type=”com.javachen.actionevent.LogHandler” / >
< f:actionListener type=”com.javachen.actionevent.ValidateHandler” / >
< /h:commandButton >
< f:actionListener >会自动产生type所指定的对象,并呼叫组件的addActionListener()方法注册Listener。
Recent Comments