• ServletContext(重要)


    ServletContext上下文对象。---->解耦合(通过它实现Servlet之间的传递数据)

      一个项目只有一个ServletContext对象!

      我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!

      与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!

    1.ServletContext概述

    服务器会为每个应用创建一个ServletContext对象;

    *ServletContext对象的创建是在服务器启动时完成的;

    *ServletContext对象的销毁是在服务器关闭时完成的。

      ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。

    2.获取ServletContext

    ServletConfig#getServletContext();

    GenericServlet#getServletContext();

    HttpSession#getServletContext();------>先不着急学

    ServletContextEvent#getServletContext();------>先不着急学

    Servlet中获取ServletContext对象:

      *在void init(ServletConfig  config)中:ServletContext  context=config.getServletContext();,

       ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;

    GenericServletHttpServlet中获取ServletContext对象

      *GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;

    3.域对象的功能

    ServletContext是JavaWeb四大域对象之一:

      **PageContext;

      **ServletRequest;

      **HttpSession;

      **ServletContext;

      所有域对象都有存取数据的功能,因为域对象内部有一个Map(键不能相同),用来存取数据,下面是ServletContext对象用来操作数据的方法:

      **void setAttribute(String name,Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute("xxx","XXX"),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

      **Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value=(String)servletContext.getAttribute("xxx");,获取名为xxx的域属性;

      **void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

      **Enumeration getAttributeNames():获取所有域属性的名称;

    代码演示:

    AServlet.java向ServletContext里存入数据

     1 package one.servlet;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletContext;
     7 import javax.servlet.ServletException;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 
    12 public class AServlet extends HttpServlet {
    13 
    14     
    15     public void doGet(HttpServletRequest request, HttpServletResponse response)
    16             throws ServletException, IOException {
    17         /*
    18          * 1.获取ServletContext对象
    19          * 2.调用其setAttribute()方法完成保存数据
    20          * */
    21         //直接获取,是从父类继承过来的方法
    22         ServletContext application=this.getServletContext();
    23         application.setAttribute("name", "张三");
    24         System.out.println("存入成功");    
    25     }
    26 }

    BServlet.java从ServletContext中读数据

     1 package one.servlet;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletContext;
     7 import javax.servlet.ServletException;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 
    12 public class BServlet extends HttpServlet {
    13 
    14     public void doGet(HttpServletRequest request, HttpServletResponse response)
    15             throws ServletException, IOException {
    16         /*
    17          * 1.获取ServletContext对象
    18          * 2.然后在getAttribute();得到数据
    19          * */
    20         ServletContext application=this.getServletContext();
    21         String value = (String)application.getAttribute("name");
    22         System.out.println("我是BServlet:"+value);
    23     }
    24 }

    先在浏览器中请求AServlet,它会存入数据;然后再请求BServlet,可以从中读数据。

    4.获取应用初始化参数

      *servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个servlet只能获取自己的初始化参数,不能获取其他servlet的参数,即初始化参数只为一个Servlet准备!

      *可以配置公共的初始化参数,为所有的Servlet而用!这需要使用ServletContext才能使用!

    web.xml

     1 <web-app...>
     2  <context-param>
     3     <param-name>AAA</param-name>
     4     <param-value>aaa</param-value>
     5  </context-param>
     6  <context-param>
     7     <param-name>BBB</param-name>
     8     <param-value>bbb</param-value>
     9  </context-param>
    10 <web-app>

    CServlet.java

     1 package one.servlet;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 import java.util.Enumeration;
     6 
     7 import javax.servlet.ServletContext;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.http.HttpServlet;
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletResponse;
    12 
    13 public class CServlet extends HttpServlet {
    14 
    15     
    16     public void doGet(HttpServletRequest request, HttpServletResponse response)
    17             throws ServletException, IOException {
    18         //演示得到公共的参数
    19         ServletContext app=this.getServletContext();
    20         String path = app.getContextPath();//返回web应用程序的上下文路径。
    21         System.out.println(path);
    22         String initParameter1 = app.getInitParameter("AAA");
    23         String initParameter2 = app.getInitParameter("BBB");
    24         Enumeration<String> initParameterNames = app.getInitParameterNames();
    25         
    26         System.out.println(initParameter1);
    27         System.out.println(initParameter2);
    28         
    29         while(initParameterNames.hasMoreElements()){
    30             System.out.println(initParameterNames.nextElement());
    31         }
    32     }
    33 }

    请求CServlet之后控制台的结果:

    /XJS_Servlet2
    aaa
    bbb
    BBB
    AAA
    

      还可以使用ServletContext来获取web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同:

    5.获取资源相关方法

    5.1获取(任意资源的)真实路径

      还可以使用ServletContext对象来获取web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。

      *获取a.txt的真实路径:String realPath=ServletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的绝对路径:G:Tomcatapache-tomcat-8.0.28webappsXJS_Servlet2a.txt

    5.2获取资源流

      不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:

      *获取a.txt资源流:InputStream in=servletContext.getResourceAsStream("/a.txt");

      *获取b.txt资源流:InputStream in=servletContext.getResourceAsStream("/WEB-INF/b.txt");

    代码示例:

     1 package one.servlet;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class DServlet extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         //得到这个文件的资源路径(带盘符的)    
    16         String path=this.getServletContext().getRealPath("/a.txt");
    17         System.out.println(path);
    18         
    19         //InputStream in=new FileInputStream(path);
    20         //获取资源的路径后,再创建出输入流对象!
    21         InputStream in=this.getServletContext().getResourceAsStream("/a.txt");
    22         byte[] b=new byte[1024];
    23         int n=0;
    24         while((n=in.read(b))!=-1){
    25             //把字节转换成String
    26             String s=new String(b,0,n);//String类的一个构造方法
    27             System.out.println(s);
    28         }
    29         in.close();//关闭文件流
    30     }
    31 }

    请求该DServlet后控制台的结果:

    G:Tomcatapache-tomcat-8.0.28webappsXJS_Servlet2a.txt
    I Love IU!
    dddddddddd

    5.3获取指定目录下所有资源路径

      还可以使用ServletContext获取指定目录下所有资源路径,例如获取 / WEB-INF 下所有资源的路径:

    Set set  = context.getResourcePaths("/WEB-INF");
    System.out.println(set);
    =============结果======================
    [/WEB-INF/lib/ , /WEB-INF/classes/ , /WEB-INF/web.xml]

    注意:本方法必须以“ /”开头!!! 

  • 相关阅读:
    ANDROID_MARS学习笔记_S04_004_用HTTPCLENT发带参数的get和post请求
    ANDROID_MARS学习笔记_S04_003_用HttpClent发http请求
    ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作
    ANDROID_MARS学习笔记_S04_001_OAUTH获取request_token
    ANDROID_MARS学习笔记_S04_001_OAuth简介
    ANDROID_MARS学习笔记_S03_009_GOOGLEMAP3
    ANDROID_MARS学习笔记_S03_008_GOOGLEMAP2
    ANDROID_MARS学习笔记_S03_007_GoogleMap1
    适配ios9出现的问题:-canOpenURL: failed for URL
    使用第三方SDK出现: duplicate symbol _llvm.cmdline in:
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/10766305.html
Copyright © 2020-2023  润新知