最近在用SSH框架作一個項目,在使用Struts 的namespace時遇到很多問題,如今就對struts namespace 作一個簡單的介紹吧.(本文從項目結構展開敘述)web
(第1次寫博客, 寫的很差,請見諒,望你們多提寶貴意見~)ajax
1. 新建一個項目工做叫作eczone, WebRoot的文件目錄結構以下spring
2. 在web.xml中,歡迎頁面的配置以下:apache
<display-name>Eczone</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
若是,index.jsp在/WebRoot/pages/下面, 上面的配置則須要修改成: /pages/index.jsptomcat
3. 訪問方式: http://localhost:8080/eczone/ app
其中eczone爲項目名稱,也就是發佈到tomcat的webapp下面的項目名。 (到如今彷佛還沒進來主題,別急讓咱們繼續往下看-----》》)框架
4. URL的組成結構以下:(如下爲最簡單的用戶登陸後的url)webapp
(關於.action,何時須要指定,何時不須要,將在後面解釋)jsp
5. 先看Struts.xml的配置測試
1 <struts> 2 <constant name="struts.devMode" value="true"></constant> 3 <!--Spring plus 經過overriding struts objectFactory 來增強框架核心對象的建立 --> 4 <constant name="struts.objectFactory" 5 value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> 6 <package name="mypkg2" extends="struts-default"> 7 <action name="userLogin" class="com.dragon.eczone.action.user.UserAction" method="login"> 8 <result name="success">/pages/success2.jsp</result> 9 <result name="failure">/pages/failure.jsp</result> 10 </action> 11 </package> 12 <package name="mypkg1" namespace="/" extends="struts-default"> 13 <action name="userLogin" class="com.dragon.eczone.action.user.UserAction" method="login"> 14 <result name="success">/pages/success1.jsp</result> 15 <result name="failure">/pages/failure.jsp</result> 16 </action> 17 </package> 18 <package name="user" namespace="/user" extends="struts-default"> 19 <action name="userLogin" class="com.dragon.eczone.action.user.UserAction" method="login"> 20 <result name="success">/pages/success.jsp</result> 21 <result name="failure">/pages/failure.jsp</result> 22 </action> 23 </package> 24 </struts>
說明: 1. success1.jsp, success2.jsp能夠加入到/pages/ 目錄下進行測試,到底請求了那個action. (在success.jsp, success1.jsp, success2.jsp上呈現不一樣內容來區別)
2. Struts在處理請求時,若是請求指定了namespace , struts 會根據指定的namespace去查找action;
若是請求沒有指定namespace, Struts則從默認namespace的根目錄去查找acton
3. 在 Struts.xml中namespace="/" 爲默認的根目錄, 若是不指定namespace的值則也等同於namespace="/".
6. 在看index.jsp的 代碼
<s:form name="loginForm" action="userLogin" method="POST" namespace="/user"> <s:textfield name="userName" label="Login name" /> <s:password name="passWord" label="Password" /> <s:submit value="Login" align="center" />
</s:form>
說明:1. namespace 若是不指定, 默認爲 namespace="/" 更目錄
2. action爲Struts.xml中定義的action的名稱.
3. 有的地方會指定action爲如下值:
》 /user/userLogin 這種方式,頁面能夠跳轉成功, 可是控制檯會拋異常或警告 :
No configuration found for the specified action: '/user/userLogin' in namespace: '/user'. Form action defaulting to 'action' attribute's literal value.
》 /user/userLogin.action 這種方式頁面能跳轉成功,出現以下警告:
No configuration found for the specified action: '/user/userLogin.action' in namespace: '/user'. Form action defaulting to 'action' attribute's literal value.
4. 最後來講.action的事情 , <s:form>使用的是Struts標籤,會自動添加.action, 若是是ajax等本身拼裝URL的時候,必須加上.action.
小結:
1. struts.xml中儘可能顯示的指明page, 和namespace (建議將page和namespace設置成同一值)
2. 若是本身拼裝URL,則按照上面第4點中URL的結構拼裝。
3. 若是使用struts 標籤方式<s:form>, 則建議顯示的指定action, namespace(參照Struts.xml中配置)