JSP中的application,它的基类竟然是ServletContext!

版权声明:一篇成长日记文章,没什么转载价值。 https://blog.csdn.net/zhaoyanga14/article/details/53117318

        学JSP已经有段时间了,最近在用MVC设计模式做一个考试管理系统的项目。尴尬的是,本想在Servlet通过application传值,结果不知道怎么才能用它,(创建Application类的对象,但其并没有set方法,况且该类所在包也不对),因为它是JSP中的一个内置对象,通常直接用就可以。那我们怎么找到它呢?

        我在JSP的小脚本里,输入“app”,然后点Alt+/键,上面显示“application:ServletContext”,这就恍然大悟了。原来JSP中的application并不是Application的对象,它的基类是ServletContext。所以,如果要在servlet.java文件中使用application的话,这样写就OK了:

public void function(

HttpServletRequest request){

    request.getSession().getServletContext().setAttribute("time", affCount);

}

另外,request和response的对象分别为HttpServletRequest和HttpServletResponse。

下面就记录下application的用法吧。

文章来源:传送门

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对象的常用方法,如下所示:

方法名描述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)将信息写入日志文件中。 

 2 使用application对象存储数据

(1) 设置application对象的属性和获取application对象的属性
测试代码
TestApplication.jsp
用户名:
密 码:
<%

application.setAttribute(“username”, request.getParameter(“username”));

application.setAttribute(“pwd”, request.getParameter(“pwd”));

%>
测试代码

TestCommon.jsp
在TestCommon.jsp 页面中,通过application对象获取属性,注意TestApplication.jsp和TestCommon.jsp这两个页面之间没有任何关联,只要通过application对象设置了属性,那么就可以在任何页面,通过application对象获取属性或者删除属性。
用户名:

密 码:

(2) 删除application对象的属性

 测试代码

TestCommon.jsp

 在TestCommon.jsp 页面中,删除application对象的属性。
<%

application.removeAttribute(“username”);

application.removeAttribute(“pwd”);

%>
用户名:

密 码:

3 使用application对象实现网站计数器(常用)

测试代码:

TestApplication01.jsp
<%!

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();

%>
欢迎访问本网站,您是第  个访问用户!

4 使用application对象获取初始化参数

(1) 一 般来说,在web.xml文件中,设置初始化参数有如下两种方式:

n 设置系统范围内的初始化参数

n 针对单个Servlet文件或JSP文件设置初始化参数


对于系统范围内的初始化参数,可通过ServletContext 接口的getInitParameter(String name)方法,根据指定的参数名,获取对应的参数值。


对于针对单个Servlet文件或JSP文件设置初始化参数,可通过ServletConfig接口的 getInitParameter(String name)方法,根据指定的参数名,获取对应的参数值。
(2) 如何设置系统范围内的初始化参数

在web.xml文件中,可利用context-param元素来设置系统范围内的初始化参数。context-param元素应该包含param-name、param-value以及可选的description子元素,如下所示:

support-email
[email protected]


web.xml文件的示例:



<web-app version=”2.4″

xmlns=”http://java.sun.com/xml/ns/j2ee”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>


appName


MyWebTest
appVersion

Version 1.0

MyTest01.jsp
测试代码

TestApplication02.jsp
使用application对象获取初始化参数:
<%

String appName = getServletContext().getInitParameter(“appName”);

String appVersion = getServletContext().getInitParameter(“appVersion”);

%>

应用程序的名称:

应用程序的版本:
修改web.xml文件,添加蓝色字体部分:
<web-app version=”2.4″

xmlns=”http://java.sun.com/xml/ns/j2ee”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>
appName

MyWebTest
appVersion

Version 1.0
MyTest01.jsp

5 使用application对象获取Web应用程序的环境信息

测试代码:

TestApplication03.jsp
<%@ page language=”java” contentType=”text/html; charset=GBK”

pageEncoding=”GBK”%>


使用application对象获取Web应用程序的环境信息


获取当前Web服务器的版本信息:

获取Servlet API的主版本号:

获取Servlet API的次版本号:

获得指定URL的ServletContext对象:

<%

ServletContext sc = application.getContext(“/ch3/TestApplication01.jsp”);

out.println(sc.getServerInfo());

%>

获取当前Web应用程序的名称:

获取当前Web应用程序的上下文路径:
测试结果:

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服务器销毁。


猜你喜欢

转载自blog.csdn.net/zhaoyanga14/article/details/53117318
今日推荐