Struts2学习总结(完整版)
一、搭建struts2環境
1、jar包的導入
主要是到
?
?
解壓其中的一個工程,得到里面lib下包含的jar包
?
?
?
?
把這里的所有的jar包拷貝到項目的
WEB-INF目錄下的lib文件夾下面。
?
2、配置struts.xml文件
注意:必須要放在src目錄下,因為struts2源碼就是這樣設計的,只有在src目錄下才讀取得到。
?
?
每一個package都要extends=”struts-default”,namespace 是 訪問的路徑
????
?
Action中的name和 package中的namespace組成完整的訪問路徑
?
3、配置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>
?
?
4、編寫的Action類都要繼承ActionSupport類或者implements Action接口
?
??默認action類訪問的是里面的execute方法
?
?
如果要訪問特定的方法,可以這樣:
(1)在action 后面指定 method=“方法名”
(2)使用通配符 ?<action name=”example_*”??class=”com.XX.YY.ZZ”?method=”{1}”?/>
(3)使用動態表達式 ?比如example!execute(不常用)
?
5、接收表單提交的數據
(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/
?
?
?
6、把要顯示的數據傳給前端JSP頁面
? 原理是利用到struts2的值棧空間,每一次request請求,都會重新創建出一個action類出來,然后在執行action類的方法之前,要經過一系列攔截器的攔截,比如ModelDrivern過濾器進行表單參數的注入。放行后才執行action方法。
以下是action類在值棧中設置數據的三種方法:
1、執行action方法的時候,可以獲取ValueStack,并向ValueStack中插入數據。
2、直接在action類中定義pojo類,并創建好實例,生成get方法,方便jsp那邊獲取。
3、直接在action類中定義list對象,并將pojo類存入到list對象中去。
設置完之后,就會跳轉到指定的jsp頁面。
在指定的jsp頁面中必須導入<%@?taglib?uri="/struts-tags"?prefix="s"?%>?
Struts2的表達式,其實這個表達式底層調用的是ognl表達式,所以一開始的時候要導入ognl表達式的jar包。
Jsp中獲取值棧的數據。有3中方式
1、<s:property value=”插入值棧的變量名”/>
2、<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的。
?
7、最后是攔截器
攔截器和過濾器是不同的概念的東西;
過濾器:在容器上運行的,會過濾html、image... 網頁文件。理論上是過濾所有的網頁的
攔截器:只是攔截某一個action操作的
?
攔截器主要運用是 : AOP 和 責任鏈的設計模式。所以可以做到在創建action類對象后,但是在執行action方法之間執行。
?
posted on 2017-03-17 14:57 臥似長劍 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/chencanjian/p/6566186.html
總結
以上是生活随笔為你收集整理的Struts2学习总结(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2清空所有表_拉链表(二)
- 下一篇: (HDU)1058 --Humble N