本文转载自:https://blog.csdn.net/qq_39095899/article/details/106034954
转发和重定向
重定向 redirect
response.sendRedirect("login_success.html");
- 浏览器地址栏显示的是最后的那个资源的路径地址,
会发生改变 - 请求次数最少有两次, 服务器在第一次请求后,会返回
302 以及一个地址 Location , 浏览器在根据这个地址,执行第二次访问 - 可以跳转到任意路径;不是自己的工程下的路径也可以跳
- 重定向
无法 将请求域中的数据带到目标页面(没法使用上一次的 request 对象,因为这是两次不同的请求)
转发 forward
RequestDispatcher rd = request.getRequestDispatcher("login_success.html");
rd.forward(request, response);
- 浏览器地址栏显示的还是转发之前的地址,
不会变 - 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作
- 只能跳转自己项目的资源路径
- 请求转发
可以 将请求域中的数据带到目标页面(使用的始终是同一个 request 对象,对客户端来说只发了一次请求,那就只有一个 request 对象)
重定向和转发对比
转发和重定向的区别:
- 转发在一次请求中完成;重定向是两次请求
- 转发操作发生在服务器内部;重定向是浏览器执行操作
- 转发浏览器地址栏不变(只有一次请求,一个地址);重定向浏览器地址栏变化(两次请求,两个地址)
- 转发可以在一次请求中共享数据;重定向不行(重定向两次请求,每次都会创建新的
request 对象)
代码测试
index.jsp 页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>导航页</title>
</head>
<body>
<a href="jump?action=forward">请求转发</a> <br />
<a href="jump?action=redirect">重定向</a>
<hr />
</body>
</html>
target.jsp 页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>请求转发、重定向 — 目标页面</title>
</head>
<body>
<h1>我是target.jsp</h1>
通过请求作用域传过来的参数(man):${man }
</body>
</html>
JumpPageServlet 类
@WebServlet(description = "请求转发和重定向示例", urlPatterns = { "/jump" })
public class JumpPageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
switch(action) {
case "redirect":
doRedirect(request, response);
break;
case "forward":
doForward(request, response);
break;
default:
break;
}
}
private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("man", "黑旋风 . 李逵");
request.getRequestDispatcher("target.jsp").forward(request, response);
}
private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setAttribute("man", "黑旋风 . 李逵");
response.sendRedirect("target.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
测试
重定向
在浏览器中访问你项目下的 index.jsp
点击重定向,结果如下所示
地址上显示的是最后的那个资源的路径地址,可以看出得不到域中得值 黑旋风 . 李逵 ,重定向无法将请求域中的数据带到目标页面
- 没法使用上一次的
request 存储的数据, - 确切的说是没法使用上一次的request对象,因为这是两次不同的请求
转发
返回导航页 index.jsp 中点击请求转发可以看到结果如下
可以获取到作用域中的值,并且地址栏中的地址没有发生变化。请求转发可以将请求域中的数据带到目标页面
重定向可以跳转任意路径
private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setAttribute("man", "黑旋风 . 李逵");
response.setHeader("Refresh"," 3;url=http://www.jd.com");
}
重定向成功
转发不可以跳转任意路径只能是自己项目下的
测试如下把之前的注释上打开下面那个
private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("man", "黑旋风 . 李逵");
request.getRequestDispatcher("https://www.baidu.com").forward(request, response);
}
转发百度失败
|