Cordys BOP 4平台开发入门实战演练——Webservices开发(2)

1、前言

本文主要是通过实战演练,介绍各类个性化、自定义WebService及其方法的开发方法,以及相关技术,重点介绍Cordys NOM类型(底层基于C语言的XML对象解析),以及Java中Soap WebService的调用技术。

首先介绍本文所依赖的数据库设计,采用常用的主从表模式,包括:用户账号表“sm_account”、登录验证用户表“sm_auth_account”、租户账号表“sm_tenant_account ”,提供人员多重身份的流程能力(人员跨部门、跨租户)。

设计数据库查询SQL如下所示:

select a.user_name,a.acc_code,a.acc_name,a.create_time ,b.auth_account,c.org_id,c.tenant_account,c.tenant_name

from sm_account a ,sm_auth_account b,sm_tenant_account c

where a.acc_id=b.acc_id and a.acc_id=c.acc_id;

2.不依赖数据库创建自定义类和Webservice

此操作仍需在WS_AppServer Package界面来进行。

(1)创建自定义类及属性

按上图所示,操作鼠标点击(Create Model from Object Layout),在“Object
Layout Editor”输入Name为“C_USER”。此类与数据库表模型没有直接关系,是完全自主设计的新类。(注:多次实践验证后,示例代码的类名称替换为C_UserManger,WebService名称替换为C_UserManger,代码内容基本没有变)

如果关闭了“Object Layout Editor”界面,在次进入编辑,需要通过鼠标右键菜单“Edit Object Layout”来进行。注意:属性“Attributes”,必须通过此界面进行设置。

(2)添加方法

添加方法与普通方式一样,鼠标右键打开菜单添加。

(2.1)设置方法“Method”返回值等属性

上图中,“Occurrnce”选择框中,选“1”为返回单行记录,选“*”为返回多行记录。

注意:必须设置成SOAP方法,才能发布成可见的Webservice。

(2.2)添加方法参数

public static com.unicom.xiaoywwsappserverpackage.C_UserManager getC_UserObject(String v_tenantcount)

{

String sql="select a.user_name U_NAMENAME,b.auth_account U_ACOUNT,c.org_id ORG_ID,c.tenant_account U_TENANTACOUNT,c.tenant_name U_TENANTNAME";

sql = sql+ " from sm_account a ,sm_auth_account b,sm_tenant_account c ";

sql = sql + " where a.acc_id=b.acc_id and a.acc_id=c.acc_id and c.tenant_account = :v_tenantcount ";

QueryObject query = new QueryObject(sql);

query.addParameter("v_tenantcount", "sm_tenant_account.tenant_account", QueryObject.PARAM_STRING,v_tenantcount);//NOPMD

query.setResultClass(C_UserManager.class);

return (C_UserManager) query.getObject() ;

}

(注:培训老师要求,数据库查询语句的字段别名要与类的属性名称保持一致。)

3、开发时使用外部Jar包依赖

(1)上传Jar包

在项目中,新建“Jar”文件夹,通过鼠标右键菜单“Upload Document...”功能完成。

(2)添加依赖类包

(3)再发布Java代码

4、自定义XML解析

项目规范使用Cordys推荐的NOM类型进行XML处理,在此举例说明,输入NOM(自定义XML)。修改方法输入参数为NOM。

(1)重新生成Java代码。

(2)定义输入XML数据

<USER>

<ACCNAME>xiaoyw</ACCNAME>

<USERNAME>肖永威</USERNAME>

<ACCCODE>101</ACCCODE>

</USER>

<TENANTUSER>

<U_TENANTACCOUNT>manager</U_TENANTACCOUNT>

<U_TENANTNAME>项目经理</U_TENANTNAME>

<U_TENANTDN>o=harbin,cn=cordys,cn=expense,o=HL.CHINAUNICOM.CN</U_TENANTDN>

</TENANTUSER>

<TENANTUSER>

<U_TENANTACCOUNT>programer</U_TENANTACCOUNT>

<U_TENANTNAME>程序员</U_TENANTNAME>

<U_TENANTDN>o=harbin,cn=cordys,cn=expense,o=HL.CHINAUNICOM.CN</U_TENANTDN>

</TENANTUSER>

对应测试请求如下:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">

<SOAP:Body>

<CreateUser xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">

<v_user>

<USER>

<ACCNAME>xiaoyw</ACCNAME>

<USERNAME>肖永威</USERNAME>

<ACCCODE>101</ACCCODE>

</USER>

<TENANTUSER>

<U_TENANTACCOUNT>manager</U_TENANTACCOUNT>

<U_TENANTNAME>项目经理</U_TENANTNAME>

<U_TENANTDN>o=harbin,cn=cordys,cn=expense,o=HL.CHINAUNICOM.CN</U_TENANTDN>

</TENANTUSER>

<TENANTUSER>

<U_TENANTACCOUNT>programer</U_TENANTACCOUNT>

<U_TENANTNAME>程序员</U_TENANTNAME>

<U_TENANTDN>o=harbin,cn=cordys,cn=expense,o=HL.CHINAUNICOM.CN</U_TENANTDN>

</TENANTUSER>

</v_user>

</CreateUser>

</SOAP:Body>

</SOAP:Envelope>

(3)主从表插入操作代码

/*自行管理数据库事务Demo代码,用于主从表插入操作,附代码演示插入主表后,获取自增长主键值,插入子表;方法属性中Transcation设置为NONE*/

public static void createUser(int v_user)

{

BSF.startTransaction();

long acc_id =0;

int accountXML = XPath.getFirstMatch("*[local-name()=‘USER‘]", null, v_user);

String accountName = Node.getDataWithDefault(XPath.getFirstMatch("*[local-name()=‘ACCNAME‘]", null, accountXML), "");

String userName = Node.getDataWithDefault(XPath.getFirstMatch("*[local-name()=‘USERNAME‘]", null, accountXML), "");

String accountCode = Node.getDataWithDefault(XPath.getFirstMatch("*[local-name()=‘ACCCODE‘]", null, accountXML), "");

sm_account ACCOUNT = new sm_account(BusObjectConfig.TRANSIENT);

try {

ACCOUNT.setAcc_code(accountCode);

ACCOUNT.setAcc_name(accountName);

ACCOUNT.setUser_name(userName);

ACCOUNT.setIs_admin((short)0);

ACCOUNT.insert();

BSF.commitTransaction();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

BSF.abortTransaction();

return;

} finally {

if (accountXML != 0){

Node.delete(accountXML);

accountXML = 0;

}

}

acc_id = ACCOUNT.getAcc_id();

BSF.startTransaction();

sm_auth_account AUTH_ACC = new sm_auth_account(BusObjectConfig.TRANSIENT);

try {

AUTH_ACC.setAcc_id(acc_id);

AUTH_ACC.setAuth_account(accountName);

AUTH_ACC.insert();

BSF.commitTransaction();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

BSF.abortTransaction();

return;

}

int[] usersXML = XPath.getMatchingNodes("*[local-name()=‘TENANTUSER‘]", null, v_user);

for(int userXML:usersXML)

{

BSF.startTransaction();

sm_tenant_account Tenant_Account = new sm_tenant_account(BusObjectConfig.TRANSIENT);

Tenant_Account.setAcc_id(acc_id);

Tenant_Account.setTenant_account(Node.getDataWithDefault(XPath.getFirstMatch("*[local-name()=‘U_TENANTACCOUNT‘]", null, userXML), ""));

Tenant_Account.setTenant_name(Node.getDataWithDefault(XPath.getFirstMatch("*[local-name()=‘U_TENANTNAME‘]", null, userXML), ""));

Tenant_Account.setTenant_dn(Node.getDataWithDefault(XPath.getFirstMatch("*[local-name()=‘U_TENANTDN‘]", null, userXML), ""));

Tenant_Account.setTenant_code("99");

Tenant_Account.setOrg_id(8);

Tenant_Account.setIs_default((short)0);

Tenant_Account.setStatus_sign((short)1);

try {

Tenant_Account.insert();

BSF.commitTransaction();

} catch (Exception e) {

e.printStackTrace();

BSF.abortTransaction();

return;

}finally {

if (userXML != 0){

Node.delete(userXML);

userXML = 0;

}

}

}

}

