BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Scalatra: Sinatra风格的Scala Web框架

| 作者 Dio Synodinos 关注 4 他的粉丝 ,译者 金明 关注 0 他的粉丝 发布于 2010年10月23日. 估计阅读时间: 9 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

Scalatra是Scala Web框架,遵循了Ruby Web框架Sinatra的原则。Scalatra的原名是Step,而且LinkedIn Signal使用的Restful后台就是基于此框架开发

在Scalatra中,如同其他Sinatra风格的web框架,开发人员定义匹配路由和处理这些路由的代码:

package org.scalatra

class ScalatraExample extends ScalatraServlet {

// send a text/html content type back each time
before {
contentType = "text/html"
}

// parse matching requests, saving things prefixed with ':' as params
get("/date/:year/:month/:day") {
<ul>
<li>Year: {params("year")}</li>
<li>Month: {params("month")}</li>
<li>Day: {params("day")}</li>
</ul>
}

// produce a simple HTML form
get("/form") {
<form action='/post' method='POST'>
Post something: <input name='submission' type='text'/>
<input type='submit'/>
</form>
}

// handle POSTs from the form generated above
post("/post") {
<h1>You posted: {params("submission")}</h1>
}

// respond to '/' with a greeting
get("/") {
<h1>Hello world!</h1>
}

// send redirect headers
get("/see_ya") {
redirect("http://google.com")
}

// set a session var
get("/set/:session_val") {
session("val") = params("session_val")
<h1>Session var set</h1>
}

// see session var
get("/see") {
session("val") match {
case Some(v:String) => v
case _ => "No session var set"
}
}

// Actions that return byte arrays render a binary response
get("/report.pdf") {
contentType = "application/pdf"
val pdf = generatePdf()
pdf.toBytes
}

notFound {
response.setStatus(404)
"Not found"
}
}

InfoQ就Scalatra项目,采访了其合作者Ross Baker

InfoQ:Sinatra是一种流行的Ruby框架,正在被移植到多种语言上面。你认为它的最佳特性是什么,又是什么吸引了你?

Ross:Sinatra框架族是因为它们极其的轻量而引人注目:如果你已经熟悉了目标语言以及HTTP基本知识,那么,这些框架几乎可以立即让你富于生产率。

InfoQ:你选择Scala开发web框架的原因是什么?

Ross:我在学校里面花了四年时间来学习函数式编程的优雅。随后,我又在Java上浸淫了十年——即便不欣赏语言其本身,我也欣赏其庞大的类库。Scala把这两个世界巧妙地结合了起来。对于Scala,我根本毋需多想。

InfoQ:什么特性是其他Scala框架(例如Lift)所缺失的?

Ross:无论是作为一个框架,抑或是一个社区,Lift都很令人称赞,但我对它部分的核心假设很纠结。具体来说,Lift拥抱了会话状态,隐藏了HTTP,而我倾向于拥抱HTTP,并且避免会话状态。现在,这不再是非黑即白:你可以使用Lift构建一个RESTful应用程序,你也可以使用Scalatra构建一个Stateful应用程序,但每种框架都是针对不同类型的应用程序而调整。我很高兴我们同时拥有这两者。

InfoQ:你能针对Scalatra应用的不同组成部分给我们做一个概要介绍吗?

Ross:Scalatra是简单的DSL。你可以把整个应用程序写在一个类里面。(无论这是否缘于节俭,抑或是取决于应用程序的大小。)然后,再在web.xml里面加上几行,这就是一个有效的Scalatra应用。

InfoQ:对于正在考虑从Java Web框架切换到Scalatra的团队,你有什么建议?他们应该注意哪些常见的陷阱,有哪些好的迁移策略?

Ross:要迁移Java应用程序,我建议在同一个web-app元素里面定义一个ScalatraFilter。然后,你就可以一次一个页面地进行迁移。如果Scalatra找到了一个匹配的路由,那它就会进行处理。否则,该请求就会被传给之前的servlet。

另外,请记住,Java与Scala中的互操作性是双向的。这意味着,不需要严格地逐层由Java迁移到Scala。仅仅移植那些需要修改的代码,而且在需求再次发生变化之前,不必担心保留了可工作的、经过时间检验的Java代码。

InfoQ:最近LinkedIn宣布,他们已经在LinkedIn Signal上使用了Scalatra。你有没有其他的实际例子?你看到人们在什么类型的应用程序中使用了Scalatra?

Ross:除了LinkedIn,ChaCha现在也是成功使用了Scalatra开发内部API和管理的应用程序。他们特别喜欢Scalate的模板整合。我至少知道两个来自于创业公司的正在进行中的Scalatra项目——将来我们就可以很激动地宣布了。作为Scalatra应用程序,RESTful API已经非常普遍。

正如Scala是一个可扩展的语言,Scalatra也是一个可扩展的框架。您可以把HTML代码和业务逻辑写到一起,从而快速地开发应用程序的原型。随着项目的成熟,在把应用系统重构为n-层企业级别的应用系统时,你可以依赖或者不依赖编译器和测试框架。我们把架构的决定权留给你。

InfoQ:八月份发布了M1版本,你们对最终版本的规划是什么时候?项目的路线图是什么样子的,你希望未来的版本会包括什么功能?

Ross:一些短期的目标包括了Comet支持、将DSL从Servlet/Filter里面分离出来以更易于重新装载(使用JRebel),以及创建真正的网站:我们将吃我们自己的狗粮。我们也有兴趣增加OSGi的支持、嵌套路由以及增强的路由匹配选项。我们期待另一个里程碑——Scalate 1.3的发布,并且在2.0.0-final之前,我们希望对API进行全面的审查以找出任何不一致的地方。

Scalatra允许用户免费使用,而且提供了多种下载方式。

更多关于ScalaWeb框架的信息,就在InfoQ!

查看英文原文:Scalatra: A Sinatra-like Web Framework for Scala

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

有没有集成模板引擎 by yang xueping

对于产品化来说,模板引擎是必须的,不然只能在open api上发展

强烈关注,lift的评价一针见血 by fishx net

rt

lift的statefull是我放弃它选择play的原因之一 by Wei Roy

当然,play不是原生支持scala。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

3 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT