两个问题
- 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();
}
}
}
}