锁定老帖子 主题:简单看了ROR,真是简单
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-03
唉,图插不近来,不爽。 下面主要比较JAVA基于Struts, Hibernate和ROR的MVC框架在实现上有何异同。 相同点有很多: 对于一个请求URL,在JAVA当中,有Servlet来处理URL的请求,Struts经过定义actionmapping的配置文件,Action,ActionForm来找到正确的处理请求的Action。 而在ROR中,有一个Router来控制对于URL的请求。对于用户的URL请求,它的组织形式固定。http://localhost:3000/say/hello,那么RoR会实例化SayController,调用Controller中的hello方法来处理URL的请求。 这里的Controller相当于我们的Action。应该进一步讲,Controller中的method相当于我们的Action。在JAVA中,Action不是线程安全的,我想在ROR中,Controller肯定也不会是线程安全的(may be,这个不确认,如果这样的话,那么在Controller类中就不能含有任何Controller的实例变量)。 控制器的作用是处理请求,调用Model完成数据库操作,然后把得到的结果传给VIEW端进行显示。我们平时在Action中已经做过了很多这样的事情。只不过,我们在Action和ORM之间加了一层,叫做业务逻辑层。一般,Action -> ××Service -> ××Dao 完成业务逻辑操作,同时,还需要向即将显示的View中设置很多显示页面所需要的变量。 因此,我们会在Action当中向Request,Session中设置很多值。所以,在咱们的程序中会经常出现这样的语句。request.setAttribute("a", objectA); request.getSession.setAttribute("b", objectB),络绎不绝。其实很讨厌,但是没有办法,必须要设置,不然就显示不了。 那么,ROR也是需要向View设置值的。只不过它在Controller中的Method中设置传递给View的变量 ruby 代码
rhtml 代码
其实就是取得刚才设置进去的变量。这个变量放在什么地方呢?无非就是在request,session,或者application上。只是现在我不知道具体放在什么地方而已 对于View,我就不用说什么了。人家用的是rhtml,JAVA用的是JSP,两者都是在html上迁入表达式。其根本,还是要转换为HTML这个标准形式。因此,对于javascript这样的页面客户端脚本语言都没有影响,应该js以前你怎么用,现在还怎么用就ok。 下面说几个我觉得ROR简单的:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-04
引用 ror的开发用web server可是自动重载的哦,不像在java中,改动一下java代码,必须重新编译,然后部署到application server当中,然后运行。在我的机器上,ant之后,启动tomcat,一般时间在4分钟左右。相当的不爽。一直以来,提高开发效率是我们做开发的最为关注的事情。 佩服你是怎么做的,可以热部署的.....俺用weblogic都没你那么费劲. |
|
返回顶楼 | |
发表时间:2007-04-04
唉,因为代码权限控制的原因,项目组里不是每个人都可以拿到整个项目的源代码。编译的时候,需要先从配置库中下载新classes,然后edit,这个时候,已经需要大概2分钟,然后编译,又需要2分钟。所以比较耗时。
你的做法,肯定是直接将java代码编译到WEB-INF下的classe中了,服务器检测到变化就会自动加载。 |
|
返回顶楼 | |
发表时间:2007-04-04
yananay 写道 引用 ror的开发用web server可是自动重载的哦,不像在java中,改动一下java代码,必须重新编译,然后部署到application server当中,然后运行。在我的机器上,ant之后,启动tomcat,一般时间在4分钟左右。相当的不爽。一直以来,提高开发效率是我们做开发的最为关注的事情。 佩服你是怎么做的,可以热部署的.....俺用weblogic都没你那么费劲. 是啊,使用Eclipse或JBuilder都可以用调试方式启动application server,然后可以支持Java class的热替换,就是不用重启server就使用修改后的代码。 当然有一定限制,就是修改后的代码没有修改protected及以上的接口。 |
|
返回顶楼 | |
发表时间:2007-04-04
谁说Controller不是线程安全的?每个Controller都是一个单独的实例,而Action对于每个servlet来说是唯一的实例!
|
|
返回顶楼 | |
发表时间:2007-04-04
如果是这样的话,对于每个请求,都要去new一个Controller对象。当访问量很多的时候,那得去new多少这样的对象?像这样的Controller,为什么不作为Singleton?我认为非线程安全的对效率还是有好处的。
不然,这么多对象,即便用Cache的话,也还是有性能损失啊。 刑天战士 写道 谁说Controller不是线程安全的?每个Controller都是一个单独的实例,而Action对于每个servlet来说是唯一的实例!
|
|
返回顶楼 | |
发表时间:2007-04-04
ROR应该是简约而不简单!
|
|
返回顶楼 | |
发表时间:2007-04-04
hiwzg 写道 如果是这样的话,对于每个请求,都要去new一个Controller对象。当访问量很多的时候,那得去new多少这样的对象?像这样的Controller,为什么不作为Singleton?我认为非线程安全的对效率还是有好处的。
不然,这么多对象,即便用Cache的话,也还是有性能损失啊。 在当代JVM下,new一个对象的额外花销微乎其微,可以忽略不计,Struts2/WebWork 就是这么设计的。Struts1的设计者都说了,他设计Struts1的时候,用的还是java 1.2, GC的效率不够高,要不他也设计成每个request new 一下 Action 了。 WebWork的Action是有状态的,可以说是Controller和Model划分不够清楚,所以这里不能做成Singleton。Spring MVC的Controller,有一种是没有状态,可作为Singleton的。 原文中话得这么说,在Struts 1以下,Action不是线程安全的,在Struts2/WebWork,对每个请求生成一个新的Action实例,因而没有线程安全的问题。 |
|
返回顶楼 | |
发表时间:2007-04-05
这一点我确实做的是有问题。
由于我们的源代码是分权限控制的,得不到所有的源码,因此,我们的classes是被源代码管理的,编译了java文件之后必须得上传,使用的是统一的ant脚本。这一步会比较耗时间。 一般在Eclipse中开发web应用的方法,就是建立web类project。如tomcat project, web project等。将src编译的代码设置到classes下,appliction server在Debug模式下就能够自动替换。 应该在本地配置这种开发模式。然后classes还是得上传,真是比较麻烦。需要做重复劳动。 Lucas Lee 写道 yananay 写道 引用 ror的开发用web server可是自动重载的哦,不像在java中,改动一下java代码,必须重新编译,然后部署到application server当中,然后运行。在我的机器上,ant之后,启动tomcat,一般时间在4分钟左右。相当的不爽。一直以来,提高开发效率是我们做开发的最为关注的事情。 佩服你是怎么做的,可以热部署的.....俺用weblogic都没你那么费劲. 是啊,使用Eclipse或JBuilder都可以用调试方式启动application server,然后可以支持Java class的热替换,就是不用重启server就使用修改后的代码。 当然有一定限制,就是修改后的代码没有修改protected及以上的接口。 |
|
返回顶楼 | |
发表时间:2007-04-05
多谢指点。这块我确实没有研究过。现在JVM的GC做得这么好了。:)
bigpanda 写道 hiwzg 写道 如果是这样的话,对于每个请求,都要去new一个Controller对象。当访问量很多的时候,那得去new多少这样的对象?像这样的Controller,为什么不作为Singleton?我认为非线程安全的对效率还是有好处的。
不然,这么多对象,即便用Cache的话,也还是有性能损失啊。 在当代JVM下,new一个对象的额外花销微乎其微,可以忽略不计,Struts2/WebWork 就是这么设计的。Struts1的设计者都说了,他设计Struts1的时候,用的还是java 1.2, GC的效率不够高,要不他也设计成每个request new 一下 Action 了。 WebWork的Action是有状态的,可以说是Controller和Model划分不够清楚,所以这里不能做成Singleton。Spring MVC的Controller,有一种是没有状态,可作为Singleton的。 原文中话得这么说,在Struts 1以下,Action不是线程安全的,在Struts2/WebWork,对每个请求生成一个新的Action实例,因而没有线程安全的问题。 |
|
返回顶楼 | |