
4.3 脚本
JSP脚本是<%与%>之间用Java语言编写的代码块。代码块必须完全符合Java语法,但可以配合使用HTML文本。这些Java代码最终转换为Servlet的一部分。一个JSP页面可以包含任意多个脚本。
4.3.1 输出表达式
<%=表达式%>输出表达式的计算结果。表达式中的变量必须是前面已声明过的变量。
注意:%与=之间不能有空格且表达式后面不需要分号。
依照4.2节介绍的操作步骤向Web应用JspBasic中添加JSP页面expression.jsp。完整代码如程序4-2所示。
程序4-2:expression.jsp
<%@ page language="java" pageEncoding="GB2312" %> <%@ page contentType="text/html; charset=gb2312" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>JSP表达式</title> </head> <body bgcolor="#FFFFFF"> <% for(int i=1; i<=5; i++){%> <H<%=i%>>你好</H<%=i%>><BR> <%}%> </body> </html>
程序说明:JSP脚本代码可以与HTML代码混杂在一起。JSP脚本代码可用来控制脚本产生动态内容。这里通过表达式<%=i%>动态生成HTML标记H1~H5来控制字符串"你好"的显示效果。
保存程序并重新发布Web应用,打开IE浏览器,在地址栏输入http://localhost:8080/JspBasic/expression.jsp,得到如图4-4所示的运行结果页面。

图4-4 输出表达式
4.3.2 注释
在JSP页面中有两种类型的注释。
(1)输出到客户端的注释:<! -comment->。
(2)不输出到客户端的注释:<%--comment--%>。它表示是JSP注释,在服务器端将被忽略,也不转化为HTML的注释,在客户端查看源码时是看不到的。这种注释一般是开发人员用来实现对程序代码的说明,但同时又防止在客户端看到,可有效保护代码的安全性。
在expression.jsp中添加注释,代码如程序4-3所示。重新发布Web应用后,在客户端浏览器地址栏输入http://localhost:8080/JspBasic/expression.jsp。在运行结果页面上右击,选择“查看源代码”命令来查看页面源代码,源代码如程序4-4所示,可以看到源代码中不包含<%--comment--%>类型的注释。
程序4-3:expression.jsp(添加注释后)
<%@ page language="java" pageEncoding="GB2312" %> <%@ page contentType="text/html; charset=gb2312" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>JSP表达式</title> </head> <body bgcolor="#FFFFFF"> <! -客户端可以看到的注释-> <% for(int i=1; i<=5; i++){%> <H<%=i %>>你好</H<%=i%>><BR> <%}%> <%--客户端看不到的注释--%> </body> </html>
程序4-4:expression.jsp的客户端源代码
<! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>JSP表达式</title> </head> <body bgcolor="#FFFFFF"> <! -客户端可以看到的注释-> <H1>你好</H1><BR> <H2>你好</H2><BR> <H3>你好</H3><BR> <H4>你好</H4><BR> <H5>你好</H5><BR> </body> </html>
4.3.3 声明变量、方法、类
在JSP脚本中可以声明Java变量、方法和类。
1.声明变量
格式:
<%!声明代码%>
为演示如何声明变量,向Web应用JspBasic中添加页面statement_vary.jsp。页面代码如程序4-5所示。
程序4-5:statement_vary.jsp
<%@ page language="java" pageEncoding="GB2312" %> <%@ page contentType="text/html; charset=GB2312" %> <HTML> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <head> <title>声明变量</title> </head> <BODY ><FONT size=5> <%i++; %> <P>您是第 <%=i%>个访问本站的客户。</p> <%! int i=0; %> </BODY> </HTML>
程序说明:JSP声明变量的作用域为整个页面。也就是说,在整个页面的范围内都可以访问声明的变量。因此将变量声明<%! int i=0; %>放在变量引用<%i++; %>之后,程序照样正确运行。
前面提到过,JSP页面在运行时是被编译成Servlet来运行的。在3.2节讲过,Servlet在运行期间在服务器的容器内部只有一个实例在运行,对于不同的客户端请求,产生不同的线程来响应。因此JSP页面中声明的变量,也称为组件的全局变量。对变量的任何修改都会影响到所有访问此页面的客户端。
重新发布Web应用后,在客户端浏览器地址栏输入http://localhost:8080/JspBasic/statement_vary.jsp。当第一次请求此页面时,运行结果如图4-5所示,页面提示客户端是第1个访问页面的用户。而当刷新页面或从另外一台机器请求页面时,程序运行结果如图4-6所示,页面提示客户端是第2个访问页面的用户,这是因为经过第1次请求,页面中声明的全局变量的值已经变成1而不再是0。

图4-5 第1次请求页面运行结果

图4-6 第2次请求页面运行结果
注意:%与!之间不能有空格。另外,除了4.3.1节介绍的Java表达式外,其他的Java脚本代码都必须以分号结尾。而Java表达式绝不能以分号结尾。这一点必须牢记。
2.声明方法
格式:
<%! 声明代码 %>
说明:该方法在整个JSP页面有效,但该方法内定义的变量只在该方法内有效。
下面向Web应用JspBasic中添加页面statement_Hello.jsp来演示如何在脚本中声明方法。完整代码如程序4-6所示。
程序4-6:sayHello.jsp
<%@ page language="java" %> <%@ page contentType="text/html; charset=GB2312" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>声明方法</title> </head> <body bgcolor="#FFFFFF"> <%! StringsayHello() { return "Hello"; } %> <%=sayHello()%> </body> </html>
程序说明:首先在脚本中声明一个方法sayHello()来返回一个字符串,然后调用方法来获取执行结果。
保存程序并重新发布Web应用,打开IE浏览器,在地址栏中输入http://localhost:8080/JspBasic/statement_vary.jsp,得到如图4-7所示的运行结果页面。

图4-7 方法声明页面运行结果
3.声明类
格式:
<%! 声明代码 %>
脚本中声明的类在JSP页面内有效。下面向JspBasic应用中添加页面statement_class.jsp来演示如何在脚本中声明类。完整代码如程序4-7所示。
程序4-7:statement_class.jsp
<%@ page language="java" %> <%@ page contentType="text/html; charset=GB2312" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>声明类</title> </head> <body bgcolor="#FFFFFF"> <%! public class sayHello {boolean county ; sayHello(boolean county) {this.county=county; } String Hello() { if(county) return "Hello"; else return "你好"; } } %> <% sayHello a =new sayHello(false); %> <%=a.Hello()%> </body> </html>
程序说明:首先在脚本中声明一个类sayHello,此类具有一个名称为Hello的方法,用来返回一个提示信息。在随后的代码中,生成类sayHello的实例,并且调用类的Hello方法来获取提示信息。
保存程序并重新发布Web应用,打开IE浏览器,在地址栏中输入http://localhost:8080/JspBasic/statement_class.jsp,得到如图4-8所示的运行结果页面。

图4-8 类声明页面运行结果
可以看到,在JSP脚本中变量、方法、类的声明和使用与Java语言编程完全一致。