天天看点

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