2.3 JSP概述
JSP(Java Server Pages)是由美国Sun Microsystems公司倡导的、许多公司参与一起建立的一种动态网页技术标准。JSP技术是用Java语言作为脚本语言,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。
在传统的网页HTML文件(∗.htm,∗.html)中加入Java程序片段(Scriptlet)和JSP标记(Tag),就构成了JSP网页(∗.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送e-mail等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果。它对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame。
2.3.1 什么是JSP
JSP是基于Java的技术,用于创建可支持跨平台及Web服务器的动态网页。从构成情况上来看,JSP页面代码一般由普通的HTML语句和特殊的基于Java语言的嵌入标记组成,所以它具有了Web和Java功能的双重特性。
JSP 1.0规范是1999年9月推出的,12月又推出了1.1规范。此后JSP又经历了几个版本,2003年发布的JSP 2.0,最新版本是JSP 2.1。本书介绍的技术都基于JSP 2.0规范。
为了让读者对JSP技术有一个直观的认识,先来看一个非常简单的JSP页面及其运行效果。以下是helloWorld.jsp的源代码:
JSP是一种动态网页技术标准。可以将网页中的动态部分和静态的HTML相分离。用户可以使用平常得心应手的工具并按照平常的方式来书写HTML语句。然后,将动态部分用特殊的标记嵌入即可,这些标记常常以“<%”开始并以“%>”结束。程序运行效果如图2-5所示。
同HTML以及ASP等语言相比,JSP虽然在表现形式上同它们的差别并不大,但是它却提供了一种更为简便、有效的动态网页编写手段,而且由于JSP程序同Java语言有着天然的联系,所以在众多基于Web的架构中,都可以看到JSP程序。
由于JSP程序增强了Web页面程序的独立性、兼容性和可重用性,所以,与传统的ASP、PHP网络编程语言相比,它具有以下特点:
1)JSP的执行效率比较高。由于每个基于JSP的页面都被Java虚拟机事先解析成一个Servlet,服务器通过网络接收到来自客户端HTTP的请求后,Java虚拟机解析产生的Servlet将开启一个“线程(Thread)”来提供服务,并在服务处理结束后自动销毁这个线程,如图2-6所示。这样的处理方式将大大提高系统的利用率,并能有效地降低系统的负载。
2)编写简单。由于JSP是基于Java语言和HTML元素的一项技术,所以只要熟悉Java和HTML的程序员都可以开发JSP。
3)跨平台。由于JSP运行在Java虚拟机之上,所以它可以借助于Java本身的跨平台能力,在任何支持Java的平台和操作系统上运行。
4)JSP可以嵌套在HTML或XML网页中。这样不仅可以降低程序员开发页面显示逻辑效果的工作量,更能提供一种比较轻便的方式来同其他Web程序交互。
图2-5 helloWorld.jsp运行效果
图2-6 Web服务器使用Servlet提供服务的示意图
2.3.2 JSP技术原理
JSP文件的执行方式是“编译式”,而不是“解释式”,即在执行JSP页面时,是把JSP文件先翻译为Servlet形式的Java类型的字节码文件,然后通过Java虚拟机来运行。所以从本质上来讲,运行JSP文件最终还是要通过Java虚拟机。不过根据JSP技术的相关规范,JSP语言必须在某个构建于Java虚拟机之上的特殊环境中运行,这个特殊环境就是Servlet Container(通常被译为Servlet容器)。而且,每个JSP页面在被系统调用之前,必须先被Servlet容器解析成一个Servlet文件。
图2-7给出了JSP的运行原理。每次Servlet容器接收到一个JSP请求时,都会遵循以下步骤:
(1)Servlet容器查询所需要加载的JSP文件是否已经被解析成Servlet文件。如果没有在Servlet容器里找到对应的Servlet文件,容器将根据JSP文件新创建一个Servlet文件。反之,如果在容器里有此Servlet文件,容器则比较两者的时间,如果JSP文件的时间要晚于Servlet文件,则说明此JSP文件已被重新修改过,需要容器重新生成Servlet文件,反之容器将使用原先的Servlet文件。
(2)容器编译好的Servlet文件被加载到Serv-let容器中,执行定义在该JSP文件里的各项操作。
(3)Servlet容器生成响应结果,并返回给客户端。
(4)JSP文件结束运行。
从这个JSP的工作原理和运作流程上来看,JSP程序既能以Java语言的方式处理Web程序里的业务逻辑,更可以处理基于HTML协议的请求,它是集众多功能于一身的。
图2-7 JSP运行原理
不过,在编写程序的过程中,不能过多地在JSP代码里混杂提供显示功能和提供业务逻辑的代码,而是要把JSP程序定位到“管理显示逻辑”的角色上。
当服务器第一次接收到对某个页面的请求时,JSP引擎就开始进行上述的处理过程,将被请求的JSP文件编译成Class文件。在后续对该页面再次进行请求时,若页面没有进行任何改动,服务器只需直接调用Class文件执行即可。所以当某个JSP页面第一次被请求时,会有一些延迟,而再次访问时会感觉快了很多。如果被请求的页面经过修改,服务器将会重新编译这个文件,然后执行。
2.3.3 JSP和其他动态网站开发技术
早期的动态网站开发技术是基于公共网关接口(Common Gateway Interface,CGI)的。其功能主要是客户端向服务器发送请求,Web服务器接收到请求后启动所指定的CGI程序来完成诸如对数据库进行访问、存储信息等操作,最后将处理的结果反馈给客户端。CGI程序包括两个主要部分:一个是程序代码,一个是HTML代码。由于每次修改HTML页面代码都必须重新编译CGI程序,以至于最后在CGI程序调试中,调试HTML代码的工作量可能超过调试CGI程序代码的工作量。CGI属于比较早期的服务器端动态技术,但由于其发展的历史较早,目前使用此项技术所构建的网站依然不在少数。然而由于其不易学习和效率不高的特性,在ASP及JSP等技术出现之后,已逐渐淡出用户的视线。
为克服这一弊端,其他动态网站开发技术相继发展起来。ASP(Active Server Pages)是美国微软公司开发的一种类似HTML、Script(脚本)与CGI的结合体的技术,可以结合HTML网页、ASP指令和ActiveX元件建立动态、交互且高效的Web服务器应用程序。ASP允许用户使用包括VBScript和JavaScript等在内的许多已有的脚本语言编写ASP应用程序。ASP程序的编制比HTML更方便且更有灵活性。它是在Web服务器端运行,运行后再将运行结果以HTML格式传送至客户端的浏览器。但是ASP技术有一个比较明显的缺陷就是它基本上只能局限于美国微软公司的操作系统平台之上,如IIS(Internet Information Server)和PWS(Personal Web Server)等。
PHP也是一种用于创建动态Web页面的服务端脚本语言。同样可以混合使用PHP和HTML编写Web页面。当客户端访问某页面时,服务器端会首先对页面中的PHP命令进行处理,然后把处理后的结果连同HTML内容一起传送到客户端的浏览器。另外,PHP是一种开源程序,拥有很好的跨平台兼容性。用户可以在Windows系统及许多版本的UNIX和Linux系统上运行PHP,而且可以将PHP作为Apache服务器的内置模块或CGI程序运行。ASP.NET是美国微软公司集成.NET平台发展而来的服务器端网页语言,使用.NET提供的类别库与对象导向理论建构的服务器端动态网页,不仅功能强大,紧密结合.NET平台,而且在性能上也有相当出色的表现,近年来已经成为最热门的动态网页技术之一。
JSP不像CGI、ISAPI和NSAPI那样难于编写和维护,不像PHP那样只能适应中小流量的网站,也不像ASP那样受到跨平台的限制(只能运行于美国微软公司开发的IIS和PWS上)。JSP体现了当今最先进的网站开发思想,和其他Web开发工具相比,JSP有着以下强大的优势:
1)程序可以跨平台执行。JSP可以让开发人员在任意环境中进行开发,在任意环境中进行系统部署,在任意环境中扩展应用程序。
2)多样化和功能强大的开发工具支持。Java有许多非常优秀的开发工具,而且有许多可以免费得到,其中许多工具已经可以顺利地运行于多种平台之下。
3)强大的可伸缩性。从只有一个小的jar文件就可以运行servlet/jsp到由多台服务器进行集群和负载均衡,到多台Application进行事务处理,一台服务器到无数台服务器,Java显示了巨大的生命力。
当然,JSP也有它的不足,Java的一些优势也是它致命的问题所在:
1)跨平台的功能和极度的伸缩能力极大地增加了产品的复杂性。也就是说,它在扩展时需要分成多少块,那么Java系统中就有多少种产品,所以用户可能会看到jre、jdk、jsdk、jswdk等,而实际上它们是密不可分的。只要将它们有效地搭配在一起,就可以产生强大的效能。当然,这同时也使应用程序变得非常复杂。
2)JSP运行是用class常驻内存来完成的,虽然提高了响应速度,但要占用内存。Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的.java文件和.class文件,以及对应的版本文件。
3)JSP程序调试也不是很方便。JSP页面首先被转化为一个.java文件(Servlet),然后再被编译。这样,出错信息实际上指向的是经过转化的那个.java文件而不是.jsp本身。