centOS用-Apache-构建-HTTP-服务器_第1页
centOS用-Apache-构建-HTTP-服务器_第2页
centOS用-Apache-构建-HTTP-服务器_第3页
centOS用-Apache-构建-HTTP-服务器_第4页
centOS用-Apache-构建-HTTP-服务器_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE PAGE 26 (最近更新日:2006/08/26)前言对于大多数的网络服务器,最广泛的功能就是开通HTTP服务,达到开放和发布网站的目的。目前绝大多数的网络交互程序,例如论坛、社区等等也是基于HTTP而建立的。在这里,我们通过Web服务器软件中使用量超过半数的自由软件Apache,来构建一台能够满足实际要求的多功能Web服务器,使它能够在我们发布网页的基础上,实现可以运行Perl、PHP的等等语言编写的交互程序,以及在虚拟主机、保密方面的功能。安装HTTP(Apache)服务器及相关组件首先来安装Apache服务器及相关组件。这里使用yum命令来在线安装。rootsample #

2、yum -y install httpd 在线安装httpdSetting up Install ProcessSetting up repositoriesdag 100% |=| 1.1 kB 00:00update 100% |=| 951 B 00:00base 100% |=| 1.1 kB 00:00addons 100% |=| 951 B 00:00extras 100% |=| 1.1 kB 00:00Reading repository metadata in from local filesReducing Dag RPM Repository for Red Hat E

3、nterprise Linux to included packages onlyFinishedParsing package install argumentsResolving Dependencies- Populating transaction set with selected packages. Please wait. Downloading header for httpd to pack into transaction set.httpd-2.0.52-28.ent.cento 100% |=| 62 kB 00:00 Package httpd.i386 0:2.0.

4、52-28.ent.centos4 set to be updated- Running transaction check- Processing Dependency: libaprutil-0.so.0 for package: httpd- Processing Dependency: apr = 0.9.4-24.2 for package: httpd- Processing Dependency: libapr-0.so.0 for package: httpd- Processing Dependency: httpd-suexec for package: httpd- Re

5、starting Dependency Resolution with new changes.- Populating transaction set with selected packages. Please wait. Downloading header for apr to pack into transaction set.apr-0.9.4-24.5.c4.1.i386. 100% |=| 7.5 kB 00:00 Package apr.i386 0:0.9.4-24.5.c4.1 set to be updated Downloading header for httpd-

6、suexec to pack into transaction set.httpd-suexec-2.0.52-28.en 100% |=| 22 kB 00:00 Package httpd-suexec.i386 0:2.0.52-28.ent.centos4 set to be updated Downloading header for apr-util to pack into transaction set.apr-util-0.9.4-21.i386.rp 100% |=| 5.2 kB 00:00 Package apr-util.i386 0:0.9.4-21 set to

7、be updated- Running transaction check Dependencies Resolved=Package Arch Version Repository Size=Installing:httpd i386 2.0.52-28.ent.centos4 update 888 kInstalling for dependencies:apr i386 0.9.4-24.5.c4.1 base 88 kapr-util i386 0.9.4-21 base 51 khttpd-suexec i386 2.0.52-28.ent.centos4 update 28 kTr

8、ansaction Summary=Install 4 Package(s)Update 0 Package(s)Remove 0 Package(s)Total download size: 1.0 MDownloading Packages:(1/4): apr-0.9.4-24.5.c4. 100% |=| 88 kB 00:00(2/4): httpd-suexec-2.0.5 100% |=| 28 kB 00:00(3/4): httpd-2.0.52-28.en 100% |=| 888 kB 00:02(4/4): apr-util-0.9.4-21. 100% |=| 51

9、kB 00:00warning: rpmts_HdrFromFdno: V3 DSA signature: NOKEY, key ID 443e1821Public key for apr-0.9.4-24.5.c4.1.i386.rpm is not installedRetrieving GPG key from /centos/RPM-GPG-KEY-centos4Importing GPG key 0 x443E1821 CentOS-4 key Key imported successfullyRunning Transaction TestFinished Transaction

10、TestTransaction Test SucceededRunning TransactionInstalling: apr # 1/4Installing: apr-util # 2/4Installing: httpd # 3/4Installing: httpd-suexec # 4/4Installed: httpd.i386 0:2.0.52-28.ent.centos4Dependency Installed: apr.i386 0:0.9.4-24.5.c4.1 apr-util.i386 0:0.9.4-21 httpd-suexec.i386 0:2.0.52-28.en

