package詳解
1.1. action
A)name action的名稱,是外界反問的唯一性標識
B)class action所對應的類
C)method 在一個action中可能有很多個方法,那麼我們就可以結合這個屬性去訪問 一個action中不同的方法體。
如:在LoginAction中有兩個方法體,分別是login和checkValid,如何訪問呢?
你會發現這兩個action的配置載入了同一個類com.sun.demo.LoginAction,不同的是屬性name和屬性method的區別,在訪問的時候,根據name去訪問到對應的類檔案,然後再根據對應的method去訪問相應的方法體。
DMI【動態調用action的不同方法】:
我們不再根據method屬性來訪問不同的方法了,而是在前台View頁面進行設定:
VIEW:
登入
驗證
用驚嘆號【!】來做標識,依次向下執行,前面為action名稱,後面是方法名。
以上method和DMI的區別在於前者每個方法可以返回不同的結果,且在每個方法中可以使用不同的攔截器,而後者最終的結果都是一樣的,它們使用的攔截器也是一樣的,具體使用那種方式進行設定依據開發的實際需要進行選擇。
在這裡有必要提醒一下:
在設定action屬性method時,其多對用的Action類中的方法名可以為“do方法名”,如:
在com.sun.demo.LoginAction類中對應的方法可以寫成這樣doLogin
萬用字元映射:
* 代表0-N個字元,但是不包括"/"
** 代表0-N個字元,包括"/"
\ 逸出字元
在一個包中可能存在多個action,如:
仔細觀察就會發現,這些action的名稱有些相同的特徵,我們可以通過萬用字元來處理。
當我們訪問addNote時,add欄位就會填補*萬用字元,同時依據預留位置的順序去查詢對應的方法。
對於以上這種action名稱的設定,我們一般是在指明對與什麼表進行操作的情況下,但是當有多個表時,我們的操作就顯得有點麻煩了,現在我們又有了新的設定,如下:
也就是設定多個萬用字元,同時採用預留位置遍曆的方式去訪問各個action中的方法。{0}表示**的整體資訊
注意:在用預留位置去匹配某個Action的時候,得注意首字母的大小寫
萬用字元的變種:
預設action :
........
*號可以匹配任何的字串,所以以上的兩個預設的Action會不會發生錯誤呢?【不會】
總結:
當action的name屬性中沒有任何萬用字元時,其優先順序最高。
只要有萬用字元,不論是什麼萬用字元,一律按順序向下執行。
我們一般依照沒有萬用字元,有萬用字元,沒有匹配的順序進行編寫。
D)Converter
1.2. default-action-ref
"Login"是一個action的引用,在訪問action的時候,如果action不存在,那麼就會訪問預設的action。但是這個必須放在所有action的最前面,另外值得關注的是,這樣的預設處理只是對於action的訪問就行了設定,對於訪問不存在的頁面是無法進行處理的,這就需要在web.xml 中就行設定了。
404/error.jsp
不過這樣的設定有時候會出問題,不是總是正確的,這個得參考一下瀏覽器的進階設定
1.3. default-class-ref
當訪問不到指定的action類時,就會調用這個預設的action類進行處理。
1.4. default-interceptor-ref
當訪問不到指定的interceptor類時,就會調用這個預設的interceptor進行處理。
1.5. global-exception-mappings
設定全域異常轉向,可以被直接存取。
1.6. global-results
設定全域處理結果轉向,可以在action類中進行直接的轉向。
1.7. Interceptors攔截器
在struts2中,許多人都action都有一個共同需要關心的問題,比如對頁面的輸入進行驗證,對上傳的檔案進行預先處理,防止重複提交,在頁面顯示前進行下拉式清單的初始化,“攔截器”使得其變得相應容易些。
攔截器在action被調用前後都會被調用去執行一些code,struts2架構的大部分功能均是通過攔截器來實現的,如防止重複提交,類型轉換,對象封裝,校正,檔案上傳,頁面預裝載等,每個攔截器都是獨立裝載的,我們可以根據需要為每一個action配置其所需要的攔截器,例如:一個action需要來進行類型轉換和檔案上傳,那麼我們就可以為其設定兩個攔截器。
測試一下:
找到xwork.jar包下的com.opensymphony.xwork2.interceptor包下的TimerInterceptor.class.
怎麼配置攔截器:
在某個包下編寫如下代碼:
在該包下的任何一個action中,若想要使用該攔截器,那麼只要在action中添加如下代碼:
然後再去運行專案檔,我們發現報錯了,為什麼呢????
在這裡要特別的提醒一下:
我們之前的項目中,package繼承了struts-default,這其中實現了各種攔截器,是系統預設建立的,在我們自己不去手動設定攔截器時,系統會預設的調用struts-default中的攔截器,而當我們自己手動設定了攔截器後,系統就不再去調用預設的那些配置了,在上面的例子中,我們的攔截器是配置在一個頁面提交的action中的,所以還需要一個參數攔截器,可是我們沒有配置所以報錯了,而在自己不手動設定攔截器的情況下,在struts-default中這些必須的攔截器配置都是有的,懂了吧。但是我們在配置的時候倒是不妨多參考一下其中的各種資訊。
再配置一個攔截器:
在需要傳遞參數的action中引用該攔截器:
當然了,我們也可以在action中引用預設的攔截器:
別的包,子包也可以繼承父包,那麼在父包中定義的攔截器在子包中也可以使用。
當某些action共同使用多個相同的攔截器時,可以將這些重複使用的攔截器放在一個攔截器棧中:
...........
1.8. result-types