JavaWeb—“页面跳转两种方式:请求转发(forward)与重定向(sendRedirect)”
Posted 一切因为是码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb—“页面跳转两种方式:请求转发(forward)与重定向(sendRedirect)”相关的知识,希望对你有一定的参考价值。
1.重定向 sendRedirect()
重定向是指页面定位到某个新地址,之前的request失效,进入一个新的request (相当于两次请求),通过request对象的sendRedirect()方法实现。
例:
resopnse.sendRedirect("/ch01/index.html");
(上述语句定向到当前站点(ch01)的根目录下的index.html页面)
重定向实现页面跳转前后台均参与,首先浏览器发出请求到服务器,服务器找到资源后通知前台,再由浏览器进行跳转。
注意:跳转前后浏览器地址栏URL发生改变!
2.请求转发 forward()
请求转发是指将请求(request)再转发到另一个页面,此过程还是在Request的范围内,通过RequestDispatcher接口的forward()方法实现,该方法可以将请求转发到另外一个资源 (从当前servlet跳转到另一个servlet),并让该资源对浏览器的请求进行响应。
RequestDispatcher接口有两个方法:
- forward():请求转发,从当前servlet跳转到另一个servlet;
- include():引入其他servlet。
RequestDispatcher接口的实例由 HttpRequest对象的getRequestDispatcher()方法实现。
例:
//创建接口实例
RequestDispatcher rd = request.getRequestDispatcher(path);
//调用forward方法
rd.forward(request,response);
请求转发是服务器行为,且转发前后共享同一个request对象,上一个页面中写入request中的属性的值在跳转后仍存在。
注意:页面跳转前后浏览器地址栏URL不会改变!
通过请求参数传递来验证forward()与sendRedirect()方法在request对象共享上的区别:
(1)编写MyServlet.java,获取request中的test属性值,并打印。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html:charset=GBK");
//获取test属性值
String test = (String)request.getAttribute("test");
//获取输出流
PrintWriter out =response.getWriter();
out.print("重定向和请求转发");
//打印test属性
out.print(test);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(2)编写RedirectServlet.java,并设置test属性值为“helloworld”。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html:charset=GBK");
//设置test属性值
request.setAttribute("test", "helloworld");
System.out.println("重定向前");
response.sendRedirect(request.getContextPath()+"/MyServlet");
System.out.print("重定向后");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(3)编写ForwardServlet,设置request对象中的test属性值为“helloword”
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ForwardServlet")
public class ForwardServlet extends HttpServlet {
public ForwardServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
rd.forward(request, response);
request.setAttribute("test","helloWorld");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
运行结果:
MyServlet+RedirectServlet:
重定向和请求转发null
MyServlet+ForwardServlet:
重定向和请求转发helloworld
由此可知,MyServlet中的request对象获得了ForwardServlet的request对象设置的值 (请求转发属于一个request范围内) 而RedirectServlet的request对象的属性没有被获得 (属于独立的两个请求和响应过程)
以上是关于JavaWeb—“页面跳转两种方式:请求转发(forward)与重定向(sendRedirect)”的主要内容,如果未能解决你的问题,请参考以下文章