只要你愿意严肃规矩的java也同样可以变得动态灵活起来动有动的好处静有静的好处俗话说得好没有规矩不成方圆但生命诚可贵爱情价更高若为自由故两者皆可抛那么作为忙碌在程序艺术世界里的子民们我们何去何从呢?投奔动态语言阵营还是继续在四平八稳的Java领域奋战? 在我看来动或不动需要一个黄金分割点
寻找动与不动的黄金分割点
两年前以Martin Fowler为代表的一群大师们突然集体投奔到了动态语言阵营手持RoR这个核武器大喊着要灭了Java要取代Java现在回头来看动态语言给我们确实带来了一些的革命性的思想但同时我们也发现被大师们忽悠了一把
对于强类型的Java语言来说与真正的动态语言比起来确实要受限制很多在我看来借某位大师的比喻Ruby的敏捷相当草书而java就是正楷用Ruby十个程序员写出来的程序就是十种风格这跟我们写文章是一样的而Java就是规规矩矩宋体方块字横是横竖是竖先写哪一笔后写哪一划一切都是规定好了的强类型的静态语言从语法的底层就建立了一套较为稳固的规则体系因此更加规范从长远来说或者是对于大型项目来说肯定是有规范并且规范严格的较之规范不严格的表现起来从扩展性可维护性等要优秀得多
动态语言与强类型的静态语言他们各有自己的特长范围在企业级应用领域JavaEE的优势不是一天两天建立起来的而动态语言其实由来已久最优秀我觉得应该算是javascript了想想以前用asp写程序服务器及客户端脚本都用的js对于小型的应用来说确实很舒服而近两年由于Ajax概念股的走红javascript更加春风得意prototypejs等一批的Ajax框架及引擎更是把javascript的OO及动态特性发挥到极致对于来势凶猛的RoR来说在我看来最好先去跟phpPython这种同类的竞争者好好PK几年如果不被他们灭掉的话然后再来研究要花多少光年来灭掉java这样的命题
对于小型的应用来说小巧灵活简单的动态语言肯定在先机上占有一定优势但对于大型的企业级应用来说动态语言的这种巧活随意性恰好成为其劣势这其中的原因除了本身能力(多核线程系统资源等)有限以外太草了也是限制其发展的原因事实证明动态语言能做到的咱们静态语言稍为动动脑子调整一下也能做到比如Groovy;而静态语言能做到的动态语言打死也做不到除非他自己变成静态的强类型语言比如多核线程二阶段分布式事务如果做到了他可能就不仅仅是动态语言了
动有动的好处静有静的好处俗话说得好没有规矩不成方圆但生命诚可贵爱情价更高若为自由帮两者皆可抛那么作为忙碌在程序艺术世界里的子民们我们何去何从呢?投奔动态语言阵营还是继续在四平八稳的Java领域奋战?
在我看来动或不动需要一个黄金分割点而在EasyJWeb之所以提供一些动态特性的支持也就是寻找这样一个分割点而做的把动与静的好处进行分析权衡然后让JavaEE应用开发变得更加的容易努力寻找这样的黄金分割点对一些非常好的动态特性及思想提供应用级的支持而对于一些必须规范才能产生效率的特性则坚持推广应用Java社区中的很多人都在为寻找这个分割点而努力Java本身也已经意识到这一点在其新的版本中都增加了对一些优秀的动态语言特性的支持
当然对一直觉得受约束受限制的我们来说能动一点想草的时候草两下这是一件非常快乐的事儿因此EasyJWeb在基于Java这样一个具有规范的平台及环境作为基础的前提下做了一些工作使得我我们在一定的范围内也可以灵活的动起来随性地草起来这样使得我们可以放开手脚轻松大胆的往前走下面我通过一些例子来说明
百变CmdActionAbstractCmdAction
在EasyJWeb新版本的Command类型的Action基类即AbstractCmdAction中提供了足够的灵活特性使你得可以像使密宗拳一样书写Java Web Action可以根据你不同的应用场景像用动态语言那样书写Action中的command
假如我们在一个模块中要执行一个名为create操作下面的方法签名都是合法的
publicPagedoCreate(WebFormformModulemodule)
publicPagedoCreate(WebFormform)
publicPagedoCreate(Modulemodule)
publicPagedoCreate();
publicvoiddoCreate(WebFormformModulemodule)
publicvoiddoCreate(WebFormform)
publicvoiddoCreate(Modulemodule)
publicvoiddoCreate();
另外把方法名称改成create系统也一样能识别如
publicPagecreate(WebFormformModulemodule)
publicPagecreate(WebFormform)
publicPagecreate(Modulemodule)
publicPagecreate();
publicvoidcreate(WebFormformModulemodule)
publicvoidcreate(WebFormform)
publicvoidcreate(Modulemodule)
publicvoidcreate();
我们可以使用xxxejf?easyJWebCommand=create的方式来调用这个方法也可以使用xxxejf?cmd=create的方式来调用甚至我们还可以使用/ejf/xxx/create的形式来调用
这种灵活的Action中的命名方法一方面可以使代码更加简洁易维护同时也使我们的代码看起来更cool另外一个主要原因是其使我们可以非常容易书写这些方法的测试代码不需要任何Web容器我们就能运行EasyJWeb的单元测试
看看Struts那种每个方法都必须生搬硬套的生成下面的方法
publicActionForwardcommand(ActionMappingmappingActionFormformHttpServletRequestrequestHttpServletResponseresponse){
…
}
对照EasyJWeb中提供的百变Command方法签名您是否感觉到这个世界正在前进呢?
更多的动感地带
想动就动起来吧不仅仅体现在方法的书写方式上在EasyJWeb中很多地方都用到了这种动态的特性比如forward及go方法提供的多种调用方法验证标签中以自然语言为主体的动态参数配置信息都体现了EasyJWeb能动起来的特性
以验证为例我们可以通过多种方式来告诉EasyJWeb我们需要进行验证比如我可以通过在@FormPO中针对一个或多个属性指定验证规则看示例
@FormPO(name=personvalidators=
{@Validator(name=requiredfield=namesexheigthborndate)
@Validator(name=rangefield=borndatevalue=min:;max:)})
publicclassPerson{
…属性及getter/setter方法
}
你应该猜得出来上面的标签中我们指定Person对象的namesexheigthborndate等属性为必填属性在验证数据范围的RangeValidator中你可以不用去管要验证的目标类型是Integer还是BigDecimal或者是Date只要他能比较就可以应用该验证器来对其值范围进行验证确保我们的域模型得到的是一个合理的值
在标识验证的时候可以设置自定义的验证提示信息比如你可以使用下面的方式来标识一个范围验证
@Validator(name=rangefield=borndatevalue=min:;max:;min_msg:出生日期不能小于年;max_msg:出生日期不能大于年!)
除了min_msg及max_msg以外你还可以使用基于java习惯的minMsg及maxMsg来标识同样的验证提示信息