精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-11-02
0. 快速开始 1. 设计目的 2. 技术实现说明 3. 架构 4. 如何基于该框架进行企业应用开发 5. 示例 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-11-02
快速开始:
service层: 实现类: public class HelloService { public HelloService(); { super();; } public String sayHello(String name); { //you can get hibernate session by //using “Session session = EnvFactory.getInstance();.getSession();;” return "hello,"+name; } } 服务接口: import com.microerp.business.servicemetadata.ServiceInfo; @ServiceInfo(implementClass=HelloService.class); public interface IService { public abstract String sayHello(String name);; } UI层: import com.microerp.business.controller.ServiceFactory; public class HelloAction { private IService service = null; public HelloAction(); { super();; } private IService getService(); { if (service == null); { service = ServiceFactory.getService(IService.class);; } return service; } public String sayHello(String name); { return getService();.sayHello(name);; } } |
|
返回顶楼 | |
发表时间:2005-11-02
JS层:
HelloWorld.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> <jsp:include page="../js_lib/remotecall.jsp"></jsp:include> <script type="text/javascript" src="elusrate.HelloAction.js"> </script> </head> <body> <script type="text/javascript" > function clicka(); { var username=document.getElementById("usernametext");.value; if(username); { var uiaction=new elusrate_HelloAction();; alert(uiaction.sayHello(username););; } }; </script> <input id="usernametext" type="text"> <P> <button onclick='clicka();;'>say hello</button> <p> </body> </html> |
|
返回顶楼 | |
发表时间:2005-11-02
设计目的:
这个框架是为将来MicroERP的开发平台的基础,它是针对ERP/CRM/其它MIS系统等B/S应用设计的。此类应用具有以下特点: 1. 以数据为驱动,所谓的业务逻辑也就是数据的流转和加工。 2. 基本上以Intranet应用为主,也有可能会有部分的Internet应用。 3. 客户端同时并发数一般为几十至几百,但以长时间连接为主。 4. 对于UI来说,与通常的门户网站应用不同,操作的便捷性与统一性需求要远大于界面美观程度的需求。 针对此类应用,该框架解决了如下问题: 1. 透明的远程服务调用和本地服务调用。(基于SpringAOP) 2. 声明式事物管理。(基于SpringAOP和JDK5.0元数据) 3. AJAX客户端与Java服务的无缝集成。(基于Json-RPC) 该框架对Spring,Hibernate,Json-RPC进行了一层薄封装,使用了默认值和元数据配置,从而减少了开发者的工作量。基于该框架开发,开发者不必关心事务和远程调用这些问题,并且,利用AJAX,我们可以像开发C/S程序一样开发B/S程序。 |
|
返回顶楼 | |
发表时间:2005-11-02
技术实现说明:
1. 事务:这个框架采用了SpingAOP,根据服务接口的元数据说明,对服务进行事务配置。(使用技术:SpringAOP,SpringTransactionManage)。 2. 远程调用:这个框架采用了SpingAOP,根据服务接口的元数据说明,对服务进行远程调用配置。使用它,可以自由的把服务部署到远程,采用RMI,Burlop,Hession等。这完全是透明的,开发人员无需对此关心。(使用技术:SpringAOP,SpringRMI….)。 3. AJAX框架与JAVA服务的集成:框架通过代码生成技术,可以为任意的java bean生成Javascirpt的stub,从而使客户端可以直接与该服务交互。(AJAX) |
|
返回顶楼 | |
发表时间:2005-11-02
架构:
[/img] |
|
返回顶楼 | |
发表时间:2005-11-02
如何基于该框架进行企业应用开发
Javascript客户端: 该层只负责界面显示和界面操作。采用Javascript+DOM对html元素进行操作;采用XML-Http与Java服务通信。 建议:由于Javascript语言的一些特点和局限(非强类型,解释运行,与不同浏览器相关,不利于开发管理),所以需要对其进行良好的封装才能大幅提高企业应用的生产力。推荐:Qooxdoo。 UIAction端: 每个UIAction均应为标准JavaBean。其生命周期可通过元数据被定义为:Session,Request,Application。默认为Session。例: @ActionScope(value=ActionBeanScopeList.Session); public class HelloAction { …… } UI Action可通过一个客户端生成器来生成一个JS stub。例如: function elusrate_HelloAction();{} elusrate_HelloAction.prototype.sayHello=function( p0); { var beanName="elusrate.HelloAction"; var methodName="sayHello"; var paramType=new Array();; paramType[0]="java.lang.String"; var paramValue=new Object();; paramValue.javaClass="java.util.ArrayList"; paramValue.list=new Array();; paramValue.list[0]=p0; var result=core_remoteCall(beanName,methodName,paramType,paramValue);; return result; } 该客户端生成器位于:com.microerp.business.util.Main我们需要为其配置命令行参数:目标路径,类名。在Ecliplse中,可直接用${project_loc} ${java_type_name}的形式。 我曾希望把这个生成器写成Eclipse plugin的形式,但是遇到问题失败了。 |
|
返回顶楼 | |
发表时间:2005-11-02
Service端:
每个Service都是由一个服务接口和一个实现该接口的标准JavaBean实现的,客户端通过如下方法得到一个服务对象: Iservice service=ServiceFactory.getService(Iservice.class);; 而Service端的服务定义只需要在服务接口上利用ServiceInfo元数据进行描述即可。 Service端当然支持嵌套调用,可以在一个Service中调用另一个Service。此时,声明性事务被良好支持。(注:但是不能支持分布式事务,也就是说不同服务器上的服务不能处于一个事务当中) 变通:也可以由一个服务JavaBean分别实现多个服务接口,这是允许的。也可不通过接口,而直接通过bean类调用: ServiceImp service=ServiceFactory.getService(ServiceImp.class);; 当然,这样会造成紧耦合,要尽量避免。 ServiceInfo元数据: @Target( { ElementType.TYPE }); @Retention(RetentionPolicy.RUNTIME); public @interface ServiceInfo { /*describe the service implement class,this class must be a java bean*/ Class implementClass();; /*if a service can be deploied on remote, * it must be stateless * and it can not access the web resource,such as session*/ boolean isCanBeRemote(); default false; /*if isSingleton=false,the framework will create a new service object for each call*/ boolean isSingleton(); default false; } Transaction元数据: @Target({ElementType.TYPE, ElementType.METHOD }); @Retention(RetentionPolicy.RUNTIME); public @interface TransactionType { Propagation propagation(); default Propagation.PROPAGATION_REQUIRED; IsolationLevel isolationLevel(); default IsolationLevel.ISOLATION_DEFAULT; boolean readOnly(); default false; } |
|
返回顶楼 | |
发表时间:2005-11-02
Service的AOP扩展:
相信在企业应用中,不只是事务管理和远程调用需要用到AOP,其它诸如权限控制,日志等也会需要用到AOP,本框架为自定义AOP提供了扩展接口,开发人员只需要编辑AOPConfig.xml即可添加自己的AOP advisor。 Service的远程服务定义: 如若需要把一些服务部署到远端的话,开发人员需要做如下工作: 1. 根据需要修改RemoteServiceDef.xml。来定义通信协议,服务器信息。 2. 根据需要设置ServiceFactory类的IsOnRemoteServer和IsHasRemoteService参数。 建议,只把少量的真正长时间的服务部署到远程,因为实际上远程调用的开销很有可能大于实际执行任务的开销。 其它: BusinessEnvFactoryConfig.xml是用来进行状态缓存配置的,默认的状态数据放在httpSession中,你可以自行修改而不对业务代码产生冲击。 hibernate.cfg.xml当然是用来配置hibernate的了。 |
|
返回顶楼 | |
发表时间:2005-11-02
其实是以牺牲了一些Spring的灵活性来换取开发的快捷性。
但我想对于一个企业应用来说,快速满足业务需求才是根本。 我正在整理源代码,能发布出比较容易部署的方式。 到时,欢迎大家拍砖。 我希望用业余时间写一个简单的开源ERP,因为我也从事了几年ERP开发,对某些业务很熟悉。 road map: Framework->platform->基本档案->各模块业务...... 这个框架是平台的基础。 平台要完成什么 业务流,审批流,单据组件,报表组件,打印组件。。好多事情。 |
|
返回顶楼 | |