分享
 
 
 

使用 WebSphere 工具开发业务流程门户应用程序

王朝厨房·作者佚名  2007-01-03
窄屏简体版  字體: |||超大  

级别: 初级

Andreas Nauerz, 软件工程师, IBM Boeblingen Lab

Juergen Schaeck, 软件工程师, IBM Boeblingen Lab

Thomas Schaeck, 软件架构师, IBM Boeblingen Lab

2005 年 8 月 8 日

本文通过一个普通的旅行编排业务场景说明了如何向最终用户提供一种有效处理任务的方法。使用业务流程集成(IBM® WebSphere® Portal Version 5.1 中的一个新功能)支持业务流程中需要人工参与的任务(例如,完成在线表单)。在本文中使用到了业务流程执行语言 (BPEL) ,基于 BPEL 的工作流在 WebSphere Business Integration Server Foundation Version 5.1.1 中运行。本文是为这样一些人撰写的:为了在其门户中支持业务处理而协作的业务流程设计人员、Portlet 应用程序开发人员,以及门户管理员。读者应该熟悉 Portlet 应用程序开发和业务流程设计。本文主要介绍了将业务流程集成到门户的编程的各个方面,没有详细描述业务流程建模。有关流程建模和工具的详细信息,请参阅参考资料。

引言

在随需应变的业务环境中,客户、员工和供应商之间的高效交互至关重要,各种业务需要允许这三方在业务流程中无缝地参与和协作。开发人员需要提供界面来支持与业务流程的人工交互,例如填写表单或对警告予以响应。需要在合适的时间将这些界面提供给合适的人,并且这些界面应该能够促进快速的操作和高效的处理。还需要向用户提供处理它们所需的信息、应用程序,以及表单。在本文中,将这些涉及人工交互的任务称为人工任务 (human task)。

在 WebSphere Portal 中,流程中的每一个面对人的活动都与一个任务页定义相关联,任务页定义的内容通常包含任务处理 Portlet。这些 Portlet 检索人员活动的输入消息,将消息显示给用户,获得用户输入,并将其写入系统中。该页上的其他 Portlet 不能与工作流系统直接进行通信,但可以帮助处理任务,因此称为支持 Portlet。有关业务集成功能的概述和更加详细的信息,请参阅 WebSphere Portal V5.1 Information Center 的集成业务流程部分。

当用户单击 My Tasks Portlet 中显示的某个任务时(该 Portlet 是 WebSphere Portal 所附带的,并为用户列出了所有任务),系统会在导航区中动态地向用户显示任务页。由关联的任务页定义来定义它的布局。用户可以使用该页上的 Portlet,一旦任务完成,此页就会消失。下面的场景说明了这一概念。本文的其他部分通过旅行请求审批 (Travel Request Approval) 示例场景向您演示了开发业务流程门户应用程序的步骤。

下载和运行示例应用程序

请下载示例应用程序和源代码。解压缩 bp-portal-sample.zip 文件并打开 readme.html 文件,该文件描述了设置说明的内容和链接。

示例场景介绍

虚构的 ACME 公司的一名员工希望到纽约旅行,参加一个会议。他在预订旅行之前,需要发出一个旅行请求,他的请求必须经过经理的审批。他将旅行偏好作为请求的一部分进行定义,随后行政助理将利用这些偏好为他预订飞机。该旅行应用程序作为 ACME 公司员工门户的一部分提供。

下面是一个典型的交互流。

员工在浏览器中打开旅行请求页。此页包括一个旅行请求 Portlet,员工可以使用它来发出旅行请求,此页还包括一个状态 Portlet,它显示所有正在等待审批的旅行请求以及每个请求的当前状态。

员工将信息(例如,旅行的原因、目的地机场,以及启程日期)输入到旅行请求 Portlet 中,然后单击提交按钮发出请求。

在状态 Portlet 中将显示一个新的旅行请求(请参见图 1)

图 1. Java Beans 视图

此员工的经理(目前正在门户中浏览)在顶部的导航区中看到一个警告,通知他有一个新的任务正在等待批准。

经理单击警告,门户显示当前的任务列表,该列表现在包含需要审批员工旅行的任务。

经理请求这项任务,然后单击它的标题。

图 2:经理的任务列表

门户显示一个新的页,此页包含用户先前输入的旅行请求详细信息和批准或拒绝请求的按钮。经理可以单击此页名称旁边的小 X 来关闭当前的任务页,并且在任何时候都可以重新打开。当经理单击某个按钮时,此页关闭,门户返回到 MyTasks Portlet。

图 3:审批 Portlet

然后,员工的行政助理接收到为旅行预订飞机的任务。他看到一个警告,单击警告来了解当前的任务。

助理声明这项任务,然后单击标题。门户显示一个页,此页包含一个旅行预订 Portlet,它显示员工的旅行偏好,还包含一个航班信息 Portlet,它显示匹配的各个航班。

助理选择一个航班,WebSphere Portal 的 Portlet 间通信(也称为协作 Portlet)机制将所选的航班数据传送到表单,因此该助理无需重新输入数据。

图 4:行政助理使用自动填写的表单预订旅行

员工返回到旅行页来查看旅行请求的状态,看到现在的状态是已批准和已预订。

员工已为旅行做好了准备!

每个用户都可以轻松地处理自己的任务。用户无需担心需要使用的程序或者在何处获取进一步的信息。

您可以轻松地扩展该应用程序。若要添加其他有用的 Portlet(例如,经理的项目日历 (project calendar) 或行政助理的即时消息 Portlet),只需要将它们添加到适当的任务页定义中。

什么是业务流程门户应用程序?

业务流程门户应用程序包括:

业务流程的定义

启动流程的 Portlet

处理人工任务的 Portlet

任务页

创建业务流程门户应用程序涉及到几个团队成员或角色:

流程设计人员定义业务流程,包括控件和数据流、输入和输出消息的语法,以及流程中包含的各个活动的语义。流程设计人员可以使用 WebSphere Business Intergration Modeler 和 WebSphere Application Developer Integration Edition V5.1.1 创建设计。

Portlet 应用程序开发人员使用 Rational Application Developer V6.0.0.1 开发 Portlet。

门户管理员根据其领域的知识组合任务页的内容。门户管理员使用 WebSphere Portal 完成这项工作。

有时,所有这些角色和任务都是由一个开发人员处理。然而,如果不是这种情况(也就是说,多个人员处理这些角色),则流程设计人员必须向 Portlet 开发人员提供下面的信息和代码。

活动规范

活动规范详细描述了活动的目的、输入和输出消息相互关联的方式、消息中各个条目所接受的值,以及输出消息的期望结果。此规范还包含输入和输出消息的正确语法的定义。

生成的类

有两种情况需要交换生成的类。

某个输入/输出消息是嵌套的或包含复杂的类型。在这种情况下,Portlet 必须有权访问这些类。

Portlet 开发人员应该使用一个已经生成且获得采用的 Web 服务或 EJB 接口来启动流程实例,而不是通用 EJB 接口。如果这不是必需的,则可以使用创建流程实例的通用 EJB 接口。在这种情况下,指定模板就够了。

由于门户公开的每一个人工活动都会分配到任务页定义中,因此每一个人员活动都需要有唯一的客户机 UI 标识符。为了保证其唯一性,可以重用 Java™ 包结构模式;例如,acme.travelrequests.approvalPage。流程设计人员需要指定该标识符,然后将它传递给门户管理员,门户管理员将其作为唯一名称分配到任务页定义中。

开发业务流程

可以使用 IBM WebSphere Application Developer Integration Edition V5.1.1(以下称为 Integration Edition)创建业务流程的门户连接。

检验旅行请求流程

图 5 显示了整个示例过程流。

图 5:流程模型

当接收到用户的输入时输入活动开始。输入活动启动旅行审批流程。

approveRequest 表示第一个人员活动。它需要经理根据员工提供的信息决定是否批准请求。

流程引擎是路由到第二个人员活动(要求行政助理预订适当的航班的 bookFlight),还是直接路由到输出节点(如果经理拒绝员工的请求),这取决于经理的决定。

JavaSnippets 存储有关哪个人处理了哪项任务的信息。

将任务页定义分配到活动

应该在门户中处理的每一个活动都与一个任务页定义相关联。在示例应用程序中,approveRequest 活动与包含旅行审批 Portlet 的审批页相关联。应该使用的客户机 UI 标识符(唯一名称)是 wps.ApprovePage。bookFlight 活动与包含 FlightBooking 和 FlightSelect Portlet 的 FlightBook 页相关联。

要设置人员活动和任务页定义之间的关联,业务流程设计人员需要使用 Integration Edition 执行以下操作。

在 Business Integration 透视图中打开项目。

单击应该为其定义客户机 UI 标识符的人员活动;本例中为 approveRequest。

