在 JSF 应用程序中添加“命令栏”组件

使用业务流程编排器资源管理器的“命令栏”组件来显示带有按钮的栏。这些按钮代表作用于对象详细视图或列表中的所选对象的命令。

执行本任务的原因和时间

当用户单击用户界面中的按钮时,将对所选对象运行相应的命令。您可以在 JSF 应用程序中添加和扩展“命令栏”组件。

本任务的步骤

  1. 在 JavaServer Pages(JSP)文件中添加“命令栏”组件。

    <h:form> 标记中添加 bpe:commandbar 标记。bpe:commandbar 标记必须包含 model 属性。

    以下示例说明如何添加“命令栏”组件以显示任务实例的某些属性。

    <h:form>
    
       <bpe:commandbar model="#{TaskInstanceList}">
          <bpe:command commandID="Refresh" >
                       action="#{TaskInstanceList.refreshList}"
                       label="Refresh"/>
    
          <bpe:command commandID="MyClaimCommand" >
                       label="Claim" >
                       commandClass="<customcode>"/> 
       </bpe:commandbar>
    
    </h:form>

    model 属性引用了一个受管 Bean。这个 Bean 必须实现 ItemProvider 接口并提供选择的 Java™ 对象。“命令栏”组件通常与同一个 JSP 文件中的“列表”组件或“详细信息”组件配合使用。通常,该标记中指定的 model 与同一页面中的“列表”组件或“详细信息”组件中指定的 model 相同。因此,对于“列表”组件,命令将对该列表中的所选项执行操作。

    在本示例中,model 属性引用了名为 TaskInstanceList 的受管 Bean。这个 Bean 提供了 Java 对象的属性,它必须实现 ItemProvider 接口。此接口是由 BPCListHandler 类和 BPCDetailsHandler 类实现的。它还包含一个定制的声明命令。

  2. 可选: 配置 bpe:commandbar 标记中引用的受管 Bean。

    如果“命令栏”组件的 model 属性引用了已配置的受管 Bean(例如列表或详细信息处理程序的受管 Bean),则不需要进行进一步的配置工作。如果更改了这些处理程序中任何一个的配置,或者使用了另一个受管 Bean,则必须在 JSF 配置文件中添加实现了 ItemProvider 接口的受管 Bean。

  3. 在 JSF 应用程序中添加实现了定制命令的代码。

    以下代码段说明如何编写扩展命令栏的命令类。JSP 文件中的 bpe:command 标记引用了此命令类(MyClaimCommand)。

    此命令将检查前置条件以及任何其他先决条件,例如所选项的数目是否正确。然后,它检索对名为 HumanTaskManagerService 的人员任务 API 的引用。此命令对所选对象进行迭代并尝试处理它们。任务是 HumanTaskManagerService API 使用标识声明的。如果未发生异常,就会更新相应 TaskInstanceBean 对象的状态。此操作避免了再次从服务器检索对象值。

    public class MyClaimCommand implements Command {
    
      public String execute(List selectedObjects) throws ClientException {
    	    if( selectedObjects != null && selectedObjects.size() > 0 ) {
      	 try {
             // Determine HumanTaskManagerService from an HTMConnection bean. 
             // Configure the bean in the faces-config.xml for easy access 
             // in the JSF application.
    		       FacesContext ctx = FacesContext.getCurrentInstance();
             ValueBinding vb = 
               ctx.getApplication().createValueBinding("{htmConnection}");
             HTMConnection htmConnection = (HTMConnection) htmVB.getValue(ctx);
             HumanTaskManagerService htm = 
                htmConnection.getHumanTaskManagerService();
    
             Iterator iter = selectedObjects.iterator() ;			
             while( iter.hasNext() ) {
               try {
                    TaskInstanceBean task = (TaskInstanceBean) iter.next() ;
                    TKIID tiid = task.getID() ; 
    						
                    htm.claim( tiid ) ;
                    task.setState( new Integer(TaskInstanceBean.STATE_CLAIMED ) ) ;
    						
               }
               catch( Exception e ) {
                 ;			// Error while iterating or claiming task instance.
                      // Ignore for better understanding of the sample.
               }
             }
           }
           catch( Exception e ) {
             ; 	// Configuration or communication error.
               // Ignore for better understanding of the sample
           }
         }
         return null;
      }
    
     // Default implementations
     public boolean isMultiSelectEnabled() { return false; }
     public boolean[] isApplicable(List itemsOnList) {return null; }
     public void setContext(Object targetModel) {; // Not used here }
    }
    
    命令是按以下方式处理的:
    1. 当用户单击命令栏中的相应按钮时,就调用了命令。“命令栏”组件从 model 属性中指定的项提供者检索所选项,并将所选对象列表传递给 commandClass 实例的 execute 方法。
    2. commandClass 属性引用实现了 Command 接口的定制命令实现。此命令必须实现 public String execute(List selectedObjects) throws ClientException 方法。此命令返回的结果将用于确定 JSF 应用程序的下一个导航规则。
    3. 此命令完成后,“命令栏”组件将对 action 属性进行求值。action 属性可以是静态字符串,也可以是具有 public String Method() 特征符的 JSF 操作方法的方法绑定。请使用 action 属性来覆盖命令类的结果或者显式地指定导航规则的结果。如果该命令抛出除 ErrorsInCommandException 异常以外的异常,则不会处理 action 属性。

结果

现在,JSF 应用程序包含一个 JavaServer 页面,该页面实现了定制的命令栏。

使用条款 |


(c) Copyright IBM Corporation 2005, 2006.
本信息中心基于 Eclipse 技术(http://www.eclipse.org)。