漂亮...
Spiffy 是使用 Scala、Akka(Scala actor 實作)和 Java Servelet 3.0 API 的 Web 框架。它利用非同步接口,旨在為 Web 應用程式提供大規模並行和可擴展的環境。 Spiffy 的各種組件都基於這樣的想法:它們需要是獨立的簡約模組,可以非常快速地完成少量工作並將請求移交給管道中的下一個組件。最後一個元件處理完請求後,它會透過「完成」請求並將其發送回客戶端來向 servlet 容器發出訊號。
新增一些路線:
// index page, no code, just text
"""^/$""".r -> "Welcome to Spiffy!",
// main news page
new Regex("""^/(news)/$""") -> NewsController(),
// view some news by id
new Regex("""^/(news)/(view)/(d+)/$""") -> NewsController()
編寫控制器:
def receive = {
// handles "news/add/"
case ControllerMsg(List("news", "save"), req, res, ctx) => {
// run validation on the request using Spiffy's validation DSL
var errors:Map[String, Set[String]] = validate (req) (
"email" as email confirmedBy "email_confirm",
"email_confirm" as email,
"title" as (string, 32),
"body" as string,
"tag" as string optional
) match {
case Some(List(errs,warns)) => { // Problem validating
errs
}
case None => None.toMap // passed validation
}
}
// handles "/news/"
case ControllerMsg(List("news"), req, res, ctx) => {
// load up news and stuff in map then render
val params = loadNews
view() ! ViewMsg("news", params, req, res, ctx)
}
// handles "/news/view/$newsId/"
case ControllerMsg(List("news", "view", newsId), req, res, ctx) => {
// usually you want to load the item, in this example we dont
// load item and set the params that the view will render
val news = loadNewsItem(newsId)
val params:Map[Any,Any] = Map("news" -> news)
// ask the view to render
view() ! ViewMsg("newsView", params, req, res, ctx)
}
}
然後創建一些模板。您可以透過查看 NewsController 和 SpiffyConfig 找到有關此範例的更多信息
目前,為了使用 Spiffy,您必須建立 jar (mvn jar:jar) 並將其新增至您的應用程式類別路徑中。您還必須定義以下環境變數(context.xml 即可):
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
您需要將org.spiffy.config.SpiffyBuiltinConfig
替換為擴展org.spiffy.config.SpiffyConfig
並提供所有所需值的物件。看一下 SpiffyConfig 的範例。
Spiffy 依賴 Akka Actor 來劃分和隔離其所有不同的元件。 Spiffy 管道中的每個組件(初始過濾器除外)都由 Akka Actor 池組成。 Spiffy Actor 由不同類型的調度程序的負載平衡池提供支援。
Spiffy 實作為一個過濾器 過濾器收到請求後,會將其置於非同步模式並將其傳送到路由器。然後,路由器透過檢查請求 URL 並根據已知控制器對應清單對其進行評估來決定如何處理該請求。映射是一個正規表示式,它匹配請求的 URL 並將其指派給相應的控制器。如果找到成功的匹配,路由器將向控制器發送請求(以及需要與其一起發送的所有所需對象)的訊息。此時路由器的工作就完成了,可以自由地處理新的傳入請求。控制器收到請求後,它將對請求執行所需的任何邏輯,並可以決定結束請求或將其傳遞給 Spiffy 的另一個元件(通常是視圖處理程序)。
Spiffy 使用鉤子的概念來執行可以封裝並在框架管道的某些組件之前和之後運行的邏輯。掛鉤可以在控制器和視圖之前和之後運行。在控制器決定完全繞過控制器之前運行的鉤子,或者可能只是在控制器有機會使用它之前執行一些邏輯,例如身份驗證或修改請求本身。在控制器之後運行的鉤子還可以將請求重新路由到不同的控制器,修改它,或者在那裡終止它,然後將其發送回客戶端。在前視圖和後視圖中使用相同的邏輯,其中鉤子可以完全阻止視圖渲染,或者可能將渲染的輸出傳遞到框架的另一部分,該部分可以對渲染的輸出執行額外的工作。