servlet请求转发于重定向

请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用非常广泛。
一. 请求的转发

  1. Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部“转发”给其他Servlet程序继续处理。在这种情况下浏览器端只发出了一次请求,浏览器地址栏不会发生变化,用户也感知不到请求被转发了。
  2. 转发请求的Servlet和目标Servlet共享同一个request对象。
  3. 实现转发的API
 protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//1.使用RequestDispatcher对象封装目标资源的虚拟路径
		RequestDispatcher dispatcher = request
				.getRequestDispatcher("/index.html");
 		//2.调用RequestDispatcher对象的forward()方法“前往”目标资源
 		//[注意:传入的参数必须是传递给当前Servlet的service方法的
		//那两个ServletRequest和ServletResponse对象]
 		dispatcher.forward(request, response);
 	}

二. 请求的重定向

  1. Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会改变为新资源的地址。
  2. 重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了。
  3. 实现重定向的API
protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//1.调用HttpServletResponse对象的sendRedirect()方法
		//2.传入的参数是目标资源的虚拟路径
		response.sendRedirect("index.html");
	}
protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//1.调用HttpServletResponse对象的sendRedirect()方法
		//2.传入的参数是目标资源的虚拟路径
		response.sendRedirect("index.html");
	}

对比请求的转发和重定向

# 转发 重定向
浏览器地址栏 不改变 改变
请求次数 1 2
能否共享request对象数据
是否共享数据 转发一次请求,共享数据 重定向两次请求,不共享数据(在request级别使用信息共享,使用重定向必然出错)
发生行为不同 服务器 客户端
目标资源:WEB-INF下的资源 能访问 不能访问
原文地址:https://www.cnblogs.com/zk2020/p/13871264.html