处理命令提交

作者:Inderjeet Singh 及 Jayashri Visvanathan

问题描述

Web 应用程序经常需要在 Web 页中显示一个表单以获取用户输入的内容。命令提交是在用户激活 UICommand 类型组件时,触发应用程序特定命令或操作的过程。例如,当用户单击 Web 页上的“提交”按钮时,便会提交 Web 表单。通常使用这种提交方式来执行服务器端操作。另一示例涉及:用户登录、让用户浏览下一个页面。

Web 页开发者必须确定如何处理这些命令提交。JavaServer[TM] Faces API 提供了以下两个选项:ActionActionListener。下面描述了针对每种情况所应采取的有效策略。

进行设计选择之前,应该注意下列事项:

解决方案

下表总结了一些有关处理命令提交的建议。

策略 建议
使用 Action 用于 JavaServer Faces 组件的一般事件处理
使用 ActionListener 用于 JavaServer Faces 组件的事件处理,仅当需要标识引发该事件的组件时才适用

只要在一个 (UICommand) 组件被激活时另一个组件就需要修改其状态,对于这种情况,通常应当使用操作侦听程序。例如,表单上可能有一个按钮,用于在“压缩”版表单(只有几个字段)和“完整”版表单(带有所有可能的字段)之间进行切换。尽管页作者可以直接在页面中注册操作侦听程序,但大多数情况下可以通过编程方式由组件本身来完成此项操作。操作侦听程序不能直接影响导航。

另一方面,操作应该被视为主设计元素,用来调用可能会影响导航的应用程序操作,包括任何正在考虑的命令是表单上的提交按钮的情况。该操作方法可返回 null 以重新显示当前页,或返回一个可映射到导航规则的结果字符串,以确定下一步要显示的页。

在设计定制 JavaServer Faces 组件时,有时您会同时需要这两种行为。例如,请考虑用于导航对象分层结构的定制树状组件。假设单击了某个按钮,您希望通知其他组件,并希望将结果与导航规则关联。这时您可以同时使用操作和操作侦听程序。但是,大多数情况下,操作侦听程序的注册对于页作者可能是透明的,因为组件会自行注册操作侦听程序。一个设计完善的定制组件不需要页作者显式注册操作侦听程序(使用 <f:action_listener> 标记),因为这样会向页作者公开组件实现的详细信息。其次需要考虑的情况是:最终设计主要使用 Action 来处理大多数的命令提交。只有在您需要从生成事件的 UI 元素提取信息等少数情况下,才需要使用 ActionListener

使用操作

操作映射包括两种类型:静态和动态。当下一页内容非常明确并且不需要为支持 Bean 调用任何操作方法时,使用静态映射。代码示例 1 说明了如何指定静态操作映射:

  <b>User Name:</b> <h:inputText id="userName" value="#{CommandSubmissionsBean.userName}"/><br>
  <b>Password:</b> <h:inputText id="password" value="#{CommandSubmissionsBean.password}"/><br>
  <h:commandButton id="guest" action="success" value="Guest Login" />


代码示例 1:静态操作映射

对于标有 Guest Login 的按钮,操作映射指定为 success。这样便会从该页调用与 success 结果对应的导航规则。代码示例 2 显示了 faces-config.xml 文件中导航规则的相应定义:

  <navigation-rule>   
    <from-view-id>/index.jsp</from-view-id>
    <navigation-case>
      <description>           
        Indicates to the NavigationHandler that the response.jsp view
        must be displayed if the Action referenced by a UICommand
        component on the index.jsp view returns the outcome
        "success".       
      </description>
      <from-outcome>success</from-outcome>
      <to-view-id>/response.jsp</to-view-id>   
    </navigation-case>
  </navigation-rule> 


代码示例 2:index.jsp 中 success 结果的导航规则

请注意,可以定义多种导航情况,每种情况对应不同的结果。

也可以通过指定一个操作方法而不是指定结果来动态定义操作映射。代码示例 3 说明了如何完成此操作:

  <b>User Name:</b> <h:inputText id="userName" value="#{CommandSubmissionsBean.userName}"/><br>
  <b>Password:</b> <h:inputText id="password" value="#{CommandSubmissionsBean.password}"/><br>
  <h:commandButton id="submit" action="#{CommandSubmissionsBean.login}" value="Login" />


代码示例 3:静态操作映射

对于标有 Login 的按钮,操作映射会调用支持 Bean CommandSubmissionBean 中的 login 方法。如果 login 方法返回 success 结果,则会按照代码示例 2 中的导航规则调用 response.jsp

使用操作侦听程序

页作者可以为 JavaServer Faces 页自身中的任何标准组件指定操作侦听程序。代码示例 4 说明了如何为 JavaServer Faces commandButton 指定操作侦听程序:

  <h:commandButton actionListener="#{CommandSubmissionsBean.detailsActionListener}" id="details" value="Show More Details"/>

代码示例 4:指定操作侦听程序

对于标有 Show More Details 的按钮,将支持 Bean CommandSubmissionBean 的方法 detailsActionListener 指定为操作侦听程序。只要按下该按钮,就会调用此方法。该方法可以访问页中的所有其他组件,并可以根据需要修改它们的状态。

参考资料

有关本主题的详细信息,请参阅以下资料:
© Sun Microsystems 2005。Java BluePrints Solutions Catalog 中的所有内容受版权保护,未经 Sun Microsystems 的明确书面许可,不得在其他产品中发布。