jsp 本质上是一个servlet 类 ,<%! %>声明的是这个类的成员变量, <% %>中声明的变量是service()方法中的局部变量;成员变量会被多个对象共享,局部变量单独对象访问,所以 定义在<%! %>中的全局变量能递增
例子:
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<body>
<%!int counter=0;
synchronized void counterFunction()
{
counter++;
}
%>
<%counterFunction();%>
网站计数器<br>
您是第<%=counter%>位访问者
</body>
</html>
<html>
<body>
<%!int counter=0;
synchronized void counterFunction()
{
counter++;
}
%>
<%counterFunction();%>
网站计数器<br>
您是第<%=counter%>位访问者
</body>
</html>
1. Jsp会变转换为一个Servlet,<%! %>是声明语句,里面的声明直接写在Servlet类中,这不是全局变量,而是属性,属性!
2. <% counterFunction();%>,这是Scriplet,被写在了service()方法里!service()是Servlet的一个最重要的方法,客户请求Servlet时,容器只是创建一个线程,调用这个方法。
3. Servlet在服务器中一经初始化,就一直存在,知道服务器关闭。所以整个过程应该是这样:1. 写好Jsp页面2. 启动服务器,第一次请求Jsp页面的时候,服务器就生产Java类,然后编译,在初始化,最后返回请求。也就第一次会这样,后面请求时,容器直接返回存在的Servlet,因为已经存在了。
4. 在IE中输入http://localhost:8080/....jsp 后,容器创建一个线程,调用service方法,因为方法中有我们写的 counterFunction(),所以就能完成统计任务了,每请求一次,加1.