国产毛片午夜福利,国产黄网,国产亚洲天堂,97国产精品

  •  
    Perl在WAP網(wǎng)站中應(yīng)用實例一談
    發(fā)布時間:2005-03-28   瀏覽次數(shù):1185700
    出處:塞迪網(wǎng) 作者:Cool007前言: WAP是無線應(yīng)用程序通訊協(xié)議(WirelessApplicationProtocal的簡稱。WAP定義了一套由XML標準延伸而來的標記語言,稱為「無線標記語言WirelessMarkupLanguage,WML」),專門用來將準備傳送給無線上網(wǎng)設(shè)備的內(nèi)容進行編碼。與HTML用來定義資料在一般網(wǎng)絡(luò)瀏覽器上面的顯示與動作方式的標記語言那樣,WML是用來定義資料如何在無線上網(wǎng)設(shè)備上顯示與動作的標記語言。WAP與WML技術(shù)對于提供信息給客戶與在辦公室外工作的員工來說,都是相當適合的技術(shù)。在這里我將會通過幾個簡單的例子向大家介紹在Perl程序語言在WAP網(wǎng)站的的應(yīng)用,使你對Perl語言有一個更深入的認識。 注:本文部份資料譯自ComprehensivePerlArchiveNetwork網(wǎng)站(網(wǎng)址:http://cpan.org/)本文適用于對XML和HTTP有一定認識的讀者。 1、編寫動態(tài)CGI程序 由于WAP同樣使用HTTP通訊協(xié)議,因此你可以依照為一般網(wǎng)絡(luò)瀏覽器開發(fā)動態(tài)內(nèi)容程序相同的設(shè)計策略來為無線上網(wǎng)工具開發(fā)應(yīng)用程序。事實上,你甚至可以說兩者的開發(fā)流程除了一些特定的細節(jié)部分以外,大致上都是相同的。首先,一般的網(wǎng)絡(luò)瀏覽器接受的內(nèi)容類型(HTTP通訊中的Content-Type表頭)信息為text/html,而無線上網(wǎng)的客戶端程序則要求你的程序送出text/vnd.wap.wml做為內(nèi)容類型的值。其次,由于傳送給無線上網(wǎng)客戶端程序的文件事實上是一個XML文件,因此你必須將XML文件類型宣告字符串一并送出。只要你注意以上兩點,那么你便可以開始傳送你的內(nèi)容了。下面是一個很簡單的傳送WML文件的CGI程序。 #!/usr/bin/perl print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"歡迎來到我的WAP網(wǎng)站!\n"; print"\n"; print"\n"; 這個例子演示了如何在WML文件里面?zhèn)魉驼_的HTTP與XML表頭信息給瀏覽器。由于我們傳送的實際上是一個XML文件,因此在輸出資料的時候請記得要遵循正確的語法與格式。一般的網(wǎng)絡(luò)瀏覽器對于內(nèi)容類型或者表頭宣告等信息的語法和格式都非常寬容,然而WAP客戶端程序卻非如此。 上面這個程序所輸出的內(nèi)容雖然是實時產(chǎn)生的,但是它在任何狀況下送出的內(nèi)容都是完全相同的,互動性不是很好。為了解決這個問題,你可以通過CGI函式庫來讀取客戶端送入的資料,并且根據(jù)這些傳入的資料來實時建立新的內(nèi)容傳送回客戶端。WML本身被設(shè)計成盡可能內(nèi)容能實時產(chǎn)生越好,這樣的設(shè)計讓頁面中的每一個deck元素可以不需要送出新的HTTP請求給服務(wù)器便可以從一個card元素移動到另一個card元素。不過這也意味著你在接收從WML文件傳入的資料的時候要格外小心,必須確認一個card元素確實有傳送所有的變量到服務(wù)器端才行。在下面的范例程序會從客戶端讀取來自不同card元素所送出的參數(shù),并且將這些參數(shù)傳送給服務(wù)器,然后據(jù)此建立一個新的deck元素。 #!/usr/bin/perl useCGI; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; if($input->param("completed")){ print"\n"; print"\n"; print"Welcometomydynamicwirelesscgi\n\n"; print"Yournameis:"; print"".$input->param("first_name").""; print"".$input->param("middle_name").""; print"".$input->param("last_name").""; print"\n"; print"\n"; print"\n"; }else{ print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourfirstname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourmiddlename\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourlastname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"DeckSummary:\n"; print"Firstname:\$first_name\n"; print"Midname:\$middle_name\n"; print"Lastname:\$last_name\n"; print"PressContinuetosendtoserver\n"; print"\n"; print"\n"; } 這個程序會讀取來自每個card元素所送出的參數(shù),并且將他們以HTTPget請求的型式傳送給服務(wù)器。請注意在一個名為finish的card元素里面,我們在每一個WML變量(例如$first_name)的前面全都加上一個斜線,這樣才可以避免Perl將它們誤認為Perl程序本身的變量來看待。一旦這些變量成功傳送給服務(wù)器,我們的CGI程序便可以像其它任何一般的CGI變量那樣讀取它們。 2、編寫控制客戶端存取處理程序 WAP設(shè)備是在低頻寬的網(wǎng)絡(luò)環(huán)境下運作的,因此它們首先將內(nèi)容儲存在自身的高速緩存里面,以避免無謂的資料請求與傳送過程。只是傳送CGI參數(shù)給我們的CGI程序并不能保證我們送出的內(nèi)容不會被WAP設(shè)備儲存在高速緩存里面。無線上網(wǎng)設(shè)備會將它們儲存起來,以URL做為索引鍵值,接下來每當有指向到該URL的請求的時候便會直接把之前儲存的資料傳回去,而不會向服務(wù)器詢問這個頁面從上次瀏覽過后是否已有更新過的資料。 在下面這個范例程序里面將時間與日期以WML的deck元素型式回傳給WAP設(shè)備,并且附有一個OK按鈕以便再次向服務(wù)器要求傳送新的當時時間與日期。這個程序也要求使用者輸入他的名字,以便自定回傳的內(nèi)容。 #!/usr/bin/perl useCGI; useDate::Format; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; my$time=time2str("%a%b%e%T%Y\n",time); print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; if($input->param("name")){ print"".$input->param("name").",\n"; } print"現(xiàn)在時間是︰".$time."\n"; print"請輸入你的姓名︰\n"; print"\n"; print"\n"; print"\n"; 當我們把上面這個程序放入模擬器去執(zhí)行,我們在模擬器的請求紀錄文件里面發(fā)現(xiàn)下面這些紀錄: cachemiss:http://wap.server.com/wml4.cgi cachemiss:http://wap.server.com/wml4.cgi?name=James cachehit:http://wap.server.com/wml4.cgi?name=James cachehit: 行請求紀錄沒有帶入任何CGI參數(shù),該筆記錄實際通過網(wǎng)絡(luò)向服務(wù)器送出請求,而程序則傳回當時的時間做為響應(yīng)。第二行紀錄有帶入一個CGI參數(shù),該紀錄同樣也實際通過網(wǎng)絡(luò)向服務(wù)器送出了請求。然而從第三行記錄開始,WAP模擬器便不再向服務(wù)器實際提出請求了,而是直接將之前存入高速緩存的數(shù)據(jù)取出并顯示在畫面上,此時使用者收到的便是不正確的資料了。 有兩種方式可以使WAP裝置通過網(wǎng)絡(luò)實際向服務(wù)器提出請求。種是在程序中手動送出HTTP表頭,告知客戶端這個頁面已經(jīng)過期并且需要重新取得更新過的版本。在上面的范例里面,你可以在Content-type表頭后面再加上兩個額外的表頭,以強迫WAP裝置向服務(wù)器取得新的內(nèi)容而非直接取用高速緩存中的資料: print"Content-type:text/vnd.wap.wml\n"; print"Last-Modified:".time2str("%a,%e%b%Y%T",time)."GMT\n"; print"Expires:".time2str("%a,%e%b%Y%T",time)."GMT\n"; print"Cache-Control:no-cache,must-revalidate\n"; print"Pragma:no-cache\n\n"; 第二個方式則是在送出的WML原始碼的區(qū)域里面加入與快取控制相關(guān)的卷標: 上面這些卷標和之前我們修改過后的HTTP表頭具有相同的功用。 3、編寫請求表頭 現(xiàn)在你已經(jīng)制作供無線上網(wǎng)設(shè)備讀取的內(nèi)容了,接下來的任務(wù)便是針對不同廠商與型號的移動電話制作合適的內(nèi)容了。在建立WAP網(wǎng)站的時候?qū)媾R的困擾是:不同的WAP瀏覽器所支持的功能都稍有不同。不過,無線上網(wǎng)設(shè)備所傳送給服務(wù)器的請求表頭里面會告訴我們該軟件的類型與支持的功能種類。在下面的例子中會將WAP瀏覽器傳送給服務(wù)器的請求表頭全部顯示出來︰ #!/usr/bin/perl useCGI; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; print"\n"; print"\n"; foreach$header(%ENV){ if($header=~/^HTTP/){ print"$header:$ENV{$header}\n"; } } print"\n"; print"\n"; 不同客戶端所傳送過來的表頭信息基本上都是大致相同的,其中有些信息你可以略過不看。但是這當中的確有些信息對我們來說是格外有用的。舉例來說,正如同一般的網(wǎng)絡(luò)瀏覽器那樣,WAP瀏覽器會傳送一個User-Agent字符串給服務(wù)器,該字符串的內(nèi)容指明了該型號的手機所使用的瀏覽器類型與版本。Perl將這個表頭信息以瀏覽器名稱/版本的型式(BROWSER/VERSION)儲存在HTTP_USER_AGENT這個變量里面。這項信息之所以有用之處在于并非每一種無線上網(wǎng)設(shè)備的瀏覽器都支持WAP格式。你可能會遇到有些瀏覽器僅接受HDML格式的內(nèi)容,而非WML。你可以建立一個索引表格來紀錄這些不支持WML的瀏覽器,并且將它們屏除在程序服務(wù)的范圍之外;蛘吣阋部梢詸z查HTTP_ACCEPT這個表頭信息的值,看看其中是否有text/vnd.wap.wml這個字符串,如果沒有的話代表該瀏覽器并不支持WML格式的內(nèi)容。 此外,HTTP_X_UP_SUBNO這個表頭信息代表該移動電話的全球識別代碼(每一部手機都不同)。你可以地通過這個信息來辨認出某支特定的移動電話,而不需要傳送cookie。不同于沒有識別碼的一般網(wǎng)絡(luò)瀏覽器,同一支移動電話每次連結(jié)到你的服務(wù)器的時候都會傳送同樣的識別碼給你的程序。 4、用Mason組件來制作WAP網(wǎng)站如何提供WML格式的內(nèi)容服務(wù) 如果你的網(wǎng)站是使用HTML的Mason組件來建立的,你還是可以照樣為WAP設(shè)備提供WML格式的內(nèi)容服務(wù)的。不過你的確需要以與原本稍微不同的方式來撰寫你的Mason組件。這其中最重要的地方在于你必須記得要把XML格式宣告放在實際輸出內(nèi)容的行。如果在HTTP表頭與XML格式宣告之間有任何內(nèi)容被送出,那么WAP設(shè)備便無法正常讀取你所送出的內(nèi)容了。其它較為重要的改變在于區(qū)段,在這里面的HTTP內(nèi)容類型資料必須符合WAP設(shè)備所要求的類型(即text/vnd.wap.wml)。下面是用Mason來撰寫WAP程序的例子: #!/usr/bin/perl useCGI; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; if($input->param("completed")){ print"\n"; print"\n"; print"Welcometomydynamicwirelesscgi\n\n"; print"Yournameis:"; print"".$input->param("first_name").""; print"".$input->param("middle_name").""; print"".$input->param("last_name").""; print"\n"; print"\n"; print"\n"; }else{ print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourfirstname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourmiddlename\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourlastname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"DeckSummary:\n"; print"Firstname:\$first_name\n"; print"Midname:\$middle_name\n"; print"Lastname:\$last_name\n"; print"PressContinuetosendtoserver\n"; print"\n"; print"\n"; } 小結(jié): WAP所能夠提供的內(nèi)容顯然無法和一般Web瀏覽器相提并論,然而它卻的確提供了一個極具彈性的應(yīng)用程序開發(fā)環(huán)境。我希望本文對你在無線網(wǎng)絡(luò)構(gòu)建上有所幫助。
    立即預(yù)約