struts.xml中package元素的namespace属性用法(struts2.2.1.1)
关于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属性的理解,若有不对或不足之处,还请大家指出,相互交流,谢谢!