`
Everyday都不同
  • 浏览: 720533 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

ServeltContext的理解和一种使用场景

阅读更多

最近做项目,用到了一个比较不熟悉的东西,但我自己又觉得很有用。所以记录下吧……

 

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【后】被触发,会发现在控制台输出以下结果:
 
14:22:27: TestAction第一次执行。。。
14:23:00: TestTrigger非第1次执行。
以上输出结果表明:ServletContext的作用范围是整个web项目的,等你再次调用TestAction时,并且定时任务再次被调度时。打印结果是:
14:24:00: TestTrigger非第1次执行。
14:24:30: TestAction非第1次执行。
这说明,我们通过测试,可以达到某段代码在整个web项目只执行一次的效果。同样地,通过控制,先调度定时任务类,后访问该Action。初次的打印结果将会是相反的。
当然,以上只是测试ServletContext的作用范围的测试。在实际开发中,肯定是每个Action或定时任务调度类都会有自己的setAttribute的操作。因为每个Action或定时任务调度类都可能有【各自】的“只执行一次”的代码逻辑。
比如在上述测试中,TestTrigger可以setAttribute("testTriigger", "1") TestAction则可以setAttribute("testAction", "1") 。这样可以做到控制他们无论被调度或访问多少次,某些只需执行1次的代码片段可以不用每次都去执行,造成性能上的瓶颈。
Action或定时任务调度类的(1)static静态代码块的代码(2)static final属性的定义  会在web容器初始化的时候就执行且执行一次,但现实中并不推荐这么做。
另外需要注意的是:
1)只要在一个web工程里,无论你通过ContextLoader.getCurrentWebApplicationContext();方法创建多少次WebApplicationContext,你得到的始终是同一个WebApplicationContext对象;且无论你通过 webApplicationContext.getServletContext();创建多少次ServletContext,得到的也始终是同一个ServletContext对象。——这与ServletContext的生命周期和作用范围有关;
2)你setAttribute("test","first")再setAttribute("test","second")。再getAttribute("test")得到的会是second,因为会被第二次setAttribute操作覆盖。
小结:
1)ServletContext的生命周期和作用范围。
2)当你需要控制某段代码在无论该类被访问或调度N次,都只需执行1次该段代码的时候;需要在不同的调度类中共同使用一个变量的时候  不妨试试用ServletContext;
1
2
分享到:
评论
1 楼 念念不忘丶又怎樣 2015-09-17  
    

相关推荐

    ServletContext

    总结来说,`ServletContext`是Java Web开发中的重要工具,它提供了一种在不同Servlet间共享数据和资源的有效方式。在Myeclipse这样的开发环境中,理解和熟练运用`ServletContext`能够极大地提升开发效率,同时也能...

    ServletContext.pdf

    正确理解和使用`ServletContext`,对于构建高效、可靠的Web应用至关重要。开发者应该熟悉其主要方法和应用场景,以便更好地利用这一强大工具。 以上就是关于`ServletContext`的基本介绍和应用示例。希望对您有所...

    Servlet的四种信息交互.zip

    开发者可以使用`getServletContext()`方法获取到ServletContext对象,然后通过`setAttribute()`和`getAttribute()`方法来存储和检索信息。例如,当多个Servlet需要共享数据时,ServletContext就非常有用,它可以用来...

    如何学习java,循序渐进。

    2. **数据库技术**:至少掌握一种数据库,如Oracle或MySQL。熟悉SQL语句,包括DML(增删改查)、DDL(创建表)、DCL(权限管理)。学习多表连接(内连接、外连接),子查询,以及如何管理数据库对象,如视图、索引、...

    面试常见题型

    面试时,理解这些类和接口的工作原理和使用场景是非常重要的。 设计模式是软件工程中的重要概念,单例模式是其中的一种。单例模式确保一个类只有一个实例,并提供全局访问点。面试中,面试官可能会询问你如何实现...

    Servlet中的相对路径和绝对路径归纳

    路径可以分为相对路径和绝对路径两种,在不同的场景下,选择合适的路径类型非常重要。本文将对 Servlet 中的相对路径和绝对路径进行归纳,帮助开发者更好地理解和使用路径。 1. 表单中的路径 在 HTML 表单中,...

    浅谈spring中用到的设计模式及应用场景

    浅谈Spring中用到的设计模式及应用场景 Spring 框架是 Java 企业级应用程序的核心组件之一,它提供了强大的功能和灵活的架构来简化企业级应用程序的...了解这些设计模式可以帮助我们更好地理解和使用 Spring 框架。

    JSP进度条使用线程制作

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,它结合了HTML、Java代码和脚本语言。在某些场景下,比如文件上传或大任务处理时,用户可能希望看到一个进度条来展示任务的完成进度。本...

    学校实训JSP项目-[其他类别]动态显示JSP服务器内存的Ajax程序 图像版.zip

    此外,标签中提到的“网站CMS”,即内容管理系统,是一种用于创建、管理和发布数字内容的平台。虽然这个实训项目可能没有实现完整的CMS系统,但其思想是通过JSP和Ajax实现动态数据更新,这在许多CMS系统中是常见的...

    Session Application Cookie ViewState用法

    本文将详细解释Session、Application、Cookie 和 ViewState 的概念及用法,帮助开发者更好地理解这些机制如何在Web应用程序中工作。 #### 1. Session Session 是一种用于跟踪用户在网站上的活动的技术。它存储特定...

    Java的监听器种类

    监听器机制为开发者提供了一种优雅的方式来扩展和维护Web应用程序,极大地提高了开发效率和系统的灵活性。理解并熟练掌握这些监听器的工作原理及其使用方法对于成为一名优秀的Java开发者至关重要。

    servlet软件开发

    - Servlet上下文:掌握`ServletContext`对象的作用和使用场景。 4. **请求和响应处理**: - 请求参数:学习如何获取和处理请求参数,包括路径参数、查询参数和表单数据。 - 响应处理:设置HTTP响应状态码、头...

    第21章 Cookie和Session.pdf

    Session是服务器端状态管理的一种方式,用于在多个请求之间存储特定用户的数据。每个用户会话都有一个唯一的Session ID,这个ID通过Cookie在客户端和服务器之间传递。 3.2 Session原理 当客户端首次发送请求时,...

    listener和filter 监听器和过滤器的介绍以及简单使用(csdn)————程序.pdf

    【监听器和过滤器概述】 在Java Web开发中,监听器(Listener)和过滤器(Filter)是两种非常重要的组件,它们分别承担着不同的...理解并熟练使用它们,能够帮助开发者更好地控制和管理应用程序,提升系统功能和性能。

    init-parameter和context-parameter区别

    这使得`init-parameter`成为一种理想的机制,用于传递只对某个特定Servlet有意义的信息或配置数据。 例如,如果一个Servlet需要一个数据库连接字符串,这个信息可以作为`init-parameter`在web.xml中定义,并在...

    监听器与过滤器.pdf

    综上所述,监听器和过滤器是Java Web开发中的重要工具,它们帮助开发者更精细地管理和控制应用程序的行为,提供了一种灵活的扩展机制,以满足复杂的应用场景需求。正确理解和有效利用这两种技术,对于提升应用的健壮...

    javaweb笔记+狂神+知识总结

    17. **RESTful API设计**:RESTful是一种Web服务设计风格,强调资源的表示和操作,使用HTTP方法(GET、POST、PUT、DELETE)来操作资源,使得API更易于理解和使用。 这些知识点构成了JavaWeb开发的基础,通过"狂神...

    《Java Web程序设计任务教程》-教材源码第6章.rar

    3. **MVC(Model-View-Controller)模式**:这是一种常见的软件设计模式,在Java Web中常用于分离业务逻辑、数据模型和用户界面。第六章可能涉及如何实现简单的MVC架构,比如使用Servlet作为Controller,JavaBeans...

Global site tag (gtag.js) - Google Analytics