摘 要: 大多数中小企业的Web系统属于轻量级业务处理。基于Java Web平台,提出了一种轻量化系统开发架构,该架构实现了请求形式的改变与业务处理本质的统一,支持常规业务逻辑的自动装配处理,具有可复用、标准化、代码量低的优势。
关键词: Java Web;装配;架构;设计
随着网络技术、计算机技术的发展,越来越多的中小企业单位开始走上信息化的道路。这些企事业单位不仅需要外部网站的建设,同时还有内部Web信息管理系统的建设(例如人力资源管理系统、考勤管理系统等)。根据国家工商总局公布的数据,2005年我国中小企业规模数量为2 836万家,而网站总数量仅为69万家;2012年我国中小企业规模猛增到5 175万家,而网站总数量仅仅为530万家。显然,企业内外部Web系统数量远远低于企业现有数量。因此,基于Java跨平台特性,Java Web系统具有极大地市场需求和开发潜力。
中小企业内外部Web系统具有一些共性特征:动态、轻量化,例如一般涉及数据处理,且数据量不是很大、业务处理逻辑也不复杂。其网站常见功能有:单位组织的介绍、产品的介绍、用户管理、新闻管理、在线咨询或服务等。而内部Web系统的功能侧重于数据的查询、录入、更新、删除等,较少涉及复杂的数据关联处理。
对于上述轻量化的常规数据处理,研究一种能够将业务逻辑处理自动装配的系统DWAS(Dynamic Web Assembly System),具有良好的现实意义:(1)避免重复编写数据的增删查改等操作,自动装配业务处理逻辑,提高复用性,降低开发成本;(2)提供一个标准化、高质量、轻量化的业务逻辑处理基础平台,降低由于开发人员水平差异带来的系统质量问题;(3)降低Web系统开发门槛,用户只需要进行简单的系统配置或组装操作即可完成功能处理要求。
1 系统设计架构
1.1 总体架构
DWAS基于MVC架构,融合Hibernate、Struts和SpringMVC思想。系统着重基于B/S模式的轻量级Web系统开发。DWAS能够自动装配常规SQL操作,用户无需编写SQL语句。DWAS能够自动装配组合查询:对于多条件的组合查询数据,动态Web自动装配系统能够自动适应。系统能够自适应视图变化:当视图层提交数据的形式改变(例如增加或删除页面表单域)时,无需修改处理逻辑的程序代码。DWAS支持主流数据库和连接池产品,其应用方式也显示多样化特征。DWAS总体架构如图1所示。
来自于页面的业务处理请求,先由DWAS的前端控制器接收,然后由控制器工厂自动装配。控制器工厂调用模型层相应的业务处理Bean,由后者与数据库进行交互。最后,控制器工厂将处理后并按照要求封装好的结果数据转发给最终的结果页面(例如显示登录成功的界面)。
1.2 与同类产品的比较分析
目前市场上主流的同类产品主要有Spring MVC、Struts和Hibernate等。具体比较分析如表1所示。
Spring是轻量级的控制反转和面向切面的开源框架,是为了解决企业应用开发的复杂性而创建。Spring MVC需要配置过多的XML文件。Struts是Apache Jakarta项目的一个顶级项目,采用了基于Web的MVC模式。Struts的不足在于过于繁杂的标签体系和大量不太适用的功能。Hibernate是一个开放源代码的对象关系映射框架,使用对象编程思维来操纵数据库,但对于批量数据的修改删除操作不太适合。
DWAS汲取了这些产品的优点,进行了设计思想上的整合、修正和完善。
1.3 自动装配流程
DWAS装配流程如图2所示。
系统准备:JDK、服务器环境的配置、数据库服务器的安装、DWAS系统JAR文件的配置等;编写实体类和XML配置文件:与业务处理逻辑对应的实体类、描述业务处理的标识或SQL语句的XML配置文件;视图页面和运行结果页面:前者是业务处理请求界面,后者则是反馈执行结果的界面。
对第①部分的处理,使用一些文本编辑器即可完成,并不需要开发设计人员具有较高的开发水平。因此,即使是系统前台的设计人员稍作培训,都可以完成。而第②部分,则由DWAS负责自动完成。
1.4 应用方式
DWAS的应用方式很灵活,既可以将其扩展成独立的IDE平台,也可采用插件方式与第三方IDE集成。
2 实践应用展示
2.1应用场景
为简化说明,假定这样的几个应用场景:学生信息查询(不定条件)、学生注册。考察在视图发生变化的情况下,DWAS自适应这种变化的处理能力。
对于不同的应用场景,表单域发生改变时,业务处理标识不变,结果页面不变(只需要回传数据到页面)。用户只需要编写XML配置描述,指定Bean、动作标识、处理成功(失败)转发页面、返回数据属性名,DWAS即可实现自适应视图变化的处理,而无需修改后台业务处理代码。当应用场景仅仅是表单域发生改变时(例如应用场景从根据“姓名”查询变更为根据“姓名、班级”查询),业务处理的本质(学生基本信息的查询)并未发生改变,因此采用相同的业务处理标识。至于结果页面,从图1可以看到,控制器工厂将封装后的处理结果数据转发给最终结果页面,后者只是显示传送过来的数据包而已,因此结果页面不与表单域严密耦合。而“学生注册”这种应用场景,由于属于另外一种业务处理,因此采用不同的业务处理标识。具体如表2、表3所示。
无论是业务处理标识,还是XML描述,使用外部文本编辑器即可进行编辑,其形式的改变并不会影响DWAS内部处理代码,因而视图形式与内在逻辑实现了良好解耦。
2.2 部分关键实现
DWAS要获取请求数据的键值对,代码如下。
protected Map<String,String[]>getRequestDataMap(){
//键值对
Map<String,String[]>map=request.getParameterMap();
try{
Method method=map.getClass().getMethod("setLocked",new Class[]{boolean.class});//接触map锁定
method.invoke(map,new Object[]{new Boolean(false)});//反射
map.remove("action");
List<String> list=getParametersName();//请求参数名
…
}catch (Exception e){e.printStackTrace();}
return map;
}
对请求参数进行解析,代码如下。
protected List<String> getParametersName(){
List<String>temp=new ArrayList<String>();
Set<Entry<String,String[]>>set=map.entrySet();
for(Entry<String,String[]>m:set){
String o=m.getKey();
String[] value=m.getValue();
if(SysCfgEntity.getAction().equals(Constants.query))
continue;
else
temp.add(o);
}
return temp;
}
根据Bean名称获取数据表字段并进行装配,代码如下。
protected String getTablePrimaryKey(){
…
Connection conn=DBFactory.getInstance().getConnection();
rs=conn.getMetaData().getPrimaryKeys(null,null,
getTableName());
primaryKey=rs.getString("COLUMN_NAME");
//反射实体
ReflectEntity entity=new ReflectEntity();
Field[]fields=entity.getFields();
Object instance=entity.getInstance();//实例
BeanUtils.populate(instance,map);
//获取参数名列表
List<String>list=getParametersName();
int i=1;
String primaryKeyValue=null;
for(String s:list){
for(Field e:entity.getFields()){
if(e.getName().equals(s)){
e.setAccessible(true);
ps.setObject(i,e.get(instance));//赋参数值
if(s.equals(primaryKey))
primaryKeyValue=(String)e.get(instance);
i++;
}
}
}
return getAutoParams();
}
DWAS系统着重关注业务处理的本质,并将用户请求形式的外在改变与业务处理的本质特征统一起来,从而实现系统处理的优化。从实践应用情况来看,得到了用户和开发人员的肯定,效果良好。
参考文献
[1] OSGi Alliance corporation. OSGi Technology[EB/OL]. http://www.osgi.org/osgi_technology/index.asp section=2.
[2] Announcing the ADVANCED ENCRYPTION STANDARD (AES). Federal information processing standards publication 197[C]. United States National Institute of Standards and Technology(NIST), 2001.
[3] 陈冈.Java开发入行真功夫[M].北京:电子工业出版社,2009.
[4] 于庆梅.OSGi平台服务动态更新的发布/订阅策略[J].计算机应用与软件,2012(6):17-32.
[5] 黄晗.基于R-OSGi的平台容错架构设计与实现[J].计算机与现代化,2013(9):66-73.
[6] 龙军,赵贵虎,张祖平.一种支持动态管理的SCA服务模型研究[J].计算机科学,2012(12):114-117.
[7] 张语涵,刘淑华,周永鑫.Java Web应用中错误和异常处理方法研究[J].现代计算机(专业版),2013(23):61-64.
[8] 张耀民.SSH框架在Web项目开发中的构建和应用实践[J].微型机与应用,2013(15):18-21.
[9] 司飙.MVC模式下的考试系统建模研究[J].计算机科学,2013(S1):403-406.
[10] 张原,张昭,刘蕊.基于MVC设计模式的虚拟实验平台模块化设计[J].计算机工程与科学,2013(8):125-129.
[11] 梁员宁,陈喆,谢立军.Web服务组合的可靠性动态评估模型[J].计算机应用研究,2012(3):955-960.
[12] 刘淑华.J2EE项目中一种新的错误处理方法[J].计算机应用与软件,2013(7):143-145.
[13] 黄永慧,陈程凯. HTML5在移动应用开发上的应用前景[J].计算机技术与发展,2013(7):207-210.