今天没有时间继续撰写关于osworkflow的源码剖析文章了,换一个思路,写一下struts2相关的东西,先来说说为什么要写这样的一个东西,公司有一套自主研发的云服务平台,CTO告诉我站在用户的角度,从头到尾部署自己的应用,让我写一个基于php的http应用和基于j2ee的http应用,php的昨天已经写完并且顺利部署,照常运行,今天本来要写java的,开始动手之前,我纠结一件事情,第一现在的java框架实在太多,直接套用又是一堆lib,但是回归jsp/servlet代码有比较笨重,索性为了考虑更好的验证我们的云平台,自己写一个mvc框架,完全模仿struts2编写了一个mvc框架,耗时6个小时,代码约2000来行,通过测试完全可用,做简单的小网站系统如果不管web设计,耗时很少,基于该框架的demo我只花了1个小时就写出来了(只是简单的CRUD操作)
为什么要写着一篇文章,因为通过这个mini版的struts2,你可以窥见struts2的冰山一角,因为有些思路是完全一样的,当然健壮性和强大和人家完全不在一个数量级别,但是你最起码可以知道一个mvc是如何走下来的,并且能看到一点struts2的影子,其实早在两年以前,我就在不断的阅读struts1源码的时候总结了很多零碎的札记,归纳起来也有几百页的4A纸,虽然他现在已经退出历史舞台,但是让java开发人员从jsp/servlet解放出来做了不可磨灭的贡献,其中的代码以及设计架构思想还是值得推敲与研磨,等有时间润色一下发布出来,言归正传,来说说今天的那个小程序吧。
优点:
1、基于拦截器
2、完全无servlet侵入
3、基于annotation,几乎0配置
4、内置7个类型转换器
5、自动整理收集表单数据
缺点:
1、不够健壮
2、核心类几乎没有设计感
3、没有Validate的设计
4、视图只能支持jsp,不能支持freemark,vm,tiles,sitemesh,pdf等
5、不支持上传。
6、不支持json/bson
很明显的看到缺点远远大于优点,但是通过阅读这个程序的源码最起码可以让不懂mvc的知道mvc,不敢尝试阅读struts2源码的可以尝试挑战struts2的源码,学习使用注解,熟练掌握反射等技术,如果您精于此道可以一笑了之,如果您觉得有点意思,可以看看,如果您疲于求学,希望能让您少走弯路,对我来说最重要的是分享,和享受分享带来的喜悦。
先来看看总体的结构图
来看一段Action的代码吧
package com.wangwenjun.action;
import com.wangwenjun.core.annotation.Action;
import com.wangwenjun.core.annotation.ForwardType;
import com.wangwenjun.core.annotation.Result;
/**
* This class is used for
*
*/
@Action(name = "test")
public class Login2Action
{
private String username;
private String password;
private String message="";
@Result(type = ForwardType.FORWARD, pageName = { "success", "failure" }, page = { "/WEB-INF/jsp/loginSuccess.jsp",
"/WEB-INF/jsp/main.jsp" })
public String execute()
{
if(username.equals("wangwenjun")&&password.equals("wangwenjun"))
{
this.message = "login success!";
return "success";
}
else
{
this.message="login failure!";
return "failure";
}
}
/**
* @return the username
*/
public String getUsername()
{
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username)
{
this.username = username;
}
/**
* @return the password
*/
public String getPassword()
{
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password)
{
this.password = password;
}
/**
* @return the message
*/
public String getMessage()
{
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message)
{
this.message = message;
}
}
基于注解,完全没有servlet的注入,就可以轻而易举的实现一个action,其中还有一些功能,读者如果感兴趣可以看我的源码,下载地址 点击打开链接