JavaWeb-005-ServletContext详解

ServletContext接口

  • Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。
  • 由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为 application 对象(Web应用程序对象)。
  • 功能:
    • 获取WEB应用程序的初始化参数
    • 记录日志
    • application域范围的属性
    • 访问资源文件
    • 获取虚拟路径所映射的本地路径
    • WEB应用程序之间的访问
    • ServletContext的其他方法

测试代码

package com.mac;

import java.io.IOException;

 * ServletConfig对象:

/*
 * ServletContext对象:
 *  
 *  1.获取当前web应用的初始化参数
 *      1.1.方法:
 *          getInitParameter(String name)
 *          getInitParameterNames(),和ServletConfig里面的两个方法是一样的)
 *  .   1.2.通过ServletContext获取的初始化参数和通过ServletConfig获取的初始化参数的区别:
 *          ServletContext所获取的参数是在全局的,是所有Servlet都可以获取的
 *          ServletConfig获取的参数在某个servlet-name下面的,只有这个Servlet可以获取到
 *  2.获取当前的web应用(就是WebContent下面)的某个文件的绝对路径(在服务器上的路径)
 *      2.1.方法:getRealPath(String relativePath)
 *  3.获取当前Web应用的名称
 *      3.1.方法:getContextPath()
 *  4.获取当前Web应用的某个文件的输入流
 *      4.1.方法:getResourceAsStream(String filePath) 
 *  5.和Atttribute相关的方法,后面再写
 */
public class HelloServlet implements Servlet{

    @Override
    public void destroy() {
        System.out.println("销毁Servlet对象~~~~");
    }

    @Override
    public ServletConfig getServletConfig() {
            System.out.println("获取Servlet配置~~~~");
        return null;
    }

    @Override
    public String getServletInfo() {
        System.out.println("获取Servlet信息~~~~");
        return null;
    }


    @Override
    public void init(ServletConfig config) throws ServletException {

        /*
         * public ServletContext    getServletContext()
         * 返回对调用者在其中执行操作的 ServletContext 的引用。
         * return   一个 ServletContext 对象,调用者用于与其 servlet 容器交互
         */
        
        /*
         * ServletContext对象:
         * 定义一组方法,servlet 使用这些方法与其 servlet 容器进行通信,例如,获取文件的 MIME 类型、
         * 分发请求或写入日志文件。每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文。(“Web 应用程
         * 序”是 servlet 和内容的 Collection,这些 servlet 和内容安装在服务器的 URL 名称空间
         * (比如 /catalog)的特定子集下,并且可能通过 .war 文件安装。)
         * 如果 Web 应用程序在其部署描述符中标记为 "distributed",那么每个虚拟机都将有一个上下文实例。
         * 在这种情况下,不能将上下文用作共享全局信息的位置(因为该信息不会是真正全局共享的)。请使用外部资
         * 源(如数据库)替代。
         * ServletContext 对象包含在 ServletConfig 对象中,ServletConfig 对象在初始化 servlet 时
         * 由 Web 服务器提供给 servlet。
         */
        //1.获取ServletContext对象
        ServletContext servletContext = config.getServletContext();
        
        //2.获取web初始化参数值(web.xml里面的 context-param下面的name和value)
        String jdbcURL = servletContext.getInitParameter("jdbcURL");
        String driver = servletContext.getInitParameter("driver");
        System.out.println("-----------------------------------------");
        System.out.println("driver: " + driver);
        System.out.println("jdbcURL: " + jdbcURL);
        System.out.println("-----------------------------------------");
        
        //3.获取所有的param-name
        Enumeration initParameterNames = servletContext.getInitParameterNames();
        while( initParameterNames.hasMoreElements() ) {
            String name = initParameterNames.nextElement();
            System.out.println("names: " + name);
        }
        System.out.println("-----------------------------------------");
        
        /*
         * public String    getRealPath(String path)
         * 为给定虚拟路径返回包含实际路径的 String。
         * 例如,可以通过对 "http://host/contextPath/index.html" 的请求使路径 "/index.html" 返回服务器文件系统上的
         * 绝对文件路径,其中 contextPath 是此 ServletContext 的上下文路径。
         * 将采用与正在其上运行 servlet 容器的计算机和操作系统相适应的形式返回实际路径
         * (包括采用适当的路径分隔符)。如果 servlet 容器由于某种原因无法将虚拟路径转换为实际路径
         * (例如正从 .war 归档文件中获得内容时),则此方法返回 null。
         * path     指定虚拟路径的 String
         * return   指定实际路径的 String,如果无法执行转换,则返回 null。
         */
        //4.获取当前的web应用(就是WebContent下面)的某个文件的绝对路径(在服务器上的路径)
        String path = servletContext.getRealPath("test.txt");
        System.out.println("test.txt: " + path);
        //test.txt: /Users/mac/Documents/StudyWork/code/JavaWeb/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/005_ServletContext/test.txt
        System.out.println("-----------------------------------------");
        
        /*
         * public String    getContextPath()
         * 返回 Web 应用程序的上下文路径。
         * 上下文路径是用来选择请求上下文的请求 URI 的一部分。请求 URI 中首先出现的总是上下文路径。
         * 路径以 "/" 字符开头但不以 "/" 字符结束。对于默认(根)上下文中的 servlet,此方法返回 ""。
         * servlet 容器可能通过多个上下文路径匹配一个上下文。在这种情况下,getContextPath() 将返回该请求
         * 使用的实际上下文路径,它可能不同于此方法返回的路径。此方法返回的上下文路径应该被认为是应用程序的
         * 主要或首选上下文路径。
         * return   Web 应用程序的上下文路径;对于默认(根)上下文,返回 ""
         */
        //5.获取当前Web应用的名称
        String webName = servletContext.getContextPath();
        System.out.println("contextPath: " + webName);
        // /003_FirstServlet
        System.out.println("-----------------------------------------");
    
        //6.获取当前web应用中的某个文件的输入流(根目录是当前web应用的目录,这里是/005_ServletContext)
        InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/test.properties");    
        //注意,这里是实际路径上的,文件最后是放在classes下面的
        //注意,classes虽然是在build下面,但是映射到WEB-INF下面的,可以这么访问
        System.out.println("file: " + is);
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("Servlet服务~~~~");
    }
    
    public HelloServlet() {
        System.out.println("构造器~~~~");
    }

}

运行结果

信息: Starting Servlet Engine: Apache Tomcat/7.0.81
构造器~~~~
-----------------------------------------
driver: com.mysql.jdbc.Driver
jdbcURL: jdbc:mysql:///test
-----------------------------------------
names: driver
names: jdbcURL
-----------------------------------------
test.txt: /Volumes/Study/code/JavaWeb/Course/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Course_005_ServletContext/test.txt
-----------------------------------------
contextPath: /003_FirstServlet
-----------------------------------------
file: java.io.FileInputStream@7443cf39
十月 17, 2017 11:33:21 上午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
构造器~~~~
Servlet初始化~~~~参数: org.apache.catalina.core.StandardWrapperFacade@45887fe0
十月 17, 2017 11:33:21 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
十月 17, 2017 11:33:21 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
十月 17, 2017 11:33:21 上午 org.apache.catalina.startup.Catalina start
信息: Server startup in 627 ms
Servlet服务~~~~

完整源码下载:

关注下方微信公众号,并回复:ServletContext.code

欢迎加入交流群:451826376

更多信息:www.itcourse.top

完整教程PDF版本下载

你可能感兴趣的:(JavaWeb-005-ServletContext详解)