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