JSP声明

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

JSP声明的语法格式如下:

<%! 声明部分 %>

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

程序清单:codes\02\2.2\jspPrinciple\declare.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>声明测试< /TITLE></HEAD><!-- 下面是JSP声明部分 --><%!//声明一个整型变量public int count;//声明一个方法public String info(){return "hello";}%><BODY><%//将count的值输出后再加 1out.println(count++);%><br><%//输出info()方法的返回值 out.println(info());%></BODY></HTML>

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


上面粗体字代码部分声明了一个整型变量和一个普通方法,表面上看起来这个变量和方法不属于任何类,似乎可以独立存在,但这只是一个假象。打开Tomcat的 work\Catalina\localhost\jspPrinciple\org\apache\jsp目录下declare_jsp.java文件,看到如下代码片段:

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


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

由于JSP声明语法定义的变量和方法对应于Servlet的成员变量和方法,所以JSP声明部分定义的变量和方法可以使用private、public等访问控制符修饰,也可使用static修饰,将其变成类属性和类方法。但不能使用abstract修饰声明部分的方法,因为抽象方法将导致JSP对应 Servlet变成抽象类,从而导致无法实例化。

打开多个浏览器,甚至可以在不同的机器上打开浏览器来刷新该页面,将发现所有客户端访问的count值是连续的,即所有客户端共享了同一个count变量。这是因为:JSP页面会编译成一个Servlet类,每个Servlet在容器中只有一个实例;在JSP中声明的变量是成员变量,成员变量只在创建实例时初始化,该变量的值将一直保存,直到实例销毁。

值得注意的是,info()的值也可正常输出。因为JSP声明的方法其实是在JSP编译生成的Servlet的实例方法——Java里的方法是不能独立存在的,即使在JSP页面中也不行。

JSP声明中独立存在的方法,只是一种假象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值