第3章 JSP基础
本章目标
■ 了解JSP的概念及特点
■ 理解JSP和Servlet的区别与联系
■ 理解JSP的执行过程及原理
■ 掌握JSP页面的常用元素
■ 熟练使用JSP声明
■ 熟练使用JSP表达式
■ 熟练使用JSP脚本
学习导航
任务描述
【描述3.D.1】
编写一个JSP页面,显示服务器的当前系统时间。
【描述3.D.2】
编写一个JSP页面,定义两个整型变量并赋值,然后输出最大值。
【描述3.D.3】
编写一个JSP页面,输出10个整数及其总和。
3.1 JSP概述
JSP(Java Server Page)是由Sun公司倡导、多家公司参与编写的一种动态网页技术标准。JSP是Servlet的扩展,与Servlet一样,JSP是一种基于Java的服务器端技术,其目的是简化建立和管理动态网站的工作。在传统的HTML文件(*.html,*.htm)中插入Java程序片段(Scriptlet)和JSP标签,就构成了JSP页面,其中,JSP页面文件以“.jsp”作为扩展名。
3.1.1 JSP特点
JSP主要有如下几个特点。
■ 简单快捷
JSP在原来的HTML结构中,通过添加Java程序片段,并通过标签技术的使用从而简化了页面开发。相对于Java,JSP要简单得多,所以即使是不熟悉Java语言的开发人员也能够快速掌握JSP的使用。通过开发或扩展JSP标签库,Web页面开发人员能够使用熟悉的工具和类似于HTML标签的组件来完成工作。
■ 动态内容的生成和显示相分离
使用JSP技术,Web页面开发人员可以使用HTML或者XML来设计页面,使用JSP的标签或者小脚本来生成页面上的动态内容。所有的Java脚本都在服务器端运行,客户端得到的是JSP的最终运行结果,这就保证了任何基于HTML的Web浏览器都可以正确显示JSP页面。
■ 组件重用
绝大多数JSP页面依赖可重用的JavaBean组件来执行复杂的业务处理,这些组件能够在多个JSP之间共享,由此加速了总体开发过程,方便维护和优化。
■ 易于部署、升级和维护
JSP容器能够对JSP的修改进行检测,自动翻译和编译修改后的JSP文件,无须手动编译。同时,作为B/S架构的应用技术,JSP项目更加易于部署、升级和维护。
3.1.2 JSP与Servlet的比较
JSP是一种服务器端脚本语言,它降低了Servlet的使用难度。JSP在本质上就是Servlet,JSP提供了Servlet能够实现的所有功能,实际上JSP是首先被翻译成Servlet后才编译并运行的,所以JSP几乎拥有Servlet的所有优点。与Servlet相比,JSP更加适合制作动态页面,因为单纯使用Servlet开发动态页面是相当烦琐的,需要在Java代码中使用大量的“out.println()”语句来输出字符串形式的HTML代码,这种方法难调试、易出错;而JSP通过标签库等机制能很好地与HTML结合,即使不了解Servlet的开发人员同样可以使用JSP开发动态页面。对于不熟悉Java语言的开发人员,会觉得JSP开发更加方便快捷。可以这样理解,Servlet是在Java中嵌入了HTML,而JSP是在HTML中嵌入了Java,图3-1从结构上对JSP和Servlet进行了区别。
图3-1 JSP与Servlet的区别
3.1.3 第一个JSP程序
下述代码用于实现任务描述3.D.1,编写一个JSP页面,显示服务器的当前系统时间。
【描述3.D.1】showTime.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>第一个JSP页面</title> </head> <body> <h1 align="center">欢迎!</h1> <% java.util.Date now = new java.util.Date(); out.println("当前时间是:" + now); %> </body> </html>
上述代码中,使用“<% %>”声明了一段Java脚本,在代码片段中新建了一个Date对象用来封装系统当前时间,然后使用out对象在页面中输出时间。
JSP文件开头通常使用“<%@ page %>”指令进行页面的设置,在该指令中,language属性指定所用语言,contentType属性指定页面的MIME类型和字符集。此外,Java脚本在“<% %>”之内进行声明,用于完成特定的逻辑处理。
注意 关于page指令和out对象会在后续章节中详细介绍。
启动Tomcat,在IE中访问http://localhost:8080/ch03/showTime.jsp,显示结果如图3-2所示。
图3-2 showTime.jsp显示结果
3.1.4 JSP执行原理
同Servlet一样,JSP运行在Servlet/JSP容器(如Tomcat)中,其运行过程如下:
01 客户端发出请求(request)。
02 容器接收到请求后检索对应的JSP页面,如果该JSP页面是第一次被请求,则容器将其翻译成一个Java文件,即Servlet。
03 容器将翻译后的Servlet源代码编译形成字节码,即.class文件,并加载到内存中执行。
04 把执行结果即响应(response)发送回客户端。
整个运行过程如图3-3所示。
图3-3 JSP第一次被请求时的执行过程
当这个JSP页面再次被请求时,只要该JSP文件没有发生过改动,JSP容器就直接调用已装载的字节码文件,而不会再执行翻译和编译步骤,这样大大提高了服务器性能。再次请求JSP时的运行过程如图3-4所示。
注意 JSP文件修改后,容器能够检测到并自动重新进行翻译和编译,当然这需要一些运行上的开销,通常容器会提供相应的选项来开启和关闭此项功能。
图3-4 再次请求JSP
3.2 JSP基本结构
JSP文件由6类基本元素组成:
■ JSP指令
■ JSP声明
■ JSP表达式
■ JSP脚本
■ JSP动作
■ JSP注释
3.2.1 JSP指令
JSP指令用来向JSP容器提供编译信息。指令并不向客户端产生任何输出,所有的指令都只在当前页面中有效。
JSP指令的语法格式如下:
<%@ 指令名 属性="值" 属性="值"%>
常用的三种指令为:
■ page指令
■ include指令
■ taglib指令
下面语句展示了page指令的简单用法:
<%@ page language="java" contentType="text/html; charset=gbk"%>
其中:
■ language属性用来设置JSP页面中的脚本语言,目前此属性值只能是“java”。
■ contentType属性用来设置页面类型及编码,“text/html; charset=gbk”指明了JSP页面文本是HTML格式并且采用GBK中文字符集。
注意 本书将在后续章节中详细介绍这三种指令。
3.2.2 JSP声明
JSP声明用于在JSP页面中定义变量和方法。JSP声明通过“<%! %>”定义。一个JSP页面可以有多个声明,并且每个声明中可以同时定义多个变量或方法,其中,每个JSP声明只在当前JSP页面中有效。
JSP声明的语法格式如下:
<%! 声明的内容 %>
例如:
<%! // 全局方法和变量 private String str = "全局变量"; void setStrParam(String param) { str = param; } %>
上述代码声明了一个变量和一个方法,类似于在类中声明属性和方法。
注意 JSP会被翻译成Servlet,而JSP声明中的变量和方法实际上就是定义在翻译成的Servlet中的,所以本质上就是类的属性和方法。
3.2.3 JSP表达式
JSP表达式用于将Java表达式的运行结果输出在页面中。JSP表达式通过“<%= %>”定义。在JSP表达式中可以包含任何一个有效的Java表达式。当请求JSP页面时,表达式会被运行并将结果转化成字符串插入到该表达式所在的位置上。
JSP表达式的语法格式如下:
<%=表达式%>
示例:
<%=1+1%>
注意 表达式后不能加分号,%和=之间不能有空格。
下述代码用于实现任务描述3.D.2,使用JSP声明和表达式来显示两个数中的最大值。
【描述3.D.2】max.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <%! private int a = 34; private int b = 40; public int max(int num1, int num2) { return num1 > num2 ? num1 : num2; } %> <html> <head> <title>最大数</title> </head> <body> <%=a%>和<%=b%>中最大的数是<%=max(a, b)%> </body> </html>
上述代码中,使用JSP声明定义了两个变量a、b,并定义了求最大值的方法max(),最后使用JSP表达式分别输出了a、b的值和max()运算的结果。
启动Tomcat,在IE中访问http://localhost:8080/ch03/max.jsp,运行结果如图3-5所示。
图3-5 max.jsp结果
3.2.4 JSP脚本
JSP脚本用于在JSP页面中插入Java代码,JSP脚本通过“<%”和“%>”定义,其中可以包含任何符合Java语法的代码。JSP脚本在服务器端执行,当JSP页面被请求时,页面上的JSP脚本会从上到下依次执行。
JSP脚本的语法格式如下:
<% Java代码 %>
例如:
<% java.util.Date now = new java.util.Date(); out.println("当前时间是:" + now); %>
下述代码用于实现任务描述3.D.3,使用JSP脚本循环输出10个整数及其总和。
【描述3.D.3】 number.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>十个数</title> </head> <body> <% int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; out.println(i + " "); } out.println("<br>这十个数的和为:" + sum); %> </body> </html>
上述代码中,使用for循环求1到10的和,并在HTML页面中打印输出结果。
启动Tomcat,在IE中访问http://localhost:8080/ch03/number.jsp,运行结果如图3-6所示。
图3-6 number.jsp结果
3.2.5 JSP动作标签
JSP中可以使用内置的动作标签实现一些常见的特定功能,其语法格式如下:
<jsp:动作名> </jsp:动作名>
例如:
<jsp:include page="welcome.jsp"> </jsp:include>
上述代码使用include动作将welcome.jsp页面包含到当前JSP页面中。
注意 本书将在后续章节中详细介绍JSP动作标签。
3.2.6 JSP注释
在JSP页面中可以使用“<%-- --%>”的方式来注释。服务器编译JSP时会忽略“<%--”和“--%>”之间的内容,所以生成的注释在客户端是看不到的。
JSP注释的语法格式如下:
<%--注释内容--%>
例如:
<%--此处为隐藏注释,客户端不可见--%>
除了上述JSP特有的注释方式外,在JSP页面中还可以使用HTML的注释,即“<!-- -->”的方式,以对HTML标签进行注释,这种方式的注释在客户端可以查看到。此外,在JSP的声明和脚本中,也可以使用Java语言的单行和多行注释方式。
下述示例汇总了JSP指令、声明、脚本、表达式以及注释的使用方法。
【代码3-1】 color.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>颜色</title> </head> <body> <%--声明两种颜色全局变量--%> <%! private String color1 = "EBEBEB"; private String color2 = "F8F8F8"; %> <!-- Table表格 --> <table border="1" align="center"> <% for (int i = 11; i < 16; i++) { String color = ""; if (i % 2 == 0) { color = color1; } else { color = color2; } %> <tr bgcolor="<%=color%> "> <td>姓名<%=i%></td> <td><%=i%></td> </tr> <% } %> </table> </body> </html>
此JSP中先声明两种颜色,分别设置到表格中的奇偶行,使颜色交替显示。
启动Tomcat,在IE中访问http://localhost:8080/ch03/color.jsp,运行结果如图3-7所示。
图3-7 color.jsp
小结
通过本章的学习,学生应该能够学会:
■ JSP是一种在HTML中嵌入Java代码的动态网页技术。
■ 与Servlet相比,JSP更偏重于将数据展示在HTML中,更适合制作动态页面。
■ JSP的执行过程需要经过翻译、编译、执行三个步骤。
■ JSP页面的构成元素有指令、声明、表达式、脚本、动作标签和注释。
■ JSP指令用来向JSP容器提供编译信息。
■ JSP声明用于在JSP中定义变量和方法。
■ JSP表达式用于将Java表达式的运行结果输出在页面中。
■ JSP脚本用于在JSP页面中插入Java代码。
■ JSP提供了很多动作标签实现特定的功能。
练习
1. 下列关于JSP执行过程的说法正确的是______。(多选)
A. JSP在容器启动时会被翻译成Servlet,并编译为字节码文件
B. JSP在第一次被请求时会被翻译成Servlet,并编译为字节码文件
C. 在第二次请求时,将不再执行翻译步骤
D. 如果JSP页面有错误,将不执行翻译步骤
2. 下列不属于JSP构成元素的是______。
A. 脚本
B. 声明
C. 表达式
D. JavaScript
3. 下列注释方式可以在JSP中使用并且客户端无法查看到的是______。
A. <!-- 注释 -->
B. <% 注释 %>
C. <%-- 注释 --%>
D. <%! 注释 %>
4. 下列JSP表达式的写法正确的是______。(多选)
A. <%="abcdefg".length()%>
B. <%="abcdefg" + 123%>
C. <%=new java.util.Date()%>
D. <%=this%>
5. 在JSP页面中有下述代码,第二次访问此页面的输出是______。
<%! int x = 0; %> <% int y = 0; %> <%=x++%>,<%=y++%>
A. 0,0
B. 0,1
C. 1,0
D. 1,1
6. 找出下述代码中的错误。
<%! int x; int method1() { return x++; } %> <% int x = method1(); int y; %> <%=method1();%>
7. 编写JSP页面,输出100以内的质数。