forward、redirect、浏览器的路径问题


浏览器:

1、路径以“/”开头,浏览器会把http://localhost:8080/作为根目录

<img src="http://images.cnblogs.com/mark_arrow_03.gif" width="14" height="14"/> 在sysmgr文件中。

浏览器请求:http://zmg-pc:8088/images/mark_arrow_03.gif   失败

2、路径以“../”开头,浏览器会把当前所在的目录作为根目录,查找上一级目录

<img src="../images/mark_arrow_03.gif" width="14" height="14"/> 在sysmgr文件中。

浏览器请求:http://zmg-pc:8088/DRP/images/mark_arrow_03.gif   成功

3、以文件名开头,浏览器会把当前所在的目录作为根目录,查找子目录

<img src="images/mark_arrow_03.gif" width="14" height="14"/> 在sysmgr文件中。

浏览器请求:http://zmg-pc:8088/DRP/sysmgr/images/mark_arrow_03.gif  失败

 

 

forward,redirect

在相对路径上,两者的表现是相同的

看看lingo-sample/03-03/这个例子,如果我们去请求relative/forward.jsp或redirect.jsp,然后从这里再转向它下面的result/result.jsp会怎样呢?

  1. forward的例子:

    <%request.getRequestDispatcher("result/result.jsp").forward(request, response);%>

    这里的相对路径就是result/result.jsp。

    因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行forward的时候会寻找当前路径下的result/result.jsp,/03-03/relative/result/result.jsp,找到之后便转发请求。

  2. redirect的例子:

    <%response.sendRedirect("result/result.jsp");%>

    这里的相对路径也是result/result.jsp。

    因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,
    执行redirect的时候会把当前路径加上(相当于寻找当前路径下)result/result.jsp,把结果作为重定向的地址发送给浏览器,
    浏览器再去请求/03-03/relative/result/result.jsp,从而得到响应。

3.4.1.2. 绝对路径

问题出现了,绝对路径在forward和redirect中出现了差别,还是刚才的情况,但使用绝对路径的时候写法便不同了。

  1. forward的例子:

    <%request.getRequestDispatcher("/relative/result/result.jsp").forward
    (request, response);%>

    这里的绝对路径就是/relative/result/result.jsp。

    在本地测试时,forward把http://localhost:8080/03-03/当作根路径,在它的基础上计算绝对路径。为什么?

    因为这是由jsp的部署方式决定的,webapp里可以放好多项目,为了让这些项目可以互不影响、独立运行,不能让请求从一个项目直接在服务器内部转移到另一个项目。为了防止出现这种情况,Tomcat在执行forward的时候干脆把项目的路径当作根目录,开发者看不到其他项目,也就不会出现问题了。

  2. redirect的例子:

    <%response.sendRedirect("/03-03/absolute/result/result.jsp");%>

    这里的绝对路径却是/03-03/absolute/result/result.jsp。

    在本地测试时,redirect把http://localhost:8080/当作根路径,在它的基础上计算绝对路径。

    因为redirect会让浏览器重新发起一个新请求,所以不会搅乱服务器里多个项目之间的关系,
    也就不需要对它做限制,如果需要在多个项目之间进行跳转,就只能使用redirect。不过因为
    重新发起了新的请求,上次请求的那些数据都会丢失,如果有什么重要的数据,记得要重新设置。

总结:

以“文件名开头”,相对路径,都在当前目录下找。

以“../”开头的,相对路径,都在当前目录的上一级目录找。

以“/”开头,绝对路径,forward以当前项目文件为根目录找,浏览器和redirect以http://localhost:8080/为根目录找。

posted @ 2012-04-15 17:09  松门一枝花  阅读(4460)  评论(0编辑  收藏  举报