首页 > 系统应用 > Douyu 0.6.1发布了,这是一个超乎您想象的Web框架
2015
07-24

Douyu 0.6.1发布了,这是一个超乎您想象的Web框架

这段时间主要忙于工作了(从事分布式数据访问、存储以及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-examplesWEB-INFsrc中找到这些例子)

Hello World

Java代码

  1. @Controller
  2. public class HelloWorld {
  3. public void index(PrintWriter out) {
  4. out.println(“Hello Douyu World!”);
  5. }
  6. }

自动提取HTML表单参数:

Html代码

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

Java代码

  1. @Controller
  2. public class FormExample {
  3. public void save(String name, int age) {
  4. }
  5. }

文件上传

Html代码

  1. <FORM ENCTYPE=”multipart/form-data” METHOD=”POST” ACTION=”FileUpload.upload”>
  2. 文件1:<INPUT NAME=”file1″ TYPE=”file” size=”50″><br>
  3. 文件2:<INPUT NAME=”file2″ TYPE=”file” size=”50″><br>
  4. 说明 :<TEXTAREA NAME=”description” ROWS=”5″ COLS=”50″></TEXTAREA><br>
  5. <INPUT TYPE=”submit” VALUE=”上传”>
  6. </FORM>

Java代码

  1. @Controller
  2. public class FileUpload {
  3. public void upload(Part[] parts, Part part, String description) {
  4. part.write(…);
  5. }
  6. }

嵌套Model自动注入:

Java代码

  1. @Model
  2. public class Consumer {
  3. private String name;
  4. private Address address;
  5. public void set(String name, Address address) {
  6. this.name = name;
  7. this.address = address;
  8. }
  9. }
  10. @Model
  11. public class Address {
  12. private String country;
  13. private String city;
  14. public void set(String country, String city) {
  15. this.country = country;
  16. this.city = city;
  17. }
  18. }

Java代码

  1. @Controller
  2. public class ModelInjectExample {
  3. //通过这个url访问
  4. //ModelInjectExample?consumer.name=zhh&consumer.address.country=china&consumer.address.city=hangzhou
  5. //输出:
  6. //consumer=Consumer[name=zhh, address=Address[country=china, city=hangzhou]]
  7. public void index(Consumer consumer, PrintWriter out) {
  8. out.println(“consumer=” + consumer);
  9. }
  10. }

最炫的功能:

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

Java代码

  1. @Controller
  2. public class ViewManagerExample {
  3. public void soCool(ViewManager v, String name, int age) {
  4. Date date = new Date();
  5. v.out(“/jsp/ViewTest.jsp”);
  6. v.out(“/ViewTest.vm”);
  7. v.out(“/ViewTest.ftl”);
  8. }
  9. }

ViewTest.vm

Html代码

  1. <HTML>
  2. <HEAD>
  3. <TITLE>ViewManager Test</TITLE>
  4. </HEAD>
  5. <BODY BGCOLOR=”white”>
  6. name = ${name} <br>
  7. age = ${age} <br>
  8. date = ${date} <br>
  9. </BODY>
  10. </HTML>

异步Action

Java代码

  1. @Controller
  2. public class AsyncTest {
  3. public void asyncAction(HttpServletRequest request) {
  4. if (request.getAttribute(“async-result”) != null) {
  5. doSomething();
  6. request.getAsyncContext().complete();
  7. } else {
  8. AsyncContext actx = request.startAsync();
  9. actx.setTimeout(10000);
  10. invokeLongTimeService(actx);
  11. ….
  12. }
  13. }
  14. }

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

svn checkout http://douyu.googlecode.com/svn/trunk/ douyu-read-only

google code的svn不太稳定,时好时坏:

最后编辑:
作者:saunix
大型互联网公司linux系统运维攻城狮,专门担当消防员

留下一个回复