Java深入理解之转发与重定向

java请求重定向与请求转发##

请求的转发和重定向的本质区别:
在于我们当使用转发时,jsp容器将使用一个内部方法来调用我们想要转发的页面,新的页面处理另一个请求,全过程只有一个url 而在此过程中Web浏览器是不清楚这个重新调用的过程。
而重定向是一个页面通知浏览器发送一个新的页面请求,所以Web浏览器是发送了2次请求,浏览器中的url是会发生改变的,会变成新的URL。


重定向


例子中重定向的过程:
点击 Redirect 进行重定向

  1. RedirectServlet 类(执行重定向到 testServlet类)
 package com.atigu.javaweb;

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 RedirectServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("RedirectServlet's doGet");
		
		request.setAttribute("name", "xyzmn");
		System.out.println("RedirectServlet's name: " + request.getAttribute("name"));
		//执行请求的重定向, 直接调用 response.sendRedirect(path) 方法,
		//path 为要重定向的地址
		String path = "testServlet";
		response.sendRedirect(path);
	}
}

  1. testservlet (重定向到的servlet)
package com.atigu.javaweb;

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 TestServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TestServlet's doGet 方法. ");
		
		System.out.println("TestServlet's name: " + request.getAttribute("name"));
		
	}

}


response.sendRedirect()方法是重定向的核心方法

转发

  1. ForwardServlet
package com.atigu.javaweb;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ForwardServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("ForwardServlet's doGet");
		
		request.setAttribute("name", "abcde");
		System.out.println("ForwardServlet's name: " + request.getAttribute("name"));
		
		//请求的转发.
		//1. 调用 HttpServletRequest 的 getRequestDispatcher() 方法获取  RequestDispatcher 对象
		//调用 getRequestDispatcher() 需要传入要转发的地址
		String path = "testServlet";
		
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/" + path);
		
		//2. 调用 HttpServletRequest 的 forward(request, response) 进行请求的转发. 
		requestDispatcher.forward(request, response); 
		
	}

}

RequestDispatcher 实例对象是由Servlet对象创建的,它用于包装一个要被其他资源调用的资源,其接口中定义了两个方法(forward, include)。这两个方法接受的两个参数传递给当前Servlet 的service方法的ServiceRequest 和Servletresponse对象,

显示页面


	
	Test
	
	

Forward

Redirect

请求转发流程总结:
Java深入理解之转发与重定向_第1张图片

  1. 在请求转发中,Web 浏览器发出HTTP请求到Web容器中,Web容器首次访问,容器才创建目标Servlet , Web 容器创建请求和响应对象(request、response)

  2. web容器调用Servlet的Service(ServletRequest req,ServletResponse res) 方法, 根据Servlet 写入响应信息,发出forward命令到Web容器中。

  3. Web容器初次访问创建的Servlet2,并调用Servlet2的service方法返回Web容器的响应

  4. 然后Servet1 service 方法返回到Web容器中

  5. 读取响应信息,发出http响应。
    Java深入理解之转发与重定向_第2张图片

  6. 请求重定向
    关键在于其Web容器子啊读取Servlet响应信息后。
    Java深入理解之转发与重定向_第3张图片

发送HTTP响应给浏览器
Java深入理解之转发与重定向_第4张图片

然后Web浏览器重新发送包含重定向HTTP信息
Java深入理解之转发与重定向_第5张图片
总结具体区别点:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址

②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.

③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.

④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.

你可能感兴趣的:(Java,Web开发)