JSP动态WEB技术与开发实例第二章JSP语法基础.docx
《JSP动态WEB技术与开发实例第二章JSP语法基础.docx》由会员分享,可在线阅读,更多相关《JSP动态WEB技术与开发实例第二章JSP语法基础.docx(38页珍藏版)》请在冰点文库上搜索。
JSP动态WEB技术与开发实例第二章JSP语法基础
第1章JSP技术概述
第2章JSP语法基础
Java语言的语法与C语言的语法非常相似,因此学习过C语言将可以更快上手开发Java程序。
学习一种语言的语法是程序员利用这种语言进行开发的基础,JSP语法是建立在Java语言基础上的,但由于它是一种Web程序设计语言,故有自己特有的一些用法和指令。
本章内容是后续章节JSP开发的基础,所以本章所阐述的内容一定要熟练掌握,融会贯通。
本章首先讲述JSP程序的基本结构,然后讲解变量和方法的声明,以及Java程序片、各种表达式、JSP注释、指令元素、脚本元素、动作元素等内容。
学习本章之前,读者应当对HTML标记和Java语言有一定的基础。
学完本章之后,应当对JSP的基本语法有较为深刻的认识,并能灵活应用它们编写简单的JSP程序。
2.1JSP页面的基本结构
在传统的HTML代码中插入Java程序片和JSP标记后就形成了一个JSP页面文件。
所以在JSP页面中包含了两种主要内容,一种是HTML代码,这是静态内容,一种是Java程序片及其相关元素,这是动态内容。
一般来说,一个JSP页面可由5种元素组合而成:
•普通的HTML代码。
•JSP标记,如指令标记、动作标记。
•变量和方法的声明。
•Java程序片。
•Java表达式。
前面一章的内容说过,JSP页面执行的过程是:
JSP页面被第一次请求执行时,服务器上的JSP引擎先将JSP页面文件转译成一个Java文件,即Servlet。
服务器将前面转译成的Java文件编译成字节码文件,再执行这个字节码文件来响应客户请求。
当这个JSP页面再次被请求时,将直接执行编译生成的字节码文件来响应。
下面的example2-1.jsp页面包含了上述的5种元素。
例:
2-1包含5种元素的JSP页面。
example2-1.jsp
<%@pagecontentType="text/html;charset=GB2312"%>
--jsp指令标记-->
<%@pageimport="java.util.*"%>
--jsp指令标记-->
<%!
Datedate;//声明对象
intsum=0;
publicintgetSum(intn){//声明方法
sum=0;
for(inti=1;i<=n;i++){
sum+=i;
}
returnsum;
}
%>
--HTML标记-->
<%date=newDate();//Java程序片
out.println("
当前的系统时间是:
"+date);
%>
<%out.println("
当前的系统时间是:
"+date);%>
<%=getSum(100)%>
--Java表达式-->
上面的例子包含了一般JSP页面的5种元素,页面的运行结果如图2-1所示:
图2-1包含5种元素的JSP页面运行结果
2.2数据类型
2.2.1数据类型概述
Java中的数据类型分为两种:
简单类型和引用类型。
基本类型包括整型、实型、布尔型、字符型等,是系统内置的数据类型。
引用类型由基本类型组合而成,如类、接口、数组等。
Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
把这种类型一般称为引用类型。
Java的数据类型如表2-1所示:
表2-1Java的数据类型
数据
类型
详细数据类型
占用字
节宽度
范围
默认值
简单
类型
字节型byte
1字节
-128-127
0
短整型short
2字节
-32768-32768
0
整型int
4字节
-2147483648-2147483648
0
长整型long
8字节
-9233372036854477808
~9233372036854477808
0
单精度型float
4字节
-3.40292347E+38~3.40292347E+38
0.0f
双精度型double
8字节
64-1.79769313486231570E+308
~1.79769313486231570E+308
0.0d
布尔型boolean
1字节
true/false
false
字符型char
2字节
‘\u0000~u\ffff’
‘\u0000’
引用
类型
类class
接口Interface
数组
上表中,short类型已很少使用,这种类型的数据限制了存储时先高字节后低字节,致使在有的机器中可能会出错。
由上表可以看出,Java的所有数据类型长度都是固定的,与平台无关。
注意:
在Java中字符串不是作为数组来处理的,它是一种对象,用类String或StringBuffer可以定义一个字符串对象。
2.2.2标识符
标识符用来标识变量、类、方法、对象、接口和包,Java中标识符的名称必须符合以下规则:
必须以字母或下划线(_)或美元符($)开头;
标识符中除了首字符以外的其它字符可以是字母、数字、下划线、美元符组成,其中不能有空格和连字符(-);
标识符不能是关键字;
Java对标识符是大小写敏感的。
Java中使用的是Unicode国际标准字符集,最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符。
显然,这样要表示各种语言中所有的字符是远远不够的。
Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符。
Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。
下面列出Java的关键字。
abstractbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseenumextendsfinalfinallyfloatforgotoifimplementsimportinstanceofintinterfacelongnativenewpackageprivateprotectedpublicreturnstrictfpshortstaticsuperswitchsynchronizedthisthrowthrowstransienttryvoidvolatilewhile
true和false分别表示表示真和假的布尔值,还有表示空值的null,这三个不是关键字,但也不能作为标识符来使用。
2.2.3简单数据类型
1.整型数据
int:
int为整数类型,在存储的时候,用4个字节存储,范围为-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0。
short:
short也属于整数类型,在存储的时候,用2个字节存储,范围为-32,768到32,767,在变量初始化的时候,short类型的默认值为0,一般情况下,因为Java本身转型的原因,可以直接写为0。
long:
long也属于整数类型,在存储的时候,用8个字节存储,范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807,在变量初始化的时候,long类型的默认值为0L或0l,也可直接写为0。
byte:
byte同样属于整数类型,在存储的时候,用1个字节来存储,范围为-128到127,在变量初始化的时候,byte类型的默认值也为0。
2.实型数据
float:
float属于实数类型,在存储的时候,用4个字节来存储,范围为32位IEEEE754单精度范围,在变量初始化的时候,float的默认值为0.0f或0.0F,在初始化的时候可以写0.0。
double:
double同样属于实数类型,在存储的时候,用8个字节来存储,范围为64位IEEE754双精度范围,在变量初始化的时候,double的默认值为0.0。
3.字符型数据
char:
char属于字符类型,在存储的时候用2个字节来存储,因为Java本身的字符集不是用ASCII码来进行存储,是使用的16位Unicode字符集,它的字符范围即是Unicode的字符范围,在变量初始化的时候,char类型的默认值为'u0000'。
4.布尔型数据
boolean:
boolean属于布尔类型,在存储的时候不使用字节,仅仅使用1位来存储,范围仅仅为0和1,其字面量为true和false,而boolean变量在初始化的时候变量的默认值为false。
下面给出一个基本数据类型综合应用的实例。
例2-2数据类型示例。
example2-2.jsp
<%@pagecontentType="text/html;charset=gb2312"%>
--JSP指令标签-->
<%@pageimport="java.util.*"%>
--JSP指令标签-->
<%//以下为Java程序片
booleanbooleanTemp=true;
bytebyteTemp=70;
charcharTemp='b';
intintTemp=329;
shortshortTemp=125;
longlongTemp=1234567;
floatfloatTemp=7.234F;
doubledoubleTemp=1.53E-6;
out.println("
"+"基本数据类型综合应用实例"+"
");
out.println("布尔变量booleanTemp值为:
"+booleanTemp+"
");
out.println("字符型变量charTemp值为:
"+charTemp+"
");
out.println("整型变量intTemp值为:
"+intTemp+"
");
out.println("短整型变量shortTemp值为:
"+shortTemp+"
");
out.println("字节型变量byteTemp值为:
"+byteTemp+"
");
out.println("长整型变量longTemp值为:
"+longTemp+"
");
out.println("单精度型变量floatTemp值为:
"+floatTemp+"
");
out.println("双精度型变量doubleTemp值为:
"+doubleTemp+"
");
%>
--HTML标记符-->
程序的运行结果如图2-2所示:
图2-2基本数据类型应用实例运行结果
2.2.4Java中简单数据类型的转型
Java中的简单数据类型的转换分为两种:
自动转换和强制转换。
1.自动转换
当一个较“小”的数据和较“大”的数据一起运算的时候,系统将自动将较“小”的数据转换为较“大”的数据,再进行运算。
在方法调用过程,如果实际参数较“小”,而函数的形参比较“大”的时候,除非有匹配的方法,否则会直接使用较“大”的形参函数进行调用。
2.强制转换
将“大”数据转换为“小”数据时,可以使用强制类型转换,在强制类型转换的时候必须使用下边这种语句:
inta=(int)3.14;
只是在上边这种类型转换的时候,有可能会出现精度损失。
关于类型的自动提升,遵循下边的规则:
•所有的byte、short、char类型的值将提升为int类型;
•如果有一个操作数是long类型,计算结果是long类型;
•如果有一个操作数是float类型,计算结果是float类型;
•如果有一个操作数是double类型,计算结果是double类型;
自动类型转换图如下:
byte->short(char)->int->long->float->double
如果是强制转换的时候,就将上边的图反过来。
3.转换附加
当两个类型进行自动转换的时候,需要满足条件:
(1)这两种类型是兼容的,
(2)目的类型的数值范围应该比源转换值的范围要大。
而拓展范围就遵循上边的自动类型转换树,当这两个条件都满足的时候,拓展转换才会发生,而对于几个原始类型转换过程,根据兼容性boolean和char应该是独立的,而其他六种类型是可以兼容的,在强制转换过程,唯独可能特殊的是char和int是可以转换的,不过会使用char的ASCII码值比如:
inta=(int)'a';
a的值在转换过后输出的话,值为97。
2.2.5简单类的包装类
在Java中,可以直接把简单数据类型的变量表示为一个类。
对应简单数据类型共有6个包装类,分别是Boolean、Character、Short、Integer、Long、Float、Double。
为什么要使用封装类呢?
以int和Integer为例来说,虽然从本质上它们都代表一个32位的整数,但它们却是不同的数据类型。
事实上,Java中直接使用的整数都为int(就int和Integer而言),只有当数据必须作为对象的身份出现时,才必须用int对应的封装器Integer将整数值封装成对象。
例如:
为给java.util包中的Vector添加一个整数,就必须如下将该整数值封装在一个Integer实例中:
Vector v=newVector();
intk=121;
v.addElemt(newInteger(k));
另外,Integer作为int对应的封装器类,提供了许多的方法,比如:
Integer的构造方法、Integer向其它各种数值类型的转换方法等等,而这些是int类型数据所没有的。
2.2.6类
类是一种复杂的数据类型。
Java是一种面向对象的程序设计语言。
该语言的核心是支持类技术。
一个类定义了一组对象。
类具有行为(behavoir),它描述一个对象能够做什么以及做的方法(method),它们是可以对这个对象进行操作的程序和过程。
1.类基础知识
类(Class)实际上是对某种类型的对象定义变量和方法的原型。
它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。
类是对某个对象的定义。
它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。
实际上它本身并不是对象,因为它不存在于内存中。
当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。
虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
类通过接口与外界发生关系。
可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图,但在内存中并不存在。
从这个蓝图可以创建任何数量的对象。
从类创建的所有对象都有相同的成员:
属性、方法和事件。
但是,每个对象都象一个独立的实体一样动作。
例如,一个对象的属性可以设置成与同类型的其他对象不同的值。
2.类定义的一般形式
className{
public:
类的公有接口
private:
私有的成员函数
私有的数据成员定义
};
类的定义由类头和类体两部分组成。
类头由关键字Class开头,然后是类名,其命名规则与一般标识符的命名规则一致。
类体包括所有的细节,并放在一对花括号中。
类的定义也是一个语句,所以要有分号结尾,否则会产生编译错误。
类体定义类的成员,它支持两种类型的成员:
(1)数据成员,它们指定了该类对象的内部表示。
(2)成员函数,他们指定了该类的操作。
类成员有3种不同的访问权限:
(1)公有(public)成员可以在类外访问。
(2)私有(private)成员只能被该类的成员函数访问。
(3)保护(protected)成员只能被该类的成员函数或派生类的成员函数访问。
数据成员通常是私有的,成员函数通常有一部分是公有的,一部分是私有的。
公有的函数可以在类外被访问,也称之为类的接口。
可以为各个数据成员和成员函数指定合适的访问权限。
2.3变量和方法的声明
2.3.1声明变量
在JSP页面中的“<%!
”和“%>”标记之间声明变量和方法。
JSP中的声明可以用来定义一个或多个合法的变量(包括普通变量和类变量)和方法,并不输出任何的文本到输出流去。
在声明元素中声明的变量和方法将在JSP页面初始化时被初始化。
JSP声明的语法格式为:
<%!
declaration;[declaration;]...%>
其中declaration为声明的变量、方法的名称和内容。
在声明变量变量和方法时,需要注意以下几点:
•声明必须以";"结尾。
•可以直接使用在<%@page%>中被包含进来的已经声明的变量和方法,不需要对它们重新进行声明。
•一个声明仅在一个页面中有效。
如果想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@include%>或include>元素包含进来。
将“<%!
”和“%>”之间声明的变量称为JSP的成员变量。
例如:
<%!
inti=10,j=20,k;
Strings=”hello”,sname=”simon”;
Datedate=newDate();
%>
“<%!
”和“%>”之间声明的变量在整个JSP页面都有效,与“<%!
”和“%>”标记所在的位置无关,但通常将标记符“<%!
”和“%>”写在Java程序片的前面。
JSP引擎将JSP页面转译成Java文件时,将“<%!
”和“%>”之间声明的变量作为类的成员变量,这些变量的内存空间直到服务器关闭时才被释放。
当多个用户请求同一个JSP页面时,JSP将会为每个用户启动一个线程,这些线程由JSP引擎服务器来管理。
这些线程共享JSP页面的成员变量,因此任何一个用户对JSP页面成员变量操作的结果,都会影响其他用户。
例2-3JSP页面成员变量示例。
example2-3.jsp
<%@pagecontentType="text/html;charset=GB2312"%>
简易网站计数器<%!
inti=0;//声明变量i;
%>
<%i++;
%>
欢迎光临本站,您是本站第
<%=i%>
位访客。
程序的运行结果如下:
图2-3计数器程序
可以尝试多刷新几次页面来查看程序的运行结果,或者在局域网中,通过别的计算机来访问该页面,观察页面中计数器的变化。
假如存放该页面的计算机的IP地址为:
192.168.0.35,页面保存在root目录下,则其它计算机访问该页面的链接为:
http:
//192.168.0.35/example2-3.jsp。
注意:
页面中所定义的成员变量的有效范围与标记符“<%!
”和“%>”所在的位置无关,因此上面例子中声明变量的代码:
<%!
inti=0;//声明变量i;
%>
也可以放在程序片代码的后面,效果是一样的。
2.3.2声明方法
和声明变量一样,在标记符“<%!
”和“%>”之间也可以声明方法,声明的方法也在整个JSP页面有效(与标记符“<%!
”和“%>”所在的位置无关),但是该方法内定义的变量只在该方法内部有效。
声明的方法可以在页面中的Java程序片中调用。
当方法被调用时,方法内定义的变量被分配内存,调用完毕后即可释放所占的内存单元。
下面通过一个例子来演示JSP页面中如何来声明和调用方法。
例2-4方法声明示例。
example2-4.jsp
<%@pagecontentType="text/html;charset=GB2312"%>
<%!
intlength,width,height;//声明三个变量分别表示一个长方体的长、宽、高;
intgetAllArea(intl,intw,inth){//声明计算长方体表面积的方法;
return2*(l*w+l*h+w*h);
}
intgetVolumn(intl,intw,inth){//声明计算长方体体积的方法;
returnl*w*h;
}
%>
<%length=10;
width=20;
height=30;
out.println("指定的长方体的表面积为:
"+getAllArea(length,width,height));
out.println("
指定的长方体的体积为:
"+getVolumn(length,width,height));
%>
程序的运行结果如图2-4:
图2-4方法声明示例
在上述例子中,在标记符“<%!
”和“%>”之间声明了两个方法分别用于计算一个长方体的表面积和体积,而在后面的标记符“<%”和“%>”之间的程序片中,调用了这两个方法来计算指定的长方体的表面积和体积。
2.4Java程序片
在JSP,在标记符“<%”和“%>”之间书写的程序代码称为Java程序片,其实前面的例子中已多次用到过。
一般来说,使用java程序片实现逻辑计算。
Java程序片有三种形式:
实体定义、表达式和java代码块。
使用实体前,首先要定义实体。
下面是java程序片的定义和使用的语法格式。
2.4.1实体定义
实体定义包括:
变量定义、方法定义、类定义。
1.变量定义
可以在“<%!
”和“%>”标记符之间定义变量,在这种标记符之间定义的变量,通过JSP引擎转译为java文件时,成为某个类的成员变量,即全局变量。
变量的类型可以是java语言允许的任何数据类型。
这些变量在所定义的JSP页面内有效,即在本JSP页面中,任何java程序片中都可以使用这些变量。
<%!
intx=10,y,z;
Stringstr=”我是个学生”;
Datedate;
%>
在”<%!
”和”%>”标记符之间定义了5个变量,这5个变量都是全局变量。
也就是说在整个JSP页面都有效。
2.方法定义
在”<%!
”和”%>”标记符之间定义方法。
这些方法在所定义的JSP页面内有效,即在本JSP页面内,任何java程序片都可以调用这些方法。
例如,定义一个方法,求n!
。
<%!
longjicheng(intn)
{
longzhi=1;
for(inti=1;i<=n;i++)zhi=zhi*i;
returnzhi;
}
%>
3.类定义
在”<%!
”和”%>”标记符之间定义类。
这些类在所定义的JSP页面内有效,即在本JSP页面内,任何java程序片都可以使用这些类创建对