11、t.centos4Complete!为了使服务器开通HTTP服务后能够运行PHP编写的交互程序,接下来安装PHP。rootsample # yum -y install php 在线安装PHPSetting up Install ProcessSetting up repositoriesReading repository metadata in from local filesReducing Dag RPM Repository for Red Hat Enterprise Linux to included packages onlyFinishedParsing package in

12、stall argumentsResolving Dependencies- Populating transaction set with selected packages. Please wait. Downloading header for php to pack into transaction set.php-4.3.9-3.15.i386.rpm 100% |=| 23 kB 00:00 Package php.i386 0:4.3.9-3.15 set to be updated- Running transaction check- Processing Dependenc

13、y: php-pear for package: php- Restarting Dependency Resolution with new changes.- Populating transaction set with selected packages. Please wait. Downloading header for php-pear to pack into transaction set.php-pear-4.3.9-3.15.i386. 100% |=| 33 kB 00:00 Package php-pear.i386 0:4.3.9-3.15 set to be u

14、pdated- Running transaction check Dependencies Resolved=Package Arch Version Repository Size=Installing:php i386 4.3.9-3.15 update 1.3 MInstalling for dependencies:php-pear i386 4.3.9-3.15 update 266 kTransaction Summary=Install 2 Package(s)Update 0 Package(s)Remove 0 Package(s)Total download size:

15、1.6 MDownloading Packages:(1/2): php-pear-4.3.9-3.1 100% |=| 266 kB 00:00(2/2): php-4.3.9-3.15.i38 100% |=| 1.3 MB 00:01Running Transaction TestFinished Transaction TestTransaction Test SucceededRunning TransactionInstalling: php # 1/2Installing: php-pear # 2/2Installed: php.i386 0:4.3.9-3.15Depende

16、ncy Installed: php-pear.i386 0:4.3.9-3.15Complete!为了使PHP应用程序的执行效率大幅度提高,我们安装Zend。rootsample # wget /optimizer/3.0.1/ZendOptimizer-3.0.1-linux-glibc21-i386.tar.gz 下载Zend的源代码-13:19:06- /optimizer/3.0.1/ZendOptimizer-3.0.1-linux-glibc21-i386.tar.gz= ZendOptimizer-3.0.1-linux-glibc21-i386.tar.gzResolving

17、 . 1Connecting to |1|:80. connected.HTTP request sent, awaiting response. 200 OKLength: 6,358,090 (6.1M) application/gzip100%= 6,358,090 240.53K/s ETA 00:0013:19:33 (238.15 KB/s) - ZendOptimizer-3.0.1-linux-glibc21-i386.tar.gz saved 6358090/6358090rootsample # tar zxvf ZendOptimizer-3.0.1-linux-glib

18、c21-i386.tar.gz 展开被压缩的源代码rootsample # cd ZendOptimizer* 进入Zend的源代码目录rootsample ZendOptimizer-3.0.1-linux-glibc21-i386# ./install.sh 运行安装脚本然后会出现对话方式的安装向导,图样如下:1 选择OK,进入安装向导。2 阅读协议后,选择EXIT。3 选择Yes同意使用协议。4 设置安装目录,这里以默认的/usr/local/Zend为例,然后选择OK进入下一步。 5 设置PHP配置文件所在的位置,一般为/etc(默认),如果PHP的配置文件在别处的话,请根据实际情况设

19、置。6 被询问是否使用Apache服务器,这里选择Yes。7 设置Apache的路径,这里保持默认,选择OK进入下一步。8 选择OK进入下一步。9 然后开始安装稍等片刻,安装完成后,提示安装成功,选择OK进入下一步。10 选择No,不重新启动HTTP服务(由于Apache也刚刚安装完毕,还没有被启动过。为了安全,等我们将Apache配置完毕后,再启动HTTP服务。)。然后会出现命令行 - Zend Optimizer安装完毕。 rootsample ZendOptimizer-3.0.1-linux-glibc21-i386# cd 回到root根目录rootsample # rm -rf Z

20、endOptimizer* 删除安装后遗留的源文件及目录配置HTTP(Apache)服务器接下来,为了使服务器更安全以及更加符合我们的实际要求,对默认的设置进行一些必要的更改。尤其在一些细节方面,越少向外界透露服务器的信息,就越能保证服务器的安全。rootsample # vi /etc/httpd/conf/httpd.conf 编辑Apache的配置文件# Dont give away too much information about all the subcomponents# we are running. Comment out this line if you dont min

21、d remote sites# finding out what major optional modules you are runningServerTokens OS 找到这一行,将“OS”改为“Prod”(在出现错误页的时候不显示服务器操作系统的名称)ServerTokens Prod 变为此状态# # Optionally add a line containing the server version and virtual host# name to server-generated pages (internal error documents, FTP directory#

22、listings, mod_status and mod_info output etc., but not CGI generated# documents or custom error documents).# Set to EMail to also include a mailto: link to the ServerAdmin.# Set to one of: On | Off | EMail#ServerSignature On 找到这一行,将“On”改为“Off”ServerSignature Off 在错误页中不显示Apache的版本# ServerAdmin: Your

23、address, where problems with the server should be# e-mailed. This address appears on some server-generated pages, such# as error documents. e.g. admin#ServerAdmin rootlocalhost 将管理员邮箱设置为自己常用的邮箱 ServerAdmin yourname 根据实际情况修改默认设置# ServerName gives the name and port that the server uses to identify its

24、elf.# This can often be determined automatically, but we recommend you specify# it explicitly to prevent problems during startup.# If this is not set to valid DNS name for your host, server-generated# redirections will not work. See also the UseCanonicalName directive.# If your host doesnt have a re

25、gistered DNS name, enter its IP address here.# You will have to access it by its address anyway, and this will make# redirections work in a sensible way.#ServerName :80 修改主机名ServerName :80 根据实际情况修改,端口号保持默认的80# Possible values for the Options directive are None, All,# or any combination of:# Indexes

26、Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews# Note that MultiViews must be named *explicitly* Options All# doesnt give it to you.# The Options directive is both complicated and important. Please see# /docs-2.0/mod/core.html#options# for more information.#Options Indexes FollowSymL

27、inks 找到这一行,删除“Indexes”,并添加“Includes”、“ExecCGI”Options Includes ExecCGI FollowSymLinks 允许服务器执行CGI及SSI# AddHandler allows you to map certain file extensions to handlers:# actions unrelated to filetype. These can be either built into the server# or added with the Action directive (see below)# To use CG

28、I scripts outside of ScriptAliased directories:# (You will also need to add ExecCGI to the Options directive.)#AddHandler cgi-script .cgi 找到这一行,去掉行首的“#”,并在行尾添加“.pl”AddHandler cgi-script .cgi .pl 允许扩展名为.pl的CGI脚本运行# AllowOverride controls what directives may be placed in .htaccess files.# It can be Al

29、l, None, or any combination of the keywords:# Options FileInfo AuthConfig Limit#AllowOverride None 找到这一行,将“None”改为“All”AllowOverride All 变为此状态,允许.htaccess# # The following directives define some format nicknames for use with# a CustomLog directive (see below).#LogFormat %h %l %u %t %r %s %b %Referer

30、i %User-Agenti combined 找到这一行LogFormat %h %l %u %t %!414r %s %b %Refereri %User-Agenti combined 改为此状态(添加“!414”到规则中,对于过长的日志不记录)# Specify a default charset for all pages sent out. This is# always a good idea and opens the door for future internationalisation# of your web site, should you ever want it.

31、 Specifying it as# a default does little harm; as the standard dictates that a page# is in iso-8859-1 (latin1) unless specified otherwise i.e. you# are merely stating the obvious. There are also some security# reasons in browsers, related to javascript and URL parsing# which encourage you to always

32、set a default char set.#AddDefaultCharset UTF-8 找到这一行,在行首添加“#”#AddDefaultCharset UTF-8 不使用UTF-8作为网页的默认编码AddDefaultCharset GB2312 并接着添加这一行(添加GB2312为默认编码) 找到这一个标签,并在标签中更改相应选项Options Indexes MultiViews 找到这一行,将“Indexes”删除 Options MultiViews 变为此状态(不在浏览器上显示树状目录结构)AllowOverride NoneOrder allow,denyAllow fr

33、om allrootsample # rm -f /etc/httpd/conf.d/welcome.conf /var/www/error/noindex.html 删除测试页启动HTTP服务然后,启动HTTP服务。rootsample # chkconfig httpd on 设置HTTP服务自启动rootsample # chkconfig -list httpdhttpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 确认2-5为on的状态就OKrootsample # /etc/rc.d/init.d/httpd start 启动HTTP服务Starti

34、ng httpd: OK 启动成功会出现OK如果启动失败的话,会出现错误信息。原因可能是因为httpd.conf文件编辑过程中的失误,请检查httpd.conf。 然后,初步对HTTP服务进行简单测试。如下:rootsample # echo hello /var/www/html/index.html 建立测试页 然后,在下面输入服务器的IP地址,或域名(通过ifconfig命令可以看到IP地址;或者通过前面介绍过的“动态域名的申请”中的方法设置成功的域名来测试。)窗体顶端Hostname: 窗体底端 如果成功的话会出现类似如下的页面:然后,删除刚刚建立的测试页。rootsample # r

35、m -f /var/www/html/index.html 删除测试页 对HTTP服务进行全面测试1 对HTML格式网页正确显示的测试rootsample # vi /var/www/html/index.html 建立测试页,内容如下:Hello,World!Hello,World!然后在浏览器中输入“http:/服务器IP地址”或者“http:/你的域名”,如果出现“Hello,World!”,并且浏览器读取编码为简体中文,就OK。为了在这之后测试.htaccess,将默认为主页的index.html测试页删除。 rootsample # rm -f /var/www/html/index

36、.html 删除刚刚测试用的网页 2 对CGI的支持进行测试rootsample # vi /var/www/html/test.cgi 建立CGI测试页,内容如下:#!/usr/bin/perlprint Content-Type: text/htmlnn;print ; print Hello,World!CGI is working!;print ;rootsample # chmod 755 /var/www/html/test.cgi 然后将CGI测试文件属性设置为755然后在浏览器中输入“http:/服务器IP地址/test.cgi”或者“http:/你的域名/test.cgi”,

37、如果正确显示“Hello,World!CGI is working!”,说明对于CGI的支持没有问题。3 对PHP的支持进行测试rootsample html# vi /var/www/html/test.php 建立PHP测试文件,内容如下:然后在浏览器中输入“http:/服务器IP地址/test.php”或者“http:/你的域名/test.php”后,正确的显示出了服务器上PHP的详细信息,说明对PHP可以正确的支持。4 对SSI进行测试 rootsample # vi /var/www/html/test.shtml 建立SSI测试页,内容如下:Hello,World!TEST SSI

38、然后在浏览器中输入“http:/服务器IP地址/test.shtml”或者“http:/你的域名/test.shtml”,如果正确显示当时的日期和时间,说明对于SSI的支持没有问题。5 对.htaccess的支持进行测试rootsample # vi /var/www/html/index.shtml 建立.htaccess测试用的页,内容如下:Hello,World!The name of the file is 然后在浏览器中输入“http:/服务器IP地址”或者“http:/你的域名”,如果显示“Forbidden”,说明.htaccess正常。然后建立一个.htaccess文件,并定义

39、相应规则,如下:rootsample html# vi /var/www/html/.htaccess 建立.htaccess文件,内容如下:DirectoryIndex index.shtml这时,再次在浏览器中输入“http:/服务器IP地址”或者“http:/你的域名”,如果正确显示“ The name of the file is index.shtml”,说明.htaccess中的规则生效状态,OK。6 删除测试用的遗留文件rootsample html# rm -f /var/www/html/* /var/www/html/.htaccess 删除测试用过的遗留文件附录资料:从

40、XML 生成可与 Ajax 共同使用的 JSON时下,非常流行使用 JavaScript 代码为数据驱动的 Web 应用程序添加互动性。若能将数据编码成 JavaScript Object Notation(JSON)的格式,您就可以更轻松地通过 JavaScript 语言使用它。通过本文,发掘使用 XSLT V2 从 XML 数据生成 JSON 的几种不同方法。几年前,许多开发人员很看好 XML、XSLT、Extensible HTML (XHTML)和其他一些基于标记的语言。现在,Asynchronous JavaScript and XML(AJAX)成了新的热点,人们又将目光转向了使用

41、 JavaScript 代码的数据驱动的富 Internet 应用程序。但是开发人员是否已经消除了 XML 和这一新技术之间的鸿沟呢?当然,您可以在 Web 客户机中使用 XML 解析器来读取数据,但这种做法会带来两个问题。第一,出于安全方面的原因,XML 数据只能从与此页面相同的那个域中读取。这虽然不是什么大的限制因素,但它的确会引起部署方面的问题,还会阻碍 DHTML 小部件的创建。第二,读取和解析 XML 会非常慢。另一种做法是让服务器执行 XML 的解析工作,方法是设置服务器,使之向浏览器发送以 JavaScript 代码或时下流行的 JavaScript Object Notatio

42、n(JSON)编码的数据。本文将展示如下三种使用 XSLT V2 语言和 Saxon XSLT V2 处理器从 XML 数据生成 JSON 的技巧: 简单编码 通过函数调用加载数据 编码对象 JSON 简介要学习如何将数据编码成 JSON(它只是 JavaScript 的一个子集),最好的方法是从数据开始。清单 1 显示了书籍列表的一个示例 XML 数据集。清单 1. 基本的图形化图书馆 Code Generation in Action JackHerrington Manning PHP Hacks JackHerrington OReilly Podcasting Hacks JackH

43、errington OReilly 这个数据集很简单,只包含三本书,每本书都具有惟一的 ID、书名、作者姓名及出版商的名字。(没错,我只选择了我自己的书作为数据集,但能怨我吗?这些书实在是不可多得的节日和生日礼物。)清单 2 显示了这些数据在 JSON 中的效果。清单 2. JSON 中的示例数据集 id: 1, title: Code Generation in Action, first: Jack, last: Herrington, publisher: Manning , . 方括号 () 表明这是一个数组。大括号 () 则表明这是一个散列表,该散列表由一组名称和值对组成。在本例中,

44、我创建了一个散列表的数组 用来存储这类结构式数据的一种常见方法。另外一点值得注意的是字符串是通过单引号或双引号被编码的。所以,如果我想用单引号编码 OReilly,我就必须使用反斜杠对它进行转义:OReilly。 这让我编写的这个 XSLT 样式表更为有趣了一些。我并未在本例中放上任何日期,但您也可以通过如下两种方法来编码日期。第一种方法是将日期作为字符串,该字符串必须在后面被解析。第二种方法是将日期作为一个对象,比如:publishdate: new Date( 2006, 6, 16, 17, 45, 0 )这段代码将 publishdate 的值设置为6/16/2006 5:45:00

45、p.m.。简单编码接下来我将陆续介绍 JSON 编码的几种技巧。第一种也是其中最简单的一种,此样式表如 清单 3 所示。清单 3. simple.xsl 样式表 var g_books = 1, id: ,name: ,first: ,last: ,publisher: ;要理解此样式表,不妨先来看一下 清单 4 所示的输出。清单 4. simple.xsl 的输出var g_books = id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manning, id: 2,name: PHP

46、 Hacks,first: Jack,last: Herrington,publisher: OReilly, id: 3,name: Podcasting Hacks,first: Jack,last: Herrington,publisher: OReilly;这里,我将名为 g_books 的变量设置为一个包含三个散列表的数组,每个散列表包含关于该书的信息。再回过头来看看 清单 3,您会发现第一个模板匹配 / 路径,它也是首先应用到输入数据集的模板,该模板使用 for-each 循环来遍历每本书。之后,它使用 标记来将文本从该数据输出到 JavaScript 输出代码。对于字符串,我使用

47、名为 js:escape() 的定制函数,它在模板之前定义。该函数使用一个正则表达式将一个单引号标记更改为带有反斜杠的单引号标记。最后一个重要的元素是 标记,它告知处理器要输出的是文本而不是 XML。要检验此过程是否可以正常工作,我加入了一个 simple .html 文件,该文件引用我在 simple.js 保存的 XSL 样式表的输出。这个 HTML 文件如 清单 5 所示。清单 5. simple.html 文件Simple JS loaderdocument.write( Found +g_books.length+ books );.html 文件使用 标记简单地加载已编码了的 Ja

48、vaScript 代码。之后,第二个 标记将数组的长度写出到浏览器页面,如 图 1 所示。图 1. simple.html 的输出好了!数据文件包含三本书,相应的 JavaScript 文件也包含三本书。它真的可以工作!通过函数加载上述第一个示例很简单,而且在大多数情况下可以发挥其作用,但它存在一些问题。第一个问题是对于数据何时被加载没有任何提示。如果数据是像页面那样被静态加载的,这不成问题。但是如果页面动态创建了一个 标记来按需加载数据,那么就很有必要知道 标记是何时完成的。实现此功能的最好的方法是让编码了的数据调用一个 JavaScript 函数,而不是只设置数据。这个概念很重要,所以我将

