庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

Ruby写Servlet的小例子

Posted on 2008-07-23 12:02 dennis 阅读(2873) 评论(0)  编辑  收藏 所属分类: 动态语言
    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的这些标准库来快速实现。
   

只有注册用户登录后才能发表评论。


网站导航: