每个Web应用程序都有一个独立的Servlet容器,每个Web应用程序分别用一个ServeltContext对象来表示,ServletContext接口中定义了ServletContext对象需要对外提供的方法,Servlet程序通过这些方法与Servlet容器进行通信。Servelt引擎为每个Web应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。在Servlet容器初始化Servlet对象时, ServletContext对象随着ServletConfig对象提供给Servlet。与Servlet API 中的其他接口一样, ServletContext接口的实现也是有Servlet引擎提供的。
在server.xml文件和web.xml文件中都可以为某个Web应用程序设置若干初始化参数, ServletContext接口中定义了获取这些初始化参数信息的一些方法。如果在server.xml文件中为某个Web应用程序设置初始化参数,需要在该Web应用程序所对应的<Context>元素中添加<Parameter>子元素,如下所示:
<Context path=“/servletTest” docBase=“d:\myweb” debug=“0” reloadable=“true”> <Parameter name=“networkName” value=“ipwin” override=“false”/> <Context>
注:<Context>元素中的<Parameter>子元素对应一个初始化参数,其中override属性用于指定在web应用程序的web.xml文件中设置的同名初始化参数是否覆盖这里的设置。
如果要在Web应用程序的web.xml文件中设置初始化参数,则需要在根元素<web-app>中添加<context-param>子元素,如下所示:
<context-param> <param-name>networkName</param-name> <param-value>ipwin</param-value> </context-param> <context-param> <param-name>networkSite</param-name> <param-value>www.song-z.com</param-value> </context-param>
java代码如下所示:
public class ContextParameterServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out=response.getWriter(); out.println("<html>"); Enumeration e=getServletConfig().getServletContext().getInitParameterNames(); out.println("Context Parameter :"+"<br>"); while(e.hasMoreElements()){ String key=(String)e.nextElement(); String value=getServletContext().getInitParameter(key); out.println(" "+key+"="+value+"<br>"); } out.println("</html>"); } }
Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,它提供了4个读取或设置共享数据的方法。
public class CounterServlet extends HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); ServletContext context=getServletConfig().getServletContext();//获得ServeltContext的引用 Integer count=(Integer)context.getAttribute(“count”);//从ServeltContext读取count属性 if(count==null){//如果属性还没有设置,那么创建count属性,初始值为0; count=new Integer(0); context.setAttribute("count", new Integer(0)); } out.println(“<html>”);//输出当前的count属性值 out.println("<p> The current count is :"+count+"</p>"); out.println("</html>"); //创建新的count对象,其值增1 count=new Integer(count.intValue()+1); context.setAttribute(“count”, count);//将新的count属性存储到ServeltContext中去 out.close(); } }
ServeltContext接口中定义了两个重载的log方法来记录日志:
public void log(java.lang.String msg); public void log(java.lang.String message,java.lang.Throwable t);
这了两个log方法用于向Web服务器的日志文件中写入信息,第一个log方法只接受一个String 类型的参数,它通常用于记录一些特殊事件和重要信息。第二个log方法除了一个String类型参数外,还接受一个Throwable类型(Exception类的父类)的参数,通常用于记录程序运行中的异常信息。Log方法记录的日志文件名称和存储路径因Web服务器而异,Tomcat中的日志文件的存储路径和名称在server.xml文件中进行设置。
<Context path=“/servlet” docBase=“d:\myweb” debug=“0” reloadable=“true”> <parameter name=“schoolName” value=“zhengde” override=“false”/> <Logger className=“org.apache.catalina.logger.FileLogger” directory =“logs\servlet” prefix=“” suffix=“.txt” timestamp=“true”/> </Context>
ServletContext接口中还定义了一些用于访问web应用程序的内部资源文件的方法:
getResourcePaths(“/”)方法:返回一个java.util.Set集合对象,该Set集合对象中包含某个资源目录中的所有子目录和文件的路径名称,每个路径名称都以相对于整个web应用程序的根目录的形式表示,即都用”/”开头,其中的每个目录路径的最后也都有一个”/”结尾.
getResource()方法:返回映射到某个资源上的URL对象,传递给getResource方法的参数必须是一个”/”开头的资源路径名,开头的”/”表示当前web应用程序的根目录.
getResourceAsStream()方法:返回连接到某个资源上的InputStream对象,这个方法实际上是打开了getResource方法返回的URL对象的输入流,并返回这个输入流对象供程序直接去读取数据,它的参数传递规则与getResource方法完全一样.