8--请求转发和重定向

请求转发工作原理

方式1:
由浏览器发出请求到Web服务器,Web服务器再将得到的信息传给Web容器,Web容器根据请求找到第一个资源(大部分为页面),由于第一个资源并不能完成所有请求需求,请求由第一个请求转向第二个资源进行处理,以此类推。当所有的资源处理完请求后,由最后一个资源将处理结果相应给Web容器,Wed容器将处理 结果交由Web服务,再由服务器将最终结果相应给客户端(浏览器),基于这一原理也叫权利的暂时移交。如图:
在这里插入图片描述
方式2:
由浏览器发出请求到Web服务器,Web服务器再将得到的信息传给Web容器,Web容器根据请求找到第一个资源(大部分为页面),由于第一个资源并不能完成所有请求需求,请求由第一个请求转向第二个资源进行处理,以此类推。当最后一个资源处理完毕之后,再将处理结果按照逆向传递给上一个资源,最终由第一个资源将处理结果相应给Web容器,Wed容器将处理 结果交由Web服务,再由服务器将最终结果相应给客户端(浏览器),基于这一原理也叫权利的暂时移交。如图:
在这里插入图片描述
实例1:request范围存放数据

<%@ 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>
	<%
		//向request范围中添加属性
		request.setAttribute("info", "这是request范围中的数据");
	    request.setAttribute("username", "张三123");
	%>
	<!-- 请求转发 -->
	<jsp:forward page="demo03.jsp"></jsp:forward>	
</body>
</html>

实例2:接收request范围中的数据

<%@ 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>
	<!-- 请求转发(服务端跳转)能获取request范围中的值 
	         请求转发:客户端端只发起过一次HTTP请求,如果访问的一个资源无法完成整个请求回应,则在服务器端
	     	 进行跳转,跳转之后请求中的数据不会丢失,只有所有的资源共同完成请求后,再相应。所以一次请求中
	     	 可以获取request范围中的数据
	 -->
	info:<%=request.getAttribute("info") %><br/>
	username:<%=request.getAttribute("username") %><br/>
</body>
</html>

运行结果:
info:这是request范围中的数据
username:张三123

重定向工作原理

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。如图:
在这里插入图片描述
实例3:request范围存放数据

<%@ 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>
	<%
		//向request范围中添加属性
		request.setAttribute("info", "这是request范围中的数据");
	    request.setAttribute("username", "张三123");
	%>
	<!-- a标签跳转属于重定向 -->
	<a href="demo03.jsp">跳转到demo03</a>
</body>
</html>

实例4:接收request范围中的数据

<%@ 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>
	<!--重定向(客户端的跳转),不能获取request范围中的值
	  重定向:客户端发起http请求后,如果服务端的一个资源无法完成整个请求回应,则需要客户端再次发起请求(相当于多次请求)
	       在发起请求后可能之前的数据不存在了,所以重定向后数据丢失-->
	info:<%=request.getAttribute("info") %><br/>
	username:<%=request.getAttribute("username") %><br/>
</body>
</html>

运行结果:
info:null
username:null

请求转发与重定向的区别:

请求转发:

  1. 是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。
  2. 可以理解是服务器端行为,客户端发起一次请求,这个请求在整个服务器端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起二次请求,无论这个请求经历过多少个处理程序,始终都是同一个请求,也就意味着,这个请求中的数据经历过的每一个处理程序都可以使用。在同一个请求中request范围中的数据不会丢失。
    重定向:
  3. 当使用了重定向跳转页面后,在其客户端路径栏显示的应该是其重定向的路径,客户端是可以观察到页面地址变化的,重定向是客户端至少做了两次访问请求的。
  4. 可以理解为是客户端行为,客户端发起一次请求,服务器端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求。两次请求过程中request范围中的数据丢失。

应用场景

  1. 前端发送请求到后台的方式(重定向):
      1)浏览器地址输入链接。
      2)a标签 < a href=“URL 地址”>跳转< /a>
      3)form表单  < form action=“URL地址” method=“get/post”>
                < input type=“submit” value=“跳转”/>
             </ form>
      4)通过js的BOM操作  window.location.href=“http://www.baidu.com”;
      5)AJAX异步请求。
  2. 后端请求转发和重定向的使用:
      1)请求转发:
      req.getRequestDispatcher(servlet或者jsp的请求路径).forward(req,resp);
      2)URL重定向:
      resp.sendRedirect("/day47/views/student.jsp");
      
      ====================================================================================================
      自己也是最近才开始写文章,看到大家都分享自己的经验给别人。我也是受益者之一,做人不能只懂的索取而不去回馈,所以也将自己学习的知识分享给大家。我不能保证每个问题都讲的是对的,毕竟我也是个学习者。如果有地方写得不对或理解有误的,也希望大家给指出,我当非常感谢。编写过程也不易,也希望大家给个赞,关注下本人。这也能激励我继续分享。
      ====================================================================================================

猜你喜欢

转载自blog.csdn.net/qwy715229258163/article/details/114106568