第2章 JSP的基础语法
本章将详细介绍什么是JSP,JSP具有哪些特点,还将介绍JSP的运行机制及脚本元素。通过本章的学习,读者应该能够完成如下几个目标。
· 了解JSP的基本特点。
· 理解JSP的运行机制。
· 熟练使用JSP声明语句。
· 熟练使用JSP Scriptlets。
· 熟练使用JSP表达式。
2.1 JSP简介
JSP是Java Server Pages的缩写,是由Sun公司于1999年6月推出的技术,通过在传统的HTML中插入JSP脚本代码从而构成JSP页面。JSP是基于Java Servlet及整个Java体系的Web开发技术,可以利用这一技术来构建安全的、跨平台的动态Web站点。JPS目前在不断进行更新和优化。
如果读者对微软的ASP技术比较熟悉,应该知道ASP的编程语言是VBScript和JavaScript,而JSP使用的是Java。与ASP相比,JSP在许多方面有了大大的改进,具有动态页面与静态页面相分离,并摆脱系统平台束缚的特点。JSP是通过编译后执行的,完全克服了ASP的脚本级解释执行的缺点,目前已成为Web开发的主流选择。
JSP具有如下主要特点。
1.程序逻辑和显示分离
使用JSP技术可以把界面的开发与程序逻辑的开发分离开。Web开发人员使用HTML或XML 标记来设计界面,使用JSP 标记或脚本生成页面上的动态内容。动态内容的逻辑被封装在标记和JavaBeans组件中,并被捆绑在脚本中,所有的脚本在服务器端运行。
JSP技术使得开发人员的分工更加明确,页面设计者可以修改内容而不影响逻辑,应用程序的开发者可以修改逻辑而不影响内容。
2.可重用组件
绝大多数JSP页面依赖于可重用的、跨平台的组件(JavaBeans或Enterprise JavaBean)来执行应用程序要求的复杂处理。开发人员可以共享和交换组件,或把这些组件提供给更多的用户使用。基于组件的开发方法有效地提高了应用程序的开发效率,加速了项目的总体开发进程。
3.使用标签简化页面开发
JSP技术封装了许多功能,这些功能是生成与JSP相关的HTML或XML的动态内容时所需要的。标准的JSP 标记能够访问和实例化 JavaBeans 组件,设置或检索组件的属性,下载Applet,以及执行使用其他方法难以实现的功能。
JSP标记具有可扩充性,允许开发者扩展JSP标记,开发人员能够定制常用功能标记库。第三方或其他开发人员也可以创建自己的标记库。由于页面制作者可以使用标记库中的功能,因此大大减少了对脚本语言的依赖,并降低了页面制作的复杂度。
4.具有Java的特点
由于JSP页面的内置脚本是基于Java语言的,而且所有的JSP页面都被编译成Servlet,所以JSP具有Java的特点,如健壮的存储管理、安全性、跨平台特性、“一次编写,各处运行”等特点。
2.2 JSP运行机制
学习JSP最重要的就是要了解其运行机制。只有这样才能真正学好JSP。在了解JSP运行机制之前,首先来看一个简单的JSP示例。
【范例2-1】一个简单的JSP程序,如示例代码2-1所示。
示例代码2-1 HelloJSP.jsp
01 <html> 02 <head> 03 <title>HelloJSP</title> 04 </head> 05 <body> 06 <% 07 out.println("Hello JSP!"); //在网页上打印输出“Hello JSP! ”语句 08 %> 09 </body> 10 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/HelloJSP.jsp,打开页面如图2-1所示。
图2-1 HelloJSP.jsp执行结果
【代码解析】该示例代码中通过 out.println()实现网页的输出目的是为了与转义后的Servlet文件相比较。
运行完成该JSP页面后,打开Tomcat安装目录下的Work文件夹。在该目录中可以找到与该JSP文件相对应的Java文件,以及编译后的Class文件。下面列出了部分Java代码。
01 out.write("<html>\r\n"); 02 out.write("<head>\r\n"); 03 out.write("<title>HelloJSP</title>\r\n"); 04 out.write("</head>\r\n"); 05 out.write("<body>\r\n"); 06 out.write("\t"); 07 out.println("Hello JSP!"); 08 out.write("\r\n"); 09 out.write("</body>\r\n"); 10 out.write("</html>\r\n");
使用IE浏览器打开该JSP页面,选择查看页面源代码,代码如下所示。
01 <html> 02 <head> 03 <title>HelloJSP</title> 04 </head> 05 <body> 06 Hello JSP! 07 </body> 08 </html>
可以把JSP页面的执行分成两个阶段,一个是转译阶段,一个是请求阶段。
转译阶段:JSP页面转换成Servlet类。
请求阶段:Servlet类执行,将响应结果发送至客户端。
下面来看JSP的执行流程示意图,如图2-2所示。
图2-2 JSP执行流程图
该执行流程解释如下。
(1)用户(客户机)访问相应的JSP页面,如http://localhost:8080/Prj_test/ch02/HelloJSP. jsp。
(2)服务器找到相应的JSP页面。
(3)服务器将JSP转译成Servlet的源代码。
(4)服务器将Servlet源代码编译为class文件。
(5)服务器将class文件加载到内存并执行。
(6)服务器将class文件执行后生成的HTML代码发送给客户机,客户机浏览器根据相应的HTML代码进行显示。
如果该JSP页面为第一次执行,那么会经过这两个阶段,而如果不是第一次执行,那么将只会执行请求阶段。这也是为什么第二次执行JSP页面时明显比第一次执行要快的原因。
如果修改了JSP页面,那么服务器将发现该修改,并重新执行转译阶段和请求阶段。这也是为什么修改页面后访问速度变慢的原因。
2.3 JSP脚本元素
JSP脚本元素包含JSP声明语句、JSP Scriptlets、JSP表达式。本节详细介绍JSP脚本元素的语法格式及使用方法。
2.3.1 JSP声明语句
JSP声明语句以<%!开始,以%>结束,其语法格式为:<%! 声明语句 %>
使用声明语句声明的变量为全局变量,也就是说,当有多个用户在执行此JSP页面时,将共享该变量。
【范例2-2】示例代码2-2是一个简单的JSP声明语句示例。
示例代码2-2 DeclarationsDemo.jsp
01 <html> 02 <head> 03 <title>DeclarationsDemo</title> 04 </head> 05 <body> 06 <%! int a = 1; %> 07 <% 08 out.println("a = " + a); //打印输出a的变量值 09 a++; //变量a进行递加 10 %> 11 </body> 12 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/DeclarationsDemo.jsp,打开页面如图2-3所示。
图2-3 DeclarationsDemo.jsp执行结果
重新打开IE浏览器,在浏览器地址中再次输入http://localhost:8080/Prj_test/ch02/DeclarationsDemo.jsp,打开页面如图2-4所示。
图2-4 DeclarationsDemo.jsp的再次运行效果
【代码解析】该示例代码第06行通过“<%! int a = 1;%>”声明一个全局变量a,在第08行中使用“out.println("a = " + a);”输出a的变量值,在第09行通过“a++”进行自动递增。因为变量a为全局变量,所以这时如果有多个用户执行该JSP,将会共享该变量。
2.3.2 JSP Scriptlets
JSP Scriptlets以<%开始,以%>结束,其中包含有效的符合Java语法规则的Java代码,其语法格式为:<% Java代码%>。在JSP Scriptlets中可以包含多个语句,如:方法、变量、表达式等。
【范例2-3】示例代码2-3是一个简单的JSP Scriptlets示例。
示例代码2-3 JavaScriptletsDemo.jsp
01 <html> 02 <head> 03 <title>JavaScriptletsDemo</title> 04 </head> 05 <body> 06 <% 07 String str = "Java Scriptlets Demo"; //声明字符串str 08 out.println(str); //输出字符串str 09 %> 10 </body> 11 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/JavaScriptletsDemo.jsp,打开页面如图2-5所示。
图2-5 JavaScriptletsDemo.jsp运行效果
【代码解析】示例代码声明了一个字符串str,其值为“Java Scriptlets Demo”,通过out.println()方法在网页上输出该字符串的值。
2.3.3 JSP表达式
JSP表达式以<%=开始,以%>结束,其语法格式为:<%= Java代码%>。JSP表达式中的代码会首先执行,然后转换成字符串并显示到网页上。
【范例2-4】示例代码2-4是一个简单的JSP Scriptlets示例。
示例代码2-4 DeclarationsDemo.jsp
01 <html> 02 <head> 03 <title>DeclarationsDemo</title> 04 </head> 05 <body> 06 <% 07 String str = "Hello"; //声明字符串str 08 %> 09 <%= str%> 10 </body> 11 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/DeclarationsDemo.jsp,打开页面如图2-6所示。
图2-6 DeclarationsDemo.jsp运行效果
【代码解析】该示例代码中声明了一个字符串str,其值为“Hello”,并且通过使用表达式“<%= str%>”在网页上输出该字符串的值。
注意:JSP表达式标签不必也不能使用分号作为表达式结束的标记。
2.4 注释
JSP的注释分为两类,一类为可以在客户端显示的注释,即HTML注释;一类是不能在客户端显示的注释,即JSP注释。
HTML注释使用<!--开始,以-->结束,中间包含的代码即为注释部分。
【范例2-5】示例代码2-5是一个简单的HTML注释示例。
示例代码2-5 CommentsDemo.jsp
01 <html> 02 <head> 03 <title>CommentsDemo</title> 04 </head> 05 <body> 06 <!-- 声明变量a --> 07 <%! int a = 1; %> 08 <!-- 在网页上打印出变量a的值 --> 09 <% 10 out.println("a = " + a); 11 %> 12 </body> 13 </html>
注意:如果使用MyEclipse编写该JSP,会无法保存该文件,这时需要在文件的第一行添加<%@ page pageEncoding="gb2312"%>代码,用来指定JSP文件编码。
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/CommentsDemo.jsp。查看页面源代码如下所示。
01 <html> 02 <head> 03 <title> CommentsDemo </title> 04 </head> 05 <body> 06 <!-- 声明变量a --> 07 <!-- 在网页上打印出变量a的值 --> 08 a = 1 09 </body> 10 </html>
JSP注释使用<%--开始,以--%>结束,中间包含的代码即为注释部分。
【范例2-6】示例代码2-6是一个简单的JSP注释示例。
示例代码2-6 CommentsDemo2.jsp
01 <html> 02 <head> 03 <title>CommentsDemo2</title> 04 </head> 05 <body> 06 <%-- 声明变量a --%> 07 <%! int a = 1; %> 08 <%-- 在网页上打印出变量a的值 --%> 09 <% 10 out.println("a = " + a); 11 %> 12 </body> 13 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/CommentsDemo2.jsp。查看页面源代码如下所示。
01 <html> 02 <head> 03 <title>CommentsDemo2</title> 04 </head> 05 <body> 06 a = 1 07 </body> 08 </html>
同样还可以在JSP脚本元素中使用Java注释,如Java单行注释“//”,该注释同样不会在HTML源代码中显示。
【范例2-7】示例代码2-7是一个简单的HTML注释示例。
示例代码2-7 CommentsDemo3.jsp
01 <html> 02 <head> 03 <title>CommentsDemo3</title> 04 </head> 05 <body> 06 <%! int a = 1; //声明变量a%> 07 <% 08 out.println("a = " + a); //在网页上打印出变量a的值 09 %> 10 </body> 11 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch02/CommentsDemo3.jsp。查看页面源代码如下所示。
01 <html> 02 <head> 03 <title>CommentsDemo2</title> 04 </head> 05 <body> 06 a = 1 07 </body> 08 </html>
2.5 综合练习
1.声明变量a、b、c,对a和b进行运算,并将运算结果值赋予c,最后在网页上输出变量c的值。
01 <html> 02 <head> 03 <title>Practice</title> 04 </head> 05 <body> 06 <%-- 声明变量a,b,c --%> 07 <% 08 int a = 2; //声明变量a,其值为2 09 int b = 1; //声明变量b,其值为1 10 int c = 0; //声明变量c,其值为0 11 %> 12 <%--对a,b进行运算,并将值赋值给c --%> 13 <% 14 c = a + b; //对a和b进行加法运行,并将值赋值给c 15 out.println(a + " + " + b + " = " + c + "<br>"); 16 c = a - b; //对a和b进行减法运行,并将值赋值给c 17 out.println(a + " - " + b + " = " + c + "<br>"); 18 c = a * b; //对a和b进行乘法运行,并将值赋值给c 19 out.println(a + " * " + b + " = " + c + "<br>"); 20 c = a /b; //对a和b进行除法运行,并将值赋值给c 21 out.println(a + " /" + b + " = " + c + "<br>"); 22 %> 23 </body> 24 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入“http://localhost:8080/Prj_test/ch02/Practice.jsp”,打开页面如图2-7所示。
图2-7 Practice.jsp运行效果
2.修改上面的示例,使用JSP表达式输出变量c的值。
01 <%@ page pageEncoding="gb2312"%> 02 <html> 03 <head> 04 <title>Practice</title> 05 </head> 06 <body> 07 <% 08 int a = 2; //声明变量a,其值为2 09 int b = 1; //声明变量b,其值为1 10 int c = 0; //声明变量c,其值为0 11 %> 12 <% 13 c = a + b; //对a,b进行加法运算,并将值赋予c 14 %> 15 <%-- 输出c的值--%> 16 <%= a + " + " + b + " = " + c + "<br>" %> 17 18 <% 19 c = a - b; //对a,b进行减法运算,并将值赋予c 20 %> 21 <%= a + " - " + b + " = " + c + "<br>" %> 22 23 <% 24 c = a * b; //对a,b进行乘法运算,并将值赋予c 25 %> 26 <%= a + " * " + b + " = " + c + "<br>" %> 27 28 <% 29 c = a /b; //对a,b进行除法运算,并将值赋予c 30 %> 31 <%= a + " /" + b + " = " + c + "<br>" %> 32 </body> 33 </html>
2.6 小结
要开始学习JSP,最重要的就是了解其运行机制,必须了解什么时候进行转译,什么时候进行请求响应。JSP脚本元素是整个JSP体系中最基础的部分,本章针对这部分进行了详细的介绍,力求让读者有个良好的开端,同样也为后面的学习打好基础。
2.7 习题
一、填空题
1.JSP是___________的缩写,是由___________公司于1999年6月推出的新技术。
2.通过在传统的HTML中,利用插入___________从而构成JSP页面。
3.JSP声明语句以___________开始,以___________结束,其语法格式为:___________。
4.JSP Scriptlets以___________开始,以___________结束,其语法格式为:___________。
5.JSP表达式通过___________开始,以___________结束,其语法格式为:___________。
6.JSP的注释分为两类,一类为___________注释;一类是___________注释。
二、选择题
1.JSP源文件的后缀名是___________。
A.java
B.jsp
C.class
D.html
2.能够用来声明全局变量的是___________。
A.<% int i = a%>
B.<!—int i = a-->
C.<%! int i = a%>
D.<%-- int i = a --%>
3.能够在网页源代码显示的注释是___________。
A.<% //这是注释 %>
B.<% /*这是注释*/%>
C.<!-- /这是注释 -->
D.<%--这是注释--%>
三、简答题
1.JSP包含哪些主要特点?简述这些主要特点。
2.JSP脚本元素包含哪几种?语法格式是什么?
3.JSP的注释分为哪几种?语法格式是什么?
四、编程题
1.编写一个JSP程序,使用JSP声明语句声明三个全局变量a、b和c,通过JSP Scriptlets来对a和b进行运算,并将运算结果值赋予c,使用JSP表达式在网页上输出变量c的值。
2.编写一个JSP程序,通过使用for循环,在网页中输出一个3行3列的表格。