论坛首页 Java企业应用论坛

Without SSH/JSP/Servlet,不走寻常路,Java可以更酷

浏览 213541 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-11-30   最后修改:2009-12-01
今天上JavaEye看到了nutz框架的新闻:

Nutz1.a.22 发布-Mvc,Ioc 文档完成
http://www.iteye.com/news/11774-nutz

看到新闻评论中提到了nutz、Douyu、Play!,
一时心血来潮就回了一次,回了一次很自然的又想回第二次。。。
正好最近也在看Play!,下面的信息就当是对Play!的一点点小的评价了:


treblesoftware 写道
ZHH2009 写道
treblesoftware 写道
caoyangx 写道
和douyu等框架比,优势在哪里?
这么多框架纷纷出炉,最难的就是用户,都是冒着风险使用、都是输不起的项目,如何打消用户的顾虑?


用多余不如用PLAY了。


首先得祝贺一下 zozoh ,希望Nutz能坚持下去越做越好。

再说点别的:
我也初步看了下Nutz,今天还特意去了Nutz的GoogleGroup看了看,
Douyu不会跟Nutz竞争,Douyu与Nutz在技术实现上差距太大。

Douyu与Play!框架在目前看来倒是存在竞争关系,
Play!框架的源码我大致看了一遍,
Play!更像是个胶水框架,颠覆得还不澈底。

Douyu的下一个目标之一就是干掉Play!框架。


呵呵,话说大了吧?DUOYU现在到底是什么样子我们还不知道,另外,PLAY的思想也是不一般的,而且是走的REST的路线。另外,PLAY毕竟一群人在维护,社区也小有规模了。




我没说大话,
我说:"Douyu的下一个目标之一就是干掉Play!框架。"
这不是大话,而是把Play!框架当成一个对手。

当然,我不介意你把"Douyu(斗鱼)"故意写成"DUOYU(多余)",
不过,我是建议你去了解一下斗鱼这类鱼类的特性,
你把两条斗鱼放在一个鱼缸总有一条最后是老大。


我说Douyu与Nutz在技术实现上差距太大也是有根据的,
Nutz没有动态编译,Nutz还是建立在Servlet上,
可以这么说,Douyu与Nutz虽然都有MVC,但是完全是两种不同的风格,
所以我说Douyu不会跟Nutz竞争,
如果你喜欢Nutz的风格我会推荐你使用Nutz。(呵呵,毕竟是国产,互相支持一下)

在这个帖子中除了一些具体的实现细节之外已经对Douyu的整个轮廓都描述得
很清楚了,除非你没细看,除非你懒得动手照着那些傻瓜式的步骤一步步跟着做。

Play!框架除去与Douyu共有的动态编译之外,在我看来并没有多少值得我借鉴的思想。
我说Play!框架更像是个胶水框架也是有根据的:
比如:
play.test包只是对Junit的简单封装;

play.cache包只是提供了一个统一的缓存接口,

你也是使用第三方的缓存产品(EhCache、Memcached);

View层的实现也是使用Groovy(groovy.lang、org.codehaus.groovy.control等等);
处理Http请求、响应相关的又是借助mina、asyncweb;

动态编译也用的是eclipse jdt编译器,直接跟eclipse jdt编译器交互的地方只停留在表面,
甚至连导入的包名的方式都跟Tomcat6的jasper差不多一样;

与数据库相关的又是使用传统的JPA(依赖于hibernate);

又是使用javassist来生成一些"魔术"代码;
参数自动绑定甚至还不如现在的Douyu强大。

还有你引以为毫的"走的是REST路线"这样的设计思路,
恰好就是我在设计Douyu之初就决定废弃的思路,
我不想把时间浪费在写routes配置文件上:
你看看Play!框架走REST路线走到哪去了,
我只想写个HelloWorld,REST让我先配个:
GET     /                                       Application.index
GET     /hello                                  Application.sayHello

我要来个CRUD,REST让我先:
GET			/												${type.controllerClass.name.substring(12)}.index
GET			/${type.controllerName}							${type.controllerClass.name.substring(12)}.list
GET			/${type.controllerName}/new						${type.controllerClass.name.substring(12)}.blank
GET			/${type.controllerName}/{<\d+>id}				${type.controllerClass.name.substring(12)}.show
GET			/${type.controllerName}/{<\d+>id}/{field}		${type.controllerClass.name.substring(12)}.attachment
GET			/${type.controllerName}/{<\d+>id}/edit			${type.controllerClass.name.substring(12)}.edit
POST		/${type.controllerName}							${type.controllerClass.name.substring(12)}.create
POST		/${type.controllerName}/{<\d+>id}				${type.controllerClass.name.substring(12)}.save
DELETE		/${type.controllerName}/{<\d+>id}				${type.controllerClass.name.substring(12)}.delete 
#{/crud.types}
GET			/												CRUD.index

