Ruby也能写servlet

  出处/blogjava

    Ruby也能写servlet?是的,没开玩笑,而且挺方便的,因为Ruby的标准库就自带了一个webrick,webrick本身又有一个serlvet容器,随时随地启动一个web server,实在是很方便。
    先看个最简单的例子,输出hello到浏览器:

  1. require 'webrick'
  2. require 'net/http'
  3. include WEBrick

  4. class HelloServlet < HTTPServlet::AbstractServlet
  5.   def hello(resp)
  6.     resp["Content-Type"]="text/html;charset=utf-8"
  7.     resp.body="hello,ruby servlet"
  8.   end
  9.   private :hello
  10.   def do_GET(req,resp)
  11.     hello(resp)
  12.   end
  13.   def do_POST(req,resp)
  14.     hello(resp)
  15.   end
  16. end
  17. if $0==__FILE__
  18.   server=HTTPServer.new(:Port=>3000)
  19.   server.mount("/hello",HelloServlet)
  20.   trap("INT"){ server.shutdown }
  21.   server.start
  22. end

是不是跟java很像?所有的serlvet都要继承自HTTPServlet::AbstractServlet,并实现do_GET或者do_POST方法。在这行代码:

  1. server=HTTPServer.new(:Port=>3000)

我们启动 了一个HTTP Server,端口是3000,然后将HelloServlet挂载到/hello这个路径上,因此,执行这个脚本后,可以通过http: //localhost:3000/hello调用HelloServlet,简单地只是显示字符串"hello,ruby servlet"。
    这个简单的例子没有任何交互,并且显示的html也是写死在脚本中,显然更好的方式应该通过模板 来提供,可以使用Ruby标准库的erb模板。再给个有简单交互的例子,现在要求用户输入姓名,然后提交给HelloServlet,显示"hello,某某某"。嗯,来个最简单的提交页面:

  1. <html>
  2. <body>
  3. <center>
  4.   <form action="http://localhost:3000/hello" method="post">
  5.     <input type="text" name="name" size=10/><br/><br/>
  6.     <input type="submit" name="submit" value="submit"/>
  7.   </form>
  8.   </center>
  9. </body>
  10. </html>

注意到,我们采用POST方法提交。再看看erb模板:

  1. <html>
  2.     <head></head>
  3.     <body>
  4.       hello,<%=name%>
  5.     </body>
  6. </html>

其中的name是我们将要绑定的变量,根据用户提交的参数。最后,修改下HelloServlet:

  1. require 'webrick'
  2. require 'net/http'
  3. include WEBrick

  4. class HelloServlet < HTTPServlet::AbstractServlet
  5.   def do_GET(req,resp)
  6.     do_POST(req,resp)
  7.   end
  8.   def do_POST(req,resp)
  9.     name=req.query["name"]
  10.     #读取模板文件
  11.     template=IO.read(File.dirname(__FILE__)+"/hello.html")
  12.     message=ERB.new(template)
  13.     resp["Content-Type"]="text/html;charset=utf-8"
  14.     resp.body=message.result(binding)
  15.   end
  16. end
  17. if $0==__FILE__
  18.   server=HTTPServer.new(:Port=>3000)
  19.   server.mount("/hello",HelloServlet)
  20.   trap("INT"){ server.shutdown }
  21.   server.start
  22. end

与前一个例子相比,不同点有二,一是通过req.query["name"]获得用户提交的参数name,二是resp的body是由模板产生,而不是写死在代码中。在一些临时报表 、临时数据的展示上,可以充分利用Ruby的这些标准库来快速实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值