一个名为 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后面就形成了每个页面的绝对路径。
|