sg uap v300高级开发手册分册3服务端_第1页
sg uap v300高级开发手册分册3服务端_第2页
sg uap v300高级开发手册分册3服务端_第3页
sg uap v300高级开发手册分册3服务端_第4页
sg uap v300高级开发手册分册3服务端_第5页
已阅读5页,还剩363页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

V1.PAGEV1.03-2013-03-发2013-03-重新修订UAP缓存开发应2013-03-2013-05-2014-12-2014-12-重新修订SG-UAP业务系统之篇主要改2013-04-2013-04-重新修订SG-UAP业务系统之统一权限系统2013-04-2013-04-2013-04-2013-04-xfire2013-5-2013-06-2013-06-2013-06-2013-06-2013-03-SG-UAP业务系统之 技术储 REST风格的前端与交 注解 注解基本概 平台提供的注 常用Spring注 服务端实体验 逻辑结构注 Hibernate实体映射注解支 其它技术储 框架概 概 运行机 与前端展现框架的关 REST风格服务调 面向服务的服务调 开 控制层(交互层 服务交互-面向资源(通过REST请求操作资源 服务交互-面向Web服 逻辑 逻辑层-用户自定义Bizc逻辑组 持久 功能组件-工具 概 基本使 异常定 功能组件-日志管 概 基本使 异常定 功能组件-异常管 概 基本使 功能组件-支 概 基本使 异常定 平台属性注入 概 基本使 SQL语句方言配 概 基本使 SG-UAP业务系统之工作流 安装 BPM与统一权限系统集 前提条 集成步 UAP与BPM集 创建人工任 关联人工任 配置业务主键映 添加对流程包的依 开发流程处理逻 待办任务列 已办任务列 流程接口和服务说 流程接 BPM集成模块 BPM集成模块 BPM模块 SG-UAP业务系统之权限 业务系统与权限集 概 业务系统与权限集成运行机 业务系统与权限集成开 页面元素权限控制与集成开 业务系统与权限公共页面集成开 权限接 统一权限平 SG-UAP业务系统之缓存 概 简 专业词 开发者技术储 体系结 缓存运行机 功能架 数据缓存开 缓存管理 默认缓存管理 缓存管理器配置详 缓存管理器扩展开 缓存适配 缓存适配器开发流 缓存适配器配置详 缓存适配器接口说 缓存注解应 缓存注解应用开发流 缓存注解参数详 缓存缓存异 分布式缓存服务器部 并解压MongoDB程序 配置MongoDB系统变 启动MongoDB服务 命令方式启 配置文件启 典型场景部 单服务 路由分片 路由分片+ SG-UAP业务系统之GIS UAP与GIS集 GIS概 在业务系统中引入GIS组件 在业务系统中调用GIS组件的 SG-UAP业务系统之UDS UAP与UDS集 概 在业务系统中引入UDS组件 在业务系统中调用UDS组 REST风格的前端与交件和业务应用的数据和逻辑以rest的形式统一封装。提供rest服务,由前简单说:Rest是一种URI风格,是一组架构约束条件和原则,是一种针对网过程中,服务器不需要记录任何Session,所有的状态都通过Url的形式记录在REST网络上的所有事物都被抽象为资源(resource每个资源对应一个唯一的资源标识(resourceidentifier对资源的不会改变资源标识所有的操作都是无状态的 essREST示例GET0001userPOST注解注解基本概,Annotation(JDK5.0class,}{{}@ColumnRequestParam类名var=newmx.rpc.RESTvarstartUrl=vardata={"columns":"id,name,age,.get(startUrl,{"params":function(p_flag)if(p_flag.successful==true){mx.indicate("info调用成功");}elsemx.indicate("info调用失败}ta>getMetaData(@ColumnRequestParam("params")String[]columns){List<ViewAttributeData>datas=datas=ViewAttributeUtils.getViewAttributes(columns,return}@ColumnResponseBody:方法体注解,对返回值进行类名{{[{"name":"id","caption":"ID",nullable:false,dataType:{"name":"name","caption":"name",nullable:true,dataType:"string"},]@IdRequestBody:类名指明方法的参数是从请求体中获取的字符串数组,并将主键信息封装为IDRequestObject对象。通过getPrimarykey()和getIds()取出主键名称和主键var=newmx.rpc.RESTvarstartUrl=vardata={primaryKey:"userid","ids":["001",.post(startUrl,JSON.stringify(data),function(p_flag)if(p_flag.successful==true){mx.indicate("info成功。");}elsemx.indicate("info失败。}@RequestMap(value="/testFunc",method=RequestMethod.POST)public@VoidResponseBodyObjecttestFunc(@IdRequestBodyIDRequestObjectitemType){}@VoidResponseBody:类名 使用方法参考@IdRequestBody@ItemRequestParam:类名将数据的itemTypeitemTypevar=newmx.rpc.RESTvarstartUrl=.get(startUrl,{params:function(p_flag)if(p_flag=="0"){mx.indicate("info成功。");}elsemx.indicate("info失败。}:@RequestMap(value="/testParam",method=RequestMethod.GET)public@RawResponseBodyObjectquery(@ItemRequestParam("params")StringitemType){}@RawResponseBody:类名指明方法的返回值应当以原生返回值的形式,绑定到响应体中,使用该注objectjson使用方法参考@ItemRequestParam@ItemsRequestBody:类名listvar=newmx.rpc.RESTvarstartUrl=vardata.post(startUrl,JSON.stringify(data),function(p_flag)if(p_flag.successful==true){mx.indicate("info成功。");}else}public@ItemResponseBodyListtestFunc(@ItemsRequestBodyList<Map<String,String>>list){Map<String,String>map=newLinkedHashMap<String,for(inti=0;i<list.size();i++){map=list.get(i);for(Itor<String>it=map.keySet().iObjectkey=it.next();}}return}@ItemResponseBody:类名将返回的list集合转化为json字符串指明返回值将以{items:[{}{}{}{}],itemCount:100(必须)}的形式返回,返回参数为封装map或bean对象的list集用法参考@ItemsRequestBody使用示例,使该示例中接收到的参数格式为{"st":0,"dicts":[]},"resultHint":"","errorPage":"","type":""public@ItemResponseBodyQueryResultObjecttestFunc(@ItemsRequestBodyList<Map<String,String>>list){Map<String,public@ItemResponseBodyQueryResultObjecttestFunc(@ItemsRequestBodyList<Map<String,String>>list){Map<String,String>map=newLinkedHashMap<String,for(inti=0;i<list.size();i++){map=list.get(i); tor<String>it=map.keySet().i Objectkey=it.next();}}QueryResultObjectResultRestUtils.wrappQueryResult(list,return}@QueryRequestParam类名GETurlKEYQueryRequestParam("params")url":"id,name,age,"}}转换为Reqondition对象。如果是查询的子表的信息,需要传入parentID。例如:{"params":{"filte其中"params"的参数columns、pageIndex、pageSize、filter、sorteget。var=newmx.rpc.RESTvarstartUrl=var.get(startUrl,{"params":function(p_flag)if(p_flag=="0"){mx.indicate("info成功。");}elsemx.indicate("info失败。}@RequestMap(value="/testFunc",method=RequestMethod.GET)public@RawResponseBodyObjecttestFunc(@QueryRequestParam("params")ReqonditionrcObject){if(rcObject!=null){}}@TreeResponseBody:类名返回树节点,该注解将节点信息的list集合转换为如下json格式:public@TreeResponseBodyList<TreeNode>getRoot(){List<MxDepartment>list=List<TreeNode>nodelist=newfor(inti=0;i<list.size();i++){TreeNodenode=newTreeNode();MxDepartmentmxdepartmentMxDepartmentlist.get(i);node.setId(mxdepartment.getDepartId());//主键的get方法booleanhasChild=treeBizc.hasChild(mxdepartment.getDepartId(),;//}return} Spring注@ControllerHTTP URLURI 用于将数据层(DAO层)的类标识为SpringBean。具体只需将该注解标DAOSpring@RepositoryXMLBean XML<bean/>BeanSpringbase-packageclass文件,所有标注了@Repository的类都将被为SpringBean。下面通过示例具体解释 解的用法 xtResourceLoaderourceSpring} } @ValidProductionproduction//实体设置+类+类 直接将页面传过来production@PathVariableLongidid/*...}简@Nullnull@NotNullnull@AssertTruetrue@Min(value值@Max(value值@Past@Future@Valid@被注释的元素必须是电子邮箱地@Length@NotEmpty@URL(protocol=,host=,port=,regexp=,flags=)被注释的元素必须是符合URL@Range(min=,max=)使用方1com.sgcc.uap.service.validator,javax.validation.constrai2JavaBean** * }ServiceValidatorUtil.逻辑构件注 ponent注解属性介绍:ponent注解的扫描是通过spring配置< scanbase-package=""/>进行扫描的base-package配置包含该注解的类所在2、提供@BizcTransactional@BizcTransactionpropagation:事务行isolation:事务级timeout:readOnly:rollbackFor:noRollbackFor:开启事务控制配置:在模块的spring配置文件中增加如下配置<tx:annotation-driven/>transcationManager<tx:annotation-driventransaction-manager=xxxxtranscationManager1”/>}}Hibernate 其它技术储springbeanspringMVCspringIOC;了解html和jsp;J2EE了解hibernatepojo、掌握面向对象进行持久化的中间件实现机制概在UAP中,为了向前端不同数据以及不同服务接口之间的差异,平台套件和业务应用的数据和逻辑以rest的形式统一封装。提供rest服务,由前运行机采用基于REST风格的web服务,是一种基于资源的服务架构,REST从资源的角度来观察整个网络,分布在各处的资源由URI确定,通常使HTTPwebWeb,JSon与前端展现框架的关REST是通过解析URL请求,将请求由逻辑构件处理,并将处理结果返回给前端的一种调用形式。GET,appnamemodule模块间rest调用安全控制:定义模块调用的安全器。在器中解析调IPIP(可多条安全规则出来;如果调用方的IP地址不存在配置文件中,则不进行安全控制,调用方可直安全控制相关的配置放在perties 说明:在perties中配置认证规则配置interfaceName:methodName:returnType:IP提供WebService支持,将逻辑组件发布成WebService。前端WebService控制层(交互层异构系统发送的请求,提供用户请求数据的格式化、传输、封包与解包,URLWeb服务交互-面向资源(通过REST请求操作资源概(Resource每一个资源类和其资源实体都可以用一个URI地址来唯一标识。如bdz(“ID“e80d3cf8(ResourceRequest类和资源实体可以由一个唯一的URI表示,而资源动作(即对资源增删改查)则资源概念横跨和各类前端两端之间采用REST风格的服务形式因此每一个资源URI会对应于一个HTTPURL,而资源请求中的方法正好对应于在,首先需要定义资源操作,约定根据URL请求路径地址信息、URL请HTTP控制层的组控制层运行机制(交互图HTTP在系统启动的时候,扫描注解定义信息,保存于DefaultAnnotationHandlerMap中。DispatcherServlet这个请求之后,执行getHandler方法查找已经的所有URL-处理器映射信息找到业务处理类。并组合配置的器,组成执行链。DispatcherServlet调用执行链器的前置方法如果某个方法返回false,DispatcherServlethandleAnnotationMethodHandlerAdapterDispatcherServlet调用执行链器的后置方DispatcherServlet调用执行链器的完成方DispatcherServletHTTP异常处{}{}successfulfalse,resultHintspring}MyException基本使用REST求处是资源的具体操作者在接收到浏览器发出的REST风格的请求之后后台需要将HTTP请求内容“翻译”为本身能够理解的信息,然后按照确定的规则,映射关系的配HTTP协议规定了浏览器 网服务器之间相互通信的规则前端通过协议,向发送请求,请求包含请求方法、请求URI地址、协议版本、以及包在实现对于REST请求处理之前,需要首先确定HTTP请求和资源操作组件之间的映射规则。这样,在接收到HTTP请求之后,才能够够根据这一规则,找在统一应用开发平台,使用注解的方式定义HTTP请求和资源处理组件之间的映射关系。其中@ControllerHTTP@RequestMap注解将特定的URL和具体的控制器类或控制类类中的方法绑定。URL }}在①处的Controller注解表明这个类是平台的控制器类,可以处理HTTP请求;②处的RequestMap注解定义了可以接收URI的地址为/forum.uap,这样如果接收到一个URL为/forum.uap的HTTP请求时,就会交由ForumControllerlistAllBoardRequestMap的默认属性为value,②处的注解也可以写@RequestMap("/forum")RequestMap注解的值支持ANT风格的URI,其中有三种通配符定义?*URI配置 }}如果在类级别和方法级别上同时标注了RequestMap注解,两者将URLlistAllBoardURI/forum/listURIREST从资源的角度来观察整个网络,分布在各处的资源由URI确定,通常使用一个唯一标识符来指定某个资源,例如 /transformer/beijing/sg。前端发出REST请求之后,需要获取对资源的标识。使用@PathVariable注解结合@RequestMap注解,在URI中定义模板变量的方式,获取URI中的标识符。 }}在上例中,②处RequestMap中注解值为/forum/{boardId}/{topicId},boardIdtopicId中,定义与模板变量同名的参数,并添加@PathVariable注解,就可以通过方法URIHTTP在REST请求中,使用HTTP方法指定了对资源操作的动作 也应该能 } }}根据HTTP方法,确定对资源的操作。RequestMap注解的method属性对HTTPHTTP例如让一个方法处理HTTPDELTE请求,而另 } }}通过对HTTPREST } 对于不同类型的前端,REST对同一个资源的请求应当有不同的响应。在HTTP请求的头信息中,定义了前端缓存处理策略、使用的字符集、可以接收处理的内容类型等信息。RequestMap注解的heads属性 } }}例如在上边的例子中,分别创建了真对大屏和笔记本两种响应方式,Accept } }}HTTP标准中,URI不仅有地址部分,还包括?后以field1=value1&field2=value2 } }}例如在上边的例子里,如果REST请求的URI的查询字符串中包含order=month,将调用queryTopicByMonth方法,如果包含查询字符串中order=author,queryTopicByAuthor写成params={“key1=value1”,”key2=value2”}这种形式。通常使用自定义使用RequestParam注解,获取HTTP请求中的参数信息,用法为@RequestParam(" }}如果请求中包含名为month的参数,将自动赋值到方法参数中。如果参数名称和对方法参数名称相同,参数名称可以省略。例如上边就可以写成映射关系的加平台在启动的时候,需要扫描上一个步骤所配置的注解信息,建立映射关系。这样,当接收到前端发送的REST请求的时候,可以根据映射关系,请求转发到具体的业务组件和业务方法进行处理。下面简单介绍映射关系加载的步骤。HTTP对所有控制器类进行遍历,扫描类的映射配置信息,并保存到应用缓存中。根据上个步骤映射信息的配置可以看到,URI类级别,也可以配置在方法级别,所以需要综合进行处理。根据控制器的类型,定义在类上的映射关系注解信URI遍历类级别URI映射值和类中所有方法的URI映射值,组合类级URIPatternPattern,URI通过以上的步骤,平台启动时就完成了映射信息的和加载过程REST请求的转除了具体的业务处理,平台需要在对请求处理之前进行安全验证、日志记录,在请求处理之后进行资源回收、日志记录等必要性非业务工作。框架中定义了一类称之为器的对象,在器中可以定义前置方法和后置方法,通过配置的方式,在处理业务前后执行 器中定义的方法。在上边的步骤中,完成了对HTTP请求与组件之间映射关系的配置和读取。当接收到REST请求之后,就可以根据HTTP请求信息查找当前加载的映射关系,找到处理当前请求的控制器类,并组合控制器类和定义的器,组装成为一个完整的执行链。请求处理与响在完成REST请求的转发之后,针对某个REST请求,已经构造出需要执按照器的配置顺序,顺序执行其中定义的前置方法。如果某一个前置方false,停止执行链的进行。按照器的配置顺序,反序执行其中定义的后置方响应信息格式浏览器向发送REST请求,根据请求内容调用具体的业务方法后将业务方法的执行结果装配成为浏览器端能够理解的格式并返回响应。响应信息应该包括以下部分:请求结果,成功或者失败,表示是否完成请求{successfultrue{successfultruefalse定}data服务交互-面向Web服服务发sguap-serverorg.codehaus.xfirexfire-service。打开uap项目的/WebContent/WEB-INF/configuration/.xml文件,设置XFire有“#”,则面加上“#”,改为如下图所示xfire-service, implementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringname;privateString privateMap<Integer,String>map;privateList<String>list;publicintgetAge(){}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){}publicvoidsetName(Stringname){=name;}publicStringget (){ }publicvoidset ){ }publicMap<Integer,String>getMap(){}publicvoidsetMap(Map<Integer,String>map){this.map=map;}publicList<String>getList(){}publicvoidsetList(List<String>list){this.list=list;}}编写服务接口services.Service} List<>getList(); List<>setList(List< getObj();publicStringgetGreeting(String>编写服务实现类 ServiceImplService,SerializableprivatestaticfinallongserialVersionUID=publicList<>getList<>list=newArrayList<=new();2=new();return} Map<Integer,String>map=newHashMap<Integer,String>();map.put(1,"map1");map.put(2,List<String>list=newArrayList<String>(); }publicList< >set }publicStringgetGreeting(Stringname){ o"+name;}}导入需要的模块和MANIFEST-MFDependenciesorg.codehaus.xfire添加配置文在模块 下创建如下 结构applicationContext.xmlxfire<?xmlversion=<?xmlversion="1.0"encoding="UTF-"" web-testxfire.xmlServlet<?xmlversion=<?xmlversion="1.0"encoding="UTF- ""cn/schemacn/schemaservice.xml<?xmlversion=<?xmlversion="1.0"encoding="UTF-"" <propertyname="serviceClass" 导出包,启动前端查看服务URL:s/Service?wsdl,截取部分如下服务编写说XFireAegisPOJOXMLSOAPAegis数组集合类型XML另外,XFireJAXB2XMLBeansCastorJiBXMessageBinding等绑定,具体的请参见XFire用户手册。XFire如果使用ListMap等集合类型则必须泛型类型如List<String>,如只为List在生成wsdl文件时会出错。服务调打开MANIFEST-MFDependenciesXFireweb动态前端(Dynamicweb创建服务,其中的url为调用服务的wsdl地址= (newObject[]results.invoke(methodName,new例如,采用这种方法调用刚发布的ServiceImpl服务的StringurlString==new(newObject[] .invoke("getGreeting",newServiceserviceModel=new要注意的是,这里的“YourService”URLStringserviceURL=为服务创建一个=(YourService)new使用服务提供的方法Stringname=结构。例如,调用ServiceImpl中的方法代码:String ServiceserviceModel=newObjectServiceFactory().create( Service)new Factory().create(serviceModel,url); >list= } >list2=new //设 for per }3 Map<Integer,String>map= List<String>list3= for(Stringstr:list3){}System.out.println("\n服务器端返回的Map集合 tor<Integer>i intresultKey=i StringresultValue=map.get(resultKey);}前端/XFire提供了前端 Stubs生成功能利用Stubs调用web服务的过程WebURLStringserviceURL==newServiceNamePortTypeserviceweb[ReturnObjectType]result=这里要注意的是“ReturnObjectType”必须是StubsJAVA的简单数据类型。例如:如果原来POJO的methodName()方法返回的是一个String[],ArrayOfStringXFireStubs,XFireReturnObjectTypeStubsweb服务时使用的原始数据结构。有关前端 的Stubs生成请参见 文档运行环jaruapUAPcxfweb新建动态模块cxf-service作为cxf服务端模块,模块必须依赖org.apache.cxf_1.3.1.jar新建动态模块cxf-,模块也必须依赖org.apache.cxf_1.3.1.jar发布与11cxf(添加相关注解2、在服务端模块中开发实现类(添加相关注解3cxfserverWebService,服simple:server、jaxws:server、jaxws:endpoint34、创建客户端模块,编写客户端式、编程式)1、packagepackageimportimportimportjavax.jws.soap.SOAPBinding;importjavax.jws.soap.SOAPBinding.Style;@SOAPBinding(style=publicoWorldpublicpublicStringram(name="name")String}2、开发实现类packagepackageimportimportimportimportimport@SOAPBinding(style=publicoWorldImploWorldpublicStringram(name="name",header=true)name)returnname+"o }}3、在 下新建CXF配置文<<beans""" h <!--<module:servlet>simple:server<bean<beanoWorldImpl"<simple:server<refoWorldServiceBean"<entrykey="mtom-enabled"value="true"发布服务端模块后,启动UAP项目,模块上下文路径为cxf-service。根据上图的配置的address,发布服务的地址的后缀为oWorld,CXFServlet的 oWorld=(value=publicObjectsayByConfig()Stringmessage returnXML,配置方式<entrykey="mtom-enabled"value="true">以上配置完成后,可以把服务当成beanId为oWorld的springbeanResourceAutowire}}发布客户端模 cxf-,在浏览器地址中输webserviceprivateFactoryBeanfactory=staticMap<String,Object>props=newHashMap<String,privateFactoryBeanfactory=staticMap<String,Object>props=newHashMap<String,Object>();props.put("mtom-enabled",Boolean.TRUE); }(value=publicObjectsayByCode()= oWorld)Stringmessagereturn}发布客户端模块,启动UAP项目,在浏览器地址栏输入:webservicejaxws:server在服务端模块的 下新建xml文件,文件的配置如下<bean<beanoWorldImpl"<bean <beanid="inLoggingInterceptor"<jaxws:server<ref <ref<refsimple:server在cxf客户端模块的 下新建xml配置文件,配置的方式如下<entrykey="mtom-enabled"value="true">配置完成后,在代码中使用的方式与simple:的方式一样,可以参simple:的方式验证这种方式是否成功调用发布服务的模块的webservice的方法与simple:的方式相同。采用编程方式与调用simple:server发布的服务有些不同,采用的是 FactoryBean,privateprivatestatic FactoryBeanfactory=//privateFactoryBeanfactory=staticMap<String,Object>props=newHashMap<String,Object>();props.put("mtom-enabled",Boolean.TRUE); }(value=publicObjectsayByConfig()Stringmessage return}使用这种方式调用服务成功后,验证方式与simple:的方式相同jaxws:endpoint在服务端模块的 下增加以下配置<jaxws:endpoint<jaxws:endpoint <entrykey="mtom-enabled"value="true"发布服务端模块,启动UAP项目,验证服务是否发布成功,验证方式与simple:server客户端调用WebService的方式与jaxws:server相同。配置方式采用jaxws:来调用服务,编程方式采用JaxWsFactoryBean安全机制-令牌<bean oWorldImpl"<beanid="outLoggingInterceptor"class="erceptor.LoggingOutInterceptor"/><bean oWorldImpl"<beanid="outLoggingInterceptor"class="erceptor.LoggingOutInterceptor"/> 的WebService的name--<beanid="inLoggingInterceptor"class="erceptor.LoggingInInterceptor"/><jaxws:server <ref oWorldServiceBean"<refbean="outLoggingInterceptor"<refbean="inLoggingInterceptor"<ref<beanid="soapAuthIntercepter"<propertyname="token" <entrykey="mtom-enabled"value="true"<refbean="mySoapAuth" <bean<propertyname="authHeader"ref="authHeader"<bean <propertyname="content" oworld"以上配置中AuthHeader的content的值必须与服务端token值一致,平台会把content的值封装到SoapMessage中传输到服务端。在服务端调用的时候进动态发布Web服环境准在UAP项目的配置文件_exclude_perties中,注org.apache.cxfcom.sgcc.uap.core.webservice,如下图所示:创建数据库用户,执行以下数据 createcreatetableWEBSERVICE VARCHAR2(32)not VARCHAR2(20), SERVICEPROVIDERVARCHAR2(100),SERVICECONSUMERVARCHAR2(100), VARCHAR2(100),OUTDESCRIPTIONVARCHAR2(100), )altertableaddconstraintWEBSERVICE_PKprimarykeydatasource.xmlUAP新建Web服 ,出现如下页Webservicecom.sgcc.uap.core.webservice的classpath下包含包名的全路径的类地址必Webservice激活Web服WebserviceWebservice,点击激活按钮,注意一次只Webservice,WebserviceWebservice“/WebserviceWebservice Webservice,Webservice撤销Web服WebserviceWebserviceWebserviceWebservice再次输入编辑Web服WebserviceWebservice删除Web服只有未激活状态的Webservice才能删除,勾选一条未激活状态的Web导出Web服点击“导出”按钮,弹出如 框,选择要保存 ,点击“保存Web服务持已激活的Webservice在项目重启后又会变为未激活状态,无法被调用,配置perties的WEBSERVICE_INIT=true,则在启动的时候会激Webservice。WEBSERVICE_INITfalse逻辑逻辑层-用户自定义Bizc概逻辑层一般认为其处于UAP项目分层体系的服务层,介于交互层和持久层之的封装。在UAP中,逻辑层技术主要指的是一个个逻辑构件,在一定程度上简化了用户在开发中,使用事务、WebServicesAOP基本使逻辑层是整个UAP应用模块化开发的一部分,在UAP中,逻辑层技术主要指}} }} privateIMyBizcmyBizc;//注入逻辑构件myBizc,属性名称与配置文件中的id一}}}}}}}(红色字体为事务配置异常定逻辑构件配置文件逻辑层-事务管SpringSpring逻辑层-安全管理组概基本使会话管数据安4加密、的装置或算法接收方需通过密钥及加密算法的逆算法进行DES、IDEA发送时可根据接收方的公钥和相应的加密算法对进行加密传输接收方只有通过自己的密钥才能进行单向加密算法包括BASE64、信 算法(MD5)、BASE64、安全散列算(SHA)、散列消息鉴别码(HMAC)对称加密算法包括DES(DataEncryptionStandardPBE(Password-basedencryption,基于验证)等EncryptEncoder无无无无使用DES对数据str进行加密操使用3DES对数据str进行加密操使用AES对数据str进行加密操使用RSA对数据str进行加密操使用MD5对数据str进行加密操使用SHA对数据str进行加密操DecipherEncoder无无无无异常定加密操作时,我们提供了异常类EncryptFailureException持久概基本使Hibernate,支持这样做的目的是为了能够清晰地划分应资源配在平台的持久层中需要配置的资源主要有:DataSource、SessionFactorytransactionManager该工厂用于提供到此DataSource对象表示的物理数据源的连接。作为情况下平台将为用户自动配置一个DataSource对象以及其对应的SessionFactory对象和TransactionManager对象,具体的配置可以在datasource.xmldatasource.xml的DataSource对象,当然用户也需要为自己定义的DataSource对象定义相应的SessionFactoryTransactionManager在配置DataSource对象时,需要注意DataSource的配置方式有两种:不使driverClassNameOracle-Sqlserver–com.url:Oracle-jdbc:oracle:thin:@服务器地址DB2-jdbc:db2://服务器地址Sqlserver–jdbc::sqlserver://服务器地址username:数据库的用户名password:该用户的数据库连接 jndiName:java命名 接口服务,使用在高级网络应用开发中的tomcat中jndiName是前 p/env+JDBC连接的资源WeblogicjndiNameJDBCresourceRef:如果你不想使用' p/env/'前缀的话请设置值为true,默认值为false。持久化方法的IHibernateDao,接口中封装一系列的持久化}}}}**}}Hibernate相关配平台Hibernate相关配置文件主要有两个:Hibernate数据库表映射文件(.hbm.xml)moduleEntityPersistence.xml 然后需要在模块项目的config 配置文件只需在其中添加相应的配置映射文件的存放路径即可具体信息如下 持久层接口po、map、doma)publicvoidsaveMap(MapmapMapb)publicvoidsaveDom(Elementdomdomc)publicvoidsaveObject(ObjectpopopopublicListfindAll(StringhqlSQLpublicListfindAllByCriteria(QueryCriteriacriteria同时支持数据库类型:oracle、db2、在publicvoidsaveMap(Mapmap)方法调用mapTemte中方法持久化在publicvoidsaveDom(Elementdom)方法调用domTemte中方法持久化;在publicvoidsaveObject(Objectpo)方法调用pojoTemte中方法持久化;实例化途径:通常情况下建议通过平台逻辑层的管理机制注入,代码示例}IHibernateDao接口的调用方法及其相关参数请参考框架持久层API,此hql语句时,hibernateSQLjava不同的关键字。例如:memberHQL为“fromMembermemberunexpectedtoken:MemberMemberHQLHQL些关键字。Hqlsguap多数据源配置方修改 在uap项目中的datasource.xmlid为datasource1的beanbeanbeandataSourceService1新建com.sgcc.uap.core.persistence.config展目录,在该目录下增加pertiespersistence-reference.xml、#oraclesessionFactory.hibernateProperties[hibernate.dialect]=#sqlserver#sessionFactory.hibernateProperties[hibernate.dialect]=#db2#sessionFactory.hibernateProperties[hibernate.dialect]=sessionFactory.hibernateProperties[hibernate.show_sql]=truesessionFactory.hibernateProperties[hibernate.jdbc.fetch_size]=50sessionFactory.hibernateProperties[hibernate.jdbc.batch_size]=#oraclesessionFactory1.hibernateProperties[hibernate.dialect]=#sqlserver#sessionFactory1.hibernateProperties[hibernate.dialect]=#db2#sessionFactory1.hibernateProperties[hibernate.dialect]=sessionFactory1.hibernateProperties[hibernate.show_sql]=truesessionFactory1.hibernateProperties[hibernate.jdbc.fetch_size]=50sessionFactory1.hibernateProperties[hibernate.jdbc.batch_size]=100= persistence-service.xml persistence.xml 以上配置的原则就是增加一套数据源配置来获取hibernateDao1,把这个hibernateDao1OSGi使用新的数据modueEnttyersence.xml进来,如下 hibernateDao1hibernateDao分布式事务集成(根据pm生成的代码Tomcat本身并不支持JTA事务,但是可以通过集成第来实现分布式事Atomikos新建多个数据源并发布服UAPdataSource.xml,(以两个数据源为<!--加载数据库配置,采用atomikosAtomikosDataSourceBean<beanid="dataSource1"init-method="init"destroy-<description>oraclexa<property<property<property<prop<prop<prop<property<property<property<property<propertyname="borrowConnectionTimeout"value="10000"<property<value>select1from<beanid="dataSource"init-method="init"destroy-<description>oraclexa<property<property<property<prop<prop<prop<property<property<property<property<property<value>select1from<module:serviceid="dataSourceService"beanId="dataSource"<module:serviceid="dataSourceService1"beanId="dataSource1"新建持久层扩展模com.sgcc.uap.core.persistence.config ,在 下增persistence-service.xml、persistence.xml,#oraclesessionFactory1.hibernateProperties[hibernate.dialect]=#sqlserver#sessionFactory.hibernateProperties[hibernate.dialect]=#db2#sessionFactory.hibernateProperties[hibernate.dialect]=sessionFactory1.hibernateProperties[hibernate.show_sql]=truesessionFactory1.hibernateProperties[hibernate.jdbc.fetch_size]=50sessionFactory1.hibernateProperties[hibernate.jdbc.batch_size]==#setmaxresultnumberforhibernatehibernateDaoSupport1.maxResults2000persistence-reference.xml的文件内容如下: persistence.xml<?xmlversion="1.0"encoding="UTF-<beansxmlns="xmlns:xsi="<property<reflocal="oracleLobHandler"<property<propkey="hibernate.dialect"><prop<prop<prop<property<refbean="dataSource1"<beanid="hibernateDaoSupport1"<propertyname="maxResults"value="2000"<property<refbean="sessionFactory1"<beanid="baseDao1"<property<refbean="dataSource1"<property<refbean="hibernateDaoSupport1"<beanid="hibernateDao1"<property<refbean="dataSource1"<property<refbean="baseDao1"<property<refbean="hibernateDaoSupport1"<beanid="hibernateHandle1"scope="prototype"<property<refbean="sessionFactory1"<propertyname="maxRows"value="2000"<beanid="hibernateInterceptor1"<property<refbean="sessionFactory1"<beanid="atomikosTransactionManager"<propertyname="<beanid="atomikosUserTransaction"<propertyname="transactionTimeout"value="20000"<bean<property<refbean="atomikosTransactionManager"<property<refbean="atomikosUserTransaction"<propertyname="allowCustomIsolationLevels"value="true"<propertyname="transactionSynchronizationName"persistence-service.xml<?xmlversion="1.0"encoding="UTF-<beansxmlns="xmlns:xsi=" <module:serviceid="sessionFactoryService1"<module:serviceid="baseDaoService1"beanId="baseDao1"targetName="com.sgcc.uap.persistence.IBaseDao"/><module:serviceid="hibernateDaoService1"beanId="hibernateDao1"targetName="com.sgcc.uap.persistence.IHibernateDao"/><module:serviceid="jtaTransactionManagerService"ger"/>hibernateDao1,并且把分业务模块使用(PxTest.java,ShUser.java以及hbm文件修改业务应用项目MANIFEST.MF文件。导入包javax.transaction(modueEnttyersence.xml)事务进来,如下:<?xmlversion="1.0"encoding="utf-<beansxmlns="xmlns:xsi=" <module:entityid="testEntity" <module:entityid="testEntity1" <module:referenceid="hibernateDao1"<module:referenceid="hibernateDao"<module:referenceid="jtatransactionManager"<?xmlversion="1.0"encoding="UTF-<beansxmlns="<tx:annotation-driventransaction-<aop:advisorpointcut="execution(*<tx:adviceid="txTestBizcAdvice"transaction-<tx:methodname="save*"<tx:methodname="remove*"采用式事务<?xmlversion="1.0"encoding="UTF-<beansxmlns=" <bizc:logic<bizc:implementationtype="java"target="c.TestBizc"/><bizc:serviceinterface="c.ITestBizc"<bizc:referencetarget="hibernateDao"<bizc:referencename="hibernateDao"target="hibernateDao"type="bean"/><bizc:referencename="hibernateDao1"target="hibernateDao1"type="bean"/>publicclassTestBizcimplementsprivateIHibernateDaoprivateIHibernateDaopublicvoidsetHibernateDao1(IHibernateDaohibernateDao1)this.hibernateDao1=}publicvoidsetHibernateDao(IHibernateDaohibernateDao)this.hibernateDao=}publicList<PxTestVO>save(List<Map>list)return}}采用编程式事务<?xmlversion="1.0"encoding="UTF-<beansxmlns=" <bizc:logic<bizc:implementationtype="java"target="c.TestBizc"/><bizc:serviceinterface="c.ITestBizc"<bizc:referencetarget="hibernateDao"<bizc:referencename="hibernateDao"target="hibernateDao"type="bean"/><bizc:referencename="hibernateDao1"target="hibernateDao1"type="bean"/><bizc:referencename="jtatransactionManager"type="bean"publicclassTestBizcimplementsprivateIHibernateDaoprivateIHibernateDaoprivateTransactionManagerpublicvoidsetJtatransactionManager(JtaTransactionManagerjtatransactionManager){this.jtatransactionManager=}publicvoidsetHibernateDao1(IHibernateDaohibernateDao1)this.hibernateDao1=}publicvoidsetHibernateDao(IHibernateDaohibernateDao)this.hibernateDao=}publicList<PxTestVO>save(List<Map>list) }catch(Exceptiontry}catch(IllegalStateExceptione1)//TODOAuto-generatedcatchblock}catch(SecurityExceptione1)//TODOAuto-generatedcatchblock}catch(SystemExceptione1)//TODOAuto-generatedcatchblock}}return}}注意事exception:com.atomikos.datasource.ResourceException:Errorinrecovery】SYSDBASQLgrantselectonsys.dba_pending_transactionstograntselectonsys.pending_trans$to当前数据库用户;grantselectonsys.dba_2pc_pendingtograntexecuteons

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论