
3.1 JSP脚本元素
3.1.1 JSP脚本元素概念及组成
JSP脚本元素概念及组成
在JSP中嵌入的服务端(即Web后端)运行的小程序,称为脚本。而JSP支持的服务端脚本语言为Java,所以这些脚本其实就是Java程序。这些脚本程序可以是变量的声明、方法的声明、完成指定功能的代码块以及方法的调用等,除了类声明之外的所有形式的Java代码都可以作为脚本程序嵌入在JSP页面中,从而完成业务逻辑(用户登录验证、用户信息的增删改查等)、后台数据库操作(创建数据库连接、执行SQL等)等相关服务端(即Web后端)的功能。
其实,JSP脚本元素就是嵌入在JSP页面中的Java程序,这些Java程序将出现在由当前JSP页面生成的Servlet中。按照不同的嵌入方式和不同的作用,脚本元素可分为3种:表达式、Scriptlet、声明,如图3-1所示。

图3-1 脚本元素组成
3.1.2 表达式
表达式
1.表达式的作用
表达式是计算Java表达式的值,得到的结果转换成字符串,并在JSP页面中表达式所在位置进行显示。Java表达式是指由操作数和运算符组成的,且符合Java语法规则的公式。其中,操作数可以是变量、常量、方法等,运算符包括算术运算符、逻辑运算符、比较运算符、移位运算符等。此部分知识点的详细介绍可以参见 Java编程语言相关教程资料。
表达式的计算在运行时进行(即JSP页面被请求时),因此在表达式中可以访问与请求有关的全部信息,其中,请求相关的信息都封装在request隐式对象中。
2.表达式的语法格式
<%=Java表达式 %>
具体说明如下。
“<%=”和“%>”是一个完整的符号,符号中间不可有空格。
不可以插入语句。
表达式必须能求值。
3.实例:JSP表达式应用
在JSP页面中嵌入5个JSP表达式,分别如下。
计算两个整数常量累加的值并在页面进行显示。
比较两个整数常量的大小并将结果在页面进行显示。
获取的值,并在页面进行显示。
获取−0.23的绝对值,并在页面进行显示。
从请求中获取用户名信息,并在页面进行显示。
具体源代码如下所示(代码详见\jspdemopro\WebRoot\ch3\scriptDemo01.jsp)。
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scriptDemo01.jsp' starting page</title></head>
<body>
<h1>JSP表达式的案例演示</h1>
<%=3+3 %><br>
<%=3>4 %><br>
<%=Math.PI %><br>
<%=Math.abs(-0.23) %>
<%=request.getParameter(“userName”)%>
</body>
</html>
页面运行后(在浏览器中输入请求url为:http://localhost:8080/jspdemopro/ch3/scriptDemo01.jsp? userName=zhangsan),显示结果如图3-2所示。

图3-2 JSP表达式案例运行结果
3.1.3 Scriptlet
Scriptlet
1.Scriptlet的作用
Scriptlet就是在JSP页面中嵌入一段有效的Java程序段,此程序段可以是变量的声明、方法的调用。例如,根据从客户端传递过来的用户名和密码信息判断该用户的合法性,从数据库获取用户信息,再传递到客户端进行展示输出等这些业务逻辑功能,均可以通过Java程序段(也称脚本代码段)实现。
2.Scriptlet的语法格式
<%Java代码 %>
具体说明如下。
“<%”和“%>”是一个完整的符号,符号中间不可有空格。
<% %>中除了不能定义类和方法、不能用import引入类外,可以包含任何有效的Java代码、可以定义变量、调用方法和进行各种表达式运算。
在Scriptlet中定义的变量在当前的整个页面内都有效,但不会被其他的线程共享。
3.实例:JSP Scriptlet应用
(1)实例一:在JSP页面中,以直角三角形的形式显示数字(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo02.jsp)。
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scriptDemo02.jsp' starting page</title>
</head>
<body>
<h1>以直角三角形的形式显示数字</h1>
<%
for(int i=1;i<10;i++) {
for(int j=1;j<=i;j++) {
%>
<%=j%>
<%
}
%>
<%="</br>" %>
<%
}
%>
</body>
</html>
页面运行后的结果如图3-3所示。

图3-3 数字直角三角形案例运行结果
(2)实例二:在 JSP 页面中显示当前系统时间和变量 name 的值(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo02.jsp)。
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scriptDemo02.jsp' starting page</title>
</head>
<body>
<h1>显示当前系统时间和变量name的值</h1>
<%
Date now = new Date();
%>
<%=now.toLocaleString() %>
<%
String name = "tony";
%>
<%=name %>
</body>
</html>
页面运行后的结果如图3-4所示。

图3-4 当前系统时间显示案例运行结果
4.综合实例
利用 JSP 完成登录功能。当用户单击“登录”按钮时,校验程序需要对用户名和密码进行检验(假设用户名和密码分别为zhangsan和123时合法,否则不合法),校验通过则显示“登录成功+用户名”,否则显示“登录失败+用户名”。登录界面如图3-5所示。
登录处理概要图如图3-6所示。
源代码如下。
login.jsp(省略,详见源代码包)。

图3-5 登录界面

图3-6 登录处理概要图
loginAction.jsp部分代码如下。
<body>
<%
String staffId = request.getParameter("staffId");
String password = request.getParameter("password");
If("zhangsan".equals(staffId)&& "123".equals(password)){
%>
<%="登录成功!"%>
<%
}else{
%>
<%="登录失败!"%>
<%
}
%>
<%=staffId%>
</body>
案例总结如下。
使用JSP Scriptlet完成业务逻辑处理(用户名的校验)。
使用JSP 表达式获取用户名信息,并在页面展示输出。
3.1.4 声明
声明
1.声明的作用
声明就是在JSP页面中声明Java方法或变量等,用于定义JSP代表的Servlet类的成员变量和方法。
2.JSP声明的语法格式
<%! Java代码 %>
具体说明如下。
“<%!”和“%>”是一个完整的符号,符号中间不可有空格。
声明的语法与在Java语言中声明变量和方法是一样的。
在页面中声明的变量和方法,在整个页面内都有效,它们将成为JSP页面转换为Servlet类后的属性和方法,而且它们会被多个线程所共享。
3.实例:JSP声明应用
(1)实例一:声明一个变量,变量名为numTimes,为该变量赋值为3;声明一个方法,方法名为sayHello。
在页面中利用JSP表达式显示变量numTimes的值,调用sayHello方法,并显示方法的返回值信息(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo03_1.jsp)。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scriptDemo03_1.jsp' starting page</title>
</head>
<%!
int numTimes = 3;
public String sayHello(String name){
return "Hello, " + name + "!";
}
%>
<body>
<%=numTimes %><br>
<%= sayHello("Tony") %>
</body>
</html>
页面运行后的结果如图3-7所示。

图3-7 JSP声明实例一的运行结果
(2)实例二:JSP 声明和JSP Scriptlet区别。
用不同的方式定义两个变量,分别为count1和count2,通过JSP 表达式在页面上显示输出count1和count2自加的值,多次刷新该JSP页面,观察count1和count2值的变化,并思考原因(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo03_2.jsp)。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scriptDemo03_2.jsp' starting page</title>
</head>
<body>
<%!
int count1 = 1;
%>
<%
int count2 = 1;
%>
count1==<%=count1++%><br>
count2==<%=count2++%>
</body>
</html>
根据页面显示效果得知count1的值,每次刷新进行累加,而count2的值始终为1。原因是count1是Java类的成员变量,被多个线程所共享;count2是方法的局部变量,不能被线程共享。
(3)实例三:JSP声明、JSP Scriptlet和JSP声明综合应用(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo04.jsp)。
某系统计算的金额中有两种形式:一种是带有两位小数的,另一种是整数。现在要求在 JSP 页面将不带小数的金额转换为带两位小数的金额。
实现步骤如下。
利用JSP声明,声明一个方法,将整数转换为两位小数。
利用JSP Scriptlet 调用声明的方法,转换金额。
在JSP页面利用表达式将转换后的金额显示出来。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scriptDemo04.jsp' starting page</title>
</head>
<body>
<%!
//声明一个常量
final String SEPARATOR =".";
//声明一个方法
public String covertAmountWithSeparator(String money){
int index = money.indexOf(SEPARATOR);
String str =money;
if(index==-1)
str = money+".00";
return str;
}
%>
<%
String m1 = covertAmountWithSeparator("12");
String m2 = covertAmountWithSeparator("34.00");
%>
<%=m1%><br>
<%=m2 %><br>
<%=SEPARATOR%>
</body>
</html>
页面运行后的结果如图3-8所示。

图3-8 金额转换实例运行结果