HttpServlet 类 这是一个抽象类,继承了GenericServlet类,这个GenericSerlvet类实现了ServletConfig这个接口,所以它实现了方法
public ServletConfig getServletConfig()和 public ServletContext getServletContext();
这两个方法是如何实现的呢?在GenericServlet类中有一个ServletContext对象,在web容器初始化的时候就给这个ServletConfig属性赋予了
StandardWrapperFacade
的对象,这个对象中有两个属性config和context分别为他们赋上StandardWrapper和ApplicationContextFacade 类的对象,通过getServletConfig和getServletContext得到的就是这两个对象了。
我们可以通过继承HttpServlet的自定义Servlet中这两个函数得到ServletConfig和ServletContext对象。而不用得到ServletConfig然后调用getServletContext()方法。
下面看看ServletConfig 和 ServletContext的区别
ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。ServletContext:对任何servlet,任何人在任何时间都有效,这才是真正全局的对象。
ServletContext提供getInitParameter()可以获取下边的指定参数
<context-param>
<param-name>context_param_key1</param-name>
<param-value>context_param_value1</param-value>
</context-param>
ServletConfig提供的getInitParameter()可以获取下边指定的参数
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>xxx</servlet-class>
<init-param>
<param-name>absPath</param-name>
<param-value>/usr/mail/ax/axman/Maildir/</param-value>
</init-param>
</servlet>
他们如何获取的呢?利用的是
StandardWrapper
和
ApplicationContextFacade 中提供的方法
在ServletContext这个接口中提供了很多比较眼熟的方法:
public String getRealPath(String path);public InputStream getResourceAsStream(String path);等等,这里想了解是在ServletContext中储存值
提供了
public void setAttribute(String name, Object object);
public void removeAttribute(String name);
public Object getAttribute(String name);
是不是很熟悉,我想在
ApplicationContextFacade
中无外乎用集合存储,最终转化的数组。
接下来通过两个两段程序来验证上边的描述
package com.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServletFirst extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//we store these values of variables in First servlet
//and read the values of variables in the other
//let's have a look that which variable is null
ServletConfig servletConfig = this.getServletConfig();
ServletContext servletContext = servletConfig.getServletContext();
servletContext.setAttribute("key1", "value2");
servletContext.setAttribute("key2", "value2");
Enumeration enums = servletContext.getInitParameterNames();
//get those global initialized variable which define in the web.xml
while(enums.hasMoreElements()){
String key = (String)enums.nextElement();
String value = servletContext.getInitParameter(key);
servletContext.setAttribute(key, value);
}
//get those initialized variable which define in the servlet
String value = servletConfig.getInitParameter("init_param_key");
System.out.println(value);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
}
这里我写了两个servlet,MyServltFirst是第一个被访问的servlet类,主要的功能是在ServletContext中缓存好用户在web.xml中定义的context-param数据,和用setAttribute方法存放的数据。为了验证它是全局的,能在所有的servlet中被获取,另写了一个Servlet类:MyServletSecond
package com.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServletSecond extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//in this servlet,we get values from ServletContext which insert in the MyServletFirst servlet
ServletContext servletContext = this.getServletContext();
Enumeration enums = servletContext.getAttributeNames();
while(enums.hasMoreElements()){
String key = (String) enums.nextElement();
//due to the ServletContext object has store other Object of parameter
//so here the variable of Type can't be String
Object value = servletContext.getAttribute(key);
System.out.println(key+"->"+value.toString());
}
}
}
因为在ServletContext中除了从配置文件用户定义的一些上下文参数和在MyServletFirst存入的参数外,还有容器存放的一些对象,所以在上边接收getAttribute()方法返回值的对象引用,是Object类型,通过不同对象重写的toString()方法可以转换成各自形式的字符串