漂亮...
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 使用钩子的概念来执行可以封装并在框架管道的某些组件之前和之后运行的逻辑。挂钩可以在控制器和视图之前和之后运行。在控制器决定完全绕过控制器之前运行的钩子,或者可能只是在控制器有机会使用它之前执行一些逻辑,例如身份验证或修改请求本身。在控制器之后运行的钩子还可以将请求重新路由到不同的控制器,修改它,或者在那里终止它,然后将其发送回客户端。在前视图和后视图中使用相同的逻辑,其中钩子可以完全阻止视图渲染,或者可能将渲染的输出传递到框架的另一部分,该部分可以对渲染的输出执行额外的工作。