jsp中的变量、方法的可访问性可见性即<%!%><%%>的区别
第一节 成员变量和局部变量
一、使用<%! %>定义的变量编译成servlet后成为servlet的私有成员变量,在servlet环境中,一个JSP页面只对应有一个servlet 实例在运行和响应所有的页面请求。因此,这个servlet实例的成员变量被所有的请求共享,所以当该页面被访问过后,下次再访问该页面时其成员变量保持上次的值。由于这个效果,这个“成员变量”也被称为“全局变量”了。
二、使用<% %>定义的变量编译成servlet后成为service()方法的一个局部变量,而service()方法中的局部变量在每次响应一个请求时就重建一次。所以请求和请求之间是隔开的,互不干扰。
<html>
<head>
<title>helloworld</title>
</head>
<body>
<%!int i = 1;//成员变量%>
<%
int i = 5;//局部变量
%>
<%
out.println("i=" + i++);//访问局部变量
%>
<br/>
<%
out.println("(this.i)=" + (this.i)++);//访问成员变量(被局部变量隐藏,所以要用this)
%>
<br/>
</body>
</html>
运行结果是
第一次 | i=5 (this.i)=1 |
第二次 | i=5 (this.i)=2 |
第n次 | i=5 (this.i)=n |
总结:在写多线程或者用多线程框架时,应该考虑一下上述两种变量的区别。推荐用局部变量。
第二节 编译结果放置位置
<% %>和<%= %>的编译结果如同放在service()方法里,<%! %>的编译结果则作为成员变量、成员方法。
下例显示了访问计数功能:
<%!int i = 0;%>
<%
i++;
%>
<%
int i = 8;
%>
您是第<%=i%>个访问本站的用户
<br/>
您是第<%=this.i%>个访问本站的用户
运行结果是:
第一次 | 您是第8个访问本站的用户 您是第1个访问本站的用户 |
第二次 | 您是第8个访问本站的用户 您是第2个访问本站的用户 |
第n次 | 您是第8个访问本站的用户 您是第n个访问本站的用户 |
总结:<%= %>的编译结果如同放在service()方法里。<%= %>以局部变量优先,如果局部变量隐藏了成员变量,则访问成员变量需要用this.。
第三节用<%! %>定义成员方法
<%!int i = 1;%>
<%!int getNumber() {
return i++;
}%>
<%
int i = 10;
out.print("i:" + getNumber() +"<br/>");
out.print("i:" + i);
%>
运行结果是
i:1 i:10 |
第四节 页面代码的一种特殊情形
一般喜欢把页面里多处要用到的变量设置成全局变量。这时,当把该变量赋值后,再次访问该页面时,该变量的值依然保存。当希望通过用全局变量接受提交的参数时:
if(request.getParameter("operation")!=null);
ID = request.getParameter("operation").trim();
有一种意外情形:当ID在前一次赋过初值后,再次访问该页面但'operation'参数为空时,本来希望ID也为空,但web运行环境下有可能使得ID的值为上次访问该页面时赋的值。此时,希望通过ID值的不同而做不同的操作的意图落空。解决的办法是将ID用<% %>定义等。