天天看點

Ruby寫Servlet的小例子

ruby也能寫servlet?是的,沒開玩笑,而且挺友善的,因為ruby的标準庫就自帶了一個webrick,webrick本身又有一個serlvet容器,随時随地啟動一個web server,實在是很友善。

    先看個最簡單的例子,輸出hello到浏覽器:

require 'webrick'

require 'net/http'

include webrick

class helloservlet < httpservlet::abstractservlet

  def hello(resp)

    resp["content-type"]="text/html;charset=utf-8"

    resp.body="hello,ruby servlet"

  end

  private :hello

  def do_get(req,resp)

    hello(resp)

  def do_post(req,resp)

end

if $0==__file__

  server=httpserver.new(:port=>3000)

  server.mount("/hello",helloservlet)

  trap("int"){ server.shutdown }

  server.start

    是不是跟java很像?所有的serlvet都要繼承自httpservlet::abstractservlet,并實作do_get或者do_post方法。在這行代碼:

server=httpserver.new(:port=>3000)

    我們啟動了一個http server,端口是3000,然後将helloservlet挂載到/hello這個路徑上,是以,執行這個腳本後,可以通過http://localhost:3000/hello調用helloservlet,簡單地隻是顯示字元串"hello,ruby servlet"。

    這個簡單的例子沒有任何互動,并且顯示的html也是寫死在腳本中,顯然更好的方式應該通過模闆來提供,可以使用ruby标準庫的erb模闆。再給個有簡單互動的例子,現在要求使用者輸入姓名,然後送出給helloservlet,顯示"hello,某某某"。嗯,來個最簡單的送出頁面:

<html>

<body>

<center>

   <form action="http://localhost:3000/hello" method="post">

     <input type="text" name="name" size=10/><br/><br/>

     <input type="submit" name="submit" value="submit"/>

   </form>

   </center>

</body>

</html>

    注意到,我們采用post方法送出。再看看erb模闆:

    <head></head>

    <body>

      hello,<%=name%>

    </body>

</html>   

    其中的name是我們将要綁定的變量,根據使用者送出的參數。最後,修改下helloservlet:

    do_post(req,resp)

    name=req.query["name"]

    #讀取模闆檔案

    template=io.read(file.dirname(__file__)+"/hello.html")

    message=erb.new(template)

    resp.body=message.result(binding)

    與前一個例子相比,不同點有二,一是通過req.query["name"]獲得使用者送出的參數name,二是resp的body是由模闆産生,而不是寫死在代碼中。在一些臨時報表、臨時資料的展示上,可以充分利用ruby的這些标準庫來快速實作。

文章轉自莊周夢蝶  ,原文釋出時間2008-07-23