回到顶部
您的当前位置: 编程语言> JAVA> JAVA基础> WEB开发
Servlet技术-ServletContext接口
2014-04-21 16:18:20
标签: 原创 Servlet 开发 ServletContext接口

    每个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引擎提供的。

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

    在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("&nbsp;&nbsp;"+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方法完全一样.