本文转载自:https://blog.csdn.net/qq_39095899/article/details/106034954
redirect
/*
* 之前的写法
* response.setStatus(302);
* response.setHeader("Location", "login_success.html");
*/
// 重定向写法: 重新定位方向 参数即跳转的位置
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"%>
<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"%>
<html>
<head>
<meta charset="UTF-8">
<title>请求转发、重定向 — 目标页面title>
head>
<body>
<h1>我是target.jsph1>
通过请求作用域传过来的参数(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 {
// 请求转发到target.jsp页面
request.setAttribute("man", "黑旋风 . 李逵");
request.getRequestDispatcher("target.jsp").forward(request, response);
// request.getRequestDispatcher("https://www.baidu.com").forward(request, response);
}
// 通过重定向的方式跳转页面
private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 重定向到target.jsp页面
// 重定向无法将请求域中的数据带到目标页(究其根本原因是因为两次请求不是同一个请求对象)
// 就好比如下代码:
// Student stu1 = new Student();
// stu1.setSname("宋江");
// Student stu2 = new Student();
// System.out.println(stu2.getSname());
request.setAttribute("man", "黑旋风 . 李逵");
response.sendRedirect("target.jsp");
// 重定向不仅可以调到项目内部地址,还能调到任意地址
//设置重定向响应头 // response.setHeader("location","http://www.taobao.com");
//设置状态码 //response.setStatus(302);
//============上面代码的简化方式======================
//response.sendRedirect("http://www.taobao.com");
// response.setHeader("Refresh"," 3;url=http://www.jd.com");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
在浏览器中访问你项目下的 index.jsp
点击重定向,结果如下所示
地址上显示的是最后的那个资源的路径地址,可以看出得不到域中得值 黑旋风 . 李逵
,重定向无法将请求域中的数据带到目标页面
request
存储的数据,返回导航页 index.jsp
中点击请求转发可以看到结果如下
可以获取到作用域中的值,并且地址栏中的地址没有发生变化。请求转发可以将请求域中的数据带到目标页面
private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 重定向到target.jsp页面
// 重定向无法将请求域中的数据带到目标页(究其根本原因是因为两次请求不是同一个请求对象)
// 就好比如下代码:
// Student stu1 = new Student();
// stu1.setSname("宋江");
// Student stu2 = new Student();
// System.out.println(stu2.getSname());
request.setAttribute("man", "黑旋风 . 李逵");
//response.sendRedirect("target.jsp");
// 重定向不仅可以调到项目内部地址,还能调到任意地址
//设置重定向响应头 // response.setHeader("location","http://www.taobao.com");
//设置状态码 //response.setStatus(302);
//============上面代码的简化方式======================
//上面那个重定向关闭下面两个打开一个就可以看到结果
//重定向跳转淘宝主页
//response.sendRedirect("http://www.taobao.com");
//当前页面停留3秒钟之后跳转到京东首页
response.setHeader("Refresh"," 3;url=http://www.jd.com");
}
重定向成功
测试如下把之前的注释上打开下面那个
private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 请求转发到target.jsp页面
request.setAttribute("man", "黑旋风 . 李逵");
// request.getRequestDispatcher("target.jsp").forward(request, response);
request.getRequestDispatcher("https://www.baidu.com").forward(request, response);
}
转发百度失败