Web 应用程序经常需要在 Web 页中显示一个表单以获取用户输入的内容。命令提交是在用户激活 UICommand 类型组件时,触发应用程序特定命令或操作的过程。例如,当用户单击 Web 页上的“提交”按钮时,便会提交 Web 表单。通常使用这种提交方式来执行服务器端操作。另一示例涉及:用户登录、让用户浏览下一个页面。
Web 页开发者必须确定如何处理这些命令提交。JavaServer[TM] Faces API 提供了以下两个选项:Action 或 ActionListener。下面描述了针对每种情况所应采取的有效策略。
进行设计选择之前,应该注意下列事项:
ActionListener 则不能。 ActionListener 可以访问 ActionEvent。下表总结了一些有关处理命令提交的建议。
| 策略 | 建议 |
|---|---|
使用 Action |
用于 JavaServer Faces 组件的一般事件处理 |
使用 ActionListener |
用于 JavaServer Faces 组件的事件处理,仅当需要标识引发该事件的组件时才适用 |
只要在一个 (UICommand) 组件被激活时另一个组件就需要修改其状态,对于这种情况,通常应当使用操作侦听程序。例如,表单上可能有一个按钮,用于在“压缩”版表单(只有几个字段)和“完整”版表单(带有所有可能的字段)之间进行切换。尽管页作者可以直接在页面中注册操作侦听程序,但大多数情况下可以通过编程方式由组件本身来完成此项操作。操作侦听程序不能直接影响导航。
另一方面,操作应该被视为主设计元素,用来调用可能会影响导航的应用程序操作,包括任何正在考虑的命令是表单上的提交按钮的情况。该操作方法可返回 null 以重新显示当前页,或返回一个可映射到导航规则的结果字符串,以确定下一步要显示的页。
在设计定制 JavaServer Faces 组件时,有时您会同时需要这两种行为。例如,请考虑用于导航对象分层结构的定制树状组件。假设单击了某个按钮,您希望通知其他组件,并希望将结果与导航规则关联。这时您可以同时使用操作和操作侦听程序。但是,大多数情况下,操作侦听程序的注册对于页作者可能是透明的,因为组件会自行注册操作侦听程序。一个设计完善的定制组件不需要页作者显式注册操作侦听程序(使用 <f:action_listener> 标记),因为这样会向页作者公开组件实现的详细信息。其次需要考虑的情况是:最终设计主要使用 Action 来处理大多数的命令提交。只有在您需要从生成事件的 UI 元素提取信息等少数情况下,才需要使用 ActionListener。
对于标有 Guest Login 的按钮,操作映射指定为 success。这样便会从该页调用与 success 结果对应的导航规则。代码示例 2 显示了 faces-config.xml 文件中导航规则的相应定义:
请注意,可以定义多种导航情况,每种情况对应不同的结果。
也可以通过指定一个操作方法而不是指定结果来动态定义操作映射。代码示例 3 说明了如何完成此操作:
对于标有 Login 的按钮,操作映射会调用支持 Bean CommandSubmissionBean 中的 login 方法。如果 login 方法返回 success 结果,则会按照代码示例 2 中的导航规则调用 response.jsp。
对于标有 Show More Details 的按钮,将支持 Bean CommandSubmissionBean 的方法 detailsActionListener 指定为操作侦听程序。只要按下该按钮,就会调用此方法。该方法可以访问页中的所有其他组件,并可以根据需要修改它们的状态。