刚刚在javaeye看到一个名为Douyu的国人项目,觉得搞下去未来可能很有意思,放到blog上做个标记。

——————以下是转载的作者原文———————

原文地址如下:http://zhh2009.javaeye.com/blog/517796

标题的构思来源于Rod Johnson的那本"Without EJB"以及CCTV5中一句耳熟能详的广告词,
不过此文并不是用来批判SSH(Struts、Spring、Hibernate)/JSP/Servlet的,
也不是为某品牌做广告,而是用来分享这将近一年来的研究心得。

去年圣诞节时曾在JavaEye发过一两篇文章,不过现在找不到了,
文章内容提到要在3个月左右的时间内设计出一个有别于SSH的新型MVC框架,
设计的起点最初是以JSP/Servlet为基础的,虽然在两个多月后有了个雏形,
但是跟Rails这样的框架相比还是没有明显的优势,
比如在不使用反射的情况下,
很难将不同的uri对应到Servlet类中的public方法。
(Servlet类指的是继承自javax.servlet.http.HttpServlet的类)
每次修改Servlet类的源代码时总得经过烦人的手工编译步骤(有时还不得不重启Tomcat),
还有与数据库打交道的模型层也得人工干预,一堆烦人的映射配置。

那三个月内时常有沮丧感,似乎已走近了死胡同!
后来心一狠,决心甩开JSP/Servlet那一堆条条框框,把设计的起点再往下深一个层次。
因为2007年曾详细研究过Java语言的编译器(javac)实现细节,所以从编译器着手,
但是编译器的强项在于分析Java源代码,无法处理Http请求,
接着在网上把Tomcat6的源代码下下来研究了三个月,
期间顺便研究了Sun公司的超轻量级Http服务器"com.sun.net.httpserver"的源代码,
同时详细学习HTTP/1.0(RFC1945)与HTTP/1.1(RFC2616)协议。

但是Tomcat6过于臃肿了,包含的Java文件超过了1300个,
光是解析server.xml与web.xml的代码看完后就让人有烦躁感。
(如org/apache/tomcat/util/digester与org/apache/catalina/startup包中的很多类)

另外最重要一点,Tomcat6采用的是Eclipse JDT编译器,仅仅是用来编译JSP文件,
编译器在控制层没有发挥一点作用。
而Sun公司的超轻量级Http服务器又过于简单了,连HTTP/1.1的大多数功能都没实现,
除了参考一下它的SSL实现外基本上毫无价值。

本想在现有的JSP/Servlet容器上做一下简单扩展就得了,
哪知也是四处碰壁(还下过Jetty的源代码下来看了一会,结果发现比Tomcat6还糟),
后来决定对Tomcat6与Sun的Http服务器进行大刀阔斧的改造,
完成了一个精简版的改良后的基于NIO的Http服务器(目前的版本只有60个左右的Java源文件),
并且能跟Javac编译器完美结合,能直接运行Java源文件。

在模型层这一块,最初是从书上和网络上对Hibernate进行应用层次的研究,
但是并不想深入源代码,因为代码量也实在是太多了,倒是对Ibatis2.0深入研究了一下,
Ibatis2.0代码量比较少,也简单,看了不到一星期就基本上看完了,不过现在并没留下深刻映象,
因为并没发现什么特别出彩的地方,Ibatis2.0还是离不开xml,而我想要完全抛弃xml。

当然,不管Hibernate也好,Ibatis2.0也好,相比Rails的ActiveRecord还是逊色了点,
不过我的目标并不是要造一个Hibernate、Ibatis2.0或ActiveRecord这样的轮子,
我的要求更高,我在想如何才能写更少的代码,如何才能实现自动化?
可不可以在服务器启动时或运行时动态解析数据库的元数据,
让编译器跟据这些元数据动态生成类呢?
接着我转去研究JDBC-1.2/JDBC-2.1/JDBC-3.0/JDBC-4.0规范,研究数据库驱动的开发手册。
我得从零开始,我目前的实现是这样做的:你可以在你自己的Java源文件中直接引用动态生成的类,
就像这些类是你自己写的一样,ORM已基本上实现自动化了,2.9 节专门讲Douyu的ORM。

最后一点值得一提的是,我在Java语言层次引入了权限管理模型,
不过你别担心,我并没有引入新的Java语言语法,
只是借助Annotation扩充了某些特殊的语义。
目前这个权限管理模型的粒度只是划分为功能、字段权限两个等级,
并没有实现与具体业务相关的数据权限,不过在未来的路线图中有打算引入工作流模型,
到时会努力尝试各种实现数据权限的方案。

与权限相关的细节请看2.8节 Douyu的权限模型

折腾了半年后,发现已不再是个MVC框架了,我想称为平台更合适,
一种运行在JVM之上的新型平台,我给她起了个名字: Douyu
(呵呵,名字的由来暂时保密,也许你能猜出来。。。)

虽然孤军奋战将近一年,自我感觉小有成就,但是还有很多不怎么满意的地方,
各位大牛们也许更牛,看见不爽砸砖头便是。

Ok,上干货。

1. 安装配置
(这里只针对Windows平台,特别是XP操作系统,因为我没其他试验环境)

1.1 安装JDK

Douyu是在JDK1.6下开发的,不支持也不打算支持JDK1.4及更早的版本,JDK1.5我没有测试过,
所以我只能推荐你安装JDK1.6了 ,安装细节我想你都会,
唯一要注意的一点是:最好是建个JAVA_HOME环境变量,然后把%JAVA_HOME%/bin加入到Path中,
因为在Douyu服务器的启动脚本中并没有进行过多的环境检测,
而是直接使用了%JAVA_HOME%/bin目录下的java命令来启动Java HotSpot VM。

1.2 安装Douyu服务器
Douyu项目主页目前放在:
http://code.google.com/p/douyu/

请先下载二进制版的压缩文件:
http://douyu.googlecode.com/files/Douyu_0_1_0.rar

目前的版本是:0.1.0,版本号很小,但大多数功能都包含了,
我并不推荐你用于工业级别的产品开发,
因为还不稳定,目前只适合分享、交流、尝鲜目的。

下下来后直接解压到一个你选定的目录(假定你解压到了D:/Douyu目录)

D:/Douyu目录里头有下面7个目录(跟Tomcat6差不多):

Java代码
  1. apps  //应用程序的源代码放在这里,里头有一些java源文件是下面的演示中用到的,当然你可以全都删了。
  2. bin   //服务器的启动脚本和运行时类库都在这里
  3. conf  //服务器的配置文件放在这里
  4. lib   //应用程序使用到的第三方类库(比如数据库驱动)都放在这里,初始情况下是个空目录
  5. logs  //存放服务器运行期间的日志(目前日志只是输出到控制台),初始情况下是个空目录
  6. temp  //服务器运行期间用到的临时文件夹(比如上传文件时可能会用到),初始情况下是个空目录
  7. work  //服务器运行期间的工作目录,初始情况下是个空目录
apps  //应用程序的源代码放在这里,里头有一些java源文件是下面的演示中用到的,当然你可以全都删了。
bin   //服务器的启动脚本和运行时类库都在这里
conf  //服务器的配置文件放在这里
lib   //应用程序使用到的第三方类库(比如数据库驱动)都放在这里,初始情况下是个空目录
logs  //存放服务器运行期间的日志(目前日志只是输出到控制台),初始情况下是个空目录
temp  //服务器运行期间用到的临时文件夹(比如上传文件时可能会用到),初始情况下是个空目录
work  //服务器运行期间的工作目录,初始情况下是个空目录

了解了这些就足够了,目前你不需要做任何配置。
2. 体验Douyu
2.1 如何运行Douyu服务器?

点"开始->运行",输入cmd,打开一个控制台,切换到D:/Douyu/bin目录,
然后输入 douyu  启动Douyu服务器 (要关闭Douyu服务器连按两次Ctrl+C既可)
见下图:

如果你是第一次打开操作系统第一次启动JVM运行Java程序
或是隔了一个小时左右重新启动JVM运行Java程序,这时可能要等待几秒钟(5--10秒),
出现这种情况并不是Douyu服务器的问题,而是JVM本身或操作系统的问题,
通常启动Douyu服务器如果不加载数据库的话,一般在一秒钟内就能启动完成了。

Douyu服务器默认情况下监听的主机名是: localhost,端口: 8000

如果你不喜欢这样的默认配置,
或者最常见的情况是端口8000被占用了
(一般抛出异常: java.net.BindException: Address already in use)
你可以打开conf/server.java这个服务器配置文件,
配置文件本身就是一个java源文件,参数的配置使用Java语言的Annotation语法,
所有与服务器配置有关的都是Annotation或是Enum,全都在com.douyu.config包中定义。

Java代码
  1. import  com.douyu.config.*;
  2. @Server (
  3. port=8000 ,
  4. .................
import com.douyu.config.*;
@Server(
port=8000,
.................

要修改默认主机名和端口,请修改hostName和port的值,
hostName是一个字符串,可以用IP地址来表示,port是一个整型(int)值。

其他很多参数先不罗列了,使用到时再详细说明。

当你修改了conf/server.java后,你也不需要自己去手工编译它,
启动Douyu服务器时,Douyu会自行决定是否要编译它。
如果conf/server.java存在语法错误,那么编译失败,
Douyu服务器的启动也会失败,同时向你显示编译错误信息。

下文中假定Douyu服务器已启动,监听的主机名是: localhost,端口是: 8000
以下所有例子都经过严格测试了,

我的JRE版本:
D:/Douyu/bin>java -version
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing)

测试浏览器用了两个:

傲游浏览器(IE6.0),
谷歌浏览器(Chrome 3.0.195.27)

2.2 Hello World!

2.2.1 程序代码

Java代码
  1. //对应apps/HelloWorld.java文件
  2. import  java.io.PrintWriter;
  3. import  com.douyu.main.Controller;
  4. @Controller
  5. public  class  HelloWorld {
  6. public  void  index(PrintWriter out) {
  7. out.println("Hello World!" );
  8. }
  9. }
//对应apps/HelloWorld.java文件
import java.io.PrintWriter;
import com.douyu.main.Controller;
@Controller
public class HelloWorld {
public void index(PrintWriter out) {
out.println("Hello World!");
}
}

2.2.2 手工编译已经Out了,你再也不需要这一步了。
2.2.3 运行HelloWorld
打开你心爱的浏览器,输入 http://localhost:8000/HelloWorld
如果你能看到下图中所示内容,恭喜你,你己经进入了Douyu的精彩世界。


(注:这是你第一次直接运行Java源文件,可能会等几秒钟(2--4秒),因为Douyu得初始化编译器)
2.2.4 程序代码说明
com.douyu.main包中的类大多数是Annotation,还包含一些重要的接口和类,
相当于java.lang,是你用Douyu开发程序时最常用到的,也是通往其他模块的快速入口,
本想让com.douyu.main包中的类像java.lang一样让编译器自动导入的,
但是考虑到很多开发人员更偏爱使用IDE,不同IDE内置的编译器不一样,
从而会引起找不到com.douyu.main包中的类的问题,所以最后决定放弃这样的设计了。

@Controller 这个Annotation是用来告诉Douyu这是一个控制器,
当你在浏览器的地址栏中输入http://localhost:8000/HelloWorld 这样的uri时,
浏览器内部通常会生成一个HTTP GET请求消息,消息内容类似这样:

Java代码
  1. GET /HelloWorld HTTP/1.1
  2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,......
  3. Accept-Language: zh-cn
  4. Accept-Encoding: gzip, deflate
  5. User-Agent: Mozilla/4.0  (compatible; MSIE 6.0 ; Windows NT 5.1 ; SV1; Maxthon)
  6. Host: localhost:8000
  7. Connection: Keep-Alive
GET /HelloWorld HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,......
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)
Host: localhost:8000
Connection: Keep-Alive

不过这里并不打算介绍HTTP协议,如果你有兴趣,可以把RFC2616下下来研究。

