7wxAop 框架简介 (版本1.1 Leebai/2006.04)
7wxAop是一个基于Ajax概念的Web开发框架,由浏览器端的7WX框架和服务器端的AOP框架构成。“7WX”是“XML”翻转过来的形状,其含义为“非XML的Ajax框架”,前端程序只依赖DOM和Javascript,不需要XML。“AOP”是Action Orient Programming的缩写(不同于Aspect Orient Programming的AOP),强调后端编程以Action(或者叫Request、Command、Service)为中心,把每个HTTP Request的处理过程都看做一个独立的业务逻辑Service。
目前的AOP只实现了for Java的版本,要在Servlet容器中运行。在AOP for Java 中,后端应用程序是一个包含一组Action实现代码的Servlet,复杂的业务系统由数个Servlet构成。由于后端只实现单纯的业务逻辑代码,因此代码数量能明显减少。
7WX下的前端程序都是一些含脚本代码的静态HTML文件,由于框架的功能封装,应用程序要写的脚本代码也是很少的。
7wxAop并非Web2.0和Ajax浪潮下的产物,其技术来自2000年的一个电子商务系统项目的"商务洽谈室"模块,框架主体程序在2001-2002年间基本完成,并在很多软件项目中得到应用。2005年Ajax概念被广泛接受,7wxAop经过局部改进,升级为目前的1.1版本;2006初,进一步改进了前端框架7WX,增加了对Firefox浏览器的支持。
7wxAop的设计目标是实现简单、高效、低成本的Web应用开发。相比之下,Ajax所能带来的“无刷新的用户体验”却更象一个副产品。
7wxAop力图降低对开发人员的技术要求,用7wxAop开发应用系统,开发人员不用学习XML、JSP、标记库、具体的Servlet API、EJB、JMS、JNDI、O/R Mapping、设计模式、UML、RUP...等等花样繁多的技术。7wxAop认为,95%以上的Web软件项目用不着太复杂的技术,7wxAop能让普通开发人员把常规项目更快更好地完成,至于余下5%的高级项目,让高手们去想办法好了:-)。在7wxAop看来,J2EE Pet Store样例程序是一个“把简单的问题复杂化”的典型,Java开发社区的恶习是把应用开发当科学研究,开发人员的学习时间大大超过工作的时间,而工作成效却往往不如.Net及PHP的开发者。7wxAop认为用Java做后端系统是目前最好的选择,但基于J2EE的开发工作要简单化。
Ajax框架的核心是浏览器和服务器之间的异步通讯,通常的Ajax程序使用非W3C标准的 XMLHttpRequest 作为通讯组件,7wxAop没有用XMLHttpRequest,而是采用简单的IFrame。从7wxAop的实践看,封装良好的IFrame通讯机制比XMLHttpRequest更好用,也更易用。
在7wxAop下,浏览器访问服务器端的Action通过一个简单的callServer(servletName,actionName,data)函数(7wxAop不追求绝对的面象对象编程),如果Action执行中有问题(包括程序错误及程序提示),框架自身会把信息报告给用户,不需要前端开发者编程处理;如果Action被顺利执行,则会回调名为on_actionName()的函数,前端编程者要做的就是实现这个函数。
callServer()中的data参数就是要提交给服务器的数据。data可以是简单的url参数,如“userid=zhangsan&password=zs”;也可以是一个Form元素,如loginForm。由此可以看出,7wxAop下向服务器发送数据是很简单的,不需要将数据来回转换。
在回调函数on_actionName()中,前端代码可以访问返回数据buffer中的数据,如 buffer.userName 。buffer中的数据都是Javascript变量,可以直接引用,不像XMLHttpRequest中还要解析一翻。因此,7wxAop下使用后端返回数据也比XMLHttpRequest方式简便。返回数据有简单变量、多属性对象和数据集(形式上是数组,由于Web协议的无状态性和请求返回数据的容量限制,数据集用数组存放是最佳的)三种,数据集的元素可以是含多个属性的对象,也可以是数组。
B/S通讯举例:对于用户登录操作,在7wxAop下的前端代码如下:
上面的通讯机制可以参考7wxAop框架结构图:
Ajax的“无刷新”页面确实能带来更好的用户体验,但是如果所有的界面变化都通过innerHTML或DOM方法直接实现,那么前端开发工作量将十分巨大,因此Ajax目前还被认为是“高开发代价”的技术。解决这个问题的途径之一就是封装具有数据绑定功能的界面组件,依实际需要,7wxAop主要设计了三种数据绑定组件:TreeView,ListView,FormView。
TreeView组件主要用于功能导航界面,可以和服务器端返回的含父子关系的数据集绑定,可以绑定整棵树,也可以绑定子树,树节点可以动态更新,支持右键菜单,支持节点选择功能。
ListView组件用于显示列表,可以和数据集绑定。与有些Ajax框架的列表封装不同,ListView不支持数据编辑,它的侧重点在于支持各种显示样式的列表,ListView的显示基于HTML模板,可以用于表达复杂的列表,并内置数据翻页功能。ListView还支持三维列表,因此可用于显示Outlook风格的折叠式导航器。
FormView也是基于模板的组件,可以和返回的数据记录绑定。FormView具备7wxAop框架原创的“元信息自适应(Meta Adaptive)”特性:利用数据表的Metadata(字段数据类型、是否非空、长度、精度、小数位数、主外键关系等等),自动透明地对表单中的输入控件进行外观调整、输入限制及提交验证,最大限度地减少表单开发的工作量。
Ajax模式的Web程序,由于后端服务器不再负责页面流程控制,因此不但Controller层变得简单,而且Action与页面转向完全无关,Action本身就是纯粹的业务逻辑Service。7wxAop中,后端AOP框架的设计目标是简化Action开发。由于每个Action都有共同的生命周期,都有一些共同的功能,因此可以把它们的公共部分“横切”到框架里面来做,使这些功能对Action完全“透明化”,而让业务Action代码只做各自特有的功能。目前版本的AOP,框架负责的公共功能有:数据库连接与释放、事务处理、异常处理、访问日志、权限检查、运行性能监测等。
您也许已经看出这里的ActionOP与AspectOP在“横切”方面有些雷同,这并不奇怪:其实AspectOP近年来之所以被广泛接受,和基于Request的应用的普及有很大的关系。
Action在AOP框架中不做为一个个Bean、而作为一个个方法来实现,这些方法属于某个Action集合类,而一个Action集合就是一个应用,Action集合类继承于7wxAop的WebActions类。7wxAop约定,WebActions子类中的以下划线"_"开头的方法是Action方法,可以被浏览器端的callServer()函数调用。
在Action方法中,开发者可以访问HttpServletRequest对象,获得前端传过来的数据。可以通过JDBC或其他持久层访问技术完成业务逻辑。最后,对于查询性质的Action,通过WebActions类提供的sendXXX()系列方法把执行结果数据传回到前端;对于更新或执行性质的Action,什么都不用做,前端会知道执行是成功的。
对于占绝大多数的、基于RDBMS的软件系统,根据我们的经验,绝大部份的Action要做的事都比较简单,通常只是一些对数据表增删改查的操作。7wxAop认为用面向对象的Java代码来描述这些简单的关系表操作有点匹配上的问题,代码即不直观,也没有开发效率。对这类以操作关系表为主的Action,建议用7wxAop框架原创的AutoAction(和存储过程有点类似)来描述。AutoAction由一组称为AutoSQL的语句构成,AutoSQL中即包含前端输入变量、系统变量的引用指示,也包含要输出到前端的数据集的指示。比如,要给前端返回当前登录用户的所有订单,可以写成:
根据实际开发经验,业务系统的90%的Action都很容易通过AutoAction来描述,因此7wxAop可以极大地减少程序代码,程序也更直观、更容易维护。
7wxAop框架的开发经历了很长时间,框架的实用性在很多项目中都得到了验证,其中包括基于7wxAop的BBS、CMS。而最基本的验证演示程序就是一组7wxAop开发维护辅助工具:Studio、DBView、FileView、以及框架随带的用户管理模块。这四个程序性质大不相同:
总的来说,7wxAop框架是一个通用Web开发框架,适合各种类型的Web应用。
.org