JavaWeb ServletContext/application初试总结

简介:ServletContext/application

为什么将其两者放在一起介绍呢,因为他们可以被看做是同一个类,只是名字起得不同而已。
ServletContext是在Servlet中使用,而application则作为内置对象用于jsp中。
他们的作用域是 ** 整个tomcat的从启动到关闭的过程 ** 。
我们可以将其看做是JavaWeb应用里的全局变量。

功能

所谓功能,也就是说,我们在什么时候会用到它们。
当你的服务端需要一些配置属性供所有客户端来进行访问,用ServletContext/application就正好。
比如:页面的访问次数,当前在线人数,等等信息。

使用

application

已经说过,application是jsp的内置对象,使用起来很方便。如下,很简单,不再赘述。

<% application.setAttribute("num", 10); %> <% int num = (int)application.getAttribute("num"); %>

ServletContext

我们主要来说一下ServletContext的使用,既然要供所有客户端访问,那么肯定要进行初始化,这里主要有两种方式

1:通过监听器(listener)来初始化

第一步:用一个类实现ServletContextListener接口提供的两个方法
contextInitialized:在tomcat启动的时候会调用
contextDestroyed:在tomcat关闭的时候会调用
如下

public class ContextLoaderListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("num", 10);
        System.out.println("begin:" + servletContext.getAttribute("num"));
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println("end:" + servletContext.getAttribute("num"));
    }
}

第二步,在web.xml里面配置监听器,如下

<listener>
    <listener-class>com.web.listener.ContextLoaderListener</listener-class>
</listener>

2:自定义Servlet并设置Servlet的load-on-startup=1

第一步,自定义Servlet类,重写init()和destroy(),如下

public class ContextLoaderServlet implements Servlet {

    private ServletConfig config;

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        ServletContext servletContext = config.getServletContext();
        servletContext.setAttribute("num", 10);
        System.out.println("begin:" + servletContext.getAttribute("num"));
    }

    @Override
    public void destroy() {
        ServletContext servletContext = config.getServletContext();
        System.out.println("end:" + servletContext.getAttribute("num"));
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }
}

第二步,配置servlet为自启动,将如下配置添入web.xml

<servlet>
        <servlet-name>ContextLoaderServlet</servlet-name>
        <servlet-class>com.web.ContextLoaderServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ContextLoaderServlet</servlet-name>
        <url-pattern>/ContextLoaderServlet</url-pattern>
    </servlet-mapping>