光是看到这密密麻麻的字符就让我倒味口(这还只是两个简单的controller)。

不要看到Roy Thomas Fielding差不到10年前发表的REST论文就像是得到了灵丹妙药,
让我去遵循REST风格我还不如好好利用classpath和Java语言的package语法。


整个Play!框架的自有代码也不过180个左右的Java源文件,
算上所有注释和空行也不过2万5千多行代码,
Play!框架还开发了两年,还是一群人在维护。

我说这么多并不是在显摆,
而是站在一个纯技术人员的角度来看问题,
看一件新事物不能只看表面,要看到实质。


现在的Douyu并不强迫你非得用Douyu开发新项目,
也不强迫你抛弃SSH,甚至鼓励你去尝试Play!,

现在的Douyu更希望得到那些技术痴迷者赏识。
11 请登录后投票
   发表时间:2009-12-01  
ZHH2009 写道
今天上JavaEye看到了nutz框架的新闻:

Nutz1.a.22 发布-Mvc,Ioc 文档完成
http://www.iteye.com/news/11774-nutz

看到新闻评论中提到了nutz、Douyu、Play!,
一时心血来潮就回了一次,回了一次很自然的又想回第二次。。。
正好最近也在看Play!,下面的信息就当是对Play!的一点点小的评价了:


treblesoftware 写道
ZHH2009 写道
treblesoftware 写道
caoyangx 写道
和douyu等框架比,优势在哪里?
这么多框架纷纷出炉,最难的就是用户,都是冒着风险使用、都是输不起的项目,如何打消用户的顾虑?


用多余不如用PLAY了。


首先得祝贺一下 zozoh ,希望Nutz能坚持下去越做越好。

再说点别的:
我也初步看了下Nutz,今天还特意去了Nutz的GoogleGroup看了看,
Douyu不会跟Nutz竞争,Douyu与Nutz在技术实现上差距太大。

Douyu与Play!框架在目前看来倒是存在竞争关系,
Play!框架的源码我大致看了一遍,
Play!更像是个胶水框架,颠覆得还不澈底。

Douyu的下一个目标之一就是干掉Play!框架。


呵呵,话说大了吧?DUOYU现在到底是什么样子我们还不知道,另外,PLAY的思想也是不一般的,而且是走的REST的路线。另外,PLAY毕竟一群人在维护,社区也小有规模了。




我没说大话,
我说:"Douyu的下一个目标之一就是干掉Play!框架。"
这不是大话,而是把Play!框架当成一个对手。

当然,我不介意你把"Douyu(斗鱼)"故意写成"DUOYU(多余)",
不过,我是建议你去了解一下斗鱼这类鱼类的特性,
你把两条斗鱼放在一个鱼缸总有一条最后是老大。


我说Douyu与Nutz在技术实现上差距太大也是有根据的,
Nutz没有动态编译,Nutz还是建立在Servlet上,
可以这么说,Douyu与Nutz虽然都有MVC,但是完全是两种不同的风格,
所以我说Douyu不会跟Nutz竞争,
如果你喜欢Nutz的风格我会推荐你使用Nutz。(呵呵,毕竟是国产,互相支持一下)

在这个帖子中除了一些具体的实现细节之外已经对Douyu的整个轮廓都描述得
很清楚了,除非你没细看,除非你懒得动手照着那些傻瓜式的步骤一步步跟着做。

Play!框架除去与Douyu共有的动态编译之外,在我看来并没有多少值得我借鉴的思想。
我说Play!框架更像是个胶水框架也是有根据的:
比如:
play.test包只是对Junit的简单封装;

play.cache包只是提供了一个统一的缓存接口,

你也是使用第三方的缓存产品(EhCache、Memcached);

View层的实现也是使用Groovy(groovy.lang、org.codehaus.groovy.control等等);
处理Http请求、响应相关的又是借助mina、asyncweb;

动态编译也用的是eclipse jdt编译器,直接跟eclipse jdt编译器交互的地方只停留在表面,
甚至连导入的包名的方式都跟Tomcat6的jasper差不多一样;

与数据库相关的又是使用传统的JPA(依赖于hibernate);

又是使用javassist来生成一些"魔术"代码;
参数自动绑定甚至还不如现在的Douyu强大。

还有你引以为毫的"走的是REST路线"这样的设计思路,
恰好就是我在设计Douyu之初就决定废弃的思路,
我不想把时间浪费在写routes配置文件上:
你看看Play!框架走REST路线走到哪去了,
我只想写个HelloWorld,REST让我先配个:
GET     /                                       Application.index
GET     /hello                                  Application.sayHello

