论坛首页 入门技术论坛

简单看了ROR,真是简单

浏览 8815 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-04-03  
        看了《Agile Web Development with Rails》前面四章,觉得RoR确实是比较简捷。其实,ROR的应用领域也就是在WEB应用开发上,而在这个领域上,我用JAVA已经有很长时间了。MVC模式,ORM在JAVA领域已经是耳熟能祥的常识了。
       唉,图插不近来,不爽。

       下面主要比较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 代码
 
  1. def methodA  
  2.       @time = Time.now;  
  3. end  
      这样子,在View所对应的rhtml中,就可以输出这个@time的值。
rhtml 代码
  1. <%= @time %>  

     其实就是取得刚才设置进去的变量。这个变量放在什么地方呢?无非就是在request,session,或者application上。只是现在我不知道具体放在什么地方而已

     对于View,我就不用说什么了。人家用的是rhtml,JAVA用的是JSP,两者都是在html上迁入表达式。其根本,还是要转换为HTML这个标准形式。因此,对于javascript这样的页面客户端脚本语言都没有影响,应该js以前你怎么用,现在还怎么用就ok。

     下面说几个我觉得ROR简单的:
  1.      ror的开发用web server可是自动重载的哦,不像在java中,改动一下java代码,必须重新编译,然后部署到application server当中,然后运行。在我的机器上,ant之后,启动tomcat,一般时间在4分钟左右。相当的不爽。一直以来,提高开发效率是我们做开发的最为关注的事情。
  2.     ROR相关的工具真是好。建立一个项目,rails demo,然后程序结构就出来了。启动服务器,ruby script/server;自动生成Controller, ruby script/generator Controller Say。你看看,简单嘛,一下子给你生成你要完成的小工作集。至少不用向我们在java中一样,首先去创建一个Action,然后去创建ActionForm,然后去修改Struts-config.xml,然后去新建JSP,然后去ant,然后去启动server,然后等着,然后在启动浏览器,然后http://, 然后如果有错,又得重新ant,server,等,启动浏览器,这样的日子何时是个尽头啊。
     因此,两者相较,确实ROR方便。对于我来说,有这两点,足以让我选择好好学习ROR了。  
    








 
   发表时间:2007-04-04  
引用

ror的开发用web server可是自动重载的哦,不像在java中,改动一下java代码,必须重新编译,然后部署到application server当中,然后运行。在我的机器上,ant之后,启动tomcat,一般时间在4分钟左右。相当的不爽。一直以来,提高开发效率是我们做开发的最为关注的事情。


佩服你是怎么做的,可以热部署的.....俺用weblogic都没你那么费劲.
0 请登录后投票
   发表时间:2007-04-04  
唉,因为代码权限控制的原因,项目组里不是每个人都可以拿到整个项目的源代码。编译的时候,需要先从配置库中下载新classes,然后edit,这个时候,已经需要大概2分钟,然后编译,又需要2分钟。所以比较耗时。

你的做法,肯定是直接将java代码编译到WEB-INF下的classe中了,服务器检测到变化就会自动加载。

0 请登录后投票
   发表时间:2007-04-04  
yananay 写道
引用

ror的开发用web server可是自动重载的哦,不像在java中,改动一下java代码,必须重新编译,然后部署到application server当中,然后运行。在我的机器上,ant之后,启动tomcat,一般时间在4分钟左右。相当的不爽。一直以来,提高开发效率是我们做开发的最为关注的事情。


佩服你是怎么做的,可以热部署的.....俺用weblogic都没你那么费劲.


是啊,使用Eclipse或JBuilder都可以用调试方式启动application server,然后可以支持Java class的热替换,就是不用重启server就使用修改后的代码。
当然有一定限制,就是修改后的代码没有修改protected及以上的接口。
0 请登录后投票
   发表时间:2007-04-04  
谁说Controller不是线程安全的?每个Controller都是一个单独的实例,而Action对于每个servlet来说是唯一的实例!
0 请登录后投票
   发表时间:2007-04-04  
如果是这样的话,对于每个请求,都要去new一个Controller对象。当访问量很多的时候,那得去new多少这样的对象?像这样的Controller,为什么不作为Singleton?我认为非线程安全的对效率还是有好处的。

不然,这么多对象,即便用Cache的话,也还是有性能损失啊。

刑天战士 写道
谁说Controller不是线程安全的?每个Controller都是一个单独的实例,而Action对于每个servlet来说是唯一的实例!
0 请登录后投票
   发表时间:2007-04-04  
ROR应该是简约而不简单!
0 请登录后投票
   发表时间: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实例,因而没有线程安全的问题。

0 请登录后投票
   发表时间: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及以上的接口。
0 请登录后投票
   发表时间: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实例,因而没有线程安全的问题。

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics