现在的web框架实在太多,令人目不暇接,我所知道的有
struts、webwork、tapeStry、echo、spring、sofia、dbforms,比较熟的是struts,dbforms,既然是框架,必然有配置文件,越灵活的框架,配置越复杂,否则怎么做到flexiable,一个项目中再少也要用到两三个框架(个人经验),光配置文件的维护就够人折腾的,特别是因为业务需求需要底层数据定义(table、field)发生变化时,上层的bean、配置文件必须做出相应变化,那种修改配置文件时的痛苦难于言表,有人说了,用xDoclet,我不否认那会有些许帮助,但对整个项目的进展没有任何实质性的帮助(我在后面会谈及技术的逆反现象,这是从我大学时看到的一个国外文摘所写的一篇名为‘技术的逆反现象’文章所想到的,用在这里可能不恰当;也只有有则改之、无则加免了);
我们来简单讨论一下典型的web开发模式,struts + hibernate
1、用了struts,就少不了struts-config.xml,xForm.java
用了hibernate就少不了hibernate.cfg.xml,xBean.java,xBean.hbm.xml(当然mapping文件可以放在一个或几个hbm文件中)
xForm和xBean在达多数情况下是相同的,可以让xBean从xForm继承,少写一个javaBean
2、对于持久层,我们可以用hibernate封装一个统一的dao,预定义统一接口(
比如CRUD操作的参数都为Entity接口,系统所有持久化对象都直接或间接实现了这个接口,
create(Entity enity)、delete(Entity entity)、update(Entity entity)、load(Entity entity)、query(List list)等)
3、轮到在action中调用这些dao实现业务逻辑了,先不谈复杂的业务逻辑实现I、就说最基础的CRUD实现了,假如系统有100张表(除去关系映射等表),这100张表都要有简单的CRUD操作,这个时候你怎么做
对于普通的create、update、delete、load我们可以在某个xBaseAction或者xBaseDispatchAction中用相同接口做一致处理(如前面dao所示,我们只需傻瓜式的调用dao),在struts-config中最多加一个forward;但是jsp页面怎么办,create.jsp,edit.jsp, update.jsp (这两个页面可以复用create.jsp),view.jsp,?不论你怎么ctrl + c、ctrl + v你至少也要写100个不同的jsp页面,你知道这只是体力劳动,你不想这么做,但是项目又催的紧,你很痛苦,多数情况下,你心不甘、情不愿通过ctrl/c、ctrl/v将工作草草了事,(一般情况下,你并没有意思到这是以后项目维护的一个灾难),其实你清楚还是有办法的,比如我们可以借用现有框架的配置文件(hbm.xml当然是首选文件了,因为他最懂database)自己写个小框架将CRUD操作jsp页面写成模板(template)jsp,jsp模板根据传入的参数翻译成相应的你之前动手写的那个jsp文件,还可以做成tag,页面干净利落,但是当你真正打算去做这件事情的时候,你发现事情并不是你想像的那么简单,现有的配置文件可能还不能够满足你的模板jsp的要求,你需要更多的参数more and more,你决定自定义配置文件格式,但是你马上否定了自己,你发现你系统的配置文件已经够多了,你还要加,而且你加上去的和现有的配置文件没有多少本质的区别,只是用的地方不一样罢了;将来某一天,业务需求发生变化,你要同时修改这一对配置文件,使得他们一致,这将是一件更痛苦的事情;“车到山前必有路,柳暗花明又一村”,人就是这么奇怪,在这个极度郁闷、彷徨的时候,你突然变得很聪明,你会想,与其我这么费劲的写个“鸡肋”般的框架,还不如直接copy再改改得了,我们现在提倡xp,xp的一个原则就是“simplest is the best”,至此,你大功告成了
II、以上只是我们描述的最简单、最理想情况下的处理,我们现在一点一点加上那些让我们熟悉的东西。一般情况下,对每个基础表,你的系统中都维护有一个list,这是CRUD的入口,你要update某个对象数据,你是不是应该preLoad数据然后显示在更新页面上,这个并不难,难点在于你没办法写一个统一的方法“write one,used any conditions”,你通过不断添加参数到request(url)中做到将所有数据对象统一更新,你发现你action的findForward方法将是一个无休止的if…else,因为你要考虑100个不同的forward到100个不同jsp文件,有没有可能用某种格式或者正则表达式对文件名统一命名呢?或许有,但是你没发祥,你又不知不觉又进入I中所描述的怪圈了
这个时候,你庆幸虽然有100张表,但是基本的CRUD都可以通过一个xBaseAction的几个统一方法实现,你要做的无非是copy几个页面,添加几个action的forward属性
III、你的业务数据在load或者create前需要从其他表中读取相关基础数据并引用为你当前表的数据值(外键引用就是一类,还有很多枚举类也是),这个时候你还能指望用一个方法封装100种可能性吗?待续...