JSP是建立在Java servlets模型之上的表达层技术,它使编写HTML变得更简单。像SSJS一样,它也允许你将静态HTML内容与服务器端脚本混合起来生成动态输出。JSP把Java作为默认的脚本语言,然而,就像ASP可以使用其他语言(如JavaScript和VBScript)一样,JSP规范也允许使用其他语言。尽管JSP和Java比那些基于简单语言的脚本平台(如JavaScript和VBScript)具有更好的兼容性和坚固性,但同时Java的学习难度也比简单的脚本语言要大。
为了兼顾两者的优点――一个健壮的web应用平台和一种简单易用的语言工具――JSP提供了大量的服务器端标签(Tag),这使得开发者可以在不写Java代码的情况下完成大多数动态内容操作。那些只熟悉编写脚本的开发人员,甚至仅仅是HTML设计者,就可以使用JSP标签生成简单的输出而不必学习Java。高级的脚本编写者或Java程序员也可以使用这些标签,如果要在JSP页面中完成更高级的操作,他们可以使用完整的Java语言。
Page过时了,Component妙极了
要理解JSP怎样联合无限的力量来轻而易举地实现魔术般的效果,你必须首先了解“组件为中心的网页开发”和“页面为中心的网页开发”的区别。
SSJS和ASP都是在几年前推出的,那时网络还很年轻,没有人知道除了把所有的商务、数据和表达逻辑统统堆进原始网页中之外还有什么更好的解决方法。这种以页面为中心的模型容易学习并且得到相当快速的发展。然而,随着时间的推移,人们认识到这种方法不适于构建大型的、可升级的web应用程序。在脚本环境中书写的表达逻辑被锁在页面内,只有通过剪切和粘贴才能被重用。表达逻辑通常和商务及数据逻辑混在一起,这使得当程序员试图改变一个应用程序的外观而不想破坏与之紧密结合的商务逻辑时,应用程序的维护就像在蛋壳上走路一样困难。其实在企业中,可重用组件的应用早已经很成熟,没有人愿意为他们的应用程序重写那些逻辑。HTML和图形设计师把他们的设计的实施工作交给了web编写者,使他们不得不加倍工作――常常是手工编写,因为没有合适的工具可以把服务器端脚本与HTML内容结合起来。简而言之,随着web应用程序的复杂性不断提升,以页面为中心的开发方式的局限性变得明显起来。
与此同时,人们一直在寻找建立web应用程序的更好方法,组件在客户机-服务器领域风行起来。JavaBeans和ActiveX被“快速应用程序开发”(RAD)工具发行商推广给Java和Windows应用程序开发者用来快速开发复杂的程序。这些技术使某领域内的专家可以为本领域内的垂直应用编写组件,而开发者可以直接拿来使用而不必掌握这一领域的专门技术。比如,编制旅鼠交配习性图表的Java程序员不需要了解任何关于旅鼠的知识,他只要调用 LemmingsInLove JavaBeans(JavaBeans是一种基于Java的组件)就可得到相应的领域专门信息,他只需关注如何使软件更易于使用。出现一种把组件为中心的程序设计方法带到服务器端web应用领域的技术只是时间的问题。
作为一种以组件为中心的开发平台,JSP出现了。它以JavaBeans和Enterprise JavaBeans(EJB)组件包含商务和数据逻辑的模型为基础,提供大量标签和一个脚本平台用来在HTML页中显示由JavaBeans产生或回送的内容。由于JSP的以组件为中心的性质,他可以被Java和非Java开发者同样使用。非Java开发者可以通过JSP的标签(Tags)来使用高级Java开发者创建的JavaBeans。Java开发者不仅可以创建和使用JavaBeans,还能在JSP页中使用Java语言来更精密地控制基于底层JavaBeans的表达逻辑。
JSP请求模型
现在我们来看看JSP是如何处理HTTP请求的。在基本请求模型中,一个请求直接被送到JSP页中。图1说明了这个模型中的信息流程。JSP代码控制着进行逻辑处理时与JavaBeans组件的交互,并在动态生成的、混合了静态HTML代码的HTML页中显示结果。
图1.基本JSP请求模型
Beans 可以是JavaBeans 或EJB组件。另外,更加复杂的请求模型可看作从被请求页呼叫其他JSP页或Java servlets。
JSP引擎技术内幕
JSP引擎实际上要把JSP标签、JSP页中的Java代码甚至连同静态HTML内容都转换为大块的Java代码。这些代码块被JSP引擎组织到用户看不到的Java servlet中去,然后servlet自动把它们编译成Java字节码。这样,当网站的访问者请求一个JSP页时,在他不知道的情况下,一个已经生成的、预编译过的servlet实际上将完成所有的工作。非常隐蔽-而又高效。因为servlet是编译过的,所以网页中的JSP代码不需要在每次请求该页时被解释一遍。JSP引擎只需在servlet代码最后被修改后编译一次,然后这个编译过的servlet就可以被执行了。由于是JSP引擎自动生成并编译servlet,不用程序员动手编译代码,所以JSP能带给你高效的性能和快速开发所需的灵活性。
如果你从Sun的网站下载JSP reference implementation并用它编写应用程序,你将能够看到JSP引擎生成的.java和.class文件。如果你想更多地了解所生成的代码,可以用文本编辑器打开.java文件查看Java servlet的代码。