jsf学习笔记监听器

动作事件在用户通过一个组件发出命令时被触发。比如按钮或者超链接这样的组件可以产生动作事件,或者叫动作源。动作事件由动作监听器控制。

有两种类型的动作监听器。一种会涉及到页面的导航,一种不会。涉及到页面导航的动作事件会执行一个过程并且返回一个结果,JSF导航系统根据这个结果跳转到下一个页面(也可以时当前的页面)。不涉及导航的动作监听器负责控制当前页面的组件,或者执行一个过程来改变模型对象或者支持Bean的属性,但是它并不会修改用户正在访问的页面。因此,通常只有在监听器执行完操作之后页面才会重显显示。

理论上说,所有的导航都是通过单一的动作监听器控制的。监听器会自动处理来自任何组件触发的事件,因此,无需手工注册监听器。缺省情况下,监听器就是你在支持Bean中实现的动作方法(action method,所以你可以在应用程序的不同部分使用不同的动作方法来控制程序。通常,应用程序的业务逻辑也都放在这些方法中实现(动作监听器是插件化的,就是说你可以在很多地方使用一个动作监听器)。

当组件触发一个事件的时候,缺省的监听器会判断它返回的结果字符串,比如"mainmenu", "success",或者"failure"。有两种基本的返回类型:静态的和动态的。静态结果是硬编码的,它又组件声明或者在代码中设置,比如:

<h:commandButton type="submit" value="Login" action="success"

immediate="true"/>

在上面的例子中,当用户点击一个按钮的时候,会返回一个“success”结果,并触发一个动作事件,但是不会调用动作方法。

动态结果又动作方法返回,一个动作方法会根据不同的业务逻辑返回不同的结果。动作监听器会查找又JSF EL定义的action属性,这个属性就是动作方法。下面是一个HtmlCommandButton执行动作方法的例子:

<h:commandButton type="submit" value="Login"

action="#{loginForm.login}"/>

当用户单击按钮时,会执行下面的动作方法:

public class LoginForm

{

public String login()

{

if (…) // login is successful

{

return "success";

}

else

{

return "failure";

}

}

}

根据应用程序逻辑这个动作方法会返回"success"或者"failure"结果。LoginForm时一个支持Bean,它把页面组件的值封住为自己的属性。

在我的应用程序中有自己的业务逻辑,你的应用程序中的动作方法同样可以控制JSF组件、模型对象或者增加消息等。他们还可以完成其他更多的任务,比如执行页面跳转,装饰相应对象(一个图片或者其他二进制数据对象),增加事件,或者和数据库,EJB服务器,web服务等进行交互。监听器通过返回结果来控制页面的导航。

当你需要执行一个业务逻辑的时候,你无需设置页面导航,你只要给组件设置一个事件监听器就可以了。与事件方法不同事件监听器可以在组件触发事件的时候直接访问组件。看看下面的例子:

<h:commandButton id="redisplayCommand" type="submit" value="Redisplay"

actionListener="#{myForm.doIt}"/>

在上面的例子中用户点击按钮之后触发了动作事件,但是不是调用动作方法而是调用了事件监听器方法:

public void doIt(ActionEvent event)

{

HtmlCommandButton button = (HtmlCommandButton)event.getComponent();

button.setValue("It’s done!");

}

这个方法修改了按钮的标签值,当然这并不常用。与动作方法不同,动作方法没有参数并行会返回一个结果,动作监听器有一个ActionEvent参数而且不返回任何结果。这个方法执行后页面会重显。

通常你可以使用动作监听器有关有关页面的值。和值变化监听器一样你也可以通过实现一个接口来实现动作监听器类,不过通常将它作为一个支持Bean中的方法就足够用了。

原文地址:https://www.cnblogs.com/cxyzl/p/2618073.html