Struts2(二)
ContextMap(值棧)與OGNL表示式
- OGNL基本語法
OGNL—強大的表示式語言,類似於jsp中的el表示式,可以存取物件的任意屬性,呼叫物件的 方法,實現欄位型別的轉換
OGNL表示式的特點:
1)是一門功能強大的表示式語言,可以存取物件的屬性,呼叫物件的方法
2)OGNL是struts2預設支援的語言
3)在Struts2的程式中,必須使用struts2標籤來使用OGNL表示式
在Struts2中使用OGNL表示式:
1)先匯入Struts2標籤:
2)編寫OGNL表示式
OGNL表示式的語法是:%{OGNL表示式}
EL表示式:${name},到四個域的範圍內查詢name資料
OGNL表示式到哪裡找資料?
答案:OGNL表示式是到OGNLContext找資料(OGNL上下文,其實就是ContextMap)
OGNL表示式簡寫方式:OGNL表示式
OGNL表示式表示字串:單引號 ‘OGNL表示式’
OGNL表示式呼叫物件的成員方法:
OGNL表示式呼叫類的靜態屬性:
呼叫類的靜態屬性:@限定名的類@靜態屬性
OGNL表示式呼叫類的靜態方法:
呼叫類的靜態方法:@限定名的類@靜態方法
注意事項:Struts2預設是沒有開啟類的靜態方法呼叫
如果需要使用,那麼需要通過常量開啟類的靜態方法呼叫
default.properties中:strutsognl.allowStaticMethodAccess=false
在Struts.xml中開啟
案例:
語法5:OGNL可以建立List集合(開發中常用)
{‘元素1’,’元素2’}
{‘元素1’,’元素2’}這個語法的底層:
List list = new ArrayList();
list.add(“男”);
list.add(“女”);
語法6:OGNL表示式建立Map集合:#{key:value,key:value}
key和value值不同的情況
複選框:多個可選擇
EL表示式只能獲取物件的屬性,不能建立物件,但是OGNL可以
- ContextMap資料結構
OGNLContext(OGNL上下文物件)就是一個Map集合,稱為ContextMap集合。這個ContextMap的作用,就是使用者和Struts2進行資料交換(傳輸)
ContextMap物件:封裝使用者的請求相關的資料;可以把後臺查詢的資料儲存到ContextMap中
ContextMap代替了域物件那些,比域物件功能更強大
- ActionContext工具類的使用
這個ActionContext是個工具類,用於操作ContextMap的工具類,這個物件裡面提供了許多關於存取ContextMap物件資料的
ActionContext:
構造方法:
傳入一個ContextMap;
裡邊有put、get、getSession方法等
通過對ActionContext底層原始碼的分析,ActionContext物件需要ContextMap來構建,構建完成之後,提供了一些put和get方法來操作ContextMap
- *ContextMap和ActionContext原始碼分析
通過核心過濾器找到
StrutsPrepareAndExecuteFileter
doFilter方法:
每一次請求發出都會走邏輯
ActionContext是執行緒安全的,每一次請求都是一個執行緒,得采用不同的物件去儲存
如何保證ActionContext的執行緒安全性:
採用ThreadLocal來保證
ActionContext是執行緒安全的
建立新的ActionContext物件
整體結構:
- ContextMap操作資料(存取資料———重點)
新建Action,繼承ActionSupport
在execute中寫入
public String execute() throws Exception {
//儲存資料ContextMap物件中
//1.往ContextMap(大Map)儲存資料
ActionContext ac = ActionContext.getContext();//從當前執行緒1.拿到當前執行緒的Context物件
ac.put("contextMap","這是ComtextMap的資料");
/2./往RequestMap儲存資料
HttpServletRequest request = (HttpServletRequest)ac.get(StrutsStatics.HTTP_QEQUEST);
request.setAttribute("RequestMap","requestMap的資料");
//3.往SessionMap中儲存資料
ac.getSession.put("seesionMap","sessionMap的資料");
//4.往application儲存資料
ac.getApplication().put("applicationMap","applicationMap");
}
s:debug標籤可以用來除錯contextMap中的資料
<s:debug/>
在Action中儲存資料,獲取資料,是在頁面上獲取(引入Struts2標籤來獲取)
valueStack(值棧)
ValueStack是一個介面,這個介面的實現類是OgnlValueStack,這個是實現類裡面的root變數才是真正存放資料的地方,本質是一個CopyOnWriteList ,root是一個list集合,但是這個存放資料的方式類似於棧,模擬棧的結構
CompoundRoot物件裡面有三種方法,這三個方法就是操作值棧物件的核心方法:
push核心方法,往list集合裡面新增資料,永遠往第一個位置放入,模擬進棧方法,新新增元素一直在棧頂
push():這個方法把物件放入到值棧的棧頂元素
pop():這個方法取出值棧的棧頂元素(移除)
peek():獲取到值棧的棧頂元素
ValueStack存取資料
1.在Action往值棧儲存資料
ActionContext ac = ActionContext.getContext();
ValueStack avs = ac.getValueStack();
vs.push(“小草”);
2.在頁面上獲取值棧資料
值棧的訪問不需要帶#標籤:[0]:代表獲取值棧中的第一個元素往後為止
規則:獲取值棧的規則:預設情況,都是從棧頂元素往後查詢,一直查詢到最後一個元素為止
[0].top:代表第一個元素
[1].top:代表第二個元素
[0].top可以省略,代表只找第一個元素
值棧的訪問不需要加#號
ContextMap訪問需要帶#號
- Struts2開發常用功能
Struts2表單驗證–方法驗證
Struts2的表單驗證屬於後臺驗證
在實際的專案中有必要做前臺驗證和後臺驗證,因為安全方面,可以繞過前端機制
方法(程式碼驗證):
Action本身已經實現了Validateable介面
覆蓋validate()方法:–可以進行方法驗證:
配置input檢視,當驗證失敗後struts2自動跳轉到input檢視
在頁面上顯示錯誤資訊
XML驗證
提供一個xml驗證檔案:
在Action下邊寫一個xml:Demo1Action-validation.xml
在strutscore下邊有關於volidate的約束:
參考驗證型別:
xml檔案內容:
- Strust2檔案上傳下載
檔案上傳–底層原理是通過FileUploadInterceptor攔截器實現的
修改form表單的enctype屬性
在Action接受檔案和引數
注意必須有檔案內容,檔名稱和檔案型別,字首icon必須一致,後邊是固定的
上傳內容不能大於2m的檔案,如果需要修改限制,則需要改變常量配置在struts.xml中,這個是在default.properties中配置的:
檔案下載:
Struts2是依靠一個stream的檢視進行檔案下載
編寫一個Action
配置Action:
- Token令牌機制防重複提交
Struts設計了令牌的機制TokenInterceptor攔截器完成
1.在表單攜帶一個隱藏域:
每次生成一個隨機數,攔截器會判斷生成的隨機數和儲存的隨機數是否一致
TokenInterceptor攔截器預設沒有生效
預設攔截器棧中並沒有
攔截器會生效—–
可以指定當重複提交時跳轉的頁面
- 使用Struts2註解開發
在Struts2裡面是 完全可以通過註解開發的,代替xml配置的方式,強調”零配置“
註解需要引入新的包–註解包–外掛包
可能需要asm的一些依賴包
註解的作用是代替xml配置檔案
刪除struts.xml
Action所在的包必須以這些結尾,掃描
在Action中加入註解元素