自从2009年11月份发布第一个原型版本后,(见这里)

时间一恍就过去了1年半,

这段时间主要忙于工作了(从事分布式数据访问、存储以及Web容器方面的工作),

所以douyu一直处于停滞状态,直到今年3月份开始才能将1/3的时间投入到上面。

最初的版本抛弃了Servlet/JSP规范,并且自已实现容器,这思路理论上是没有大的错的,

但是太新潮了,原有的技术积累不能充分使用,所以但凡追求稳定第一的产品都不敢贸然尝试。

因此,douyu的设计思路也跟着变了,努力的方向是:

尽量兼容现有技术、寻求一种更简单更有效的办法改进现有技术。

douyu0.6.1往这个方向迈出了第一步,

第一步主要关注Web层的东西,不涉及持久层,douyu0.6.1包含了如下亮点:

1.兼容Servlet/JSP,使用douyu提供的api写出的程序能部署到Servlet容器上(例如Tomcat、Jetty)

2.基于Javac编译器技术,实现零配置,无需打包、部署,无需重启Servlet容器,直接运行Java源文件。

3.支持Velocity、FreeMaker,集成其他模板引擎也是非常简单,多种模板引擎可以在同一个应用中同时使用。

4.学习成本非常低,目前只需要学习5个接口(不超过15个方法)。

5.douyu0.6.1源代码不超过1500行,所以非常适合初学者入门,如果想达到另一个境界,可以继续看Javac编译器的代码。

Douyu项目主页目前放在:

http://code.google.com/p/douyu/

以下是例子:

(可以从发布包的douyu-examplesWEB-INFsrc中找到这些例子)

HelloWorld

Java代码

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

自动提取HTML表单参数:

Html代码

<FORM METHOD=POST ACTION=”FormExample.save”>
姓名:<INPUT TYPE=”text” NAME=”name” VALUE=”haha”>
年龄:<INPUT TYPE=”text” NAME=”age” VALUE=”100″>
 <INPUT TYPE=”submit”>
</FORM>

Java代码

@Controller
public class FormExample {
 public void save(String name, int age) {
…
}
}

文件上传

Html代码

<FORM ENCTYPE=”multipart/form-data” METHOD=”POST” ACTION=”FileUpload.upload”>
文件1:<INPUT NAME=”file1″ TYPE=”file” size=”50″><br>
文件2:<INPUT NAME=”file2″ TYPE=”file” size=”50″><br>

说明 :<TEXTAREA NAME=”description” ROWS=”5″ COLS=”50″></TEXTAREA><br>

 <INPUT TYPE=”submit” VALUE=”上传”>
 </FORM>

Java代码

@Controller
public class FileUpload {
 public void upload(Part[] parts, Part part, String description) {
 part.write(…);
 }
}

嵌套Model自动注入:

Java代码

@Model
public class Consumer {
 private String name;
 private Address address;

 public void set(String name, Address address) {
 this.name = name;
 this.address = address;
 }
}

@Model
public class Address {
 private String country;
 private String city;

 public void set(String country, String city) {
 this.country = country;
 this.city = city;
 }
}

Java代码

@Controller
public class ModelInjectExample {
 //通过这个url访问
//ModelInjectExample?consumer.name=zhh&consumer.address.country=china&consumer.address.city=hangzhou

 //输出:
 //consumer=Consumer[name=zhh, address=Address[country=china, city=hangzhou]]
 public void index(Consumer consumer, PrintWriter out) {
 out.println(“consumer=” + consumer);
 }
}

最炫的功能:

可以在JSP、Velocity、FreeMaker中直接访问控制器Action中的本地变量:

Java代码

@Controller
public class ViewManagerExample {
 public void soCool(ViewManager v, String name, int age) {
 Date date = new Date();
 v.out(“/jsp/ViewTest.jsp”);
v.out(“/ViewTest.vm”);
v.out(“/ViewTest.ftl”);
 }
}

ViewTest.vm

Html代码

<HTML>
<HEAD>
<TITLE>ViewManager Test</TITLE>
</HEAD>

<BODY BGCOLOR=”white”>
name = ${name} <br>
age = ${age} <br>
date = ${date} <br>
</BODY>

</HTML>

异步Action

Java代码

@Controller
public class AsyncTest {
 public void asyncAction(HttpServletRequest request) {

 if (request.getAttribute(“async-result”) != null) {
 doSomething();

 request.getAsyncContext().complete();
 } else {
 AsyncContext actx = request.startAsync();
 actx.setTimeout(10000);

 invokeLongTimeService(actx);

….
 }
 }
}

最后,源代码在这,赶紧凑凑热闹吧:

svncheckouthttp://douyu.googlecode.com/svn/trunk/douyu-read-only

googlecode的svn不太稳定,时好时坏:

源代码压缩包:点我