亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Verzeichnis suchen
Ruby用戶指南 3、開(kāi)始 4、簡(jiǎn)單的例子 5、字符串 6、正則表達(dá)式 7、數(shù)組 8、回到那些簡(jiǎn)單的例子 9、流程控制 10、迭代器 11、面向?qū)ο笏季S 12、方法 13、類(lèi) 14、繼承 15、重載方法 16、訪問(wèn)控制 17、單態(tài)方法 18、模塊 19、過(guò)程對(duì)象 20、變量 21、全局變量 22、實(shí)變量 23、局部變量 24、類(lèi)常量 25、異常處理:rescue 26、異常處理:ensure 27、存取器 28、對(duì)象的初始化 29、雜項(xiàng) RGSS入門(mén)教程 1、什么是RGSS 2、開(kāi)始:最簡(jiǎn)單的腳本 3、數(shù)據(jù)類(lèi)型:數(shù)字 4、數(shù)據(jù)類(lèi)型:常量與變量 5、數(shù)據(jù)類(lèi)型:字符串 6、控制語(yǔ)句:條件分歧語(yǔ)句 7、控制語(yǔ)句:循環(huán) 8、函數(shù) 9、對(duì)象與類(lèi) 10、顯示圖片 11、數(shù)組 12、哈希表(關(guān)聯(lián)數(shù)組) 13、類(lèi) 14、數(shù)據(jù)庫(kù) 15、游戲?qū)ο?/a> 16、精靈的管理 17、窗口的管理 18、活動(dòng)指令 19、場(chǎng)景類(lèi) Programming Ruby的翻譯 Programming Ruby: The Pragmatic Programmer's Guide 前言 Roadmap Ruby.new 類(lèi),對(duì)象和變量 容器Containers,塊Blocks和迭代Iterators 標(biāo)準(zhǔn)類(lèi)型 深入方法 表達(dá)式Expressions 異常,捕捉和拋出(已經(jīng)開(kāi)始,by jellen) 模塊 基本輸入輸出 線程和進(jìn)程 當(dāng)遭遇挫折 Ruby和它的世界 Ruby和Web開(kāi)發(fā) Ruby Tk Ruby 和微軟的 Windows 擴(kuò)展Ruby Ruby語(yǔ)言 (by jellen) 類(lèi)和對(duì)象 (by jellen) Ruby安全 反射Reflection 內(nèi)建類(lèi)和方法 標(biāo)準(zhǔn)庫(kù) OO設(shè)計(jì) 網(wǎng)絡(luò)和Web庫(kù) Windows支持 內(nèi)嵌文檔 交互式Ruby Shell 支持 Ruby參考手冊(cè) Ruby首頁(yè) 卷首語(yǔ) Ruby的啟動(dòng) 環(huán)境變量 對(duì)象 類(lèi) 執(zhí)行 結(jié)束時(shí)的相關(guān)處理 線程 安全模型 正則表達(dá)式 字句構(gòu)造 程序 變量和常數(shù) 字面值 操作符表達(dá)式 控制結(jié)構(gòu) 方法調(diào)用 類(lèi)/方法的定義 內(nèi)部函數(shù) 內(nèi)部變量 內(nèi)部常數(shù) 內(nèi)部類(lèi)/模塊/異常類(lèi) 附加庫(kù) Ruby變更記錄 ruby 1.6 特性 ruby 1.7 特性 Ruby術(shù)語(yǔ)集 Ruby的運(yùn)行平臺(tái) pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱
Figuren

Ruby a和 Web



Ruby對(duì)互聯(lián)網(wǎng)來(lái)說(shuō)并不陌生,不只是因?yàn)槟憧梢杂盟鼇?lái)寫(xiě)SMTP服務(wù)器,F(xiàn)TP服務(wù)器,或者web服務(wù)器,你還可以用它來(lái)完成通常的任務(wù),比如CGI編程或者作為PHP的一個(gè)替代品。

編寫(xiě) CGI 腳本

