Struts2框架基本概述及詳細配置(一)

簡介

又拾起天天寫博客的習慣了,以前一致忙於學後面的框架技術,因此在過年這段時間暫時更新博客了。如今又進入學習狀態,因此仍是堅持天天寫博客和課上學習的保持一致。接下來暫時告別Web開發,進入框架技術學習。過年這段時間接觸了一些,因此如今學起來仍是駕輕就熟的。期待接下來的學習,把本身的能力提高起來,fighting~~html

 

理解Struts框架-簡單自定義框架

自定義框架:主要掌握的知識(反射,經常使用數據結構與算法,設計模式)
MVC開發模式  (Controller前期項目是最複雜的地方)
Controller:  Servlet(控制器  if--else if---else if---else)
	*Servlet是能夠直接訪問的
Filter(過濾器也能夠做爲一個控制器)
	*Filter不能直接訪問,/*表明這個FIlter可以過濾器全部用戶請求

Struts1--------------->Struts2發展歷程中,就是一個由控制器(Servlet------>Filter)
總結:
	使用自定義框架後,進行開發,程序員關注什麼?
	view本身寫
	控制器的Filter不用寫  ,只關注業務控制器Action的實現類
	Model:自已寫
 

Struts2概述及做用

一、是什麼?
	Struts2是一個M(模型---域--範圍模型)V(View視圖)C(控制器)框架(模型2)。框架都是一個半成品。提升開發效率。
	Struts1是一個MVC框架,很是流行。有很大的缺點。此時一個webwork的框架設計超前,名氣不是很大。Struts1+webworkd=struts2。用的是struts1的名字,可是與sruts1沒啥關係,struts2的核心是webwork框架。
二、能幹什麼?
	web開發主要乾的工做:
	獲取請求參數
	封裝到JavaBean
	驗證和轉換
	調用業務代碼存數據
	轉向某個頁面展現結果
	表現層的開發技術

 

搭建Struts2開發環境

目錄結構:
	a). apps:框架自己提供一些案例(學習)
	b). docs:框架自己提供的文檔(指南和API)。不保證100%正確
	c). lib:框架須要的jar包及第三方的jar包(不要全拷貝)
	d). src:源碼
Sturts2包介紹
	struts2-core-2.3.1.1.jar:Struts 2框架的核心類庫
	xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基於xwork 
	ognl-3.0.3.jar:對象圖導航語言(Object Graph Navigation Language), struts2框架經過其讀寫對象的屬性
	reemarker-2.3.18.jar:Struts 2的UI標籤的模板使用FreeMarker編寫
	commons-logging-1.1.x.jar:ASF出品的日誌包,Struts 2框架使用這個日誌包來支持Log4J和JDK 1.4+的日誌記錄。
	commons-fileupload-1.2.2.jar: 文件上傳組件,2.1.6版本後須要加入此文件
	commons-io-2.0.1.jar:傳文件依賴的jar包
	commons-lang-2.5.jar:對java.lang包的加強	StringUtils.isEmpty(str)
	javassist-3.11.0.GA.jar:動態代理的開發包

搭建步驟
	1. 新建一個JavaWeb工程
	2. 拷貝struts2運行所需的必要jar包。(方便辦法:struts2發行包\apps\struts-blank.war,拷貝其中的lib下的全部jar)
	3. 在web.xml中配置核心過濾器:StrutsPrepareAndExcuteFilter(框架提供)
	4. 在WEB-INF\classes目錄下創建一個名稱爲struts.xml的配置文件。內容以下:(能夠從struts2髮型包\apps\struts-blank.war中拷貝
	5. 把應用部署到Tomcat中,啓動Tomcat,若是沒有報錯,說明搭建成功

 

執行過程和原理

wps74A9.tmp

一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin);
三、接着StrutsPrepareAndExecuteFilter被調用,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否須要調用某個Action;
四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類;
六、ActionProxy建立一個ActionInvocation的實例。
七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用

配置struts.xml 提示問題

1. 若是安裝Aptana編輯器 ,請不要用Aptana自帶xml編輯器 編寫struts2配置文件 
struts.xml提示來自於 DTD約束, 
若是能夠上網,自動緩存dtd,提供提示功能
若是不能上網,也能夠配置本地DTD提示\struts-2.3.20-all\struts-2.3.20\src\core\src\main\resources 
*** 導入DTD時,應該和配置DTD版本一致
2. struts2提示問題
	Preference中輸入xml,查找Catalog,添加URI

 

Struts2的配置文件的位置和加載順序

struts2 配置文件 由核心控制器加載 StrutsPrepareAndExecuteFilter  (預處理init(),執行過濾) 
	init_DefaultProperties(); // [1]   ----------  org/apache/struts2/default.properties 
	init_TraditionalXmlConfigurations(); // [2]  --- struts-default.xml,struts-plugin.xml,struts.xml
	init_LegacyStrutsProperties(); // [3] --- 自定義struts.properties 
	init_CustomConfigurationProviders(); // [5]  ----- 自定義配置提供
	init_FilterInitParameters() ; // [6] ----- web.xml 
	init_AliasStandardObjects() ; // [7] ---- Bean加載 

結論:
1、default.properties:在struts2-core-**.jar包中的org.pache.struts2.default.properties中(框架自己用的)
2、struts-default.xml:在struts2-core-**.jar包中(框架自己用的)
3、struts-plugin.xml:在struts2-**-plugin.jar包中(插件中,給插件用的)
4、struts.xml:在你應用的構建路徑中(程序員進行配置的地方。推薦)
5、struts.properties:在你應用的構建路徑中(程序員進行配置的地方)
6、web.xml:此處也能夠對struts2框架進行配置(不建議。只建議配置過濾器)

* 後加載文件中struts2 常量會覆蓋以前加載文件 常量內容 
   顯示struts.action.extension在struts.xml中的取值 ,和web.xml中的取值

 

struts.xml中的常量配置

經常使用常量
truts.action.extension=action,,  框架要處理的後綴名稱。
struts.devMode = true 開發着模式。實際運行時建議爲false
struts.i18n.encoding=UTF-8 框架默認使用的編碼。請求參數和輸入響應
struts.serve.static.browserCache=true 靜態資源要不要緩存。

其餘常量
(response.setHeader():Expires;Cache-Control;Progma)
struts.ui.theme=xhtml 和顯示結果有關,顯示用的主題。simple等
struts.objectFactory = spring 指定實例化動做類的工廠(和Spring集成時用)
struts.enable.DynamicMethodInvocation = false 是否容許動態方法調用
struts.multipart.maxSize=2097152 文件上傳時的大小限制

struts.xml動做類Action 相關配置

動做類的定義:
方式一:就是一個普通的POJO。不須要繼承或實現任何的類或接口。
方式二:實現com.opensymphony.xwork2.Action
	該接口中定義了幾個常量:
	String SUCCESS = "success";//執行成功時用
	String NONE = "none";//執行成功後,不轉向任何的視圖。好比文件下載。
	String ERROR = "error";//執行失敗,遇到錯誤。
	String INPUT = "input";//輸入驗證失敗或轉換失敗,轉向輸入原有頁面。
	String LOGIN = "login";//沒有登陸時,轉向的頁面。
	public String execute() throws Exception;
	優勢:可使用常量,編碼能夠作到儘可能統一。
方式三:(推薦)
	繼承com.opensymphony.xwork2.ActionSupport(默認的動做類)


# 動做類的生命週期
	動做類每次訪問都會從新被實例化,是線程安全的
# 動做方法:動做類中的定義的處理業務有關的方法
	特色(重要):public
 	返回值類型是String
 	方法沒有任何的參數
# 動做方法通配符的匹配 *_* class="**.{1}" method="{2}"
# 動做方法的動態調用
	開啓動態常量struts.enable.DynamicMethodInvocation = true
	在action的訪問路徑 中 使用 "!方法名"

 

 

Action中使用Servlet API

一、 在Action 中解耦合方式 間接訪問 Servlet API  --------- 使用 ActionContext 對象
在struts2 中 Action API 已經與 Servlet API 解耦合 (沒有依賴關係 )
* Servlet API 常見操做 : 表單提交請求參數獲取,向request、session、application三個範圍存取數據 
	actionContext = ActionContext.getContext();
	
	*本質分析是否存在線程安全問題? 不會有 答案原碼:ActionContext  (使用ThreadLocal存儲相關的值)

二、 使用接口注入的方式,操做Servlet API (耦合)
	ServletContextAware : 注入ServletContext對象
	ServletRequestAware :注入 request對象
	ServletResponseAware : 注入response對象
* 程序要使用哪一個Servlet的對象,實現對應接口 
*本質分析 <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

三、 在Action中直接經過 ServletActionContext 得到Servlet API(推薦)
	ServletActionContext.getRequest() : 得到request對象 (session)
	ServletActionContext.getResponse() : 得到response 對象
	ServletActionContext.getServletContext() : 得到ServletContext對象 
	* 靜態方法沒有線程問題,ThreadLocal

 

結果頁面的配置

Action處理請求後, 返回字符串(邏輯視圖名), 須要在struts.xml 提供 <result>元素定義結果頁面 
一、 局部結果頁面 和 全局結果頁面 
<action name="result" class="cn.itcast.struts2.demo6.ResultAction">
  			<!-- 局部結果  當前Action使用 -->
 			<result name="success">/demo6/result.jsp</result> 
</action>
 
<global-results>
			<!-- 全局結果 當前包中 全部Action均可以用-->
			<result name="success">/demo6/result.jsp</result>
</global-results>

二、 結果頁面跳轉類型 
	* 在struts-default.xml 定義了 一些結果頁面類型 
	* 使用默認type 是 dispatcher 轉發 (request.getRequestDispatcher.forward)
	1)  dispatcher :Action 轉發給 JSP
	2)  chain :Action調用另外一個Action (同一次請求)
	3) redirect : Action重定向到 JSP
	4) redirectAction :Action重定向到另外一個Action 

 

基於註解的struts2 開發

註解開發第一步 基於約定的自動掃描 

約定只解決Action訪問和結果頁面跳轉問題 
* 在開發中須要爲Action指定攔截器,進行更細節result配置 
* 約定不夠靈活,註解的功能 是和 xml配置方式 等價的 

使用 @Action註解配置訪問路徑  @Result註解 配置結果頁面 

<constant name="struts.convention.classes.reload" value="false" /> Action類文件從新自動加載

@ParentPackage 配置<package> extends 繼承哪一個包
@Namespace  配置包名稱空間 必須以/開頭的命名空間
       例如:
       @Namespace("/employee")
	@ParentPackage("struts-default")
	public class HelloAnn extends ActionSupport {

		@Actions(value={@Action(value="myAnn1",results=@Result(name="success",location="/02ann.jsp")),
				@Action(value="helloAnn1",results=@Result(name="success",location="/02ann.jsp"))		
		})
		public String add() throws Exception {
			System.out.println("HelloAnn--------->add()執行了");
			return SUCCESS;
		}
	}
相關文章
相關標籤/搜索