1、Struts2是在WebWork2基礎發展而來的。和struts1同樣,Struts2也屬於MVC框架。不過有一點你們須要注意的是:儘管 Struts2和struts1在名字上的區別不是很大,但Struts2和struts1在代碼編寫風格上幾乎是不同的。那麼既然有了 struts1,爲什麼還要推出Struts2.主要是由於Struts2有如下優勢:
一、在軟件設計上Struts2沒有像struts1那樣跟ServletAPI有着緊密的螯合,Struts2的應用能夠不依賴於ServleAPI和strutsAPI.Struts2的這種設計屬於無侵入式設計,而Struts1卻屬於侵入式設計。
public ActionForward execute(ActionMapping mapping,ActionForm
form, Http ServleRequest request,Http ServleResponse response)
throws Exception{
}
}
二、Struts2提供了攔截器,利用攔截器能夠進行AOP編程,實現如權限攔截等功能
三、Struts2提供了類型轉換器,咱們能夠把特殊的請求參數轉換須要的類型。在Struts1中,若是咱們要實現一樣的功能,就必須就Struts1的底層實現BeanUtil註冊類型轉換器才行。
四、Struts2提供支持多樣表現層技術,如:JSP、freeMarker、Velocity等
五、Struts2的輸入校驗能夠對指定方法進行校驗,解決Struts1長久之痛
六、提供了全局範圍、包範圍和Action範圍的國際化資源文件管理。
2、搭建Struts2開發環境:
一、找到開發Struts2應用蘇姚使用的jar文件
二、編寫Struts2的配置文件
三、在web.xml中加入Struts2MVC框架啓動配置
四、在Struts2框架式經過Filter啓動的,在Struts PreperAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操做。
注意:struts2讀取到struts.xml的內容後,以javabean形式存放在內存中,之後struts2對用戶的內次請求處理將會使用內存中的數據,而不是每次都讀取struts.xml文件。
3、Action名稱的搜索順序
一、得到請求路徑的URI,例如url是:
http://server/struts2/path1/path2/path3/tet.ation 二、首先尋找namespace爲/path1/path2/path3的package,若是不存在這個package則執行步驟3;若是存在這個 package,則在這個package中尋找名字爲test的action,當在該package下尋找不到action時就會直接跑去默認 namespace的package裏面尋找action(默認的命名空間爲空字符串""),若是在默認namespace的package裏面還尋找不 到該action,頁面提示找不到action 三、尋找namespace爲/path1/path2的package,若是不存在這個package,則轉至步驟4;若是存在這個package,則 這個package中尋找名字爲test的action,當在該package中尋找不到action時就會直接跑到默認namespace的 package裏面去找名字爲test的action,在默認namespace的package裏面還尋找不到該action,頁面提示找不到 action 四、尋找namespace爲/path1的package,若是不存在這個package則執行步驟5;若是存在這個package,則在這個 package中尋找名字爲test的action,當在該package中尋找不到action時就會直接跑到默認namespace的package 裏面去找名字爲test的action,在默認namespace的package裏面還尋找不到該action,頁面提示找不到action 五、尋找namespace爲/的package,若是存在這個package,則在這個package中尋找名字爲test的action,當在 package中尋找不到action或者不存在這個package時,都會默認namespace的package裏面尋找action,若是仍是找不 到,頁面提示找不到action 4、Action配置中的各項默認值 <package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute"> <result name="success">/WEB- INF/page/hello.jsp</result> </action> </package> 一、若是沒有爲action指定class,默認是ActionSupport. 二、若是沒有爲action指定method,默認執行action中的execute()方法. 三、若是沒有指定result的name屬性,默認值爲success. 5、Action中result的各類轉發類型 <action name="helloworld" class="cn.itcast.action.HelloWorldAction"method="execute"> <result name="success">/WEB-INF/page/hello.jsp</result> </action> 一、result配置相似於struts1中的forward,但struts2中提供了多種結果類型,經常使用的類型有:dispatcher(默認值)、redirect、redirectAction、plainText. 二、在result中還可使用${屬性名}表達式訪問action中的屬性,表達式裏的屬性名對應action中的屬性。以下: <resulttype="redirect">helloworld</result> 三、下面是redirectAction結果類型的例子,若是重定向的action中同一個包下:<resulttype="redirectAction">helloworld</result> 四、若是重定向的action在別的命名空間下: <resulttype="redirectAction"> <param name="actionName">helloworld</param> <param name="namespace">/test</param> </result> 五、plaintext:顯示原文件內容,例如:當咱們須要原樣顯示jsp文件源代碼的時候,咱們可使用此類型。 <result name="source"type="plain Text"> <param name ="location">/xxx.jsp</param> <param name ="chatset">UTF-8</param><!--指定讀取文件的編碼- -> </result> 6、<!-- 其實能夠經過常量"struts.action.extension"改變Struts2的默認後綴.action --> <constant name="struts.action.extension" value="do"/> 7、常量的定義:常量能夠在struts.xml或struts.properties中配置,建議在struts.xml中配置,兩種配置方式以下 一、在struts.xml文件中配置常量: <struts> constant name="struts.action.extension" value="do"/> </struts> 二、在struts.properties中配置常量: struts.action.extension=do 由於常量能夠在下面多個配置文件中進行定義,因此咱們須要瞭解struts2加載常量的搜索順序: struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml 若是在多個文件中配置同一個常量,則後一個文件配置的常量值會覆蓋前面文件中配置的常量值。 7、使用通配符定義action 一、<package name="itcast" namespace="/test"extends="struts-default"> <action name="helloworld_*" class="cn.itcast.action.HelloWorldAction" method="{1}"> <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> public class HelloWorldAction{ private String message; ..... public String execute()throws Exception{ this.message="個人第一個struts2應用"; return"success"; } public String other()throws Exception{ this.message="第二個方法"; return"success"; } } 要訪問other()方法,能夠經過這樣的URL訪 問:/test/helloworld_other.actipon