




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PAGE PAGE 26 (最近更新日:2006/08/26)前言對(duì)于大多數(shù)的網(wǎng)絡(luò)服務(wù)器,最廣泛的功能就是開通HTTP服務(wù),達(dá)到開放和發(fā)布網(wǎng)站的目的。目前絕大多數(shù)的網(wǎng)絡(luò)交互程序,例如論壇、社區(qū)等等也是基于HTTP而建立的。在這里,我們通過Web服務(wù)器軟件中使用量超過半數(shù)的自由軟件Apache,來構(gòu)建一臺(tái)能夠滿足實(shí)際要求的多功能Web服務(wù)器,使它能夠在我們發(fā)布網(wǎng)頁(yè)的基礎(chǔ)上,實(shí)現(xiàn)可以運(yùn)行Perl、PHP的等等語(yǔ)言編寫的交互程序,以及在虛擬主機(jī)、保密方面的功能。安裝HTTP(Apache)服務(wù)器及相關(guān)組件首先來安裝Apache服務(wù)器及相關(guān)組件。這里使用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!為了使服務(wù)器開通HTTP服務(wù)后能夠運(yùn)行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應(yīng)用程序的執(zhí)行效率大幅度提高,我們安裝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* 進(jìn)入Zend的源代碼目錄rootsample ZendOptimizer-3.0.1-linux-glibc21-i386# ./install.sh 運(yùn)行安裝腳本然后會(huì)出現(xiàn)對(duì)話方式的安裝向?qū)?,圖樣如下:1 選擇OK,進(jìn)入安裝向?qū)А? 閱讀協(xié)議后,選擇EXIT。3 選擇Yes同意使用協(xié)議。4 設(shè)置安裝目錄,這里以默認(rèn)的/usr/local/Zend為例,然后選擇OK進(jìn)入下一步。 5 設(shè)置PHP配置文件所在的位置,一般為/etc(默認(rèn)),如果PHP的配置文件在別處的話,請(qǐng)根據(jù)實(shí)際情況設(shè)
19、置。6 被詢問是否使用Apache服務(wù)器,這里選擇Yes。7 設(shè)置Apache的路徑,這里保持默認(rèn),選擇OK進(jìn)入下一步。8 選擇OK進(jìn)入下一步。9 然后開始安裝稍等片刻,安裝完成后,提示安裝成功,選擇OK進(jìn)入下一步。10 選擇No,不重新啟動(dòng)HTTP服務(wù)(由于Apache也剛剛安裝完畢,還沒有被啟動(dòng)過。為了安全,等我們將Apache配置完畢后,再啟動(dòng)HTTP服務(wù)。)。然后會(huì)出現(xiàn)命令行 - Zend Optimizer安裝完畢。 rootsample ZendOptimizer-3.0.1-linux-glibc21-i386# cd 回到root根目錄rootsample # rm -rf Z
20、endOptimizer* 刪除安裝后遺留的源文件及目錄配置HTTP(Apache)服務(wù)器接下來,為了使服務(wù)器更安全以及更加符合我們的實(shí)際要求,對(duì)默認(rèn)的設(shè)置進(jìn)行一些必要的更改。尤其在一些細(xì)節(jié)方面,越少向外界透露服務(wù)器的信息,就越能保證服務(wù)器的安全。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”(在出現(xiàn)錯(cuò)誤頁(yè)的時(shí)候不顯示服務(wù)器操作系統(tǒng)的名稱)ServerTokens Prod 變?yōu)榇藸顟B(tài)# # 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 在錯(cuò)誤頁(yè)中不顯示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 將管理員郵箱設(shè)置為自己常用的郵箱 ServerAdmin yourname 根據(jù)實(shí)際情況修改默認(rèn)設(shè)置# 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 修改主機(jī)名ServerName :80 根據(jù)實(shí)際情況修改,端口號(hào)保持默認(rèn)的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”O(jiān)ptions Includes ExecCGI FollowSymLinks 允許服務(wù)器執(zhí)行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 允許擴(kuò)展名為.pl的CGI腳本運(yùn)行# 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 變?yōu)榇藸顟B(tài),允許.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 改為此狀態(tài)(添加“!414”到規(guī)則中,對(duì)于過長(zhǎng)的日志不記錄)# 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作為網(wǎng)頁(yè)的默認(rèn)編碼AddDefaultCharset GB2312 并接著添加這一行(添加GB2312為默認(rèn)編碼) 找到這一個(gè)標(biāo)簽,并在標(biāo)簽中更改相應(yīng)選項(xiàng)Options Indexes MultiViews 找到這一行,將“Indexes”刪除 Options MultiViews 變?yōu)榇藸顟B(tài)(不在瀏覽器上顯示樹狀目錄結(jié)構(gòu))AllowOverride NoneOrder allow,denyAllow fr
33、om allrootsample # rm -f /etc/httpd/conf.d/welcome.conf /var/www/error/noindex.html 刪除測(cè)試頁(yè)啟動(dòng)HTTP服務(wù)然后,啟動(dòng)HTTP服務(wù)。rootsample # chkconfig httpd on 設(shè)置HTTP服務(wù)自啟動(dòng)rootsample # chkconfig -list httpdhttpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 確認(rèn)2-5為on的狀態(tài)就OKrootsample # /etc/rc.d/init.d/httpd start 啟動(dòng)HTTP服務(wù)Starti
34、ng httpd: OK 啟動(dòng)成功會(huì)出現(xiàn)OK如果啟動(dòng)失敗的話,會(huì)出現(xiàn)錯(cuò)誤信息。原因可能是因?yàn)閔ttpd.conf文件編輯過程中的失誤,請(qǐng)檢查httpd.conf。 然后,初步對(duì)HTTP服務(wù)進(jìn)行簡(jiǎn)單測(cè)試。如下:rootsample # echo hello /var/www/html/index.html 建立測(cè)試頁(yè) 然后,在下面輸入服務(wù)器的IP地址,或域名(通過ifconfig命令可以看到IP地址;或者通過前面介紹過的“動(dòng)態(tài)域名的申請(qǐng)”中的方法設(shè)置成功的域名來測(cè)試。)窗體頂端Hostname: 窗體底端 如果成功的話會(huì)出現(xiàn)類似如下的頁(yè)面:然后,刪除剛剛建立的測(cè)試頁(yè)。rootsample # r
35、m -f /var/www/html/index.html 刪除測(cè)試頁(yè) 對(duì)HTTP服務(wù)進(jìn)行全面測(cè)試1 對(duì)HTML格式網(wǎng)頁(yè)正確顯示的測(cè)試rootsample # vi /var/www/html/index.html 建立測(cè)試頁(yè),內(nèi)容如下:Hello,World!Hello,World!然后在瀏覽器中輸入“http:/服務(wù)器IP地址”或者“http:/你的域名”,如果出現(xiàn)“Hello,World!”,并且瀏覽器讀取編碼為簡(jiǎn)體中文,就OK。為了在這之后測(cè)試.htaccess,將默認(rèn)為主頁(yè)的index.html測(cè)試頁(yè)刪除。 rootsample # rm -f /var/www/html/index
36、.html 刪除剛剛測(cè)試用的網(wǎng)頁(yè) 2 對(duì)CGI的支持進(jìn)行測(cè)試rootsample # vi /var/www/html/test.cgi 建立CGI測(cè)試頁(yè),內(nèi)容如下:#!/usr/bin/perlprint Content-Type: text/htmlnn;print ; print Hello,World!CGI is working!;print ;rootsample # chmod 755 /var/www/html/test.cgi 然后將CGI測(cè)試文件屬性設(shè)置為755然后在瀏覽器中輸入“http:/服務(wù)器IP地址/test.cgi”或者“http:/你的域名/test.cgi”,
37、如果正確顯示“Hello,World!CGI is working!”,說明對(duì)于CGI的支持沒有問題。3 對(duì)PHP的支持進(jìn)行測(cè)試rootsample html# vi /var/www/html/test.php 建立PHP測(cè)試文件,內(nèi)容如下:然后在瀏覽器中輸入“http:/服務(wù)器IP地址/test.php”或者“http:/你的域名/test.php”后,正確的顯示出了服務(wù)器上PHP的詳細(xì)信息,說明對(duì)PHP可以正確的支持。4 對(duì)SSI進(jìn)行測(cè)試 rootsample # vi /var/www/html/test.shtml 建立SSI測(cè)試頁(yè),內(nèi)容如下:Hello,World!TEST SSI
38、然后在瀏覽器中輸入“http:/服務(wù)器IP地址/test.shtml”或者“http:/你的域名/test.shtml”,如果正確顯示當(dāng)時(shí)的日期和時(shí)間,說明對(duì)于SSI的支持沒有問題。5 對(duì).htaccess的支持進(jìn)行測(cè)試rootsample # vi /var/www/html/index.shtml 建立.htaccess測(cè)試用的頁(yè),內(nèi)容如下:Hello,World!The name of the file is 然后在瀏覽器中輸入“http:/服務(wù)器IP地址”或者“http:/你的域名”,如果顯示“Forbidden”,說明.htaccess正常。然后建立一個(gè).htaccess文件,并定義
39、相應(yīng)規(guī)則,如下:rootsample html# vi /var/www/html/.htaccess 建立.htaccess文件,內(nèi)容如下:DirectoryIndex index.shtml這時(shí),再次在瀏覽器中輸入“http:/服務(wù)器IP地址”或者“http:/你的域名”,如果正確顯示“ The name of the file is index.shtml”,說明.htaccess中的規(guī)則生效狀態(tài),OK。6 刪除測(cè)試用的遺留文件rootsample html# rm -f /var/www/html/* /var/www/html/.htaccess 刪除測(cè)試用過的遺留文件附錄資料:從
40、XML 生成可與 Ajax 共同使用的 JSON時(shí)下,非常流行使用 JavaScript 代碼為數(shù)據(jù)驅(qū)動(dòng)的 Web 應(yīng)用程序添加互動(dòng)性。若能將數(shù)據(jù)編碼成 JavaScript Object Notation(JSON)的格式,您就可以更輕松地通過 JavaScript 語(yǔ)言使用它。通過本文,發(fā)掘使用 XSLT V2 從 XML 數(shù)據(jù)生成 JSON 的幾種不同方法。幾年前,許多開發(fā)人員很看好 XML、XSLT、Extensible HTML (XHTML)和其他一些基于標(biāo)記的語(yǔ)言?,F(xiàn)在,Asynchronous JavaScript and XML(AJAX)成了新的熱點(diǎn),人們又將目光轉(zhuǎn)向了使用
41、 JavaScript 代碼的數(shù)據(jù)驅(qū)動(dòng)的富 Internet 應(yīng)用程序。但是開發(fā)人員是否已經(jīng)消除了 XML 和這一新技術(shù)之間的鴻溝呢?當(dāng)然,您可以在 Web 客戶機(jī)中使用 XML 解析器來讀取數(shù)據(jù),但這種做法會(huì)帶來兩個(gè)問題。第一,出于安全方面的原因,XML 數(shù)據(jù)只能從與此頁(yè)面相同的那個(gè)域中讀取。這雖然不是什么大的限制因素,但它的確會(huì)引起部署方面的問題,還會(huì)阻礙 DHTML 小部件的創(chuàng)建。第二,讀取和解析 XML 會(huì)非常慢。另一種做法是讓服務(wù)器執(zhí)行 XML 的解析工作,方法是設(shè)置服務(wù)器,使之向?yàn)g覽器發(fā)送以 JavaScript 代碼或時(shí)下流行的 JavaScript Object Notatio
42、n(JSON)編碼的數(shù)據(jù)。本文將展示如下三種使用 XSLT V2 語(yǔ)言和 Saxon XSLT V2 處理器從 XML 數(shù)據(jù)生成 JSON 的技巧: 簡(jiǎn)單編碼 通過函數(shù)調(diào)用加載數(shù)據(jù) 編碼對(duì)象 JSON 簡(jiǎn)介要學(xué)習(xí)如何將數(shù)據(jù)編碼成 JSON(它只是 JavaScript 的一個(gè)子集),最好的方法是從數(shù)據(jù)開始。清單 1 顯示了書籍列表的一個(gè)示例 XML 數(shù)據(jù)集。清單 1. 基本的圖形化圖書館 Code Generation in Action JackHerrington Manning PHP Hacks JackHerrington OReilly Podcasting Hacks JackH
43、errington OReilly 這個(gè)數(shù)據(jù)集很簡(jiǎn)單,只包含三本書,每本書都具有惟一的 ID、書名、作者姓名及出版商的名字。(沒錯(cuò),我只選擇了我自己的書作為數(shù)據(jù)集,但能怨我嗎?這些書實(shí)在是不可多得的節(jié)日和生日禮物。)清單 2 顯示了這些數(shù)據(jù)在 JSON 中的效果。清單 2. JSON 中的示例數(shù)據(jù)集 id: 1, title: Code Generation in Action, first: Jack, last: Herrington, publisher: Manning , . 方括號(hào) () 表明這是一個(gè)數(shù)組。大括號(hào) () 則表明這是一個(gè)散列表,該散列表由一組名稱和值對(duì)組成。在本例中,
44、我創(chuàng)建了一個(gè)散列表的數(shù)組 用來存儲(chǔ)這類結(jié)構(gòu)式數(shù)據(jù)的一種常見方法。另外一點(diǎn)值得注意的是字符串是通過單引號(hào)或雙引號(hào)被編碼的。所以,如果我想用單引號(hào)編碼 OReilly,我就必須使用反斜杠對(duì)它進(jìn)行轉(zhuǎn)義:OReilly。 這讓我編寫的這個(gè) XSLT 樣式表更為有趣了一些。我并未在本例中放上任何日期,但您也可以通過如下兩種方法來編碼日期。第一種方法是將日期作為字符串,該字符串必須在后面被解析。第二種方法是將日期作為一個(gè)對(duì)象,比如:publishdate: new Date( 2006, 6, 16, 17, 45, 0 )這段代碼將 publishdate 的值設(shè)置為6/16/2006 5:45:00
45、p.m.。簡(jiǎn)單編碼接下來我將陸續(xù)介紹 JSON 編碼的幾種技巧。第一種也是其中最簡(jiǎn)單的一種,此樣式表如 清單 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 的變量設(shè)置為一個(gè)包含三個(gè)散列表的數(shù)組,每個(gè)散列表包含關(guān)于該書的信息。再回過頭來看看 清單 3,您會(huì)發(fā)現(xiàn)第一個(gè)模板匹配 / 路徑,它也是首先應(yīng)用到輸入數(shù)據(jù)集的模板,該模板使用 for-each 循環(huán)來遍歷每本書。之后,它使用 標(biāo)記來將文本從該數(shù)據(jù)輸出到 JavaScript 輸出代碼。對(duì)于字符串,我使用
47、名為 js:escape() 的定制函數(shù),它在模板之前定義。該函數(shù)使用一個(gè)正則表達(dá)式將一個(gè)單引號(hào)標(biāo)記更改為帶有反斜杠的單引號(hào)標(biāo)記。最后一個(gè)重要的元素是 標(biāo)記,它告知處理器要輸出的是文本而不是 XML。要檢驗(yàn)此過程是否可以正常工作,我加入了一個(gè) simple .html 文件,該文件引用我在 simple.js 保存的 XSL 樣式表的輸出。這個(gè) HTML 文件如 清單 5 所示。清單 5. simple.html 文件Simple JS loaderdocument.write( Found +g_books.length+ books );.html 文件使用 標(biāo)記簡(jiǎn)單地加載已編碼了的 Ja
48、vaScript 代碼。之后,第二個(gè) 標(biāo)記將數(shù)組的長(zhǎng)度寫出到瀏覽器頁(yè)面,如 圖 1 所示。圖 1. simple.html 的輸出好了!數(shù)據(jù)文件包含三本書,相應(yīng)的 JavaScript 文件也包含三本書。它真的可以工作!通過函數(shù)加載上述第一個(gè)示例很簡(jiǎn)單,而且在大多數(shù)情況下可以發(fā)揮其作用,但它存在一些問題。第一個(gè)問題是對(duì)于數(shù)據(jù)何時(shí)被加載沒有任何提示。如果數(shù)據(jù)是像頁(yè)面那樣被靜態(tài)加載的,這不成問題。但是如果頁(yè)面動(dòng)態(tài)創(chuàng)建了一個(gè) 標(biāo)記來按需加載數(shù)據(jù),那么就很有必要知道 標(biāo)記是何時(shí)完成的。實(shí)現(xiàn)此功能的最好的方法是讓編碼了的數(shù)據(jù)調(diào)用一個(gè) JavaScript 函數(shù),而不是只設(shè)置數(shù)據(jù)。這個(gè)概念很重要,所以我將
49、花一些時(shí)間來介紹一下為什么您必須要通過動(dòng)態(tài)生成的 標(biāo)記來加載數(shù)據(jù)。頁(yè)面加載后,從服務(wù)器獲得數(shù)據(jù)是 Web 2.0 的核心功能。一種方法是使用 AJAX 機(jī)制通過到服務(wù)器的調(diào)用來加載 XML。然而,出于安全性的原因,AJAX 機(jī)制只限于從單一域獲取數(shù)據(jù)。這在大多數(shù)情況下都沒有問題,但有時(shí),您可能需要 JavaScript 代碼運(yùn)行在他人的頁(yè)面上(例如,Google Maps)。在這種情況下從服務(wù)器獲得數(shù)據(jù)的惟一方法是通過動(dòng)態(tài)加載 標(biāo)記。獲悉 標(biāo)記何時(shí)加載的最好的方法是讓 標(biāo)記返回的腳本調(diào)用函數(shù)而不是簡(jiǎn)單地加載數(shù)據(jù)。清單 6 顯示了在函數(shù)調(diào)用中編碼的數(shù)據(jù)。清單 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 給出了相應(yīng)的 .html 文件。清單 7. Function1.htmlFunction 1 JS l
51、oadervar g_books = ;function AddBooks( books ) g_books = books; drawbooks( g_books );稍后將詳細(xì)介紹 drawbooks 函數(shù)。這里重要的是了解一下頁(yè)面如何定義 AddBooks 函數(shù),該函數(shù)隨后會(huì)由 function1.js 文件中的腳本調(diào)用。該 AddBooks 函數(shù)負(fù)責(zé)處理數(shù)據(jù)。而且被調(diào)用的 AddBooks 函數(shù)會(huì)向頁(yè)面指示 標(biāo)記被正確加載,并已加載完成。要?jiǎng)?chuàng)建 function1.js 文件,我只對(duì)樣式表稍微做了一點(diǎn)修改,如 清單 8 所示。清單 8. function1.xsl 樣式表AddBook
52、s( 1, id: ,name: ,first: ,last: ,publisher: );這里,我調(diào)用了一個(gè)函數(shù),而不是簡(jiǎn)單地設(shè)置一個(gè)變量。這就是我所做的惟一更改?;氐巾?yè)面,我使用了 drawbooks 函數(shù)來構(gòu)建書的表格,這樣我就能夠確認(rèn)數(shù)據(jù)被正確編碼和正確顯示。此函數(shù)是在 drawbooks.js 內(nèi)定義的,如 清單 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 );這個(gè)簡(jiǎn)單函數(shù)創(chuàng)建了一個(gè)表格節(jié)點(diǎn),然后循環(huán)訪問書的列表并為每本書創(chuàng)建一行,為每個(gè)數(shù)據(jù)元素分配一個(gè)單元格。此頁(yè)面上的代碼的結(jié)
55、果如 圖 2 所示。圖 2. function1.html 的結(jié)果現(xiàn)在我就可以查看一下此頁(yè)面的輸出并確認(rèn)來自原始 .xml 文件的一切均已被正確轉(zhuǎn)換成 JavaScript 代碼,且數(shù)據(jù)被發(fā)送到 AddData 函數(shù)并被正確添加到頁(yè)面。細(xì)化函數(shù)調(diào)用技術(shù)我很喜歡函數(shù)調(diào)用這一技術(shù),但我并不贊同將所有圖書數(shù)據(jù)都放入一個(gè)塊中。另一種方式是為每條記錄采用一個(gè)調(diào)用,如 清單 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 );.對(duì) .html 頁(yè)面只需做少許修改,如 清單 11 所示。清單 11. Function2.html.var g_books = ;function AddBook( book ) g_books.push( book ); .這里更改了 XSLT,以使函數(shù)調(diào)用駐留在 for-each 循環(huán)體內(nèi)。清單 12 顯示了更新后的樣式表。清單 12. function2.xsl.AddBook( id: ,name: ,first: ,last: ,publisher: );.對(duì)這個(gè)給定示例來說,這種更改看起來有些隨意。但如果原始的 XML 數(shù)據(jù)集有多種數(shù)據(jù)類型,要為每種類型分配一個(gè)單獨(dú)的函數(shù)調(diào)用會(huì)使 XSL 和頁(yè)面上的 JavaScript 代碼更為簡(jiǎn)單、更易于維護(hù)。編碼對(duì)象對(duì)小的頁(yè)面來講,使用 JavaScript 函數(shù)沒有問題。但對(duì)于大型項(xiàng)目,就需要使用 JavaScript 語(yǔ)言的一些面向?qū)ο筇匦?。是的,JavaScript 語(yǔ)言可以處理對(duì)象而且可以處理得很好。清單 13 顯示了如何創(chuàng)建帶有數(shù)據(jù)的對(duì)象。清單 13. Object1.jsg_books.push(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣告設(shè)計(jì)的基本原則助理廣告師考試試題及答案
- 紡織品供應(yīng)鏈管理的關(guān)鍵點(diǎn)試題及答案
- 紡織品設(shè)計(jì)過程中的情感表達(dá)試題及答案
- 2025年教育信息化基礎(chǔ)設(shè)施建設(shè)與教育信息化產(chǎn)業(yè)未來發(fā)展規(guī)劃研究報(bào)告
- 學(xué)校招考校長(zhǎng)試題及答案
- 紡織產(chǎn)品在國(guó)際市場(chǎng)的競(jìng)爭(zhēng)力試題及答案
- 紡織品設(shè)計(jì)師證書考試創(chuàng)新思維試題及答案
- 和平一模試題及答案
- 中級(jí)職稱試題及答案解析
- 2024年設(shè)計(jì)師考試的難點(diǎn)符號(hào)解析試題及答案
- 江蘇省南京市秦淮區(qū)2023-2024學(xué)年八年級(jí)下學(xué)期歷史期末測(cè)試卷
- 2024年甘肅省中考語(yǔ)文試題卷(含答案)
- 中央2024年文化和旅游部恭王府博物館應(yīng)屆生招聘筆試上岸歷年典型考題與考點(diǎn)剖析附帶答案詳解
- 勞動(dòng)教育智慧樹知到期末考試答案章節(jié)答案2024年同濟(jì)大學(xué)
- 第一單元中國(guó)特色社會(huì)主義的開創(chuàng)、堅(jiān)持、捍衛(wèi)和發(fā)展單元測(cè)試-2023-2024學(xué)年中職高教版(2023)中國(guó)特色社會(huì)主義
- MOOC 傾聽-音樂的形式與審美-武漢大學(xué) 中國(guó)大學(xué)慕課答案
- 第18講化學(xué)鍵(講義)(原卷版+解析)
- (正式版)JBT 7248-2024 閥門用低溫鋼鑄件技術(shù)規(guī)范
- 漿砌片石擋墻施工方案
- (高清版)TDT 1056-2019 縣級(jí)國(guó)土資源調(diào)查生產(chǎn)成本定額
- 多臂老虎機(jī)問題的強(qiáng)化學(xué)習(xí)算法
評(píng)論
0/150
提交評(píng)論