发新话题
打印

想动就“动”-Java也可以“动态”灵活

想动就“动”-Java也可以“动态”灵活

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

TOP

发新话题