阅读更多

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 条 请登录后发表评论
209 楼 langjitianya139 2012-07-27 09:39
你们以为 你们比apache的那些大鸟还大鸟么?比spring的作者还大鸟么?比hibernate的大鸟还大鸟么、、???apache都没说要终结SSH。。为什么你们总像终结它???????难道你们真感受不到它的优势么????????
208 楼 langjitianya139 2012-07-27 09:38
SSH很好为什么要终结??????????????????
207 楼 ray_linn 2012-05-02 23:58
说白一点,这种东西简直瞎JB扯淡
206 楼 hqs7636 2012-05-02 23:19
黑暗浪子 写道
好老的帖子哦。记得以前有句话,用记事本编程的不是牛人就是菜鸟。哈哈~

用一年你就是牛淫了
205 楼 黑暗浪子 2012-05-02 23:12
好老的帖子哦。记得以前有句话,用记事本编程的不是牛人就是菜鸟。哈哈~
204 楼 hqs7636 2012-05-02 21:37
hardwin 写道
作者都是用editplus写出来的,太令人吃惊了。你这是看了多少书,读了多少源代码,写了多少有分量的代码,才具有的实力啊


没见过世面,见过用记事本写代码然后用命令行编译的吗?
203 楼 fengyuan1314 2012-05-02 17:09
支持作者!!!
202 楼 wait10000y 2011-03-04 14:26
人~!
201 楼 hardwin 2010-12-22 13:37
作者都是用editplus写出来的,太令人吃惊了。你这是看了多少书,读了多少源代码,写了多少有分量的代码,才具有的实力啊
200 楼 hardwin 2010-12-22 13:35
楼主是中国IT的义勇军和楷模,很值得我们去学习,你的精神我很膜拜!
是不是广西人智商比其他地方的高呀
好多这种框架创作人都是广西的
springside的发起人就是

我只是个程序娃娃。领悟和学习能力都很一般。学习你这种学习精神和钻研精神。
199 楼 q7sese 2010-08-06 17:00
支持国产。。。。。
198 楼 qn_lf 2010-07-09 13:06
ssh 的终结...
197 楼 suncity0001 2010-06-10 15:19
这样的做法,开发便捷,但是存在以下问题
1:数据库方面的优势,这样的结构使用起来倒是很繁琐的
2:性能方面,不会比的上jsp
所有我有想法,就是,保留类似的开发操作模式,当然前提是开放基于java的脚步语言,你感觉呢,兄弟!!
196 楼 coloforlia 2010-04-02 18:31
我觉得ssh在市场上还能再活个3-5,年
195 楼 xinghuawei 2010-02-09 15:53
大力的支持楼主,期待早日发布哦 :!!!
194 楼 faylai 2010-01-06 09:15
看看play 吧和这个差不多的。
193 楼 ^-^ 2010-01-06 09:11
主要是现在很多小项目,小网站动不动就SSH,都想终结他。有时候没必要,硬要写,搞得方法重复调用。好像很复杂的样子。
192 楼 Lunatica 2010-01-05 17:15
最近JavaEye上总有人发帖子终结SSH
191 楼 compty 2010-01-03 21:18
精神上支持
190 楼 compty 2010-01-03 21:17
不错,想法不错

发表评论

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

相关推荐

  • 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

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

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

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

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

Global site tag (gtag.js) - Google Analytics