EWA(Easy Web Application)系统是一套用于开发基于B/S架构的应用系统的开发平台,EWA系统的目标是:关注业务逻辑,关注数据库设计,缩短项目中UI开发周期,迅速跟随需求变更,组件复用性高。
1、 快速成型,无需硬编码,向导方式生成,保证菜鸟工程师每天完成10个页面。
2、 快速部署,生成即部署,无编译。
3、 快速修改,就是要快,跟随需求变更。
4、 低量编码,及对核心业务逻辑编码,并提供辅助编码工具。
5、 高效执行,减少不必要开销,针对核心应用简单编码。合理使用缓存。
6、 高复用性,组件生成和导入,适应不同类型数据库。
7、 远程协同,BS架构IDE,跨域协同。
8、 多语种支持,支持多国语种。
9、 高兼容性,跨平台、数据库、浏览器。
在经历数十个大大小小的项目后万分困惑,在如何平衡开发成本、进度和质量和需求变更这四方面的关系心力憔悴。一个典型B/S应用系统项目,如CRM,OA,SCM等,在系统开发过程中,大量的时间被应用于页面合成上面,虽然有一些MVC的中间件的应用,但是还是感觉到低技术水准的编码和测试占了整个开发过程中的60%-80%的时间,这些包括如HTML代码的合成,页面单元的测试,数据验证和页面显示效果,浏览器的兼容性,用户没完没了的需求变更等。同时该部分工作又是开发工程师的恶魔,同时也是项目管理中的恶魔。
典型问题包括:
l 一致性要求
显示效果,显示细节。框架显示方式,修改删除的操作方式等。对菜鸟说太难了。
l 浏览器兼容
在不同的浏览器上显示效果一致。资深程序员能快速解决。
l 需求不断变更
不存在完美需求,项目实施过程中就是不断变化,最简单和最普遍的变化是,我们要增加一个字段放某个信息,我们需要增加一种报表。没完没了。指望合同中约束?门都没有。
我们现实的问题是实体对象都映射好了,需要重新映射,页面重新修改,配置文件修改等。协调程序员编码,修改,重新编译,测试然后在客户服务器上部署。一天算是快的。问题解决了吗,不!过几天又来了,还是要增加信息。协调工作又要重来一遍。
我们的愿望既然不能改变客户,我们能改变什么?30分钟能否完成这个需求变更。
在典型的应用系统中,核心业务逻辑部分只占项目整体部分的10%-20%左右,大部分的工作是较为简单的数据录入、修改、删除和查询(包括多表和汇总)。对于复杂的业务逻辑部分的设计必须采用硬编码的方式进行,从而保证业务逻辑的完整性。
但对简单的部分如果还是采用硬编码(即使使用代码生成器)并合成为HTML,这样低技术水准的工作会大大延长开发的时间。
(项目内容分布)
如果缩短80%部分的开发周期,那么成本和需求变更的问题就会迎刃而解,同时也解放了工程师的时间,使其将主要精力放到数据库架构设计和核心业务逻辑上,从而保证了项目的质量。
l 无需编译代码
通过配置文件描述业务系统,需求变更只需修改文件即可。不需要重新编译代码工作。
l 简单使用
配套工具能够简单使用,保证实施工程师(菜鸟级)会使用。
l 远程修改及部署
B/S架构IDE,可在浏览器上生成修改应用系统,保证远程协同开发。
EWA系统结构分为,配置解析器,UI合成器,数据解析器三个部分组成。参见“系统结构图”
(系统结构)
配置解析器用于解析XML配置文件,根据Frame类型加载各参数,包括UI,SQL及逻辑部分。配置文件一旦加载就会放入Cache中,从而加快响应速度。如果配置文件被修改,配置解析器会自动重新加载。
UI合成器是根据XML配置文件的描述自动生成HTML代码及脚本或XML文件。三种类型的HTML支持的浏览器包括IE和FF,OPERA,Safari。同时HTML符合XHTML的要求。
数据解析器是用于数据交换,可和数据库系统,XML文件,类,Web Service,JSON等进行数据交换。
系统根据不同的XML配置文件和类型,自动生成诸如分页SQL,子查询SQL等,同时系统会自动将参数(QueryString,Form,Session,Cookie)进行合成,用户不必关系过程。
数据调用的过程中,会根据定义的简单逻辑进行操作。
(基本流程图)
将Form,Query,Session,Cookies参数信息加载到系统中,同时获取XMLNAME(配置文件)和ITEMNAME(配置项)信息。同时获取UI合成的行为参数:
Ø EWA_LANG 语言
Ø IS_AJAX 是否AJAX调用
Ø ACTION 需执行的ACTION
…
系统首先根据XMLNAME和ITEMNAME在缓存中查询,如果存在则通过缓存中获取,如果不存在则解析配置并放入到缓存中,便于下次调用。
缓存机制是间隔5秒查询配置文件是否改变,如果改变,则清除配置。
根据配置信息执行权限校验,如果未定义,则忽略并继续执行。否则执行权限校验类,如果不通过,则终止执行并返回跳转到指定的错误页面,并停止运行。
权限校验是用户指定的通过IAcl接口编写的类。
根据配置文件执行ACTION,执行的方式目前分为五种,分为SQL调用,Class调用,Xml调用,Url调用,Javascript调用。ACTION调用支持简单逻辑判断,根据判断的true或false进行分支运行。在ACTION中可指定或清除session和cookies值,用于保持/清除状态。
|
方式 |
说明 |
执行方式 |
|
SQL |
对数据库的调用,通过Datasource指定的数据源。在EwaConnections.xml中定义。 执行调用Web的数据库连接池。 支持查询,更新和存储过程。 |
系统 |
|
Class |
通过反射执行执行类的方法。根据返回数据填写数据。 Ø 返回值若为HashMap,List,类,数据解析器会根据对象的方法映射到DTTable表中。
Ø
返回值若为字符串,则首先通过“&”分割字符串,然后通过“=”分割子串,[0]为字段名,[1]为值。 |
系统 |
|
Xml |
调用XML文件,进行新增,删除,查询操作。 可采用属性或Node Value方式进行数据操作 |
系统 |
|
Url |
跳转页面 |
页面 |
|
Javascript |
执行脚本 |
页面 |
|
JSON |
未完 |
系统 |
|
Web Services |
未完 |
系统 |
数据映射到自定义的DTTable类中,涉及类包括DTColumn,DTRow,DTCell,DTIndex等对象。
数据映射是将ACTION执行后的返回值映射到DTTable中进行统一调用,这样避免对不同类型的ACTION编写不同的代码,同时便于快速扩展ACTION种类。
数据映射目前完成有三种映射:
1、 SQL映射
对执行返回的结果集进行映射,提取字段和字段值放入DTTable中。
2、 XML映射
根据定义将XML文件映射到DTTable中,基本思路是根据Path首先提取NodeList集合,然后对NodeList进行循环操作,将每个Node的属性或NodeValue放入到数据表中。自动判别CDATA类型。
3、 类映射
根据返回的类进行映射,基本思路是:
Ø 如果是Map或List对象,首先进行循环操作,提取对象包含的子对象,并对子对象中所有get模式方法进行映射,方法名作为字段名,返回值作为字段值映射到DTTable中。
Ø 如果是普通类,对子对象中所有get模式方法进行映射,方法名作为字段名,返回值作为字段值映射到DTTable中。
Ø 如果是字符类,则首先通过“&”分割字符串,然后通过“=”分割子串,位置[0]为字段名,位置[1]为值。例如:name=master&age=23&id=12,结果是三个字段分别为name,age,id,值为master,23,12。
页面的合成是通过配置文件指定的显示模式和XItem项的定义在页面显示,显示内容根据模板定义显示。目前支持列表,新增修改,菜单和树四种类型。
根据指定的参数输出HTML页面,Js脚本,XML对象等。
根据定义的日志内容输出日志。自定义类根据ILog接口派生。
在运行过程中出现错误,如果是本地调用,会在页面显示错误信息和执行顺序信息,如果是远程调用,则会转向错误页面,默认是“/Web项目/EWA_STYLE/cgi-bin/_er_/”。可修改“/Web项目/EWA_STYLE/cgi-bin/”下主文件或修改“/Web项目/EWA_STYLE/cgi-bin/_er_/”下主文件。
页面执行是通过脚本调用配置项进行数据的操作和显示,调用基本方式采用AJAX调用。调用类型主要分为窗口调用,AJAX提交两种模式。
通过脚本生成DIV浮动窗口,在窗口中内嵌IFRAME,如新增、修改等在窗口调用中执行。如果关联主窗体,例如:在列表窗口中弹开修改窗体,则弹开窗口关闭时自动刷新列表窗口,将修改的内容在列表窗口中显示。
主要用于当前页面调用ACTION,如删除操作。提交执行完成后根据定义刷新当前窗口,将修改结果显示。
一个标准的配置项由Page(页面信息),Action(执行调用),Items(配置条目),Menu(菜单),Chart(图表),PageInfos(提示用信息)。
页面信息控制配置项的主要信息,例如显示类别,数据源(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 |
未选中图标 |
|
图片(16x16)URL |
|
-Open |
选中图标 |
|
图片(16x16)URL |
|
-Filter |
过滤 |
|
正则表达式 |
|
-Test |
过滤类型 |
l Key(主键) l ParentKey(父健) |
|
调用系统执行数据的读取,修改或其它类型操作。支持类型包括:
l SQL调用(Query, Update,Procdure)
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,每行Node的NodeName |
|
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时,会自动判别Text和CDATA |
|
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(删除) |
生成或注销 |
显示单元是用于在页面上用于显示和修改的基本元素,简单理解就是针对表字段在页面上的显示成为文本框(input)或是文字(span)或复杂元素(dhtml)。这些元素目前仅支持在ListFrame和Frame中显示。
|
参数 |
名称 |
列表值 |
备注 |
|
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 |
扩展 |
调用其他配置项目 |
用于Tree的右键菜单。
用于ListFrame中显示和内容相关的图表。
用于多国文字显示所需信息。
通过表格显示内容,支持分页、检索、排序等功能。参见列表示意图。全部过程用户无需指定相关语句,系统会自动分析组合。
(列表)
(1) 分页
目前分页功能仅支持ACTION为SQL时起作用,系统会自动将SELECT语句根据数据库类型自动生成合理的分页查询,用户需要在配置文件中指定主键,单一或多主键(不必是表物理主键,在结果集中用于过滤即可)。
(2) 检索
目前检索功能仅支持ACTION为SQL时起作用,系统会自动将SELECT语句组合成查询语句。
(3) 排序
目前检索功能仅支持ACTION为SQL时起作用,系统会自动将SELECT语句组合成排序语句。
(4) 复合组合
当检索和排序组合时,系统会将SELECT语句组合成排序、查询、分页语句。
用于数据的显示,修改和新增等操作。
用于显示树结构,特点是:
支持动态修改名称,删除节点,新增节点功能。
支持分层加载,及先显示最外一层,点击节点后再显示子节点,以此类推,目的是避免数据过多造成用户页面显示缓慢和影响服务器运行效率。在使用SQL数据时,系统会自动组合SQL语句进行分层加载。其他类型数据时,用户需自行处理。
所需必要数据包括主键,显示文字,父健三个部分。
用于显示标准菜单,需要在Page/AddHtml属性中填写头部和尾部Html内容,同时指定菜单要安装的位置(父体的ID),填写在MenuShow属性中。
简单执行即通过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。
EWA.F.Install(ParentId , XmlName, ItemName, Parameters);
l ParentId:容器的id(即通过document.getElementById()可找到)。内容会体会容器的innerHTML。
l XmlName:配置文件
l ItemName:配置项
l Parameters:参数(类似URL参数方式)
在Items中通过EwaConfigItem类型调用。