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>配置的参数。