【Java】Struts2筆記I
目錄
1.Struts2執行過程
2.核心配置檔案struts.xml標籤以及屬性
<struts> <package name="hellodemo" extends="struts-defalut" namespace="/"> <action name="hello" class="com.action.Action"> <result name="ok">/hell.jsp</result> </action> </package> </struts>
constant
用於修改常量
name:struts.i18n.encoding
value:UTF-8
還有兩種方式(瞭解)
- 在src下面建立 struts.properties,進行修改
- 在web.xml進行配置
package
package裡面才能配置action
name:只是為了區分不同package,和功能本身沒有關係
extends:屬性值固定->struts-defalut,寫了這個屬性之後package才具有action功能
namespace:要和action標籤裡面的name屬性值構成訪問路徑 比如 /(namespace) + hello(action) 不過預設為/
action
配置action的訪問路徑,指定通過什麼路徑來訪問哪個類
可以有多個action但是name不能相同
name:和namespace構成訪問路徑
class:要訪問的那個類的全路徑
method:action預設執行execute方法,但可以用method來讓action的多個方法執行
result
根據呼叫action的class指定的類的方法返回值 配置到不同的路徑(頁面)中去
name:同方法的返回值
type:配置如何到路徑(轉發or重定向)
預設為轉發(dispatcher),重定向(redirect)
-chain:轉發到action,一般不用,有快取問題
-redirectAction:重定向到action
3.action方法訪問的三種方式
3.1 用action標籤的method屬性值指定方法
沒有指定method的話 則執行execute()方法
3.2 萬用字元方式實現
{1}代表第一個* 比如訪問book_add.action,此時{1}就代表add
可以有多個*
3.3 動態訪問實現(不用)
4.結果頁面配置
4.1全域性結果頁面配置
如果多個action,返回值是相同的,指向的頁面也是相同的(多行相同的<result></result>)
在<package>標籤裡面配置
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
配置完之後就不用寫result了 對當前package內所有action(全域性)生效
4.2區域性結果頁面
就是一般地用<result>標籤(一個action對應一個result)
5.獲取表單提交資料
5.1原始方式request
5.1.1ActionContext類
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();
5.1.2ServletActionContext類
HttpServletRequest request = ServletActionContext.getRequst();
String username = request.getParameter("username");
5.1.3介面注入(一般不用)
讓action實現介面-->為了得到request物件
ServletRequestAware介面
5.2 Struts封裝方法
5.2.1屬性封裝(繼承ActionSupport)
步驟:
1)將表單會提交的資料,定義在action裡面
-變數名稱和表單輸入項的name屬性值一樣
2)生成變數的set方法(get/set)
原理:內省
缺點:不能把資料直接封裝到實體類的物件
5.2.2模型驅動封裝(重點)
步驟:
1)action實現介面ModelDriven
2)實現介面方法getModel -將建立物件返回 (也需要變數名稱和表單輸入項的name一樣)
3)在action裡面建立實體類物件
5.2.3表示式封裝
步驟:
1)宣告實體類
2)生成實體類變數的set和get方法
3)表單輸入想的name屬性值用表示式形式(eg: name="user.username")
6.值棧
6.0如何得到值棧
actionContext.getValueStack()
6.1什麼是值棧
值棧:Struts2裡面自己的儲存機制(類似於web中的request域)
每次訪問action都會建立action物件,每個action物件都會有且只有一個值棧物件
6.2值棧的內部結構
主要的兩部分:root和context
6.2.1 root (list集合)
操作的是root裡面的資料
6.2.2 context (map集合)
value中儲存的是物件的引用
6.3三種方式向值棧中存取資料
6.3.1 set方法
stack.set("username", "hello");
少:在jsp中用<s:property value="username"/>可以獲取"hello"
6.3.2 push方法
stack.push("hello");
少:<s:property value="[0].top"/> 取到棧頂的值
6.3.3 在action中定義變數,生成變數的get方法(常用)
eg:①定義一個變數name,設定對應的②get方法,在action中③賦值name="abcdefgh";
優點:直接在action中儲存資料,不會造成儲存空間的浪費
6.4 從值棧中取list集合
6.4.1
6.4.2 遍歷list集合
6.4.3 遍歷list集合
注意:遍歷list出來的user物件是放到context裡面的!!
EL表示式也可以取到值棧資料
原因:
底層增強request物件裡面的方法getAttribute方法
1)先從request域獲取值,如果獲取到就直接返回
2)如果獲取不到值,就從值棧中把值獲取再存到域物件裡面
6.5 用OGNL操作值棧
作用:和Struts標籤一起使用來操作值棧
6.5.1 #的使用
6.5.2 %的使用
在struts2標籤裡面使用ognl表示式,如果直接在struts2表單標籤裡面使用ognl表示式不識別,只有%之後才會識別。
7.攔截器(interceptor)
*位置
struts2-core-xxxx.jar內的struts-default.xml中
*執行時間
action物件建立之後,action方法執行之前
*底層原理
1)aop思想
不修改原始碼(不是通過呼叫攔截器的方法)
而是通過配置檔案,來建立和攔截器的關係
2)責任鏈模式
java中的設計模式之一,和過濾鏈相似
過濾鏈:一個請求有可以有多個過濾器進行過濾,而只有過濾器進行放行之後才能進行下一個過濾器
責任鏈中就是進行 不是過濾的操作 但之後要放行 才能向下執行
*執行原理
主刀醫生 -- 遞工具的護士
*和過濾器區別
1)過濾器:過濾器理論上可以過濾任何內容,html、jsp、servlet、圖片路徑
2)攔截器:攔截器只可以攔截action
*Servlet和action區別
1)Servlet預設第一次訪問的時候建立,建立一次,單例項物件
2)action每次訪問時建立,建立多次,多例項物件
*自定義攔截器功能
1)建立類,繼承MethodFilterInterceptor類(好處:可以讓某個方法不進行攔截)
2)重寫裡面的方法,攔截器的邏輯,(放行 return invocation.invoke())
3)配置action和攔截器的關係(註冊攔截器)
>>>在攔截的action的package宣告攔截器<interceptors>...</interceptors>
>>>在具體的action裡面使用攔截器 <interceptor-ref name=""></interceptor-ref>
>>>配置了自定義攔截器之後,預設的攔截器就不會執行了,所以要再手動使用預設攔截器<interceptor-stack name="defaultStack"></interceptor-stack>
4)配置不需要攔截的方法:在interceptor-ref標籤中<param name="excludeMethods">方法名</param>
8.Struts2的標籤庫
常用標籤
s:property:和ognl表示式在jsp頁面獲取值棧資料
s:iterator:獲取值棧list集合資料,表示list集合
s:debug:檢視值棧結構和資料