你可以用Ruby輕松的編寫(xiě)CGI腳本,為了讓Ruby腳本產(chǎn)生HTML輸出,你只需要這樣做:

#!/usr/bin/env?ruby
print?"HTTP/1.0?200?OK\r\n"
print?"Content-type:?text/html\r\n\r\n"
print?"<html><body>Hello?World!</body></html>\r\n"

你可以用Ruby的正則表達(dá)式來(lái)解析輸入字符串,查詢環(huán)境變量,檢查標(biāo)記,填充模板,轉(zhuǎn)義(escape )特殊字符,格式化HTML,然后輸出。

或者,你可以用類(lèi)CGI。

 

使用cgi.rb

類(lèi)CGI主要來(lái)幫助你更方便的編寫(xiě)CGI腳本,使用它,你可以操縱表單(form),cookies和環(huán)境變量,維護(hù)有狀態(tài)的session等等。關(guān)于它的文檔在第497頁(yè),但是我們?cè)谶@里要先看一下它大體的功能。

?

引用(Quoting)

當(dāng)處理URL和HTML的時(shí)候,我們必須注意對(duì)一些特殊字符的引用。比如,一個(gè)斜線 (``/'') 在URL里有特殊意義,如果它不是URL的路徑名稱(chēng)的一部分,那么它必須被轉(zhuǎn)義(escaped)。也就是說(shuō),它在URL中將被轉(zhuǎn)換為 ``%2F'',而且反過(guò)來(lái)你要想使用它,必須把它再轉(zhuǎn)換為斜線??崭窈蚢nd符號(hào)("&")也是特殊字符。為了處理這樣的情況,CGI提供了方法 CGI.escapeCGI.unescape。

require?'cgi'
puts?CGI.escape(?"Nicholas?Payton/Trumpet?&?Flugel?Horn"?)
結(jié)果:
Nicholas+Payton%2FTrumpet+%26+Flugel+Horn

類(lèi)似的,你也許需要對(duì)HTML中的特殊字符進(jìn)行轉(zhuǎn)義(escape ):

require?'cgi'
puts?CGI.escapeHTML(?'<a?href="/mp3">Click?Here</a>'?)
結(jié)果:
&lt;a?href=&quot;/mp3&quot;&gt;Click?Here&lt;/a&gt;

而且,你也可以只對(duì)HTML的一部分標(biāo)記進(jìn)行轉(zhuǎn)義,而不是全部:

require?'cgi'
puts?CGI.escapeElement('<hr><a?href="/mp3">Click?Here</a><br>','A')
produces:
<hr>&lt;a?href=&quot;/mp3&quot;&gt;Click?Here&lt;/a&gt;<br>

這里又有A標(biāo)記被轉(zhuǎn)義了,其它標(biāo)記都沒(méi)有變化。

每個(gè)這樣的轉(zhuǎn)義方法都有一個(gè)un-開(kāi)頭的版本,來(lái)恢復(fù)這個(gè)轉(zhuǎn)義之前的字符串。

表單(Forms)

使用CGI類(lèi)你有兩種方法訪問(wèn)HTML傳過(guò)來(lái)的參數(shù)。比如我們有一個(gè)URL/cgi-bin/lookup?player=Miles%20Davis&year=1958,你可以用CGI#[ ]方法直接訪問(wèn)player和year變量:

require?'cgi'
cgi?=?CGI.new
cgi['player'] ? ["Miles?Davis"]
cgi['year'] ? ["1958"]

或者,你可以把所有參數(shù)放入一個(gè)Hash中,再?gòu)倪@個(gè)哈希查詢參數(shù)。

require?'cgi'
cgi?=?CGI.new
h?=?cgi.params
h['player'] ? ["Miles?Davis"]

創(chuàng)建窗體(Forms)和 HTML

CGI類(lèi)包含了很多產(chǎn)生HTML的方法,每個(gè)HTML標(biāo)記都有一個(gè)方法。為了使用這些方法,你首先要?jiǎng)?chuàng)建一個(gè)CGI對(duì)象,這可以通過(guò)CGI.new方法。這個(gè)方法可以接收一個(gè)參數(shù)表示HTML的級(jí)別。比如,我們這里用了html3。

為了使得這些標(biāo)記嵌套方便,這些方法都接受一個(gè)block作為來(lái)處理內(nèi)容,這個(gè)block返回一個(gè)字符串,這也是這個(gè)tag的內(nèi)容。比如下面的例子,我們加入了一些換行是為了能適應(yīng)屏幕,能使得它被很好的顯示而已。

require?"cgi"
cgi?=?CGI.new("html3")??#?add?HTML?generation?methods
cgi.out{
??cgi.html{
????cgi.head{?"\n"+cgi.title{"This?Is?a?Test"}?}?+
????cgi.body{?"\n"+
??????cgi.form{"\n"+
????????cgi.hr?+
????????cgi.h1?{?"A?Form:?"?}?+?"\n"+
????????cgi.textarea("get_text")?+"\n"+
????????cgi.br?+
????????cgi.submit
??????}
????}
??}
}
produces:
Content-Type:?text/html
Content-Length:?302
 
<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?3.2?Final//EN"><HTML><HEAD>      
<TITLE>This?Is?a?Test</TITLE></HEAD><body>      
<FORM?METHOD="post"?ENCTYPE="application/x-www-form-urlencoded">      
<HR><H1>A?Form:?</H1>      
<TEXTAREA?NAME="get_text"?ROWS="10"?COLS="70"></TEXTAREA>      
<BR><INPUT?TYPE="submit"></FORM></body></HTML>
 

這段代碼將產(chǎn)生一個(gè)HTML文檔,主題(title)為“This?Is?a?Test”,然后一個(gè)水平線,然后是一個(gè)header,一個(gè)測(cè)試的輸入框,一個(gè)提交按鈕。當(dāng)接收到這個(gè)提交的頁(yè)面,你會(huì)得到一個(gè)變量名為get_text,其值為你輸入的文本。

Cookies

你可以通過(guò)使用cookies在客戶機(jī)上存放各種有用的信息,你可以創(chuàng)建一個(gè)有名字的cookie,并且設(shè)定一個(gè)指定的值。為了將這個(gè)cookie發(fā)送到瀏覽器,你需要在CGI#out中設(shè)置cookie 頭(header)。

require?"cgi"
cookie?=?CGI::Cookie.new("rubyweb",?"CustID=123",?"Part=ABC");
cgi?=?CGI.new("html3")
cgi.out(?"cookie"?=>?[cookie]?){
??cgi.html{
????"\nHTML?content?here"
??}
}
produces:
Content-Type:?text/html
Content-Length:?86
Set-Cookie:?rubyweb=CustID%3D123&Part%3DABC;?path=

 
<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?3.2?Final//EN"><HTML>       
HTML?content?here</HTML>
   

當(dāng)用戶下次訪問(wèn)這個(gè)頁(yè)面時(shí),你可以取得cookie CustIDPart,然后將它們顯示在HTML輸出中。

require?"cgi"
cgi?=?CGI.new("html3")
cgi.out{
??cgi.html{
????cgi.pre{
??????cookie?=?cgi.cookies["rubyweb"]
????????"\nCookies?are\n"?+?cookie.value.join("\n")
????}
??}
}
produces:
Content-Type:?text/html
Content-Length:?111


<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?3.2?Final//EN"><HTML><PRE>       
Cookies?are       
CustID=123       
Part=ABC</PRE></HTML>
  

Sessions

cookies需要我們進(jìn)行一些人為處理后才變得有用,我們真正需要的是一個(gè)session:web客戶端的持久性的狀態(tài)。session在Ruby中用 CGI::Session處理,它也使用了cookie,但是提供了一個(gè)高層次的接口。

 
require?"cgi"        
require?"cgi/session"
 
