AIGC在金融场景是如何落地的? 了解详情
写点什么

Scalatra: Sinatra 风格的 Scala Web 框架

  • 2010-10-22
  • 本文字数:2516 字

    阅读完需:约 8 分钟

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

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

<pre id="zw-12ba4acca7aF3spbf3ec91"><span id="zw-12ba4acca7aJ757xr3ec91">package org.scalatra<p>class ScalatraExample extends ScalatraServlet {</p><p> // send a text/html content type back each time</p><br></br> before {<br></br> contentType = "text/html"<br></br> }<p> // parse matching requests, saving things prefixed with ':' as params</p><br></br> get("/date/:year/:month/:day") {<br></br> <ul><br></br> <li>Year: {params("year")}</li><br></br> <li>Month: {params("month")}</li><br></br> <li>Day: {params("day")}</li><br></br> </ul><br></br> }<p> // produce a simple HTML form</p><br></br> get("/form") {<br></br> <form action='/post' method='POST'><br></br> Post something: <input name='submission' type='text'/><br></br> <input type='submit'/><br></br> </form><br></br> }<p> // handle POSTs from the form generated above</p><br></br> post("/post") {<br></br> <h1>You posted: {params("submission")}</h1><br></br> }<p> // respond to '/' with a greeting</p><br></br> get("/") {<br></br> <h1>Hello world!</h1><br></br> }<p> // send redirect headers</p><br></br> get("/see_ya") {<br></br> redirect("http://google.com")<br></br> }<p> // set a session var</p><br></br> get("/set/:session_val") {<br></br> session("val") = params("session_val")<br></br> <h1>Session var set</h1><br></br> }<p> // see session var</p><br></br> get("/see") {<br></br> session("val") match {<br></br> case Some(v:String) => v<br></br> case _ => "No session var set"<br></br> }<br></br> }<p> // Actions that return byte arrays render a binary response</p><br></br> get("/report.pdf") {<br></br> contentType = "application/pdf"<br></br> val pdf = generatePdf()<br></br> pdf.toBytes<br></br> }<p> notFound {</p><br></br> response.setStatus(404)<br></br> "Not found"<br></br> }<br></br>}</span>

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 允许用户免费使用,而且提供了多种下载方式。

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

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

2010-10-22 00:299120
用户头像

发布了 76 篇内容, 共 22.5 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

第二章作业

Deborah

就是没想法?你可能太理性了!

Justin

心理学 创意 28天写作

《分布式云边缘容器服务能力要求》《分布式云运维服务能力要求》标准研讨会成功召开

浪潮云

云计算 分布式

【JS】执行静态代码

德育处主任

JavaScript 大前端 js 28天写作

产品经理训练营作业-利益相关方

郭郭

产品训练营第二章作业

Geek_79e983

SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

vivo互联网技术

数据库 ThreadLocal springboot Spring Boot 2 HikariCP

面试必问:如何实现Redis分布式锁

华为云开发者联盟

redis 分布式锁 redisson

产品经理-作业2

简小一

Spring Boot 搭建实际项目开发中的架构

武哥聊编程

Java 架构 springboot SpringBoot 2 28天写作

【Skeleton】布局

德育处主任

CSS 大前端 html/css 28天写作 纯CSS

批判性思维自修课(二)

石君

28天写作 批判性思维

第二周作业-利益相关方

Au revoir

【CSS】文字毛玻璃效果(简单版)

德育处主任

html/css CSS小技巧 28天写作 纯CSS

从JAVA内存到垃圾回收,带你深入理解JVM

华为云开发者联盟

Java JVM 内存 虚拟机 垃圾回收

一点点感慨--移民二代

张老蔫

28天写作

GNUCash 3: 科目布局

lidaobing

GNUCash 28天写作

Elasticsearch partial update

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

请给我一个被辞退的正当理由

熊斌

职场 28天写作

静下心来

阿萌

程序人生 28天写作 青城

【CSS】角标(伪元素)

德育处主任

css3 html/css 28天写作 纯CSS

react-router学习笔记

hao-kuai

React-Router

第四课作业

糯米~

产品经理训练营-第二、三周作业

发条檀木

产品经理训练营

开发质量提升系列:问题登记列表(上)

罗小龙

生产事故 28天写作 解决思路

卡在了去治疗拖延的路上「幻想短篇 18/28」

道伟

28天写作

Soul 源码阅读 04|Zookeeper 同步数据分析

哼干嘛

Mybatis【15】-- Mybatis一对一多表关联查询

秦怀杂货店

mybatis

28天瞎写的第二百二十八天:用 UltraEdit 找优越感的故事

树上

28天写作 UltraEdit

机器学习·笔记之:这节课在干啥?

Nydia

酒话?醉话?真话?写在2021年的开始

ITCamel

2020年总结 2021年展望

  • 扫码添加小助手
    领取最新资料包
Scalatra: Sinatra风格的Scala Web框架_Java_Dio Synodinos_InfoQ精选文章