1、搭建struts2環境html
一、jar包的導入前端
主要是到web
解壓其中的一個工程,獲得裏面lib下包含的jar包apache
把這裏的全部的jar包拷貝到項目的設計模式
WEB-INF目錄下的lib文件夾下面。數據結構
二、配置struts.xml文件app
注意:必需要放在src目錄下,由於struts2源碼就是這樣設計的,只有在src目錄下才讀取獲得。jsp
每個package都要extends=」struts-default」,namespace 是 訪問的路徑url
Action中的name和 package中的namespace組成完整的訪問路徑spa
三、配置web.xml
<filter>
<filter-name>action2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>action2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四、編寫的Action類都要繼承ActionSupport類或者implements Action接口
默認action類訪問的是裏面的execute方法
若是要訪問特定的方法,能夠這樣:
(1)在action 後面指定 method=「方法名」
(2)使用通配符 <action name=」example_*」 class=」com.XX.YY.ZZ」 method=」{1}」 />
(3)使用動態表達式 好比example!execute(不經常使用)
五、接收表單提交的數據
(1)屬性驅動獲取表單參數
--在action類中定義與表單的input中 name 同樣的屬性(必須同樣,不然注入不進去)
同時還要生產屬性對應的set 方法,由於 action類要調用set方法把表單中的參數注入到屬性中
(2)模型驅動獲取表單參數
--模型驅動首先action類要實現ModelDrivern,而後重寫getModel方法
--在action類中聲明並建立接收表單參數的實體類(Student user = new Student())
--原理分析:struts2調用action類的getModel方法,獲得user對象,而後利用user對象裏面的set屬性的方法,設置user對象的屬性值
--注意,表單的參數name必需要跟Student的屬性值一致,不然注入不進去。
(3)表達式驅動獲取表單數據
--表單提交的時候要註明是哪一個類的,好比user.name
--而後action類要生成user對象的get方法,可讓struts2獲取到action中user對象,而後調用user對象裏面的get set方法,把參數注入到user對象的屬性中去。
--表達式驅動的方式的好處是,表單能夠傳遞多個不一樣pojo的對象上來,好比不只能夠上傳user的,也能夠上傳book的。這樣,在表單中input中代表 name的時候,寫上 user.xxx book.xxx。
--表達式還支持 map 和 list 表單,能夠同時上傳多分同樣的參數(不經常使用)
Map[「one」].name -> getMap<String , Student>
List[0].name -> getList<Student>
下面的圖是參考這貨的
http://www.cnblogs.com/lolybj/tag/struts2/
六、把要顯示的數據傳給前端JSP頁面
原理是利用到struts2的值棧空間,每一次request請求,都會從新建立出一個action類出來,而後在執行action類的方法以前,要通過一系列攔截器的攔截,好比ModelDrivern過濾器進行表單參數的注入。放行後才執行action方法。
如下是action類在值棧中設置數據的三種方法:
一、執行action方法的時候,能夠獲取ValueStack,並向ValueStack中插入數據。
二、直接在action類中定義pojo類,並建立好實例,生成get方法,方便jsp那邊獲取。
三、直接在action類中定義list對象,並將pojo類存入到list對象中去。
設置完以後,就會跳轉到指定的jsp頁面。
在指定的jsp頁面中必須導入<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2的表達式,其實這個表達式底層調用的是ognl表達式,因此一開始的時候要導入ognl表達式的jar包。
Jsp中獲取值棧的數據。有3中方式
一、<s:property value=」插入值棧的變量名」/>
二、<s:iterator value=」list」 >
<s:property value=」user.username」/> //對象名稱.對象屬性
<s:property value=」user.password」/>
</s:iterator>
3、<s:iterator value=」list」 var=」user」>
<s:property value=」#user.username」/> //對象名稱.對象屬性
<s:property value=」#user.password」/>
</s:iterator>
第3種爲何要加#號,那是由於 iterator遍歷的時候,先把list中的元素對象先存儲到context的值棧空間裏,context值棧空間的數據結構是map 的。因此要提供user做爲鍵值,獲取到user對象,而後根據對象的get方法,獲得user的屬性值。
這裏要說明一下,action的值棧空間有兩部分組織,一部分是root空間,數據類型是list類型的;另外一部分是context空間,數據類型是map的。
七、最後是攔截器
攔截器和過濾器是不一樣的概念的東西;
過濾器:在容器上運行的,會過濾html、image... 網頁文件。理論上是過濾全部的網頁的
攔截器:只是攔截某一個action操做的
攔截器主要運用是 : AOP 和 責任鏈的設計模式。因此能夠作到在建立action類對象後,可是在執行action方法之間執行。