Struts2學習筆記三 深入Action

2021-09-08 04:36:49 字數 4346 閱讀 9134

一:action中獲取引數值

在servlet中,我們通過doget()/dopost()方法中的引數,獲取request/response物件,然後提取引數值;

處理請求結束後,有資料需要攜帶返回客戶端時,servlet中是通過request.setattribute()的方式攜帶屬性值返回客戶端。

而在action中,提供了三種方式獲取引數、返回結果:

1:action全域性變數法

在action中定義一系列全域性變數,以及它們的getter/setter方法。則在請求分發到action時,會自動提取request中的同名引數值,注入到action例項的全域性變數中。

action返回result時,structs2預設全域性變數值都內建到了request中了,只需**request到結果頁面,在結果頁面通過el表示式,根據引數名獲取值即可。

2:物件導向思想接收引數(用此方法則不能用法一

如果action需要接收的引數比較多時,需要借助mvc架構中的vo物件思想。

此時,我們可以定義乙個實體類 xxvo,實體類中定義一系列屬性,對應客戶端需要傳遞過來的值,並定義每個屬性的getter/setter方法。

然後,在action中,我們只需引入乙個xxvo的成員變數並定義其setter、getter方法即可,然後在action中通過 vo.getxx() 使用引數。

最後,我們在頁面端通過 引數名 來為vo物件的屬性進行賦值:如:

在接收到請求後,structs2會自動根據引數名,建立乙個vo物件呼叫setter方法把屬性值賦值,然後把vo物件注入到action中。

返回結果資料同法1,此action中的屬性變數均可以在頁面端以el表示式獲取。

3:優化法2——實現modeldriven介面

法2中,頁面端引數名需要使用 vo物件名.屬性名  的格式,這樣如果action中的vo物件名改變的話,頁面端引數名都需要更改,比較麻煩。法3可以解決這個問題。

定義action時,實現modeldriven介面;

宣告並通過new vo()例項化vo成員變數;//注意:這裡是使用new例項化變數,不是注入。

最後,在頁面端,引數名只需與vo類中的屬性名相同即可,無需指明是action中哪個vo物件的哪個屬性。

頁面端的引數,可以通過 運算子、 點運算子進行複雜的引數賦值,如:為action中的list物件的元素賦值,可以:name="list[i].vo.屬性名" 這樣賦值。

三:action命名空間影響action的搜尋

客戶端請求action的url的格式為:web專案url+命名空間+action名

命名空間是為了模組化地管理action而配置的package屬性,提供精準的action匹配,所以客戶端應該嚴格按照正確的路徑來編寫url。

四:配置action的動態方法呼叫——萬用字元法

通常,我們把action作為模組的單位,即:乙個模組的所有請求處理都在乙個action中處理,如:登入模組的相關請求都在loginaciton中定義方法來處理。但是,我們在配置action時,預設是執行action的execute()方法,如果需要呼叫其他方法,則需要為每種情況配置乙個action標籤,十分麻煩。

structs2提供了一種萬用字元的方法,根據客戶端傳過來的url內容,動態地匹配具體的action、具體的方法。

action標籤的name屬性:採用 * 代替具體內容,採用 _ 作為間隔。

url的拼寫:用 _ 作為間隔,指明具體的url。

在class屬性值、method屬性值、標籤內容等地方:採用 獲取name屬性值中 第幾個* 的值作為具體值,動態匹配具體的action、方法、以及頁面響應。

五:預設action  

當使用者輸入了非法的url時,由於服務端沒有對應的資源可以響應,就會返回404錯誤或者跳轉到報錯頁面,這樣使用者體驗是非常差的。因此,我們可以定義乙個action,預設返回乙個友好的error提示頁面。然後在structs.xml中配置預設action,引用該錯誤提示action進行返回。

六:字尾配置

structs預設使用action處理請求,action的是 .action 字尾的檔案,因此可以不寫字尾編寫url。如果需要使用其他字尾,如:.do、.html、.jsp等(注:這裡是指使用這些字尾,而非真正的使用這些型別的檔案。如:處理登入頁面的loginaction類,配置擴充套件字尾 .jsp,則核心控制器獲取到請求後如果是loginaction.jsp則仍然是把請求分發給loginaction而不是login頁面)

<

constant

name

="struts.action.extension"

value

="action,do,..."

/>

七:action結果響應

1:結果集

action預設封裝了一些字串常量,表示某種結果型別。structs2根據結果字串進行不同的響應,這些都是通過標籤來配置的。

預設結果是success,當action返回結果是success字串時,重定向到標籤間頁面。

我們可以通過name屬性值,配置不同返回結果的響應內容:

除此之外,我們也可以返回自定義的字串,只需配置好name屬性為返回結果字串的result標籤即可。

2:返回結果——input

上面5個返回值中,input比較特殊,它是structs提供給我們的禮物之一——input結果值表示自動返回前乙個接收輸入的頁面,並保留了原先接收到的輸入內容。

比如:登入頁面接收username和password,傳遞給loginaction;若發現密碼錯誤,需要返回登入頁面時,action返回input結果,則structs2自動跳轉到login頁面,並保留原來輸入的username和password內容在輸入框內。

這樣做的好處是,當某一些需要接收很多輸入的頁面(如:註冊)傳遞過來的引數有少數沒通過驗證時,使用者無需重複進行大量輸入,只需修改部分不符合要求的輸入即可。

有兩種方法使用input:

1)在action的普通方法中,如果驗證不通過,則顯式 return input;

2)重寫validate()方法,如果驗證不通過,則新增錯誤資訊(見下面第八點);在方法結束前,會自動檢查錯誤資訊map,如果不為空則說明驗證不通過,自動返回input。

3:全域性結果

全域性結果:放在action標籤之外配置,在同一package內的所以action都可以使用這個結果,通常用來配置一些共用的結果值,如:404

4:結果響應方式——type屬性

result標籤的type屬性定義了以什麼樣的方式來響應,重定向?還是**?還是其他?預設是內部**dispatcher。

type屬性有以下幾種:

chain:用來處理action鏈,被跳轉的action中仍能獲取上個頁面的值,如request資訊.

dispatcher:用來轉向頁面,通常處理jsp.

freemaker:處理freemarker模板.

httpheader:控制特殊http行為的結果型別.

redirect:重定向到乙個url,被跳轉的頁面中丟失傳遞的資訊,如request.

redirectaction:重定向到乙個action,跳轉的頁面中丟失傳遞的資訊.

velocity:處理velocity模板.

xslt:處理xml/xlst模板.

plaintext:顯示原始檔案內容,例如檔案源**,相當於out.write()

redirect和redirectaction的區別:前者跳轉到乙個頁面,後者跳轉到乙個action。

八:錯誤資訊

在servlet程式設計中,伺服器端校驗不通過時,是通過 out.write()方法輸出錯誤資訊到客戶端的,十分麻煩,還需要自己拼接前端頁面**。

在struts2中提供了乙個錯誤資訊map,以鍵值對的方式新增錯誤資訊;在頁面端,通過structs2的標籤,用key獲取具體的錯誤資訊內容即可,十分方便。

1:在action中新增錯誤資訊,如:

2:在頁面端使用標籤獲取錯誤資訊

首先,引入標籤庫

然後,通過 name屬性獲取錯誤資訊

Struts2字尾 深入Struts2

一 將action字尾變成html字尾 xmlversion 1.0 encoding utf 8 doctype struts public apache software foundation dtd struts configuration 2.1 en struts include file...

Struts2學習筆記

1.不繼承,不介面 2.繼承actionsupport類 3.介面action介面 4.我們可以使用modeldriven模式 5.我們可以自己編寫bean進行struts2的擴充套件,但是 一般不需要,因為struts2的功能已經很強大了!6.我們可以將default.properties檔案中的...

Struts2學習筆記

structs修改後自動更新 action執行的時候並不一定要執行execute方法 method add user add success.jsp user add success.jsp 可以在配置檔案中配置action的時候用method 來指定執行哪個方法 user useradd 新增使用...