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属性的理解,若有不对或不足之处,还请大家指出,相互交流,谢谢!

 

 

 

 

posted @ 2012-07-11 09:22  Yao H. Wang  阅读(3035)  评论(2编辑  收藏  举报