假设应用程序的 contextPath 为 /ctx,在 http://localhost:8080/ctx/a/b 资源中,我们转发和重定向到 http://localhost:8080/ctx/x/y 资源,分别应该怎么写?

转发,是在同一个应用程序中,请求从由资源 A 处理,到由资源 B 处理。资源 A 和资源 B 属于同一个应用程序的资源,它们总是相对于该应用程序的 contextPath 而言的。转发的资源可以使用相对路径(不以 "/" 开头)和绝对路径(以 "/" 开头,这里的绝对,其实也是相对于某个环境而言的)。转发的资源若使用 "/" 开头,代表的是该资源在该应用程序中是绝对的,注意,是在应用程序的这个前提下是绝对的。
资源 A = http://localhost:8080/ctx/a/b,资源 B = http://localhost:8080/ctx/x/y。在资源 A 中 getRequestDispatcher("/x/y"),由于是以 "/" 开头,因此在应用程序内部是绝对的,即在 http://localhost:8080/ctx 这个环境下,/x/y 代表的是绝对地址。注意,我并没有写 getRequestDispatcher(request.getContextPath() + "/x/y"),这样写的话,同样是在 http://localhost:8080/ctx 这个环境下的绝对地址为 request.getContextPath() + "/x/y",那么完整的资源是 http://localhost:8080/ctx/ctx/x/y,并不是我们所期望的资源。
在资源 A 中 getRequestDispatcher("x/y") 会如何呢?由于转发的资源不是以 "/" 开头,因此它是一个相对地址,相对于谁呢?相对于做转发操作的资源的地址,即相对于 http://localhost:8080/ctx/a/b,其路径为 http://localhost:8080/ctx/a,因此,转发后的资源的地址为 http://localhost:8080/ctx/a/x/y!如果由资源 /ctx/a/b 转发到 /ctx/a/c,由于这两个资源所处的路径相同,我们当然可以这样写:getRequestDispatcher("c")
综上所述,不建议使用相对路径来转发资源。尽量使用绝对地址来转发资源,同时,不要在资源的前面又画蛇添足的加上 request.getContextPath(),因为转发操作本来就是在同一个应用程序之间来处理的!

重定向,不仅可以重定向到当前应用程序(http://localhost:8080/ctx)中的其它资源,还可以重定向到同一个站点上的其它应用程序(http://localhost:8080/another)中的资源,甚至是使用绝对 URL 重定向到其它站点的资源。
被重定向的资源若是以 "/" 开头,如 /x/y,实际上是相对于主机而言的,即完整的资源路径为 http://localhost:8080/x/y,这并不是我们想要的资源。
被重定向的资源若不是以 "/" 开头,如 x/y,实际上是相对于做重定向操作的资源(http://localhost:8080/ctx/a/b)而言的,即完整的资源路径为 http://localhost:8080/ctx/a/x/y,这也不是我们想要的资源。当然,使用这种方式,我们重定向到 /ctx/a/c,即 sendRedict("c") 当然是没问题的。
使用绝对 URL 还可以将资源重定向到其它站点的资源。
综上所述,做重定向操作时,若想重定向同一个应用程序的其它资源时,同样不推荐使用相对路径,尽量使用绝对路径,同时,务必在资源前面加上 request.getContextPath()。

一句话总结:创建 RequestDispatcher 对象时指定的 URL 以“/”开头,它是相对于当前 WEB 应用程序的根目录;HttpServletResponse.sendRedirect 方法的 URL 以“/”开头,它是相对于整个 WEB 站点的根目录。

java web 中的转发和重定向的更多相关文章

  1. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

  2. java web中servlet、jsp、html 互相访问的路径问题

    java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...

  3. java web中路径问题。

    转自:http://blog.csdn.net/liang5630/article/details/38474543 如有侵权,请及时联系本人及时删除 在java web种经常出现 404找不到网页的 ...

  4. Java Web 中 过滤器与拦截器的区别

    过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...

  5. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

  6. Java web中常见编码乱码问题(一)

    最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...

  7. Java web中常见编码乱码问题(二)

    根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...

  8. 深入分析Java Web中的编码问题

    编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...

  9. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...

随机推荐

  1. Android 如何把一个 RelativeLayout或ImageView背景设为透明

    在项目中,需要把RelativeLayout 和  ImageView背景设置为透明,怎么实现呢?这里主要通过代码,请参阅以下关键代码: public ImageView imgDetail; pri ...

  2. IPV6 实现

    看代码实现前,请先保证了解ipv6的概念,可以先看ipv6介绍一文.code extract . 在文件 net/ipv6/af_inet6.c 中包含了ipv6协议初始化的主函数. static i ...

  3. Linux修改文件时候出现崩溃,产生了一个.swap交换文件,如何修复?

    有时候在用vim打开文件时提示类似以下的信息: E325: 注意 发现交换文件 ".exportcert.cpp.swp" 所有者: liuchuanliang    日期: Th ...

  4. 【转】Android自定义控件

    原文网址:http://blog.163.com/ppy2790@126/blog/static/103242241201382210910473/ 开发自定义控件的步骤: 1.了解View的工作原理 ...

  5. IIS出现Server Error in '/' Application.CS0016的解决办法

    这两天一直在弄IIS的事,全都是报错,网上找了好多资料,也尝试了很多,终于在几分钟之前把困扰了我一周的麻烦给解决了,现整理出来,希望对大家有用,闲话少说,直接上图了 Server Error in ' ...

  6. Devexpress GridView部分常用操作总结 z

    一:Clone返回新的 DataTable Clone返回新的 DataTable,与当前的 DataTable 具有相同的架构:Copy:返回新的 DataTable,它具有与该 DataTable ...

  7. 转载--C++中struct与class

    转自:http://www.cnblogs.com/york-hust/archive/2012/05/29/2524658.html 1. C++中的struct对C中的struct进行了扩充,它已 ...

  8. HDOJ --- 1159 Common Subsequence

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. selenium webdriver 环境搭建--java

    selenium java环境的安装可以分为三个部分:jdk.eclipse和selenium. jdk jdk(java development kit)是sun公司针对java开发人员的产品,是整 ...

  10. HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...