Javaweb学习笔记之ServletContext(四):转发和重定向

转发和重定向的目的都是为了跳转页面。

区别如下:

1、转发的地址栏不会改变;而重定向的地址栏会改变,变成重定向的地址。

@WebServlet("/ForwardDemo1")
public class ForwardDemo1 extends HttpServlet {
	/*
	 * 转发
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 获取 ServletContext 对象
		ServletContext context = this.getServletContext();
		
		// 转发
		RequestDispatcher rd = context.getRequestDispatcher("/index.html");
		rd.forward(request, response);
	}
}
@WebServlet("/RedirectDemo1")
public class RedirectDemo1 extends HttpServlet {
	/*
	 * 重定向
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 重定向
		response.sendRedirect("/02_Servlet/index.html");
	}
}

  2、转发只能转发到当前 web 应用内的资源;而重定向既可以跳转到当前 web 应用内的资源,也可以跳转到服务器内其他 web 应用的资源,甚至还可以跳转到外部的域名网站,比如百度(www.baidu.com)。

@WebServlet("/ForwardDemo1")
public class ForwardDemo1 extends HttpServlet {
	/*
	 * 转发
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 获取 ServletContext 对象
		ServletContext context = this.getServletContext();
		
		// 转发;只能跳转到当前 web 应用内的资源,不能跳转到服务器内其他 web 应用。
		RequestDispatcher rd = context.getRequestDispatcher("../Demo/index.html");
		rd.forward(request, response);
	}
}
@WebServlet("/RedirectDemo1")
public class RedirectDemo1 extends HttpServlet {
	/*
	 * 重定向
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 重定向
//		response.sendRedirect("/02_Servlet/index.html"); // 跳转到当前 web 应用内的资源
//		response.sendRedirect("/Demo/index.html");       // 跳转到服务器内其他 web 应用的资源
		response.sendRedirect("https://www.baidu.com");  // 跳转到外部的域名网站
	}
}

3、转发可以在 request 域对象中共享数据;重定向不能在 request 域对象中共享数据。

分别在 转发 和 重定向 时将数据存入 request 域对象中,然后都跳转到 GetDataServlet 中,在 GetDataServlet 中获取 request 域对象中的数据。

@WebServlet("/ForwardDemo1")
public class ForwardDemo1 extends HttpServlet {
	/*
	 * 转发
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 获取 ServletContext 对象
		ServletContext context = this.getServletContext();
		
		// 保存数据到 request 域对象中
		request.setAttribute("name", "张三");
		
		// 转发:跳转到 GetDataServlet
		RequestDispatcher rd = context.getRequestDispatcher("/GetDataServlet");
		rd.forward(request, response);
	}
}
@WebServlet("/RedirectDemo1")
public class RedirectDemo1 extends HttpServlet {
	/*
	 * 重定向
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 保存数据到 request 域对象中
		request.setAttribute("name", "张三");
		
		// 重定向:跳转到 GetDataServlet
		response.sendRedirect("/02_Servlet/GetDataServlet"); 
	}
}
@WebServlet("/GetDataServlet")
public class GetDataServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 从 request 域对象中获取数据
		// 可以获取到在转发中存入的数据,不能获取到在重定向中存入的数据
		String name = (String)request.getAttribute("name");
		System.out.println("name=" + name);
	}
}

结果:在转发时存入 request 域对象中的数据,可以在 GetDataServlet 中获取到;而在重定向时存入 request 域对象中的数据,在 GetDataServlet 中却获取不到。

原理:

转发是一次请求,客户端发送请求到 ForwardDemo1 之后,将数据存入 request 域对象中,转发时将 request 对象一起发送到 GetDataServlet,所以 ForwardDemo1 和 GetDataServlet 中的 request 对象是同一个对象,所以能获取到数据。由于转发时客户端只向服务器发送一次请求,所以地址栏不会改变。

重定向是两次请求,客户端第一次发送请求到 RedirectDemo1 之后,重定向时服务器会先向客户端返回一个 302 和 一个 location 地址,这个 location 地址就是重定向到的地址;然后客户端会重新发送一个请求到这个 location 地址;所以 RedirectDemo1 和 GetDataServlet 中的 request 对象不是同一个对象,自然无法获取到数据。由于重定向时客户端向服务器发送两次请求,所以地址栏的地址才会改变,变为第二次请求的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值