application对象 1 什么是application对象 ? (1) 当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一直存在,直到Web服务器关闭。一个Web服务器通常有多个Web服务目录 (网站),当Web服务器启动时,它自动为每个Web服务目录都创建一个application对象,这些application对象各自独立,而且和Web服务目录一一对应。访问同一个网站的客户都共享一个application对象,因此,application对象可以实现多客户间的数据共享。访问不同网站的客户,对应的application对象不同。 (2) application对象的生命周期:从Web服务器启动,直到Web服务器关闭。 注意:一个Web应用程序启动后,将会自动创建一个application对象,而且在整个应用程序的运行过程中只有一个application对象,也即所有访问该网站的客户都共享一个application对象。 (3) application对象的作用范围:application对象是一个应用程序级的对象,它作用于当前Web应用程序,也即作用于当前网站,所有访问当前网站的客户都共享一个application对象。具体来说:不管哪个客户来访问网站A,也不管客户访问网站A下哪个页面文件,都可以对网站A的application对象进行操作,因为,所有访问网站A的客户都共用一个application对象。因此,当在application对象中存储数据后,所有访问网站A的客户都能够对其进行访问,实现了多客户之间的数据共享。 (4) application对象的基类是:javax.servlet.ServletContext类。 注意:有些Web服务器不直接支持使用application对象,必须用ServletContext类来声明application对象,再调用getServletContext()方法来获取当前页面的application对象。 (5) ServletContext类:用于表示应用程序的上下文。一个ServletContext类的对象表示一个Web应用程序的上下文。具体来说:在Web服务器中,提供了一个Web应用程序的运行时环境,专门负责Web应用程序的部署、编译、运行以及生命周期的管理,通过ServletContext类,可以获取Web应用程序的运行时环境信息。 常识:JSP引擎、Servlet引擎、JSP容器和Servlet容器,都是指Web服务器,Web服务器用于管理所有Web应用程序。 (6) application对象的常用方法,如下所示:
2 使用application对象存储数据 (1) 设置application对象的属性和获取application对象的属性 测试代码 TestApplication.jsp <%@ page language=”java” contentType=”text/html; charset=GBK”%> <% request.setCharacterEncoding(“GBK”);%> <html> <body> <form name=”form1″ action=”" method=”post”> 用户名: <input type=”text” name=”username” value=”"> <br> 密 码: <input type=”password” name=”pwd” value=”"> <br> <input type=”submit” name=”btSubmit” value=”提交”> </form> <% application.setAttribute(“username”, request.getParameter(“username”)); application.setAttribute(“pwd”, request.getParameter(“pwd”)); %> </body> </html> 测试代码 TestCommon.jsp 在TestCommon.jsp 页面中,通过application对象获取属性,注意TestApplication.jsp和TestCommon.jsp这两个页面之间没有任何关联,只要通过application对象设置了属性,那么就可以在任何页面,通过application对象获取属性或者删除属性。 <%@ page language=”java” contentType=”text/html; charset=GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> 用户名:<%=application.getAttribute(“username”) %><br> 密 码:<%=application.getAttribute(“pwd”) %><br> </body> </html> (2) 删除application对象的属性 测试代码 TestCommon.jsp 在TestCommon.jsp 页面中,删除application对象的属性。 <%@ page language=”java” contentType=”text/html; charset=GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <%–删除属性–%> <% application.removeAttribute(“username”); application.removeAttribute(“pwd”); %> 用户名:<%=application.getAttribute(“username”)%><br> 密 码:<%=application.getAttribute(“pwd”)%><br> </body> </html> 3 使用application对象实现网站计数器 测试代码: TestApplication01.jsp <%@ page language=”java” contentType=”text/html; charset=GBK”%> <%@ page import=”java.util.*”%> <% request.setCharacterEncoding(“GBK”);%> <html> <body> <%! ServletContext application; synchronized void countPeople() { application = getServletContext(); Integer number =(Integer)application.getAttribute(“number”); if (number == null) { number = new Integer(1); application.setAttribute(“number”, number); } else { number = new Integer(number.intValue() 1); application.setAttribute(“number”, number); } } %> <% if (session.isNew()) { countPeople(); } int personCount = ((Integer)application.getAttribute(“number”)).intValue(); %> <p>欢迎访问本网站,您是第 <%= personCount %> 个访问用户! </body> </html> 4 使用application对象获取初始化参数 (1) 一 般来说,在web.xml文件中,设置初始化参数有如下两种方式: n 设置系统范围内的初始化参数 n 针对单个Servlet文件或JSP文件设置初始化参数 对于系统范围内的初始化参数,可通过ServletContext 接口的getInitParameter(String name)方法,根据指定的参数名,获取对应的参数值。对于针对单个Servlet文件或JSP文件设置初始化参数,可通过ServletConfig接口的 getInitParameter(String name)方法,根据指定的参数名,获取对应的参数值。 在web.xml文件中,可利用context-param元素来设置系统范围内的初始化参数。context-param元素应该包含param-name、param-value以及可选的description子元素,如下所示: web.xml文件的示例: <?xml version=”1.0″ encoding=”UTF-8″?> <web-app version=”2.4″ xmlns=”http://java./xml/ns/j2ee” xmlns:xsi=”http://www./2001/XMLSchema-instance” xsi:schemaLocation=”http://java./xml/ns/j2ee http://java./xml/ns/j2ee/web-app_2_4.xsd”> <context-param> <param-name>appName</param-name> <param-value>MyWebTest</param-value> </context-param> <context-param> <param-name>appVersion</param-name> <param-value>Version 1.0</param-value> </context-param> <welcome-file-list> <welcome-file>MyTest01.jsp</welcome-file> </welcome-file-list> </web-app> 测试代码 TestApplication02.jsp <%@ page language=”java” contentType=”text/html; charset=GBK” %> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <%–使用application对象获取系统范围内的初始化参数–%> <font color=”Red”>使用application对象获取初始化参数:</font> <br> <% String appName = getServletContext().getInitParameter(“appName”); String appVersion = getServletContext().getInitParameter(“appVersion”); %> 应用程序的名称:<%=appName%><br> 应用程序的版本:<%=appVersion%> </body> </html> 修改web.xml文件,添加蓝色字体部分: <?xml version=”1.0″ encoding=”UTF-8″?> <web-app version=”2.4″ xmlns=”http://java./xml/ns/j2ee” xmlns:xsi=”http://www./2001/XMLSchema-instance” xsi:schemaLocation=”http://java./xml/ns/j2ee http://java./xml/ns/j2ee/web-app_2_4.xsd”> <context-param> <param-name>appName</param-name> <param-value>MyWebTest</param-value> </context-param> <context-param> <param-name>appVersion</param-name> <param-value>Version 1.0</param-value> </context-param> <welcome-file-list> <welcome-file>MyTest01.jsp</welcome-file> </welcome-file-list> </web-app> 5 使用application对象获取Web应用程序的环境信息 测试代码: TestApplication03.jsp <%@ page language=”java” contentType=”text/html; charset=GBK” pageEncoding=”GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <h2>使用application对象获取Web应用程序的环境信息</h2> <p> <font color=”Red”>获取当前Web服务器的版本信息:</font><%= application.getServerInfo() %><br> <font color=”Red”>获取Servlet API的主版本号:</font><%= application.getMajorVersion() %><br> <font color=”Red”>获取Servlet API的次版本号:</font><%= application.getMinorVersion() %> <p> <font color=”Red”>获得指定URL的ServletContext对象:</font> <% ServletContext sc = application.getContext(“/ch3/TestApplication01.jsp”); out.println(sc.getServerInfo()); %> <p> <%–需要在web.xml设置 display-name 元素–%> <font color=”Red”>获取当前Web应用程序的名称:</font><%= application.getServletContextName() %> <p> <font color=”Red”>获取当前Web应用程序的上下文路径:</font><%= application.getContextPath() %> </body> </html> 6 session对象和application对象的比较 (1) 两者的作用范围不同: session对象是用户级的对象,而application对象是应用程序级的对象。 一个用户一个session对象,每个用户的session对象不同,在用户所访问网站的多个页面之间共享同一个session对象。 一个Web应用程序一个application对象,每个Web应用程序的application对象不同,但一个Web应用程序的多个用户之间共享同一个application对象。 在同一个网站下: n 每个用户的session对象不同 n 所用用户的application对象相同 在不同网站下: n 每个用户的session对象不同 n 每个用户的application对象不同 (2) 两者的生命周期不同: session对象的生命周期:用户首次访问网站创建,用户离开该网站 (不一定要关闭浏览器) 消亡。 application对象的生命周期:启动Web服务器创建,关闭Web服务器销毁。 |
|