1. 程式人生 > >Struts2(二)

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中加入註解元素

這裡寫圖片描述