|
|||
#!/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" |
CGI verwenden.
CGI liefert Hilfe beim Schreiben von CGI-Scripten. Mit ihr kann man Formulare, Cookies und die Umgebung manipulieren,
maintain stateful
sessions, and so on.
Die genaue Dokumentation gibt es im Referenz-Abschnitt ab Seite 501, aber wir riskieren hier schon mal einen schnellen Blick auf die Möglichkeiten.
%2F'' übersetzt und muss vor der Benutzung wieder in ``/'' zurückübersetzt werden. Dafür gibt es in CGI die Routinen
CGI.escape und CGI.unescape:
require 'cgi' puts CGI.escape( "Nicholas Payton/Trumpet & Flugel Horn" ) |
Nicholas+Payton%2FTrumpet+%26+Flugel+Horn |
require 'cgi' puts CGI.escapeHTML( '<a href="/mp3">Click Here</a>' ) |
<a href="/mp3">Click Here</a> |
require 'cgi'
puts CGI.escapeElement('<hr><a href="/mp3">Click Here</a><br>','A')
|
<hr><a href="/mp3">Click Here</a><br> |
A''-Tag behandelt; andere Tags bleiben verschont. Jede dieser Methoden besitzt eine ``un-''Version, um den Original-Zustand wiederherzustellen.
CGI erlaubt einem den Zugriff auf die Parameter einer HTML-Anfrage auf zwei Wegen.
Nehmen wir an, wir haben folgende URL:
/cgi-bin/lookup?player=Miles%20Davis&year=1958. Man kann dann auf die Parameter ``player'' und ``year'' mit CGI#[] direkt zugreifen:
require 'cgi' |
||
cgi = CGI.new |
||
cgi['player'] |
» | ["Miles Davis"] |
cgi['year'] |
» | ["1958"] |
Hash rausziehen:
require 'cgi' |
||
cgi = CGI.new |
||
h = cgi.params |
||
h['player'] |
» | ["Miles Davis"] |
CGI enthält eine immense Anzahl an Methoden, um HTML zu erzeugen --- eine Methode pro Tag. Um diese Methoden zu benutzen, muss man ein CGI-Objekt mit CGI.new erzeugen und ihm den gewünschten HTML-Level mitgeben. In diesen Beispielen benutzen wir ``html3''.
Um das Verschachteln von Tags einfacher zu machen, holen sich diese Methoden den Inhalt als Code-Block. Diese Code-Blöcke sollten einen
String zurückgeben, der als Inhalt für den Tag dient. In diesem Beispiel haben wir ein paar überschüssige Zeilenumbrüche eingebaut, damit der Output auf eine Seite passt.
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
}
}
}
}
|
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 COLS="70" NAME="get_text" ROWS="10"></TEXTAREA> <BR><INPUT TYPE="submit"></FORM></BODY></HTML> |
get_text'', der den eingegebenen Text enthält.
CGI#out setzen.
require "cgi"
cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC");
cgi = CGI.new("html3")
cgi.out( "cookie" => [cookie] ){
cgi.html{
"\nHTML content here"
}
}
|
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> |
CustID und Part wie im folgenden HTML-Output gezeigt erhalten.
require "cgi"
cgi = CGI.new("html3")
cgi.out{
cgi.html{
cgi.pre{
cookie = cgi.cookies["rubyweb"]
"\nCookies are\n" + cookie.value.join("\n")
}
}
}
|
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> |
CGI::Session-Klasse bearbeitet (ab Seite 508 dokumentiert), die auch Cookies benutzt aber ein höheres Level an Abstraktion bietet.
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"
}
}
|
$TMP/web-session.9650 erzeugt mit dem key, value-Paar für CustID und Part.
Wenn der User jetzt wiederkommt, braucht man nur noch den Parameter, der die Session-Id angibt. In diesem Beispiel ist das rubyweb=9650. Mit dem Wert aus diesem Parameter kann man sich dann den ganzen Satz der gesicherten Session-Daten holen.
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']}"
}
}
|
eruby oder erb. Im Rest dieses Abschnitts bschreiben wir eruby von Shugo Maeda.
Ruby in HTML einzubetten ist ein sehr machvolles Konzept --- man hat damit grundsätzlich die selben Fähigkeiten wie mit ASP, JSP oder PHP, aber mit der vollen Kraft von Rubin.
eruby nichts anderes als ein Filter. Jeglicher Text, der vom Input kommt, wird unberührt weitergeleitet, mit den folgenden Ausnahmen:
| Ausdruck | Beschreibung | |||||||
<%Ruby-Code%> |
Der Ruby-Code in spitzen Klammern wird durch sein Ergebnis ersetzt. | |||||||
<%=Ruby-Ausdruck%> |
Der Ruby-Ausdruck in spitzen Klammern wird durch seinen Wert ersetzt. | |||||||
<%#Ruby-Code%> |
Der Ruby-Code in spitzen Klammern wird ignoriert (beim Testen ganz nützlich). | |||||||
eruby auf mit:
eruby [options][document] |
eruby vom Standard-Input. Die Kommandozeilen-Optionen für eruby zeigt Tabelle
14.1 auf Seite 151.
Kommandozeilen-Optionen für eruby
| ||||||||||||||||||||||||||||||
eruby folgenden Input bearbeiten.
This text is <% a = 100; puts "#{a}% Live!" %>
|
eruby ersetzt den Ausdruck zwischen den spitzen Klammern und erzeugt
This text is 100% Live! |
<%a = 100%>This text is almost <%=a%> degrees! Cool! |
=a durch den Wert von a ersetzt.
This text is almost 100 degrees! Cool! |
<!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> |
.rhtml'' Namensergänzung und konfiguriert den Web-Server so, dass er eruby über diese Dateien laufen lässt, was dann den gewünschten HTML-Output ergibt.
Wenn man eruby auf seinem Apache-Web-Server laufen lassen will, muss man folgende Schritte ausführen:
eruby-Binär-Datei ins cgi-bin-Verzeichnis.
httpd.conf hinzu:
AddType application/x-httpd-eruby .rhtml Action application/x-httpd-eruby /cgi-bin/eruby |
DirectoryIndex Anweisung so ändern, dass sie index.rhtml enthält. Damit kann man Ruby auch ein Verzeichnis auflisten lassen, das kein index.html enthält. Als Beispiel bringt die folgende Anweisung das eingebettete Ruby-Script dazu, nach index.rhtml zu suchen, falls kein index.html oder index.shtml in dem Verzeichnis vorhanden ist.
DirectoryIndex index.html index.shtml index.rhtml |
DirectoryIndex index.html index.shtml /cgi-bin/index.rb |
CGI-Bibliothek ab Seite 501 ansehen.
mod_ruby (erhältlich in den Archiven), ein Apache-Modul, das einen kompletten Ruby-Interpreter in den Apache-Web-Server linkt. Die README-Datei, die bei mod_ruby dabei ist, sagt einem alles, wie man das kompilieren und installieren muss.
Ist das erstmal installiert und konfiguriert, dann kann man Ruby-Scripts genauso laufen lassen wie vorher ohne mod_ruby, nur dass das Ganze jetzt wesentlich schneller ist.