3.2 JSP的脚本元素

JSP语句中的JSP脚本元素(Scripting Elements)用来插入一些Java语言程序代码,这些Java语言的程序代码将出现在由当前JSP页面生成的Servlet中,用来实现一些功能。它包括隐藏注释、HTML注释、声明、脚本代码和表达式等内容。

3.2.1 隐藏注释

JSP语句中的隐藏注释(Hidden Comment)镶嵌在JSP程序的源代码中,使用隐藏注释的目的并不是提醒用户,而是为了:

使程序设计人员和开发人员阅读程序方便,增强程序的可读性。

在增强程序可读性的同时,又顾及程序系统的安全性。如果用户通过Web浏览器查看该JSP页面,将看不到隐藏注释的内容。

隐藏注释写在JSP程序代码中,但不发送到客户端。

JSP语法格式如下:

     <%-- comment --%>

     <%-- 注释 --%>

隐藏注释标记的字符在JSP编译时会被忽略,它在希望隐藏或者注释JSP程序时是非常有用的。JSP编译器不会对<%--和--%>之间的语句进行编译,且该语句也不会显示在客户端的浏览器中。

【例3-2】隐藏注释(hidden-comment.jsp)。

     <%@ page contentType="text/html; charset=GBK"%>
     <html>
     <head>
     <title>隐藏注释示例</title>
     </head>
     <body>
     <h1>隐藏注释测试</h1>
     <%-- 这行注释将不显示在客户端的浏览器上 --%>
     </body>
     </html>

将此程序执行后,在浏览器上显示如图3-2所示的结果。查看源文件,注释的语句没有显示出来。

图3-2 hidden-comment.jsp页面运行结果

3.2.2 HTML注释

HTML注释又称为显式注释,用户能够在客户端看到注释内容。HTML注释形式如下:

     <!-- 注释语句[<%=表达式%>] -->

例如:

     <!-- HTML注释,用户将会看到本段注释内容-->

【例3-3】HTML注释(html-notes.jsp)。

     <%@ page contentType="text/html; charset=GBK"%>
     <html>
     <head>
     <title>HTML注释</title>
     </head>
     <body>
     <!-- This file displays the user login screen -->
     未显示上一行的注释。
     </body>
     </html>

JSP语法中的HTML注释和HTML语言本身十分相似,它们都可以通过在某一JSP页面中右击,然后在弹出的快捷菜单中选择“查看源文件”命令查看其代码。

将此程序执行后,可在浏览器上显示如图3-3所示的结果。查看源文件,注释的语句会显示出来。

图3-3 html-notes.jsp页面运行结果

【例3-4】比较两种注释方式(comparison-notes.jsp)。

     <%@ page contentType="text/html; charset=GBK"%>
     <html>
     <head>
     <title>要多加练习</title>
     </head>
     <body>
     <!--This page was loaded on <%= (new java.util.Date()).toLocaleString() %>  -->
     在源文件中包括当前时间。
     <%=(new java.util.Date()).toLocaleString()%>
     </body>
     </html>

将此程序执行后,可在浏览器上显示如图3-4所示的结果。查看源文件,HTML注释中的时间会计算出结果并显示出来。

图3-4 comparison-notes.jsp页面运行结果

由于Scriptlets包含Java代码,所以Java中的注释规则在Scriptlets中也适用。常用的Java注释使用“//”表示单行注释,使用“/* */”表示多行注释。例如:

也可以这样:

3.2.3 声明

JSP中的声明(Declaration)用来定义一个或多个合法的变量(包括普通变量和类变量)和方法,并不输出任何的文本到输出流,声明的变量和方法将在JSP页面初始化时被初始化。

JSP声明的语法格式如下:

     <%! declaration; [ declaration; ] ... %>

     <%! 声明; [声明; ] ... %>

例如:

     <%! int a=1; %>
     <%! int b; %>
     <%! String s="test"; %>

JSP语法中的声明语句用来声明将要在JSP中使用的变量和方法。变量和方法必须要声明,否则就会出错。可以一次声明多个变量和方法,只要以“;”结尾即可,而且必须保证这些声明在Java中是合法的。

在声明方法或变量时,应注意以下方面:

声明必须以“;”结尾,在这一点上与JSP语法中的Scriptlet语句有同样的规则,但是JSP语法中的表达式不能以“;”结尾。

可以直接使用在<%@ page %>中被包含进来的已经声明的变量和方法,不需要对它们重新进行声明。

一个声明仅在一个页面中有效,对于一些在每个页面都用得到的声明,最好把它们写成一个单独的文件,然后用<%@ include %>或<jsp:include >语句把该文件及文件中的各个元素包含进来。

由于声明不会有任何输出,因此它们往往和JSP表达式或Scriptlet结合在一起使用。

例如下面代码定义了变量a和变量b:

     <%!
     int a= 2;
     int b= 3;
     %>

输出a与b的乘积为:

     <%= a*b %>

JSP的变量可以分为局部变量和全局变量,在JSP中声明变量时,要注意变量的定义域。

在程序片段中声明的变量,即在<%…%>中声明的变量是JSP的局部变量,它们对外部函数是不可见的。

在<%!…%>中声明的变量是全局变量,这种变量在整个JSP页面内都有效。因为JSP引擎将JSP页面编译成Java文件时,将这些变量作为类的成员变量,这些变量的内存空间直到服务器关闭后才释放。

在<%!…%>中声明的方法在整个JSP页面内有效,但是在该方法内定义的变量只在该方法内有效。

【例3-5】比较局部变量和全局变量的不同之处(welcome.jsp)。

执行此程序,并且不断地刷新页面,可以看到全局变量Num随着刷新不断增大,而局部变量count始终是1,可在浏览器上显示如图3-5所示的结果。

图3-5 welcome.jsp页面运行结果

【例3-6】方法的声明(dec-method.jsp)。

在这个实例中声明计算圆的面积和周长的两种方法,根据从表单提交圆的半径调用这两种方法进行计算。

在表单中输入半径的值,单击“开始计算”按钮,程序执行显示结果,如图3-6和图3-7所示。

图3-6 输入半径为3

图3-7 dec-method.jsp页面计算并显示结果

3.2.4 脚本代码

JSP中的脚本代码(Scriptlets)是一段Java程序代码,这些代码在请求处理时在服务器端按顺序执行,脚本代码中如果使用了out对象,则会在客户端显示输出内容。

脚本代码的语法格式如下:

     <% code fragment %>

     <% 代码 %>

一个Scriptlet能够包含多个JSP语句、方法、变量、表达式。有了Scriptlet,用户可以进行以下操作:

声明将要用到的变量。

编写JSP表达式。

使用任何隐含的对象和任何用<jsp:useBean>声明过的对象。

编写JSP语句(如果使用Java语言,这些语句必须遵从Java Language Specification,即Java语言规范)。

填写任何文本和HTML标记,注意JSP元素必须在Scriptlet之外。

当JSP收到客户的请求时,Scriptlet就会被执行,如果Scriptlet有显示的内容,这些显示的内容就可以存放在out对象中。

     <%
     String t = "test";
     out.println(t);
     %>

Scriptlet中的代码将被照搬到Servlet内,而Scriptlet前面和后面的静态HTML代码将被转换成println语句。这就意味着,Scriptlet内的Java语句并非一定要完整,没有关闭的块将影响Scriptlet外的静态HTML。

【例3-7】程序scriptlets.jsp混合了静态HTML代码和Scriptlet,程序运行结果如图3-8所示。

图3-8 scriptlets.jsp页面运行结果

注意

• 如果要在Scriptlet内部使用字符“%>”,必须写成“%\>”。

• 脚本段内不能定义方法,与声明不同,这是因为JSP引擎会把脚本段内的代码放到Servlet的方法内,而方法是不能被嵌套定义的。

3.2.5 表达式

JSP能够计算表达式(Expression),并向JSP页面输出表达式的运算结果。其语法格式如下:

     <%= expression %>

     <%= 表达式 %>

表达式元素表示的是一个在Java脚本语言中被定义的Java表达式,在运行后被自动转换成字符串,然后插入到表达式所在JSP文件的位置显示。表达式在运行时进行计算(页面被请求时),因此可以访问和请求有关的全部信息。例如:

     <%= new java.util.Date() %>//输出系统当前时间
     <%= "Hello" %> //输出Hello
     <%= 1+3+5 %> //输出9

在JSP页面中使用表达式时应注意以下两点:

不能用分号(;)作为表达式的结束符,这一点与Scriptlet不同,同样的表达式用在Scriptlet中时,就需要以分号来作为一个Scriptlet语句的结尾。

有时表达式也能作为其他JSP元素的属性值,一个表达式能够变得很复杂,它可能由一个或者多个表达式组成,这些表达式的顺序是从左到右。

注意

• JSP的表达式中没有分号,除非在加引号的字符串部分才使用分号。

• 表达式实际上是被转换成out.println()方法中的内容。如<%= "hello world "%>相当于JSP页面中的<%out.println("hello world "); %>。