zoukankan      html  css  js  c++  java
  • javaweb之请求的转发和重定向

    1.什么是请求转发和请求重定向?

    请求转发: xxServlet收到请求,然后直接转发给yyServlet,然后yyServlet返回给客户端。整个过程中,客户端发出一个请求,收到一个响应。

    重定向:xxServlet收到请求,然后发出一个响应给客户端,客户端立即又发送一个请求访问xxServlet中给的URL,即yyServlet的路径,然后yyServlet给客户端一个响应。整个过程中,客户端发出两个请求,收到两个响应。

    2. 请求转发和请求重定向的实现方法

    请求转发:利用RequestDispather接口中的forward方法实现请求转发。

    请求重定向:利用HttpServletResponse的sendRedirect方法实现请求重定向。

    2.1 请求转发

    RequestDispather实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源,(例如Servlet,HTML文件,JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。

    示例代码如下:

    forwardTest.html

    <!DOCTYPE html>
    <html>
      <head>
        <title>forwardTest.html</title>
    	
        <meta name="keywords" content="keyword1,keyword2,keyword3">
        <meta name="description" content="this is my page">
        <meta name="content-type" content="text/html; charset=UTF-8">
        
        <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    
      </head>
      
      <body>
        <a href="http://localhost:8080/MyWebProject/forwardServlet">forward</a>
      </body>
    </html>
    

     forwardServlet.java

    package forwardTest;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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 forwardServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out=response.getWriter();
    		System.out.println("forwardServlet's doGet");
    		String path="testServlet";
    		//1.调用HttpServletRequest的getRequestDispatcher()方法,调用时需要传入转发的地址;
    		RequestDispatcher requestDispatcher=request.getRequestDispatcher(path);
    		//2.调用HttpServletRequest的forward(request,response)方法进行请求的转发;
    		requestDispatcher.forward(request,response);
    	}
    }
    

     testServlet.java

    package forwardTest;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class testServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out=response.getWriter();
    		System.out.println("testServlet's doGet");
    	}
    
    }
    

    运行forwardTest.html后,点击超链接,控制台输出:

    可以看出, forwardServlet收到客户端的请求后,调用HttpServletRequest的getRequestDispatcher()方法,利用forward(request,response)方法进行请求转发,将请求直接转发给testServlet,testServlet将响应返回给客户端。达到了请求转发的目的。

    2.2 请求重定向

    redirectServlet.java

    package forwardTest;
    
    import java.io.IOException;
    //import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class redirectServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("redirectServlet's doGet");
    		String path="testServlet";
    		response.sendRedirect(path);
    	}
    }
    

    执行请求的重定向,直接调用response.sendRedirect(path)方法,path为重定向的地址。

    3.请求的转发和重定向的区别

    本质区别:请求的转发只发出了一次请求,而重定向则发出了两次请求。在浏览器的开发工具中可以看到请求的次数:

    具体的区别体现在:

      1.请求的转发:地址栏是初次发出请求的地址。

         请求的重定向:地址栏不是初次发出请求的地址,为最后响应的地址。

      2.请求转发:在最终的Servlet中,request和中转的那个request是同一个对象。

         请求的重定向:在最终的Servlet中,request和中转的那个request不是同一个对象。

      3.请求转发:只能转发给当前web应用的资源。

        请求的重定向:可以重定向到任何资源。

      4.请求的转发:/代表的是当前web应用的根目录。

        请求的重定向:/代表的是当前web站点的根目录。

    wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

  • 相关阅读:
    django-debug-toolbar的配置以及使用
    Django+telnetlib实现webtelnet
    Centos7 安装 telnet 服务
    Django+paramiko实现webshell
    Zabbix 历史数据存储到 Elasticsearch
    CA和自签证书
    linux加密算法与应用
    LVM拆除pv对应的磁盘
    目录迁移
    添加一个swap设备
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9795099.html
Copyright © 2011-2022 走看看