zoukankan      html  css  js  c++  java
  • Servlet的页面跳转

    Servlet的跳转
        内部跳转

       req.getRequestDispatcher()
            Server--->AServlet--->BServlet
            两个Servlet共用一个request,response

        include(req,resp)输出流合并

        forward(req,resp)out清空,输出后者Servlet的输出,request,response其他信息不变
        在服务器内部由一个Servlet跳转到另外一个Servlet
        这两个Servlet共用同一个request,response
          如果include(req,resp)
            输出流合并
        a: out.print("hello ");
        b: out.println("world");
             hello world
        在跳转之前out.flush() 不会报错
        在跳转之前out.close() 不会报错,只显示第一个servlet内容
          如果forword(req,resp);  
            输出流清空
            a: out.print("hell ");
          跳转的时候,清空out
        b: out.println("world");
          world
        在跳转之前out.flush() 报错
       !从一个Servlet跳转Servlet
         AServlet  ->  BServlet
         AServlet  ->  JSP(servlet)

       从一个Servlet跳转到html(输出流)

       特点:
         1.浏览器地址栏的地址不会发生变化  a-b   a
         2.跳转发生在服务器的内部,实际上浏览器只向服务器发送了一次请求


        外部跳转(重定向)

      resp.sendRedirect()
            AServlet--->Server
            Server--->BServlet

       response.sendRedirect();

         1.浏览器地址栏的地址发生变化  a-b   b
         2.浏览器实际上向服务器发送了两次请求
        
      多次访问同一个servlet,由于Servlet是单例,所以访问的是同一个对象
    但是request,response对象,每次访问都会产生一个新对象

    一个形象的例子说明转发与重定向:

      A同学问B老师问题,然后B老师回答了一半,提供一些必要信息,它将剩下的交给C老师帮忙解答。    include(req,resp).在客观立场上是A问B老师的问题,虽然C老师也参与了,但只是幕后,所以;浏览器网址为Bservlet的网址。将A老师的答案和B老师的答案综合才是正确答案。

      A同学问B老师问题,然后B老师前面回答了一点却无法往下走,他将剩下的交给C老师帮忙解答。C老师利用了B老师提供的一些必要信息。C老师解答出来推翻了B老师所有推论,所以结果仅仅是C老师的答案。  forward(req,resp),客观上还是A问B老师的问题,浏览器地址栏不变,将B的outflush掉了显示的只是C老师的内容。

      A同学问B老师问题,B老师由于种种原因没有答出来。然后A同学去问C老师。  resp.sendRedirect() 前后是两个事件了,没有任何联系。B中的信息在C中完全没有使用,单纯的成为了A和C之间的问题。所以浏览器地址栏发生了变化。向浏览器发送了两次请求。

    代码:

    package com.etc.hh;
    
    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 AServlet extends HttpServlet{
    
        /**
         * 
         */
        private static final long serialVersionUID = -7797104755858628468L;
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req, resp);
        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("AServlet---");
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html");
            PrintWriter out=resp.getWriter();
            out.write("hello ");
            //RequestDispatcher dispatcher=req.getRequestDispatcher("b");
            //dispatcher.include(req, resp);//输出流合并
            /**
             * 这里需要注意一个问题:
             *     就是out的关闭和flush,在dispatcher之前不应该out.flush或者out.close
             *  我的理解:tomcat服务器进行通信使用response对象有点类似于前面网络编程的Socket套接字,使用同一个套接字客户端不可以在服务器未反馈之前关闭
             */
            
            //dispatcher.forward(req, resp);//转发。将前面的out中数据默认flush清空,只显示后者out中的数据
            /**
             * 如果在关闭或者flushout之后进行跳转操作会报错:
             * java.lang.IllegalStateException: Cannot forward after response has been committed
             */
            
            /**
             * 外部跳转(重定向)
             * respnse.sendRTedirect()
             *  不接受前面的request和response信息,与前面的Servlet毫无相关,重新进入了一个其他Servlet
             *  内容只是新Servlet的内容。
             *  因为与跳转前信息无关,所以地址栏改变成重定向后的页面地址
             */
            resp.sendRedirect("b");
            
            out.flush();
            out.close();
        }
    }
    package com.etc.hh;
    
    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 BServlet extends HttpServlet{
    
        /**
         * 
         */
        private static final long serialVersionUID = -7797104755858628468L;
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req, resp);
        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("bServlet-----");
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html");
            PrintWriter out=resp.getWriter();
            out.write("world");
            out.flush();
            out.close();
        }
    }
     <servlet>
          <servlet-name>AServlet</servlet-name>
          <servlet-class>com.etc.hh.AServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>AServlet</servlet-name>
          <url-pattern>/a</url-pattern>
      </servlet-mapping>
      
      <servlet>
          <servlet-name>BServlet</servlet-name>
          <servlet-class>com.etc.hh.BServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>BServlet</servlet-name>
          <url-pattern>/b</url-pattern>
      </servlet-mapping>
    View Code
  • 相关阅读:
    Luogu 5043 【模板】树同构([BJOI2015]树的同构)
    NOIP2018 解题笔记
    CF916E Jamie and Tree
    Luogu 3242 [HNOI2015]接水果
    CF570D Tree Requests
    Luogu 4438 [HNOI/AHOI2018]道路
    Luogu 4755 Beautiful Pair
    Luogu 2886 [USACO07NOV]牛继电器Cow Relays
    c# ref 的作用
    ORA-01858: 在要求输入数字处找到非数字字符
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5671792.html
Copyright © 2011-2022 走看看