2.3.2 JSP声明

2.3.2 JSP声明

JSP声明用于声明变量和方法。在JSP声明中声明方法看起来很特别,似乎不需要定义类就可直接定义方法,方法似乎可以脱离类独立存在。实际上,JSP声明将会转换成对应Servlet的成员变量或成员方法,因此JSP声明依然符合Java语法。

JSP声明语法格式

JSP声明的语法格式如下:

1
<%! 声明部分 %>

declare.jsp

看下面使用JSP声明的示例页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 声明示例 </title>
<meta name="website" content="http://www.crazyit.org" />
</head>
<!-- 下面是JSP声明部分 -->
<%!
//声明一个整形变量
public int count;
//声明一个方法
public String info()
{
return "hello";
}
%>
<body>
<%
//将count的值输出后再加1
out.println(count++);
%>
<br/>
<%
//输出info()方法的返回值
out.println(info());
%>
</body>
</html>

测试

在浏览器中测试该页面时,可以看到正常输出了count值,每刷新一次,count值将加1,同时也可以看到正常输出了info()方法的返回值。
上面的代码:

1
2
3
4
5
6
7
8
9
<%!
//声明一个整形变量
public int count;
//声明一个方法
public String info()
{
return "hello";
}
%>

声明了一个整型变量和一个普通方法,表面上看起来这个变量和方法不属于任何类,似乎可以独立存在,但这只是一个假象。打开Tomcat生成的的declare_jsp.java文件(E:\apache-tomcat-8.5.35\work\Catalina\localhost\basicSyntax\org\apache\jsp\declare_jsp.java),看到如下代码片段:

public final class declare_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
//声明一个整形变量
public int count;
//声明一个方法
public String info()
{
    return "hello";
}
......

上面的粗体字代码与JSP页面的声明部分完全对应,这表明**JSP页面的声明部分将转换成对应Servlet的成员变量或成员方法**。

JSP声明可以使用的修饰符

由于JSP声明语法定义的变量和方法对应于Servlet类的成员变量和方法,所以JSP声明部分定义的变量和方法可以使用privatepublic等访问控制符修饰,也可使用static修饰,将其变成类属性和类方法。

不过,不能使用abstract修饰声明部分的方法,因为抽象方法将导致JSP对应Servlet变成抽象类,从而导致无法实例化。

打开多个浏览器,甚至可以在不同的机器上打开浏览器来刷新该页面,将发现所有客户端访问的count值是连续的,即所有客户端共享了同一个count变量。这是因为:JSP页面会编译成一个Servlet类,每个Servlet在容器中只有一个实例;在JSP中声明的变量是成员变量,成员变量只在创建实例时初始化,该变量的值将一直保存,直到实例销毁。
值得注意的是,info()的值也可正常输出。因为JSP声明的方法其实是在JSP编译中生成的Servlet的实例方法—Java里的方法是不能独立存在的,即使在JSP页面中也不行。
总结:JSP声明中独立存在的方法,只是一种假象。