单击 Client 选项卡,然后选择 Client Definitions => Portal。

对于 UniqueName 参数,单击 Value 字段,然后添加唯一名称 wps.ApprovePage。

在 Type 参数中,单击 Value 字段,然后从下拉列表中选择 Page Definition。

图 6:定义客户机 UI 设置

使用 Member Manager 人员插件提供程序

为了将面对人的任务分配给用户,WebSphere Process Choregrapher 使用在运行时分析并定义任务的潜在所有者列表的 Staff Verb。例如,Group Members Staff Verb 返回作为某个特定组的一部分的用户列表。执行分析的组件称为 Staff Plugin,它访问用户资料库,例如,LDAP 或自定义用户注册表 (Custom User Registry),来执行此任务。

有关人员分析 (Staff Resolution) 机制的详细描述,请参阅 WebSphere Application Server Enterprise Process Choreographer:Staff Resolution Architecture。还可以参阅 WebSphere Portal V5.1 InfoCenter 的 Member Manager 人员插件提供程序部分。

为了从 WebSphere Portal 和 WebSphere Process Choreographer 提供用户资料库的统一视图,WebSphere Portal 5.1 附带了一个特殊的人员插件,该插件使用的 WebSphere Member Manager 用户资料库还可以由 WebSphere Portal 使用。

业务流程设计人员使用 Integration Edition 指定用于流程中人员分析的 Member Manager 人员插件提供程序:

在 Services 视图中,右键单击服务项目。

选择 Properties => Staff。

定义人员插件配置的 JNDI 名称;例如,bpe/staff/wpswmmconfiguration。

图 7:指定人员插件提供程序

人员分析与其他人员插件的角色和动词的定义相同。在示例中,审批者组中的所有用户都可以处理 approveRequest 类型的任务。

审批请求:

在编辑器中,单击应该为其定义客户机 UI 标识符的人员活动;例如,approveRequest。

单击 Staff 选项卡。

从可用角色列表中,单击 Potential Owner。

选择 Group Members 作为动词。

输入要使用的组的名称(本例中为 approvers),然后为 IncludeSubgroups 属性从下拉列表中选择 false。

图 8:定义人员分析

生成部署代码

创建或更新流程后,业务流程设计人员可以生成要部署到服务器的代码。在 Integration Edition 中:

在服务项目中,右键单击 .bpel 文件。

选择 Enterprise Services => Generate deploy code。

要导出已经生成的 EJB,右键单击 EJB,选择 Export => Export as EAR,然后选择一个导出目的地。

现在门户管理员可以使用 WebSphere Application Server 管理控制台部署 EAR 文件(或一个更新文件)。有关详细信息,请参考下载中包含的安装说明。

导出任务处理 Portlet 需要的类

在开发业务流程的过程中,必须将一些已经生成的类提供给任务处理 Portlet 开发人员,以将它们包含在 Portlet 应用程序中。

Integration Edition 为 <processname>.wsdl 文件中定义的所有消息和添加到架构中的所有复杂类型生成类。消息的包名附带有 _msg 后缀。例如,当将 WSDL 文件中的目标名称空间设置为 x.y.z.TravelRequest 时,类的包名为 x.y.z.TravelRequest_msg。复杂类型的包名也以类似的方式进行构建,然而,这些包名没有 _msg 后缀。这些类是任务处理 Portlet 所必需的,因此将它们以 JAR 文件的形式放在相应的 Portlet 应用程序的 /WEB-INF/lib 目录中。

要导出包含示例中所需的这些类的 JAR 文件,请执行以下步骤:

右键单击要导出的包:

com.ibm.wps.wfi.sample

com.ibm.wps.wfi.TravelRequestProcess_msg

com.ibm.wps.wfi.TravelRequestProcess_msg_beans

从上下文菜单中选择 Export。

选择 Jar 文件。

为 JAR 文件输入目的位置。

单击 Finish。

开发 Portlet

接下来,您可以演练 Portlet 开发人员创建流程启动和任务处理 Portlet 所采用的步骤。使用 Rational Application Developer Version 6.0(以下称为 Application Developer)创建这些 Portlet。

导入需要的类库

需要将某些类添加到 Portlet 的类路径中。将打包到 JAR 文件中的已经生成的流程消息类添加到 Portlet 的 /Web-Content/WEB-INF/lib 目录中。

在 Application Developer 中,将一个 JAR 文件添加到类路径:

打开显示 Portlet 项目的视图。

