1.两者区别
1.请求转发:地址栏是初次发送请求的地址
请求重定向:地址栏不在是初次发出的请求地址,地址栏为最后响应的那个地址
2.请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象
请求重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象
3.请求转发:只能转发给当前的web应用资源
请求重定向:可以重定向任何资源
请求重定向与请求转发的比较,HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别。 1.RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件,HttpServletResponse.sendRedirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到痛一个站点上的其他应用程序的资源,甚至是使用绝对URL重定向到其他站点的资源。对于sendRedirect如果传递的URL以"/"开头,他是相对于整个Web站点的根目录,相当于localhost:8080/xxx.jsp;对于forward如果传递的URL以"/"开头,它是相对于当前Web应用程序的根目录 相当于localhost:8080/YourWeb/xxx.jsp。 2.sendRedirect对浏览器做出的响应是重新发出对另外一个URL的访问请求,forward在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果 3.forward的调用者与被调用者之间共享相同的request对象和response对象,他们属于痛一个访问请求和响应过程;sendRedirect的调用者与被调用者使用各自的request和response对象,属于两个独立的访问请求和响应过程。
下面是贴代码:
1.Servlet
test.html<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="forwardServlet">Forward</a>
<a href="redirectServlet">Redirect</a>
</body>
</html>
ForwardServlet.java
package cn.limbo.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 ForwardServlet
*/
@WebServlet("/forwardServlet")
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("forwardServlet doGet");
//请求的转发
//1.调用HttpServletRequest的getRequestDispatcher()方法获取 RequestDispatcher 对象
//调用 getRequestDispatcher() 需要传入要转发的地址
String path = "testServlet";
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/" + path);
//2.调用HttpServletRequest的forward(request,response)进行请求的转发
requestDispatcher.forward(request, response );
}
}
RedirectServlet.java
package cn.limbo.servlet;
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 RedirectServlet
*/
@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("RedirectServlet's doGet");
//执行请求的重定向,直接调用response.sendRedirect(path)方法
//path为要重定向的地址
String path = "testServlet";
response.sendRedirect(path);
}
}
TestServlet.java
package cn.limbo.servlet;
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 TestServlet
*/
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testServlet doGet");
}
}
2.jsp
a.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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-8">
<title>Insert title here</title>
</head>
<body>
<h4>AAA PAGE</h4>
<a href="b.jsp">To B PAGE</a>
</body>
</html>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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-8">
<title>Insert title here</title>
</head>
<body>
<h4>BBB PAGE</h4>
<%
//1.请求转发代码
//request.getRequestDispatcher("/c.jsp").forward(request, response);
//2.请求重定向
response.sendRedirect("c.jsp");
%>
</body>
</html>
c.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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-8">
<title>Insert title here</title>
</head>
<body>
<h4>CCC PAGE</h4>
<%= new Date()%>
<%= "adfsdfsfsf" %>
</body>
</html>