Ross:Sinatra框架族是因?yàn)樗鼈儤O其的輕量而引人注目:如果你已經(jīng)熟悉了目標(biāo)語(yǔ)言以及HTTP基本知識(shí),那么,這些框架幾乎可以立即讓你富于生產(chǎn)率。
InfoQ:你選擇Scala開(kāi)發(fā)web框架的原因是什么?
Ross:我在學(xué)校里面花了四年時(shí)間來(lái)學(xué)習(xí)函數(shù)式編程的優(yōu)雅。隨后,我又在Java上浸淫了十年——即便不欣賞語(yǔ)言其本身,我也欣賞其龐大的類(lèi)庫(kù)。Scala把這兩個(gè)世界巧妙地結(jié)合了起來(lái)。對(duì)于Scala,我根本毋需多想。
InfoQ:什么特性是其他Scala框架(例如Lift)所缺失的?
Ross:無(wú)論是作為一個(gè)框架,抑或是一個(gè)社區(qū),Lift都很令人稱(chēng)贊,但我對(duì)它部分的核心假設(shè)很糾結(jié)。具體來(lái)說(shuō),Lift擁抱了會(huì)話(huà)狀態(tài),隱藏了HTTP,而我傾向于擁抱HTTP,并且避免會(huì)話(huà)狀態(tài),F(xiàn)在,這不再是非黑即白:你可以使用Lift構(gòu)建一個(gè)RESTful應(yīng)用程序,你也可以使用Scalatra構(gòu)建一個(gè)Stateful應(yīng)用程序,但每種框架都是針對(duì)不同類(lèi)型的應(yīng)用程序而調(diào)整。我很高興我們同時(shí)擁有這兩者。
InfoQ:你能針對(duì)Scalatra應(yīng)用的不同組成部分給我們做一個(gè)概要介紹嗎?
Ross:Scalatra是簡(jiǎn)單的DSL。你可以把整個(gè)應(yīng)用程序?qū)懺谝粋(gè)類(lèi)里面。(無(wú)論這是否緣于節(jié)儉,抑或是取決于應(yīng)用程序的大小。)然后,再在web.xml里面加上幾行,這就是一個(gè)有效的Scalatra應(yīng)用。
InfoQ:對(duì)于正在考慮從Java Web框架切換到Scalatra的團(tuán)隊(duì),你有什么建議?他們應(yīng)該注意哪些常見(jiàn)的陷阱,有哪些好的遷移策略?
Ross:要遷移Java應(yīng)用程序,我建議在同一個(gè)web-app元素里面定義一個(gè)ScalatraFilter。然后,你就可以一次一個(gè)頁(yè)面地進(jìn)行遷移。如果Scalatra找到了一個(gè)匹配的路由,那它就會(huì)進(jìn)行處理。否則,該請(qǐng)求就會(huì)被傳給之前的servlet。
另外,請(qǐng)記住,Java與Scala中的互操作性是雙向的。這意味著,不需要嚴(yán)格地逐層由Java遷移到Scala。僅僅移植那些需要修改的代碼,而且在需求再次發(fā)生變化之前,不必?fù)?dān)心保留了可工作的、經(jīng)過(guò)時(shí)間檢驗(yàn)的Java代碼。
InfoQ:最近LinkedIn宣布,他們已經(jīng)在LinkedIn Signal上使用了Scalatra。你有沒(méi)有其他的實(shí)際例子?你看到人們?cè)谑裁搭?lèi)型的應(yīng)用程序中使用了Scalatra?
Ross:除了LinkedIn,ChaCha現(xiàn)在也是成功使用了Scalatra開(kāi)發(fā)內(nèi)部API和管理的應(yīng)用程序。他們特別喜歡Scalate的模板整合。我至少知道兩個(gè)來(lái)自于創(chuàng)業(yè)公司的正在進(jìn)行中的Scalatra項(xiàng)目——將來(lái)我們就可以很激動(dòng)地宣布了。作為Scalatra應(yīng)用程序,RESTful API已經(jīng)非常普遍。
正如Scala是一個(gè)可擴(kuò)展的語(yǔ)言,Scalatra也是一個(gè)可擴(kuò)展的框架。您可以把HTML代碼和業(yè)務(wù)邏輯寫(xiě)到一起,從而快速地開(kāi)發(fā)應(yīng)用程序的原型。隨著項(xiàng)目的成熟,在把應(yīng)用系統(tǒng)重構(gòu)為n-層企業(yè)級(jí)別的應(yīng)用系統(tǒng)時(shí),你可以依賴(lài)或者不依賴(lài)編譯器和測(cè)試框架。我們把架構(gòu)的決定權(quán)留給你。
InfoQ:八月份發(fā)布了M1版本,你們對(duì)最終版本的規(guī)劃是什么時(shí)候?項(xiàng)目的路線圖是什么樣子的,你希望未來(lái)的版本會(huì)包括什么功能?
Ross:一些短期的目標(biāo)包括了Comet支持、將DSL從Servlet/Filter里面分離出來(lái)以更易于重新裝載(使用JRebel),以及創(chuàng)建真正的網(wǎng)站:我們將吃我們自己的狗糧。我們也有興趣增加OSGi的支持、嵌套路由以及增強(qiáng)的路由匹配選項(xiàng)。我們期待另一個(gè)里程碑——Scalate 1.3的發(fā)布,并且在2.0.0-final之前,我們希望對(duì)API進(jìn)行全面的審查以找出任何不一致的地方。