相信大家在刚刚接触到,Javaweb的时候都会对转发和重定向有着或多或少的迷惑和误解,下面我就通过这篇文章来讲解一下转发与重定向的区别。
大家都知道在servlet中页面跳转有两种实现方法,一种是转发一种是重定向,那么这两种方法都分别有什么特点,两者又有什么区别呢,接下来我将在文章中一一介绍。
一.转发
什么叫转发?
req.getRequestDispatcher("/customer.jsp").forward(req, resp);
这句代码就可实现转发的操作。首先req.getRequestDispatcher("/customer.jsp") 获得了一个转发器对象,然后再通过 .forward(req, resp) 方法来把之前的request和response对象转发过去,这样原来通过setAttribute存在request中的值就不会丢失了。
转发是如何实现的嘞?
转发操作,首先从客户端发送一个请求到服务器中,找到当前组件(servlet1),把组件中的request和response对象通过 .forowrd 方法发送到目标组件(servlet2)中,最后再由目标组件(servlet2)给予客户端以响应。其中最重要的部分从servlet1到servlet2转发的全过程都是发生在服务器中的。
转发的特点
- URL不变,显示的还是上一个URL
- 只发送一次请求,跳转是在服务器中实现的
- request对象中的值不丢失
- 只能在本web域中进行跳转
二.重定向
什么叫重定向?
resp.sendRedirect("/login.jsp"); 可以实现重定向的操作,重定向不能读取之前request中保存的参数,只能实现页面的跳转,不过可以实现跨容器跳转,即可以访问不同的javaWeb。
重定向是如何实现的?
首先先由客户端发送一个请求到当前组件(servlet1)中,之后由 resp.sendRedirect("/login.jsp"); 给予客户端一个包含目标组件地址的响应,再由客户端发送一个请求给目标组件(servlet2),目标组件接收到请求后,给出响应完成页面跳转。在整个过程中浏览器至少完成两次请求。
重定向的特点:
- 会显示新的URL
- 发送两次请求
- request对象中的值会丢失
- 可以进行跨域访问
三.转发与重定向的对比
1.转发与重定向的路径问题
- 对于相对路径来说两者并没有什么区别
- 对于绝对路径两者则是存在着不小的差别。重定向中/指的Tomcat的根目录,写绝对路径应该写成"/当前Web程序根名称/资源名" 。如"/customerMangement/login.jsp","/customerMangement/servlet/LoginServlet"
转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序。绝对路径写法就是"/login.jsp"或"/servlet/LoginServlet"。 - 以上要注意是区分是从服务器外的请求,还在是内部转发,从服务器外的请求,从Tomcat的根写起;服务器内部的转发/写起指的就是当前Web的根目录。
2.转发与重定向的区别
-
request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。
-
response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求。
所以转发中数据的存取可以用request作用域:request.setAttribute(),
request.getAttribute(),重定向是取不到request中的数据的。只能用session。
区别 | 转发 | 重定向 |
---|---|---|
地址栏 | 不会发生变化 | 会发生变化 |
请求次数 | 1次 | 2次 |
request对象中的数据 | 不会丢失 | 会丢失 |
跳转位置 | 服务器中 | 客户端中 |
访问域 | web容器内 | 可以跨域跳转 |
以上就是今天所要介绍的内容,谢谢观看,如果有帮助请您点个赞,谢谢!