|
自从2009年11月份发布第一个原型版本后,(见这里)
时间一恍就过去了1年半,
这段时间主要忙于工作了(从事分布式数据访问、存储以及Web容器方面的工作),
所以douyu一直处于停滞状态,直到今年3月份开始才能将1/3的时间投入到上面。
最初的版本抛弃了Servlet/JSP规范,并且自已实现容器,这思路理论上是没有大的错的,
但是太新潮了,原有的技术积累不能充分使用,所以但凡追求稳定第一的产品都不敢贸然尝试。
因此,douyu的设计思路也跟着变了,努力的方向是:
尽量兼容现有技术、寻求一种更简单更有效的办法改进现有技术。
douyu 0.6.1往这个方向迈出了第一步,
第一步主要关注Web层的东西,不涉及持久层,douyu 0.6.1包含了如下亮点:
1. 兼容Servlet/JSP,使用douyu提供的api写出的程序能部署到Servlet容器上(例如Tomcat、Jetty)
2. 基于Javac编译器技术,实现零配置,无需打包、部署,无需重启Servlet容器,直接运行Java源文件。
3. 支持Velocity、FreeMaker,集成其他模板引擎也是非常简单,多种模板引擎可以在同一个应用中同时使用。
4. 学习成本非常低,目前只需要学习5个接口(不超过15个方法)。
5. douyu 0.6.1源代码不超过1500行,所以非常适合初学者入门,如果想达到另一个境界,可以继续看Javac编译器的代码。
Douyu项目主页目前放在:
http://code.google.com/p/douyu/
以下是例子:
(可以从发布包的douyu-examples\WEB-INF\src中找到这些例子)
Hello World
@Controller
public class HelloWorld {
public void index(PrintWriter out) {
out.println("Hello Douyu World!");
}
}
@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>
<FORM METHOD=POST ACTION="FormExample.save">
姓名:<INPUT TYPE="text" NAME="name" VALUE="haha">
年龄:<INPUT TYPE="text" NAME="age" VALUE="100">
<INPUT TYPE="submit">
</FORM>
@Controller
public class FormExample {
public void save(String name, int age) {
...
}
}
@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>
<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>
@Controller
public class FileUpload {
public void upload(Part[] parts, Part part, String description) {
part.write(...);
}
}
@Controller
public class FileUpload {
public void upload(Part[] parts, Part part, String description) {
part.write(...);
}
}
嵌套Model自动注入:
@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;
}
}
@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;
}
}
@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);
}
}
@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中的本地变量:
@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");
}
}
@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>
<HTML>
<HEAD>
<TITLE>ViewManager Test</TITLE>
</HEAD>
<BODY BGCOLOR="white">
name = ${name} <br>
age = ${age} <br>
date = ${date} <br>
</BODY>
</HTML>
异步Action
@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);
....
}
}
}
@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);
....
}
}
}
最后,源代码在这,赶紧凑凑热闹吧:
svn checkout http://douyu.googlecode.com/svn/trunk/ douyu-read-only
google code的svn不太稳定,时好时坏:
源代码压缩包: 点我
|
|