21天学通Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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列的表格。