cgi?=?CGI.new("html3")        
sess?=?CGI::Session.new(?cgi,?"session_key"?=>?"rubyweb",        
??????????????????????????"session_id"??=>?"9650",        
??????????????????????????"new_session"?=>?true,        
??????????????????????????"prefix"?=>?"web-session.")        
sess["CustID"]?=?123        
sess["Part"]?=?"ABC"
 
cgi.out{        
??cgi.html{        
????"\nHTML?content?here"        
??}        
}
    

這將給用戶rubyweb發(fā)送一個(gè)cookie,它的值為9650。它也會(huì)在服務(wù)器的上建立一個(gè)文件$TMP/web-session.9650,以“鍵-值”(key-value)的方式保存著CustID和Part的值。

當(dāng)這個(gè)用戶又訪問(wèn)這個(gè)網(wǎng)站時(shí),你需要一個(gè)參數(shù)指明session id。在這個(gè)例子里應(yīng)該是rubyweb=9650,然后,你就可以取得所有和這個(gè)sesion相關(guān)的數(shù)據(jù)了。

require?"cgi"
require?"cgi/session"

cgi?=?CGI.new("html3")         
sess?=?CGI::Session.new(?cgi,?"session_key"?=>?"rubyweb",         
???????????????????????????????"prefix"?=>?"web-session.")         
cgi.out{         
??cgi.html{         
????"\nCustomer?#{sess['CustID']}?orders?an?#{sess['Part']}"         
??}         
}
 

將Ruby嵌入HTML

到目前為止我們已經(jīng)看過(guò)了用Ruby創(chuàng)建HTML文件和顯示它,下面我們來(lái)看看如何將Ruby嵌入HTML文檔中。

有好幾個(gè)包支持我們將Ruby嵌入其它文檔中,特別是HTML頁(yè)面,一般來(lái)說(shuō),這叫做eRuby,它的實(shí)現(xiàn)也有好幾種,比如eruby和erb。下面的部分將介紹eruby。

將Ruby腳本嵌入HTML非常有用,我們不僅能像ASP,JSP,PHP一樣使用它,而且還能發(fā)揮Ruby的力量。

使用eruby

eruby 簡(jiǎn)單來(lái)說(shuō)就像一個(gè)過(guò)濾器,對(duì)于輸入的文件中的普通HTML內(nèi)容,它將不會(huì)做什么處理,而對(duì)下面的格式的代碼進(jìn)行特殊處理:

 

表達(dá)式 意義
<% ruby code %> 將定界符內(nèi)的Ruby代碼轉(zhuǎn)換為它的結(jié)果輸出
<%= ruby expression %> 輸出這個(gè)表達(dá)式的值到HTML中
<%# ruby code %> 代碼注釋?zhuān)@些內(nèi)容將被忽略。對(duì)測(cè)試來(lái)說(shuō)可能有用。

調(diào)用eruby的方法如下:

eruby [
            options
            ] [
            document
            ]

如果document忽略,則eruby將從標(biāo)準(zhǔn)輸入讀取。eruby的命令行參數(shù)如下:

 
Option Description
-d, --debug 設(shè)置$DEBUG 為 true.
-K kcode 指定不同的編碼系統(tǒng)(coding system 參見(jiàn)137頁(yè))
-M mode 指定運(yùn)行模式,為下面之一:
f 過(guò)濾模式
c CGI 模式(將錯(cuò)誤打印為HTML, 設(shè)置$SAFE=1)
n NPH-CGI 模式(打印額外的頭部為HTTP,設(shè)置$SAFE=1)
-n, --noheader 禁止CGI頭部( header)輸出
-v, --verbose 允許詳細(xì)(verbose )模式
--version 打印出版本信息并退出程序

讓我們來(lái)看一些簡(jiǎn)單的例子,假如我們給eruby運(yùn)行時(shí)候的輸入為下面的內(nèi)容:

This?text?is?<%?a?=?100;?puts?"#{a}%?Live!"?%>

eruby 將把<%和%>之間的Ruby代碼換成它執(zhí)行后的值然后顯示出來(lái)。
This?text?is?100%?Live!

