《Servlet和JSP学习指南》一3.5 脚本元素

3.5 脚本元素

第二种JSP句法元素是脚本元素,它将Java代码合并成一个JSP页面。脚本元素有3种类型:Scriptlet、声明及表达式,这些都将在接下来的小节中讨论。

3.5.1 Scriptlet

Scriptlet是一个Java代码块,它以<%开头,以%>结束。例如,代码清单3-6中的scriptletTest.jsp页面就是使用了Scriptlet。
《Servlet和JSP学习指南》一3.5 脚本元素
《Servlet和JSP学习指南》一3.5 脚本元素

上述JSP页面中有两个Scriptlet。注意,在一个Scriptlet中定义的变量,对于它后面的其他Scriptlet是可见的。
一个Scriptlet中的首行代码可以与<%标签放在同一行,%>标签可以与最后一行代码放在同一行。但是这样会破坏页面的可读性。

3.5.2 表达式

表达式(Expression)的运算结果会被填入隐式对象out的print方法中。表达式以<%开头,并以%>结束。例如,以下粗体部分就是一个表达式:
《Servlet和JSP学习指南》一3.5 脚本元素

注意,表达式的后面不需要用分号。
对于这个表达式,JSP容器会先运算java.util.Calendar.getInstance().getTime(),然后将结果传给out.print()。它与下面这个Scriptlet的结果是一样的:
《Servlet和JSP学习指南》一3.5 脚本元素

3.5.3 声明

可以声明(declaration)能够在JSP页面中使用的变量和方法。声明要用<%!和%>包起来。如代码清单3-7中declarationTst.jsp页面展示的JSP页面,就声明了一个名为getTodaysDate的方法。
《Servlet和JSP学习指南》一3.5 脚本元素
《Servlet和JSP学习指南》一3.5 脚本元素

声明可以放在JSP页面中的任何位置,并且同一个页面中可以有多个声明。
我们可以利用声明覆盖实现类中的init和destroy方法。覆盖init,要声明一个jspInit方法;覆盖destroy,要声明一个jspDestroy方法。这两个方法详解如下:
jspInit。该方法与javax.servlet.Servlet中的init方法类似。JSP页面被初始化时,就会调用jspInit。与init方法不同的是,jspInit不带参数。你仍然可以通过隐式对象config来获得ServletConfig对象。
jspDestroy。该方法与Servlet中的destroy方法相似,当JSP页面要被销毁时,就会调用它。
代码清单3-8中的lifeCycle.jsp页面,示范了覆盖jspInit和jspDestroy的方法。
《Servlet和JSP学习指南》一3.5 脚本元素

lifecycle.jsp页面将被转换成如下这样的Servlet:
《Servlet和JSP学习指南》一3.5 脚本元素
《Servlet和JSP学习指南》一3.5 脚本元素
《Servlet和JSP学习指南》一3.5 脚本元素
《Servlet和JSP学习指南》一3.5 脚本元素

注意到上述Servlet中的jspInit和jspDestroy方法了吗?
利用以下URL可以调用lifeCycle.jsp:
《Servlet和JSP学习指南》一3.5 脚本元素

当第一次调用这个JSP页面时,会在控制台上看到“jspInit...”,当关闭Servlet/JSP容器时,则会看到“jspDestroy...”。

3.5.4 关闭脚本元素

随着JSP 2.0中Expression Language的发展,建议做法是利用EL来访问服务器端的对象,而不是在JSP页面中编写Java代码。为此,原本开启的JSP 2.0脚本元素,可以通过在部署描述符的中定义一个scripting-invalid元素,将它关闭,如下所示:
《Servlet和JSP学习指南》一3.5 脚本元素