JSP方法变量与类变量

来源:互联网 发布:淘宝量子恒道是什么 编辑:程序博客网 时间:2024/05/16 17:52

问题引入:

JSP文件中这两种变量声明有什么区别?

<%!int count;%>
<% int count2;%>

在JSP中<%! %>为JSP声明,可以声明变量和方法,与<% %>程序片不同的是,前者声明的变量或方法会成为该JSP编译后的Servlet类的成员变量或方法。

下面我们来证实:

在count.jsp中分别使用两种方法声明变量
这里写图片描述

知识点: JSP页面在第一次访问时会被servlet容器编译为Servlet类。

使用浏览器访问count.jsp后在下面目录中可以看到生成对应的java文件和编译后的.class文件(Tomcat编译JSP文件后生成的类文件会在work目录里)

这里写图片描述

打开.java后可以看到变量count和方法print()为类成员。

这里写图片描述

而在_jspService()方法里count2被定义为方法变量

这里写图片描述

知识点:
1.servlet的运行模式为单实例多线程,也就是在web项目运行过程中每个servlet类只有一个实例,而每次访问JSP页面Tomcat都会创建线程调用编译后servlet类实例的service方法。

当访问count.jsp页面时,调用该servlet类实例的service()方法,jvm在栈中创建变量count2,当service()方法执行结束时,变量count2则消失。而使用<%! %>声明的变量count成为类成员变量,在jvm的堆中创建,当servlet实例被servlet容器(Tomcat)创建出来后,变量count会一直存在堆中。

测试例子:

JSP文件:

这里写图片描述

使用浏览器打开,每次刷新(创建线程调用servlet的service()方法)成员变量count都会+1,即使使用不同浏览器也会在原本的值上+1,而方法变量count2一直是0;(细心的朋友会发现“count2 = 0;”,原因是直接使用没有初始化的方法变量的话java编译器会报The local variable count2 may not have been initialized错误)

这里写图片描述

0 0