8--请求转发和重定向

请求转发工作原理

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
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"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
	
	info:<%=request.getAttribute("info") %><br/>
	username:<%=request.getAttribute("username") %><br/>
body>
html>

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

重定向工作原理

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
	<%
		//向request范围中添加属性
		request.setAttribute("info", "这是request范围中的数据");
	    request.setAttribute("username", "张三123");
	%>
	
	<a href="demo03.jsp">跳转到demo03a>
body>
html>

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
	
	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=“跳转”/>
             
      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");
      
      ====================================================================================================
      自己也是最近才开始写文章,看到大家都分享自己的经验给别人。我也是受益者之一,做人不能只懂的索取而不去回馈,所以也将自己学习的知识分享给大家。我不能保证每个问题都讲的是对的,毕竟我也是个学习者。如果有地方写得不对或理解有误的,也希望大家给指出,我当非常感谢。编写过程也不易,也希望大家给个赞,关注下本人。这也能激励我继续分享。
      ====================================================================================================

你可能感兴趣的:(jsp,javaWEB,java,web)