一、         概述

EWAEasy Web Application)系统是一套用于开发基于B/S架构的应用系统的开发平台,EWA系统的目标是:关注业务逻辑,关注数据库设计,缩短项目中UI开发周期,迅速跟随需求变更,组件复用性高。

1、 快速成型,无需硬编码,向导方式生成,保证菜鸟工程师每天完成10个页面。

2、 快速部署,生成即部署,无编译。

3、 快速修改,就是要快,跟随需求变更。

4、 低量编码,及对核心业务逻辑编码,并提供辅助编码工具。

5、 高效执行,减少不必要开销,针对核心应用简单编码。合理使用缓存。

6、 高复用性,组件生成和导入,适应不同类型数据库。

7、 远程协同,BS架构IDE,跨域协同。

8、 多语种支持,支持多国语种。

9、 高兼容性,跨平台、数据库、浏览器。

1.     系统由来

在经历数十个大大小小的项目后万分困惑,在如何平衡开发成本、进度和质量和需求变更这四方面的关系心力憔悴。一个典型B/S应用系统项目,如CRMOASCM等,在系统开发过程中,大量的时间被应用于页面合成上面,虽然有一些MVC的中间件的应用,但是还是感觉到低技术水准的编码和测试占了整个开发过程中的60%-80%的时间,这些包括如HTML代码的合成,页面单元的测试,数据验证和页面显示效果,浏览器的兼容性,用户没完没了的需求变更等。同时该部分工作又是开发工程师的恶魔,同时也是项目管理中的恶魔。

典型问题包括:

l         一致性要求

显示效果,显示细节。框架显示方式,修改删除的操作方式等。对菜鸟说太难了。

l         浏览器兼容

在不同的浏览器上显示效果一致。资深程序员能快速解决。

l         需求不断变更

不存在完美需求,项目实施过程中就是不断变化,最简单和最普遍的变化是,我们要增加一个字段放某个信息,我们需要增加一种报表。没完没了。指望合同中约束?门都没有。

我们现实的问题是实体对象都映射好了,需要重新映射,页面重新修改,配置文件修改等。协调程序员编码,修改,重新编译,测试然后在客户服务器上部署。一天算是快的。问题解决了吗,不!过几天又来了,还是要增加信息。协调工作又要重来一遍。

我们的愿望既然不能改变客户,我们能改变什么?30分钟能否完成这个需求变更。

2.     针对80%下手

在典型的应用系统中,核心业务逻辑部分只占项目整体部分的10%-20%左右,大部分的工作是较为简单的数据录入、修改、删除和查询(包括多表和汇总)。对于复杂的业务逻辑部分的设计必须采用硬编码的方式进行,从而保证业务逻辑的完整性。

但对简单的部分如果还是采用硬编码(即使使用代码生成器)并合成为HTML,这样低技术水准的工作会大大延长开发的时间。

 

(项目内容分布)

如果缩短80%部分的开发周期,那么成本和需求变更的问题就会迎刃而解,同时也解放了工程师的时间,使其将主要精力放到数据库架构设计和核心业务逻辑上,从而保证了项目的质量。

3.     解决思路

l         无需编译代码

通过配置文件描述业务系统,需求变更只需修改文件即可。不需要重新编译代码工作。

l         简单使用

配套工具能够简单使用,保证实施工程师(菜鸟级)会使用。

l         远程修改及部署

B/S架构IDE,可在浏览器上生成修改应用系统,保证远程协同开发。

二、         系统结构

1.     系统结构

EWA系统结构分为,配置解析器,UI合成器,数据解析器三个部分组成。参见系统结构图

 

(系统结构)

