转发和重定向中,是我们开发中经常遇到的,那什么是转发,什么是重定向呢?
转发:浏览器向服务器请求a.jsp,但是a.jsp没有办法处理,于是将请求转发给b.jsp,b.jsp处理完成,将结果返回给浏览器(响应)。
转发过程浏览器只发起一次请求,并且浏览器地址栏不会发生改变,也就是说第一次请求哪个页面,地址栏就是哪个地址。
重定向:
浏览器请求a.jsp,a.jsp处理不了,需要重定向b.jsp,然后响应浏览器,并且告诉浏览器重定向地址,浏览器得到响应后,发起第二次请求,请求b.jsp,b.jsp处理完成后,返回结果响应浏览器。
重定向过程,浏览器一共发起两次请求,并且浏览器地址栏发生改变(显示重定向地址)。
转发案例:
请求text01_a.jsp页面,该页面将完成转发操作。
index.jsp
<a href="text01_a.jsp">转发</a><br>
text01_a.jsp(将请求转发给text01_b.jsp)
<%@ page language="java" import="java.util.*" 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>text01_a</title>
</head>
<body>
<%
System.out.println("访问text01_a,即将转发");
request.setAttribute("req","this is request's message");
request.getRequestDispatcher("text01_b.jsp").forward(request,response);
%>
</body>
</html>
text01_b.jsp(转发页面):
<%@ page language="java" import="java.util.*" 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>text01_b</title>
</head>
<body>
<%
String s=request.getAttribute("req").toString();
%>
text01_b
<h5><%=s %></h5>
</body>
</html>
转发完成后浏览器结果:
我们请求a.jsp,需要转发给b.jsp,发现内容是b.jsp的,但是地址栏确是a.jsp的。
重定向案例:
请求text02_a.jsp页面,该页面将完成重定向操作。
index.jsp
<a href="text02_a.jsp">重定向</a><br>
text02_a.jsp(session存值,重定向过程中,将完成2次request过程,request存值只在当前request有效,所以用request存值,重定向后将无法取值)
<%@ page language="java" import="java.util.*" 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>text01_a</title>
</head>
<body>
<%
System.out.println("访问text02_a,即将重定向");
session.setAttribute("req","this is session's message");
response.sendRedirect("text02_b.jsp");
%>
</body>
</html>
text02_b.jsp(重定向页面):
<%@ page language="java" import="java.util.*" 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>text02_b</title>
</head>
<body>
<%
String s=session.getAttribute("req").toString();
%>
text02_b<br/>
<%
out.println("session作用域,重定向取值结果:");
%>
<h5><%=s %></h5>
</body>
</html>
重定向完成后浏览器结果:
我们请求的是a.jsp,需要重定向给b.jsp,发现内容是b的,浏览器地址栏也是b的(地址栏发生了改变)
总结:
1.转发过程只发起一次请求,浏览器地址栏不发生改变。
2.重定向过程发起两次请求,浏览器地址栏发生改变。
3.转发效率更高(浏览器只发起一次请求即可)。
4.数据作用域如果是request范围的,那么重定向后将无法获取(通过session来存储数据可正常取值)。