• 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了。
  • 相关阅读:
    NET中的类型和装箱/拆箱原理
    转 C# 装箱和拆箱[整理]
    理解线程同步
    IsBackground的理解
    赛马会面试题
    FTP上传类
    FTPS加密上传
    转载WPF SDK研究 之 AppModel
    SQL Server查看错误日志存档编号及其详情
    Hive基础编程入门(一)
  • 原文地址:https://www.cnblogs.com/byfhd/p/785669.html
Copyright © 2020-2023  润新知