zoukankan      html  css  js  c++  java
  • Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象

    本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法。

    ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始化时,Servlet容器传递信息给正在初始化的servlet对象。

    public abstract interface javax.servlet.ServletConfig {
      public abstract java.lang.String getServletName();
      public abstract javax.servlet.ServletContext getServletContext();
      public abstract java.lang.String getInitParameter(java.lang.String arg0);
      public abstract java.util.Enumeration getInitParameterNames();
    }
    • getServletName()方法:

    用来返回当前servlet在web.xml注册的servlet-name;

    • getServletContext()方法:

    获取servlet上下文信息。

    • getInitParameter(String arg0)方法:

    根据一个指定的参数名称,获取在servlet初始化时传递的参数值,而这样的参数信息往往配置在web.xml。

    • getInitParameters()方法:

    返回servlet初始化时,传递进来的所有参数名称集合。

    为了能了解到ServletConfig相关的使用,我们需要在之前新建的MyServlet001工程中,修改web.xml,在<servlet>节点中添加<init-param>节点:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     5     id="WebApp_ID" version="3.0">
     6 
     7     <!-- 配置和映射 servlet -->
     8     <servlet>
     9         <!-- Servlet注册的名字 -->
    10         <servlet-name>helloServlet</servlet-name>
    11         <!-- Servlet全类名 -->
    12         <servlet-class>com.dx.hello.HelloServlet</servlet-class>
    13         
    14         <!-- 配置Servlet的初始化参数。且节点必须在 load-on-startup节点的前边 -->
    15         <init-param>
    16             <param-name>username</param-name>
    17             <param-value>user001</param-value>
    18         </init-param>
    19         <init-param>
    20             <param-name>password</param-name>
    21             <param-value>123456</param-value>
    22         </init-param>
    23 
    24         <!-- 指定servlet被初始化的时机 -->
    25         <load-on-startup>-1</load-on-startup>
    26     </servlet>
    27     <servlet-mapping>
    28         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
    29         <servlet-name>helloServlet</servlet-name>
    30         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
    31         <url-pattern>/hello</url-pattern>
    32     </servlet-mapping>
    33 
    34 </web-app>

    在配置参数时,需要注意事项:

    <load-on-startup>节点必须在<init-param>节点的下边,否则会抛出异常信息,配置不通过。

    之后再HelloServlet的init方法中,添加代码:

     1 public void init(ServletConfig config) throws ServletException {
     2         System.out.println("init");
     3 
     4         // 根据ServletConfig的getInitParameter()方法,根据特定初始化参数名称,获取对应的初始化参数值。
     5         String username = config.getInitParameter("username");
     6         String password = config.getInitParameter("password");
     7         System.out.println("username:" + username);
     8         System.out.println("password:" + password);
     9 
    10         // 根据ServletConfig的getInitParameterNames()方法,获取初始化参数信息。
    11         Enumeration<String> names = config.getInitParameterNames();
    12         while (names.hasMoreElements()) {
    13             String name = names.nextElement();
    14             String value = config.getInitParameter(name);
    15             System.out.println(name + ":" + value);
    16         }
    17 
    18         // 获取Servlet名称。
    19         String servletName = config.getServletName();
    20         System.out.println(servletName);
    21 
    22         ServletContext servletContext = config.getServletContext();
    23     }

    重新启动tomcat,并在浏览器中输入地址:http://localhost:8080/MyServlet001/hello,回车,之后查看tomcat服务器输出信息:

    INFO: Server startup in 1262 ms
    HelloServlet constructor
    init
    username:user001
    password:123456
    username:user001
    password:123456
    helloServlet
    service

    从上边的输出信息,及代码中,就可以理解,getInitParameter(),getInitParameters(),getServletName()的用法。

    ServletContext servletContext=config.getServletContext();

    这个ServletContext是怎么解释,有什么用处呢?

    我们查看官网对ServletContext的介绍:

    public interface ServletContext

    Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.

    There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.)

    In the case of a web application marked "distributed" in its deployment descriptor, there will be one context instance for each virtual machine. In this situation, the context cannot be used as a location to share global information (because the information won't be truly global). Use an external resource like a database instead.

    The ServletContext object is contained within the ServletConfig object, which the Web server provides the servlet when the servlet is initialized.

    ServletContext接口:

    1、Servlet引擎为每个web应用程序都创建了一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext()方法就可以返回ServletContext对象的引用。

    2、由于一个web应用程序中的所有Servlet都共享一个ServletContext对象,所以ServletContext对象被称之为application对象(web应用程序对象)。

    3、功能:

         获取web应用程序的初始化参数;

         记录日志;

         application域范围的属性;

         访问资源文件;

         获取虚拟路径所映射的本地路径; 

         web应用程序之间的访问;

         ServletContext的其他方法。

    •      获取web应用程序的初始化参数;

    首先,需要在web.xml中配置应用程序级别(<context-param>)的参数信息;

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     5     id="WebApp_ID" version="3.0">
     6     
     7     <!-- 配置当前web应用的初始化参数 -->
     8     <context-param>
     9         <param-name>driver</param-name>
    10         <param-value>com.mysql.jdbc.Driver</param-value>
    11     </context-param>
    12     <context-param>
    13         <param-name>jdbcUrl</param-name>
    14         <param-value>jdbc:mysql://test</param-value>
    15     </context-param>
    16 
    17     <!-- 配置和映射 servlet -->
    18     <servlet>
    19         <!-- Servlet注册的名字 -->
    20         <servlet-name>helloServlet</servlet-name>
    21         <!-- Servlet全类名 -->
    22         <servlet-class>com.dx.hello.HelloServlet</servlet-class>
    23 
    24         <!-- 配置Servlet的初始化参数。且节点必须在 load-on-startup节点的前边 -->
    25         <init-param>
    26             <param-name>username</param-name>
    27             <param-value>user001</param-value>
    28         </init-param>
    29         <init-param>
    30             <param-name>password</param-name>
    31             <param-value>123456</param-value>
    32         </init-param>
    33 
    34         <!-- 指定servlet被初始化的时机 -->
    35         <load-on-startup>-1</load-on-startup>
    36     </servlet>
    37     <servlet-mapping>
    38         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
    39         <servlet-name>helloServlet</servlet-name>
    40         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
    41         <url-pattern>/hello</url-pattern>
    42     </servlet-mapping>
    43 
    44 </web-app>

    注意:

      这里的context-param是应用程级别的初始化参数,<servlet>节点下的<init-param>属于servlet局部的初始化参数,他们具有作用域范围不同。

    然后,使用:

     1     public void init(ServletConfig config) throws ServletException {
     2         System.out.println("init");
     3 
     4         // 根据ServletConfig的getInitParameter()方法,根据特定初始化参数名称,获取对应的初始化参数值。
     5         String username = config.getInitParameter("username");
     6         String password = config.getInitParameter("password");
     7         System.out.println("username:" + username);
     8         System.out.println("password:" + password);
     9 
    10         // 根据ServletConfig的getInitParameterNames()方法,获取初始化参数信息。
    11         Enumeration<String> names = config.getInitParameterNames();
    12         while (names.hasMoreElements()) {
    13             String name = names.nextElement();
    14             String value = config.getInitParameter(name);
    15             System.out.println(name + ":" + value);
    16         }
    17 
    18         // 获取Servlet名称。
    19         String servletName = config.getServletName();
    20         System.out.println(servletName);
    21 
    22         // 使用getServletContext(),获取ServletContext对象。
    23         ServletContext servletContext = config.getServletContext();
    24                 
    25         // ServletContext获取初始化参数函数getInitParameter(String arg0)
    26         String driver=servletContext.getInitParameter("driver");
    27         String jdbc=servletContext.getInitParameter("jdbc");
    28         System.out.println("driver:"+driver);
    29         System.out.println("jdbc:"+jdbc);
    30         
    31         // ServletContext获取初始化参数集合函数getInitParameterNames()
    32         Enumeration<String> names2= servletContext.getInitParameterNames();
    33         while (names2.hasMoreElements()) {
    34             String name = names2.nextElement();
    35             String value = servletContext.getInitParameter(name);
    36             System.out.println(name + ":" + value);
    37         }
    38     }

    查看输出信息:

    HelloServlet constructor
    init
    username:user001
    password:123456
    username:user001
    password:123456
    helloServlet
    driver:com.mysql.jdbc.Driver
    jdbcUrl:jdbc:mysql://test
    driver:com.mysql.jdbc.Driver
    jdbcUrl:jdbc:mysql://test
    service
    •      访问资源文件(获取当前web应用的某一个文件对应的输入流。);
     1     // 获取当前web应用的某一个文件对应的输入流。
     2         try {
     3             ClassLoader classLoader = this.getClass().getClassLoader();
     4             InputStream stream = classLoader.getResourceAsStream("jdbc.properties");
     5             //stream with method0:java.io.BufferedInputStream@1cd3bd82
     6             System.out.println("stream with method0:"+stream);
     7         } catch (Exception e) {
     8             e.printStackTrace();
     9         }
    10 
    11         try {
    12             InputStream stream = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
    13             // stream with method1:java.io.FileInputStream@113eb097 
    14             System.out.println("stream with method1:"+stream);            
    15         } catch (Exception e) {
    16             e.printStackTrace();
    17         }
    •      获取当前web应用的某一个文件,在服务器上的一个绝对路径
    1         // 获取当前web应用的某一个文件,在服务器上的一个绝对路径:
    2         // D:javaworkset.metadata.pluginsorg.eclipse.wst.server.core	mp0wtpwebappsMyServlet001WEB-INFweb.xml
    3         String realPath=servletContext.getRealPath("/WEB-INF/web.xml");
    4         System.out.println(realPath);
    •      获取web当前应用的名称;
            // 获取web当前应用的名称
            String webName=servletContext.getContextPath();
            // "/MyServlet001"
            System.out.println(webName);
  • 相关阅读:
    学习Hadoop不错的系列文章(转)
    浏览器的渲染原理简介
    大数据人才缺乏,你准备好了吗?
    SVN分支与合并透析
    Windows下SVN服务端(Subversion)及客户端(TortoiseSVN)详细安装教程
    maven2介绍(转)
    eclipse安装velocity插件(转)
    为大数据时代做好准备——来自《大数据的冲击》一书精彩片段(转)
    【VB】Format 格式化日期时间数字函数详解
    获取本机ID和电脑名称
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/5224753.html
Copyright © 2011-2022 走看看