Struts2原理分析,自己實現一個struts2

今天沒有時間繼續撰寫關於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,其中還有一些功能,讀者如果感興趣可以看我的源碼,下載地址 點擊打開鏈接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章