原理
请求转发是servlet 内部调用;重定向是两次请求和响应
区别
请求转发 | 重定向 |
---|---|
一次请求一次响应 | 两次请求两次响应 |
地址栏不会变化 | 地址栏会变化 |
路径不带工程名 | 带工程名路径(是浏览器执行的操作) |
只能在本网站内部 | 可以定向到任何网站 |
如果需要用request域去保存数据,必须使用请求转发,不能使用重定向
因为request域的作用范围只在同一次请求和响应中有效。响应结束后就失效了
l 注意:
如果需要使用request进行值传递(共享),需要通过请求转发完成。如果页面需要跳转到其他网站上必须使用重定向。
演示一
先创建两个jsp文件
1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-16"
pageEncoding="UTF-16"%>
<% session.setAttribute("key", "1000");%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Insert title here</title>
</head>
<body>
<%=session.getAttribute("key")%>
<a href="./dataServlet">点击</a>
</body>
</html>
2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-16"
pageEncoding="UTF-16"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Insert title here</title>
</head>
<body>
<%=session.getAttribute("key") %>
</body>
</html>
请出我们的主角
dataServlet.java文件
package com.jd.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class dataServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("2.jsp").forward(request, response);
// response.sendRedirect("2.jsp");
}
}
操作步骤:
启动服务器,访问1.jsp,可以看到浏览器地址栏地址变为http://127.0.0.1:8080/nice/1.jsp,打开控制台可以看到
下边就是见证奇迹的时刻;
点击之后可以发现地址栏变成http://127.0.0.1:8080/nice/dataServlet,
在控制台可以看到
下边我们将dataServlet.java中注释掉的语句解开注释,将它上边那句注释掉,来演示重定向;
再次点击:
发现浏览器地址变为http://127.0.0.1:8080/nice/2.jsp
不仅如此控制台的输出结果也变为如下
通过这些信息我们可以知道,2.jsp的initiator(启动程序)是dataServlet,即请求的响应中包含了重定向的地址。
在重定向方式中,请求是页面重新发送的,所以在请求中获取不到原始要提交的数据。即使在重定向前对原始请求做了处理,也是徒劳的。原因是请求对象和响应的对象的生命周期只存在于一次请求和响应中。客户端第一次发出请求,此时的请求为请求A,服务器接收到请求,生成对应的响应,然后程序遇到重定向语句,无论此时的请求和响应是什么,响应都会变成固定的:状态码为302,响应数据中包含重定向的组件地址。在浏览器响应之后,请求A和响应都消失了,然后浏览器自动的发出新的请求B。
演示二
只需要改动一下dataServlet的一部分即可
package com.jd.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class dataServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("http://baidu.com").forward(request, response);
// response.sendRedirect("http://baidu.com");
}
}
启动服务器后,访问1.jsp,现在还没有出现问题呢,但是当我们点击之后
but如果我们注释掉上边的语句,解开下边语句的话再点击则是百度的页面了
推一篇说的比较通俗的
Servlet应用中重定向与请求转发的区别