使用 <%= 的形式,直接將后面的表達(dá)式的值輸出,比如,我們的輸入如下:

<%a?=?100%>This?text?is?almost?<%=a%>?degrees!?Cool!

將=a替換為a的實(shí)際值,如下:
This?text?is?almost?100?degrees!?Cool!

當(dāng)然,你也可以將Ruby嵌入更復(fù)雜的文檔,比如HTML。

 

<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01//EN">
<html>
<head>
<title>eruby?example</title>
</head>
<body>
<h1>Enumeration</h1>
<ul>
<%(1..10).each?do|i|%>
??<li>number?<%=i%></li>
<%end%>
</ul>
<h1>Environment?variables</h1>
<table>
<%ENV.keys.sort.each?do?|key|%>
??<tr>
????<th><%=key%></th><td><%=ENV[key]%></td>
??</tr>
<%end%>
</table>
</body>
</html>

在 Apache中安裝eruby

你可以安裝一個(gè)使用eRuby的Apache服務(wù)器來(lái)自動(dòng)解析嵌入Ruby的文檔,就像PHP那樣。你可以將嵌入Ruby的文檔命名為以`.rhtml'' 為后綴,然后設(shè)置web服務(wù)器來(lái)調(diào)用eruby來(lái)解析這些文件輸出想要的HTML。

為了在Apache中使用eruby,需要以下幾步。

 

  • 將可執(zhí)行的 eruby 程序拷貝到 cgi-bin 目錄

  • httpd.conf 文件中增加如下兩行:

    AddType?application/x-httpd-eruby?.rhtml
    Action?application/x-httpd-eruby?/cgi-bin/eruby
    

  • 如果需要,你可以在你的 DirectoryIndex 指令中加入 index.rhtml,這樣,如果你的目錄下面如果沒(méi)有index.html文件,則就會(huì)使用index.rhtml文件作為index頁(yè)。比如下面的例子

    DirectoryIndex?index.html?index.shtml?index.rhtml
    

    當(dāng)然,你也可以用一個(gè)作用于一個(gè)全站點(diǎn)范圍的Ruby腳本

    Of course, you could also simply use a site-wide Ruby script as well.

    DirectoryIndex?index.html?index.shtml?/cgi-bin/index.rb
    

就是如此,你可以在HTML文檔中加入嵌入的Ruby腳本來(lái)動(dòng)態(tài)地創(chuàng)建表單和內(nèi)容。但也請(qǐng)你閱讀一下從497頁(yè)開(kāi)始的CGI庫(kù)。

提高性能

你可以使用Ruby為web編寫(xiě)CGI程序,但是,如同其它CGI程序一樣,默認(rèn)得設(shè)置下,對(duì)每個(gè)cgi頁(yè)面的請(qǐng)求都將產(chǎn)生一個(gè)新的Ruby進(jìn)程,這將占用服務(wù)器很多的資源,而且容易引起性能的下降。Apache web服務(wù)器通過(guò)使用可裝載的模塊來(lái)解決這個(gè)問(wèn)題。

一般來(lái)說(shuō),這些模塊都會(huì)動(dòng)態(tài)的被載入,而且會(huì)成為Web服務(wù)器進(jìn)程的一部分,也就是說(shuō)不需要每次有CGI請(qǐng)求進(jìn)來(lái)都產(chǎn)生一個(gè)Ruby解釋器程序,Web服務(wù)器就充當(dāng)了解釋器的角色。

所以我們會(huì)用到mod_ruby,它會(huì)將Ruby解釋器連接(links)到Web服務(wù)器,關(guān)于它的具體信息可以看它的發(fā)布程序附帶的README文件。

一旦你安裝配置好之后,你就可以像原來(lái)一樣運(yùn)行Ruby腳本,不同的是現(xiàn)在地速度應(yīng)該是快很多了。


Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide"
Copyright ? 2001 by Addison Wesley Longman, Inc. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/)).

Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.

Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.
Vorheriger Artikel: N?chster Artikel: