来源:http://edu.codepub.com/2009/1118/17782.php -- 源码网
从刚开始接触 Tomcat 开始,就被繁杂的相对路径给弄晕了,尽管最后每次都能正确的匹配上,但是总觉得不是很顺畅,一直试图找出一条匹配的规则出来,但是每每总结出一条来的时候,总是又被新的“事实”给颠覆,让人不胜烦恼,因此决定有一点写一点。
通常相对路径的写法有两种,一种就是以“ / ”开头,一种就是不以“ / ”开头,这两种写法有什么区别呢,下面举例阐述一下。
现在的 Web 环境是一个 Struts2 的应用,我的应用名是 Struts ,应用程序所在的目录名也是 Struts 。这样我的 url 基本是以 http://localhost/Struts 开头的啦。现在做如下测试:
1 .在 Struts 目录下面有一个文件叫 sayHello.jsp ,它里面的 form 的 action 的值是 HelloWorld.action ,那么提交之后匹配的路径是 http://localhost/Struts/HelloWorld.action 。
2 .如果 action 的值是 test/HelloWorld.action ,那么提交之后匹配的路径是 http://localhost/Struts/test/HelloWorld.action 。
3 .假设在 Struts 目录下面有一个子目录 add ,它里面有一个文件叫 sayHello.jsp ,它里面的 form 的 action 的值是 HelloWorld.action ,那么提交之后匹配的路径是 http://localhost/Struts/add/HelloWorld.action 。
4 .在测试 3 下将 action 的值改为 test/HelloWorld.action ,那么提交之后匹配的路径是 http://localhost/Struts/add/test/HelloWorld.action 。
5 .在测试 3 下将 action 的值改为 /HelloWorld.action ,那么提交之后匹配的路径是 http://localhost/Struts/ HelloWorld.action 。
6 .在测试 3 下将 action 的值改为 /test/HelloWorld.action ,那么提交之后匹配的路径是 http://localhost/Struts/ test/HelloWorld.action 。
总结:在页面文件中,所请求的相对路径为 path ,那么它的路径匹配是从文件当前所在的目录开始的,假设页面文件当前所在目录为 curr ,那么匹配后的完整路径就是 http://localhost/Sturts/curr/path ;如果相对路径为 /aa/bb/cc ,那么匹配后的路径就是 http://localhost/Sturts/path 。也就是说, 如果以“ / ”开头,就从当前应用的根目录开始匹配,如果不以“ / ”开头就从当前文件所在的目录开始匹配 。这样的话,如果文件本来就在根目录下面,那么加“ / ”和不加“ / ”就没啥区别了。
在 Struts2 还一个要匹配路径的地方就是在处理完请求之后对页面进行分发的时候,也就是 result 元素里面的内容。测试记录如下:
1 . <result>/HelloWorld.jsp</result> 。匹配的路径是 http://localhost/Struts/HelloWorld.jsp 。
2 . <result>HelloWorld.jsp</result> 。这个时候就和调用这个 action 的路径相关了。可以这样进行匹配,首先得到请求这个 action 的 url ,然后去掉最后一个“ / ”后面的内容,再把 HelloWorld.jsp 接上去即可。例如,我们是通过 http://localhost/Struts/aa//bb/cc/HelloWorld.action 调用的 action ,那么匹配出来的 url 就是 http://localhost/Struts/aa//bb/cc/HelloWorld.jsp 。