Ruby写Servlet的小例子

    xiaoxiao2024-01-19  174

    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)   end    def  do_POST(req,resp)     hello(resp)   end end if  $0 == __FILE__   server = HTTPServer.new(:Port => 3000 )   server.mount( " /hello " ,HelloServlet)   trap( " INT " ){ server.shutdown }   server.start end     是不是跟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模板: < html >      < head ></ head >      < body >       hello, <%= name %>      </ body > </ html >         其中的name是我们将要绑定的变量,根据用户提交的参数。最后,修改下HelloServlet: require  ' webrick ' require  ' net/http ' include WEBrick class  HelloServlet  <  HTTPServlet::AbstractServlet    def  do_GET(req,resp)     do_POST(req,resp)   end    def  do_POST(req,resp)     name = req.query[ " name " ]      # 读取模板文件     template = IO.read(File.dirname( __FILE__ ) + " /hello.html " )     message = ERB.new(template)     resp[ " Content-Type " ] = " text/html;charset=utf-8 "     resp.body = message.result(binding)   end end if  $0 == __FILE__   server = HTTPServer.new(:Port => 3000 )   server.mount( " /hello " ,HelloServlet)   trap( " INT " ){ server.shutdown }   server.start end

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

    文章转自庄周梦蝶  ,原文发布时间2008-07-23     

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)