Web应用开发介绍CGI、Servlet创建动态页面JSP概述JSP与ASP、PHP类似技术比较JSP的优点JSP是JavaServerPages的缩写,是由SunMicrosystems公司倡导,许多公司参与一起建立的一种动态网页技术标准,用于辅助对Web请求的处理。JSP是建立在JavaServlets模型之上的表达层技术,允许将静态HTML内容与服务器端脚本混合起来生成动态输出。在每天浏览的网站中,可能就有很多是使用JSP对数据进行格式化和显示的。JSP基于Java技术,由类似于HTML的标记、JSP标记(tag)和Java代码片组成,可用来创建跨平台和跨Web服务器的动态网站。本章将让读者初步认识JSP,了解基于Java的服务器逻辑处理请求的发展过程、什么是JSP及其与Servlet的关系,并阐述JSP与ASP、PHP等类似技术的比较,JSP的优势等。初识JSP111第第章章导读JSP网络编程从入门到精通·4·1.1创建Web应用的技术发展过程在讲解本章内容之前,先了解一下使用一个浏览器去访问一个网站时,后台所会发生的情况及网站是如何实现请求和响应的。图1.1给读者展示了一个浏览器访问一个Web服务器的整个过程。(1)用户在浏览器上(这里以MicrosoftInternetExplorer浏览为例)输入网站的URL地址,这个地址告诉浏览器要和网络中的哪台主机进行联系。一般输入的是主机的域名(例如),域名唯一对应一个IP地址,一个IP地址又唯一识别一台联网的主机。(2)浏览器寻找到指定的主机之后,向Web服务器发出请求。(3)Web服务器接收到请求并作出相应的分析,然后从存储器中获取一个采用HTML编码的Web页面。Web服务器一般和HTML文件放置在同一个主机上。(4)服务器把取出的Web页面返回给发出请求的浏览器作为响应。(5)浏览器接收到相应的Web页面之后,在显示屏上向用户显示这个页面。4.返回HTML页面作出响应2.向服务器发出浏览请求1.输入URL地址5.显示页面客户端浏览器存储的HTML页面3.取出浏览器需要浏览的HTML页面Web容器服务器端用户图1.1浏览器访问Web过程浏览器与Web服务器之间是通过因特网进行会话的,而这种会话是要通过一种称为HTTP(HypertextTransferProtocol,超文本传输协议)的标准网络协议完成的。HTTP是一个请求/响应协议。在这个协议的基础上,Web服务器才能和浏览器通过Web交换数据。HTTP又是建立在TCP/IP协议基础之上的,而TCP/IP则是将因特网中所有计算机连接起来的一个协议组。这里并不需要读者对HTTP协议以及TCP/IP知识有太多的了解,但要求读者对浏览器发出请求以及服务器如何发出响应的机制和原理有一定的了解,这会对读者了解JSP有所帮助。1.1.1传统Web服务器模式的不足传统的Web应用只提供有限的静态Web页面,每个Web页面的内容是保持不变的。如果网站需要提供更多的信息,就只能重新编写HTML页面并提供链接。传统Web服务器模式存在如下不足:第1章初识JSP·5·不能提供及时的信息。当需要添加新的信息时,必须重新编写HTML文件。由于HTML页面是静态的,并不能根据用户的需求提供不同的信息(包括显示格式和内容),不能满足多样性的需求。正因为静态页面存在着这么多的不足,因特网软件工程人员很快就转向了CGI(CammonGetewayInterface,公共网关接口),希望CGI能提供动态生成功能。1.1.2CGI实现动态生成HTMLCGI是实现在服务器端执行程序的一种方法。运行程序输出的是HTML页面,然后Web服务器再把这个静态页面返回给浏览器作为请求的响应。这样的模式实现了动态生成页面的效果。具体的CGI操作方式如图1.2所示。6.返回HTML页面作出响应2.向服务器发出浏览请求1.输入URL地址7.显示HTML客户端浏览器CGI程序(生成所需的HTML文件)4.读取数据库或者文件Web容器服务器端3.请求运行某个CGI程序5.输出生成的HTML页面数据库用户图1.2CGI的操作过程和图1.1所示的过程一样,用户需要在浏览器中输入URL地址(其实更多情况是用户单击HTML页面上的一个超链接),例如,这个URL地址告诉浏览器要去和网络上域名为(对应着一个唯一的IP地址)的主机联系。和服务器取得联系之后,Web服务器会根据给出的jsp/createhtml.cgi地址来运行相应的createhtml.cgi程序,并把生成的HTML页面输出给Web服务器。Web服务器再使用HTTP协议把生成的HTML页面返回给浏览器作为响应。注意:CGI程序在服务器端执行,并可以和Web服务器在同一个主机上。最流行的CGI语言是Perl和shell脚本,但是也可以使用C、C++以及Java等语言进行编写。CGI可以访问存储数据库中的数据或者其他系统中的文件,实现动态生成的效果。JSP网络编程从入门到精通·6·虽然CGI实现了网站动态性,但是CGI也存在很多的不足之处。如下:需要为每个请求启动一个操作CGI程序的系统进程。如果请求非常频繁,这会带来很大的开销。需要为每个请求加载和运行一个CGI程序,这也将带来很大的开销。需要重复编写处理网络协议的代码及进行编码,这些工作都是非常耗时的。前面已经介绍过了Java语言可以用来编写CGI程序。但遗憾的是,使用Java编写的CGI程序执行效率更加低下。这是因为要执行一个Java编写的CGI程序,除了首先需要启动一个系统进程之外,还要在进程中启动一个JVM(JavaVirtualMachine,Java虚拟机),然后才能在JVM中执行JavaCGI程序(读者应该对Java程序的运行机制有所了解)。为了解决CGI所留下来的问题,产生了Servlet。在1.1.3小节将重点介绍Servlet的基本原理。1.1.3Servlet——改进的CGI由前面的介绍可以知道,使用Java编写的CGI程序正是由于需要为每个请求都要启动一个系统进程及JVM,这大大降低了执行效率。如果能有办法取消这些开销,即只需要启动一个操作系统进程及一个JVM映像,基于Java的CGI就能得到很好的改善。Servlet正是基于这样的想法才产生的。另外,可知Java可以在运行的时候动态地进行加载,所以可以利用这样的功能加载新的Java代码来处理新的请求。这样就可以只启动一次服务器进程,而且只需要加载一次JVM,之后这个JVM再加载另外的类。基于这样的思想而出现的Servlet执行效率就高得多了。和传统的CGI程序相比,Servlet有如下几个优点:只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销。如果多个请求需要做同样处理的时候,这时只需要加载一个类,这也大大降低了开销。所有动态加载的类可以实现对网络协议及请求解码的代码共享,大大降低了工作量。Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。Sun公司在20世纪90年代末就发布了基于Servlet的Web服务器。为了确保加载的各个类之间不起冲突,已经建立了一个称为JavaServletAPI(应用编程接口)的编码标准。现在基本上所有的服务器都遵循这个编码标准,所以Servlet有很好的移植性。现在的Web服务器(例如Tomcat)已经集成了Servlet容器。Servlet容器负责管理加载、卸载、重新加载和执行Servlet代码等操作。下面是一个比较典型的ServletJava源代码:publicclassHelloWorldTestextendsHttpServlet{publicvoiddoTest(HttpServletRequestrequest,HttpServletResponsereponse)throwsIOException,ServletException{Stringmsg=登录成功;response.setContentType(text/html);PrintWriterout=response.getWriter();out.println(html);第1章初识JSP·7·out.println(head);out.println(titleJSP2.0Test/title);out.println(/head);out.println(body);out.println(msg);out.println(/body);out.println(/html);}}从这段代码可以看到Servlet重复使用了PrintWriter.println()方法来输出相应的HTML页面,以达到动态生成HTML页面的效果。虽然Servlet改变了传统CGI程序的缺点,但是它也有不足的地方:Servlet可以建立动态生成的网页,网页中可以包含从服务器端的Java对象所获得的数据。但是Servlet生成网页的方法是在Java类中嵌入HTML标签和表达式。也就是说对HTML做一个小小的改动时,都需要修改和重新编译Servlet源文件,然后重新部署到Servlet容器当中。当设计HTML页面和编写Servlet代码的不是同一个人时,就会使得修改Servlet变得非常麻烦。JSP的引入就是要解决以上Servlet所存在的问题。在1.2节将重点介绍JSP。1.2JSP简介JavaServerPages(JSP)是一种实现普通静态HTML和动态HTML混合编码技术,它是ServletAPI的一个扩展。由于JSP页面在编译成Servlet之前也是可以使用的,所以它具有Servlet的所有优点,包括访问JavaAPI。又由于JSP是嵌入到Servlet中关于应用程序的一般表达代码,所以可以把它看成一种“彻底”的Servlet。访问一个JSP网站的过程如图1.3所示。6.返回页面作出响应2.向服务器发出浏览请求1.输入URL地址7.显示页面客户端浏览器5.JavaBean返回的数据JavaBean(基于Java组件)Web容器(带有JSP引擎)服务器端JSP文件4.读取数据库或者文件数据库3.调用某个JavaBean组件用户图1.3JSP页面访问示意图JSP网络编程从入门到精通·8·Web容器必须包含JSP引擎,它负责动态地对JSP文件进行检测和编译。1.2.1JSP的优点JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器、应用服务器、浏览器和开发工具很好地共同工作。JSP网页可以非常容易地与静态模板结合,包括HTML或XML片段,以及生成动态内容的代码。它比以上讲的Servlet要更加优越。具体而言,JSP有以下几个优点:JSP提供一种模块机制,可以在HTML页面中嵌入基于Java的逻辑代码。使用JSP时,再也没有必要编写和编译用Java语言写的任何代码。而且对JSP进行修改会很快看到效果,这是因为JSP容器(或者称JSP引擎)会自动检测和重新编译JSP。JSP的使用大大缩短了服务器端基于Java的CGI开发周期,实现了快速开发的目的。由于JSP标记是内嵌在HTML页面中的,所以完全可以先让Web页面设计者来设计页面模板。然后再让Java程序员处理所用的标记以及实现必要的逻辑功能,从而实现图形和布局设计工作与应用开发任务的分离(后面介绍的MVC设计更能体现这一点)。许多由CGI程序生成的页面大部分仍旧是静态HTML,动态内容只在页面中有限的几个部分出现。但是包括Servlet在内的大多数CGI技术及其变种总是通过程序生成整个页面。JSP使得我们可以分别创建这两个部分。例如,下面就是一个简单的JSP页面:!DOCTYP