resp.setHeader()与resp.sendRedirect()的区别——网页定时刷新并跳转案例实现
通过这个案例也许可以更好了理。resp.setHeader()与resp.sendRedirect()的区别;
首先说明
resp.setHeader()与resp.sendRedirect()的区别;
两者都可以实现页面跳转的效果,但实现原理略有不同。
- resp.setHeader(“Refresh”, “2;url=[]”);是通过设置响应头部的Refresh属性,在指定时间后刷新当前页面或跳转到指定页面;
- resp.sendRedirect()是通过发送一个302状态码和Location头部来实现页面的重定向,这会终止当前请求并告诉浏览器重定向到新的URL。
设计思路(实现原理)
1) 创建ReqServlet1类,编写跳转功能
2) 在web.xml中配置初始化参数和类的映射(这里我们直接用注解来配置servlet)
3)通过浏览器访问ReqServlet1,查看浏览器跳转效果。
案例实现
尝试使用Thread.sleep() ,timer.schedule() ,最后使用resp.setHeader()成功实现案例。
复现
使用Thread.sleep() ,直接重定向没有展示信息,分析原因后尝试更换使用timer.schedule()方法。
resp.sendRedirect("baidu.");
访问/ReqServlet1直接跳转了
原因
在Servlet中,一旦调用了resp.sendRedirect()
方法,就会立即向客户端发送302重定向响应,这会终止当前请求并告诉浏览器重定向到新的URL。因此,即使在调用resp.getWriter().write("");
后有一个2秒的延迟,但是在调用resp.sendRedirect("")
之后立即这会终止当前请求并告诉浏览器重定向到新的URL,不会展示resp.getWriter().write("")
。可以在前端页面中设置一个定时跳转的功能,这里不做讨论。
使用timer.schedule() ,只是展示resp.getWriter().write()内容,手动刷新后才会重定向到baidu,分析原因后尝试更换使用resp.setHeader()方法。
没有经行跳转
原因是:resp.getWriter().write("注册成功,页面2秒后跳转到首页");
这行代码已经向客户端发送了响应,resp
对象会被销毁,所以需要手动刷新一次,resp
会被重新创建才能进行重定向。
成功跳转使用resp.setHeader()
package com.gd.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author LFXIANG
* description TODO
* @title ReqServlet1
* date 2024/3/27 19:41
*/
@WebServlet("/ReqServlet1")
public class ReqServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("注册成功,页面2秒后跳转到首页");
// 设置响应头部的Refresh属性来实现在2秒后自动跳转到百度网站。
resp.setHeader("Refresh", "2;url=http://www.baidu.com");
}
}