application对象的说明:
前面学习了session对象,用户第一次访问Web服务目录时,Tomcat服务器创建和该用户相对应的session对象,当用户在所访问的Web服务目录的各个页面之间浏览时,这个session对象都是同一个,而且不同用户的session对象是互不相同的。
本次学习的application对象也是由Tomcat服务器负责创建,但与session对象不同的是,application对象被访问该Web服务目录的所有的用户共享,但不同Web服务目录下的application互不相同。
■由于application对象对所有的用户都是相同的,因此,在某些情况下,对该对象的操作需要实现同步(synchronized)处理。
application对象的常用方法:
public void setAttribute(String key, Object obj)
public Object getAttibue(String key)
public void removeAttribue(String key)
Enumeration getAttributeNames()取得所有application范围的属性名
String getRealPath(String path) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。path应该以“/”开始,“/”表示当前web应用的根目录。
application对象访问真实路径:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//application整个应用有效
//String path = application.getRealPath("/");//访问的服务器的文件的路径
String path = this.getServletContext().getRealPath("/");//上下两种结果一样,但一般用这个
%>
<h3>真实路径: <%=path %></h3>
</body>
</html>
内置对象的作用域:
说明:
application对象作用域范围是整个应用有效,是怎么体现出来的呢?
下面进行演示:
c2_application_2.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="green">
第一个session——🆔页面
<%
String id = session.getId();
out.print("<br>你的session——🆔是:"+id);
session.setAttribute("name", "apple");
this.getServletContext().setAttribute("count", "one");
%>
<form action="c2_application_3.jsp" method="post">
<input type="text" name="boy">
<input type="submit" name="送出">
</form>
</body>
</html>
c2_application_3.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="pink">
第二个session——🆔页面
<%
String id = session.getId();
out.print("<br>你的session——🆔是:"+id);
String name = (String)session.getAttribute("name");//接收
String count = (String)this.getServletContext().getAttribute("count");
%>
<br>姓名:<%=name %><br>
计数:<%=count %><br>
单击超链接跳转到第三个session——🆔页面.
<a href="c2_application_4.jsp">跳转到第三个session页面</a>
</body>
</html>
c2_application_4.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="yellowgreen">
第三个session——🆔页面
<%
String id = session.getId();
out.print("<br>你的session——🆔是:"+id);
String name = (String)session.getAttribute("name");//接收
String count = (String)this.getServletContext().getAttribute("count");
%>
<br>姓名:<%=name %><br>
计数:<%=count %><br>
单击超链接跳转到第一个session——🆔页面.
<a href="c2_application_2.jsp">跳转到第一个session页面</a>
<%
//第三个session页面跳转到第一个页面的时候session——ID发生改变
session.invalidate();//结束当前的session,开始新的session
%>
</body>
</html>
运行结果演示:
说明:
看到这里你可能会说,这也不能看出来application对象的整个应用有效啊
确实,这样是看不出来的,因为这是从第一个页面依次进行运行的,所以该有的都有
所以,那么不从第一个页面开始运行呢,结果又是什么样子的,让我带你一起研究:
直接运行第二个页面c2_application_3.jsp文件
对于直接运行第三个页面c2_application_4.jsp文件效果和上面也是一样的,所以可以说明application对象的作用域是整个应用