阅读更多

154顶
42踩

企业架构
Douyu是一种完全采用Java语言开发的、运行于JVM之上的新型基础开发平台。
在web层,Douyu完全抛弃了JSP/Servlet,
在数据库访问层,Douyu不依赖于任何ORM(对像关系映射)框架(如Hibernate)。


Douyu将Java语言编译器、Http服务器、MVC完美整合在一起,
几乎实现了ORM全自动化,同时在Java语言层面引入了权限管理模型。


Douyu内置的Java语言编译器基于OpenJDK Javac编译器(b60版),
并进行了修改和扩充,跟Http服务器结合之后能在控制器层发挥出强大的威力,
你只要修改Java源文件,然后刷新浏览器就能查看运行结果,
同时编译器也是实现ORM自动化的基石。

Douyu内置的Http服务器是基于NIO技术的,
是对Tomcat6及com.sun.net.httpserver(总共1300多个Java源文件)进行大刀阔斧的改造后得来的,
改造后的Http服务器目前只有60个左右的源文件,支持Http1.0/1.1协议。

Douyu内置的权限管理模型目前包含了功能权限、字段权限两类,
功能权限一般对应控制器类中的Action方法,Action方法可以与表单中的按钮关联,
字段权限能控制表单中的字段是否可以查看、修改或隐藏。

Douyu内置的ORM已几乎实现自动化,你只须建个数据库表(如pet),
然后在服务器配置文件中配置数据库驱动、并为每个数据库指定一个包名(如my.oracle.table),
然后就你可以在你的Java源文件中用import my.oracle.table.Pet导入模型类Pet。
Douyu还支持横跨多个数据库的事务,还支持保存点(Savepoint)。

Douyu项目主页目前放在:
http://code.google.com/p/douyu/

下面是一些简单的代码片断:


Hello World


@Controller
public class HelloWorld {
	public void index(PrintWriter out) {
		out.println("Hello World!");
	}
}



自动提取表单参数:


<FORM METHOD=POST ACTION="User/show">
	姓名:<INPUT TYPE="text" NAME="name">
	年龄:<INPUT TYPE="text" NAME="age">
	<INPUT TYPE="submit">
</FORM>


@Controller
public class User {
	public void show(String name, int age) {
		...
	}
}


文件上传


	<FORM ENCTYPE="multipart/form-data" METHOD="POST" ACTION="FileUpload">
    文件1:<INPUT NAME="file1" TYPE="file"><br>
	说明 :<TEXTAREA NAME="description"></TEXTAREA><br>
    <INPUT TYPE="submit" VALUE="上传">
    </FORM>


import com.douyu.http.UploadedFile;

@Controller
public class FileUpload {
	public void index(UploadedFile file1, String description) {
		File f = new File("D:/Douyu/temp/uploadedFiles", file1.getSimpleName());
		file1.saveTo(f);
	}
}


基本的CRUD操作


create table pet(
  id  int not null auto_increment,
  name varchar(50) not null,
  age int,
  primary key(id)
);


import com.douyu.main.Context;
import sql.table.mysql.Pet;

@Controller
public class Crud {
	public void index(Context c) {
		Pet pet = new Pet();
		pet.name("pet1");
		pet.age(3);
		c.insert(pet);

		pet.name("MyPet");
		c.update(pet);

		c.delete(pet);

		Rows<Pet> rows = new Rows<Pet>(Pet.class);
		rows.offset = 1;
		rows.limit = 100;
		c.select(rows);
		for(Pet p : rows.rowList) {
			...
		}
	}
}



横跨多个数据库的事务


import com.douyu.main.Context;
import my.table.oracle.Table1;
import my.table.mysql.Table2;

@Controller
public class Transaction {
	public void index(Context c) {
		Table1 t1 = new Table1();
		t1.f1("1234");
		Table2 t2 = new Table2();
		t2.f2("1234");

		c.beginTransaction();

		c.insert(t1);
		c.insert(t2);

		c.setSavepoint(); 

		t2.f2("abcd");
		c.update(t2);

		c.endTransaction();
	}
}



Douyu将使用两种开源协议:GPL2.0、 Apache License Version 2.0

所有与编译器有关的源代码使用GPL2.0协议(因为OpenJDK Javac编译器是使用这个协议的)
其他源代码使用Apache License Version 2.0协议开源。


不过目前Douyu的版本只是0.1.0,还不稳定,所以只是提供了二进制版,
目前我也并不推荐你研究Douyu的源代码,因为这可能会浪费你的时间,
因为Douyu的内部实现变动很频繁,在一年之内,大大小小的版本变更次数已超过100次了,
源代码中的注释也非常少,根本就来不急写,等过几个版本稳定先后再发布源代码。

目前Douyu的开发工作只有我一个人,全凭个人兴趣在家全职开发,
如果你对Douyu的实现有兴趣,想参与进来,我也是欢迎的,
但是你必须对Http协议、JDBC规范、Java语言编译器有相当程度的了解,
否则的话你可能在看Douyu的源代码时很吃力。


要想了解更多内容请看:
Without SSH/JSP/Servlet,不走寻常路,Java可以更酷
http://zhh2009.iteye.com/blog/517796

这篇文章是昨晚在JavaEye刚发布的,详细说明了Douyu的更种用法,
里面也详细说明了Douyu的很多设计理念以及我个人的很多研究心得。

赶快去看看吧。。。
154
42
评论 共 209 条 请登录后发表评论
169 楼 magicalboy 2009-12-08 10:07
难道又要革命了?!
168 楼 redsnow_fenglin 2009-12-08 09:22
对于特定的项目,可以高度流程化;对于高度流程化,可以下转型至通用化;对于通用化,可以作为抽象至框架;对于框架,抽象层次越高(尤其是一揽子计划),框架的黑盒性越强,可干预度越有限,对于复杂多变的多样化需求,开发存在越大的隐式失败风险。
个人认为,做框架应重点着眼于某个领域、某个独立模块,即完全满足“可插拔”的机制,应高度重视易用性、灵活性、高效性等,当然,也并不是不可能不存在一揽子计划的框架,比如LZ的这个设想,在这种情况下,要么高度投入,为其最初的一揽子计划目标不懈奋斗(这种投入不是一般的巨大),要么让她沉睡,沉睡在自己梦想的摇篮中。

我们不妨换个角度来看,从解耦的角度看,LZ的一揽子计划绝对可以分层化、模块化,进而以松耦合的方式进行组装,那么,从这个角度来说,LZ的一揽子计划其实质完全可以对应到目前SSH(或其变种)中去,可能LZ又做了更多的封装性工作,我们知道,目前封装的主要手段无非是主流的两种模式:配置文件和Annotation(用的其所,甚好,如JUNIT这种需求;反之,不推荐,尤其是在持久化上,再度回到了硬编码及持久化信息到处散乱,甚差,仅个人观点),要想做强、做大,LZ必须在各个环节下足功夫,仅持久层一向就会面临多种开源的巨大挑战;

