您的位置:首页 > 编程语言

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

2017-03-29 01:26 197 查看

两个问题

Servlet中,重定向之后的代码是否会继续执行?

重定向是在所有代码执行完毕后跳转,还是执行到重定向代码时立即跳转?

设计代码

在重定向之前和之后让程序各循环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();
}
}


结果



可以发现:控制台打印了5个before redirect和5个after redirect之后,页面刷新,浏览器地址改变,页面内容改变

1. 重定向之后的代码会继续执行

2. 当前程序所有代码执行完毕后,才会执行重定向跳转

引申

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

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


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



2.转发,request.getRequestDispatcher().forward(),与重定向一样,转发之后的代码也会执行,所有代码执行完毕才跳转

回车后,控制台输出完毕,页面刷新,浏览器地址没有改变,页面内容改变



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();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: