今天沒有時間繼續撰寫關於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,其中還有一些功能,讀者如果感興趣可以看我的源碼,下載地址 點擊打開鏈接