开发java web项目时需要进行页面跳转,这时我们常用的两种方式就是重定向和请求转发
一.重定向
1.重定向(Redirect)的定义:
①客户端浏览器向Web应用服务器端发送一个请求,
②Web服务器端使HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;③客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求
(如果在当前的新页面中用request.getAttribute取,得到的将会是null,因为第二次请求是一个新请求,之前请求request.setAttribute存的东西都消失了)
④将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。
2.重定向的代码实现
response.sendRedirect(String path);
①首先按下图所示拷入jar包并创建两个jsp文件
②index.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
第一页面
<%request.setAttribute("name", "tom"); %>
<%response.sendRedirect("NewFile.jsp"); %>
</body>
</html>
③NewFile.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
第二页面
${name }
</body>
</html>
④在地址栏输入第一个页面的地址,选中后回车
⑤跳转到第二页面并且地址栏发生变化,显示第二个页面的地址,但是获取不到request.setAttribute()的值
二.请求转发
1.请求转发(forward)的定义:
这里的“请求”是名词,
①客户端浏览器向Web服务器端发送请求
②服务器端收到请求后进行相应处理后再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的)
③服务器端对该资源进行处理后反馈给客户端。
2.请求转发的代码实现
request.getRequestDispatcher(String path).forward(request,response);
①首先按下图所示拷入jar包并创建两个jsp文件
②index.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
第一页面
<%request.setAttribute("name", "tom"); %>
<%request.getRequestDispatcher("NewFile.jsp").forward(request, response); %>
</body>
</html>
③NewFile.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
第二页面
${name }
</body>
</html>
④在地址栏输入第一个页面的地址,选中后回车
⑤跳转到第二页面并且地址栏不发生变化,获取到request.setAttribute()的值
三.重定向与请求转发的区别
1、重定向:当客户端向服务器发送一个请求,请求地址发生了变化,服务器向客户端返回了一个继续处理的新地址,此时客户端自动(不需要人工参与)访问服务器的新地址,服务器将新地址的内容返回给客户端。采用重定向的方式进行处理,客户端和服务器端共执行了两次请求和两次响应,且浏览器地址栏显示的是第二次访问的新地址。
请求转发客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。采用请求转发的方式,客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
请求转发只发送一次请求,重定向发送了两次请求
请求转发地址栏不改变,重定向地址栏改变为要重定向的地址
2、请求转发方式处理页面跳转,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源,而重定向没有这个限制。
3、重定向无法再新的页面获取request.setAttribute中保存的数据,请求转发可以。即请求转发request和response可以传递到转发的页面,而重定向不行。
4、Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取。