重定向和请求转发相关知识点和代码详解

重定向和请求转发

知识点

重定向:

1.重定向是指页面重新定位到某个新地址
  • 之前的请求Request失效 ,进入一个新的请求;
  • 跳转后浏览器地址栏内容将变成心得指定地址;
2.重定向是通过HttpServletResponse对象的sendRedirect()来实现
  • 该方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL;
  • 相当于浏览器重新发送一个请求;
public void sendRedirect(java.lang.String location);

请求转发

  • 请求转发是指将请求再转发到另一资源(一般为JSP或Servlet);
  • 此过程依然在一个请求范围内,转发后浏览器地址栏内容不变
  • 请求转发使用RequestDispatcher接口中的**forward()**方法来实现;
  • 该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应;
RequestDispatcher rd=request.getRequestDispatcher(path);
rd.forward(request,response);

重定向与请求转发的区别

  • forward()只能将请求转发给同一个Web应用中的组件,sendRedirect()不仅可以重定向到当前应用程序中的其它资源,还可以重定向到其它站点的资源;
  • sendRedirect()方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用forward()方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变;
  • forward()方法的调用者与被调用者之间共享相同的request对象和response对象;而sendRedirect()方法调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。

实践

重定向

1.MyServlet类

package myPackage;

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;

/**
 * Servlet implementation class MyServlet
 */
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("跳转结果");
		String test=(String) request.getAttribute("test");
		out.println(test);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2.RedirectServlet类

package myPackage;

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;

/**
 * Servlet implementation class RedirectServlet
 */
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RedirectServlet() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("重定向前");
		//向请求中存值(键值对)
		request.setAttribute("test", "Hello World!");
		//重定向
		response.sendRedirect(request.getContextPath()+"/MyServlet");
		out.println("重定向后");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

RedirectServlet类运行结果:
在这里插入图片描述
可见运行后的url地址为MyServlet
以及request和response的值未共享

请求转发

1.MyServlet类同上
2.ForwardServlet类

package myPackage;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class ForwardServlet
 */
@WebServlet("/ForwardServlet")
public class ForwardServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ForwardServlet() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("请求转发前");
		request.setAttribute("test", "Hello World!");
		RequestDispatcher rd=request.getRequestDispatcher("/MyServlet");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

运行结果:
在这里插入图片描述
url地址为ForwardServlet,即地址不变
且共享request和response

猜你喜欢

转载自blog.csdn.net/weixin_44775375/article/details/106166716