请求转发与重定向

我们先创建login.jsp文件,因为仅为看重定向,所以仅创建一个提交标签,然后路径跳转到DataServlet中;代码如下

//login.jsp
<%@ 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>
		<form action="./DataServlet" method="get">
			<input type="submit" value="登录"/>
		</form>
	</body>
</html>

然后创建DataServlet.java文件,在eclipse控制台返回“I will be back”;并给request对象赋一个值 name==T-800;然后使用sendRedirect方法使用给定的路径,给用户端发送一个重定向的响应,到此响应被提交;(后文会解释注释内容)

//DataServlet.java
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 DataServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("I will be back");
		request.setAttribute("name", "T-800");
		response.sendRedirect("target.jsp");
//		request.getRequestDispatcher("target.jsp").forward(request, response);
	}	
}

创建新的请求响应的target.jsp文件,输出“目标也”和request的value的值;

//target.jsp
<%@ 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.getAttribute("name") %>
</body>
</html>

加载login.jsp页面之后,点击登录,提交请求至DataServlet,DataServlet响应后,又返回target.jsp的地址给用户端,用户端解析后重新向target.jsp发送请求,target.jsp响应并返回内容,如下2图;但是request不能跨请求响应,因为,第二次的请求request和第一次的请求request不是一个request,第二次的请求是新的请求响应过程,又因为第二次的请求没有被赋值name==T-800;因此输出为null;这个过程是重定位过程;

       

我们更改一下DataServlet.java中的代码;将注释内容放出来,将重定位注释掉;其他代码不变;

//DataServlet.java
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 DataServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("I will be back");
		request.setAttribute("name", "T-800");
//		response.sendRedirect("target.jsp");
		request.getRequestDispatcher("target.jsp").forward(request, response);
	}	
}

我们重启项目之后点击登录会发现;

request的值被输出了,因为request.getRequestDispatcher("target.jsp").forward(request, response);语句不再是重定位,而是请求转发,它把用户端的请求转发给了target.jsp,因此,两个request请求是同一个请求,故可以输出结果;

以下详解是带我的前辈给的解释,希望能帮到大家:

重定向(Redirect):客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。

请求转发(Forward):这里的“请求”是名词,请求转发指客户端浏览器向Web服务器端发送请求,服务器端收到请求后进行相应处理后再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的),服务器端对该资源进行处理后反馈给客户端。

区别:

  1. 重定向:当客户端向服务器发送一个请求,请求地址发生了变化(),服务器向客户端返回了一个继续处理的新地址,此时客户端自动(不需要人工参与)访问服务器的新地址,服务器将新地址的内容返回给客户端。采用重定向的方式进行处理,客户端和服务器端共执行了两次请求和两次响应,且浏览器地址栏显示的是第二次访问的新地址。   

 

  1. 请求转发:请求转发客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。采用请求转发的方式,客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
  2. 请求转发方式处理页面跳转,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源,而重定向没有这个限制。
  3. 重定向无法再新的页面获取request.setAttribute中保存的数据,请求转发可以。
  4. Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取。
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值