Douyu服务器收到浏览器发来的请求消息后,
特别留意 "GET /HelloWorld HTTP/1.1" 这一行消息,
其中的"/HelloWorld"表示想要获取Douyu服务器上的哪些资源,
资源有静态的(如html、jpg等文件),也有动态的,在Douyu服务器中动态资源只有一种,
凡是带有@Controller这个Annotation的Java源文件都是可以直接通过uri访问的动态资源。

不过Douyu服务器不能根据uri的表面特征一眼就看出它是动态的还是静态资源,
服务器内部有一个专用的资源装载器,装载器的搜索根目录是从apps这个地方开始的,
资源装载器会尝试将apps目录与uri组合成一个java.io.File对象,
如果File对象存在,那么它就是一个静态资源,
然后由Douyu服务器内部的静态资源处理器给浏览器发送包含有文件内容的响应消息;

如果File对象不存在,资源装载器把请求的uri当成一个类名,
然后尝试采用类装载器的方式装载类,如果找不到那么就直接返回未找到(404)消息;
如果找到了,并且uri是第一次请求的,资源装载器会返回java源文件,
然后把java源文件交给Douyu服务器内置的编译器处理,编译器的处理过程很复杂,
这里就不深入说明了,总之它会为你动态生成HelloWorld的实例,
然后调用它的index这个缺省的public方法,
之后调用out.println()方法把"Hello World!"发送给浏览器。

——————转载结束———————

在我们这个总喜欢以“不要重复发明轮子”为口头禅的国度里,事实上无论是“重复发明的”抑或“自己独创的”现代事物全都屈指可数,出现Douyu这样一个“另类”的项目,无论怎么说都是很有纪念意义的,起码来讲,它敢于牺牲ide支持,重构部分javac代码,以换取实时编译的举动,偶就肯定做不出来……另外在它是“平台”而非“框架”的问题上,偶坚定的支持原作者,因为标准的java服务器会和它有兼容性问题,它只能自己充当平台…… 就我看来, Douyu要想做大做强,最简单的一条路就是作者自己开公司做应用,以应用推平台。否则,未来其研究意义或者远大于实用意义,毕竟使用Douyu不光是使用一个框架,也意味着放弃一系列Java现有体系,而使用它的一整套“平台“。

Douyu已实现的代码量并不大,加之暂不开源,所以我们无法做太多的评判。 但有些人用Douyu与play!framework对比,就我看来,现在还太早了些。最起码来说, play!framework使用REST隐藏了HTTP,而Douyu现今只是通过HTTP协议明码进行get与post传递,Play支持模板,而 Douyu暂时只能用静态的html作为页面,虽然两者都不用 重新编译就可以部署文件, 但play!framework使用自定义ClassLoader动态加载class,用Javassist修改字节码,使用自己修正的Compiler方式编译java源码与模板,而 Douyu主要通过重写javac的java源码部分实现动态编译,Play加上支持库等体积有40多MB,而 Douyu算上更改的javac部分也不过1MB多个一个jar 。从事实上讲,Douyu更像一个play的原型系统,或者说一个未完善的play!framework,如果不照着play!framework的老路走下去,那么Douyu未来会变成什么样子现在还未可知,演化成一个我们无法想象的平台也大有可能。

此项目名为Douyu,就作者自己所言,似乎取自“斗鱼”的意思,而不是有些人所说的“多余”或者我第一印象的“都晕”,不过嘛,斗鱼这个名字其实并不太好,因为无论日漫的《斗鱼》抑或台剧的《斗鱼》,主角都没能逃脱“骗子,流氓,赌徒”的阴影(虽然人都很帅)……该项目未来的走势如何,还是让我们拭目以待吧……

