请求转发与重定向的区别
请求转发与重定向
图解:
请求转发
请求转发服务器内部行为,页面的跳转在服务器内部进行,用户看到的是最终跳转的页面结果,不会看到中间的过程
客户端浏览器只请求一次服务器
只能转发到当前项目下
保留前一个页面的信息,使用request域对象可以获取到参数数据
重定向
重定向是客户端浏览器行为
重定向一次客户端浏览器需要向服务器发出两次请求
浏览器地址栏Url改变
可以转发到任意路径,可以转到其它转发到外部工程里面
与前一个页面无关,使用request域对象获取不到参数数据
请求转发代码:
package sevletdemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ForwardServlet
*/
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 请求转发
*/
//1)获取ServletContext对象
//ServletContext context = this.getServletContext() ;
//2)使用ServletContext里面的一些方法
//通过查看源码:请求转发的方法:public RequestDispatcher getRequestDispatcher(String path);
// //请求转发:服务器行为 执行的就当前项目的根目录 /资源文件名称
// RequestDispatcher rd = context.getRequestDispatcher("/hello.html") ;
//public void forward(ServletRequest request, ServletResponse response):
//获取到了RequestDispatcher对象,将request和Response进行封装,需要让服务器进行转发
//rd.forward(request, response);
/**
* 请求转发的简化方式
*/
// request.getRequestDispatcher("/hello.html").forward(request, response);
/**
* 使用请求转发可不可以跳转到外部项目下的资源文件呢
* 使用请求转发,它只能转发到当前项目下的资源文件中,不能转发到外部工程里面
*/
// request.getRequestDispatcher("../JavaWeb_Http_develop/adv.html")
// .forward(request, response);
//使用请求转发:能不能通过request域对象,获取到参数数据呢?
//使用request对象保存一个参数数据
//先设置餐数据,在转发
request.setAttribute("name", "eric");
request.getRequestDispatcher("/GetParamData").forward(request, response);
System.out.println("参数数据保存成功....");
String name=(String)request.getAttribute("name");
System.out.println(name);//eric
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//回调doGet()
doGet(request, response);
}
}
package sevletdemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class GetParamData
*/
public class GetParamData extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取request域对象中的参数数据
String value = (String) request.getAttribute("name") ;
System.out.println("value:"+value);
}
}
运行ForwardServlet之后跳转到了GetParamDat,但是浏览器地址栏的url并没有改变.
控制台的运行结果:
value:eric
参数数据保存成功....
Eric
前一句为GetParamData的运行结果,后两句为ForwardServlet的运行结果,
说明页面转到GetParamData之后又回到了ForwardServlet,但是浏览器的地址栏的url并没有改变,而且GetParamData页面可以获取到ForwardServlet页面设置的参数,说明两者使用的是同一个request对象,
说明请求转发是在服务器内部完成的.
请求转发只能转发到当前项目下
如果转发到其它项目下就会出现404的错误
//request.getRequestDispatcher("/http_develop/GetParam.jsp").forward(request, response);出现404错误
重定向代码
ReirectServlet.java
package sevletdemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ReirectServlet
*/
public class ReirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//重新向 :最终是浏览器行为 302 + location
//浏览器行为: 执行的tomcat里面webppas(网站的根目录):/当前web工程名称/资源文件
// response.sendRedirect("/Develop_Servlet_Cookie/hello.html");
//重新定向跳转到GetParamData
request.setAttribute("name","eric");
/**
* 重定向可以将当前servlet程序跳转到外部工程资源文件?
* 可以的
*/
//response.sendRedirect("/http_develop/GetParam.jsp");
response.sendRedirect("/MyServletProject/GetParamData
");
System.out.println("保存成功....");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
GetParam.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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></title>
</head>
<body>
<%
String value = (String) request.getAttribute("name") ;
out.println("value:"+value);//value:null
%>
</body>
</html>
GetParamData.java
package sevletdemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class GetParamData
*/
public class GetParamData extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取request域对象中的参数数据
String value = (String) request.getAttribute("name") ;
System.out.println("value:"+value);
}
}
运行ReirectServlet.java之后页面直接跳转到GetParam.jsp页面
浏览器地址栏显示的是http://localhost:8080/http_develop/GetParam.jsp
GetParam.jsp页面显示的运行结果:value:null
为了避免请求转发和重定向使用的是不同的页面带来的差异性,将重定向和请求转发的的跳转页面
都改为了GetParamData.java这个Sevlet.
重定向的运行结果:
保存成功......
value:null
运行结果分析:
控制台先显示的是ReirectServlet.java的输出语句:保存成功....
说明先运行完了ReirectServlet.java结束后,跳转到新的页面GetParamData.java,
GetParamData.java中的request对象并没有获取到前一个页面设置的参数值,
说明重定向页面跳转是做了两次不同的请求的,使用了两个不同的raquest对象,无法实现跨不同页面参数的保存。
在提交表单信息或者点击超链接时浏览器的地址栏url都会发生变化,
说明提交表单信息或者点击超链接都属于重定向,是浏览器的行为

浙公网安备 33010602011771号