JSP的隐式对象(application)

1.application对象简介

  • application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
  • 这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
  • 通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
  • 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。

2.作用域对比

所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。JSP中九个内置对象及其相应所属作用域如下表:

编号

对象

所属作用域

作用域描述  

对象作用

1        

request

request

在当前请求中有效

用于接收通过HTTP协议传送到服务器的数据(包括头信息、系统信息、请求方式以及请求参数等)。

2

response

page

在当前页面有效

表示服务器端对客户端的回应。主要用于设置头信息、跳转、Cookie等

3

out

page

在当前页面有效

用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区

4

session

session

在当前会话中有效

用于存储特定的用户会话所需的信息,默认30分钟后失效

5

application

application

在所有应用程序中有效

用于存储和访问来自任何页面的变量

所有的用户分享一个Application对象,服务器启动发送第一个请求时就产生了Application 对象,直到服务器关闭。

6

config

page

在当前页面有效

 取得服务器的配置信息

7

pageContext

page

在当前页面有效

  用于存取其他隐含对象,如request、reponse、session、application等对象。(实际上,pageContext 对象提供了对ISP页面所有的对象及命名空间的访问。

8

page

page

在当前页面有效

 page对象代表JSP本身(对应this),只有在JSP页面内才是合法的

9

Exception

page

在当前页面有效

 显示异常信息,必须在page指令中设定<%@page isErrorPage="true“%>才能使用,在一般的JSP页面中使用该对象将无法编译JSP文件

域对象范围由小到大排列:

page域(pageContext)< request域  <  session域  <  application域

3.application对象存储数据的方法(代码来源:https://www.iteye.com/blog/qq-24665727-2279609)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>数据共享</title>
</head>
<body>
    <%
        //存储
        pageContext.setAttribute("pageContext", 1);
        request.setAttribute("request", 1);
        session.setAttribute("session", 1);
        application.setAttribute("application", 1);
    
    //本页获取
        Object obj=pageContext.getAttribute("pageContext");
        Object obj1=request.getAttribute("request");
        Object obj2=session.getAttribute("session");
        Object obj3=application.getAttribute("application");
    %>
    pageContext:<%=obj%><br>
    request:<%=obj1%><br>
    session:<%=obj2%><br>
    application:<%=obj3%><br>
</body>
</html>

页面输出:
pageContext:1
 request:1
 session:1
 application:1

 4.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) 将信息写入日志文件中。

5.示例

简单例子1——计数器

count.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>网站计数器</title>
</head>
<body>
<%
int count=1;
if(application.getAttribute("count")==null)
{
    application.setAttribute("count", 1);
}
else
{
    count = ((Integer)application.getAttribute("count")).intValue();
    
    if(session.isNew())
    {
        application.setAttribute("count", ++count);
    }
}

%>
当前是第:<%=application.getAttribute("count") %>个用户<br>

</body>
</html>

简单例子2——使用application对象获取Web应用程序的环境信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取web应用程序配置信息</title>
</head>
<body>
<table>
        <tr>
<%--            获取当前Web服务器的版本信息--%>
            <td>getServerInfo</td>
            <td><%=application.getServerInfo()%></td>
        </tr>
        <tr>
<%--            获取某一资源的路径--%>
            <td>getResource</td>
            <td><%=application.getResource("/Count.jsp")%></td>
        </tr>
        <tr>
<%--            获取根目录的路径--%>
            <td>getRealPath</td>
            <td><%=application.getRealPath("/")%></td>
        </tr>
        <tr>
<%--            获取当前Web应用程序的名称--%>
            <td>getServletContextName</td>
            <td><%=application.getServletContextName()%></td>
        </tr>
</table>
</body>
</html>

简单例子3——使用application对象获取初始化参数(代码来源:https://blog.csdn.net/fjseryi/article/details/12851447?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task)

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

  • 设置系统范围内的初始化参数
  • 针对单个Servlet文件或JSP文件设置初始化参数

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

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

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

<context-param>
<param-name>support-email</param-name>
<param-value>blackhole@mycompany.com</param-value>
</context-param>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>DynamicTest</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
<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>

</web-app>

TestApplication02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用application对象获取初始化参数</title>
</head>
<body>
<!-- 使用application对象获取系统范围内的初始化参数 -->
<font color=”Red”>使用application对象获取初始化参数:</font>
<br>
<%
String appName = getServletContext().getInitParameter("appName");
String appVersion = getServletContext().getInitParameter("appVersion");
%>
应用程序的名称:<%=appName%><br>
应用程序的版本:<%=appVersion%>
</body>
</html>

运行结果:

6. session对象和application对象的比较

(1) 两者的作用范围不同:

session对象是用户级的对象,而application对象是应用程序级的对象。

一个用户一个session对象,每个用户的session对象不同,在用户所访问网站的多个页面之间共享同一个session对象。

一个Web应用程序一个application对象,每个Web应用程序的application对象不同,但一个Web应用程序的多个用户之间共享同一个application对象。

在同一个网站下:

  •  每个用户的session对象不同
  • 所用用户的application对象相同

在不同网站下:

  • 每个用户的session对象不同
  • 每个用户的application对象不同

(2) 两者的生命周期不同:

  • session对象的生命周期:用户首次访问网站创建,用户离开该网站 (不一定要关闭浏览器) 消亡。
  • application对象的生命周期:启动Web服务器创建,关闭Web服务器销毁。

参考文章:

https://www.runoob.com/jsp/jsp-implicit-objects.html

https://www.cnblogs.com/raozihao/p/7711582.html

https://blog.csdn.net/w252064/article/details/78963057

https://www.iteye.com/blog/qq-24665727-2279609

https://blog.csdn.net/CCCrunner/article/details/81052373

https://blog.csdn.net/fjseryi/article/details/12851447?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
原文地址:https://www.cnblogs.com/YorkZhangYang/p/12423260.html