请求转发(Forward)和重定向(Redirect)

 

1、重定向(Redirect)

是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL

1、工作原理:

          用户第一次通过手动方式通过浏览器访问OneServlet,OneServlet工作完毕后,将TwoServlet地址写入到响应头, localhost属性中,导致tomcat将302状态码写入到状态行。

         在浏览器接收到响应包后,会读取到302状态,此时浏览器自动根据响应头中的localhost属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务。

2、servlet的实现命令:

           response.sendRedirect("请求地址");

           将地址写入到响应包中的响应包中

3、特点:

           1)浏览器地址栏会发生变化

           2)请求次数:

                  浏览器至少发送两次请求,但是只有第一次请求是用户手动发送的,后续请求都是浏览器自动发送

           3)请求方式:

                 重定向解决方案中,通过地址栏通知浏览器发起下一次请求,第一次是用户发起的可以是GET或者POST,但是后面的请求都是GET请求  (很简单验证,在get|post输出不同的内容,看控制台输出什么)

           4)缺点:

                 重定向方案需要在浏览器与服务器之间进行多次往返,大量事件消耗在往返上,增加用户等待服务时间

图解:

         分析过程:

              (1) 浏览器发送了两次请求

              (2)浏览器的地址发生改变

              (3)请求过程产生了两个request和两个response请求

              (4)两个servlet不共享同一个request和response

              (5)通过response.sendRedirect(url)方式实现

就好比:你向A去借钱,但是A没有钱,A告诉你B有钱,然后你自己在去向B借钱

代码演示:

@WebServlet("/One")
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost方法执行");
        //重定向解决方案
        resp.sendRedirect("Two");
    }
}

//另一个Servlet
@WebServlet("/Two")
public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("西红柿炒鸡蛋");
    }
}

页面: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>静态页面</title>
</head>
<body>
    <form action="One" method="post">
        <table>
            <tr>
                <td>姓名</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr>
                <td>年龄</td>
                <td><input type="text" name="age"></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input type="submit" value="提交"></td>
            </tr>
        </table>
    </form>
</body>
</html>

2、请求转发(Forward)

是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.

1、工作原理:

        1)用户第一次通过手动方式要求浏览器访问OneServlet

        2)Oneservlet工作完成后,通过当前的请求对象代替浏览器向Tomcat发送请求申请调用TwoServlet

        3)Tomcat接收请求后,自动调用TwoServlet来完成剩余的任务

2、实现命令:

        通过当前请求对象生成资源文件申请报告对象

                RequestDispathcher report = request.getRequestDispatcher("/资源文件名")

        将报告对象发送给Tomcat

                report.forward(request,response);

        例如:request.getRequestDispatcher("1.jsp").forward(request,response);

3、优点:
                1)无论本次请求涉及到多少servlet,浏览器只是发送一次请求
              
 2)Servlet之间调用发生在服务器计算机上,节省服务器与浏览器之间往返次数
                      增加处理服务速度

 4、特征

         1)请求次数
                        在请求发送过程中,浏览器只是发送一次请求
                2)请求地址:
                       只能向tomcat服务器申请调用当前网站下的资源文件地址
                3)请求方式
                      根据客户端而定
                      在请求转发的过程中,浏览器只是发送一个Http请求协议包,参与本次请求的所有的servlet共享一个请求协议包
                      因此这些servlet接收的请求方式与浏览器发送的请求方式保持一致

              简单说:就是用户第一发起什么请求,后面的转发就是什么请求

     图解:

简单说:就好比你向A借钱,但是A没有钱,所以A跑去向B借钱,然后把借来的钱给你

     分析过程:

(1)浏览器只发送了一次请求

(2)浏览器的地址栏不会发生改变

(3)请求过程中只产生一个request和response对象

(4)几个Servlet共享同一个request和response对象

(5)通过 request.getRequestDispatcher("xxx").forward(request,response)方式实现

3、两者的区别:

重定向请求转发

1、请求次数,至少两次

2、浏览器地址栏发生改变

3、不可以共享request | response 域中的数据

4、不可以转发到WEB-INF目录下

5、第一次是用户发起的可以是GET或者POST,但是后面的请求都是GET请求

1、请求次数只有一次

2、浏览器地址栏不发生改变

3、可以共享request | response域的数据

4、可以转发到WEB-INF目录下

5、用户第一发起什么请求,后面的转发就是什么请求

 

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值