java web 中的转发和重定向

假设应用程序的 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 中的转发和重定向,布布扣,bubuko.com

时间: 2024-10-16 05:20:14

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

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

1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAttribute()取出数据 3.在AServlet转发到BServlet,那么整个请求都是由BServlet来完成,AServlet不再插手 4.AServlet 包含BServlet,那么两个Servlet共同完成请求 5.请求转发和请求包含都需要使用一个对象RequestDispatcher. A

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

在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendRedirect(path); 情况二.指向内部的web组件和本身有关系的,这一类我暂时看到的有:servlet或者jsp的转发 假设在myapp项目下有

java web中路径问题。

转自:http://blog.csdn.net/liang5630/article/details/38474543 如有侵权,请及时联系本人及时删除 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendR

CKEditor4 在java web中的应用说明(详细可行)

按照官方的说明书就可,这里主要注意一点!! 就是<script src="../ckeditor.js"></script>中js文件的路径问题,我的ckeditor文件夹是在WebContent文件夹下,jsp文件是同一层目录的,所以最后的代码应该是 <script type="text/javascript"src="./ckeditor/ckeditor.js"></script> 注意斜杆号

jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)

一 简介和实现效果 这里用一个小例子来简单举例说明,做一个搜索引擎搜索提示效果,通过不断输入字符,然后在下方给出搜索提示.效果图如下: 通过上图可以看到,当输入一个"a"时,提示了很多内容,然后继续输入一个"e"后,提示的范围明显就变小了. 注:在文末我会给出完整源代码的下载链接,以供大家参考 二 具体实现 1 在eclipse for java ee中创建一个Java Web工程,然后导入相应的jar包,特别说明的是:这里要导入一个额外的dwr.jar.也就是说,

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

根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集. System.out.println(System.getProperty("file.encoding")); a1.如果是不支持中文的就要设置jvm编码了,设置方法: Windows环境就在catalina.bat配置: s

Java Web中涉及的编解码

用户从浏览器发起一个HTTP请求,存在编码的地方是URL.Cookie.Paramiter.服务器端接收到HTTP请求后要解析HTTP协议,其中URL.Cookie和POST表单参数要解码,服务器端可能还需要读取硬盘数据(数据库.文件),这些数据都可能存在编码问题.当Servlet处理完所有请求的数据后,需要将这些数据再编码通过Socket发送到用户请求的浏览器里,再经过浏览器解码成为文本.这些过程用图表示如下: 1.URL的编解码 为了验证浏览器是怎么编码URL的,我们选择FireFox浏览器

servlet中的转发和重定向问题

重定向和请求转发在学习servlet的时候很容易混淆,故在此特意记录. 1. 重定向---------sendRedirect()方法 Servlet响应请求有两种方式,一个是重定向,返回一个页面给客户端,另一种方式是直接向客户端输出内容. 重定向功能是让浏览器重新发生请求,但是将请求的是另外一个Servlet. A.使用方法: response.sendRedirect("/ServletProject/fristServlet"). forward(request, respons

java web中的request和respone

response和request ------------------ 服务器处理请求的流程: 服务器每次收到请求时,都会为这个请求开辟一个新的线程. 服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!(袋子) 服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应.(手机) ------------------ response:其类型为HttpServletResponse ServletResponse-->与协议无