论坛首页 Java版 Spring

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

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

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

}[/code:1]
服务接口:
[code:1]import com.microerp.business.servicemetadata.ServiceInfo;

@ServiceInfo(implementClass=HelloService.class)
public interface IService {

public abstract String sayHello(String name);

}
[/code:1]
UI层:
[code:1]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);

}
}
[/code:1]
   
0 请登录后投票
时间:2005-11-02
JS层:
HelloWorld.jsp
[code:1] <%@ 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>[/code:1]
   
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]
  • 3e3ef3b3-e431-4236-b614-142a5adedc1e-thumb
  • 描述:
  • 大小: 454.4 KB
   
0 请登录后投票
时间:2005-11-02
如何基于该框架进行企业应用开发
Javascript客户端:
该层只负责界面显示和界面操作。采用Javascript+DOM对html元素进行操作;采用XML-Http与Java服务通信。
建议:由于Javascript语言的一些特点和局限(非强类型,解释运行,与不同浏览器相关,不利于开发管理),所以需要对其进行良好的封装才能大幅提高企业应用的生产力。推荐:Qooxdoo。

UIAction端:
每个UIAction均应为标准JavaBean。其生命周期可通过元数据被定义为:Session,Request,Application。默认为Session。例:

[code:1]@ActionScope(value=ActionBeanScopeList.Session)
public class HelloAction {
……
}[/code:1]

UI Action可通过一个客户端生成器来生成一个JS stub。例如:
[code:1]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;

}[/code:1]
该客户端生成器位于:com.microerp.business.util.Main我们需要为其配置命令行参数:目标路径,类名。在Ecliplse中,可直接用${project_loc} ${java_type_name}的形式。
我曾希望把这个生成器写成Eclipse plugin的形式,但是遇到问题失败了。
   
0 请登录后投票
时间:2005-11-02
Service端:
每个Service都是由一个服务接口和一个实现该接口的标准JavaBean实现的,客户端通过如下方法得到一个服务对象:
[code:1]Iservice service=ServiceFactory.getService(Iservice.class);[/code:1]
而Service端的服务定义只需要在服务接口上利用ServiceInfo元数据进行描述即可。
Service端当然支持嵌套调用,可以在一个Service中调用另一个Service。此时,声明性事务被良好支持。(注:但是不能支持分布式事务,也就是说不同服务器上的服务不能处于一个事务当中)
变通:也可以由一个服务JavaBean分别实现多个服务接口,这是允许的。也可不通过接口,而直接通过bean类调用:
[code:1]ServiceImp service=ServiceFactory.getService(ServiceImp.class);[/code:1]
当然,这样会造成紧耦合,要尽量避免。

ServiceInfo元数据:
[code:1]@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;


}[/code:1]

Transaction元数据:
[code:1]@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;

}[/code:1]
   
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->platform->基本档案->各模块业务......

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

跳转论坛:
JavaEye推荐