打开 Portlet 项目的 /Web-Content/WEB-INF/lib 文件夹。

右键单击 /lib 文件夹。

从上下文菜单中选择 Import。打开导入向导。

选择 Select From File,然后单击 Next。

单击 Browse 选择 JAR 所在的文件夹,然后单击 OK。

选择 JAR 并单击 Finish。

JAR 已导入到 Portlet 项目中。

还需要指定位于 was_root/lib 下的这些 JAR 作为外部 JAR 进行引用:

wsif.jar

wsif-j2c.jar

wsatlib.jar

使用 Rational Application Developer:

打开显示 Portlet 项目的视图。

右键单击项目,然后从上下文菜单中选择 Properties。

选择 Java Build Path。

选择 Libraries 选项卡。

单击 Add External JARs。

浏览上面列出的三个 JAR 文件。

单击 Finish。

开发流程启动 Portlet

要开发流程启动 Portlet,请使用 Business Process Engine of WebSphere Process Choreographer (BPE API)。请参阅参考资料以找到 BPE API 的 Javadoc。

首先,需要编写查找 BPE EJB 的代码。最好不要硬编码 BPE EJB 的位置,而是在 web.xml 中指定 EJB 引用:清单 1. 构建和安装流程

<ejb-ref>

<ejb-ref-name>ejb/BusinessProcessHome</ejb-ref-name>

<ejb-ref-type>Session</ejb-ref-type>

<home>com.ibm.bpe.api.BusinessProcessHome</home>

<remote>com.ibm.bpe.api.BusinessProcess</remote>

</ejb-ref>

要添加一个引用,可以在 Application Developer 中执行以下步骤:

双击 Web Deployment Descriptor。

选择 References 选项卡。

使用 Add 按钮创建一个新的引用。

输入图 9 所示的数据。

图 9:通过 RAD 添加一个 EJB 引用

可以使用 WebSphere Application Server 管理控制台设置引用的特定位置(您可以在不更改源代码的情况下对其进行更改):

选择 Enterprise Applications 下的流程应用程序。

选择 Map EJB references to beans。

图 10:设置 EJB 引用的 JNDI 名称

获得指向 BPE EJB 的引用的代码使用 EJB 引用名称(在示例中为 ejb/BusinessProcessHome)。

public BusinessProcess getBusinessProcessEJB() throws Exception

{

[...]

// Obtain the default initial JNDI context

Context initialContext = new InitialContext();

// Lookup the remote home interface of the BPE EJB

Object result =initialContext.lookup("java:comp/env/ejb/BusinessProcessHome");

// Convert the lookup result to the proper type

BusinessProcessHome processHome=BusinessProcessHome}

javax.rmi.PortableRemoteObject.narrow

(result,BusinessProcessHome.class);

// Create

BusinessProcess process = processHome.create();

return process;

...

启动流程实例的方法需要输入 ClientObjectWrapper,它包装包含真正的输入数据的 WSIFMessage。要检索流程输入消息的空实例,请使用下面的代码。

public ClientObjectWrapper

getProcessInputMessage(BusinessProcess businessProcess, String templateName)

throws Exception

