别人的ROR开发过程


最近一个朋友在学Java和JSP,想做Web编程,我极力劝他学RoR,虽然我还没用这个东西。

时间是很宝贵的东西,如果一个刚上大一的同学问我学Java还有前途吗,我会告诉他坚持学1-2年Java看看。毕竟1-2年时间够他看个几本大部头的Java书籍了。如果大3-4了,还刚想起来学Java(看到招聘信息很多招Java的),那么我只能劝他们放弃吧,时间宝贵,学一点更有用的东西。

有人说我最近怎么离Java越来越远了,的确,我已经好几个月没写Java代码了,但我自己也不用 RoR 进行开发,但我在用一些受RoR启发的框架,譬如CakePHP。学习一门新的技术也是一种投资,你学Java的时间就没法用来学习RoR,这就是所谓的机会成本。用RoR开发Web速度比Java快这是个不争的事实,学习RoR的难度也比Java小,既然可以用更少的时间学习更实用的技术来满足自己的需要,你所花的机会成本就越少,何乐而不为呢?

RoR的灵感来自J2EE。结合哲学上的另外一些灵感,造就了RoR。现在反过来了,Java学习RoR。
本质上,这些都是编程的哲学在驱动,这就是人家说的编程之道。所以不管学什么,多思考,总结方法论,结果就会更好。



JSR-223 和 BSF 实在太像了,以至于参考实现的代码基本上直接取自 BSF,虽然 JSR-223 提供了 http 支持,但是要用 JavaScript 实现一个类似 RoR 的框架,靠这点 http 支持毕竟还是有点局限,所以首先要在Servlet上下点功夫。

URL 是一个很重要的部分,RoR 里面使用 routes.rb 来实现自定义的 URL 规则,这一点在 Java Web 开发中能够做到的话也只能用 Filter 了。我的思路是通过 Filter 获取 URL,然后将 URL 分解,拆出 Controller、Method、Params 部分,然后用 RequestDispatcher 分发到专门处理 Scripts 的 Servlet 来处理,其中这些过程变量放在 request 中带过去。

ScriptServlet 部分应该是读取指定目录的 js 文件,按照 RoR 的约定,应该是在 app/controllers 目录下面按照 xxx_controller.js 开始找,然后根据 request 传过来的 Method 进行调用,最后搜索模版,路径在 views/xxx/ 目录下,用函数调用返回的结果渲染模版。

大致的流程估计应该是这样,下面考虑一下所用的框架。觉得很有可能需要自己实现一个基于脚本的 MVC 框架,除了 Filter 处理 URL 之外,还需要一个 ScriptsServlet 充当 ApplicationController 的角色,用来将请求分发给不同的 js 去处理,然后再加在模版进行渲染。模版引擎考虑才用 FreeMarker,虽然用 js 也可以做,但总觉得功能上不如 FreeMarker 来的强大。


关于URL的处理,总结起来有如下步骤,比之前多了有关静态内容的匹配。


首先匹配规则
如果规则不符,检测是否以后缀结尾
如果有后缀,认为是静态内容
没有后缀,自然拆封,例如:say/hello -> Controller: say, Method: hello
按照这个流程我做了DispatchFilter来处理URL,当然还有很多预料之外的问题需要解决。

RoR 的 layout 特性我还没有想到好的实现办法,使用 FreeMarker 作为模版有一些问题解决不了,譬如类似 RoR 的 render 功能,可能我要考虑直接用 JavaScript 像 RoR 一样作为模版用了。

考虑到写一个JsRails框架的问题,我需要在ScriptEngine启动的时候默认加载一部分类库,之前sun实现的RhinoScriptEngine并没有留有任何扩展让人可以作这个事情,很想改改sun的实现代码,但是毕竟人家是CDDL的,不好弄。于是从cvs中checkout下了Phobos的最终代码,发现同名的jsr-223.jar比Glassfish里面的新,这一份jar才是最符合JSR-223 PFD的。看看代码里面的注释,发现作者已经想到了预留的扩展,总算可以实现要实现的功能了!

这几天又继续完善这个框架,URL的分发采用FilterDispacther,处理Script使用RhinoServlet。框架使用了Phobos的类库,因为RhinoScriptEngine一类的东西Phobos都写得很不错,那来直接用就可以,没必要自己重新发明轮子了。

Phobos里面ScriptEnginePool被我扩展了,主要是用于在启动每个ScriptEngine的时候默认加载一个启动脚本,这个脚本只会在ScriptEngine初始化的时候执行一次,然后进入ENGINE_SCOPE里面。之后就可以使用这里面定义的一些公共函数了。

URL之后的Scripts处理就基本学习RoR的Convention了,layout和helpers的处理流程也基本好了,接下来就是要开始写一些helpers,重点可以转移到JavaScript编程上了。

没有评论: