第7章 服务器端开发——动态
主页技术基础
动态主页基于前面各章节中所介绍的知识,是构建完整、实用网站的基础。与JavaScript不同的是,本章所介绍的开发和运行环境都是基于服务器的。本章讲述构建动态主页的各种主要技术,阐明动态主页运行的基本原理,并通过介绍多种开发技术以及相应的应用范例,向读者全方位地介绍动态主页技术。本章所涉及的开发技术包括了历史上和目前应用最广、最为成熟的几种:CGI、ASP、ASP.NET、JSP、PHP、ISAPI/NSAPI、Java Servlet和Java Applet等,并对它们的不同特点进行比较,便于读者熟悉它们各自的优缺点,以利于在实际项目开发时作出正确选择。通过本章的学习,可以对动态主页技术有一个全面概括的了解,通过对各种流行的动态主页技术之间的比较,帮助读者选择适合的开发技术。
动态主页的基本特点
.NET动态主页的基本开发方法
Java技术基础
不同动态主页开发技术的异同
7.1 动态主页基本原理
这里所说的动态网页并不是指在网页上由于放入了一些如Flash动画等元素,而使网页有比较活泼的内容的网页。“动态”的“动”指的是“交互性”,通俗地说就是网页能不能根据访问者或访问时间的不同而显示出不同的内容即本书1.3.1节中所介绍的“活动页面”。
单纯利用静态HTML开发的Web站点虽然开发周期短、开发难度低,且可以实现足够精美的页面,但由于难以适应信息频繁更新以及交互的需求,存在先天的不足。比如:静态网页无法根据用户在客户端浏览器中所输入的参数,在服务器对数据查询后再将符合条件的数据集回传给客户端浏览器,而动态主页技术就弥补了这一不足。
动态网页可分为客户端动态网页和服务器端动态网页两类,下面简要介绍一下它们各自的工作原理。
1. 客户端动态网页
在客户端模型中,附加到浏览器上的模块(插件)完成创建动态网页的全部工作。HTML代码通常随含有一套指令的文件传送到浏览器,此文件在HTML页中引用,还有一种情况是这些指令与HTML代码混合在一起,当遇到用户请求时,浏览器利用这些指令生成纯HTML。也就是说,用户看到的网页是根据用户的请求动态生成的,然后返回到浏览器的。
客户端技术在近年来越来越不受欢迎,因为使用该技术需要下载客户端软件,而且当需要下载其他单独的指令文件时,时间较长。另外,因为每一种浏览器都以不同的方式解释指令,所以不能保证Internet Explorer能理解指令,其他的浏览器如FireFox或者Opera也能够理解它们。
客户端技术的另一个缺点是当编写使用服务器资源的客户端代码时会出现安全性等方面的问题,因为如果代码是在客户端被解释执行的,那么客户端脚本的代码将会完全公开,这不是开发者所希望的。
2. 服务器端动态网页
在服务器端模型中,HTML源代码与混合在其中的一套指令存储于Web服务器中。当用户请求该页时,这些指令在服务器上被处理,然后再返回浏览器。与客户端模型相比,只有描述最终页的HTML代码才被传到客户端浏览器,并可以保证大多数的浏览器能够显示该页。能提供服务器端动态网页的技术包括:PHP、CGI、ASP、JSP和ASP .NET等。下面介绍它们的工作原理。
(1) 当用户请求某个PHP(CGI、ASP、JSP或ASPX等)页面时,Web服务器响应HTTP请求,调用PHP(CGI、ASP、JSP或ASPX等)引擎,解释(或编译)并执行被申请的文件。
(2) 若脚本中含有访问数据库的语句,则通过ODBC(或ADO、OLE DB、JDBC等连接方式)与后台数据库建立连接,再由数据库访问组件执行访问数据库的操作。
(3) PHP等脚本在服务器端解释(某些技术采取在服务器端编译的方式)并执行,根据从数据库所获取的结果集生成符合用户需要的HTML网页,最终发送到客户端来响应用户请求。上述所有相关的过程均由WWW服务器负责。
因此,动态主页实际上就是存放在服务器端的程序,由客户端提出执行请求,在服务器端运行,运行的结果通过HTML的形式传回客户端。
7.2 .NET 介 绍
7.2.1 ASP.NET简介
ASP.NET又叫ASP+,虽然名称类似于ASP(Active Server Pages),但它并不仅仅是对ASP的简单升级,而是微软推出的新一代脚本语言。ASP.NET是微软发展的新型体系结构.NET的一部分。
ASP.NET不仅仅具有了一个新的界面,还修复了一些ASP原有的缺陷。更为重要的是,它在兼顾ASP以前版本优点的基础上,参照Java、VB语言的优势加入了许多新的特色。
ASP.NET能支持多种编程语言,它可使用脚本语言(如 VBscript、Jscript、Perlscript和Python)以及编译语言(如Visual Basic、C#、C、Cobol、Smalltalk和Lisp)。
7.2.2 .NET战略
随着网络经济的到来,微软希望帮助用户能够在任何时候、任何地方、利用任何工具来获得网络上的信息,并享受网络通信所带来的方便和快捷。由此设立的.NET战略就是为了实现上述的目标。微软公开宣布,今后将着重于网络服务和网络资源共享的开发工作,并将为公众提供更加丰富、有用的网络资源与服务。
微软新一代平台的正式名称叫做“新一代Windows服务”(NGWS),并给这个平台注册了正式的商标——Microsoft .NET,于2002年4月发布。在.NET环境中,微软不仅仅是平台和产品的开发者,并且还将作为架构服务提供商、应用程序提供商,以便全方位开展基于Internet的服务。
Microsoft .NET平台的基本思想是:将侧重点从连接到互联网的单一网站或设备上,转移到计算机、设备和服务群组上,使其通力合作,提供更广泛更丰富的解决方案。用户将能够控制信息的传送方式、时间和内容。计算机、设备和服务将能够相辅相成,从而提供丰富的服务,而不是像从前的孤岛那样,由用户提供唯一的集成。企业可以提供一种方式,允许用户将他们的产品和服务无缝地嵌入自己的电子构架中。这种思路将扩展二十世纪八十年代首先由PC所赋予用户的个人权限。
Microsoft .NET将开创互联网的新局面,基于HTML的信息显示将通过XML得到增强。XML是由“万维网联盟”(W3C)定义且受到广泛支持的行业标准,HTML标准也是由该组织发布的。XML提供了一种从数据的演示视图分离出实际数据的方式,这是新一代互联网的关键,能方便对信息的组织、编程和编辑,可以更有效地将数据分布到不同的数字设备,并允许各站点进行合作,提供可以相互作用的WEB服务(Web Service)。
Microsoft.NET平台包括用于创建和操作新一代服务的.NET基础结构和工具;可以启用大量客户机的.NET用户体验;用于建立新一代高度分布式的数以百万计的.NET积木式组件服务;以及用于启用新一代智能互联网设备的.NET设备软件。
.NET环境中的突破和改进在于:
(1) 使用统一的Internet标准(如XML)将不同的系统对接。
(2) 这是Internet上首个大规模的高度分布式应用服务架构。
(3) 使用了一个名为“联盟”的管理程序,这个程序能全面管理平台中运行的服务程序,并且为它们提供强大的安全保护后台。
.NET平台包括如下组件:
(1) 用户数据访问技术。其中包括一个新的基于XML的、以浏览器为组件的混合信息架构,叫做“通用画板”。
(2) 基于Windows DNA 2000的构建和开发工具。
(3) 一系列模块化的服务,其中包括认证、信息传递、存储、搜索和软件送递功能。
(4) 一系列驱动客户设备的软件。
7.3 ASP.NET应用的开发
下面以ASP.NET Web 应用程序的实例来讲解ASP.NET应用的开发。
【实例7-1】使用 ASP <% %> 呈现块
程序代码如ex7_1.aspx所示。
ex7_1.aspx
ex7_1.aspx
ASP.NET提供与现有ASP页语法的兼容。这包括支持可在.aspx文件内与HTML内容混合的<% %>代码呈现块,这些代码块在网页呈现时按由上而下的方式执行。
上面的示例说明如何使用<% %>呈现块在HTML块上循环(每次增加字体大小),该实例运行后浏览器中的显示如图7-1所示。
图7-1 使用 ASP <% %> 呈现块
注释:
在使用Visual Studio 2005进行开发时,可以将C#程序代码写在.aspx文件中,与HTML混合在一起,也可以将程序代码写在单独的同名.cs文件中。这两种方法都可以,但Web开发标准中建议将实现业务逻辑的C#代码与HTML代码分开放在不同的文件中,这样可以提高程序的可阅读性,将视图与业务分开。
【实例7-2】处理多个控件操作事件
程序代码如ex7_2.aspx所示。
ex7_2.aspx
<%@ Page Language="C#" %>
处理多个控件操作事件
此示例说明如何处理从不同的 <asp:button> 控件引发的多个控件操作事件。
事件处理程序为开发人员提供了在ASP.NET中构造逻辑的清晰方法。例如,上面的示例说明如何在单个页面上连接和处理四个按钮事件。该实例运行后的浏览器显示如图7-2所示。
图7-2 处理多个控件操作事件
注释:
按钮的事件响应方法无需手动添加,在设计界面中,双击按钮,VS会自动为开发者添加按钮单击方法。其他界面元素组件也类似。
【实例7-3】到 DataView 的数据绑定
程序代码如ex7_3.aspx所示。
ex7_3.aspx
<%@ Page Language="C#" %>
<%@ Import namespace="System.Data" %>
到 DataView 的数据绑定
像DataGrid、ListBox和HTMLSelect这样的列表服务器控件将集合用作数据源。上面的实例说明如何绑定到通常的公共语言运行库集合类型。这些控件只能绑定到支持IEnumerable、ICollection或 IListSource 接口的集合。最常见的是绑定到ArrayList、Hashtable、DataView 和 DataReader。此处列举到DataView的数据绑定。该实例运行后的浏览器显示如图7-3所示。
图7-3 到DataView的数据绑定
注释:
在VS中,提供了很多DataGrid的设计配色方案,开发者在开发简单的程序时只需从已有的方案中选取合适的即可使页面变得更美观。
7.4 Java 技 术
随着Internet的发展,客户机/服务器计算方面的许多新技术应运而生,其中最为瞩目的就是Java。Java不单定义了一种计算机语言,而且提供了一整套客户机/服务器解决方案,在这个方案中,程序可以自动地下载到客户端并执行。
7.4.1 Java技术概述
1991年,SUN MicroSystem公司的JameGosling、BillJoe等人,为在电视、控制烤面包箱等家用消费类电子产品上进行交互式操作而开发了一个名为Oak的软件,但它当时并没有引起人们的注意。直到1994年下半年,Internet的迅猛发展,全球互联网的快速增长,促进了Java语言研制的进展,使得它逐渐成为Internet上受欢迎的开发与编程语言,一些著名的计算机公司纷纷购买了Java语言的使用权,如Microsoft、IBM、Netscape、Novell、 Apple、DEC和SGI等,因此Java语言被美国的著名杂志PC Magazine评为当年十大优秀科技产品(计算机类就此一项入选),随之大量出现了用Java编写的软件产品,受到业界的重视与好评。
Java是一个广泛使用的网络编程语言。首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性、健壮性、安全性、并且提供了并发的机制、具有很高的性能。其次,它最大限度地利用了网络,Java的小应用程序(Applet)可在网络上传输而不受CPU和环境的限制。另外,Java还提供了丰富的类库,使程序设计者可以很方便地建立自己的系统。Java语言具有以下特点:简单、面向对象、分布式、解释执行、健壮、安全、体系结构中立、可移植、高性能、多线程以及动态性。
1. 简单性
Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾收集大大简化了程序设计者的内存管理工作。另外,Java也适合于在小型机上运行,它的基本解释器及类的支持只有40KB左右,加上标准类库和线程的支持也只有215KB左右。
2. 面向对象
Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏。而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。
3. 分布性
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其他对象。
4. 健壮性
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。
5. 安全性
用于网络、分布环境下的Java必须要防止病毒的入侵。Java不支持指针, 一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用“特洛伊”木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
6. 体系结构中立
Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平台运行。
7. 可移植性
与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java 系统本身也具有可移植性。
8. 解释执行
Java解释器直接对Java字节码进行解释执行。字节码本身携带了许多编译时信息,使得连接过程更加简单。
9. 高性能
和其他解释执行的语言如BASIC、TCL不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。
10. 多线程
多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行为。
11. 动态性
Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。
7.4.2 Applet与Application
在客户端Java程序具有两种类型:小应用程序(Applet)和应用程序(Application),Applet是嵌入Web文档的程序,而Application则是一般的应用程序。因为Applet主要是用于网络通信,由于传输速度有限,如果较大则下载时间长,因而Applet一般来说规模较小,而对于Application则无此顾虑。
Applet与Application之间的技术差别来源于其运行环境的差别。Applet需要来自浏览器的大量信息:浏览器客户机的位置和大小、嵌入主HTML文档的参数、初始化过程(init)、启动过程(start)、停止过程(stop)、终止过程(destroy)、绘图过程(paint)等等,而Application则相对要简单得多,它来自外部世界的唯一输入就是命令行参数。
以下是一个Java程序,它既能作为Applet又能作为Application。
【实例7-4】同时在网页及Windows窗体中显示Hello World
程序代码如ex7_4.java.ex7_4.html所示。
ex7_4.java
import javax.swing.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class ex7_4 extends Applet{ // 第5行
public static void main(String args[]){
JFrame frame=new JFrame("Application");
ex7_4 app = new ex7_4();
frame.getContentPane().add(app,BorderLayout.CENTER);
frame.setSize(150,100);
frame.setVisible(true);
frame.addWindowListener(new WindowControl(app));
app.init();
app.start();
}
public void paint(Graphics g){
g.drawString("Hello,World!",25,25);
g.drawRect(20,10,80,20);
}
public void destroy(){
System.exit(0);
}
}
class WindowControl extends WindowAdapter{
Applet c;
public WindowControl(Applet c){
this.c=c;
}
public void WindowControl(WindowEvent e){
c.destroy();
}
}
ex7_4.html
ex7_4
假设文件ex7_4.java和ex7_4.html存放在C:\SRC目录下,则运行该程序的过程如下:
(1) 首先需要安装JDK,安装及配置方法可参考本书2.6.1中的具体操作方法。
(2) 在“开始”菜单中单击“运行”或直接用键盘的“Windows键+R”,打开“运行”对话框,在此对话框中输入cmd并按Enter键。
(3) 在弹出的DOS窗口中,键入命令cd \SRC,再按Enter键,将当前目录切换为存放源代码的目录,此时可观察到提示符变为C:\SRC>。
(4) 键入命令“javac ex7_4.java”,再按Enter键,稍等片刻后又回到命令行方式。如果出现提示信息,则说明编译出现了所提示的问题。如果编译成功,则可用dir命令检查是否自动生成了ex7_4.class和Windowcontrol.class文件。
(5) 键入命令java ex7_4,再按Enter键,此时会在桌面的左上角出现如图7-4所示的窗口,其中显示了Hello,World!。
(6) 在“资源管理器”中双击ex7_4.html文件,可以看到如图7-5所示的浏览器中显示的Hello,World!
图7-4 应用程序 图7-5 在浏览器中显示的Applet
注释:
在网站正式运行时,只需要将后缀名为.html的文件和.class文件发布到服务器,.java文件没有必要发布上去,以免代码泄露。
本程序的作用是输出:Hello,World!。但本程序特殊之处在于编译后本程序可以同时在网页中和Windows窗体中显示。首先Applet必须作为java.applet.Applet的子类,而Application则必须有一个公共的方法main()。其次,两者的主线程是不同的,Applet是由方法init()对applet进行初始化的,而Application则从方法main()开始运行程序。Applet由浏览器管理其生命周期(Life Cycle),即生成(new)、初始化(init)、运行(start)、停止(stop)和销毁(destroy)等;而Application则自行管理其生命周期。一般而言,Java的Applet和Application是完全遵照前面的某一种方式进行编写的,但Java允许写出即是Applet又是Application的程序。这样,可以进一步了解Java的内部结构又可以使同一程序运行于不同的运行环境。
在程序第5行的extends Applet,表示程序继承java.applet.Applet类。在类中,重写了父类Applet的paint()方法,其中参数g为Graphics类,它表明当前画板的上下文。在paint()方法中,调用g的方法drawString(),在坐标(25,25)处输出字符串,再调用drawRect()方法画一个矩形。如果作为Application,则由main()方法开始,先生成程序本身的实例将程序加入窗口,然后调用init()方法进行初始化。
注意:
并不是所有的小应用程序都可能同时也是应用程序,因为有一些在小应用程序中的功能不能用于应用程序中,如 Applet.getCodeBase()、Applet.getDocumentBase() 等在 Application 中应用时就会抛异常。而一些在 Application 中可以使用的内容,由于安全问题,也不能在 Applet 中使用,毕竟 Applet 是要发布在网上的,需要更高的安全性。
注释:
近几年Flash 技术发展非常迅速,从界面的友好性,下载速度等很多方面都超过了JavaApplet,并且大有取代Java Applet之势。但是在某些方面Java Applet还是具有优势的,比如:处理复杂数据和实现复杂的逻辑等。
7.4.3 Servlet
可以将Servlet作为服务器端的Applet。它从客户端接收请求,执行设定的操作后,最终将结果返回给客户端。使用servlet的基本流程如下:
● 客户端(很可能是Web浏览器)通过HTTP提出请求。
● Web服务器接收该请求并将其发给servlet。如果这个Servlet尚未被加载,Web服务器将把它加载到Java虚拟机并且执行它。
● Servlet将接收该HTTP请求并执行某种处理。
● Servlet将向Web服务器返回应答。
● Web服务器将从Servlet收到的应答发送给客户端。
由于Servlet是在服务器上执行,不存在类似于Applet的安全性问题。一些很难由applet实现的功能可以利用Servlet并通过CORBA,RMI,socket和本地(native)调用的通信等方式来实现。
注释:
Web浏览器并不直接和Servlet通信,Servlet是由Web服务器加载和执行的。这意味着如果用户的Web服务器有防火墙保护,那么用户的Servlet也将得到防火墙的保护。
由于具有平台无关性,Servlet可以很好地取代CGI脚本,此外Servlet还具有如下的特点。
1. 持久性
Servlet只需Web服务器加载一次,而且可以在不同请求之间保持服务(例如一次数据库连接)。与之相反,CGI脚本是短暂的、瞬态的。每一次对CGI脚本的请求,都会使Web服务器加载并执行该脚本。一旦这个CGI脚本运行结束,它就会被从内存中清除,然后将结果返回到客户端。CGI脚本的每一次使用,都会造成程序初始化过程(例如连接数据库)的重复执行。
2. 与平台无关
Servlet是用Java编写的,它自然也继承了Java的平台无关性。
3. 可扩展性
由于Servlet是用Java编写的,它就具备了Java所能带来的所有优点。Java是健壮的、面向对象的编程语言,它很容易扩展以适应用户的需求,Servlet自然继承了这些特征。
4. 安全性
从外界调用一个Servlet的唯一方法就是通过Web服务器。这提供了高水平的安全性保障,尤其是在用户的Web服务器有防火墙保护的时候。
5. 可在异构的客户机上使用
由于Servlet是用Java编写的,所以可以很方便地在HTML中使用它们,就像使用Applet一样。
【实例7-5】一个简单的Servlet实例
程序代码如ex7_5.java所示。
ex7_5.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ex7_5 extends HttpServlet {
public void service(HttpServletRequest req,HttpServletResponse res) throws IOException
{
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("Hello World!");
out.println("");
out.println("Hello World!
");
}
}
首先在Tomcat服务器的Web应用主目录下(如:C:\Tomcat\webapps\)下建立servletdemo,并添加一个子目录WEB-INF,将编译后的ex7_5.class文件复制到WEB-INF下的class子目录下,再编辑Tomcat的配置文件web.xml,以下是该文件中和本程序有关的片段。
web.xml
ex7_5
examples.servlets. ex7_5
ex7_5
/ex7_5/*
在浏览器中用http://localhost:8080/servletdemo/ex7_5即可完成调用。这个程序用service()方法实现对客户端的响应。在这个响应中,首先是调用了setContextType("text/html")设置响应内容类型。因为要发送文本,用getWriter()方法获得了PrintWriter对象,调用out.println()将要发送给客户端的信息逐行生成。运行后的浏览器显示如图7-6所示,本实例显示的内容很简单,读者可以借助运行该程序掌握Servelet的原理及运行Servlet的过程。
图7-6 简单的Servlet实例
但Java Servlet也不是没有缺点,和传统的CGI、ISAPI/NSAPI方式相同,Java Servlet是利用输出HTML语句来实现动态网页的,如果用Java Servlet来开发整个网站,动态部分和静态页面的整合过程简直就是一场噩梦。这就是为什么SUN还要推出JSP(Java Server Pages)的原因。
7.4.4 JSP
JSP提供了一种简单而快速的方法创建显示动态生成内容的Web页面。JSP技术规范定义了如何在服务器和JSP之间进行交互,描述了页面的格式和语法。它使用XML标签和Scriptlets(一种使用Java语言编写的脚本代码)封装生成页面内容的逻辑。JSP将各种格式的标签(HTML或XML)直接传递给响应的页面。通过这种传送方式,JSP实现了页面逻辑与其设计和显示的分离。按照脚本语言是服务于某一个子系统的语言这种论述,JSP应当被看作是一种脚本语言,然而,作为一种脚本语言,它又显得过于强大了,在JSP中几乎可以使用全部的Java类。JSP在执行时被编译成Servlet,并可调用JavaBean组件或Enterprise JavaBean组件,以便在服务器端处理。因此,JSP技术在构建可升级的基于Web的应用时扮演了重要角色。JSP与Java语言一样,并不局限于任何特定的平台或Web服务器。因此,如果Web服务器没有提供ASP支持,比如使用了Apache或Tomcat等服务器时,可以考虑使用JSP。
注释:
请不要将JSP与服务器端的JavaScript混为一谈。网站服务器会自动将以JSP写成的Java程序代码段转换成Java Servlets。而许多先前必须以Perl手写程序或服务器特定的API(如ASP)控制的功能也都可透过JSP来自动处理。
既然JSP在执行时也要被编译成Servlet,那么在理论上就可以直接编写Servlet创建Web应用。然而,JSP技术通过将页面内容和显示逻辑分开,简化了创建网页的过程。在许多应用程序中,需要将模板内容和动态生成的数据一起发送到客户端。基于这种考虑,使用JSP技术要比全部使用Servlet方便得多。JSP技术具有以下主要优点。
1. 简单实用
JSP可以实现大部分的Servlet功能,并继承了Servlet的优点,弥补了Servlet的不足。JSP使Servlet的动态数据处理和输出格式两者分开,采用了一种类似HTML的格式,使Web应用的维护和修改更加方便。即使不懂Java编程的人员也可以通过标准标签实现JSP的基本功能。
2. 移植性和规范性好
JSP技术和微软公司的ASP技术是竞争关系。JSP使用Java语言作为动态内容生成的编程语言,ASP则主要使用VBScript脚本语言。ASP程序一般运行在微软的IIS服务器上,一旦从Windows平台转到其他平台,就很难再被使用。Java语言则具有更强的适用性和移植性,JSP程序无需改动,就可以在各种平台上运行。
Servlet和JSP是Java技术在Web层的主要技术。Servlet是用Java语言编写的Java类,能动态处理客户请求并构造响应。JSP则基于文本,也能像Servlet一样被执行,更多适用于创建一些静态内容。
JSP既可以用于开发小型的Web站点、也可以用于开发大型的、企业级的应用程序,使用JSP存在几种不同的开发方式。
1. 直接使用JSP
对于最小型的Web站点,可以直接使用JSP来构建动态网页,这种站点最为简单,所需要的仅仅是简单的留言板、动态日期等基本的功能。对于这种开发模式,一般可以将所有的动态处理部分都放置在JSP的Scriptlet中。
2. JSP+JavaBeans
中型站点面对的是数据库查询、用户管理和小量的商业业务逻辑。对于这种站点,不能将所有的东西全部交给JSP页面来处理,而是在其中加入JavaBeans技术()将有助于这种中型网站的开发。利用JavaBeans,将很容易完成如数据库连接、用户登录与注销、商业业务逻辑封装的任务。如:将常用的数据库连接写为一个JavaBeans,既方便了使用,又可以使JSP文件简单而清晰,通过封装,还可以防止一般的开发人员直接获得数据库的控制权。
3. JSP+JavaBeans+Servlet
无论用ASP还是PHP开发动态网站,长期以来都有一个比较重要的问题,就是网站的逻辑关系和网站的显示页面不容易分开,最终的作品也几乎无法阅读。另一方面,动态Web的开发人员也在抱怨,将网站美工设计的静态页面和动态程序合并的过程是一个异常痛苦的过程。
如何解决这个问题呢?在JSP问世以后,人们认为Servlet已经完全可以被JSP代替,然而,事实是Servlet在不再担负动态页面生成的任务以后,开始担负起决定整个网站逻辑流程的任务。在逻辑关系异常复杂的网站中,借助于Servlet和JSP良好的交互关系和JavaBeans的协助,完全可以将网站的整个逻辑结构放在Servlet中,而将动态页面的输出放在JSP页面中来完成。在这种开发方式中,一个网站可以有一个或几个核心的Servlet来处理网站的逻辑,通过调用JSP页面来完成客户端(通常是 Web浏览器)的请求。后面将可以看到,在J2EE模型中,Servlet的这项功能可以被EJB取代。
【实例7-6】显示不同颜色的文字
程序代码如ex7_6.jsp所示。
ex7_6.jsp
JSP test page---HelloWorld!
<%
String[] colors={"red","green","blue","black","gray"};
for (int i = 0 ; i < 5 ; i++)
{
out.println("Hello World! My first jsp page.
");
}
%>
在这个例子中,首先定义了一个包含5个字符串的数组,其中每一个成员都定义了一种颜色,在下面的代码中,使用这5种颜色循环输出文字,该实例运行后浏览器中的显示如图7-7所示。
图7-7 显示不同颜色的文字
7.4.5 J2EE
J2EE(Java 2 Platform,Enterprise Edition)平台建立在J2SE(Java 2 Platform,Standard Edition)的基础上,为企业级应用提供了完整、稳定、安全和快速的Java平台,它是一个标准而不是一个产品。J2EE平台提供的Web开发技术主要支持两类软件的开发和应用,一类是做高级信息系统框架的Web应用服务器(Web Application Server),另一类是在Web应用服务器上运行的Web应用(Web Application)。
J2EE体系结构如图7-8所示。与最终用户进行交互的前端表示组件在逻辑上被划分到了客户层,而提供数据存储与访问功能的组件被划分到了数据层。另一方面,在逻辑上驻留在前端与后端之间的中间层可能由一个表示逻辑层和一个业务层组成。表示逻辑层包括基于Internet协议和Web协议(HTTP、HTTPS、HTML和XML)提供应用功能的组件,业务层由捕获企业业务逻辑的组件组成,这两个层在逻辑上可划分为完全分离的两层,每一个分离的层都是独立的,从而使J2EE支持分布式4层(或者n层)应用。J2EE是一个灵活的结构,它不将开发人员锁定到特定数量的层上,并且不详细规定对于这些逻辑分组的物理分离。在网络计算环境上,一个普通的应用可以在一台计算机上同时运行表示逻辑层和业务层(甚至可以包括数据层),而高级的应用可以在若干台计算机上从物理上分隔每一层。
图7-8 J2EE体系结构
在J2EE的开发模型中,通常整个系统可分为3个主要的部分。
1. 视图
视图就是用户界面部分,在Web应用程序中也就是HTML、XML、JSP页面。这个部分主要处理用户看到的东西,动态的JSP部分处理了用户可以看见的动态网页,而静态的网页则由HTML、XML输出。
2. 控制器
控制器负责网站的整个逻辑。它用于管理用户与视图发生的交互。可以将控制器想像成处在视图和数据之间,对视图如何与模型交互进行管理。通过使视图完全独立于控制器和模型,就可以轻松替换前端客户程序,就是说,网页制作人员将可以独立自由地改变Web页面而不用担心影响这个基于Web的应用程序的功能。
在J2EE中,控制器的功能一般是由Servlet、JavaBeans、Enterprise JavaBeans(EJB,定义了一个用于开发基于组件的企业多重应用程序的标准)中的SessionBean来担当的。
3. 模型
模型就是应用业务逻辑部分,这一部分的主要角色是Enterprise JavaBeans,借助于EJB强大的组件技术和企业级的管理控制,开发人员可以轻松形创建出可重用的业务逻辑模块。
注释:
J2EE较为复杂,此处仅对它做了简要的介绍。如希望获取更详细的资料,请读者参考专门介绍J2EE的书籍。
由于J2EE这个平台没有能够提供一个令人满意的应用程序编程模型(Application Programming Model)。Sun公司和一些大的应用服务器供应商都想用开发工具来降低J2EE开发的复杂性,但是很多J2EE开发工具自动产生的代码像这些工具本身同样复杂。因此很多开发者选择了另外一种开发方式:Struts、Hibernate和Spring Framework,它们都是能降低J2EE开发难度的开发框架,使用它们可以大大加快开发的速度。
7.5 不同的动态主页技术比较
7.5.1 CGI
CGI是Common Gateway Interface(通用网关接口)的简写,它是一个Web服务器主机提供信息服务的标准接口,通过提供这样一个标准接口,Web服务器能够执行应用程序并将它们的输出,如文字和图形、声音等传递给一个Web浏览器。
一般来说,CGI标准接口的功能就是在超文本文档与服务器应用程序之间传递信息。如果没有CGI,Web服务器只能提供静态文本或者连接到其他服务器。可以这样毫不夸张地说,有了CGI,万维网才变得更为实用,界面才变得更为友好,信息服务才变得更为丰富多彩。
CGI是一个连接外部应用程序到信息服务器(比如HTTP或者网络服务器)的标准。一个简单的HTML文档是无交互后台程序,它是静态的,也就是说它处于一个不可变的状态,即文本文件不可以变化。相反地,CGI程序是可以实时执行地,它可以输出动态的信息。CGI技术原理图如图7-9所示。
图7-9 CGI技术原理图
CGI程序可以用任何的语言来编写,并且可以在Windows/Linux 系统中执行:C/C++,PERL、Visual Basic等。实际PHP、ASP等也可以算是CGI脚本语言,从这个角度看CGI脚本语言最出色的是Perl。
下面是一个简单的Perl程序:
#! /usr/bin/perl
print "你好! 欢迎学习Web开发基础! \n";
这里的第一行说明了这是一个Perl程序,它也是Perl的注释,注释是从#开始至该行结束的所有文字。
第二行是程序的可执行部分,此处只有一条print语句,如果用户曾学过C语言,这门语言是很容易掌握的。
7.5.2 ISAPI/NSAPI
CGI程序每接收到一个来自于浏览器的请求就要在系统中创建一个新的进程,从磁盘上装载可执行映像,并在完成时再把它全部清除。另外,在每一次调用时有些资源(如数据库连接资源)必须重新建立,它们既不能被缓存也不能被重用。这样当站点的访问人数激增时,Web服务器的性能也必将直线下降。另外,它的数据库连接功能比较弱,某些情况下甚至还会降低数据库的存取速度。
由于CGI存在着前面所说的缺点,必然引起性能有较大改善的API(Application Program Interface)接口的出现。ISAPI/NSAPI网关程序的最大优点在于当它在服务器端第一次被执行的时候即被调入内存,在本次请求结束后也不需退出。这样无论浏览器传送过来多少个请求,在服务器端都由同一个进程进行响应,执行效率高且能保持跟数据库之间的高效连接。但是服务器必须同时启动多个线程来处理多台浏览器同时对同一ISAPI/NSAPI网关程序的进程发出请求,这就加大了开发的难度。此外,ISAPI/NSAPI网关程序可以使用各种高级语言进行开发,如:Visual C++,DELPHI等。
7.5.3 ASP
Active Server Pages (动态服务器主页,简称ASP)是一套微软开发的服务器端运行的脚本平台,ASP内含于IIS当中,目前IIS最高版本为Vista操作系统中包含的7.0版本。
通过ASP用户可以结合HTML网页、ASP指令和ActiveX组件建立动态、交互且高效的WEB服务器应用程序。同时,ASP也支持VBScript和JavaScript等脚本语言,默认为VBScript。
ASP是经过服务器解析之后再向浏览器返回数据,所以有了ASP就不必担心客户的浏览器是否能运行你所编写的代码。因为所有的程序都将在服务器端执行,包括所有嵌在普通HTML中的脚本程序。当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。
但是这样也导致一个问题,运行ASP页面相对于普通的HTML页面要慢一点,因为普通的HTML页面只需要浏览器就能够解析,而ASP则必须是服务器将整页的代码都执行一篇之后再发送数据。
ASP的代码是需要经过服务器执行之后才向浏览器发送的,所以在客户端看到的只能是经过解析之后的数据,而无法获得源代码,故编写者不用担心自己的代码会被别人剽窃。
1. ASP的特点
(1) 无须Compile编译:容易产生,无须Compile 编译或Link 链接即可执行。集成于HTML中。使用常规文本编辑器,如Windows的记事本,即可设计。
(2) 与浏览器无关(Browser Independence):用户端只要使用常规的可执行HTML的浏览器,即可浏览Active Server Pages 所设计的主页内容,Script 语言(VBScript,JScript)是在站点服务器(Server端)执行,用户不需要执行这些Script语言。
(3) 面向对象(Object Orient).可通过ActiveX Server Components(ActiveX服务器组件)来扩充功能。ActiveX Server Component,可使用Visual Basic,Java,Visual C++,COBOL等语言来实现。
(4) 任何ActiveX Scripting语言兼容。除了可使用VBScript或JScript语言来设计,并可通过Plug-in的方式,使用由third party所提供的其他譬如REXX,perl,Tcl 等scripting语言。script引擎是处理script的COM(Component Object Model)对象。
(5) ASP脚本服务器解析:可以保护辛辛苦苦写出来的源程序不会外泄。传到用户浏览器的是Active Server Pages执行的结果的常规HTML码。
2. ASP的对象
Active Server Pages提供五个内置的“对象”(object),可以直接调用。
(1) Request:取得用户信息。
(2) Response:传送信息给用户。
(3) Server:提供访问服务器的方法(methods)和属性(properties)的功能。
(4) Application:一个应用程序,可以在多个主页之间保留和使用一些共同的信息。
(5) Session:一个用户,可以在多个主页之间保留和使用一些共同的信息。在多个主页之间共享信息。
3. ASP页面间的参数传递
ASP开发的应用程序,可以在多个主页之间保留和使用一些共同的信息,ASP提供两种适用范围,如下。
(1) Application:Application 的所有信息,在一个应用程序,多个主页之间,可以让所有的用户共同使用。
(2) Session:Session的所有信息,仅适用于一个用户。
4. ASP典型应用系统
国内以ASP语言开发的各种web系统很多,部分国内常用的系统包括:EShop网店购物系统、动网论坛系统、LeadBBS急速论坛、LBlog 博客系统、Oblog博客系统、动易管理系统、风讯CMS内容管理系统、乔客整站系统等。
5. ASP的使用
Active Server Pages(ASP)制作成.ASP扩展名的文件,一个.ASP文件是一个文本文件,包括:
(1) HTML标签(tags)
(2) VBscript 或JavaScript语言的程序码
(3) ASP的语法
ASP并不是一个script语言,而是提供一个可以集成script语言(VBscript或 JavaScript)到HTML主页的环境。
HTML标签(tags)使用“<...>”将HTML程序码包含起来,以与常规的文本区分开来;而ASP使用“<%...%>”将ASP的script程序码包含起来。
【实例7-7】显示现在的日期时间
程序代码如ex7_7.asp所示。
ex7_7.asp
现在是:<%=Now%>
该程序运行后显示当前的日期时间,其运行结果如图7-10所示。
图7-10 显示现在的日期时间
注意:
ASP目前只能运行在微软的Windows平台上。在Windows XP系统中,有时IIS在Windows初始安装时未被选中,所以必须在控制面板中将IIS安装后才能正常运行ASP。
【实例7-8】重复循环显示
程序代码如ex7_8.asp所示。
ex7_8.asp
<%for i = 1 to 7 %>
color=#0000ff>掌握动态主页技术,未来在我脚下!
<%next%>
这个例子利用了ASP提供的循环,在用户端浏览器显示5个重复的句子;随着循环次数的增加,字体越来越大。其运行结果如图7-11所示。
图7-11 重复循环显示
7.5.4 PHP
1. PHP是什么
PHP是超文本预处理器(PHP: Personal Hypertext Preprocessor)。1995年,Rasmus Lerdorf为了创建他的在线简历而创造了“个人主页工具”(Personal Home Page Tools)。当时是一种非常简单的语言。1997年,Zeev Suraski和Andi Gutamns加以完善。其后越来越多的人注意到了这种语言并对其扩展提出了各种建议。在许多人的无私奉献下以及这种语言本身的源代码自由性质,它演变成为一种特点丰富的语言,而且现在还在成长中。
PHP是完全免费的,不用花钱,可以从PHP官方站点(http://www.PHP.net)自由下载。PHP遵守GNU公共许可(GPL),在这一许可下诞生了许多流行的软件诸如Linux和Emacs。PHP在大多数Unix平台,GUN/Linux和微软Windows平台上均可以运行。怎样在Windows环境的PC机器或Unix机器上安装PHP的资料可以在PHP官方站点上找到。实例上安装过程很简单。
2. PHP的版本及其特色
PHP最新是PHP5,PHP5相比PHP4,是一个飞跃。PHP5处理对象部分的内核完全重新开发过,提供更多功能的同时也提高了性能。
其中PHP5三大特色功能为:
● 新的对象模式 (New Object Mode)
● 异常处理 (Exceptions)
● 名称空间 (Namespace)
熟悉.NET,JAVA,C++等面向对象开发的读者会发现PHP5已经完全面向对象化了。
3. 使用PHP构建典型Web系统
以PHP开发的广受欢迎的Web系统有:ShopEX网店系统、Discuz!论坛、PHPWIND论坛、PHPBB论坛、VBB论坛、OsCommerce网店、SABlog博客、Plog博客、CMSware 内容管理、DedeCMS 织梦、Molyx论坛等。
4. PHP开发相关应用系统的整合
PHP开发组合通常是:PHP+Mysql+Zend+IIS/Apache。
Mysql4.0:Mysql是一套优秀的开源数据库系统,可以参看相关介绍。PHP支持各种类型的数据库,但由于PHP和Mysql都归于开源软件,两者结合在Web开发上表现优异。
Zend优化器:Zend优化器可以对PHP代码加密,保护PHP代码的安全性,更重要的是Zend优化器可以极大地提高PHP程序运行效率。经过Zend优化器优化后的代码比未加密优化的代码运行效率可以提高3-10倍。
IIS/Apache Web服务器:IIS是Microsoft 提供的优秀的Web服务器。性能稳定安全,功能强大。Apache是一个优秀的开源Web服务器。在Linux上应用广泛。
5. PHP应用误区
误区1:PHP只在Linux+Apache平台上运行。实际上PHP可以在各种流行平台上运行。 Windows/Linux 都是可以支持的,Windows2003+IIS6+PHP5 的运行性能表现绝对可以和 Linux+Apache+PHP 相同甚至更高。并且安全上更加出色。
误区2:PHP使用的很少。国外很多网站是以PHP开发的,这相比国内的情况形成鲜明的对比,现在国内PHP的应用正慢慢扩大。实际国内很多大型的网络公司都使用了PHP进行开发,典型的有:腾讯、雅虎、163和百度等。
6. PHP的优点
(1) 学习过程简单
PHP的学习过程非常简单。与Java和Perl不同的是,对于PHP只需了解基本的语法和特色,就可以开始编码了。在编码过程中如果遇到了什么麻烦,还可以查阅相关文档。
PHP的语法与C,Perl,ASP或者JSP类似。对于那些对上述语言较熟的人来说,PHP非常简单。PHP的核心语法只需要30分钟就可以基本掌握。
(2) 数据库连接
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的组合,当然也可以自己编写外围的函数去间接存取数据库。通过这样的途径,在更换不同的数据库产品时,就可以轻松地更改编码以适应变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。
(3) 可扩展性
就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
(4) 面向对象编程
PHP提供了类和对象。基于web的编程工作非常需要面向对象编程能力。PHP支持构造器、提取类等。
(5) 可伸缩性
传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
PHP的开发者们为了更适合web编程,还开发了许多外围的类库,这些库中包含了更易用的层。可以利用PHP连接包括Oracle,MS-Access,Mysql在内的大部分数据库,也可以编写程序下载或者显示e-mail,甚至完成网络相关的功能。
7.5.5 不同开发技术之间的比较
表7-1对四种常见的开发方法做了比较。
表7-1 不同开发方式的比较
后台界面
CGI
ASP
PHP
JSP/Servlet
操作系统
几乎所有
Win32
几乎所有
几乎所有
服务器
几乎所有
IIS
非常多
非常多
执行效率
慢
快
很快
极快
稳定性
高
中等
高
非常高
开发时间
长
短
短
中等
修改时间
长
短
短
中等
程序语言
不限,几乎所有
VB
PHP
仅支持Java
网页结合
差
优
优
优
学习门槛
高
低
低
较高
函数支持
不定
少
多
多
系统安全
佳
低
佳
极佳
使用网站
多
多
超多
目前一般
更新速度
无
慢
快
较慢
JSP同样是实现动态网页的一个利器。由于脚本语言是Java,所以继承了Java诸多优点。那么与ASP相比,应该可以说ASP和JSP基本不是一个档次上的。那么ASP.NET和JAVA却是可以抗衡的。
1. JSP与ASP
无论在运行速度、运行开销、运行平台、扩展性、安全性、函数支持、厂商支持、对XML的支持等方面,ASP都不是JSP的对手。COM组件的复杂性使得这种方式有一定的难度,而JAVABeans和JAVA的结合却是天衣无缝的。
JSP是实现动态网页的一个利器。由于它的脚本语言是JAVA,所以继承了JAVA诸多优点。那么与ASP相比,应该可以说ASP和JSP基本不是一个档次上的,但是ASP.NET从某种程度上说,是可以与JAVA相抗衡的。
2. JSP与ASP.NET
以下试从几个不同方面对这两种技术进行分析和比较。
(1) 面向对象
与Java一样,ASP.NET支持C#等几种面向对象编程语言。C#将成为微软所推出的与Java类似的一种语言,与Java相比,因为它可以和Windows环境紧密集成它的性能更好。
(2) 数据库连接
ASP另一个亮点是它使用ADO、ODBC和OLE-DB等事务处理管理器,因此用它开发 Web数据库应用特别简单。而ASP.NET具备了更多的功能,比如ADO+带来了更强大更快速的功能。JSP和JDBC目前在易用性和性能上同ASP/ADO相比已有些落后,当新版本ASP/ADO+出现后这样的差别可能还会更加明显。
(3) 大型站点应用
ASP.NET对于企业级的大型站点有更好的支持。事实上,微软在这方面付出了巨大的努力。ASP.NET考虑到多服务器(multiple servers)的场合,只需要增加服务器就可以在一定范围内增加性能,而且整个.Net框架已经充分地提供了这个方法。ASP.NET提供了外部会话状态(External Session State)来提供对大型站点的支持。此外,由于请求的各组件相互间经过了充分的优化,所以速度较快。
ASP.NET现在可以在大型项目方面具有与JSP几乎相同的能力。ASP.NET还有价格方面的优势,因为所有的组件将是服务器操作系统的一部分。对于JSP,则需要购买昂贵的应用服务器群才能达到同样的目的。
(4) ASP.NET还提供更多的其他方面的新特性,包括:
● 内置的对象缓存和页面结果缓存
● 内置的XML支持,可用于XML数据集的简单处理
● 服务器控制提供了更充分的交互式控制
(5) JSP的优势
首先,JSP有一项全新的技术—— Servlet(服务器端程序),这很好地节约了服务器资源。此外,Java良好的跨平台特性是ASP.NET所不具备的。
3. PHP与ASP.NET
提到Web开发,很多技术都涉及预处理,即利用特定的标记将代码嵌入到HTML页面中,这些标记告诉预处理器,它们包含代码,需要对它们预先作出处理。与 CGI 类似,这些代码都是在服务器端运行的。开放源码的脚本语言 PHP 和ASP.NET 框架中的语言都属于这种类型。实际上,JSP和Perl也是以这种方式运行的。
与ASP.NET相比,PHP 5 仍然存在一些缺点,包括缺少异常和基于事件的错误处理。 另一个弱点是 PHP 的函数名是不区分大小写的,虽然这不是一个致命的问题,这一点可能带来隐藏的错误。另外,PHP 不是专门设计为一种面向对象的语言。
PHP的优势在于,它是开放源码的,可以自行修改。此外,PHP可以与Apache很好地协调工作(可以作为一个模块编译,或直接编译成 Apache 二进制文件),而Apache 能运行在 Windows、Linux、Solaris 和各种其他 Unix 平台上。此外,使用拥有 Apache 的跟踪记录的 Web 服务器意味着安全性能够保持在最高的优先级上。最后,PHP 拥有更小的代码路径,这意味着更少地分析和执行 PHP 页面服务器端代码,这将带来更高效的内存和使用率以及更快的运行。
7.6 本 章 小 结
本章主要介绍了用于WEB开发中的各种动态主页技术,包括: CGI、ASP、ASP.NET、Java Servlet、Java Applet、Servlet、JSP、J2EE、PHP和ISAPI/NSAPI等。读者可以结合实例,进行横向比较,从而了解各种技术的基本特点、所应用的平台、优势以及可能存在的不足之处等。
7.7 思考和练习
1. Java Applet与前面介绍的多种动态主页技术,最大的不同之处是什么?
2. 在Linux操作系统下进行Web开发,目前有哪些动态主页技术可以选择?
??
??
??
??
? 302 ?
网站设计与Web应用开发技术
? 303 ?
第7章 服务器端开发—— 动态主页技术基础