论坛首页 Java企业应用论坛

一个基于Spring/Hibernate/Json-RPC/JDK5的企业应用开发框架

浏览 15571 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-11-02  
MicroERP Framework说明文档 ver0.1

0. 快速开始
1. 设计目的
2. 技术实现说明
3. 架构
4. 如何基于该框架进行企业应用开发
5. 示例
   发表时间: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);;

	}
}
0 请登录后投票
   发表时间: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>
0 请登录后投票
   发表时间: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程序。
0 请登录后投票
   发表时间:2005-11-02  
技术实现说明:
1. 事务:这个框架采用了SpingAOP,根据服务接口的元数据说明,对服务进行事务配置。(使用技术:SpringAOP,SpringTransactionManage)。
2. 远程调用:这个框架采用了SpingAOP,根据服务接口的元数据说明,对服务进行远程调用配置。使用它,可以自由的把服务部署到远程,采用RMI,Burlop,Hession等。这完全是透明的,开发人员无需对此关心。(使用技术:SpringAOP,SpringRMI….)。
3. AJAX框架与JAVA服务的集成:框架通过代码生成技术,可以为任意的java bean生成Javascirpt的stub,从而使客户端可以直接与该服务交互。(AJAX)
0 请登录后投票
   发表时间:2005-11-02  
架构:
[/img]
0 请登录后投票
   发表时间: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的形式,但是遇到问题失败了。
0 请登录后投票
   发表时间: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;

}
0 请登录后投票
   发表时间: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的了。
0 请登录后投票
   发表时间:2005-11-02  
其实是以牺牲了一些Spring的灵活性来换取开发的快捷性。
但我想对于一个企业应用来说,快速满足业务需求才是根本。

我正在整理源代码,能发布出比较容易部署的方式。

到时,欢迎大家拍砖。

我希望用业余时间写一个简单的开源ERP,因为我也从事了几年ERP开发,对某些业务很熟悉。


road map: Framework-&gt;platform-&gt;基本档案-&gt;各模块业务......

这个框架是平台的基础。
平台要完成什么 业务流,审批流,单据组件,报表组件,打印组件。。好多事情。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics