第3章 JSP语法
【本章专家知识导学】
JSP是建立在Java语言基础上的一种Web程序设计语言,具有自己特有的用法和指令。本章首先介绍JSP页面的程序结构,然后讲述JSP程序中经常用到基本的面向对象Java语言程序基础知识,最后讲在JSP中特有的JSP指令和JSP动作指令。
通过本章的学习,应当深入了解JSP语法,并能灵活运用JSP语法编写简单的JSP页面和其中的Java程序。
3.1 JSP程序的结构
JSP页面的文件名以“.jsp”为后缀,在一个JSP页面中,除了基本的HTML语言元素外,主要还包含三种基本元素:JSP指令、JSP动作指令和JSP代码。JSP指令用于告诉JSP的Web引擎(如Tomcat)需要在编译时做什么动作,比如引入一个其它的类,设置JSP页面使用什么语言编码等。JSP动作指令则是在JSP页面被请求时动态执行的,比如可以根据某个条件动态跳转到另外一个页面。JSP代码指的就是嵌入在JSP页面中的Java代码,即Java程序片,它通常包含JSP表达式、变量和方法的声明以及Java语句。所有HTML文件可以在浏览器中直接打开查看运行效果,但是JSP文件必须先放到Web服务器中,然后通过HTTP的方式访问。
【例3-1】一个简单的JSP程序结构示例
3-1.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head><title>
一个简单的JSP程序结构示例
</title></head>
<body>
生成并显示一个从0~9的字符串:
<%! String str="0"; %>
<% for (int i=1; i <10; i++) {
str = str + i;
}
%>
<p> <%= str %>
</p>
</body>
</html>
这个简单JSP页面的基本结构程序包含了三部分:普通的HTML标记、JSP指令和JSP代码。通过一个for语句生成并显示一个从0~9的字符串,程序的执行结果如图3-1所示。
图3-1 一个简单的JSP程序结构示的运行结果
JSP表达式包含一个符合JSP语法的表达式,JSP表达式使用的方法如下:
<%=表达式%>
其中:“<%=”和“%>”之间为JSP表达式,一对表达式标志“<%=”和“%>”中只能有一个表达式。例如:
<%="Hello World!" %>
<%= 1+1 %>
表达式中的变量需要在脚本程序中事先声明,表达式运行后的结果会被自动地转化为字符串,然后插入到这个表达式在JSP文件中的位置,显示在网页上。因为这个表达式的值自动地转化为字符串,所以能在一行文本中插入这个表达式,Web引擎遇到“<%=”符号后,就会把“<%=”和“%>”中的内容作为表达式来解析。
【专家提示】JSP表达式标志不能用一个分号“;”来作为表达式的结束符,但是同样的表达式用在Java脚本代码中就需要以分号来结尾了。
Java脚本代码(Java Scriptlet)是指在JSP页面中的“<%”和“%>”之间插入的Java程序代码。Java脚本代码使用的语法格式如下:
<% Java脚本代码%>
其中“<%”和“%>”之间为Java脚本代码。
“<%”和“%>”是Java脚本代码标志。Java脚本代码中可以包含多个JSP语句、方法、变量、表达式,它可以访问JSP对象、操作数据库、使用Java类库中的类等,利用这些可以在JSP页面内实现较复杂的逻辑功能。有了Java脚本代码,便能做以下的事:
(1)声明将要用到的变量或方法。
(2)编写JSP表达式。
(3)使用任何隐含的对象和任何用<jsp:useBean>声明过的对象。
(4)编写Java语句。
Java脚本代码由服务器负责把它转化成对应的Servlet的Service方法。当JSP服务器收到客户的请求时,Scriptlet就会被执行,如果Java脚本代码中有显示的内容(即向浏览器页面的输出),这些显示的内容就被输出到out对象流中,形成网页的动态部分。
【例3-2】JSP脚本代码示例
3-2.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<%@page language="java" %>
<html>
<head><title> JSP脚本代码示例</title>
</head>
<body>
<h3> Java Scriptlet</h3>
<%
for (int i =1;i <=5;i ++)
{
%>
<p>
i=<%= i %>
</p>
<%
}
%>
</body>
</html>
例3-2是使用循环语句在网页中显示i值(1 2 3 4 5)的JSP页面代码,其中的一个脚本代码段如:<% for (int i =1;i <=5;i ++) { %>。
它不是完整的Java代码语句,但是它和随后的其他脚本代码段一起构成完整的Java脚本代码语句。不同的脚本代码段之间可以按需要添加HTML文本。其运行结果如图3-2。
图3-2 JSP脚本代码示例运行结果
声明变量或方法的语法格式:
<%!声明变量或方法的代码%>
其中:“<%!”和“%>”之间为Java脚本程序声明的变量或方法。声明的代码不产生输出,而只声明了供访问的方法和变量,因此通常要将其和Java表达式、Java脚本程序结合使用。
声明的代码用于声明目标Servlet类的方法和变量(在处理HTTP请求的“service”方法之外)。在程序中也可以一句声明语句声明多个变量和方法,只要以“;”结尾就行。当然这些声明语句要合乎Java语法。
【专家提示】当声明方法或变量时,要注意以下的一些规则:
(1)声明必须以“;”结尾(Java脚本有同样的规则,但是表达式就不同了)。
(2)可以直接在<%@page%>语句中使用声明语句,包含已经声明了的变量和方法,不需要对它们重新声明。
(3)一个声明仅在一个页面中有效。如果想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@include%>或<jsp:include>语句包含进来。
【例3-3】Java程序片综合应用示例—一个简单的计数器
3-3.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<body>
<%!int counter=0;
synchronized void counterFunction()
{
counter++;
}
%>
<%counterFunction();%>
网站计数器<br>
您是第<%=counter%>位访问者
</body>
</html>
本例的代码是一个简单的计数器程序,它先后声明了一个计数器变量和计数的方法。计数器变量在客户间共享,直到服务器关闭;而计数方法只做简单的加1处理。Synchronized保留字表示串行化处理,即表示counterFunction()方法在某个时刻只能由一个语句调用。上述程序的其运行的结果如图3-3所示。
图3-3 Java程序片综合应用示例运行结果
Java语言标识符用来表示变量、方法或类等的名字。Java语言标识符的组成规则为:
(1)标识符必须以字母、下划线(_)或美元符($)开头,
(2)标识符第一个字符后面可以跟任意数目的字母、数字、下划线(_)或美元符($)。标识符的长度没有限制。
(3)在声明和使用标识符时需要注意,Java语言是大小写敏感的。
(4)标识符的命名应遵循Java编码惯例,并且应使标识符能从字面上反映出它所代表的变量或类型的用途,但不能是关键字。所有Java关键字都是小写的,true、false、null等都不是Java关键字;goto和const 虽然从未使用,但也作被为Java关键字保留;true、false、null虽用做专门用途,但不是Java关键字。
Java语言的关键字包括9大类:
(1)原始数据类型:byte、short、int、long、float、double、char、boolean。
(2)循环关键字:do、while、for、break、continue。
(3)分支关键字:if、else、switch、case、default、break。
(4)方法、变量和类修饰符:private、public、protected、final、static、abstract、synchronized、volatile、strictfp。
(5)异常处理:try、catch、finally、throw、throws。
(6)对象相关关键字:new、extends、implements、class、instanceof、this、super。
(7)字面值常量:false、true、null。
(8)方法相关关键字:return、void。
(9)包相关关键字:package、import。
(1)常量和变量
常量是指在程序运行过程中其值不变的量。常量有字面常量和符号常量两种。常量在表达式中用文字串表示,它区分不同类型,如整型常量123、-15,实型常量12.1f,字符常量' x ',布尔常量true,字符串类型常量"Test"。而符号常量声明的一般格式如下:
<final> <数据类型> <符号常量标识符>=<常量值>;
例如:final double PI=3.141593;
final int COUNT=1000;
变量是用来存放指定类型的数据,其值在程序运行过程中是可变的。按变量声明的位置Java的变量分为两种:类成员变量和局部变量。变量声明的一般格式如下:
<数据类型> <变量标识符>=<值>
例如 double x=1.2345;
(2)整型数据
Java整型数据多为十进制数形式,也可为八进制或十六进制形式。Java整型数都为带符号数。整型缺省为int型,若为长整型需在数据后加字母l或L。
按照长度分为:byte、short、int、long。int类型最为常用,可满足大多数场合应用的需要,如果需要更大的整数就可以使用long类型。byte类型范围很小,数据范围在-255到+255之间。short类型很少用,限制数据的存储为先高字节,后低字节,有时会引发错误,不提倡使用。
例如:byte b; short s;
int i; long l;
(3)实型数据
实型用十进制数形式表示,由数字和小数点组成,例如:3.25。也可以用科学计数法形式表示,例如,123E-3。数后加f或F为float,加d或D为double,没有后缀修饰的则缺省为double类型。
实型变量按长度分为:float和double。双精度浮点型double比单精度浮点型float的精度更高,表示数据的范围更大,详见表3-1。
例如,float c;
double d;
(4)字符型数据
字符型常量是用单引号括起来的一个字符,如:'J'、'*'。Java中的字符型数据是16位的Unicode字符,汉字和英文字母占的内存空间相同。如“JAVA你好”共12个字节。
变量的声明如下:
char ch='c';
Java中有以反斜杠()开头的字符,反斜杠将其后面的字符转变为另外的含义,称为转义字符。
表3-2 转义字符
【专家提示】字符串常量是使用双引号括起来的字符序列,注意,最后字符不是“