深入理解+图解 java转发与重定向

请求的转发和重定向的本质区别:
在于我们当使用转发时,jsp容器将使用一个内部方法来调用我们想要转发的页面,新的页面处理另一个请求,全过程只有一个url 而在此过程中Web浏览器是不清楚这个重新调用的过程。
而重定向是一个页面通知浏览器发送一个新的页面请求,所以Web浏览器是发送了2次请求,浏览器中的url是会发生改变的,会变成新的URL。
重定向

例子中重定向的过程:
点击 Redirect 进行重定向
1. RedirectServlet 类(执行重定向到 testServlet类)`package com.atigu.javaweb;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RedirectServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("RedirectServlet's doGet");

    request.setAttribute("name", "xyzmn");
    System.out.println("RedirectServlet's name: " + request.getAttribute("name"));
    //执行请求的重定向, 直接调用 response.sendRedirect(path) 方法,
    //path 为要重定向的地址
    String path = "testServlet";
    response.sendRedirect(path);
}

}`
testservlet (重定向到的servlet)

package com.atigu.javaweb;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("TestServlet's doGet 方法. ");

        System.out.println("TestServlet's name: " + request.getAttribute("name"));

    }

}

esponse.sendRedirect()方法是重定向的核心方法
转发
ForwardServlet

package com.atigu.javaweb;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ForwardServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ForwardServlet's doGet");

        request.setAttribute("name", "abcde");
        System.out.println("ForwardServlet's name: " + request.getAttribute("name"));

        //请求的转发.
        //1. 调用 HttpServletRequest 的 getRequestDispatcher() 方法获取  RequestDispatcher 对象
        //调用 getRequestDispatcher() 需要传入要转发的地址
        String path = "testServlet";

        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/" + path);

        //2. 调用 HttpServletRequest 的 forward(request, response) 进行请求的转发. 
        requestDispatcher.forward(request, response); 

    }

}

RequestDispatcher 实例对象是由Servlet对象创建的,它用于包装一个要被其他资源调用的资源,其接口中定义了两个方法(forward, include)。这两个方法接受的两个参数传递给当前Servlet 的service方法的ServiceRequest 和Servletresponse对象,

显示页面

<body>

    <a href="loginServlet">Test</a>

    <br><br>

    <a href="forwardServlet">Forward</a>

    <br><br>

    <a href="redirectServlet">Redirect</a>
</body>

请求转发流程总结:
这里写图片描述
1. 在请求转发中,Web 浏览器发出HTTP请求到Web容器中,Web容器首次访问,容器才创建目标Servlet , Web 容器创建请求和响应对象(request、response)
2. web容器调用Servlet的Service(ServletRequest req,ServletResponse res) 方法, 根据Servlet 写入响应信息,发出forward命令到Web容器中。
3. Web容器初次访问创建的Servlet2,并调用Servlet2的service方法返回Web容器的响应
4. 然后Servet1 service 方法返回到Web容器中
5. 读取响应信息,发出http响应。 这里写图片描述
6. 请求重定向
关键在于其Web容器子啊读取Servlet响应信息后。 这里写图片描述
发送HTTP响应给浏览器
这里写图片描述
然后Web浏览器重新发送包含重定向HTTP信息
这里写图片描述
总结具体区别点:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.
④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值