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!");
- }
- }
@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>
<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) {
- ...
- }
- }
@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>
<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);
- }
- }
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)
- );
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 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();
- }
- }
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的很多設計理念以及我個人的很多研究心得。