zoukankan      html  css  js  c++  java
  • 04_web基础(六)之请求转发与重定向

      1.交互方式

      Web组件之间跳转: 从AServlet 跳转到 BServlet.
      三种类型:
      1:请求转发(forward)
      2:URL重定向(redirect)
      3:请求包含(include)

    34.请求转发详讲(非常重要)


    请求转发(forward):
        AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能.
    语法:
        request对象.getRequestDispatcher(String path).forward(request,response);

        参数:
            path:表示目标资源名称(跳转到哪里去)
        注意:别忘了写forward(request,response).
    =============================================================================
    请求转发的特点:
        1):浏览器地址栏路径没变,依然是Servlet1的资源名称.
        2):只发送了一个请求.
        3):共享同一个请求,在请求中共享数据.
        4):最终的响应输出由Servlet2来决定.
        5):只能访问当前应用中的资源,不能跨域跳转.
        6):可以访问WEB-INF中的资源.
        7):转发完成之后,Servlet1中的业务代码继续执行
      代码实现

     1 package com.day07.web.demo2.controller2;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import java.io.IOException;
     9 import java.io.PrintWriter;
    10 
    11 /**
    12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    13  * 疑问咨询wx:851298348
    14  */
    15 
    16 /**
    17  * 请求转发(forward):
    18  AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能.
    19  语法:
    20  request对象.getRequestDispatcher(String path).forward(request,response);
    21 
    22  参数:
    23  path:表示目标资源名称(跳转到哪里去)
    24  注意:别忘了写forward(request,response).
    25  =============================================================================
    26  请求转发的特点:
    27  1):浏览器地址栏路径没变,依然是Servlet1的资源名称.
    28  2):只发送了一个请求.
    29  3):共享同一个请求,在请求中共享数据.
    30  4):最终的响应输出由Servlet2来决定.
    31  5):只能访问当前应用中的资源,不能跨域跳转.
    32  6):可以访问WEB-INF中的资源.
    33  7):转发完成之后,Servlet1中的业务代码继续执行
    34 
    35  */
    36 @WebServlet("/a")
    37 public class AServlet extends HttpServlet {
    38     @Override
    39     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    40         // 从AServlet跳转到BServlet
    41         System.out.println("------AServlet----------");
    42        // request对象.getRequestDispatcher(String path).forward(request,response);
    43         //请求转发
    44         req.setAttribute("name","wuji");//作用范围:仅仅限于当前请求
    45        // req.getRequestDispatcher("/b").forward(req,resp);
    46 
    47         req.getRequestDispatcher("/WEB-INF/views/a.jsp").forward(req,resp);
    48         System.out.println("------AServlet---已完成转发-------");
    49         //https://www.baidu.com/
    50         //req.getRequestDispatcher("https://www.baidu.com/").forward(req,resp);//
    51         PrintWriter writer = resp.getWriter();
    52         writer.print("==========A============");
    53     }
    54 }
    AServlet
     1 package com.day07.web.demo2.controller2;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import java.io.IOException;
     9 import java.io.PrintWriter;
    10 
    11 /**
    12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    13  * 疑问咨询wx:851298348
    14  */
    15 @WebServlet("/b")
    16 public class BServlet extends HttpServlet {
    17     @Override
    18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19 
    20         System.out.println("------BServlet----------");
    21         String name = (String) req.getAttribute("name");
    22         System.out.println("name="+name);
    23         PrintWriter writer = resp.getWriter();
    24         writer.print("==========B============");
    25     }
    26 }
    BServlet
     1 <%--
     2   Created by IntelliJ IDEA.
     3   User: lidongping
     4   Date: 2018/5/3
     5   Time: 17:49
     6   To change this template use File | Settings | File Templates.
     7 --%>
     8 <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
     9 <html>
    10 <head>
    11     <title>a标题</title>
    12 </head>
    13 <body>
    14 我是AServlet
    15 </body>
    16 </html>
    a.jsp

     35.重定向详解(非常重要)

      URL重定向(redirect):
        AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
    语法:
        response对象.sendRedirect(String path);
        参数:path,表示目标资源名称.
    ------------------------------------------------------------------------
    URL重定向的特点:
        1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
        2):发送了两个请求.
        3):因为是不同的请求,所以不能共享请求中的数据.
        4):最终的响应输出由Servlet2来决定.
        5):可以跨域访问资源.
        6):不可以访问WEB-INF中的资源.

    代码:

     1 package com.day07.web.demo2.controller2;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import java.io.IOException;
     9 import java.io.PrintWriter;
    10 
    11 /**
    12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    13  * 疑问咨询wx:851298348
    14  */
    15 
    16 /**
    17  * URL重定向(redirect):
    18  AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
    19  语法:
    20  response对象.sendRedirect(String path);
    21  参数:path,表示目标资源名称.
    22  ------------------------------------------------------------------------
    23  URL重定向的特点:
    24  1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
    25  2):发送了两个请求.
    26  3):因为是不同的请求,所以不能共享请求中的数据.
    27  4):最终的响应输出由Servlet2来决定.
    28  5):可以跨域访问资源.
    29  6):不可以访问WEB-INF中的资源.
    30 
    31  */
    32 @WebServlet("/c")
    33 public class CServlet extends HttpServlet {
    34     @Override
    35     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    36         System.out.println("------CServlet----------");
    37         //response对象.sendRedirect(String path);
    38         req.setAttribute("key","周美玲");
    39        // resp.sendRedirect("/d");
    40         //resp.sendRedirect("https://www.baidu.com/");
    41         resp.sendRedirect("/WEB-INF/views/a.jsp");
    42 
    43         System.out.println("------CServlet-----已跳转完成-----");
    44         PrintWriter writer = resp.getWriter();
    45         writer.print("------------CServlet----------");
    46     }
    47 }
    CServlet
     1 package com.day07.web.demo2.controller2;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import java.io.IOException;
     9 import java.io.PrintWriter;
    10 
    11 /**
    12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    13  * 疑问咨询wx:851298348
    14  */
    15 @WebServlet("/d")
    16 public class DServlet extends HttpServlet {
    17     @Override
    18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19         System.out.println("------DServlet----------");
    20         String key = (String) req.getAttribute("key");
    21         System.out.println("-------------------"+key);
    22         PrintWriter writer = resp.getWriter();
    23         writer.print("------------DServlet----------");
    24 
    25     }
    26 }
    DServlet

    36.生产生如何选择请求转发还是重定向

      请求转发和URL重定向的选择?
       1:若需要共享请求中的数据,只能使用请求转发.
       2:若需要访问WEB-INF中的资源,只能使用请求转发.
       3:若需要跨域访问,只能使用URL重定向.
       4:其他时候,任选.

    37.四大作用域(非常重要)

      Web组件(Servlet/JSP)的数据共享得需要作用域对象.
    作用域对象存在的意义:在多个Web组件之间共享和传递数据.
    四大作用域对象:
    名称                                 类型                            描述
    ----------------------------------------------------------------------------------------------------------------
    request                  HttpServletRequest        表示当前请求范围. 只是共享同一个请求中的数据,若是不同的请求之间,是不能共享的,每次请求都是新的请求对象.
    pageContext(page)        PageContext               表示当前JSP页面的范围(讲jsp的时候说).
    session                  HttpSession               表示当前会话范围. 只要浏览器不关闭,session就是同一个对象.就可以共享该会话中的数据.
    application              ServletContext            表示当前应用范围. Tomcat开始启动,application对象就创建好了,Tomcat关闭application对象销毁.
                                                             在整个Web的生命周期中(Tomcat启动--Tomcat关闭),有且只有一个application对象.
    -----------------------------------------------------------------------------------------------------------------
    设置共享信息:
            域对象.setAttribute(String name,Object value);
    获取共享信息:
            Object value  = 域对象.getAttribute(String name);
    修改共享信息:
            重新设置一个同名的属性.
    删除共享信息:
            域对象.removeAttribue(String name);

    注意:往哪一个作用域对象中存储数据,就只能从哪一个作用域中获取数据.  
       基本:  一般的组件之间的数据共享,存放在request中,此时只能使用请求转发.
                    登陆信息存放在Session中.
    代码:

     1 package com.day07.web.demo2.controller2;
     2 
     3 import javax.servlet.ServletContext;
     4 import javax.servlet.ServletException;
     5 import javax.servlet.annotation.WebServlet;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 import javax.servlet.http.HttpSession;
    10 import java.io.IOException;
    11 import java.io.PrintWriter;
    12 
    13 /**
    14  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    15  * 疑问咨询wx:851298348
    16  */
    17 @WebServlet("/demoServlet")
    18 public class DemoServlet extends HttpServlet {
    19     @Override
    20     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    21         PrintWriter writer = resp.getWriter();
    22         //request 请求作用域  HttpServletRequest
    23         //取出来
    24         Integer num1 = (Integer)req.getAttribute("request");
    25         System.out.println("num1="+num1);
    26 
    27         //放数据
    28         if (num1==null || num1==0){
    29             num1=1;
    30             req.setAttribute("request",num1);
    31         }else {
    32             num1=num1+1;
    33             req.setAttribute("request",num1);
    34         }
    35 
    36         System.out.println("request="+num1);//在控制台输出
    37         writer.println("request="+num1);//在页面输出
    38 
    39         //session  作用域
    40         //1.获取session对象
    41         HttpSession session = req.getSession();
    42 
    43         //取出来
    44         Integer num2 = (Integer)session.getAttribute("session");
    45 
    46 
    47         //放数据
    48         if (num2==null || num2==0){
    49             num2=1;
    50             session.setAttribute("session",num2);
    51         }else {
    52             num2=num2+1;
    53             session.setAttribute("session",num2);
    54         }
    55 
    56         System.out.println("session="+num2);//在控制台输出
    57         writer.println("session="+num2);//在页面输出
    58 
    59         //ServletContext   作用域
    60         //1.获得ServletContext 应用上下文
    61         ServletContext servletContext = req.getServletContext();
    62         //取出来
    63         Integer num3 = (Integer)servletContext.getAttribute("servletContext");  // key   value   x=2
    64 
    65 
    66         //放数据
    67         if (num3==null || num3==0){
    68             num3=1;
    69             servletContext.setAttribute("servletContext",num3);
    70         }else {
    71             num3=num3+1;
    72             servletContext.setAttribute("servletContext",num3);
    73         }
    74 
    75         System.out.println("servletContext="+num3);//在控制台输出
    76         writer.println("servletContext="+num3);//在页面输出
    77 
    78 
    79 
    80     }
    81 }
    DemoServlet

     38.ServletContext的API学习

      ServletContext接口,表示的应用,Tomcat启动的时候创建一个对象,Tomcat关闭对象销毁,在整个Web的生命周期中,只有一个对象,表示的就是当前应用.
    ===========================================================================
    如何获取该对象:
       1):若在Servlet中:
          ServletContext ctx = super.getServletContext();
          GenericServlet实现了Servlet和ServletConfig接口,而getServletContext方法就在ServletConfig接口中.
       2):通过请求对象获取:
          ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持
           ServletContext ctx3 = req.getSession().getServletContext();//遥远以前
    ==============================================================================
    常用方法:
       1):String getContextPath():获取当前应用的上下文路径.
       2):String getRealPath(String path):获取某个资源的路径.
       3):全局初始化参数:
           先看传统的Servlet的初始化参数:
      
          因为配置在当前ServletPage中,所以只能被ServletPage使用,其他Servlet无法使用.
          而在开发中,多个Web组件(Servlet/Filter)可以拥有共同的初始化参数,此时只能配置N次,不利于维护.
          解决方案:使用全局的初始化参数,Web组件都可以共用,配置问web.xml文件中.
      
           注意:获取全局的初始化参数,就再也不能使用ServletConfig对象.getInitParameter来获取了.
           只能使用,ServletContext对象.getInitParameter(String paramName);
    面试题:
       说说以下的区别:
        request.getParameter(String name)://获取用户输入的参数信息
        request.getAtribute(String name): //获取程序员自己设置的共享信息
    ===========================================================
        ServletConfig对象.getInitParameter(String name);
        ServletContext对象.getInitParameter(String name);
      代码:

     1 package com.day07.web.demo2.controller2;
     2 
     3 import javax.servlet.ServletContext;
     4 import javax.servlet.ServletException;
     5 import javax.servlet.annotation.WebServlet;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 import java.io.IOException;
    10 
    11 /**
    12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    13  * 疑问咨询wx:851298348
    14  */
    15 @WebServlet("/servletContextDemoServlet")
    16 public class ServletContextDemoServlet extends HttpServlet {
    17     @Override
    18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19         //获取对象  ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持
    20         ServletContext servletContext = req.getServletContext();
    21        // 1):String getContextPath():获取当前应用的上下文路径.
    22         String contextPath = servletContext.getContextPath();
    23         System.out.println("contextPath="+contextPath);
    24         // 2):String getRealPath(String path):获取某个资源的路径.
    25         String realPath = servletContext.getRealPath("/servletContextDemoServlet");
    26         System.out.println("realPath="+realPath);
    27         //全局初始化参数:
    28         String name1 = servletContext.getInitParameter("name1");
    29         System.out.println("name1="+name1);
    30 
    31     }
    32 }
    ServletContextDemoServlet
  • 相关阅读:
    STM32F030 启用内部晶振并配置系统时钟为48M
    CSS 动画过程及间接实现样式延时
    Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data
    21 GetHashCode Equels ReferenceEquals的比较
    3 Base64编码主要应用在那些场合?
    2 什么是编码?什么是Unicode?
    2 名企面试_02
    ListView
    Image
    Container
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8986851.html
Copyright © 2011-2022 走看看