從Struts2的發展過程來看,Struts2繼承了Struts與WebWork的血脈,Struts2取兩者之精華,形成新德框架,但是struts2還是更多的繼承了struts的設計思想,並加入了WebWork的優點。在了解Struts2體系之前,讓我們先看看struts2對struts做了哪些修改。
Struts2與struts的不同主要體現在以下幾個方面。
(1) Action類
1》在struts中都是使用抽象類編程而不是接口,因此他要求開發Action類繼承壹個抽象的基類,如DispatchAction等。
2》Struts2則基於接口編程,我們的Action類可以實現壹個Action接口,使可選和定制的服務成為可能。Struts2提供壹個ActionSupport基類去實現常用的接口。更加強大的是,在struts2中Action接口不是必需的,任何有execute()函數的pojo對象都可以用作struts2的Action類來使用。
(2) 線程模式
1》 struts的Action是單例模式並且必須是線程安全的,因為僅有Action的壹個實例來處理所有的請求。單列策略限制了struts Action能做的事,並且要在開發時特別小心,Action資源必須是線程安全的或同步的;
2》 struts2的Action對象為每壹個請求產生壹個實例,因此沒有線程安全問題。
(3) Servlet依賴
1》 struts的Action依賴於Servlet API,當壹個Action被調用時,HttpServletRequest和HttpServletResponse被傳遞給執行方法,例如:
publicActionForward execute(Actionmapping mapping,ActionForm Form,HttpServletRequestrequest,HttpServletResponse response){
}
2》 struts2的Action不依賴與容器,允許Action脫離容器單獨被測試。如果需要,Struts2的Action任然可以訪問初始的request和response。例如下面的這個類MyAction.Java,他可以通過ActionContext對象取得Session值,也可以通過ServletActionContext對象取得request對象。
Publicclass MyAction{
protected Object getSession(String key){
return ActionContext.getContext().getSession(key);
}
protectedHttpServletRequest getRequest(){
return(String)ServletActionContext.getRequest();
}
}