
En esta serie introductoria a Play 2 Framework con Scala hemos hecho una muy breve introducción al lenguaje de programación Scala, además de descubrir como se crea el modelo de datos en una aplicación desarrollada con Play 2 Framework.
En esta nueva entrega vamos a descubrir como funciona el controlador. Como todos ya sabéis, Play 2 es un framework que sigue el patrón de diseño MVC ya que permite mantener sus diferentes componentes en orden y la lógica separada de la interfaz. Además, el patrón MVC está de moda en el desarrollo web desde hace ya varios años.
def hello = Action { request =>
Ok("Hello World!")
}
En el ejemplo anterior, Ok es un método que construye una respuesta 200 OK que contiene un cuerpo tipo text/plain. Existen muchos otros métodos que construyen respuestas “prefabricadas” a continuación el listado completo:
La idea detrás de todos estos métodos es que sean usados cuando sea necesario y se utilice el sistema de errores de HTTP de forma coherente. Por ejemplo podemos utilizar el método BadRequest de la siguiente forma:
def saluda = Action { implicit request =>
saludoForm.bindFromRequest.fold(
formWithErrors => BadRequest(html.createForm(formWithErrors)),
saludo => Ok("Hola %s".format(saludo.name))
)
}
También es posible generar respuestas “simples” (y flexibles) utilizando el método SimpleResult al que le pasamos como parámetros las cabeceras de la respuesta y el body, yo hago uso de este método para devolver JSON. Un ejemplo de uso sacado de la documentación de Play 2:
def index =Action{
SimpleResult(
header =ResponseHeader(200,Map(CONTENT_TYPE -> "text/plain")),
body =Enumerator("Hello world!")
) }
Por supuesto lo anterior es equivalente al primer ejemplo de este artículo. Además de esto podemos utilizar sencillas redirecciones con el método Redirect al que pasaremos como parámetro la ruta a donde reenviar al navegador y si lo queremos, un estado:
def index =Action{
Redirect("/user/home", status = MOVED_PERMANENTLY) }
package controllers
import play.api.data.Form
import play.api.data.Forms.{single, nonEmptyText}
import play.api.mvc.{Action, Controller}
import anorm.NotAssigned
import models.User
object Application extends Controller { val userForm = Form( single( “firstname” -> nonEmptyText, “lastname” -> nonEmptyText, “age” -> nonEmptyText ) def index = Action { Ok(views.html.index(userForm)) } def addUser() = Action { implicit request => userForm.bindFromRequest.fold( errors => BadRequest, { val person = Person(firstname, lastname, age) User.create(User(NotAssigned, person)) Redirect(routes.Application.index()) } ) } )
}
El objeto userForm mapea los parámetros de la petición a un objeto de tipo Form que puede aplicar validación a los datos introducidos. La función addUser maneja una petición e intenta mapear los parámetros de la petición al userForm. Si el proceso falla, se devuelve una respuesta tipo BadRequest, si no, se construye un nuevo objeto User que es guardado en la base de datos y se redirije el navegador al índice.
Nótese que al declarar request como implicit estamos haciéndolo accesible a otras APIs dentro del método addUser.
Esto es todo por hoy, en el siguiente artículo hablaremos sobre el enrutamiento.
Más en Genebeta Dev | Introducción a Play Framework 2