49、花一些时间来介绍一下为什么您必须要通过动态生成的 标记来加载数据。页面加载后,从服务器获得数据是 Web 2.0 的核心功能。一种方法是使用 AJAX 机制通过到服务器的调用来加载 XML。然而,出于安全性的原因,AJAX 机制只限于从单一域获取数据。这在大多数情况下都没有问题,但有时,您可能需要 JavaScript 代码运行在他人的页面上(例如,Google Maps)。在这种情况下从服务器获得数据的惟一方法是通过动态加载 标记。获悉 标记何时加载的最好的方法是让 标记返回的脚本调用函数而不是简单地加载数据。清单 6 显示了在函数调用中编码的数据。清单 6. Function1.jsAdd

50、Books( id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manning, id: 2,name: PHP Hacks,first: Jack,last: Herrington,publisher: OReilly, id: 3,name: Podcasting Hacks,first: Jack,last: Herrington,publisher: OReilly );清单 7 给出了相应的 .html 文件。清单 7. Function1.htmlFunction 1 JS l

51、oadervar g_books = ;function AddBooks( books ) g_books = books; drawbooks( g_books );稍后将详细介绍 drawbooks 函数。这里重要的是了解一下页面如何定义 AddBooks 函数,该函数随后会由 function1.js 文件中的脚本调用。该 AddBooks 函数负责处理数据。而且被调用的 AddBooks 函数会向页面指示 标记被正确加载,并已加载完成。要创建 function1.js 文件,我只对样式表稍微做了一点修改,如 清单 8 所示。清单 8. function1.xsl 样式表AddBook

52、s( 1, id: ,name: ,first: ,last: ,publisher: );这里,我调用了一个函数,而不是简单地设置一个变量。这就是我所做的惟一更改。回到页面,我使用了 drawbooks 函数来构建书的表格,这样我就能够确认数据被正确编码和正确显示。此函数是在 drawbooks.js 内定义的,如 清单 9 所示。清单 9. Drawbooks.jsfunction drawbooks( books ) var elTable = document.createElement( table ); for( var b in books ) var elTR = elTabl

53、e.insertRow( -1 ); var elTD1 = elTR.insertCell( -1 ); elTD1.appendChild( document.createTextNode( booksb.id ) ); var elTD2 = elTR.insertCell( -1 ); elTD2.appendChild( document.createTextNode( ) ); var elTD3 = elTR.insertCell( -1 ); elTD3.appendChild( document.createTextNode( booksb.first

54、 ) ); var elTD4 = elTR.insertCell( -1 ); elTD4.appendChild( document.createTextNode( booksb.last ) ); var elTD5 = elTR.insertCell( -1 ); elTD5.appendChild( document.createTextNode( booksb.publisher ) ); document.body.appendChild( elTable );这个简单函数创建了一个表格节点,然后循环访问书的列表并为每本书创建一行,为每个数据元素分配一个单元格。此页面上的代码的结

55、果如 图 2 所示。图 2. function1.html 的结果现在我就可以查看一下此页面的输出并确认来自原始 .xml 文件的一切均已被正确转换成 JavaScript 代码,且数据被发送到 AddData 函数并被正确添加到页面。细化函数调用技术我很喜欢函数调用这一技术,但我并不赞同将所有图书数据都放入一个块中。另一种方式是为每条记录采用一个调用,如 清单 10 所示。清单 10. Function2.jsAddBook( id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manni

56、ng );AddBook( id: 2,name: PHP Hacks,first: Jack,last: Herrington,publisher: OReilly );.对 .html 页面只需做少许修改,如 清单 11 所示。清单 11. Function2.html.var g_books = ;function AddBook( book ) g_books.push( book ); .这里更改了 XSLT,以使函数调用驻留在 for-each 循环体内。清单 12 显示了更新后的样式表。清单 12. function2.xsl.AddBook( id: ,name: ,first: ,last: ,publisher: );.对这个给定示例来说,这种更改看起来有些随意。但如果原始的 XML 数据集有多种数据类型,要为每种类型分配一个单独的函数调用会使 XSL 和页面上的 JavaScript 代码更为简单、更易于维护。编码对象对小的页面来讲,使用 JavaScript 函数没有问题。但对于大型项目,就需要使用 JavaScript 语言的一些面向对象特性。是的,JavaScript 语言可以处理对象而且可以处理得很好。清单 13 显示了如何创建带有数据的对象。清单 13. Object1.jsg_books.push(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论