JSP application用法
application、session、request、page他们的使用方法基本上都是一致的,只不过作用范围不一样而已:
application:全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。
request:请求作用域,就是客户端的一次请求。
page:一个JSP页面。
服务器启动后就产生了这个application对象,当客户再所访问的网站的各个页面之间浏览时,这个application对象都是同一个,直到服务 器关闭。但是与session不同的是,所有客户的application对象都是同一个,即所有客户共享这个内置的application对象。
<%@page contentType="text/html;charset=GB2312"%>
<html>
<head> </head>
<body>
<center>
<font size="5">application对象的使用</font>
<hr/>
<%
Object o = null;
String strNum = (String) application.getAttribute("Num"); //与session相同
int Num = 0;
if (strNum != null)
Num = Integer.parseInt(strNum) + 1;
application.setAttribute("Num", String.valueOf(Num));
%>
application对象中的
<font color="blue">Num</font>
变量值为:
<font color="red"><%=Num %> </font>
<br/>
</center>
</body>
</html>
1.getAttribute()
返回由name指定的名字的application对象的属性的值.
2. getAttributeNames()
返回所有的application对象的属性的名字,其结果是一个枚举的实例.
3. getInitParameter( String name )
返回由name指定的名字的application对象的某个属性的初始值.
4. getServletInfo()
返回servlet编译器的版本的信息.
5. setAttribute( String name , Object object )
设置由name指定的名字的application对象的属性的值object.
需要说明的是在一个所用范围内setAttruibute时请尽量不要多次set同一个对象ID,以防止对象所保存的信息被改变而无用。(但某些情况下这恰恰是有用处的!)
在线人数统计的例子
<%@ page contentType="text/html; charset=GB2312" %>
<HTML>
<HEAD>
<TITLE>application计数器</TITLE>
</HEAD>
<BODY>
<BR>
<%
Integer number=(Integer)application.getAttribute("Count");
//检查Count属性是否可取得
if(number==null)
{
number=new Integer(1);
application.setAttribute("Count",number);
}
if(session.isNew()==true) //判断用户是否执行刷新操作
{
//将取得的值增加1
number=new Integer(number.intValue()+1);
application.setAttribute("Count",number);
}
%>
<P><P>您是第
<%int a=((Integer)pageContext.getAttribute("Count",PageContext.APPLICATION_SCOPE)).intValue();
%>
<%=a%>
个访问本站的客户。
</BODY>
</HTML>
application对象一个教程
application对象是一个特别重要的JSP对象,它存在于服务器的内存空间中,服务器一旦启动,就会自动产生一个application对象,除非服务器被关闭,否则这个application对象将一直保持下去。在application对象的生命周期中,在当前服务器上运行的每一个JSP程序都可以任意存取和这个application对象绑定的参数(或者Java对象)的值。application对象的这些特性为我们在多个JSP程序中、多个用户共享某些全局信息(如当前的在线人数等)提供了方便。由此我们可以不借助数据库就实现聊天室的功能。
application对象其实是实现javax.servlet.ServletContext接口的类的实例对象,那么我们具体如何获得application对象呢?有以下几种方法。
1)在JSP程序中直接使用application以代表application对象
<% application.Method(); %>
2)使用ServletConfig接口
使用ServletConfig接口可以间接获取application对象,但是这个application对象的名字不能同样为application,因为application是JSP引擎创建的默认的application对 象的副本,不能够被覆盖。使用ServletConfig接口其实就是使用config对象,config对象是实现ServletConfig接口的类 的实例对象,它可以通过调用getServletContext()方法返回一个ServletContext接口的对象,也就是application对象的一个副本,如程序4-3所示。
【程序4-3】createApp1.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 ServletContext app=config. getServletContext();
08 out.println(app.getServerInfo());
09 %>
10 </body>
11 </html>
程序4-3首先创建了一个application对象的拷贝app,然后使用getServletInfo()方法获取服务器的相关信息,该程序的运行效果如图4-4所示。
图4-4 createApp1.jsp程序的运行效果
3)使用pageContext对象获取application对象
pageContext对象的getServletContext()方法同样可以返回一个application对象的副本,如程序4-4所示。
【程序4-4】createApp2.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 ServletContext app= pageContext. getServletContext();
08 out.println(app.getServerInfo());
09 %>
10 </body>
11 </html>
程序4-4的运行效果如图4-5所示,我们从图中可以发现,与程序4-3的运行效果是相同的。
图4-5 createApp2.jsp程序的运行效果
| 在JSP服务器的运行过程中,仅有一个application对象,application对象是由服务器创建的,由服务器自动清除它,不能被用户创建,用户也不能清除application对象,我们只能创建这个application对象的同步副本。application就是由JSP引擎自动创建的第一个application对象的同步副本。特别需要注意的是这些副本是同步的,任何一个副本上发生的变化都会影响到其他的副本。 |
1)getAttribute(String name)
当我们创建application对象的同步副本后,就可以存取和application对象绑定在一起的参数或者Java语言中的类的对象,因为application对象的生命周期是贯穿服务器的运行周期,因此,这些参数或者Java对象既然和application对象绑定在一起,那么它们的生命周期也应该和application对象一样,除非使用application对象的方法去绑定它或者使它和application对象解除绑定。使用getAttribute()方法可以返回那些和当前application对象绑定在一起的值或者Java对象。getAttribute()方法的参数name指定了目标参数或者目标Java对象的名字。
getAttribute()方法的使用方法如下:
<%
String username=(String)application. getAttribute (“username”);
out.println(username);
%>
2)getAttributeNames()
该方法可以返回所有与当前application对象绑定在一起的参数或者Java对象的名字。这个方法的返回值是一个枚举对象(Enumeration)。它的使用方法如下:
<%
Enumeration enum1=application.getAttributeNames();
while(enum1.hasMoreElements())
{
String attrName=(String)enum1.nextElement();
out.println(attrName+”<br>”);
}
%>
3)getServerInfo()
该方法可以获得当前服务器的详细信息,不同的服务器返回的信息格式不一样。在后面列出的程序范例中,getServerInfo()方法还将会被使用多次,这里我们暂不做详细解释。
4)setAttribute(String name, Object object)
该方法通常和getAttribute()方法及removeAttribute()方法搭配使用,它的作用就是将某个参数或者Java对象与application对象绑定在一起,在setAttribute()方法中,参数name指定和application对象绑定的参数或者Java对象的名称,参数object指定需要绑定的值,object必须是一个Java对象,例如Integer对象,但不能够是int类型的数据。如果在绑定新值时,已经有同名的参数或者Java对象和application对象绑定了,那么新值将会覆盖旧值。
setAttribute()方法的使用方法如下。
l 将某个字符串参数和application对象绑定在一起:
<%
String username=”george”;
String password=”george”;
application.setAttribute(“username”,username);
application.setAttribute(“password”, password);
out.println(application.getAttribute(“username”+”<br>”));
out.println(application.getAttribute(“password”));
%>
l 将某个Java对象和application对象绑定在一起:
<%
Vector vector=new Vector();
//init this vector
application.setAttribute(“vector”, vector);
Vector newVector=(Vector) application.getAttribute(“vector”);
//user newVector…
%>
5)removeAttribute(String name)
通过该方法,我们可以使某个参数或Java对象与application对象解除绑定关系。一旦绑定关系被解除,我们就不能使用getAttribute()方法获取它们的值了,否则,将会返回null值。
它的使用方法如下:
<%
String username=”george”;
application.setAttribute(“username”,username);
out.println(application.getAttribute(“username”));
application.removeAttribute(“username”);
out.println(application.getAttribute(“username”));
%>
6)log(String msg)
该方法用于往服务器的log文件中写入信息, 至于是哪一个log文件,则由服务器来决定。利用这个方法,我们可以在log文件中记录访问者的信息,这对于统计访问流量来源方面十分有用,同时也便于管 理员监控网站的运行情况。其实,还有一个同名但使用不同参数的log()方法,利用后者,我们可以将JSP程序执行过程中所发生的错误事件都记入log文件中。
| 在大部分的服务器中我们可以使用application.Method(…),但在有些较旧版本的服务器中,它们不支持application的形式,但它们支持以getServletContext().Method(…)的形式实现application对象的功能,读者一定要多加留心。 |
接下来,我们通过几个完整的例子向读者展示如何使用application对象的方法,首先来看看程序4-5。
【程序4-5】application.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 String username1="george";
08 String username2="robin";
09 String password1="george";
10 String password2="robin";
11
12 out.println("set application attribute <br>");
13 application.setAttribute("username1",username1);
14 application.setAttribute("username2",username2);
15 application.setAttribute("password1", password1);
16 application.setAttribute("password2", password2);
17
18 out.println("list application attribute: <br>");
19 Enumeration enum1=application.getAttributeNames();
20
21 while(enum1.hasMoreElements()){
22 String attrName=(String)enum1.nextElement();
23
24 if(attrName.equals("username1")||attrName.equals("username2")||
25 attrName.equals("password1")||attrName.equals("password2")){
26 out.println(attrName+"----->");
27 String attrValue=
28 application.getAttribute(attrName).toString();
29 out.println(attrValue+"<br>");
30 }
31 }
32
33 username1="robin";
34 password1="robin";
35
36 out.println("change application attribute:<br>");
37 application.setAttribute("username1",username1);
38 application.setAttribute("password1", password1);
39
40 out.println("username1----->"+application.getAttribute("username1")+
41 "<br>");
42 out.println("password1----->"+application.getAttribute("password1")+
43 "<br>");
44
45 out.println("remove application attribute:<br>");
46 application. removeAttribute("username1");
47 application. removeAttribute("password1");
48
49 out.println("relist application attribute: <br>");
50 Enumeration enum2=application.getAttributeNames();
51
52 while(enum2.hasMoreElements()){
53 String attrName=(String)enum2.nextElement();
54
55 if(attrName.equals("username1")||
56 attrName.equals("username2")||
57 attrName.equals("password1")||
58 attrName.equals("password2")){
59 out.println(attrName+"----->");
60 String attrValue=
61 application.getAttribute(attrName).toString();
62 out.println(attrValue+"<br>");
63 }
64 }
65 %>
66 </body>
67 </html>
程序4-5的流程如下:首先使用setAttribute()方法把4个参数和application对象绑定在一起,然后使用getAttributeNames()方法和getAttribute()方法获取它们的值。接下来再次使用setAttribute()方法,把其中两个参数的值用新值覆盖。然后调用removeAttribute()方法把这两个参数和application对象解除绑定。最后又使用getAttributeNames()方法和getAttribute()方法列出所有的参数名和参数值。
为了演示setAttribute()方法、getAttribute()方法和removeAttribute()方法的使用,我们把这些代码都集中在同一个JSP程序中,其实,也可以把程序4-5分为几个小程序,分别运行,结果是一样的。
程序4-5的运行效果如图4-6所示。
图4-6 application1.jsp程序的运行效果
下面的程序4-6和程序4-7分别演示了如何使用application对象存取Java对象。
【程序4-6】storeVector.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 vector vector=new Vector();
08 vector.add(“george1”);
09 vector.add(“george2”);
10 vector.add(“george3”);
11 vector.add(“george4”);
12 vector.add(“george5”);
13 application.setAttribute(“vector”, vector);
14 %>
15 </body>
16 </html>
【程序4-7】getVector.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 Vector vector= (Vector)application.getAttribute(“vector”);
08
09 for(int i=0;i<vector.size();i++) {
10 out.println(i+”----->”);
11 out.println(vector.elementAt(vector.size()-i-1).toString());
12 out.println(”<br>”);
13 }
14 %>
15 </body>
16 </html>
在程序4-6中,首先创建了一个Vector对象(vector),并且为其添加了5个元素,然后使用setAttribute()方法将它和application对象绑定在一起。在程序4-7中,首先从application对象中获取这个Vector对象,并且逆序将它所含有的元素输出。程序4-7运行的效果如图4-7所示,当然,必须首先运行程序4-6,才能运行程序4-7。