Struts2是在WebWork2基礎發展而來的。和struts1同樣,struts2也屬於MVC框架。不過有一點須要注意的是:儘管struts2和struts1在名字上差異不是很大,可是struts2和struts1在代碼編寫風格上幾乎是不同的。那麼既然有了struts1,爲什麼還要推出struts2?主要是由於struts2有如下優勢: 1>在軟件設計上,struts2沒有像struts1那樣跟Servlet API和struts API有着緊密的耦合,struts2的應用能夠不依賴Servlet API和struts API。Struts2的這種設計屬於無侵入式設計,而struts1卻屬於侵入式設計。 html
1 public class OrderListAction extends Action{ 2 public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request, 3 HttpServletResponse response) throws Exception{} 4 }
2>Struts2提供了攔截器,利用攔截器能夠進行AOP編程,實現如權限攔截等功能。
3>Struts2提供了類型轉換器,咱們能夠把特殊的請求參數轉換成須要的類型。在struts1中,若是咱們要實現一樣的功能,就必須想struts1的底層實現BeanUtil註冊類型轉換器才行。
4>Struts2提供支持多種表現層技術,如:JSP、freeMarker、Velocity等
5>Struts2的輸入校驗能夠對指定方法進行校驗,解決了Struts1長久之痛。
6>提供了全局範圍、包範圍和Action範圍的國際化資源文件管理實現 java
搭建Struts2開發環境
搭建Struts2環境時,咱們通常須要作如下幾個步驟的工做:(一下文件均可以在下載的struts2的文件夾中能夠找到,找不到的能夠聯繫我。QQ:434551893)
1>找到開發Struts2應用須要使用到的jar文件,拷貝到WEB-INF下/lib目錄下
2>編寫Struts2的配置文件struts2.xml
3>在web.xml中加入Struts2 MVC框架啓動配置
添加源碼文件(創建jar文件對應的源碼):右鍵點擊以前添加的struts2-core-2.3.24.1.jar文件,選擇Properties --> Java Source Attachment --> External Folder,而後選擇源碼位置struts-2.3.24.1\src\core\src\main\java
xwork2.3.3 源碼:在xwork2.3.3.jar上右鍵--屬性--java source Attachment,選擇external folder把解壓後的文件目錄定位到Java便可,路徑是xwork-core/src/main/java
添加文檔文件:右鍵點擊以前添加的struts2-core-2.3.24.1.jar文件,選擇Properties --> Javadoc Location --> URL--Browse 找到struts-2.3.24.1\docs\struts2-core\apidocs OK!
快速提示設置:先在本地解壓一個lib文件夾下邊struts2-core-2.3.24.1.jar文件,裏邊能夠看到dtd文件。而後打開window --> Preferences --> 搜索catalog 選中XML Catalog 點擊Add Location:本地dtd文件位置,Key Type:選擇URI,Key:struts2.xml配置文件中的http://struts.apache.org/dtds/struts-2.3.dtdweb
路徑問題:struts2中的路徑問題是根據action的路徑而不是jsp路徑來肯定,因此儘可能不要使用相對路徑。雖然能夠用redirect方式解決,但redirect方式並不是必要。解決辦法很是簡單,統一使用絕對路徑。(在jsp中用request.getContextRoot方式來拿到webapp的路徑。例如:在jsp的<head>標籤前邊寫上:<% String context = request.getContextPath(); %>,在<body>標籤裏面使用:<a href="<%=context %>/actions(actions是namespace)/Studentadd(這是action)">添加學生</a>)或者使用myeclipse常用的,指定basePath:<base href="<%=basePath%>"/> apache
Struts2應用的配置文件
Struts2默認的配置文件爲struts.xml,該文件須要存放在WEB-INF/classes下,在開發階段能夠放在src下就能夠,該文件的配置模板以下(最基本的配置中<struts>標籤裏邊爲空就能夠):編程
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <constant name="struts.devMode" value="true" /> <!-- 設置爲開發模式,更改東西能夠很快就會有反饋 --> 7 <package name="ghostman" namespace="/test" extends="struts-default"> //定義一個包來管理action。action訪問路徑爲:namespace/+"action的name" 8 //com.ghostman.action包名,HelloWorldAction包中類名,execute是HelloWorldAction類中的execute()方法,而且返回值是String 9 <action name="helloworld" class="com.ghostman.action.HelloWorldAction" method="execute"> //此action的訪問路徑爲/test/helloworld.action 10 <result name="success">/WEB-INF/page/hello.jsp</result> //執行該Action時會跳轉到/WEB-INF/page下的hello.jsp 11 </action> 12 <action name="addUI"> 13 <result>/WEB-INF/page/employeeAdd.jsp</result> 14 </action> 15 </package> 16 </struts>
Action配置中的各項默認值 api
一、若是沒有爲action指定class,默認是ActionSupport。 app
二、若是沒有爲action指定method,默認執行action中的execute()方法。 框架
三、若是沒有指定result的name屬性,默認值爲success。凡是name是success的result均可以不寫name屬性。 eclipse
Action執行的時候並不必定要執行execute方法,能夠在配置Action的時候用method=""來指定執行哪一個方法,也能夠在url地址中動態指定(動態方法調用DMI)(推薦)。 webapp
在struts2框架中使用包來管理Action,包的做用和java中的類包是很是類似的,它主要用於管理一組業務功能相關的action。 在實際應用中,咱們應該把一組業務功能相關的Action放在同一個包下。其實包的做用其實就是爲了防止重名。包還能夠經過abstract="true"定義爲抽象包,抽象包中不能包含action。
配置包時必須指定name屬性,該name屬性值能夠任意取名,但必須惟一,它不對應java的類包,若是其餘包要繼承該包, 必須經過該屬性進行引用。
包的namespace屬性用於定義該包的命名空間,namespace必須以"/"開頭,命名空間做爲訪問該包下Action的路徑的一部分,如訪問上例的Action, 訪問路徑爲:/test/helloworld.action。 namespace最好也用模塊來進行命名 namespace屬性能夠不配置,意味着namespace="",對本例而言,若是不指定該屬性,默認的命名空間爲""(空字符串)。
一般每一個包都應該繼承struts-defaul包,由於struts2不少核心的功能都是攔截器來實現。如:從請求中把請求參數封裝到action、 文件上傳和數據驗證等等都是經過攔截器實現的。 struts-defaul定義了這些攔截器和Result類型。能夠這麼說:當包繼承了struts-defaul才能使用struts2提供的核心功能。 struts-defaul包是在struts2-core-2.x.x.jar文件中的struts-defaul.xml中定義。 struts-defaul.xml也是struts2默認配置文件。Struts2每次都會自動加載struts-defaul.xml文件。
拷貝其餘項目應注意:拷貝其餘struts2項目時,須要右鍵選中拷貝的項目名,選擇Properties,找到MyEclipse下的web,必定把Web Context-root中的內容修改成你本身項目的名字,否則部署以後會找不到文件
通配符的使用:能夠將配置降到最低,不過必定要遵照」約定優於配置「的原則。若是有多個<action>能夠匹配,首先匹配最精確的。若是都是通配符,則誰在前邊調用誰。舉例以下:
StudentAction:
1 package com.hp.struts2.action; 2 import com.opensymphony.xwork2.ActionSupport; 3 public class StudentAction extends ActionSupport{ 4 public String add(){ 5 return SUCCESS; 6 } 7 public String delete(){ 8 return SUCCESS; 9 } 10 }
TeacherAction:
1 package com.hp.struts2.action; 2 import com.opensymphony.xwork2.ActionSupport; 3 public class TeacherAction extends ActionSupport{ 4 public String add(){ 5 return SUCCESS; 6 } 7 public String delete(){ 8 return SUCCESS; 9 } 10 }
struts.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <constant name="struts.devMode" value="true" /> <!-- 設置爲開發模式,更改東西能夠很快就會有反饋 --> 7 <package name="default" namespace="/actions" extends="struts-default"> 8 <action name="Student*" class="com.hp.struts2.action.StudentAction" method="{1}"> 9 <result>/Student{1}_success.jsp</result> 10 </action> 11 <action name="*_*" class="com.hp.struts2.action.{1}Action" method="{2}"> 12 <result>/{1}_{2}_success.jsp</result> 13 </action> 14 </package> 15 </struts>
在WebRoot下面建立Studentadd_success.jsp、Studentdelete_success.jsp、Teacher_add.jsp、Teacher_delete.jsp
解釋:針對第一個<action>,當接收到Studentadd和Studentdelete的action時,會自動匹配到Student*,此時*即add或者delete,{1}是第一個與*匹配的方法,即add()和delete()方法。針對第二個<action>,當接收到Teacher_add和Teacher_delete的action時,會自動匹配到第二個<action>,此時的前邊的*就是{1},即Teacher,後邊的*就是{2},即add或者delete。若是看不懂能夠加我QQ:434551893一塊兒交流交流
用Action的屬性接收參數:Struts2中Action的屬性接收參數,有三種傳遞並接收參數的方式,第一種是在Action添加成員屬性接收參數,第二種是域模型(DoMainModel),就是利用對象域來進行傳遞和接收參數,第三種是ModelDriven接收參數。具體內容請參考:http://www.2cto.com/kf/201503/384769.html,http://www.cnblogs.com/bukudekong/archive/2012/03/29/2423064.html