发现一个名为“Douyu”的国人项目相关推荐

  1. 发现一个优秀的Java版国人仿曹操传游戏

    终于又看见有国人用Java写J2ME以外的游戏了,先让偶们一起为作者的开创精神而叫声好吧! 该作者博客如下:http://www.cnblogs.com/egria ,http://salin.jav ...

  2. 发现一个优秀的Java版国人仿曹操传游戏 1

    终于又看见有国人用Java写J2ME以外的游戏了,先让偶们一起为作者的开创精神而叫声好吧! 该作者博客如下:http://www.cnblogs.com/egria,http://salin.java ...

  3. 一个名为systemd-init的CPU挖矿病毒及后续

    一个名为systemd-init的CPU挖矿病毒及后续 作者 root 在安全 今天接到了报警,一台内部的服务器CPU负载嗷嗷的高,感到非常的疑惑,就点进去看看负载情况 CPU爆满 监控诚不欺我,果然 ...

  4. 最近发现一个爬虫开源项目weixin_crawler

    最近发现一个爬虫开源项目weixin_crawler weixin_crawler weixin_crawler是一款使用Scrapy.Flask.Echarts.Elasticsearch等实现的微 ...

  5. 用一维数组统计五个人的成绩中的最大值最小值平均值_昨天为了整理这份教程,我放弃了参加一个几亿人的大项目。...

    昨天为了整理这份教程,我放弃了参加一个几亿人的大项目. 有人说Python吊打Excel,作为一个有着7年Excel的数据分析师,我表示不服. 看完我这个回答我相信你不用再看别人的回答了! 昨天猫双1 ...

  6. 一篇非常有用的文章-《台湾清华彭明辉教授的研究生手册》如何发现一个研究课题?

    一.研究生期间要学什么? 我认为研究生期间学生应该学三件事情: 1)建立合理的知识结构:尽量广地涉猎学科基本知识,尽量深地了解所研究领域的方方面面过去和现在. 2)掌握独立研究的方法和技能:尽量多的学 ...

  7. RDC如何构建一个基于NodeJS的前后端项目

    摘要: 最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会 ...

  8. 发现一个windows7(32bit或64bit)DirectUI的bug

    前段时间发现一个windows7的一个bug,不是什么严重的问题,我在此记录下.(转载请指明出于breaksoftware的csdn博客) 重现步骤如下: 0 在文件夹的"更改您的视图&qu ...

  9. 打造一个名博需要多久

    每个人评价博客的标准是不同的,在IT人眼中,月光博客是名博:在站长眼中,牟长青和卢松松是名博:在SEOer人眼中,ZAC是名博:在设计师眼中,腾讯CDC是名博:在文艺青年眼中,左岸读书是名博:在创业团 ...

最新文章

  1. 类WebOS(添加了主界面,及相关功能代码)
  2. buu [BJDCTF 2nd]老文盲了
  3. .Net程序调试与追踪的一些方法
  4. 深度学习算法简要综述(下)
  5. 苹果将削减iPhone SE及AirPods产量 iPhone 13也要求减产
  6. Intellij IDEA 2017 如何导入 GitHub 中的项目
  7. 华为华三开启snmp服务
  8. 安全运维 - Linux系统维护
  9. java new string编码_Java String 类型编码转换
  10. C# BackgroundWorker使用讲解
  11. stm32Cubemx(8):RTC和RTC唤醒中断
  12. 哪个计算机无法做到双屏显示,笔记本电脑怎么实现双屏显示不同的内容
  13. 黑客与画家 [美] Paul Graham 读书摘录
  14. #第七章 双波不干涉理论 ​一、双波不干涉理论的分级方法
  15. 数字ic2020海思提前批
  16. 软件设计师笔记(信息安全)
  17. 基于51单片机的关于7SEG-MPX8-CA,7SEG-MPX6-CA,7SEG-MPX4-CA的使用
  18. Java——Error running exam-web: Adress localhost:1099 is already in use
  19. 那些年我们用过的final和static
  20. latex怎么给图片命名_[Latex] Beamer 入门

热门文章

  1. Python实现读、写、改Excel文件的常见方式及其应用场景对比
  2. [图文讲解]强大的谷歌搜索技巧,百度360搜狗什么的就是渣渣
  3. 基于S7-200 PLC和MCGS组态的水箱水位控制系统设计 组态王动画仿真,带PLC源代码,plc程序每一条都带着解释
  4. 软件工程 -- E-R图
  5. python实现生成word文档并转为pdf
  6. 3.数据挖掘——房价项目预测(三)Pandas学习
  7. java基础练习实例_java基础练习题(se)
  8. QT:颜色拾取器的实现
  9. 社区发现系列03-Louvain算法分辨率
  10. 知识点 | SQL标准协议有哪些?