其实,我们所面临的是如何做全?又如何做专?并不存在谁淘汰谁,比如目前,Flex与传统的MVC web开发,话说至这里,楼主不妨思考下,这两者的核心异同点在哪里,也不妨顺便了解下微软的sliverlight这个跟风flex的东东(及为何微软每次都能成功跟风?),仅一家之言,仅供交流。LZ有想法并为之实施,是非常值得称道的精神!
167 楼 343101272 2009-12-07 15:01
mark 下,有空拜读
166 楼 ray_linn 2009-12-07 14:51
奇怪?为什么叫“斗鱼”? 斗鱼 这个词儿代表的是Beta..
165 楼 yilanfei2008 2009-12-07 14:42
支持!!!鄙视的人  都是嫉妒的人~!别人都这思想,提出了不足~!。
164 楼 hydehuang 2009-12-01 22:32
想法是不错,但不太现实,企业级应用服务器一直在几大厂商手里,就算我们在座的用这个框架,公司也不会答应更换服务器,而且这类的东东,国外早有人写了,好像现成熟一点叫play Framework
163 楼 niveko 2009-11-23 09:45
标题太唬人了,不过楼主的精神还是支持一下!!!
162 楼 江南白衣 2009-11-21 17:29
Douyu叫Gamble Fish是不是更国际化一点?
161 楼 xl10230 2009-11-20 16:25
非常欣赏楼主这样的自由职业者,楼主加油··
160 楼 xl10230 2009-11-20 16:16
看好楼主··
159 楼 malasun 2009-11-20 15:17
为什么不鼓励我去鼓励别人,只注意什么垃圾评论,我丁页一下又怎么地,你这个je真是缺德。你扣我的分吧,扣我倒数第一也无所谓,和谐我也无所谓,我还来一句:
丁页楼主!!!
158 楼 huatu122 2009-11-20 14:32
包的太紧,没有自由,没有自由,就没有进步。我不太看好这个玩意
157 楼 damoqiongqiu 2009-11-20 11:22
名字有点难听,能考虑换个不? 
156 楼 mandwuyee 2009-11-20 10:54
支持楼主!但是很难耶!
155 楼 zdmcjm 2009-11-20 08:57
www.nn580.com
一年前用grails做的网站,大概两星期.我觉得,性能,开发速度都不错啊.grails封装了SSH.我不认为XXX能终结掉XXXX东西.
对事务要求高,但又想开发效率高,可以用grails那套。
要求不高,就用rails。
想玩高端,就用JAVAEE那套。
有什么终结不终结的。
154 楼 magibt 2009-11-20 00:04
标题太火星了
153 楼 ericjoe 2009-11-19 20:42
  非常支持,不管是创新还是造轮子,先吧标题该一下下吧,姐姐,好雷人哦!
152 楼 raojl 2009-11-19 20:25
喽住的标题没错,SSH都是java的产品,没有SSH不意味没有java!
只要还有java就有灵活成长的空间。
151 楼 raojl 2009-11-19 20:21
任何一个新事物都要经历这样的考验,炒作只是手段,能承受到最后就是成功!
150 楼 Teok 2009-11-19 18:52
suxuan696 写道
中国人写的东西能用么?不敢相信哈哈,再说了 java又不是你写的 谁稀罕用你那破东西啊 !  java还是SUN公司出来的呢。。。有能力 你们自己去开发个新计算机语言啊!!  哎!  炒作!!!!

看看你那窝囊样,自己没胆、没本事弄,别在这说风凉话。