我要来个CRUD,REST让我先:
GET			/												${type.controllerClass.name.substring(12)}.index
GET			/${type.controllerName}							${type.controllerClass.name.substring(12)}.list
GET			/${type.controllerName}/new						${type.controllerClass.name.substring(12)}.blank
GET			/${type.controllerName}/{<\d+>id}				${type.controllerClass.name.substring(12)}.show
GET			/${type.controllerName}/{<\d+>id}/{field}		${type.controllerClass.name.substring(12)}.attachment
GET			/${type.controllerName}/{<\d+>id}/edit			${type.controllerClass.name.substring(12)}.edit
POST		/${type.controllerName}							${type.controllerClass.name.substring(12)}.create
POST		/${type.controllerName}/{<\d+>id}				${type.controllerClass.name.substring(12)}.save
DELETE		/${type.controllerName}/{<\d+>id}				${type.controllerClass.name.substring(12)}.delete 
#{/crud.types}
GET			/												CRUD.index

光是看到这密密麻麻的字符就让我倒味口(这还只是两个简单的controller)。

不要看到Roy Thomas Fielding差不到10年前发表的REST论文就像是得到了灵丹妙药,
让我去遵循REST风格我还不如好好利用classpath和Java语言的package语法。


整个Play!框架的自有代码也不过180个左右的Java源文件,
算上所有注释和空行也不过2万5千多行代码,
Play!框架还开发了两年,还是一群人在维护。

我说这么多并不是在显摆,
而是站在一个纯技术人员的角度来看问题,
看一件新事物不能只看表面,要看到实质。


现在的Douyu并不强迫你非得用Douyu开发新项目,
也不强迫你抛弃SSH,甚至鼓励你去尝试Play!,

现在的Douyu更希望得到那些技术痴迷者赏识。


我服了,您厉害 果然牛人。
0 请登录后投票
   发表时间:2009-12-01   最后修改:2009-12-01
冰火特蕾莎 写道
你好厉害呀,由衷地佩服
现在是凌晨1点多,偶很少熬夜的
你的帖子能坚持偶倒现在全部看完(包括80%的回帖)
你的代码,偶会明天带去公司好好研究的

偶会给予你最直接的帮助和支持,例如说帮楼主测试bug之类
而不像好多回帖的人在那里说风凉话打击人
他们那些人就想证明自己厉害,又没有什么实实在在的本事,又没见得对我们有什么贡献,就知道说大道理,对别人做的东西挑三拣四,自己又做不出什么像样的东西来。
javaeye里这种自以为是的人可多了,因为我身边也有这样的人,所以我很清楚他们平时的性格,可烦他们这些人了。所以师兄你有时候大可不必理会

师兄你要记得把尽量详细的文档和例子放到google里去托管啊
偶一定会去好好研究的。

楼主看了小师妹的支持,一定信心倍增、斗志激昂
不过师兄师妹是很危险的关系哦

ps:既然已经脱管到googlecode了,就把源代码上传上去吧
0 请登录后投票
   发表时间:2009-12-01  
动态部分的实现自己写得啊,没用到cglib么。出于什么考虑呢?所有代码自己来? 呵呵
0 请登录后投票
   发表时间:2009-12-03  
支持编译api的服务器,这个算很有创意吗?两年前玩儿的
http://www.wikiwebserver.org/
0 请登录后投票
   发表时间:2009-12-03  
不得不说 佩服的五体投地!
0 请登录后投票
   发表时间:2009-12-04  
@Controller 这个就如同xml一样,只不过是换了种方式。

现在都想要无侵入式的framework,lz的这个"@Controller" 如同协议一样啊!
还是有侵入的。

不知道为什么都那么讨厌用xml做配置?


如果能有个framework,拿来已有的project然后配置下xml就可以放到web server下运行了,那多好啊!(等待那天尽快到来)

有人又说了,还得配置一堆的xml文件啊,头疼!!!

但是如果有个visual tools 来让我们配置xml那就好了!
托托拽拽就搞定配置,那多棒啊!

(当然仅仅是指action配置的部分,其他的类似权限,ORM什么的就不算在内的了)

目前本人也再考虑这么个framework如果搞定呢?

robbin说要写一篇讨伐servlet的文章,希望能尽快看到
0 请登录后投票
   发表时间:2009-12-04  
C:\99.OLD\Douyu\bin>douyu.bat
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version n
umber in .class file
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
0 请登录后投票
   发表时间:2009-12-04   最后修改:2009-12-04
sohua2000 写道
C:\99.OLD\Douyu\bin>douyu.bat
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version n
umber in .class file
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

UnsupportedClassVersionError这个错误是因为Douyu是用JDK1.6编译的,
class文件的版本号在JDK1.5中不能识别,所以就会出现这个错误。

换成JDK1.6应该就可以了。

跟这里39楼的问题一样:
http://www.iteye.com/news/11305-javac-http-mvc-orm?page=7#comments
0 请登录后投票
   发表时间:2009-12-05  
今天刚发现play!一个非常严重的问题,修改了模版文件居然不能立即生效,必须重启play!后才行~~~
0 请登录后投票
论坛首页 Java企业应用版

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