回顾学习笔记三:
1、建立超文本系统 超级链接(绝对路径、相对路径)不建议路径用中文描述
2、多页面之间的数据传递
一、介绍服务器的几种响应方式
二、重定向
三、请求转发
四、内置对象out
我们知道客户端通过网络向服务器发起请求,那么服务器又如何来响应请求呢?
服务器响应请求的方式有三种:
(1)直接响应:客户端向服务器应用程序A发送请求,A直接提供服务并返回结果给客户端
(2)重定向:客户端向服务器应用程序A发送请求,A无法完成请求或者不想完成请求,但A知道B可以,于是A告诉客户端A不行但B可以,然后客户端向B发送请求……
(3)请求转发:客户端向服务器应用程序A发送请求,A无法完成或不想完成,A把请求交给同一服务器中的应用程序B,B也无法完成或不想完成,B把请求转发给C,C完成请求把结果返回给B,B再把结果返回给A,最后由A来把结果返回给客户端。
注意:重定向与请求转发的区别
从客户端角度来看,重定向要发送至少两次以上的请求,而请求转发只发送了一次请求
从服务器角度来看,重定向可以跨服务器操作,而请求转发只能在同一服务器中进行
我们将通过一个例子来说明,我们把页面index.jsp重定向到a.jsp,再从a.jsp重定向到b.jsp
index.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>
<h1>Index</h1>
<%
//重定向
response.sendRedirect("a.jsp");
%>
</body>
</html>
然后我们运行后得到的页面如下图:
我们可以看到页面显示的内容是a.jsp页面的内容,并且页面地址栏显示的是a.jsp的地址:http://localhost:8080/week005/a.jsp
然后我们再在a.jsp中设置重定向到b.jsp页面:
a.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>
<h1>A</h1>
<%response.sendRedirect("b.jsp"); %>
</body>
</html>
然后我们运行index.jsp页面得到下图:
我们可以看到页面显示的内容是a.jsp页面的内容,并且页面地址栏显示的是b.jsp的地址:http://localhost:8080/week005/b.jsp
当然重定向也可以跨服务器操作,我们可以在b,jsp中重定向到baidu.com
b.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>
<h1>B</h1>
<%response.sendRedirect("http://www.baidu.com"); %>
</body>
</html>
同样我们通过index.jsp→a.jsp→b.jsp的例子来说明
index.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>
<h1>Index</h1>
<%
//重定向
//response.sendRedirect("a.jsp");
//请求转发
request.getRequestDispatcher("a.jsp").forward(request,response);
%>
</body>
</html>
运行index.jsp,得到下图:
我们可以注意到页面显示的a.jsp页面的内容,但是页面地址栏依然是index.jsp页面的地址栏:http://localhost:8080/week005/index.jsp
然后我们在a.jsp页面中请求转发到b.jsp
a.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>
<h1>A</h1>
<%
//重定向
//response.sendRedirect("b.jsp");
//请求转发
request.getRequestDispatcher("b.jsp").forward(request,response);
%>
</body>
</html>
我们运行index.jsp页面,得到下图:
我们可以注意到页面内容显示的是b.jsp页面的内容,页面地址栏依旧是index.jsp的地址:http://localhost:8080/week005/index.jsp
不知道之前在实践的过程中小伙伴有没有遇到这样的问题:
在WEB-INF目录下创建了jsp页面,然后运行的时候怎么也打不开,显示404
因为在这个文件夹中存放的是一些重要资源,它不能被直接访问,但是我们可以通过请求转发来访问到其中的资源,我们在该目录下创建NewFile.jsp页面
然后我们在index.jsp中请求转发
index.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>
<h1>Index</h1>
<%
//重定向
//response.sendRedirect("a.jsp");
//请求转发
request.getRequestDispatcher("WEB-INF/NewFile.jsp").forward(request,response);
%>
</body>
</html>
运行index.jsp页面,显示如下图:
我们发现我们可以通过请求转发的方式来访问WEB-INF中资源,同时我们注意到页面地址栏仍然是index.jsp的地址:http://localhost:8080/week005/index.jsp
Q:我们可以在页面中既进行重定向又进行请求转发吗?
A:显然是不可以的,一个请求只能得到一个响应,一个页面中只能选择一个重定向或者一个请求转发,既不能两者都选,也不能进行多个重定向或多个请求转发
我们用刷新页面的例子来说明
outtest.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>
<h1>内置对象out</h1>
<%! int x=0; %>
<%
out.print(x++);//打印x
response.setIntHeader("refresh", 1);//刷新页面
%>
</body>
</html>
运行outtest.jsp,得到下图: