自从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中找到这些例子)
HelloWorldJava代码
@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不太稳定,时好时坏:
源代码压缩包:点我