duoyu簡介

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

Java代碼 複製代碼
  1. @Controller  
  2. public class HelloWorld {   
  3.     public void index(PrintWriter out) {   
  4.         out.println("Hello World!");   
  5.     }   
  6. }  
@Controller
public class HelloWorld {
	public void index(PrintWriter out) {
		out.println("Hello World!");
	}
}




自動提取表單參數:

Html代碼 複製代碼
  1. <FORM METHOD=POST ACTION="User/show">  
  2.     姓名:<INPUT TYPE="text" NAME="name">  
  3.     年齡:<INPUT TYPE="text" NAME="age">  
  4.     <INPUT TYPE="submit">  
  5. </FORM>  
<FORM METHOD=POST ACTION="User/show">
	姓名:<INPUT TYPE="text" NAME="name">
	年齡:<INPUT TYPE="text" NAME="age">
	<INPUT TYPE="submit">
</FORM>


Java代碼 複製代碼
  1. @Controller  
  2. public class User {   
  3.     public void show(String name, int age) {   
  4.         ...   
  5.     }   
  6. }  
@Controller
public class User {
	public void show(String name, int age) {
		...
	}
}



文件上傳

Html代碼 複製代碼
  1. <FORM ENCTYPE="multipart/form-data" METHOD="POST" ACTION="FileUpload">  
  2.    文件1:<INPUT NAME="file1" TYPE="file"><br>  
  3. 說明 :<TEXTAREA NAME="description"></TEXTAREA><br>  
  4.    <INPUT TYPE="submit" VALUE="上傳">  
  5.    </FORM>  
	<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>


Java代碼 複製代碼
  1. import com.douyu.http.UploadedFile;   
  2.   
  3. @Controller  
  4. public class FileUpload {   
  5.     public void index(UploadedFile file1, String description) {   
  6.         File f = new File("D:/Douyu/temp/uploadedFiles", file1.getSimpleName());   
  7.         file1.saveTo(f);   
  8.     }   
  9. }  
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操作

Java代碼 複製代碼
  1. create table pet(   
  2.   id  int not null auto_increment,   
  3.   name varchar(50) not null,   
  4.   age int,   
  5.   primary key(id)   
  6. );  
create table pet(
  id  int not null auto_increment,
  name varchar(50) not null,
  age int,
  primary key(id)
);


Java代碼 複製代碼
  1. import com.douyu.main.Context;   
  2. import sql.table.mysql.Pet;   
  3.   
  4. @Controller  
  5. public class Crud {   
  6.     public void index(Context c) {   
  7.         Pet pet = new Pet();   
  8.         pet.name("pet1");   
  9.         pet.age(3);   
  10.         c.insert(pet);   
  11.   
  12.         pet.name("MyPet");   
  13.         c.update(pet);   
  14.   
  15.         c.delete(pet);   
  16.   
  17.         Rows<Pet> rows = new Rows<Pet>(Pet.class);   
  18.         rows.offset = 1;   
  19.         rows.limit = 100;   
  20.         c.select(rows);   
  21.         for(Pet p : rows.rowList) {   
  22.             ...   
  23.         }   
  24.     }   
  25. }  
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) {
			...
		}
	}
}




橫跨多個數據庫的事務

Java代碼 複製代碼
  1. import com.douyu.main.Context;   
  2. import my.table.oracle.Table1;   
  3. import my.table.mysql.Table2;   
  4.   
  5. @Controller  
  6. public class Transaction {   
  7.     public void index(Context c) {   
  8.         Table1 t1 = new Table1();   
  9.         t1.f1("1234");   
  10.         Table2 t2 = new Table2();   
  11.         t2.f2("1234");   
  12.   
  13.         c.beginTransaction();   
  14.   
  15.         c.insert(t1);   
  16.         c.insert(t2);   
  17.   
  18.         c.setSavepoint();    
  19.   
  20.         t2.f2("abcd");   
  21.         c.update(t2);   
  22.   
  23.         c.endTransaction();   
  24.     }   
  25. }  
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.javaeye.com/blog/517796

 

這篇文章是2009-11-15在JavaEye剛發佈的,詳細說明了Douyu的更種用法,
裏面也詳細說明了Douyu的很多設計理念以及我個人的很多研究心得。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章