关于Struts2中namespace的路径问题

一个名为 myStruts2_0400_Path 项目里的struts.xml文件中有这样一个package配置:

   <package name="path" extends="struts-default" namespace="/path">

        <action name="path2" >

            <result> /pathpage.jsp </result>

        </action>

   </package>

此时的namespace不是“/”,而是指定了“/path”,那么地址栏输入:

http://localhost/myStruts2_0400_Path/path/path2

才可以进入 pathpage.jsp 页面,此时在这个页面里的链接地址,也必须注意“/path”这个namespace的影响。

pathpage.jsp 页面内容:

  <body>

    <!-- 这些页面都在该项目的WebRoot根目录下 -->

   

    <a href="testpage.jsp">testpage.jsp</a> <br> <!-- 错误!此时链接不能直接写相对路径 -->

    <!-- 点击之后的地址栏是: http://localhost/myStruts2_0400_Path/path/testpage.jsp -->

   

    <!-- 前面会有namespace,因为是一层namespace,所以前面加上“../”到上一层目录 -->

    <a href="../testpage.jsp">../testpage.jsp</a> <br>

    <!-- 点击之后地址栏是:http://localhost/myStruts2_0400_Path/testpage.jsp -->

   

    <a href="/testpage.jsp">/testpage.jsp</a> <br>

    <!-- 错误!这个绝对路径将回到服务器的根目录,而服务器的根目录里没有这个页面 -->

    <!-- 点击之后地址栏是:http://localhost/testpage.jsp -->

  </body>

 

由于每个链接都要考虑namespace,这容易出错,此时的做法是使用绝对路径。

每次书写绝对路径过于繁琐,在MyEclipse中新建JSP页面时,会自动加上以下配置:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath(); // 获得的是项目名

System.out.println(path); // /myStruts2_0400_Path

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

// 依次获取协议名,服务器名,端口号;构成了:http://localhost:80

// 再加上上面获得的path,就是项目根目录的绝对路径

System.out.println(basePath); // http://localhost:80/myStruts2_0400_Path/

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

    <!-- 设置base为上面求得的basePath

    那么本页面的后面的链接就都有这样的开头:http://localhost:80/myStruts2_0400_Path/

    所以从项目根目录下开始写路径就好,不以“/”开头,就形成了绝对路径

    而且一定要从项目根目录下开始写,就算两个页面都在同一个子目录下,也不能直接写彼此的页面名

-->

……

  </head>

……

 

路径问题总结

    一、在Action的result里

默认是服务器跳转,地址栏显示的地址不会改变,但是还是会根据地址栏的地址跳转,而且实际的地址也已经改变了。

在result里,以“/”开头的路径,是从项目根目录下开始写起的页面路径,建议这样写。

如果不以“/”开头,就是相对路径,那么就是接在当前namespace路径后面,构成新的访问路径,由于项目里文件夹路径名与namespace一般不一致,所以容易出错,不建议。

 

    二、在<a href=""> </a>里

这是客户端跳转,会直接修改地址栏地址,再跳转访问。

点击链接之后,相当于将地址栏中地址最后一个“/”后面的内容,换成href的内容,组合成新地址,再访问。(“../”可以到倒数第二个“/”后面)

由于namespace会出现在地址栏中,所以href直接写相对路径的话,要考虑namespace,容易出错,不建议。

href以“/”开头,是从服务器的根目录开始的路径,这将不包括项目名。

如果已经配置好了basePath,就不用考虑namespace了,而且链接地址必须:开头不带“/”,从项目根目录下开始写,不论链接到的页面跟本身是什么位置关系。地址接在basePath后面就形成了每个页面的绝对路径

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值