请求转发和重定向的区别以及关于request与response内置对象

在【JSP页面元素,内置对象以及tomcat配置技巧】这篇博文里,后面有说到关于jsp的9大内置对象以及request介绍以及常见用法;这一篇文章,主要讨论request和response的一些用法,重点说response对象与请求转发重定向的一些区别;

在jsp中;request对象称为请求对象,目的是将客户端发送的请求信息送给服务端,服务端可以通过该对象拿到客户端的一切需求信息。而response对象称之为响应对象,是当服务端收到客户端的请求后,需要做出一些相应来完成相应的动作。可以用下图来稍作解释,因为实际的情况可能复杂得多


jsp内置对象response常用方法介绍:

void addCookie(Cookie cookie)  :服务端向客户端增加Cookie对象。

void sendRedirect(String Location) throws IOExcption :页面跳转的一种方式,重定向

void setConetentType(String type) :设置相应编码


下面,我们来用一个登陆的例子说明请求与响应的具体流程: 

我们建立三个jsp文件,分别是login.jsp,check.jsp,success.jsp。解释一下,login.jsp用来给用户输入表单值,输入之后将会到check.jsp进行检查,若是合法用户,则到success.jsp,若是非法用户,则提示错误!


首先建立名为requestAndResponseDemo的Dynamic web project项目,在web-content下建立login.jsp文件,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="check.jsp" method=post>
            username:<input type=text name=username /><br/>
            userpassword:<input type=text name=userpassword /><br/>
            <input type="submit" value="login...">
	</form>
</body>
</html>

在web-content下建立check.jsp文件,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
	String name=request.getParameter("username");
	String password=request.getParameter("userpassword");
	if("charles".equals(name)&&"123456".equals(password))
	{
		response.sendRedirect("success.jsp");
	}
	else
	{
		out.print(new Date()+"<br/>账号或密码错误");
	}
	
	%>
</body>
</html>

在web-content下建立success.jsp文件,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%=new Date() %><br/>
		欢迎用户:<br/>
		<%
		out.print(request.getParameter("username"));
		%>

</body>
</html>

代码编写完,先解释一下

打开项目,首先我们会进入login.jsp,向表单中输入值,然后通过action的check.jsp来验证表单内容是否正确,这里为了简化代码,我们直接将拿到的值和 charles 与 123456 判断(当然也可以通过jdbc的方式来操作,下来可以自己玩),如果同时满足,就假设登陆成功,将页面跳转到success.jsp,否则就打印错误信息。切记,此处的跳转方式为sendRedirect(String Location) ,称之为重定向。

我们先来跑一下这个项目。输入:

点击login按钮 

可以观察到,并没有出现欢迎用户:charles,而是null,为什么呢?但是此时的地址栏确实已经跳转到success.jsp了,此处我们检查我们的代码,似乎并没有什么问题,那么唯一的可能就是出在这个重定向 上了。我们稍后再来找他麻烦。现在,我们来改一改代码。再解释。

我们将check.jsp的代码改成如下所示!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
	String name=request.getParameter("username");
	String password=request.getParameter("userpassword");
	if("charles".equals(name)&&"123456".equals(password))
	{
		request.getRequestDispatcher("success.jsp").forward(request, response);
	}
	else
	{
		out.print(new Date()+"<br/>账号或密码错误");
	}
	
	%>
</body>
</html>

其实可以观察到,相比之前的代码,这里我们只改了1行,就是将response.sendRedirect(),改成了request.getRequestDispatcher("success.jsp").forward(request, response);,那么,这句话代表什么意思呢,我们稍后解释,先观察执行结果,因为我们没有牵扯到关于服务器的代码,此时我们并不需要重启服务器,直接刷新页面即可!


至此,我们已经差不多完成了我们需要的功能了,至于错误的用户名和密码的展示,这里就不再说了,我们重点观察两种方式的区别。

第一种:response.sendRedirect()   这叫重定向方式

第二种:request.getRequestDispatcher("success.jsp").forward(request, response);   这叫请求转发;

其实我们通过项目的访问,已经能够发现一些他们的区别了。

第一,重定向方式,我们最后没有拿到username的值,而请求转发方式拿到了;

第二,重定向方式,我们的地址栏最后到了success.jsp,而请求转发方式,地址栏仍停留在check.jsp中;

那么,我们可以对其稍作总结,如下:

 请求转发:request.getRequestDispatcher(String location).forward(request, response);重定向:response.sendRedirect(String location)
地址栏是否改变不变改变
是否保留第一次请求的数据保留不保留
跳转发生的位置服务端客户端
请求的次数一次两次

前两种不同点我们通过项目已经发现了,后面两种我们来稍作解释:

1.跳转发生的位置:请求转发,跳转发生在服务端;

这里举个生活中常见的例子,就像我们(login.jsp)去银行取钱,我们就是客户端,银行就是服务端,银行里有很多窗口(服务),我们找到一个窗口(check.jsp),我们想要在这个窗口取钱,但是这个窗口没钱了,于是这个窗口就向他隔壁窗口(success.jsp)拿了钱,然后把钱拿给我们,我们只请求了一次服务,而作为客户端的我们,并不需要知道真正的钱是哪来的,但是我们最后取到了钱,其实钱是来自另一个窗口(服务器内部解决的)(success.jsp)

用一个图来说:

而对于重定向:跳转是客户端自己跳转两次;

也来举个例子,还是取钱,我们是客户端(login.jsp),我们要去银行取钱(服务端),我们又找到了一个窗口(check.jsp),但是这个窗口没钱了,他也不让隔壁窗口给钱,而是直接告诉我们,他这个窗口没钱了,你得去几号几号窗口取,于是我们又离开这个窗口(服务:check.jsp),去另一个窗口(服务:success.jsp),相当于我们被服务了两次,而且还是我们自己去找的。

老规矩,来个图:

对于request和response,以及重定向和请求转发就说到这里了,其实,我的另一篇博文里提到过,不能将文件放在web-inf里面,不然服务端无法直接访问,只能通过请求转发访问,重定向也访问不到,其实这就是我刚刚说的,请求转发是服务器内部操作,外界不需要管,所以它能请求服务器内部资源,而重定向做不到,重定向依然是客户端访问服务器对外的资源! 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值