sendRedirect()之后的代码是否会继续执行

两个问题

  1. Servlet中,重定向之后的代码是否会继续执行?
  2. 重定向是在所有代码执行完毕后跳转,还是执行到重定向代码时立即跳转?

设计代码

在重定向之前和之后让程序各循环sleep五秒,在控制台打印输出,看页面在什么阶段跳转

//重定向前循环sleep五秒
for (int i = 0; i < 5; i++) {
    System.out.println("before redirect:" + i);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

//重定向
response.sendRedirect("result.jsp");

//重定向后循环sleep五秒
for (int i = 0; i < 5; i++) {
    System.out.println("after redirect:" + i);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

结果

testRedirectServlet.gif
可以发现:控制台打印了5个before redirect和5个after redirect之后,页面刷新,浏览器地址改变,页面内容改变
1. 重定向之后的代码会继续执行
2. 当前程序所有代码执行完毕后,才会执行重定向跳转

引申

1.重定向之后,加上return,可让之后的代码不再执行

boolean flag = true;
if (flag) {
    response.sendRedirect("result.jsp");
    return;
}

控制台打印了5个before redirect之后,页面刷新,浏览器地址改变,页面内容改变
testRedirectServletReturn.gif

2.转发,request.getRequestDispatcher().forward(),与重定向一样,转发之后的代码也会执行,所有代码执行完毕才跳转
回车后,控制台输出完毕,页面刷新,浏览器地址没有改变,页面内容改变
testDispatcherServlet.gif

3.jsp的本质就是Servlet,所以jsp页面执行转发或者重定向,以上结论同样适用

附:测试代码

TestRedirectServlet.java

package com.redirect.test;

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

/**
 * Servlet implementation class TestRedirect
 */
@WebServlet("/TestRedirectServlet")
public class TestRedirectServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //重定向前循环sleep五秒
        for (int i = 0; i < 5; i++) {
            System.out.println("before redirect:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //重定向
        response.sendRedirect("result.jsp");

        //重定向后循环sleep五秒
        for (int i = 0; i < 5; i++) {
            System.out.println("after redirect:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


TestDispatcherServlet.java

package com.redirect.test;

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

@WebServlet("/TestDispatcherServlet")
public class TestDispatcherServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //转发前循环sleep五秒
        for (int i = 0; i < 5; i++) {
            System.out.println("before dispatcher:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //转发
        request.getRequestDispatcher("result.jsp").forward(request, response);

        //转发后循环sleep五秒
        for (int i = 0; i < 5; i++) {
            System.out.println("after dispatcher:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值