注意:在异常处理增加finally,用于处理清除NOM内存。“Node.delete(accountXML )”

5、使用Eclipse进行远程调试

-Xdebug

-Xnoagent

-Xrunjdwp:transport=dt_socket,server=y,address=8818,suspend=n

在Eclipse上配置调试

快速添加代码

6、调用外部Service

先建UDDI

7、调用外部Jar包,生成Webservices

要求代码中的方法写成static,可以发布成Webservice。由于时间紧迫,不等后续完成,先发布此文档,请关注后续,主要是解决使用MongoDB的解决方案。

8、整合SOAP,Java调用Soap

通过“Operation Test tools”工具测试,测试报文和结果如下:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">

<SOAP:Body>

<GetNameByCode xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">

<v_code>manager</v_code>

</GetNameByCode>

</SOAP:Body>

</SOAP:Envelope>

通过Webservice方法调用SOAP代码如下:

import com.cordys.cpc.bsf.busobject.BSF;

import com.cordys.cpc.bsf.busobject.BusObjectConfig;

import com.cordys.cpc.bsf.busobject.BusObjectIterator;

import com.cordys.cpc.bsf.soap.SOAPRequestObject;

import com.eibus.xml.nom.Node;

import com.eibus.xml.xpath.XPath;

public static String getNameByCode(String v_code)

{

String[] paramNames = {"v_tenantcount"};

Object[] paramValues = {v_code};

String nameSpace = "http://schemas.cordys.com/XiaoywWSAppServerPackage";

String methodName = "GetC_UserObject";

SOAPRequestObject sro = new SOAPRequestObject(BSF.getOrganization(),nameSpace,methodName,paramNames,paramValues);

int response = 0;

String uname = null;

try{

response = sro.execute();

uname = Node.getData(XPath.getXPathInstance(".//U_TENANTNAME").firstMatch(response, null));

if (uname == null){

uname = "null";

}

} catch(Exception e) {

return e.getMessage();

} finally {

if (response !=0){

Node.delete(response);

response = 0;

}

}

// TODO implement body

return uname;

}

上文代码调用是前面开发的Webservices,方法是“GetC_UserObject”,命名空间“nameSpace”都在此方法请求报文中,如下图所示。

解析返回报文:

response = sro.execute();

uname = Node.getData(XPath.getXPathInstance(".//U_TENANTNAME").firstMatch(response, null));

草稿完成于2015年4月2日

时间: 2024-10-18 19:57:08

Cordys BOP 4平台开发入门实战演练——Webservices开发(2)的相关文章

Cordys BOP 4平台开发入门实战演练——Webservices开发(1)

0.文章导读 本文档针对Cordys BOP-4 WS-AppServer基础功能进行验证和快速开发指导.(高级实践文档请参考后续文档). 0.1.WS-AppServer概述 WS-AppServer是Web Service Application Server的简称,是Cordys平台中基于数据库的Java业务逻辑开发层,其最根本的特性如下: (1)连接数据库 WS-Apps通过连接池访问数据库,可以从数据库表结构直接产生相应的Java代码,并发布成Web服务: 提供事务处理(transac

Cordys BOP 4平台开发入门实战演练——Webservices开发(使用MongoDB数据库)

1.在WS-AppServer Package中新建自定义类"C_MongoPackage" 2.添加自定义方法Method,expandDocument和findDocuments两个方法. 3.方法设置两个参数,分别是collectionName和JSONString. 4.由系统产生Java代码 5.弹出如下"Generate Java Code on WS-AppServer Models"窗口. 6.由系统生产WebService 7.弹出Generate

Cordys BOP 4平台开发入门实战演练——While循环流程建模开发及测试

关于While循环 Cordys C3版本中,While循环解释如下: While循环是BPMN组构造,用于一组活动或子流程执行所满足的While条件.在每个循环体开始,进行测试条件,如果测试结果为"假"是则不执行.因此,这组活动或子流程将执行0或多次.While结构用于执行多次循环或根本不执行:也就说,从开始条件是假,将不执行循环.当在循环体内迭代循环,当前循环的打破也是下一次循环迭代的开始.打破循环功能有助于打破或退出循环,继续执行循环体后续活动环节.While结构代表图例如下图1

Cordys BOP 4平台开发入门实战演练——Until流程建模开发

关于Until流程 Until是BPMN组结构,用于一组活动环节或子流程在条件为真之前执行.不象While组结构,这组活动环节或子流程至少执行一次.Until结构图表示如下图1所示. 图1 Until流程建模实践 (1)Until流程建模 在Business Process Model里画出如图1所示的流程图. (2)流程绑定表单 流程绑定WhileTest表单. (3)创建Message并与表单绑定 图2 (4)流程Start活动设置Input Message (5)配置Until属性Prop

Cordys BOP 4平台开发入门实战演练——For Each流程建模开发

关于For Each For Each是BPMN组结构,并且体现应该执行消息内每个子单元的活动或子流程.For Each循环使用一个计数器,称为一个详尽描述重复执行相同活动的迭代器.For Each代表图如下图1所示. 图1 迭代器有下述3个数值: 初始迭代器值 增量值 执行条件 在执行条件失败时循环结束.应复制对于结构中"Message Map"的递归元素(Element)的XPath去工作. For Each循环流程实践 (1)新建BPM流程 按下图2所示,用鼠标圈上活动环节,点击

Cordys BOP 4平台的子流程与嵌入子流程对比以及子流程建模技术

子流程含义是在某个流程流转过程中可以创建一个新的流程并执行,结束后可以在此返回父流程. 关于子流程 子流程 子流程是BPMN构件,是在一个流程中的复合的活动.子流程可以分解为一系列更精细的活动.子流程通过父流程实例化. 子流程可以设计成交易的一部分,下面列出三种可能的交易结果: 成功完成(Successful completion):流程按顺序执行,并且交易执行成功: 取消(Cancel):交易内的活动回滚,并且补充特定活动: 异常(Exception):出现异常活动不需要回滚,将从错误事件继续

OpenText Cordys BOP 4平台开发入门实战演练——基础理论知识

前言 随着互联网技术的发展,基于B/S结构的软件架构,呈现出多样化,所涉及到的富客户端.Webservice.WEB 2.0.HTML5等技术也粉墨登场,本文将介绍基于OpenText Cordys产品的SOA体系架构和相关开发技术,为开发人员分享另一种软件系统开发实践. 其中,富客户模型将界面分解成许多的既可以和用户直接交互又可以和服务器进行通信的小单元模块,所涉及到开发语言是JavaScript,以及围绕HTML DOM开发动态网页. 关于SOA SOA是面向服务的体系结构,它将应用程序的不

iOS开发入门教程_iOS开发视频教程

iOS开发入门教程 (Object-C.网络编程.多线程.蓝牙.二维码.Cocos2D.OpenGL)适合人群:初级课时数量:34课时用到技术:IOS,Object-C,OpenGL,XCode,Cocos 2D涉及项目:Cocos+2D.Game Kit蓝牙数据处理等咨询QQ:1840215592 iOS开发入门教程详细查看:http://www.ibeifeng.com/goods-471.html1.1.课程目标iOS开发入门教程内容的目标是初学者入门,让入门者提高,让所有人符合企业招聘的

Cordys BOP 4平台开发入门实战演练——HTML/JS界面开发实践

本文案例介绍基于HTML/JS方式开发Web界面,不使用Cordys XForm的解决方案. 1.定义资源目录 按上图在项目中建立文件夹,上传相关资源文档到指定文件中,例如下图把bootstrap.js文件上传到js文件夹中. 2.新建HTML网页 编写HTML文件,并保存为Demotenantcount.htm. 3.设置访问界面起点 配置界面资源定义文件,告知Cordys平台这些网页界面访问资源. 4.定义Web资源发布位置 定义Web资源位置为:"Training_WSApp/Web&qu