FastJsp,给JSP插上敏捷开发的翅膀?

敏捷开发,一个很老很年轻的话题,不得不谈而且必须谈的话题,无论你用ASP、PHP、JSP还是ROR,它随时都触动我们开发的神经,让我们在懵懵焦虑中度过一个个不眠之夜。困了,烦了,唉......与其在烦恼中困惑,不如在烦恼中爆发,让我们展开JSP敏捷开发的畅想吧!

解决任何问题,我们都希望很handy,那handy又是何意呢?打开金山词霸2006,输入handy可得解释:“就近的,唾手可得的, 便利的, 敏捷的, 容易取得的”。解释的很直白,却充满了人性化,甚至潜意识。呵呵,如果开发不handy,我们将会怎样?

泛组件化是敏捷开发的最大陷阱!我们的WEB必须要有视觉表现力,WEB2.0要求更甚,但这种表现力需要精烹细调,个中过程远非简单的HTML、CSS之类,开发人员随时可能更改程序部分,不仅仅美工的问题,如果更改部分是“组件”,那你的麻烦大了。要求页面元素的“组件”化,无非是为了代码“复用”和“ 表现”的统一,但能获得视觉上的特色吗?一个很简单的类比:为了满足“味觉”的“鲜美”特色,工业复用方式的生产做得到吗?西餐作不到,中餐更不可能。想想看吧,制作中餐一份鲜美的“小葱拌豆腐”,厨师很handy地备齐佐料,然后再很handy地developping;端上客桌,可客人说香味还不够深蕴,这只是个小修改,若重新回炉打造岂不消耗时间浪费精力,OK,怎么做呢?厨师很handy地准备些鲜葱等,然后再“撒”到菜面上即可。整个修改过程,你会发现厨师似乎手忙脚乱,过程繁琐,但实际却有条不紊,按部就班,最后你会说,“哇,味道真好!师傅,你好利索呀!”呵呵,反之,为了达到所谓的方便,厨师把预定分量的小葱等佐料味道打包形成“组件化”,到时客人一尝,还不大会光火:“师傅,色、香、味样样没有,你就很handy的自己埋单吧!”

WEB特色来自handy,而非component!为何ASP、PHP以及新近出现的ROR,无一例外都把JSP打的满地找牙?随便找三点原因:
1. 解释性语言简单明了,学习、开发、维护成本都很低廉,让JAVA学究式语言的规范整洁无用武之地。
2. WEB开发无需大量企业级应用组件,一般提供mysql编程接口即可,这让JAVA的海量组件形同虚设。
3. 语言本身决定了单纯动态页面的编码难度。排除语言本身的优势,VBS,PHP,RUBY相对都很简单,说白了,能完成简单逻辑和mysql编程即可。
再来看看RoR为何近年来很火!?它是OO类语言,这是潮流,看看这两年C和PHP5都在OO方面大力跟进就知道了,但为何只有RoR有排山倒海之势呢?!甚至出现了Grails跟风。另外,后者会上演GoG大戏吗?因为它有Java这个OO鼻主当靠山啊。No,回答是否定的,原因何在呢?回答这个问题前,得先回答另外一个问题:如果没有Rails,Ruby还翱翔的翅膀吗?除了语言本身的简洁,Rails最大的特点就是:习惯约定优于配置。所以,与其说Ruby,还不如说是Rails给WEB开发带来了暂新的模式。正是这个满足八二原则的开发模式极大激发了WEB开发人员的热情。尤其是Java开发人员,他们身负“组件化”重任,饱受各种配置规范的折磨,这种handy风格让他们看到了解脱的希望。假如将这种handy风格应用到Jsp,又会出现怎样的情形?问题是Jsp是烂泥吗?能扶上墙吗?答案是:能!针锋相对的理由:
1. 语言规范整洁,符合企业严整风范
2. 超大规模的企业级应用组件,便于web应用未来扩大之后的进一步发展
3. 单纯JSP页面只包含显示逻辑,在IDEA、Ellipse插件支持下也能展开敏捷开发

既然能,那我们就尝试Jsp的handy开发吧!2005年7月,FastJsp 1.0正式诞生了。FastJsp意即“快速开发Jsp应用”,设计思想就是:抛开繁琐配置,提供常见开发需求,让用户展开纯粹的Jsp快速开发!也就是今天所谓的handy开发。时过境迁,没想到它还是那么有魅力,所以这里就斗胆把它拧出来,简单解剖,兴许对大家探索JSP敏捷开发有所裨益。

讨论FastJsp前,先看看当今常见的Java WEB层开发模式:(1)Java Servlet的直接封装,如Wicket,Tapestry (2)Jsp再封装,如:JSF,Struts,Webwork (3)Script 方式封装,如:Velocity,Freemaker,OGNL,典型的框架就是Turbine,Tapestry3/4等。 (4)基于Java的解释性语言表达,如:Groovy,这种方式最大的瓶颈在于性能,而且精通的前提是掌握Java,同时蹩脚的Grails实现也给未来的高性能WEB应用埋下不确定因素,显然存在非常高昂的综合成本。(5)Jsp直接支持:如FastJsp。

除了FastJsp,相信大家对其它模式有所尝试,个中酸楚深浅不一,这里不作探讨。那么FastJsp有怎样的开发模式呢?

一:相当handy、统一的URL模式
假设页面模块news下有页面hello,参数p1=v2,p2=v2 可运行的URL模式包括:
http://www.example.com/news/hello.html?p1=v1&p2=v2
http://www.example.com/news/hello/p1-v1-p2-v2.html
http://www.example.com/news/hello/p1-v1.html?p2=v2
http://www.example.com/news/hello?p1=v1&p2=v2

二:相当handy、规范化的页面组织
本框架基于“页面级”的代码组织方式,每个Jsp页面对应一个Java页面类,每个页面再下属url action和表单及其action。各页面Java类和Jsp页面可由程序自由设置存放位置。
Java 类是按需添加的,如上例访问hello.html,系统运行时,将首先查找news模块的hello.jsp,如存在对应的Hello.java页面类,则运行之;否则,就认为其独立存在,但系统仍会运行一个news模块的“缺省”页面类,便于hello.jsp中也能提取该模块特定的资源:url构造、 i18n、风格等。

1)页面Java类:Page/Component,Form/Url,Action的组织
page1
...Page1.java
...form
......form1
.........Form1.java
.........action
............FormAction1.java
............FormAction2.java
............FormAction3.java(more form action)......
......form2(more form).......
...url
......UrlAction1.java
......UrlAction2.java
......UrlAction3.java(more url action)......
page2...
(more page)...

在IDEA、Eclipse、Netbeans等IDEA下,页面类视图非常清晰,每个模块有几个页面,每个页面下有几个表单,每个表单下有几个action等都一目了然。

2)Jsp页面模板
如hello.jsp,存放到自定义的位置即可

三、相当handy的页面组件级设计
本框架中,页面可按组件包含的方式设计,通过实现对<jsp:include/>标签的Java类支持,来达到复用JSP模板的目的。代码组织与上述页面部分相同。
软件包有个范例:users,演示如何组件化开发,大家可仔细观摩。

四、相当handy的的表单验证
开发人员可使用系统预设的表单验证器验证页面输入,当然,必要时也可自定义。验证过程缺省在action执行前运行,当然,也可在页面初始化完毕时或在action中与程序逻辑掺杂运行。

五、相当handy的多文件上传
封装了commons-fileupload 组件,服务端可同时处理多个文件上传。模块范围内的任何页面,都自动具备此特性,即时没有页面类也能随便调用。

六、相当handy的扩展能力
两种理解:
1)普通的Jsp页面放到本框架模块内即可运行,并自动享有模块资源调用能力。例如,放置hello.jsp到模块news下http://host/news/hello[.html]即可正常访问,无需任何更改,若想调用模块资源,更改jsp代码或添加个hello页面类即可。
2) 一般web应用初期,就一个简单jsp页面,但后期随着应用复杂度的增加,什么风格、i18n、文件上载、url/forum、表单验证等都要增加,尤其需要MVC代码分离时,到时你只要按需添加即可目标Java类即可。如,添加个表单helloform,则添加[packages]page/form /helloform/Helloform就行。

七、相当handy的页面语言
完全基于Servlet 2.3/JSP1.2标准,学习成本极其低廉,标签最多会使用一个<jsp:include/>,甚至连其参数也无需掌握。

未来FastJsp的handy思考:
1. 如何更加handy?
2. 有必要添加Ajax吗?
3. 有必要添加业务框架吗?
4. 有必要开发Ellipse或IDEA的辅助插件吗?

下载地址http://bbs.onetsoft.com/bbs/messages/t-48.html

欢迎大家多提有建设性的意见。

标签库用惯了,如果使用FashJsp的话就回到页面嵌代码的写法,头痛啊。

>>> 标签库用惯了,如果使用FashJsp的话就回到页面嵌代码的写法,头痛啊。
页面镶嵌的是显示逻辑,必需的,你用 标签库 不也需要吗?

相信很多开发人员,在尝试struts(尤其2.x)、tapestry等框架后,最终要么自己研发jsp框架,要么使用fastjsp,效率、性能、便捷、简洁将是大家最后返璞归真的选择。

FastJsp的handy进行曲依然在继续,相当handy的cookie操作功能业已完毕,不久将释放下一个改进版本。