application对象
?什么是application对象??
()?当Web服务器启动时Web服务器会自动创建一个application对象application对象一旦创建它将一直存在直到Web服务器关闭
一个Web服务器通常有多个Web服务目录?(网站)当Web服务器启动时它自动为每个Web服务目录都创建一个application对象这些application对象各自独立而且和Web服务目录一一对应
访问同一个网站的客户都共享一个application对象因此application对象可以实现多客户间的数据共享
访问不同网站的客户对应的application对象不同
()?application对象的生命周期从Web服务器启动直到Web服务器关闭
注意一个Web应用程序启动后将会自动创建一个application对象而且在整个应用程序的运行过程中只有一个application对象也即所有访问该网站的客户都共享一个application对象
()?application对象的作用范围application对象是一个应用程序级的对象它作用于当前Web应用程序也即作用于当前网站所有访问当前网站的客户都共享一个application对象
具体来说不管哪个客户来访问网站A也不管客户访问网站A下哪个页面文件都可以对网站A的application对象进行操作因为所有访问网站A的客户都共用一个application对象
因此当在application对象中存储数据后所有访问网站A的客户都能够对其进行访问实现了多客户之间的数据共享
()?application对象的基类是javaxservletServletContext类
注意有些Web服务器不直接支持使用application对象必须用ServletContext类来声明application对象再调用getServletContext()方法来获取当前页面的application对象
()?ServletContext类用于表示应用程序的上下文
一个ServletContext类的对象表示一个Web应用程序的上下文
具体来说在Web服务器中提供了一个Web应用程序的运行时环境专门负责Web应用程序的部署编译运行以及生命周期的管理通过ServletContext类可以获取Web应用程序的运行时环境信息
常识JSP引擎Servlet引擎JSP容器和Servlet容器都是指Web服务器Web服务器用于管理所有Web应用程序
()?application对象的常用方法如下所示
方法名描述String?getAttribute(String?name)根据属性名称获取属性值
Enumeration?getAttributeNames()获取所有的属性名称
void?setAttribute(String?name
?Object?object)设置属性
指定属性名称和属性值
void?removeAttribute(String?name)根据属性名称删除对应的属性
?ServletContext?getContext(String?uripath)获取指定URL的ServletContext对象
String?getContextPath()获取当前Web应用程序的根目录
String?getInitParameter(String?name)根据初始化参数名称
获取初始化参数值
int?getMajorVersion()获取Servlet?API的主版本号
int?getMinorVersion()获取Servlet?API的次版本号
String?getMimeType(String?file)获取指定文件的MIME?类型
String?getServletInfo()获取当前Web服务器的版本信息
String?getServletContextName()获取当前Web应用程序的名称
void?log(String?message)将信息写入日志文件中
?使用application对象存储数据
()?设置application对象的属性和获取application对象的属性
测试代码
TestApplicationjsp
<%@?page?language=;java;?contentType=;text/html;?charset=GBK;%>
<%?requestsetCharacterEncoding(;GBK;);%>
<html>
<body>
<form?name=;form;?action=;?method=;post;>
用户名
<input?type=;text;?name=;username;?value=;>
<br>
密?码
<input?type=;password;?name=;pwd;?value=;>
<br>
<input?type=;submit;?name=;btSubmit;?value=;提交;>
</form>
<%
applicationsetAttribute(;username;?requestgetParameter(;username;));
applicationsetAttribute(;pwd;?requestgetParameter(;pwd;));
%>
</body>
</html>
测试代码
TestCommonjsp
在TestCommonjsp?页面中通过application对象获取属性注意TestApplicationjsp和TestCommonjsp这两个页面之间没有任何关联只要通过application对象设置了属性那么就可以在任何页面通过application对象获取属性或者删除属性
<%@?page?language=;java;?contentType=;text/html;?charset=GBK;%>
<%?requestsetCharacterEncoding(;GBK;);?%>
<html>
<body>
用户名<%=applicationgetAttribute(;username;)?%><br>
密?码<%=applicationgetAttribute(;pwd;)?%><br>
</body>
</html>
()?删除application对象的属性
测试代码
TestCommonjsp
在TestCommonjsp?页面中删除application对象的属性
<%@?page?language=;java;?contentType=;text/html;?charset=GBK;%>
<%?requestsetCharacterEncoding(;GBK;);?%>
<html>
<body>
<%;删除属性;%>
<%
applicationremoveAttribute(;username;);
applicationremoveAttribute(;pwd;);
%>
用户名<%=applicationgetAttribute(;username;)%><br>
密?码<%=applicationgetAttribute(;pwd;)%><br>
</body>
</html>
?使用application对象实现网站计数器
测试代码
TestApplicationjsp
<%@?page?language=;java;?contentType=;text/html;?charset=GBK;%>
<%@?page?import=;javautil*;%>
<%?requestsetCharacterEncoding(;GBK;);%>
<html>
<body>
<%!
ServletContext?application;
synchronized?void?countPeople()?{
application?=?getServletContext();
Integer?number?=(Integer)applicationgetAttribute(;number;);
if?(number?==?null)?{
number?=?new?Integer();
applicationsetAttribute(;number;?number);
}?else?{
number?=?new?Integer(numberintValue()?+?);
applicationsetAttribute(;number;?number);
}
}
%>
<%
if?(sessionisNew())?{
countPeople();
}
int?personCount?=?((Integer)applicationgetAttribute(;number;))intValue();
%>
<p>欢迎访问本网站您是第?<%=?personCount?%>?个访问用户!
</body>
</html>
?使用application对象获取初始化参数
()?一?般来说在webxml文件中设置初始化参数有如下两种方式
n?设置系统范围内的初始化参数
n?针对单个Servlet文件或JSP文件设置初始化参数
对于系统范围内的初始化参数可通过ServletContext?接口的getInitParameter(String?name)方法根据指定的参数名获取对应的参数值
对于针对单个Servlet文件或JSP文件设置初始化参数可通过ServletConfig接口的?getInitParameter(String?name)方法根据指定的参数名获取对应的参数值
()?如何设置系统范围内的初始化参数
在webxml文件中可利用contextparam元素来设置系统范围内的初始化参数contextparam元素应该包含paramnameparamvalue以及可选的description子元素如下所示
<contextparam>
<paramname>supportemail</paramname>
<paramvalue></paramvalue>
</contextparam>
webxml文件的示例
<?xml?version=;;?encoding=;UTF;?>
<webapp?version=;;
xmlns=;;
xmlns:xsi=;;?charset=GBK;?%>
<%?requestsetCharacterEncoding(;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>
修改webxml文件添加蓝色字体部分
<?xml?version=;;?encoding=;UTF;?>
<webapp?version=;;
xmlns=;;
xmlns:xsi=;;?charset=GBK;
pageEncoding=;GBK;%>
<%?requestsetCharacterEncoding(;GBK;);?%>
<html>
<body>
<h>使用application对象获取Web应用程序的环境信息</h>
<p>
<font?color=;Red;>获取当前Web服务器的版本信息</font><%=?applicationgetServerInfo()?%><br>
<font?color=;Red;>获取Servlet?API的主版本号</font><%=?applicationgetMajorVersion()?%><br>
<font?color=;Red;>获取Servlet?API的次版本号</font><%=?applicationgetMinorVersion()?%>
<p>
<font?color=;Red;>获得指定URL的ServletContext对象</font>
<%
ServletContext?sc?=?applicationgetContext(;/ch/TestApplicationjsp;);
outprintln(scgetServerInfo());
%>
<p>
<%;需要在webxml设置?displayname?元素;%>
<font?color=;Red;>获取当前Web应用程序的名称</font><%=?applicationgetServletContextName()?%>
<p>
<font?color=;Red;>获取当前Web应用程序的上下文路径</font><%=?applicationgetContextPath()?%>
</body>
</html>
测试结果
session对象和application对象的比较
()?两者的作用范围不同
session对象是用户级的对象而application对象是应用程序级的对象
一个用户一个session对象每个用户的session对象不同在用户所访问网站的多个页面之间共享同一个session对象
一个Web应用程序一个application对象每个Web应用程序的application对象不同但一个Web应用程序的多个用户之间共享同一个application对象
在同一个网站下
n?每个用户的session对象不同
n?所用用户的application对象相同
在不同网站下
n?每个用户的session对象不同
n?每个用户的application对象不同
()?两者的生命周期不同
session对象的生命周期用户首次访问网站创建用户离开该网站?(不一定要关闭浏览器)?消亡
application对象的生命周期启动Web服务器创建关闭Web服务器销毁