Servlet学习笔记 -ServletConfig、ServletContext

1、前言

  在《Servlet工作原理和过程》已经学习了Servelt的工作原理和过程,同时分析了Servlet接口中的方法。下面分别学习,在Servlet工作过程中遇到的其他几个类和实例。

2、ServletConfig

  当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init方法传入一个ServletConfig实例对象作为参数。在ServletConfig对象中,封装了初始化Servlet程序需要的的相关参数,同时在ServletConfig对象中还保存了一个ServletContext实例对象的引用,这个ServletContext实例对象就表示了Servlet程序在容器中运行需要的上下文环境。

package javax.servlet;

import java.util.Enumeration;

public interface ServletConfig {

    public String getServletName();

    public ServletContext getServletContext();

    public String getInitParameter(String name);

    public Enumeration<String> getInitParameterNames();
}

  根据源码,我们可以知道,ServletConfig类提供了四个方法,如下所示:

  • getServletName(); 用来获取当前Servlet实例的名称。Servlet实例的名称定义在应用发布的描述符中,或者如果没有定义Servlet实例名称的话,就会使用Servlet类的类名作为实例名。
  • getServletContext(); 返回一个ServletContext实例的引用。
  • getInitParameter(String name);在ServletConfig中保存了一些初始化Servlet实例需要的参数,且以key-value的形式存储。通过该方法就可以获取key为name的初始化参数。
  • getInitParameterNames(); 返回ServletConfig实例中,存储的所有参数对应key的集合,返回结果的类型为Enumeration。
3、ServletContext

  在分析ServletConfig的时候我们知道:在ServletConfig实例中,保存了一个ServletContext 实例对象的引用。ServletContext实例对象就表示了Servlet程序在容器中运行需要的上下文环境。
  ServletContext实例提供了一系列与Servlet容器交互的方法,比如,获取获取文件的MIME类型、分发request请求或持久化日志等。
  每个Web应用程序在一个JVM中都只有一个ServletContext对象。在一个Web应用中,可能包括了多个Servlet实例和其他内容。如果将一个应用程序同时部署到多个容器的分布式环境中,每台Java虚拟机上的Web应用都会有一个ServletContext对象。在分布式情况下,每个ServletContext对象就不能够真正这个Web应用的全部信息了,因此一般采用外部资源存储Web应用的全部信息,比如用数据库代替。

package javax.servlet;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;

import javax.servlet.descriptor.JspConfigDescriptor;

public interface ServletContext {

    public static final String TEMPDIR = "javax.servlet.context.tempdir";
    public static final String ORDERED_LIBS = "javax.servlet.context.orderedLibs";

    public String getContextPath();

    public ServletContext getContext(String uripath);

    public int getMajorVersion();

    public int getMinorVersion();

    public int getEffectiveMajorVersion();

    public int getEffectiveMinorVersion();

    public String getMimeType(String file);

    public Set<String> getResourcePaths(String path);

    public URL getResource(String path) throws MalformedURLException;

    public InputStream getResourceAsStream(String path);

    public RequestDispatcher getRequestDispatcher(String path);

    public RequestDispatcher getNamedDispatcher(String name);
    
    @SuppressWarnings("dep-ann")
    // Spec API does not use @Deprecated
    public Servlet getServlet(String name) throws ServletException;

    @SuppressWarnings("dep-ann")
    // Spec API does not use @Deprecated
    public Enumeration<Servlet> getServlets();

    @SuppressWarnings("dep-ann")
    // Spec API does not use @Deprecated
    public Enumeration<String> getServletNames();

    public void log(String msg);

    @SuppressWarnings("dep-ann")
    // Spec API does not use @Deprecated
    public void log(Exception exception, String msg);

    public void log(String message, Throwable throwable);

    public String getRealPath(String path);

    public String getServerInfo();

    public String getInitParameter(String name);

    public Enumeration<String> getInitParameterNames();

    public boolean setInitParameter(String name, String value);

    public Object getAttribute(String name);

    public Enumeration<String> getAttributeNames();

    public void setAttribute(String name, Object object);

    public void removeAttribute(String name);

    public String getServletContextName();

    public ServletRegistration.Dynamic addServlet(String servletName, String className);

