Compiere Web 架构分析

#1  

Compiere源码研究(V252a)
程东辉
2005-03-16
WEB功能部分
登陆
登陆调用顺序
1用户调用服务器HTTP://LOCALHOST:1080/INDEX.HTMLHTTP://LOCALHOST:1080/WSTART
2        如果调用的是HTTP://LOCALHOST:1080/INDEX.HTML index.html页面是一个框架结构,其组成方式如下图所示

                     
            
              






在window.html中有JS代码
<script language="JavaScript1.2">
document.write('<p>Starting ... <a href="/compiere/WLogin" target="window">Login</a></p>');
location = "/compiere/WLogin";
</script>
通过上述JS代码,将请求定向到服务器的/compiere/Wlogin路径下。
3        如果调用的是HTTP://LOCALHOST:1080/WSTART,则在Wstart的doPost中直接调用以下代码生成登陆页面WebUtil.createLoginPage (request, response, this, null, null);查看WebUtil.createLoginPage代码,发现其实该函数仅仅简单的将请求又重新定向到Index.html页面。
4        登录顺序图如下图所示

登陆验证过程
登陆验证主要使用Wlogin.java来进行,Wlogin,.java还提供两个登陆页面的生成功能。验证步骤如下:
1 init
        在Init函数中,首先将Serverlet相关的设置写入System.properties中,并将全局相关的设置也写入System.properties中。
2 doGet执行序列
        处理用户请求。处理序列如下
        设置超时时间为15×60
        从COOKIE中得到相关设置
        建立会话对象WebSessionCtx
        设置使用语言
        调用以下代码连接数据库
        if (!DB.isConnected())
                {
                        String msg = Msg.getMsg(wsc.ctx, "WLoginNoDB");
                        if (msg.equals("WLoginNoDB"))
                                msg = "No Database Connection";
                        doc = WebDoc.createWindow (msg);
                }
        处理代码验证过程
1)        从Request中得到Principal(如果用户不自己在JBOSS中定义JAAS,则Principal永远为NULL).
2)        从Request中得到用户输入的用户名和密码,如果userPrincipal == null && (usr == null || pwd == null)条件成立,则说明用户初次登陆,创建第一个登陆界面
doc = createFirstPage (cProp, request, "");
3)        如果上一步判断条件不符合,则判断用户密码输入是否正确,如果密码输入不正确,则重建第一个登录界面doc = createFirstPage (cProp, request, "");
4)        如果以上条件都不满足,则说明用户已经通过了用户名和密码的设置,则创建第二个登陆界面createSecondPage,并根据第一个登陆页面中是否保存登陆信息到COOKIE中来确定清空COOKIE中的内容或重写COOKE中的内容。
5)        第二个登陆页面提交到/Wmenu路径,生成功能树。
几个重要的对象
        WebEnv
WebEnv提供了Compiere的Web功能的一些基本静态常数和静态方法。
public static boolean initWeb (ServletConfig config)在每个Serverlet被请求时调用,将该Serverlet的设置数据写入System.properties中。

        WebUtil
提供整个系统使用的静态变量和静态函数。
        WebSessionCtx
每一个用户会话在Session中建立一个WebSessionCtx对象,名称为WebSessionCtx,该对象中保存了针对会话Session的全局设置,主要有以下信息
会话所使用的语言、长短日期的格式、各种数字的格式。另注意:WebSessionCtx中的变量ctx非常重要,该Ctx在登陆系统的过程中传递给了多个对象进行处理,并填充了各种信息,其传递的过程如下:
wsc.setLanguage(request);--->Env.setContext(ctx,Env.LANGUAGE,lang.getAD_Language());设置会话所用语言。
Login login = new Login(wsc.ctx);传递给Login对象
roles = login.getRoles(usr, pwd); 处理传入的ctx对象,将用户名称,用户编码,当前客户名称等信息写入ctx中。
        WebDoc
        Login


左侧菜单生成
窗口调用机制
web窗口是如何生成的?
PROCESS调用机制
报表调用机制
WORKFLOW调用机制
Compiere支持三种类型的工作流:
        单据处理工作流
当处理单据时被启动。在需要审批的情形下,您可扩展这些工作流类型。示例:特价审批(当订单超过某特定金额时)。
        单据值工作流
当任意实体对象满足用户事先定义的条件时,工作流被自动启动。示例:信用审批(针对新的业务伙伴)。
        User Customer一般工作流
提供完成一项任务的导向图及逐步的指导。示例:设置向导、月终处理。用户从菜单中启动它们。
工作流是如何启动的?
在报表/程序定义功能中,对程序的定义即可以是类、函数(存储过程)或一个已定义的工作流。然后在表/列的定义中,针对引用是按钮的列可以设置其处理过程为已定义的任何程序,通过前面步骤的定义,用户在点击按钮的过程中,将触发启动处理流程,而处理流程可能是一段程序或建立一个活动的工作流。
        工作流中比较重要的类
org.compiere.process. StateEngine
该类中基于OMG标准定义了几个工作流状态,还有状态之间的相互转换。
org.compiere.process.DocAction
接口,定义了单据处理工作流的几种状态常数和动作常数


JAVA CLIENT功能部分
未归类
在Column定义和Process Param定义中,都有Reference选项,选择为Table_Direct的意思时直接从数据库表中取值,但是究竟是取那一个表呢?原来是直接将ColumnName的后3为去掉后得到表名,并从AD_TABLE和AD_COLUMN中提取信息。但是ColumnName的值必须以_ID结尾,因为在程序中HardCode了。
原文地址:https://www.cnblogs.com/byfhd/p/785669.html