最初的版本抛弃了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-examplesWEB-INFsrc中找到这些例子)
Hello World
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>
4.5. 说明 :<TEXTAREA NAME=”description” ROWS=”5” COLS=”50”></TEXTAREA><br>
6.7. <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;
5.6. public void set(String name, Address address) { - this.name = name;
- this.address = address;
- }
- }
11.12. @Model - public class Address {
- private String country;
- private String city;
16.17. 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
5.6. //输出: - //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>
5.6. <BODY BGCOLOR=”white”> - name = ${name} <br>
- age = ${age} <br>
- date = ${date} <br>
- </BODY>
11.12. </HTML>
异步Action
Java代码
- @Controller
- public class AsyncTest {
- public void asyncAction(HttpServletRequest request) {
4.5. if (request.getAttribute(“async-result”) != null) { - doSomething();
7.8. request.getAsyncContext().complete(); - } else {
- AsyncContext actx = request.startAsync();
- actx.setTimeout(10000);
12.13. invokeLongTimeService(actx);
14.15. …. - }
- }
- }
最后,源代码在这,赶紧凑凑热闹吧:
svn checkout http://douyu.googlecode.com/svn/trunk/ douyu-read-only
本文来源于"阿里中间件团队播客",原文发表时间" 2011-07-06"