    public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet);

    public ServletRegistration.Dynamic addServlet(String servletName,
            Class<? extends Servlet> servletClass);

    public <T extends Servlet> T createServlet(Class<T> c)
            throws ServletException;

    public ServletRegistration getServletRegistration(String servletName);

    public Map<String, ? extends ServletRegistration> getServletRegistrations();

    public FilterRegistration.Dynamic addFilter(String filterName, String className);

    public FilterRegistration.Dynamic addFilter(String filterName, Filter filter);

    public FilterRegistration.Dynamic addFilter(String filterName,
            Class<? extends Filter> filterClass);

    public <T extends Filter> T createFilter(Class<T> c) throws ServletException;

    public FilterRegistration getFilterRegistration(String filterName);

    public Map<String, ? extends FilterRegistration> getFilterRegistrations();

    public SessionCookieConfig getSessionCookieConfig();

    public void setSessionTrackingModes(
            Set<SessionTrackingMode> sessionTrackingModes);

    public Set<SessionTrackingMode> getDefaultSessionTrackingModes();

    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes();

    public void addListener(String className);

    public <T extends EventListener> void addListener(T t);

    public void addListener(Class<? extends EventListener> listenerClass);

    public <T extends EventListener> T createListener(Class<T> c)
            throws ServletException;

    public JspConfigDescriptor getJspConfigDescriptor();

    public ClassLoader getClassLoader();

    public void declareRoles(String... roleNames);

    public String getVirtualServerName();
}

  在ServletContext 类中定义了很多的方法,下面主要学习一下常用方法的作用:

  • getMimeType(String file); 获取指定file对应的MIME类型,MIME类型由Servlet容器决定。常用的MIME类型有" text/htm"、"image/gif"等。
  • getResourcePaths(String path); 提供指定目录下的所有文件或目录列表。比如:
     * /welcome.html
     * /catalog/index.html
     * /catalog/products.html
     * /catalog/offers/books.html
     * /catalog/offers/music.html
     * /customer/login.jsp
     * /WEB-INF/web.xml
     * /WEB-INF/classes/com.acme.OrderServlet.class,
     * getResourcePaths("/") returns {"/welcome.html", "/catalog/",
     * "/customer/", "/WEB-INF/"}
     * getResourcePaths("/catalog/") returns {"/catalog/index.html",
     * "/catalog/products.html", "/catalog/offers/"}
  • URL getResource(String path) throws MalformedURLException;返回映射到指定路径的资源的URL
  • getResourceAsStream(String path);返回指定目录下资源对应的InputStream对象
  • getRequestDispatcher(String path);把指定目录的资源包装成RequestDispatcher对象,并返回。
  • getNamedDispatcher(String name);和getRequestDispatcher(String path)方法类似,不过该方法是根据Servlet实例的名称来封装成RequestDispatcher对象的。
  • log(String msg);把指定的信息写入到Servlet容器的日志文件中,该日志文件由Servlet容器进行配置的。
  • log(String message, Throwable throwable);和上一个方法作用一样,只是多了堆栈的信息。
  • getRealPath(String path);返回资源路径,在服务器端文件系统的真实存储路径。
  • getServerInfo();返回当前正在运行容器的名称。
  • getInitParameter(String name); 获取Web应用的初始化参数。比如,该方法可获取如下配置中的参数信息:
//tomcat下server.xml配置
<Context path="/testcontext" docBase="/context"  
         privileged="true" antiResourceLocking="false" antiJARLocking="false"  
         debug="0" reloadable="true">  
    <Parameter name="test" value="xxxx" />  
</Context>  
//项目下web.xml配置
<context-param>  
    <param-name>age</param-name>  
    <param-value>24</param-value>  
</context-param>  
  • getInitParameterNames();获取初始化参数key的集合。
  • setInitParameter(String name, String value);设置初始化参数,必须在ServletContext加载完成前进行设置,否则会出现异常。
  • getAttribute(String name);和getInitParameter(String name);方法类似,只不过该方法获取的参数不用来初始化Servlet实例。
  • getAttributeNames();getInitParameterNames();类似。
  • setAttribute(String name, Object object);和setInitParameter(String name, String value);方法类似,但是不限制ServletContext加载完成前。
  • removeAttribute(String name); 移除指定的参数。
  • getServletContextName();获取当前ServletContext实例对应的名字。
  • addServlet(String servletName, String className);动态注册一个servlet实例到ServletContext对象中。并返回ServletRegistration.Dynamic对象。
  • addServlet(String servletName, Servlet servlet);上面方法的重载方法,作用一样。
  • addServlet(String servletName, Class<? extends Servlet> servletClass);上面方法的重载方法,作用一样。
  • createServlet(Class c) throws ServletException; 根据Class创建Servlet实例。
  • getServletRegistration(String servletName);根据Servlet实例名称获取对应的ServletRegistration对象,该对象中包括了Servlet对象的详细信息。
  • getServletRegistrations(); 获取容器中所有的ServletRegistration对象,返回类型为Map<String, ? extends ServletRegistration>。
  • addFilter(String filterName, String className);添加过滤器到ServletContext对象中。
  • addFilter(String filterName, Filter filter);重载方法。
  • addFilter(String filterName, Class<? extends Filter> filterClass);重载方法
  • createFilter(Class c) throws ServletException;创建过滤器,返回的类型是
  • getFilterRegistration(String filterName);根据过滤器名称获取对应的ServletRegistration对象,该对象中包括了过滤器对象的详细信息。
  • getFilterRegistrations();获取容器中所有的FilterRegistration对象,返回类型为Map<String, ? extends FilterRegistration>
  • getSessionCookieConfig(); 返回上下文中的SessionCookieConfig对象
  • setSessionTrackingModes(Set sessionTrackingModes); 设置Session的追踪模式。
  • getDefaultSessionTrackingModes(); 获取当前默认的Session追踪模式集合
  • getEffectiveSessionTrackingModes();当前有效的Session追踪模式集合
  • addListener(String className);添加监听器到ServletContext对象中。
  • addListener(T t);重载方法
  • addListener(Class<? extends EventListener> listenerClass); 重载方法
  • createListener(Class c) throws ServletException;创建监听器
  • getJspConfigDescriptor(); 获取JspConfigDescriptor实例对象,该对象用来获取web应用中用<jsp-config>配置的参数。
上一篇:【从零开始学Servlet笔记】ServletContext


下一篇:牛客网错题记录