Struts2学习总结一
Struts2框架的struts.xml詳解
- Struts總結一
- Struts的jar
- Struts2的簡介
- Struts2的工作原理
- 4、Struts2的優點
- 5、Struts2的第一個案例
- 5.1、開發環境和導入jar包
- 5.2、創建Action
- 5.3、配置struts.xml
- 5.4、配置web.xml
- 5.5、success.jsp和實驗結果
- 6、Struts2配置文件的加載順序
- 7、Struts2提供的常量(constant)
- 8、package元素
- 8.1、對namespace的詳解
- 9、action元素(動作名稱)
- 9.1、通配符方法
- 9.2、Action類的幾種創建方式
- 9.3、動態方法調用
- 10、result元素
- 10.1、param元素(依賴注入:DI)
- 10.2、自定義結果類型
- 10.2.1、自定義結果類型的類
- 10.2.2、在struts.xml中聲明結果類型視圖
- 10.2.3、在struts.xml中使用結果視圖
- 10.2.3、訪問路徑
- 11、default-action-ref元素
- 12、default-class-ref元素
- 13、global-results元素
- 14、global-exception-mapping元素
- 15、include元素
- 16、interceptor元素
- 17、interceptor-ref元素
- 18、default-interceptor-ref元素
- 參考
Struts總結一
很久沒更新了,原因是"懶"和"沒時間做筆記"。于是還是做一個小總結吧!(不然容易忘記)
Struts的jar
Struts2下載地址
下載完成后,打開壓縮包中apps目錄下的struts-blank.war包。將得到本次學習的所有jar,如下:
Struts2的簡介
Struts2是Apache發行的MVC開源框架。注意:它只是表現層(MVC)框架。
Struts2的工作原理
在理解下面那幅圖之前,我們先回想一下在學習JavaEE時,Filter和Servlet的區別!
Filter和Servlet的區別:Filter能夠處理(或者說過濾)所有東西,Servlet只能處理Servlet的請求,那么可見,Servlet能做的時候Filter都能做!
那么以下的圖就好理解了,Struts2應用中只有一個Filter,沒錯就是FilterDispatcher過濾器!它將處理所有請求!也就是說,我們將配置web.xml中的一個信息!如下:
<filter><filter-name>struts2Filter</filter-name><!-- 下面這個是Struts2的過濾器 --><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping><filter-name>struts2Filter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>接下來這幅圖可以說是非常容易理解了!
上圖是 Struts2 的體系結構。一個請求在 Struts2 框架中的處理大概會經過以下幾個步驟:
舉個例子,如下圖:
4、Struts2的優點
下面列舉 Struts2 的一些主要優點:
5、Struts2的第一個案例
第一個案例步驟如下:
5.1、開發環境和導入jar包
5.2、創建Action
5.3、配置struts.xml
源代碼:
5.4、配置web.xml
源代碼:
5.5、success.jsp和實驗結果
6、Struts2配置文件的加載順序
| 1 | default.properties | struts2-core-2.3.15.3.jar\org\apache\struts2 | 不能修改 |
| 2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
| 3 | strtuts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改 |
| 4 | struts.xml | 我們的應用中 | 我們能修改的 |
| 5 | struts.properties | struts2-core-2.3.15.3.jar | 我們能修改的 |
| 6 | web.xml | 我們的應用中 我們修改的 | 可以給過濾器配置參數 |
7、Struts2提供的常量(constant)
| struts.i18n.encoding | UTF-8 | 應用中使用的編碼 |
| struts.objectFactory.spring.autoWire | name | 和spring框架整合有關 |
| struts.multipart.parser | jakarta | 指定文件上傳用的組件 |
| struts.multipart.maxSize | 2097152 | 文件上傳總文件大小限制:2M |
| struts.action.extension | action | 能進入Struts2框架內部的url地址后綴名。多個值用逗號分隔 |
| struts.enable.DynamicMethodInvocation | false | 是否允許動態方法調用 |
| struts.devMode | false | 是否是開發模式。開發模式:改了配置文件,不需要重啟。輸出更多的錯誤信息。開發階段建議為true。 |
| struts.ui.theme | xhtml | 頁面展示用的主題 |
例如(在struts.xml中配置):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><!-- 開發模式 --><constant name="struts.devMode" value="true"></constant> </struts>8、package元素
在struts中,package用來管理action、result、interceptor、interceptor-stack等配置信息,它的屬性如下:
| name | 是 | 包名,唯一標記,其他package可以利用name來引用 |
| extends | 否 | 設置繼承其它package,會繼承父package的所有配置屬性(例如action、result等等);默認繼承自struts-default.xml |
| namespace | 否 | package的命名空間,會改變url訪問地址,主要是針對比較大型的項目以方便管理action,因為不同namespace中的action可以同名,從而解決action重名的問題。 |
| abstract | 否 | 是否設置為抽象包 |
例如(在struts.xml中配置):
<!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>8.1、對namespace的詳解
namespace的默認值:"",而不是"/"。
動作類的搜索順序(重點):
如果請求訪問的服務在訪問指定的namespace下不存在,則默認依次將訪問的namespace縮短一級尋找,如果該namespace存在則在其下尋找服務,如果依次縮短尋找的namespace還是找不到對應的namespace則在名為"/"的namespace下尋找,找到了就訪問,找不到就返回找不到。
9、action元素(動作名稱)
| name | 是 | action的名稱 |
| class | 否 | action對應的JAVA類 |
| method | 否 | 類中的具體方法 |
| converter | 否 | 類型轉換器 |
如果沒有為action指定class,默認的是ActionSupport。
如果沒有為action指定method,默認執行action中的execute()方法。
例如(在struts.xml中配置):
<!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>9.1、通配符方法
例如(在struts.xml中配置):
<!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="*_*" class="com.csa.action.HelloAction" method="{1}{2}"><!-- 查找相應結果的字符串的result --><result name="success">/{1}{2}.jsp</result></action> </package>9.2、Action類的幾種創建方式
動作類的幾種創建方式:
9.3、動態方法調用
例如(在struts.xml中配置):
<!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>url訪問方式:http://ip:prot/web應用/命名空間/動作名稱!方法名.action。
10、result元素
| name | 否 | Action對應返回的邏輯響應視圖,默認是success。 |
| type | 否 | 返回結果的類型,默認為dispatcher |
例如(在struts.xml中配置):
<!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>10.1、param元素(依賴注入:DI)
<!-- 包名,其實也就是命名空間 --><package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result type="redirectAction(或者其他自定義結果類型)"><param name="namespace(或者自定義結果類型的參數)">/world</param><param name="actionName(或者自定義結果類型的參數)">world</param></result></action></package>10.2、自定義結果類型
自定義結果類型需要做的有以下幾步:
10.2.1、自定義結果類型的類
package com.csa.type;import org.apache.struts2.dispatcher.StrutsResultSupport; import com.opensymphony.xwork2.ActionInvocation;public class CaptchaResult extends StrutsResultSupport {private Integer width;private Integer height;public void setWidth(Integer width) {this.width = width;}public void setHeight(Integer height) {this.height = height;}@Overrideprotected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {//以下是生成驗證碼的算法!省略不寫。width和height決定寬度和高度}}10.2.2、在struts.xml中聲明結果類型視圖
<!-- 下面的內容省略掉 --> <package ...><!-- 聲明結果類型 --><result-types><result-type name="captcha" class="com.csa.type.CaptchaResult"></result-type></result-types> </package>10.2.3、在struts.xml中使用結果視圖
<!-- 沒有class是執行默認的ActionSupport,沒有方法是默認執行execute() --> <action name="captchaAction"><result name="success" type="captcha"><!-- 設置驗證碼的寬和高度分別為200和100 --><param name="width">200</param><param name="height">100</param></result> </action>10.2.3、訪問路徑
http://ip:port/web應用/命名空間/動作名稱,這樣就可以得到以上的自定義結果類型的東西的。在這里我們得到的是驗證碼!
11、default-action-ref元素
如果找不到項目請求的action,就會報出404錯誤,而且這種錯誤不可避免,所以我們可以使用 default-action-ref 來指定一個默認的action,如果系統出現找不到action的情況,就會來調用這個默認的action。
例如:
訪問路徑:http://ip:port/web應用/命名空間/任意名稱會發現,最后返回的都會是/success.jsp的內容!
12、default-class-ref元素
與action的一毛一樣,不做闡述!
<!-- 指定默認class為Test --> <default-class-ref class="com.csa.action.HelloAction"/>13、global-results元素
設置package范圍內的全局響應結果。在多個action都返回同一個邏輯視圖(通常為某個jsp頁面)的情況下,可以通過該標簽來統一配置。
例如:
這樣子,只要在同一個包下的所有動作(action)返回的字符串都將先去匹配局部結果視圖,如果找不到對應的字符串,再去全局結果視圖中尋找有無對應的字符串。如果有,則返回相應的結果視圖,如果沒有,則404!
14、global-exception-mapping元素
配置發生異常時的視圖信息。exception-mapping是控制action范圍內的,而global-exception-mapping是控制package范圍內的。兩個都配置時,exception-mapping的優先級更高。
| name | 否 | exception名稱 |
| result | 是 | 設置異常相應結果的視圖信息 |
| exception | 是 | 設置異常類型 |
這里已經很詳細(跟result一毛一樣)了,就不需要在說明了!
15、include元素
你還可以使用 include 來引入外部配置文件,直接給出 url 即可:
<include file="**/**/***.xml" />使用 include 的好處在于,例如當我們開發一個比較大型的項目的時候,配置文件肯定會寫一大堆。如果寫在一個配置文件里就不好查看和修改,不便于維護;所以使用 include 后可以根據模塊、也可以根據功能來劃分,這樣就比較清晰,方便管理和維護。
16、interceptor元素
通過該標簽可以向Struts2框架中注冊攔截器或者攔截器棧,一般多用于自定義攔截器或攔截器棧的注冊。該標簽使用方法如下:
<package ...><interceptors><interceptor name="攔截器名" class="攔截器類"/><interceptor-stack name="攔截器棧名"><interceptor-ref name="攔截器名"></interceptor-stack></interceptors> </package>17、interceptor-ref元素
通過該標簽可以為其所在的Action添加攔截器功能。當為某個Action單獨添加攔截器功能后,中所指定的攔截器將不再對這個Action起作用。
<action name="hello"><interceptor-ref name="攔截器名(或者攔截器棧名)"><param name="參數名">參數值</param></interceptor-ref><result name="success">/success.jsp</result> </action>18、default-interceptor-ref元素
該標簽用來設置整個包范圍內所有Action所要應用的默認攔截器信息。事實上我們的包繼承了struts-default包以后,使用的是Struts的默認設置。我們可以在struts-default.xml中找到相關配置:
<package ...><default-interceptor-ref name="defaultStack"/> </package>在實際開發過程中,如果我們有特殊的需求是可以改變默認攔截器配置的。當時一旦更改這個配置,“defaultStack”將不再被引用,需要手動最加。
如下:
<action name="hello"><interceptor-ref name="攔截器名(或者攔截器棧名)"><param name="參數名">參數值</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref><result name="success">/success.jsp</result> </action>參考
實驗樓的Struts2教程
還有黑馬的word筆記!這里木得url!
總結
以上是生活随笔為你收集整理的Struts2学习总结一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信应该砍掉这些功能
- 下一篇: 正月初六 | 2月17日 星期二 | 快