|
作者:Beth Stearns 和 Craig McClanahan
|
|
|
| 当您编写页面支持 Bean 的代码时,需要注意事件是如何以及何时进行处理的。某些事件会导致 IDE 将代码交由项目外的组件进行处理,这可能是由于要验证某些输入数据、要从数据库表中检索数据,或者其他某些原因所致。这称为事件处理生命周期。您需要了解何时出现这类情况以及应用程序之外会发生什么情况,以便开发出最优化的代码。 |
Sun Java Studio Creator 2 将应用程序事件处理生命周期简化为四种生命周期方法。您无需再了解 JavaServer Faces 请求处理生命周期(尤其是该生命周期前后阶段的各种侦听程序方法,以及该生命周期如何应用于各个页面)。这样就可以将主要精力投入到生成处理事件的代码以及在何处放置代码上。由于模型是事件驱动型的,因此您可以集中处理主要事件,即页面将被呈现,或者某些数据将从事务或操作中返回等事件。通过该模型,您可以在这些主要事件发生之前先执行某些操作。
使用 Creator 早期发行版本的用户须知:Creator 2 不会强迫您迁移到这些新的事件处理生命周期方法。如果您已构建了依赖于 JavaServer Faces 请求处理生命周期的应用程序,则可以保留这些方法。
通过使用新的事件处理生命周期方法,您可以将业务逻辑放入相应的事件处理程序中,而无需了解在请求处理生命周期中进行的任何操作。使用这些方法还可以使您更轻松地为页面 Bean 生成单元测试。
新的事件处理生命周期模型使用了 AbstractPageBean 类中定义的四种方法,Creator 框架将调用这些方法:
init 方法,当应用程序首次导航到某一页面时将调用该方法。当视图处理程序创建新的视图或恢复视图时将调用 init 方法。这种情况可能在用户导航到新页面,或首次调用应用程序的起始页时出现。当提交表单并返回某些传回数据时,也会导致恢复视图操作,并调用 init 方法。init 方法始终是在页面将被显示时调用,无论是由简单呈现引起还是由传回操作所引起。
init 方法取代了使用页面 Bean 构造函数来存储或设置值。init 方法可保存或更改页面中显示的组件值。其功能是允许您设置组件以进行后续处理。无论是首次显示页面,还是在发生传回操作后重新显示页面,您都应使用 init 方法对页面执行所需的操作。
请记住,init 方法是在对组件应用任何请求参数之前调用的。这意味着,您查看的是组件的先前状态。
preprocess 方法,当页面稍后处理传回时,框架将调用该方法。显示应用程序起始页时不会调用 preprocess 方法,因为此时只需呈现该页面即可。在提交表单进行处理前,应使用 preprocess 方法来设置或保存值。
prerender 方法,当页面即将呈现响应时会调用该方法。您可能需要将代码包含在 prerender 方法中,以便在页面重新显示之前对传回数据执行某些操作。
了解何时正确使用 prerender 方法是至关重要的。一般而言,仅当页面将被显示时,才应在 prerender 方法中加入代码来收集所需的数据。为了说明这一点,假设某个表组件由耗时的 SQL 查询来支持。如果操作方法导航到另一个页面,并且如果不呈现该耗时查询的结果,则不希望执行该查询。在这种情况下,您应通过 prerender 方法来执行该查询,因为这可确保仅当显示结果页面时才会执行查询。
destroy 方法,当调用了 init 方法后将调用该方法。
例如,出现传回并需要重新显示响应数据时,框架将首先调用 init 方法,随后调用 preprocess 方法。完成 preprocess 方法后,应用请求值的 JavaServer Faces 各个阶段立即会转入操作。这些阶段结束后,会将控制权返回给应用程序,这时框架便会调用 prerender 方法。JavaServer Faces 呈现响应阶段会接手框架的工作,最后框架将调用 destroy 方法来结束生命周期。
如何利用此生命周期?如果您需要在处理或与用户交互后重新显示相同的页面,则可能需要使用某种机制来保存以前输入的数据值,因为每次显示页面时,框架都会创建新的页面。您可以使用 init 方法加载保存在其他位置(如在会话 Bean 或应用程序 Bean 中)上的数据。同时,您可以将代码添加到 destroy 方法中,以便将特定的数据值保存到会话 Bean 或应用程序 Bean 中,这样在下次执行 init 方法时,就可以将这些数据值重新加载到页面中(如果在呈现页面之前先重新创建页面)。
以下代码片段显示了如何使用 init 和 destroy 方法来检索当前光标在数据表中的位置并保存该位置。请注意,init 和 destroy 方法不包含在页面 Bean 的构造函数中。
public class Page1 extends AbstractPageBean {
//constructor
public Page1() {
...
}
...
public void init() {
personDataProvider.setCursorRow(
getSessionBean1().getCurrentPersonRowKey());
}
public void destroy() {
getSessionBean1().setCurrentPersonRowKey(
personDataProvider.getCursorRow());
}
...
}
小结
通过了解事件处理生命周期及其方法,您可以优化代码,从而最大限度地满足每个应用程序自身的特定约束和处理需要。
更多的开发者资源
有关为开发者提供的更多技术提示、文章和专家建议,请访问 Sun Developer Network (SDN) 上的 Java Studio Creator 开发者资源,网址为 http://gceclub.sun.com.cn/prodtech/javatools/jscreator/。
|