elegante...
Spiffy es un marco web que utiliza Scala, Akka (una implementación de actor de Scala) y la API Java Servelet 3.0. Hace uso de la interfaz asíncrona y tiene como objetivo proporcionar un entorno masivamente paralelo y escalable para aplicaciones web. Los diversos componentes de Spiffy se basan todos en la idea de que deben ser módulos minimalistas independientes que realicen pequeñas cantidades de trabajo muy rápidamente y entreguen la solicitud al siguiente componente en el proceso. Una vez que el último componente termina de procesar la solicitud, envía una señal al contenedor de servlets "completando" la solicitud y enviándola de regreso al cliente.
Añade algunas rutas:
// 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()
Escribe el controlador:
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)
}
}
Luego crea algunas plantillas. Puede encontrar más información sobre este ejemplo consultando NewsController y SpiffyConfig.
Por el momento, para usar Spiffy debes compilar el jar (mvn jar:jar) y agregarlo al classpath de tu aplicación. También debe definir la siguiente variable de entorno (context.xml servirá):
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
Debe reemplazar org.spiffy.config.SpiffyBuiltinConfig
con un objeto que extienda org.spiffy.config.SpiffyConfig
y proporcione todos los valores necesarios. Eche un vistazo a SpiffyConfig para ver un ejemplo.
Spiffy confía en los actores de Akka para compartimentar y aislar todos sus diversos componentes. Cada componente del proceso Spiffy (excepto el filtro inicial) está compuesto por un grupo de actores de Akka. Los actores ingeniosos están respaldados por grupos de equilibrio de carga de diferentes tipos de despachadores.
Spiffy se implementa como un filtro. Después de que el filtro recibe la solicitud, la pone en modo asíncrono y la envía al enrutador. Luego, el enrutador decide qué hacer con la solicitud inspeccionando la URL de la solicitud y evaluándola con su lista de asignaciones de controladores conocidos. Una asignación es una expresión regular que coincide con la URL solicitada y la asigna al controlador correspondiente. Si se encuentra una coincidencia exitosa, el enrutador enviará un mensaje al controlador con la solicitud (y todos los objetos necesarios que deben enviarse junto con ella). En ese momento, el trabajo del enrutador habrá terminado y podrá procesar nuevas solicitudes entrantes. Después de que el controlador recibe la solicitud, realizará cualquier lógica que necesite en la solicitud y puede decidir finalizar la solicitud o pasarla a otro componente de Spiffy (generalmente un controlador de vista).
Spiffy utiliza el concepto de ganchos para realizar una lógica que se puede encapsular y ejecutar antes y después de ciertos componentes de la canalización del marco. Los ganchos se pueden ejecutar antes y después de los controladores y las vistas. Un enlace que se ejecutará antes de que un controlador pueda decidir omitirlo por completo o podría simplemente realizar alguna lógica como autenticación o modificar la solicitud en sí antes de que el controlador tenga la oportunidad de trabajar con ella. Un enlace que se ejecuta después de un controlador también puede redirigir la solicitud a un controlador diferente, modificarla o finalizarla allí mismo enviándola de regreso al cliente. La misma lógica se usa en las vistas frontal y posterior donde el gancho puede detener la visualización de la vista por completo o puede pasar la salida renderizada a otra parte del marco que puede realizar trabajo adicional en la salida renderizada.