{

ProcessTemplateData templateData =

businessProcess.getProcessTemplate(PROCESS_NAME);

String inputTypeName = templateData.getInputMessageTypeName();

ClientObjectWrapper wrapper =

businessProcess.createMessage(templateData.getID(), inputTypeName);

return wrapper;

[...]

流程启动 Portlet 显示允许最终用户输入数据的表单和用于启动流程实例的 Submit 按钮。当用户单击 Submit 按钮时,门户将触发执行以下代码的 Portlet 操作:

// Get a reference to the BPE EJB

BusinessProcess businessProcess = workflowService.getBusinessProcessEJB();

// Get the process input message

ClientObjectWrapper inputData=

workflowService.getProcessInputMessage(businessProcess, PROCESS_NAME);

WSIFMessage inputMessage = (WSIFMessage) inputData.getObject();

// Fill the values of the input message using the generated Java Bean

TravelRequestInputMessage travelInputMessage=

new TravelRequestInputMessage(inputMessage);

travelInputMessage.setDestination(destination)

[...]

// Trigger the process

businessProcess.initiate(PROCESS_NAME, inputData);

提示:PROCESS_NAME 是流程模板 (process template) 的名称。

开发任务处理 Portlet

要开发任务处理 Portlet,请使用下面的 API:

Task API

WebSphere Process Choreographer 的人工任务管理器

TaskUI Manager API

用于任务用户界面的 Portlet 服务

Property broker API

与其他 Portlet 交换属性

Task API 的 Javadocs 位于 was_root/web/apidocs.task/,其中 was_root 是安装 WebSphere Application Server 的目录。

TaskUI Manager 和 Property Broker API 的 Javadocs 位于 wp_root/doc/Javadoc/WP/API,其中 wp_root 是安装 WebSphere Portal 的目录。

任务处理 Portlet 必须包含由 WebSphere Studio Application Developer Integration Edition 生成的消息类以及用于属性代理支持的特殊类。

任务处理 Portlet 的内部控制流可以分成三个阶段。

从 My Tasks Portlet 检索属性。

处理任务。

关闭任务页。

从 My Tasks Portlet 检索属性

由于 My Tasks Portlet 发送的属性只能传送一次,因此只要属性是必需的,任务处理 Portlet 就必须存储它们。

表 1. My Tasks Portlet 发送到任务处理 Portlet 的属性

名称 值 描述

TaskIDString任务的唯一标识符

ReturnPageIDcom.ibm.portal.ObjectID当任务完成时,用户应该导航到的页的对象 ID。

TaskUIHandlecom.ibm.portal.taskui.TaskUiHandle识别当前任务页的句柄。用于关闭任务页。

任务处理 Portlet 必须指示它可以使用 portlet.xml 中的以下设置检索任务属性:

<preference>

<name>com.ibm.portal.pagecontext.enable</name>

<value>true</value>

</preference>

只有审批 Portlet 和航班预订 Portlet 是从 My Tasks Portlet 检索属性的任务处理 Portlet。通过添加该首选值,启用每一个 Portlet 来检索上下文:

双击 Portlet Deployment Descriptor。

切换到 Portlets 选项卡。

在 Persistent Preference Store 部分中,单击 Add 按钮添加一个新条目。

输入 com.ibm.portal.pagecontext.enable 作为名称,并输入 true 作为值。

图 11:启用 Portlet 以检索上下文

遵从 JSR 168 规范的 Portlet 使用 com.ibm.portal.action.name request 属性检索 processAction() 方法的页面上下文参数。该属性的值是存储上下文条目的一个映射。可以按名称获得每一个属性的值。

因此,在审批 Portlet 和航班预订 Portlet 的 processAction() 方法内,以下代码检索表 1 中的三个属性:

public void processAction(ActionRequest request,

ActionResponse response) throws PortletException, java.io.IOException

{

[...]

// Perform page context processing

String specialAction = request.getParameter(PARAMETER_SPECIALACTION);

if (specialAction != null && specialAction.equals(ACTION_PAGECONTEXT))

{

// This indicates context was passed to the launched page

java.util.Map contextMap = (java.util.Map)

request.getAttribute(PARAMETER_PAGECONTEXT);

// Read the information we need

String taskID = (String) contextMap.get(SESSION_TASKID);

TaskUIHandle taskUIHandle = (TaskUIHandle) contextMap.get(SESSION_TASKUIHANDLE);

ObjectID returnPageID = (ObjectID) contextMap.get(SESSION_RETURNPAGEID);

// Store the properties read in the session

portletSession.setAttribute(SESSION_TASKID, taskID);

portletSession.setAttribute(SESSION_TASKUIHANDLE, taskUIHandle);

portletSession.setAttribute(SESSION_RETURNPAGEID, returnPageID);

}

[...]

处理任务

要处理任务,请执行以下步骤:

使用 TaskManagerDelegateFactoryService 获得 TaskManagerDelegate。TaskManagerDelegate 是 Human Task Manager (HTM) EJB 的业务委托 (business delegate),用于与流程引擎进行交互。因此,审批 Portlet 和航班预订 Portlet 包含以下代码: public void init(PortletConfig portletConfig) throws

PortletException, UnavailableException

{

super.init(portletConfig);

[...]

Context ctx = new InitialContext();

// Obtain a reference to the TaskUIManager service,

which is used to close task pages and to sent a redirect

after closure

PortletServiceHome serviceHome = (PortletServiceHome)

ctx.lookup(SERVICE_TASKUIMANAGER);

taskUIManager = (TaskUIManager)

serviceHome.getPortletService(TaskUIManager.class);

// Obtain a reference to the task manager business

delegate to interact with the process

PortletServiceHome

taskManagerDelegateFactoryServiceHome = (PortletServiceHome)

ctx.lookup(SERVICE_TASKMANAGERDELEGATEFACTORY);

TaskManagerDelegateFactoryService

taskManagerDelegateFactoryService =

(TaskManagerDelegateFactoryService)

taskManagerDelegateFactoryServiceHome.getPortletService(

TaskManagerDelegateFactoryService.class);

taskManager =

taskManagerDelegateFactoryService.getTaskManagerDelegate();

}

从 HTM 中检索输入消息并显示此消息。任务处理 Portlet 使用 TaskManagerDelegate 的 getInputMessage() 方法从 HTM 获得输入消息。所用的 TaskID 是先前从 My Tasks Portlet 中检索的 TaskID 属性。为审批 Portlet 和航班预订 Portlet 配备以下代码:

public void getTravelRequest(PortletRequest request)

{

[...]

// Obtain the TaskID of the current task

String taskID = (String) session.getAttribute(SESSION_TASKID);

// Read the input message

WSIFMessage message = (WSIFMessage)

(((com.ibm.task.api.ClientObjectWrapper)

taskManager.getInputMessage(taskID)).getObject());

[...]

重要:当任务的输入或输出消息包含复杂类型时,请确保将 WebSphere Studio 流程工具为这些消息创建的 Java 类添加到 Portlet 的类路径中。该路径为 Portlet 的 /WEB-INF/classes 目录,如果打包到一个 JAR 文件,则在 /WEB-INF/lib 目录中。

显示输入消息并提供一个用户界面来从用户获得所需的输出数据。作为此步骤的一部分,Portlet 可以通过属性代理与页上的其他支持 Portlet 交换属性。

将输出消息发送到 HTM。用户将信息输入到 Portlet 并提交更改以后,Portlet 使用 TaskManagerService 接口的 setOutputMessage() 将信息发送到 HTM。

对于审批 Portlet,使用输出消息指示经理已批准或已拒绝旅行请求:

// Read the TaskID of the current task

String taskID = (String) portletSession.getAttribute(SESSION_TASKID);

// Obtain the actual task

Task task = taskManager.getTask(taskID);

// Create and set the output message

com.ibm.task.api.ClientObjectWrapper cow=

(com.ibm.task.api.ClientObjectWrapper) taskManager.

createMessage(taskID, task.getOutputMessageTypeName());

WSIFMessage message = (WSIFMessage) cow.getObject();

ApprovalStatusMessage approvalStatus = new

ApprovalStatusMessage(message);

approvalStatus.setManagerApproved(true);

approvalStatus.setWorker(userName.toString());

taskManager.setOutputMessage(taskID, cow);

如果经理拒绝了旅行请求,则将输出消息更改为 approvalStatus.setManagerApproved(false)。

在航班预订 Portlet 中执行类似的操作。

重要:当任务的输入或输出消息包含复杂类型时,请确保将 WebSphere Studio 流程工具为这些消息创建的 Java 类添加到 Portlet 的类路径中。该路径为 Portlet 的 /WEB-INF/classes 目录,如果打包到一个 JAR 文件,则在 /WEB-INF/lib 目录中。

完成任务。Portlet 使用 TaskManagerDelegate 的 complete() 方法。因此,设置输出消息以后,审批 Portlet 和航班预订 Portlet 都使用以下命令完成任务:

// Complete the task

taskManager.complete(taskID);

关闭任务页

Portlet 使用 TaskUIManager Portlet 服务关闭任务页,并使用户返回到任务列表页。

审批 Portlet 和航班预订 Portlet 都使用以下命令关闭任务页:

// Finally close the page and perform the redirect

taskUIManager.closeDynamicUI(request, response, taskUIHandle);

重要:参数 taskUIHandle 包含 My Tasks Portlet 先前发送的属性的值。

关闭此页并设置新的页

最后,setPage() 方法指示只有任务页关闭以后才能打开新的页 (ReturnPageID)。审批 Portlet 和航班预订 Portlet 都使用以下命令重定向到承载 My Tasks Portlet 的页:

taskUIManager.setPage(request, response, returnPageID);

参数 returnPageID 包含 My Tasks Portlet 先前发送的属性的值。

结束语

在本文中,您已经了解如何创建利用 WebSphere Portal 中的业务流程集成功能的应用程序,以将人员、流程和信息连接到一起。您可以使用自己的 Portlet 扩展示例应用程序,或者用自己的版本替换现有的 Portlet。还可以启动公司现有的业务流程。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有