2.     配置解析器(EWA Configure Parser

配置解析器用于解析XML配置文件,根据Frame类型加载各参数,包括UISQL及逻辑部分。配置文件一旦加载就会放入Cache中,从而加快响应速度。如果配置文件被修改,配置解析器会自动重新加载。

3.     UI合成器(EWA UI Generation

      UI合成器是根据XML配置文件的描述自动生成HTML代码及脚本或XML文件。三种类型的HTML支持的浏览器包括IEFFOPERASafari。同时HTML符合XHTML的要求。

4.     数据解析器(EWA Data Parser

数据解析器是用于数据交换,可和数据库系统,XML文件,类,Web ServiceJSON等进行数据交换。

系统根据不同的XML配置文件和类型,自动生成诸如分页SQL,子查询SQL等,同时系统会自动将参数(QueryStringFormSessionCookie)进行合成,用户不必关系过程。

数据调用的过程中,会根据定义的简单逻辑进行操作。

三、         系统运行过程

 

(基本流程图)

1.     初始化

FormQuerySessionCookies参数信息加载到系统中,同时获取XMLNAME(配置文件)和ITEMNAME(配置项)信息。同时获取UI合成的行为参数:

Ø         EWA_LANG  语言

Ø         IS_AJAX              是否AJAX调用

Ø         ACTION        需执行的ACTION

2.     解析配置

系统首先根据XMLNAMEITEMNAME在缓存中查询,如果存在则通过缓存中获取,如果不存在则解析配置并放入到缓存中,便于下次调用。

缓存机制是间隔5秒查询配置文件是否改变,如果改变,则清除配置。

3.     权限校验

根据配置信息执行权限校验,如果未定义,则忽略并继续执行。否则执行权限校验类,如果不通过,则终止执行并返回跳转到指定的错误页面,并停止运行。

权限校验是用户指定的通过IAcl接口编写的类。

4.     执行ACTION

根据配置文件执行ACTION,执行的方式目前分为五种,分为SQL调用,Class调用,Xml调用,Url调用,Javascript调用。ACTION调用支持简单逻辑判断,根据判断的truefalse进行分支运行。在ACTION中可指定或清除sessioncookies值,用于保持/清除状态。

方式

说明

执行方式

SQL

对数据库的调用,通过Datasource指定的数据源。在EwaConnections.xml中定义。

执行调用Web的数据库连接池。

支持查询,更新和存储过程。

系统

Class

通过反射执行执行类的方法。根据返回数据填写数据。

Ø         返回值若为HashMapList,类,数据解析器会根据对象的方法映射到DTTable表中。

Ø         返回值若为字符串,则首先通过“&”分割字符串,然后通过“=”分割子串,[0]为字段名,[1]为值。
例如:name=master&age=23&id=12,结果是三个字段分别为nameageid,值为master2312

系统

Xml

调用XML文件,进行新增,删除,查询操作。

可采用属性或Node Value方式进行数据操作

系统

Url

跳转页面

页面

Javascript

执行脚本

页面

JSON

未完

系统

Web Services

未完

系统

5.     数据映射

数据映射到自定义的DTTable类中,涉及类包括DTColumnDTRowDTCellDTIndex等对象。

数据映射是将ACTION执行后的返回值映射到DTTable中进行统一调用,这样避免对不同类型的ACTION编写不同的代码,同时便于快速扩展ACTION种类。

数据映射目前完成有三种映射:

1、 SQL映射

对执行返回的结果集进行映射,提取字段和字段值放入DTTable中。

2、 XML映射

根据定义将XML文件映射到DTTable中,基本思路是根据Path首先提取NodeList集合,然后对NodeList进行循环操作,将每个Node的属性或NodeValue放入到数据表中。自动判别CDATA类型。

3、 类映射

根据返回的类进行映射,基本思路是:

Ø         如果是MapList对象,首先进行循环操作,提取对象包含的子对象,并对子对象中所有get模式方法进行映射,方法名作为字段名,返回值作为字段值映射到DTTable中。

Ø         如果是普通类,对子对象中所有get模式方法进行映射,方法名作为字段名,返回值作为字段值映射到DTTable中。

Ø         如果是字符类,则首先通过“&”分割字符串,然后通过“=”分割子串,位置[0]为字段名,位置[1]为值。例如:name=master&age=23&id=12,结果是三个字段分别为nameageid,值为master2312

6.     合成页面

页面的合成是通过配置文件指定的显示模式和XItem项的定义在页面显示,显示内容根据模板定义显示。目前支持列表,新增修改,菜单和树四种类型。

根据指定的参数输出HTML页面,Js脚本,XML对象等。

7.     写日志

根据定义的日志内容输出日志。自定义类根据ILog接口派生。

8.     错误捕捉

在运行过程中出现错误,如果是本地调用,会在页面显示错误信息和执行顺序信息,如果是远程调用,则会转向错误页面,默认是“/Web项目/EWA_STYLE/cgi-bin/_er_/”。可修改“/Web项目/EWA_STYLE/cgi-bin/”下主文件或修改“/Web项目/EWA_STYLE/cgi-bin/_er_/”下主文件。

四、         页面执行过程

页面执行是通过脚本调用配置项进行数据的操作和显示,调用基本方式采用AJAX调用。调用类型主要分为窗口调用,AJAX提交两种模式。

1.     窗口调用

通过脚本生成DIV浮动窗口,在窗口中内嵌IFRAME,如新增、修改等在窗口调用中执行。如果关联主窗体,例如:在列表窗口中弹开修改窗体,则弹开窗口关闭时自动刷新列表窗口,将修改的内容在列表窗口中显示。

2.     AJAX提交

主要用于当前页面调用ACTION,如删除操作。提交执行完成后根据定义刷新当前窗口,将修改结果显示。

五、         配置项简介

一个标准的配置项由Page(页面信息),Action(执行调用),Items(配置条目),Menu(菜单),Chart(图表),PageInfos(提示用信息)。

1.     Page(页面信息)

页面信息控制配置项的主要信息,例如显示类别,数据源(jdbc),皮肤,页面尺寸等控制信息。

参数

名称

列表值

备注

FrameTag

框架名称

 

l       ListFrame,

l       Frame,

l       Tree,

l       Menu

Name

配置名称

 

ItemName

SkinName

皮肤

 

 

DataSource

数据源

 

EwaConnections.xml中获取的数据源数据。

Web服务器的数据连接池。

Acl

权限验证类

 

IAcl派生的类

Log

日志类

 

ILog派生的类

DescriptionSet

描述

 

页面的描述信息,同时是页面的Title

-Lang

语言

zhcn(简体中文)

enus(英文)

EwaConfig.xml中定义

-Info

信息

 

 

-Memo

备注信息

 

 

Size

页面尺寸

 

 

-HiddenCaption

显示列头

0 ()

1 ()

隐藏或显示页头

-Width

宽度

 

数值或相对值

-Height

高度

 

数值或相对值

-HAlign

水平对齐

center (居中)

left (左对齐)

right (右对齐)

页面的水平对齐

-VAlign

垂直对齐

top (顶部)

bottom (底部)

middle (垂直居中)

页面垂直对齐

AddHtml

附加HTML

 

 

-Top

头部

 

在页面上部的HTML

-Bottom

尾部

 

在页面尾部的HTML

AddScript

附加脚本

 

 

-Top

头部

 

在页面上部的脚本

-Bottom

尾部

 

在页面尾部的脚本

AddCss

附加样式

 

附加的样式表

ChartsShow

图表显示方式

l          TableChart (图和表)

l          Table (只有表)

l          Chart (只有图)

 

PageSize

列表分页

 

 

-PageSize

分页数

 

页面显示的条数,默认10

-IsSplitPage

是否分页

0 ()

1 ()

是否分页,最多显示100条记录

-KeyField

主键

 

分页用的主键(不用是物理主键),多主键用“,”分割。

HtmlFrame

页面框架

 

 

-FrameType

框架类型

H (水平)

V (垂直)

自动显示成为FrameSet模式。

-FrameBorder

框架边宽

 

边宽

-FrameSize

尺寸

 

左右或上下尺寸,例如200,*30%,*

FrameHtml

Frame Html

 

FrameTag=Frame时,自定义页面显示的方式

Tree

树字段定义

 

 

-RootId

ID

 

根节点的编号

-Key

主键

 

节点编号字段

-ParentKey

父键

 

父编号字段

-Text

显示

 

显示文字字段

-Level

级别

 

级别字段

-Order

排序

 

排序字段

-LoadByLevel

分级加载

0 ()

1 ()

是否分层加载

-MenuGroup

菜单组

 

菜单组名称

-AddPara1

附加参数1

 

附加参数字段1

-AddPara2

附加参数2

 

附加参数字段2

-AddPara3

附加参数3

 

附加参数字段3

TreeIconSet

自定义图标

 

 

-Close

未选中图标

 

图片(16x16URL

-Open

选中图标

 

图片(16x16URL

-Filter

过滤

 

正则表达式

-Test

过滤类型

l          Key(主键)

l          ParentKey(父健)

 

 

2.     Action(执行调用)

调用系统执行数据的读取,修改或其它类型操作。支持类型包括:

l         SQL调用(Query, UpdateProcdure

l         类调用(静态或动态)

l         XML文件操作(创建,修改,查询)

l         JSON(计划中)

l         WEB SERVICES(计划中)

 

参数

名称

列表值

备注

ActionSet

事件处理

 

 

-Type

事件类型

 

Action的名称

特定的名称:

l  OnPageLoad 页面显示时加载

l  OnPagePost 页面提交数据加载,主要针对Frame提交修改时起作用

-LogMsg

日志信息

 

用于写日志的信息

-CallSet

事件调用

 

参见CallSet

SqlSet

SQL语句

 

 

-Name

名称

 

 

-SqlType

SQL类型

l  Query(查询)

l  Update(更新)

l  Procdure(存储过程)

 

-Sql

SQL语句

 

 

-TansType

事物类型

l  No(否)

l  Yes(是)

是否使用数据库事务处理

-CSSet

数据集合

 

参加CSSet

ClassSet

数据类调用

 

 

-Name

名称

 

 

-ClassName

类名称

 

用于反射的类名称

-ConData

构造数据

 

 

-MethodName

方法名

 

 

-MethodData

方法数据

 

 

-XmlTag

Xml数据Tag

 

返回值是XML格式的String,每行NodeNodeName

XmlSet

XML数据操作

 

 

-Name

名称

 

 

-XmlSetData

XML数据源

 

XmlSetData定义中的名称

- XmlAction

执行模式

l  Load(加载)

l  Insert(新增数据)

l  Update(更新)

l  InsertOrUpdate(新增或更新)

l  Deletes(删除)

 

-XmlData

数据

 

,;分割

-XmlFields

字段

 

,分割

-XmlWhere

执行条件

 

字段名1=1, 字段名2=2,只有和关系

XmlSetData

XML数据源

 

用于XmlSet调用

-Name

名称

 

 

-XmlName

XML文件

 

绝对地址

-XmlFields

字段

 

,分割

-XmlTagPath

数据路径

 

用“/”分割路径,例如:root/Rows/Row

-XmlLoadType

加载方式

l  Attribute(节点属性)

l  ChildNode(子节点的Text)

ChildNode时,会自动判别TextCDATA

ScriptSet

脚本

 

 

-Name

名称

 

 

-ScriptType

脚本类型

l  Javascript

l  Vbscript

 

-Script

脚本内容

l   

 

-CSSet

数据集合

 

参加CSSet

UrlSet

跳转页面

 

跳转页面

-Name

名称

 

 

-Url

URL地址

 

 

-CSSet

数据集合

 

参加CSSet

CallSet

事件调用

 

 

-CallType

调用类型

l  SqlSet

l  XmlSet

l  ClassSet

l  UrlSet

l  ScriptSet

 

-CallName

调用名称

 

相关调用类型下定义的名称

-Test

逻辑表达式

 

简单测试,例如:’@AdmId’=’1’

CSSet

数据集合

 

 

-Name

名称

 

 

-ParaName

参数名称

 

 

-CSType

类型

l  Session

l  Cookie

 

-Life

生存期

 

-Domain

作用域

 

针对Cookie

-Option

操作

l  C(生成)

l  R(删除)

生成或注销

 

3.     Items(显示单元)

显示单元是用于在页面上用于显示和修改的基本元素,简单理解就是针对表字段在页面上的显示成为文本框(input)或是文字(span)或复杂元素(dhtml)。这些元素目前仅支持在ListFrameFrame中显示。

参数

名称

列表值

备注

Tag

Tag名称

 

参加下表

Name

名称

 

 

InitValue

初始化值

l    Tody (当前日期)

l    Tody-Time (当前日期时间)

l    Year-Month (年月)

l    Year ()

l    Time (时间)

l    IP (IP地址)

l    SEQID (序号)

l    GUID (全球唯一标识)

l    ZERO (数字零)

EwaConfig.xml中定义

DescriptionSet

描述

 

单元的描述信息

-Lang

语言

l    zhcn(简体中文)

l    enus(英文)

EwaConfig.xml中定义

-Info

信息

 

 

-Memo

备注信息

 

 

Style

样式

 

当前对象的样式

ParentStyle

父体样式

 

容器的样式

AttributeSet

属性值

 

 

    -AttName

属性名

 

 

    -AttValue

属性值

 

 

EventSet

事件

 

 

    -EventName

名称

 

 

    -EventType

类型

l    Javascript

l    AJAX

 

    -EventValue

脚本

 

 

IsHtml

是否显示为HTML

l    0 ()

l    1 ()

 

OrderSearch

是否排序

 

 

-IsOrder

是否排序

l    0 ()

l    1 ()

 

-SearchType

排序模式

l    text (文字)

l    date (日期)

l    number (数字)

 

MaxMinLength

最大最小长度

 

 

-MaxLength

最大长度

 

 

-MinLength

最小长度

 

 

MaxMinValue

最大最小值

 

 

-MaxValue

最大值

 

 

-MinValue

最小值

 

 

IsMustInput

必输项

l    0 ()

l    1 ()

 

DataItem

数据项

 

 

-DataType

数据类型

l    String (字符)

l    Int (整型)

l    Boolen (逻辑)

l    Number (数字)

l    Date (日期)

l    Binary (二进制)

 

-DataField

映射字段

 

 

-IsEncrypt

是否加密

l    0 ()

l    1 ()

 

-Valid

效验值

l    Email (电子邮件)

l    Alpha (字符)

l    Digit (数字)

l    Duration (持续时间)

 

-Format

格式化

 

 

List

列表

 

 

-Sql

Sql数据

 

 

-DisplayField

显示字段

 

 

-ValueField

值字段

 

 

-ValueList

值列表

 

 

-DisplayList

显示列表

 

 

UserSet

用户自定义

 

 

CallAction

调用Action

 

 

ConfirmInfo

执行前的确认信息

l    DeleteBefore (删除前询问)

l    DeleteAfter (删除后提示)

l    UpdateAfter (更新后提示)

 

AfterTip

调用后的提示信息

l    DeleteBefore (删除前询问)

l    DeleteAfter (删除后提示)

l    UpdateAfter (更新后提示)

 

Action

执行的Action

l    OnPageLoad ()

l    OnPagePost ()

 

OpenFrame

相关配置名称

 

 

-CallMethod

调用模式

l    OpenReloadClose (刷新并关闭)

l    OpenReload (刷新)

 

-CallXmlName

配置文件

 

 

-CallItemName

配置名称

 

 

-CallParas

参数集合

 

 

Frame

相关配置名称

 

 

-CallXmlName

配置文件

 

 

-CallItemName

配置名称

 

 

-CallPara

传递本值参数

 

 

DefineFrame

调用配置项

 

 

-CallXmlName

配置文件

 

 

-CallItemName

配置名称

 

 

CallPara

传递本值参数

 

 

Upload

文件上传配置

 

 

-UpType

传类型

 

 

-UpExts

扩展名列表

 

,分割

-UpPath

上传路径

 

 

VaildEx

高级验证

 

 

-VXMode

验证模式

l    js (脚本调用)

l    action (执行Action)

 

-VXJs

脚本调用

 

 

-VXAction

执行的Action

l    OnPageLoad ()

l    OnPagePost ()

 

-VXOk

验证成功信息

 

 

-VXFail

验证失败信息

 

 

 

Tag类型目前支持:

类型

分类

说明

Text

基本

但行文本

Password

基本

密码

Textarea

基本

多行文本

Button

基本

按键

Span

基本

显示文本

Select

基本

选择

Checkbox

基本

复选框

Radio

基本

单选框

Submit

基本

提交

 

Dhtml

扩展

Html编辑器

File

扩展

文件上传

Date

扩展

日期

DateTime

扩展

日期时间

Valid

扩展

图片验证码

Droplist

扩展

动态下拉框(类似搜索输入框效果)

User

扩展

用户自定义内容

EwaConfigItem

扩展

调用其他配置项目

4.     Menu(菜单)

用于Tree的右键菜单。

5.     Chart(图表)

用于ListFrame中显示和内容相关的图表。

6.     PageInfos(提示用信息)

用于多国文字显示所需信息。

六、         配置项类型

1.     列表(ListFrame

通过表格显示内容,支持分页、检索、排序等功能。参见列表示意图。全部过程用户无需指定相关语句,系统会自动分析组合。

 

(列表)

(1)      分页

目前分页功能仅支持ACTIONSQL时起作用,系统会自动将SELECT语句根据数据库类型自动生成合理的分页查询,用户需要在配置文件中指定主键,单一或多主键(不必是表物理主键,在结果集中用于过滤即可)。

(2)      检索

目前检索功能仅支持ACTIONSQL时起作用,系统会自动将SELECT语句组合成查询语句。

(3)      排序

目前检索功能仅支持ACTIONSQL时起作用,系统会自动将SELECT语句组合成排序语句。

(4)      复合组合

当检索和排序组合时,系统会将SELECT语句组合成排序、查询、分页语句。

2.     新增修改(Frame

用于数据的显示,修改和新增等操作。

 

3.     树(Tree

用于显示树结构,特点是:

支持动态修改名称,删除节点,新增节点功能。

支持分层加载,及先显示最外一层,点击节点后再显示子节点,以此类推,目的是避免数据过多造成用户页面显示缓慢和影响服务器运行效率。在使用SQL数据时,系统会自动组合SQL语句进行分层加载。其他类型数据时,用户需自行处理。

所需必要数据包括主键,显示文字,父健三个部分。

 

4.     菜单(Menu

用于显示标准菜单,需要在Page/AddHtml属性中填写头部和尾部Html内容,同时指定菜单要安装的位置(父体的ID),填写在MenuShow属性中。

 

七、         执行

1.     简单执行

简单执行即通过URL调用,调用的方法是:/Web工程 /EWA_STYLE/cgi-bin/?XMLNAME=配置文件&ITEMNAME=配置项&OTHERS=...。例如:http://10.0.0.1:4040/EmpScriptV2/EWA_STYLE/cgi-bin/?xmlname=ewa.xml&itemname=cfg

2.     脚本调用

EWA.F.Install(ParentId , XmlName, ItemName, Parameters);

l         ParentId:容器的id(即通过document.getElementById()可找到)。内容会体会容器的innerHTML

l         XmlName:配置文件

l         ItemName:配置项

l         Parameters:参数(类似URL参数方式)

3.     配置文件调用

Items中通过EwaConfigItem类型调用。