-
解析:重定向和恳求转发
添加时间:2013-6-16 点击量:解析:重定向和恳求转发
重定向
HttpServletResponse对象的sendRedirect(java.lang.String location)办法称作重定向。
若是location地址前面加上“/”,则默示相对于Servlet容器的根来恳求,比如http://localhost:8080;若是location地址前面没有加上“/”,则默示相对于当前恳求的URI来寻找地址。
恳求转发
RequestDispatcher的:forward(ServletRequest request, ServletResponse response)办法叫做恳求转发。
实验例子1:重定向和恳求转发似乎都是造成页面跳转
第一个页面first.jsp:
<%@ page language=java import=java.util. pageEncoding=UTF-8%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;
%>
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
<html>
<head>
<base href=<%=basePath%>>
<title>My JSP first.jsp starting page</title>
<meta http-equiv=pragma content=no-cache>
<meta http-equiv=cache-control content=no-cache>
<meta http-equiv=expires content=0>
<meta http-equiv=keywords content=keyword1,keyword2,keyword3>
<meta http-equiv=description content=This is my page>
<!--
<link rel=stylesheet type=text/css href=styles.css>
-->
</head>
<body>
<form action=Second>
<input type=text name=username>
<input type=submit value=submit>
</form>
</body>
</html>
first.jsp
第二个页面是Servlet:
用恳求转发:
package com.shengqishiwind.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Second extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
process(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
process(request, response);
}
private void process(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
// 恳求转发
RequestDispatcher rd = request.getRequestDispatcher(third.jsp);
rd.forward(request, response);
}
}
用重定向,则把处理惩罚办法改为:
private void process(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
// 重定向
response.sendRedirect(third.jsp);
}
第三个页面是third.jsp
<%@ page language=java import=java.util. pageEncoding=UTF-8%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;
%>
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
<html>
<head>
<base href=<%=basePath%>>
<title>My JSP third.jsp starting page</title>
<meta http-equiv=pragma content=no-cache>
<meta http-equiv=cache-control content=no-cache>
<meta http-equiv=expires content=0>
<meta http-equiv=keywords content=keyword1,keyword2,keyword3>
<meta http-equiv=description content=This is my page>
<!--
<link rel=stylesheet type=text/css href=styles.css>
-->
</head>
<body>
This is my Third page. <br>
</body>
</html>
不管用恳求转发还是重定向的办法,第一个页面点击提交后,都能顺利转到第三个页面:
然则其实实际进行的操纵还是很不合的,看下面的例子。
实验例子2:若是要在第三个页面中取得第一个页面输入的用户名
恳求转发的实现斗劲简单,第二个页面的Servlet代码不消添加任何器材,可以直接从第三个页面getParameter,即把third.jsp中的body改为:
<body>
This is my Third page. <br>
用户名:<%=request.getParameter(username) %>
</body>则在第一个页面输入shengqishiwind,提交后,第三个页面显示:
重定向应当怎么实现获取第一个页面提交的用户名呢?
第三个页面采取如上的代码(经由过程getParameter获取参数),把第二个页面中改为重定向的跳转体式格式,从头来一次,可以看到显示:
再测验测验第二个页面如许(经由过程setAttribute存储值):
private void process(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
String username = request.getParameter(username);
// 重定向
request.setAttribute(username, username);
response.sendRedirect(third.jsp);
}然后第三个页面如许获取:
用户名:<%=request.getAttribute(username) %>
仍然是不可,获得的仍然是null值。
重定向和恳求转发的差别
恳求转发:
RequestDispatcher是经由过程调用HttpServletRequest对象的getRequestDispatcher()办法获得的,是属于恳求对象的办法。
恳求转发,全部过程处于同一个恳求傍边。
不管经验了几许组件,都可以从request中直接取得想要的值。
应用恳求转发时,到成果页面的网址是:http://localhost:8080/HelloWeb/Second?username=wind
重定向:
sendRedirect()是HttpServletResponse对象的办法,即响应对象的办法。
既然调用了响应对象的办法,那就注解全部恳求过程已经停止了,办事器开端向客户端返回履行的成果。
sendRedirect调用后会向客户端返回一个响应,这个响应告诉客户端要转向的页面,紧接着客户端又会发送一个新的恳求,转向这个目标页面。
也便是说,重定向的过程中实际上客户端会向办事器发送两个恳求。
应用重定向时,成果页面的网址是:http://localhost:8080/HelloWeb/third.jsp
申明客户端已经知道了成果页面的地址,是从头发送的全新的恳求。
重定向体式格式在Firebug中的图:
总结记忆:恳求转发只有一个恳求,所以一往无前,调用的办法叫forward;而重定向须要客户端从头发送恳求,调用的是sendRedirect,名字里有个Re,默示反复。
参考材料:
圣思园张龙教员视频教程。
Java Document API with examples:
http://www.javadocexamples.com/