ps:莫非是某些sb的马甲?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • VC_MFC中CRecordset类详解

    CRecordset类的详细说明和MFC中使用CRecordset类的详细方法

  • CRecordset类

    CRecordset类代表一个记录集,是MFC的ODBC类中最重要、功能最强大的类。 #include 1.      动态集、快照、光标和光标库 在多任务操作系统或网络环境中,多个用户可以共享同一个数据源。共享数据的一个主要问题是如何协调各个用户对数据源的修改。例如,当某一个应用改变了数据源中的记录时,别的连接至该数据源的应用应该如何处理。对于这个问题,基于MFC的ODBC应用程序可以采

  • CRecordset::AddNew()函数

        调用此函数来添加一个新的记录到数据表中,你必须调用成员函数Requery来查看新添加到记录。记录的字段初始值为NULL。为了完成完整的操作,你必须调用Update函数来更新保存你对数据源的改动。    注意:    如果你连续执行批量的记录操作,你不能使用AddNew函数。它将导致失败中断。尽管CRecordset类没有提供一个方法来做批量的记录操作,但是你可以利用ODBC API SQL

  • 单独使用CRecordSet (转)

    单独使用CRecordSet (转)[@more@]闻怡洋 Mailto:wyy_cq@21cn.com"&gt;wyy_cq@21cn.com .NET/"&gt;http://www.vchelp.net/ 一般情况下A...

  • 有关MFC ODBC类对打开的CRecordset数据集无法进行更新操作释疑

             在用MFC数据库类CDatabase和CRecordset类声明的对像无法对打开的数据集进行编辑、添加、删除。偶然间让我碰到个这样的问题让我费了不少精神,不知道为什么数据库能正常打开,数据集也正常Open。可是就是没办法进入编辑状态,老是会弹出“记录集只读”的提示。----------------------------------------------------------

  • 使用CRecordset update()函数不能更新

    最近做一个有数据库编程的项目,使用了CRecordset类。总结下心得,方便自己,方便后学的人。     在中介绍了有关CRecordset类的具体用法。那么有以下两个 问题:    1.CRecordview这个类做了什么?      它继承自CFormview,在OnInitialUpdate()函数中调用了CRecordset类的open()方法。      因为vc++并不能直接

  • MFC的CRECORDSET对数据库的操作 .

    MFC数据库操作系列—数据中间层(CRECORDSET) MFC数据库接口分为两种:ODBC和OLE DB 。ODBC而言提供开放的访问方式,使用较为简单,但是需要注册数据库,这导致在部署应用程序的时候需要重新布置数据库,并且个人意见:数据库操作不涉及大量的数据交换建议使用。   CRECORDSET为数据库和应用程序之间交换数据提供和很好的封装。掌握CRECORDSET必要的字段和方法功能

  • CRecordset类学习记录

    这里写自定义目录标题CRecordset类简介快照和动态集的区别CRecordset类成员数据成员构造记录集属性记录集更新操作记录集定位操作其他记录集操作记录集重载函数 CRecordset类简介 CRecordset对象代表从一个数据源选择的一组记录的集合,被称作“记录集”。CRecordset对象可以以两种形式使用:动态集和快照。动态集是与其它用户的更新保持同步的动态数据集。快照是数据的静态视图。每一种形式都代表打开记录集时固定的一组记录。但是当滚动到动态集中的一个记录时,动态集将反映后来由其它用户或由

  • 如何使用CRecordSet类---入门指导

        大家好,我是北京邮电大学的一名学生,Jamie lee。前不久学习了数据库的编程,在这里总结一下,如大家分享一下入门的经验。   先大体介绍我做的数据库编程用到的技术。有ODBC,MFC中CRecordset,MySQL数据库和它的相应工具--SQL Manager Lite for MySQL。看到这个多陌生的东东肯定很挠头吧。其实很简单的,你自己也可以用一天搞定。前提是看完我篇心得,呵呵。   1.首先用你的数据库管理软件,建立一个你要处理的数据库。因为我用的是MySQL,所以我用SQL Man

  • 一个在vs2005+上创建一个基于CRecordView的对话框

    在vs2005+之上 好像基类没有CRecordView类,要想建立一个基于CRecordView的类,我暂时没有找到好的方法,只能手动添加了。。。 这里的SSS是你要创建的类的名字; #if !defined(AFX_SSS_H__4F498E08_A53F_46D5_B438_AD50C0E3A6F1__INCLUDED_) #define AFX_SSS_H__4F498E08_A53

  • VC数据库编程 MFC中相关类

    CRecordSet类     一般情况下AppWizard会在数据库应用程序中自动产生CRecordset的派生类,并将派生类和某个数据源中的表联系起来也可以和视图上的子窗口联系起来。但是有时这样做会影响到程序的灵活性,这时候我们可以单独使用CRecordSet类。利用CRecordSet类我们可以执行SQL语句,并可以读出结果集中数据。     首先我们需要包含头文件afxdb

Global site tag (gtag.js) - Google Analytics