最近做项目,用到了一个比较不熟悉的东西,但我自己又觉得很有用。所以记录下吧……
1.ServletContext 的使用
ServletContext对象是在Web应用程序装载时初始化的,它的生命周期是随着服务器启动而开始,服务器关闭而结束。即只要你的web应用程序处于启动状态,它就是一直存活的。而当你关闭web应用程序时,它也会被回收。
ServletContext对象之setAttribute和getAttribute的经典用法:
ServletContext和HttpServletRequest, HttpSession一样,可以作为1个map结构而使用。区别在于他们之间的作用范围和生命周期不同。
当你希望程序在某个类中,只执行1次,而接下来就不再执行。在web环境中,可能多次调用的类往往是action或者定时任务调度类。当我们希望action或定时任务调度类无论被调用多少次,某段代码只执行1次时,可以用ServletContext来标记。如有一个定时任务调度类TestTrigger(定时任务的配置略):
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); ServletContext servletContext = webApplicationContext.getServletContext(); String count = (String) servletContext.getAttribute("count"); if (StringUtils.equals("1", count)){ // 测试用 System.out.println(sdf.format(new Date()) + ": TestTrigger非第1次执行。。"); }else{ servletContext.setAttribute("count", "1"); System.out.println(sdf.format(new Date()) + ": TestTrigger第一次执行。。。"); }又有一个Action:
@RequestMapping("/test/context.json") @ResponseBody public void test() { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); ServletContext servletContext = webApplicationContext.getServletContext(); String count = (String) servletContext.getAttribute("count"); if (StringUtils.equals("1",count)){ // 测试用 System.out.println(sdf.format(new Date()) + ": TestAction非第1次执行。。"); }else{ servletContext.setAttribute("count", "1"); System.out.println(sdf.format(new Date()) + ": TestAction第一次执行。。。"); } }启动web项目会发现,如果 【先】在浏览器输入地址:http://localhost:8080/项目名/ test/context.json 而 定时任务调度类TestTrigger【后】被触发, 会发现在控制台输出以下结果: