通常我们在做web开发时,有些系统级参数希望在web启动时就进行一次性初始化,供整个工程调用使用。如,系统配置参数等。这时可以采用两种方式:一是定义一个servlet、另一种是使用监听器。
方案一:使用servlet的方式应该不陌生,在web.xml中定义一个servlet,在init方法中把要初始化的东西写到里面;如:
initServlet
com.ifeng.crm.common.InitServlet
1
注:不需要写servlet-maping
public class InitServlet extends HttpServlet {
private static Logger logger = Logger.getLogger(InitServlet.class);
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
ServletContext context = super.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
InitService initService = (InitService)ctx.getBean("initService");
SyncService syncService = (SyncService)ctx.getBean("syncService");
logger.info("初始化数据开始。。。");
initService.init();
logger.info("初始化完成!");
logger.info("启动iams同步服务。。。");
new Thread(new SyncIamsThread(syncService)).start();
logger.info("启动iams同步服务完成!");
}
}
方案二:listener:
ServletContext 被 Servlet 程序用来与 Web 容器通信。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。所以ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
服务器启动时,ServletContextListener 的 contextInitialized()方法被调用,所以在里面创建好缓存。
实例:
1.web.xml
com.zzcatv.util.projectInit
2.java
public class ProjectInit implements ServletContextListener{
private static Logger logger = Logger.getLogger(ProjectInit.class);
public void contextDestroyed(ServletContextEvent arg0) {
logger.info("==========初始化信息进行销毁==========");
}
public void contextInitialized(ServletContextEvent arg0) {
logger.info("==========系统初始化==========");
try {
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(arg0.getServletContext());
InitService initService = (InitService) ctx.getBean("initServiceImpl");
initService.init();
} catch (Exception e) {
e.printStackTrace();
}
}
}