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
指定为操作侦听程序。只要按下该按钮,就会调用此方法。该方法可以访问页中的所有其他组件,并可以根据需要修改它们的状态。