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