1). result 是 action 節點的子節點
2). result 代表 action 方法執行後, 可能去的一個目的地
3). 一個 action 節點可以配置多個 result 子節點.
4). result 的 name 屬性值對應著 action 方法可能有的一個返回值. <result name="index">/index.jsp</result>
5). result 一共有 2 個屬性, 還有一個是 type: 表示結果的響應類型
6). result 的 type 屬性值在 struts-default 包的 result-types 節點的 name 屬性中定義.
常用的有 > dispatcher(默認的): 轉發. 同 Servlet 中的轉發.
> redirect: 重定向
> redirectAction: 重定向到一個 Action 注意: 通過 redirect 的響應類型也可以便捷的實現 redirectAction 的功能!
<result name="index" type="redirectAction"> <param name="actionName">testAction</param> <param name="namespace">/atguigu</param> </result>
OR
<result name="index" type="redirect">/atguigu/testAction.do</result>
> chain: 轉發到一個 Action 注意: 不能通過 type=dispatcher 的方式轉發到一個 Action. 只能是
<result name="test" type="chain"> <param name="actionName">testAction</param> <param name="namespace">/atguigu</param> </result>
不能是:
<result name="test">/atguigu/testAction.do</result>
可以利用 struts 提供的通配符映射機制把多個彼此相似的映射關系簡化為一個映射關系
通配符映射規則
–若找到多個匹配, 沒有通配符的那個將勝出
–若指定的動作不存在, Struts 將會嘗試把這個 URI 與任何一個包含著通配符 * 的動作名及進行匹配
–被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 來引用. {1} 匹配第一個子串, {2} 匹配第二個子串…
–{0} 匹配整個 URI
–若 Struts 找到的帶有通配符的匹配不止一個, 則按先後順序進行匹配
–* 可以匹配零個或多個字符, 但不包括 / 字符. 如果想把 / 字符包括在內, 需要使用 **. 如果需要對某個字符進行轉義, 需要使用 \.
通過 url 動態調用 Action 中的方法
URI: –/struts-app2/Product.action: Struts 調用 Product 類的 execute –/struts-app2/Product!save.action: Struts 調用 Product 類的 save() 方法 默認情況下, Struts 的動態方法調用處於禁用狀態(不建議使用)<!-- 打開允許動態方法調用的開關, 默認是 false --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
在 JSP 頁面上可以可以利用 OGNL(Object-Graph Navigation Language: 對象-圖導航語言) 訪問到值棧(ValueStack) 裡的對象屬性.
若希望訪問值棧中 ContextMap 中的數據, 需要給 OGNL 表達式加上一個前綴字符 #. 如果沒有前綴字符 #, 搜索將在 ObjectStack 裡進行.
1). helloWorld 時, ${productName} 讀取 productName 值, 實際上該屬性並不在 request 等域對象中, 而是從值棧中獲取的.
2). ValueStack:
I. 可以從 ActionContext 中獲取值棧對象
II. 值棧分為兩個邏輯部分
> Map 棧: 實際上是 OgnlContext 類型, 是個 Map, 也是對 ActionContext 的一個引用.
裡邊保存著各種 Map:requestMap, sessionMap, applicationMap, parametersMap, attr
> 對象棧: 實際上是 CompoundRoot 類型, 是一個使用 ArrayList 定義的棧. 裡邊保存各種和當前 Action 實例相關的對象.是一個數據結構意義的棧.
1). 值棧中的屬性值:
> 對於對象棧: 對象棧中某一個對象的屬性值
> Map 棧: request, session, application 的一個屬性值 或 一個請求參數的值.
2). 讀取對象棧中對象的屬性:
> 若想訪問 Object Stack 裡的某個對象的屬性. 可以使用以下幾種形式之一: object.propertyName ; object['propertyName'] ; object["propertyName"]
> ObjectStack 裡的對象可以通過一個從零開始的下標來引用. ObjectStack 裡的棧頂對象可以用 [0] 來引用, 它下面的那個對象可以用 [1] 引用.
> [n] 的含義是從第 n 個開始搜索, 而不是只搜索第 n 個對象
> 若從棧頂對象開始搜索, 則可以省略下標部分: message
> 結合 s:property 標簽: <s:property value="[0].message" /> <s:property value="message" />
3). 默認情況下, Action 對象會被 Struts2 自動的放到值棧的棧頂.
可以利用 OGNL 調用
–任何一個 Java 類裡的靜態字段或方法.
–被壓入到 ValueStack 棧的對象上的公共字段和方法.
默認情況下, Struts2 不允許調用任意 Java 類靜態方法, 需要重新設置 struts.ognl.allowStaticMethodAccess 標記變量的值為 true.
調用靜態字段或方法需要使用如下所示的語法:
–@fullyQualifiedClassName@fieldName: @java.util.Calendar@DECEMBER
–@fullyQualifiedClassName@methodName(argumentList): @app4.Util@now()
調用一個實例字段或方法的語法, 其中 object 是 Object Stack 棧裡的某個對象的引用:
–.object.fieldName: [0].datePattern
–.object.methodName(argumentList): [0].repeat(3, “Hello”);
有些屬性將返回一個對象數組而不是單個對象, 可以像讀取任何其他對象屬性那樣讀取它們. 這種數組型屬性的各個元素以逗號分隔, 並且不帶方括號
可以使用下標訪問數組中指定的元素: colors[0]
可以通過調用其 length 字段查出給定數組中有多少個元素: colors.length
有些屬性將返回的類型是 java.util.List, 可以像讀取任何其他屬性那樣讀取它們. 這種 List 的各個元素是字符串, 以逗號分隔, 並且帶方括號
可以使用下標訪問 List 中指定的元素: colors[0]
可以通過調用其 size 方法或專用關鍵字 size 的方法查出給定List 的長度: colors.size 或 colors.size()
可以通過使用 isEmpty() 方法或專用關鍵字 isEmpty 來得知給定的 List 是不是空. colors.isEmpty 或 colors.isEmpty()
還可以使用 OGNL 表達式來創建 List, 創建一個 List 與聲明一個 Java 數組是相同的: {“Red”, “Black”, “Green”}
若希望檢索出某個 Map 的值, 需要使用如下格式: map[key]
可以使用 size 或 size() 得出某個給定的 Map 的鍵值對的個數
可以使用 isEmpty 或 isEmpty() 檢查某給定 Map 是不是空.
可以使用如下語法來創建一個 Map:
<s:property value=“fieldName”> 也可以通過 JSP EL 來達到目的: ${fieldName}
原理: Struts2 將包裝 HttpServletRequest 對象後的 org.apache.struts2.dispatcher.StrutsRequestWrapper 對象傳到頁面上, 而這個類重寫了 getAttribute() 方法.
exception-mapping 元素: 配置當前 action 的聲明式異常處理
exception-mapping 元素中有 2 個屬性
–exception: 指定需要捕獲的的異常類型。異常的全類名
–result: 指定一個響應結果, 該結果將在捕獲到指定異常時被執行, 既可以來自當前 action 的聲明, 也可以來自 global-results 聲明.
聲明式異常處理機制由 ExceptionMappingInterceptor 攔截器負責處理, 當某個 exception-mapping 元素聲明的異常被捕獲到時, ExceptionMappingInterceptor 攔截器就會向 ValueStack 中添加兩個對象:
–exception: 表示被捕獲異常的 Exception 對象
–exceptionStack: 包含著被捕獲異常的棧
可以在視圖上通過 <s:property> 標簽顯示異常消息