Thursday, August 03, 2006

JSF 中的事件监听器已近值变化事件

我和我妻子养了几只猫。他们要吃各种各样的食物,所以我必须每天喂他们好几次。有趣的是,不管是我早上从楼上下来还是晚上很晚的回来,他们总是跑过来向我要吃的。这听起来没什么,但是不管在何时我有点害怕这些猫又来要吃的。

前不久,我发现这些猫是事件驱动的。这些猫并不是真的饿了,只不过是在我长时间不在后又出现在他们面前的时候,他们以为是吃饭的事件到了。我的出现对于猫来说意义重大,那代表着吃饭的时间到了。

对于UI来说,事件捕获了来自用户对UI组件的操作。一个事件可以是简单的鼠标单击动作,也可以是相对复杂的操作,比如用户执行一个特定的命令。就像Swing那样,JSF通过JavaBean来控制事件对象和监听器。任何组件都可以发出零到多个事件,开发人员(或者组件自身)也可以注册零到多个监听器来处理这些事件。我把我的猫想象成食物监听器,他们监听着产生食物的事件

对于Web应用程序来说事件的内容发生了根本性的变化。通常,web应用程序的开发人员必须考虑请求-相应对象,这两个对象是底层Http协议的通信机制。对于大多数应用程序来说这没什么问题,但对于面向业务的应用程序来说这带来了不必要的复杂性,这使应用程序与底层协议关联的太多。

在开发JSF应用程序的时候,集成应用程序业务逻辑的过程实际山就是给组件分配适当的监听器来处理相应的事件。你无需再考虑请求相应对象。JSF提供了常见的面向接口的方法来开发事件监听器,你还可以将一个方法直接注册成一个监听器(只要有适当的签名)。

4种标准事件:值变化事件,动作事件,数据模型事件和状态事件。当用户修改输入组件的值时,值变化事件将被触发。当用户激活命令组件的时候,比如按钮,动作事件被触发。当一个数据感知组件被选中一行的时候,数据模型事件被触发。当JSF处理一个HTTP请求的时候,状态事件被触发。

尽管,JSF框架只定义了这4种默认的事件,但是对于事件的类型并没有限制,第三方组件或者是开发人员自己都可以定义自己需要的事件类型。

1、 值变化事件

当用户在输入组件种录入一个新的值时,就会产生一个值变化事件。你可以通过值变化监听器来处理这个事件。

比如你在同一个页面上存在HtmlInputText HtmlPanelGrid两个组件:

...

注意:对于HtmlInputText组件我们通过JSF EL 指定了一个valueChangeListener监听器。这个监听器的指向了我们在支持Bean中定义的方法:myForm.processValueChanged。另外,panelGrid绑定到了支持BeanmyForm.changePanel属性,所以它可以通过Java代码控制。panelGridrendered属性是false,所以初始化时用户时看不到它的。

当用户修改了HtmlInputText的值并提交之后,JSF将产生一个值变化事件,这个事件将被注册的监听器方法处理:

public void processValueChanged(ValueChangeEvent event)

{

HtmlInputText sender = (HtmlInputText)event.getComponent();

sender.setReadonly(true);

changePanel.setRendered(true);

}

在上面的例子中监听器方面将组件的只读属性设置为true。因此,用户永远都无法修改这个组件的值。并且将changePanel面板的rendered属性设置为true,所以这个面板在页面再次显示的时候将会被用户看到。事件监听器还可以增加消息或者指向其他的JSF操作,或者执行应用程序逻辑。

另外,你还可以通过实现一个接口来创建一个事件监听器类,但是,大多数时候给组件关联一个相应的方法就足够用了。

No comments: