您的位置:首页 > 编程语言 > Java开发

Java Server Faces(JSF)历险(二),事件响应

2005-12-09 13:20 459 查看

JSF生命周期

分为几个阶段:Restore View:当(重新)访问JSP的时候,重建server端组件树。Apply Request Value:将request parameters 复制到component submitted values。Process Validators:执行验证。Update Model Values:更新model数据:<h:inputText value="#{user.name}"/>Invoke Application:调用应用程序:Action。Render Response:渲染Response:保存状态并装载下一个视图。
FacesContext.renderResponse()可以跳过其他阶段,直接到RenderResponse;
FacesContext.responseComplete()可以跳过所有阶段。

ValueChangeEvent

<h:selectOneMenu value="#{eventDemo.provinceId}"
onchange[/b]=[/b]"submit()" [/b]valueChangeListener[/b]=[/b]"[/b]#{eventDemo.onProvincesChange}"[/b]>
<f:selectItems value="#{eventDemo.provinces}"/>
</h:selectOneMenu>
eventDemo是一个ManagedBean,onProvincesChange的代码:
/**
* Value改变事件
* @param event instance of ValueChangeEvent
*/
public void onProvincesChange(ValueChangeEvent event) [/b]{ String pId = event.getNewValue().toString(); //修改provincesFlags以改变getProvinces()的输出结果
provincesFlags = Integer.valueOf(pId).intValue(); }
方法的名字是任意的,但是参数类型和返值类型不能改变。getOldValue()和getNewValue是ValueChangeEvent常用方法。上述代码可以工作但是,每次修改下拉菜单都导致submit事件,所有“阶段都会执行”,而我们不希望执行验证等阶段,所以修改为:
<h:selectOneMenu value="#{eventDemo.provinceId}"
onchange="submit()"
valueChangeListener="#{eventDemo.onProvincesChange}"
[/b]immediate[/b]=[/b]"true"[/b]>
<f:selectItems value="#{eventDemo.provinces}"/>
</h:selectOneMenu>
/**
* Value改变事件
* @param event instance of ValueChangeEvent
*/
public void[/b] onProvincesChange(ValueChangeEvent event) { String pId = event.getNewValue().toString(); //修改provincesFlags以改变getProvinces()的输出结果
provincesFlags = Integer.valueOf(pId).intValue(); //页面组件定义为immediate,调用renderResponse以跳过验证阶段
FacesContext ctx = FacesContext.getCurrentInstance();
[/b] ctx.renderResponse();
[/b] }
注意黑体部分。

ActionListener事件

在执行Action的同时执行,与Action的区别在于:ActiontListener[/b]可以获取页面信息,所以被用来处理与页面有关的事情;而Action[/b]可以调用业务逻辑并控制页面导航。
[/b]调用Action Listener的代码:
<h:commandButton value="OK"
action="#{eventDemo.demoAction}" actionListener="#{eventDemo.demoActionListener}"[/b]/>
/**
* 事件监听,用于处理与View事件有关的事情
* @param event
*/
public void [/b]demoActionListener(ActionEvent event) { //这里处理页面显示相关的代码
}

事件标签

除了使用actionListener和valueChangeListener属性之外,还可以使用事件标签:
<h:selectOneMenu value="#{eventDemo.provinceId}"
onchange="submit()"
valueChangeListener="#{eventDemo.onProvincesChange}"
immediate="true">
<[/b]f:valueChangeListener [/b]type[/b]=[/b]"net.chinasam.samples.jsf.ValueChangeEventDemo"[/b]/>[/b]
[/b] <f:selectItems value="#{eventDemo.provinces}"/>
package[/b] net.chinasam.samples.jsf;
import[/b] javax.faces.event.AbortProcessingException;import[/b] javax.faces.event.ValueChangeEvent;import[/b] javax.faces.event.ValueChangeListener;
public[/b] class[/b] ValueChangeEventDemo implements[/b] ValueChangeListener[/b] {
public[/b] void[/b] processValueChange[/b](ValueChangeEvent event) throws[/b] AbortProcessingException { System.out.println("DEMO"); }
}
注意:与valueChangeListener属性不同,标签可以声明多个,也就是说,valueChange事件可以被多个Listener监听,Action事件也一样。另外标签中type属性指向一个类名,该类必须实现ValueChanageListener接口(Action事件则是ActionListener接口)。

阶段事件

<lifecycle> <phase-listener>net.chinasam.samples.jsf.PhaseEventDemo</phase-listener>
</lifecycle>
可以监听各个阶段,<phase-listener>中声明的类必须实现javax.faces.event.PhaseListener接口,该接口有3个方法:
public void [/b]afterPhase(PhaseEvent event) { System.out.println(event.getPhaseId()); }
public void [/b]beforePhase(PhaseEvent event) { System.out.println(event.getPhaseId());}
public [/b]PhaseId getPhaseId() { return[/b] PhaseId.INVOKE_APPLICATION; }
afterPhase在执行某个阶段之后被调用,beforePhase方法则反之,getPhaseId被JSF调用以决定在那个阶段执行他们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: