學習Struts(2.3),學習struts2.3
1.struts2.3核心jar包(若首次接觸,可暫時略過不看)
大家可以到http://struts.apache.org/download.cgi#struts2014下載struts-2.x.x-all.zip,目前最新版為2.3.16.3。下載完後
解壓檔案,開發struts2應用需要依賴的jar檔案在解壓目錄的lib檔案夾下。不同的應用需要的JAR包是不同的。下面給出了開發
Struts 2程式最少需要的JAR。
struts2-core-2.x.x.jar :Struts 2架構的核心類庫
xwork-2.x.x.jar :XWork類庫,Struts 2在其上構建,由於Struts2是由xwork的延伸 有些類依然關聯著 xwork的類
ognl-3.0.x.jar :對象圖導航語言(Object Graph Navigation Language),支援ognl運算式,struts2架構通過其讀寫對象的屬性
freemarker-2.3.x.jar : FreeMarker是一個模板引擎,一個基於模板產生文本輸出的通用工具,Struts 2的UI標籤的模板使用
FreeMarker編寫
commons-logging-1.1.x.jar :ASF出品的日誌包,Struts 2架構使用這個日誌包來支援Log4J和JDK 1.4+的日誌記錄。
commons-fileupload-1.3.1.jar 檔案上傳組件,2.1.6版本後必須加入此檔案
如要整合其他架構,則需要添加相應的xxx-plugin.jar如:
整合spring需要將這個jar包匯入]。struts2-spring-plugin.jar ---struts2的spring外掛程式
順便介紹下相關名詞--------
1. jakarta:jakarta是apache組織下的一套Java解決方案的開源軟體的名稱,它包括了很多子項目。Tomcat,ant,struts等等也是
apache下的開源項目。同時也是jakarta的關聯項目。
2.OGNL:OGNL是一種功能強大的運算式語言(Expression Language,簡稱為EL),webwork2和現在的Struts2.x中使用OGNL取代原
來的EL來做介面資料繫結
3.xwork:XWork是一個標準的Command模式實現,並且完全從web層脫離出來。Xwork提供了很多核心功能:前端攔截機
(interceptor),運行時表單屬性驗證,類型轉換,強大的運算式語言(OGNL – the Object Graph Navigation Language),
IoC(Inversion of Control倒置控制)容器等。
4.command模式:命令(Command)模式屬於對象的行為模式【GOF95】。命令模式又稱為行動(Action)模式或交易(Transaction
)模式。命令模式把一個請求或者操作封裝到一個對象中。)
開發struts2項目時,不要一股腦把struts2架構lib下的所有jar複製到自己的項目中,要是在整合其他架構。那樣使得項目顯得非
常之臃腫。而且根本沒有什麼用的加進去。起不了什麼作用。
2.搭建Struts2環境
工具:MyEclipse9 用內建的Tomcat
搭建Struts2環境有以下幾個步驟:
1) 找到開發Struts2應用需使用到的jar檔案。
通過MyEclipse建立web工程,並通過MyEclipse加入struts2核心jar包(此處實際上就添加了一個core包)。
2) 編寫Struts2的設定檔struts.xml。
用MyEclipse加入struts2的jar包時,自動建立了struts.xml設定檔。
3) 在web.xml檔案中加入struts2的MVC架構啟動配置
用MyEclipse加入struts2的jar包時,自動在web.xml中加入了啟動struts2的配置,即struts架構是通過Filter啟動的,
web.xml中配置的StrutsPrepareAndExecuteFilter類的init()方法將會讀取struts.xml設定檔完成初始化工作。
注意:struts2通過過濾器來執行分發功能。
4) 驗證環境搭建是否成功:
啟動建立的工程,如果沒有報錯,就成功了,
3.入門程式:第一個struts2.3執行個體--Hello Struts
目錄結構:
1) 建立action類
package cn.ac.siat.helloaction;import com.opensymphony.xwork2.ActionSupport;public class HelloAction extends ActionSupport {private String message;//struts2的預設執行方法public String execute(){System.out.println("execute()...");message = "Hello Struts!";return "success";}// get set methodpublic String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}
2) 在struts.xml中配置action類
<struts><package name="siat" namespace="/" extends="struts-default"><action name="helloAction" class="cn.ac.siat.helloaction.HelloAction" method="execute"><result name="success">/index.jsp</result></action></package></struts>
3) index.jsp程式
<body> ${message}<br><!--可以指定訪問action裡的資料--> </body>
4) 瀏覽器訪問
http://lzc:8080/Struts2Test1/helloAction.action
4.可能會遇到的錯誤
No result defined for action cn.ac.siat.helloaction.HelloAction and result Hello Struts!
solution:
String 裡面有5個static 常量分別是:
ERROR INPUT LOGIN NONE SUCCESS
例如 如果在excute 中返回的是 ruturn SUCCESS;
也就相當於返回的是return "success"字串
就必須在struts.xml中寫上對應的"success"
<result name="success">/x.jsp</result>
當然EORROR 對應的就是"error";字串
當然INPUT 對應的就是"input";字串
當然LOGIN 對應的就是"login";字串
當然NONE 對應的就是"none";字串
要不你就換一換把return SUCCESS換成return "success";試一試
一定要確定你在excute返回的字串在 struts.xml中有定義
還有一個要提醒你的就是:
在validate中驗證有錯誤的話且沒有指定return 字串的話,
struts2預設就返回的是 return INPUT 也就是return "input"
註:在package裡面增加 namespace="/" 告訴系統是從根本錄尋找,如http://lzc:8080/Struts2Test1/helloAction.action
如果namespace="/user" 則訪問時需要在項目名和action之間加上此路徑如http://lzc:8080/Struts2Test1/user/helloAction.action
5.Struts.xml配置中的包介紹
<struts>
<package name="siat" namespace="/test" extends="struts-default">
<action name="helloAction" class="cn.ac.siat.helloaction.HelloAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
在struts2架構中使用包來管理Action,包的作用和java中的類包是非常類似的,它主要用於管理一組業務功能相關的action。在實
際應用中,我們應該把一組業務功能相關的Action放在同一個包下。
配置包時必須指定name屬性,該name屬性值可以任意取名,但必須唯一,他不對應java的類包,如果其他包要繼承該包,必須通過
該屬性進行引用。包的namespace屬性用於定義該包的命名空間,命名空間作為訪問該包下的Action的路徑的一部分,如訪問上面例
子的Action,訪問路徑為:/test/helloAction.action。 namespace屬性可以不配置,對本例而言,如果不指定該屬性,預設的命名空間為“”(Null 字元串)。
通常每個包都應該繼承struts-default包, 因為Struts2很多核心的功能都是攔截器來實現。如:從請求中把請求參數封裝到
action、檔案上傳和資料驗證等等都是通過攔截器實現的。 struts-default定義了這些攔截器和Result類型。可以這麼說:當包繼
承了struts-default才能使用struts2提供的核心功能。 struts-default包是在struts2-core-2.x.x.jar檔案中的struts-default.xml中定義。 struts-default.xml也是Struts2預設設定檔。 Struts2每次都會自動載入 struts-default.xml檔案。
注意:包還可以通過abstract=“true”定義為抽象包,抽象包中不能包含action。
6.Action(轉)
Action名稱的搜尋順序
1.獲得請求路徑的URI,例如url是:http://server/struts2/path1/path2/path3/test.action
2.首先尋找namespace為/path1/path2/path3的package,如果存在這個package,則在這個package中尋找名字為test的action,如
果不存在這個package則轉步驟3;
3.尋找namespace為/path1/path2的package,如果存在這個package,則在這個package中尋找名字為test的action,如果不存在這
個package,則轉步驟4;
4.尋找namespace為/path1的package,如果存在這個package,則在這個package中尋找名字為test的action,如果仍然不存在這個
package,就去預設的namaspace的package下面去找名字為test的action(預設的命名空間為空白字串"" ),如果還是找不到,頁
面提示找不到action。
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>
1>如果沒有為action指定class,預設是ActionSupport。
2>如果沒有為action指定method,預設執行action中的execute() 方法。
3>如果沒有指定result的name屬性,預設值為success。
Action中result的各種轉寄類型
<action name="helloworld" class="cn.itcast.action.HelloWorldAction">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
result配置類似於struts1中的forward,但struts2中提供了多種結果類型,常用的類型有: dispatcher(預設值)、 redirect 、
redirectAction 、 plainText。
下面是redirectAction 結果類型的例子,如果重新導向的action中同一個包下:
<result type="redirectAction">helloworld</result>
如果重新導向的action在別的命名空間下:
<result type="redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">/test</param>
</result>
plaintext:顯示原始檔案內容,例如:當我們需要原樣顯示jsp檔案原始碼 的時候,我們可以使用此類型。
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- 指定讀取檔案的編碼 -->
</result>
在result中還可以使用${屬性名稱}運算式訪問action中的屬性,運算式裡的屬性名稱對應action中的屬性。如下:
<result type="redirect">view.jsp?id=${id}</result>
多個Action共用一個視圖--全域result配置
當多個action中都使用到了相同視圖,這時我們應該把result定義為全域視圖。struts1中提供了全域forward,struts2中也提供了
相似功能:
<package ....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
為Action的屬性注入值
Struts2為Action中的屬性提供了依賴注入功能,在struts2的設定檔中,我們可以很方便地為Action中的屬性注入值。注意:屬
性必須提供setter方法。
public class HelloWorldAction{
private String savePath;
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
......
}
<package name="itcast" namespace="/test" extends="struts-default">
<action name="helloworld" class="cn.itcast.action.HelloWorldAction" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
上面通過<param>節點為action的savePath屬性注入“/images”
諸位同道好,我在學習struts23註解的時遇到了困難
然後你的問題是.....
struts 2312需要配置哪幾個jar包
最近剛好給學生講struts2.3.1.2,請把下面9個jar檔案放到WEB-INF\lib下。此配置可以在Eclipse 3.7 + Tomcat 6.0.35下運行正常。
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
freemarker-2.3.18.jar
javassist-3.11.0.GA.jar
ognl-3.0.4.jar
struts2-core-2.3.1.2.jar
xwork-core-2.3.1.2.jar
如果使用ajax或者tiles等,還需要更多的jar。上述9個jar是運行struts2的基本裝備