關於struts.xml中package元素的namespace屬性的,這是一個大多數項目開發都會用到的東西。
但在它的使用上,我卻也碰到了不少問題,下面與大家分享一下我所得出的三種使用方法。
其間涉及到3個文件:struts.xml、input.jsp(自己編寫的輸入頁面)、output.jsp(自己編寫的輸出頁面)。
說明一下,跳轉中的action設置的是默認都是成功,直接跳轉到output.jsp,而output.jsp頁面只有簡單的一個單詞“output"。
1、第一種方法,也是我覺得最巧妙和最簡單的方法,具體如下:
配置struts.xml
1 <struts> 2 <package name="hello" extends="struts-default" namespace="/theNamespace"> 3 <action name="namespaceAction" class="com.shengsiyuan.struts2.NamespaceAction"> 4 <result name="success">output.jsp</result> 5 </action> 6 </package> 7 8 </struts>
頁面input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> </head> <body> <form action="namespaceAction.action"> <input type="submit"> </form> </body> </html>
此時input.jsp和output.jsp都放在WebRoot下的theNamespace文件夾下面,值得注意的是此時struts.xml中package元素的namespace屬性值與此文件夾theNamespace同名。在這種情況下,在瀏覽器中輸入http://localhost:8080/struts2/theNamespace/input.jsp將訪問輸入頁面input.jsp(此URL中struts2是我為此項目設置的Context path,而此中的theNamespace為文件夾的名字,下URL同),然后再點擊input.jsp中的提交按鈕,則轉到http://localhost:8080/struts2/theNamespace/namespaceAction.action(此中strut2同上,而theNamespace則為namespace屬性值)。此處頁面跳轉后的URL基於的原理是:input.jsp中的action值("namespaceAction.action")並末在前面添加”/“符號("/namespaceAction.action")。因為,若添加”/“則在形成URL(上面第二個)時,會以”服務器路徑“為地址(http://localhost:8080),並把action值看成是相對路徑,得到的URL為http://localhost:8080/namespaceAction.action。顯然是不對的。而不加”/“則不同,這時會以當前路徑(http://localhost:8080/struts2/theNamespace/)<本來此中的theNamespace由文件夾名取得,但在URL中被當作namespace屬性值看待,因為它們同名,完成了這一巧妙的轉換>為地址,並加上action值,這就得到了上面第二個URL(正確的)。
2、第二種方法,此方法與第一種類似,靈感也來自於第一種方法。
同樣首先是struts.xml,同上的主要區別在於namespace的屬性值與文件夾不同名,我用的是"/test"。
而input.jsp中當然也需相應的改動,與上面的區別是action值,現為"/struts2/test/namespaceAction.action"(分別代表的是Context path、namespace屬性值、最終的action名)。從第一種方法的分析可知,這里action的值中前面有加”/“符號,故為”服務路徑“(http://localhost:8080),加上action值。得http://localhost:8080/struts2/test/namespaceAction.action。此為正確的URL。
3、第三方法,又是在第二種方法的基礎上得到。
struts.xml與第二種方法中的一樣。
在input.jsp求URL的方法上,略有不同。需在input.jsp的<head>與<title>標簽之間添加代碼<base href="<%=basePath%>">。當添加此base標簽之后,計算URL的方法就有所變化,添加之后,在此例中action的值就需改為"test/namespaceAction.action”(分別代表的是namespace屬性值、最終的action名)。因為當添加base標簽之后,URL就是以base為相對路徑,從input.jsp頂部的JSP代碼中的path和basePath可知,此時的base值為http://localhost:8080/struts2/。因此從第二種方法中正確的URL可知,我們只需將action值寫為"test/namespaceAction.action”就行,因為base中只缺此部分。
以上即為我對struts.xml中package元素的namespace屬性的理解,若有不對或不足之處,還請大家指出,相互交流,謝謝!