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)”的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb学习总结JavaWeb开发入门

javaweb这个功能怎么实现 ajax

JavaWeb学习笔记总结 目录篇

javaweb项目启动报错

javaweb怎么做一个目录树

JavaWeb学习—JavaWeb简介