学科分类
目录
Java Web

JSP声明

当JSP页面被翻译成Servlet程序时,JSP中包含的脚本片段、表达式、模板元素都将转换为Servlet中_jspService()方法的程序代码。这时,JSP脚本片段中定义的变量都将成为_jspService()方法中的局部变量,而JSP脚本片段中定义的方法都将插入_jspService()方法,从而会出现程序的方法再定义方法,这样的语法是错误的。为了解决这样的问题,在JSP技术中提供了声明,它以“<%!”开始,以“%>”结束,其语法格式如下所示:

<%! 
    java代码
%>

在上述语法格式中,被声明的Java代码将被翻译到Servlet的_jspService()方法之外,即在JSP声明中定义的都是成员方法、成员变量、静态方法、静态变量、静态代码块等。

同脚本片段一样,在一个JSP页面中可以有多个JSP声明,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java语句。接下来对demo.jsp进行修改,修改后的代码如下所示:

<%!
static {
        System.out.println("static code block");
    }%>
<%!
private int i = 9;
    public static java.lang.String str = "www.itcast.cn";

    public void jspInit() {
        System.out.println("init method");
        System.out.println("i = "+i);
        System.out.println("str = "+str);
    }
%>

在翻译的demo_jsp.java文件中可以看到JSP声明被翻译成了如下所示的代码:

package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
class simple_jsp extends org.apache.jasper.runtime.HttpJspBase implements
        org.apache.jasper.runtime.JspSourceDependent {
    static {
        System.out.println("static code block");
    }
    private int i = 9;
    public static java.lang.String str = "www.itcast.cn";
    public void jspInit() {
        System.out.println("init method");
        System.out.println("i = "+i);
        System.out.println("str = "+str);
    }
    ...... ......
}

从上面翻译的代码可以看出,JSP声明中的变量i、str、静态代码块和方法jspInit()都翻译成了demo_jsp的成员。在浏览器中输入URL地址http://localhost:8080/chapter07/demo.jsp访问demo.jsp页面,程序在控制台的打印结果如图1所示。

img

图1 运行结果

从图1中可以看出,程序不仅将静态代码块的执行结果打印了出来,而且将jspInit()方法的执行结果也打印了出来。有些读者肯定会有疑惑,成员方法jspInit()为什么会被自动调用呢?这是因为Tomcat在创建某个Servlet实例对象后,将调用init()方法进行初始化,而JSP页面所生成的Servlet的init()方法内部调用了jspInit()方法,所以当第一次访问demo.jsp页面时,都调用jspInit()方法进行JSP页面的初始化。所以大家在今后的开发中如果需要在JSP页面执行某个业务操作的话,可以将业务操作的逻辑写在jspInit()方法中,这样调用jsp后,会执行jspInit()方法。

点击此处
隐藏目录