一.Struts2的開發環境和配置
1. 在MyEclipse中新建一個工程,在工程的src目錄中新建一個struts.xml文件
內容爲:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- Add packages here -->
</struts>
2. 在WebRoot/WEB-INF/lib目錄中添加
struts2-core2-2.x.x.jar,
xwork.x.x.jar,
freemarker-2.3.x.jar,
commons-logging-1.1.x.jar,
commons-fileupload-1.2.1.jar
ognl-2.6.x.jar
至少這六個jar文件(可從http://struts.apache.org/download.cgi#struts2014下載struts-2.x.x-all.zip文件)
3. 配置web.xml文件,添加內容爲
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
現在struts2的環境配置已經完成了。
二.簡單的struts2程序
2.1.建立action
在src下建立一個包org.hwh.action,在包中建立一個java類Login
package org.hwh.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport { private String name; private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String execute() throws Exception { if("123".equals(name)&&"hwh".equals(pass)) { return SUCCESS; } else return "fail"; } }
|
程序說明:執行execute方法,返回success或fail
2.2.將此action配置到struts.xml文件中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <constant name="struts.action.extension" value="action"></constant> <package name="org.hwh.struts2" namespace="" extends="struts-default"> <action name="login" class="org.hwh.struts2.Login"> <result name="success">/ok.jsp</result> <result name="fail">/fail.jsp</result> </action>
</package> <!-- Add packages here -->
</struts> |
程序解釋:package節點中的name可以隨便起,但是多個package的name不能重複
namespace作爲訪問此action時的路徑,可以沒有也可以是空字符,extends爲繼承的package名。
Action節點中的name是訪問此action時的名字,class爲action的包名,默認爲ActionSupport,method默認執行execute方法。
Result節點中的name爲execute方法的返回值,根據name的值跳轉到不同頁面,默認爲success。
編寫hello.jsp,ok.jsp,fail..jsp頁面
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> <title>-_-+</title> </head> <body> <form action="login" method="post"> <input type="text" name="name" value="${name }"><br> <input type="password" name="pass" value="${pass }"><br> <input type="submit" value="ok"> </form> </body> </html> |
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> </head> <body> <h1>OK!</h1> </body> </html> |
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> </head> <body> <h1>FAIL!</h1> </body> </html> |
部署到tomcat中後在瀏覽器中輸入
http://localhost:8080/Struts2/login或http://localhost:8080/Struts2/login.action 可以直接訪問此action。如果不想.action想.xxx怎麼辦呢?
<constant name="struts.action.extension" value="xxx"></constant> |
這樣就可以.xxx了。
在瀏覽器中輸入http://localhost:8080/Struts2/hello.jsp輸入123,hwh提交給action頁面顯示OK!否則FAIL!
constant節點的其他屬性
<!--指定請求action的後綴,默認爲action --> <constant name="struts.action.extension" value="hou"></constant> <!--指定編碼集 --> <constant name="struts.i18n.encoding" value="GBK"></constant> <!--設置瀏覽器是否緩存靜態內容,默認爲true,開發階段最好爲false --> <constant name="struts.serve.static.browserCache" value="false"></constant> <!--當struts的配置文件修改後,系統是否自動重新加載該文件(不用重啓服務器),默認爲false,開發階段最好爲true--> <constant name="struts.configuraction.xml.reload" value="true"></constant> <!--開發過程中打印更詳細的錯誤信息--> <constant name="struts.devMode" value="true"></constant> <!--默認的試圖主題--> <constant name="struts.ui.theme" value="simple"></constant> <!--與spring集成時,指定有spring負責action對象的創建--> <constant name="struts.objectFactory" value="spring"></constant> <!--設置struts2是否支持動態方法調用,默認爲true --> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant> <!-- 文件上傳總大小限制 --> <constant name="struts.multipart.maxSize" value="10701096"></constant> |
2.3.action名稱的搜索順序
<package name="org.hwh.struts2" namespace="" extends="struts-default"> |
現在的namespace爲空,即使你在訪問的時候在瀏覽器中輸入
http://localhost:8080/Struts2/sss/224/waa/login.action也沒有問題,也可以執行此action
如果namespace=”/hou”那麼訪問此action時就要輸入http://localhost:8080/Struts2/hou/login
在/hou下可以再加n層不存在的目錄也能訪問到action,但是如果/hou不存在就不行了。如果該namespace不存在則會去找默認的namespace(爲空的),如果沒有定義爲空的namespace的package則會出錯。
2.4. result配置的各種視圖轉發類型
<result type=””> </result> |
Type的類型有dispacher(默認),redirect(客戶端跳轉),redirectAction(跳轉到action),plainText(可顯示源碼的跳轉)
其中跳轉到的action在同一個package配置中直接用就可以,如果不在同一package下
<result type=”redirectAction”> <param name=”actionName”>actionName</param> <param name=”namespace”>namespace</param> </result> |
2.5. 爲Action屬性注入值
<package name="org.hwh.struts2" namespace="/hou" extends="struts-default"> <action name="login" class="org.hwh.struts2.Login"> <param name="name">123</param> <param name="pass">hwh</param> <result name="success">/ok.jsp</result> <result name="fail">/fail.jsp</result> </action> </package> |
說明:action下的param節點可爲action中的屬性賦值。賦值之後跳轉到的jsp頁面中可以用${name},${pass}獲得值。注意:param中的name的值應該與action中屬性的名稱一致。
三.Struts2的處理流程
說明:當用戶請求到達時,filter會過濾用戶請求。默認情況下,請求無後綴或後綴名爲
.action時(請求爲一個action)這個請求會被轉入struts2框架中處理,否則struts2則會略過此請求。當請求進入框架時會先進過一系列的攔截器,然後到action,根據action的返回值返回到jsp或html頁面。Struts1與struts2不同的地方在於struts2中的action是線程安全的。
四.Struts2中使用多個配置文件
在struts.xml文件中使用include:
<struts> <include file="a.xml"></include> <include file="b.xml"></include> </struts> |
注意:被包含的文件中<package>的name是唯一的。