Router

Como vimos en la sección del patrón Modelo Vista Controlador el router es el que a partir de una petición HTTP, invoca al método del controlador adecuado.

Para la configuración de las rutas se utiliza el fichero conf/routes

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page GET / Application.index

# Ignore favicon requests GET /favicon.ico 404

# Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public

# Catch all * /{controller}/{action} {controller}.{action}

Syntaxis del fichero de rutas

Method      UriPattern      ControllerCall

Methods

Play también soporta WS para indicar una petición de WebSocket

UriPattern

#Directo
/clients/all

#Parámetro que se pasara al controlador /clients/{id}

#Expresión regular por defecto /[^/]+/ /clients/{id}/accounts/{accountId}

#Expresiones regulares /clients/{<[0-9]+>id}
/clients/{<[a-z]{4,10}>id}

ControllerCall

package.Controller.method  //El paquete por defecto es controller

Prioridad en las rutas: Si hay conflicto se llama a la primera ruta, siguiendo el orden en el que fueron definidas.

Controlador

Los controladores son básicamente clases Java que extiende de la clase play.mvc.Controller y que tienen una serie de métodos “public static void” que son las acciones de cada controlador.

Signature de una acción del controlador

public static void action_name(params…);

Play hará el mapeo automático entre los parámetros que vienen de la petición HTTP y los parámetros que tiene el controlador. Normalmente las acciones no retornan ningún valor. La ejecución del método termina con llamada a un método result, por ejemplo el método render(…)

Parámetros de las acciones del controlador

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// HTTP Request /clients?id=1451

public static void show() { Long id = params.get(“id”, Long.class); }

public static void show(String id) { System.out.println(id); }

public static void show(Long id) { System.out.println(id);
}

public static void show(Long[] id) { for(String anId : id) { System.out.println(anid); } }

public static void show(List<Long> id) { for(String anId : id) { System.out.println(anid); } }

// JPA Object binding!!! // HTTP Request: // user?user.id=1&user.name=axel&user.address.id=34&user.address.street=Street

public static void save(User user) { user.save(); }

Puedes consultar los binding avanzados de parámetros en la documentación de play

http://www.playframework.org/documentation/1.2.3/controllers

Result types

Desde una acción, si llamas a otra acción, se enviará un Redirect. No hay un equivalente al forward de los Servlet.

El método más común es el método render

protected static void render(Object args)

Este método lo que hace es renderizar la plantilla definida para esta acción.

Si tenemos un controllador en

controller/Application.java    con un metodo que se llama   index

Renderizará la plantilla

views/Application/index.hml

Los parámetros que se le pasan al método, se le pasan directamente a la plantilla.

Creando nuestro controlador

app/controller/Timeline.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package controllers;

import java.util.List; import play.mvc.Controller; import models.*;

public class Timeline extends Controller {

<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">index</span><span class="o">(){</span>
    <span class="n">List</span><span class="o">&lt;</span><span class="n">Tweet</span><span class="o">&gt;</span> <span class="n">tweets</span> <span class="o">=</span> <span class="n">Tweet</span><span class="o">.</span><span class="na">find</span><span class="o">(</span><span class="s">"order by date desc"</span><span class="o">).</span><span class="na">fetch</span><span class="o">();</span>
    <span class="n">render</span><span class="o">(</span><span class="n">tweets</span><span class="o">);</span>
<span class="o">}</span>

}

conf/routes

1
GET   /  Timeline.index

Muy bien, ya tenemos el controlador creado, pero… ¿cómo lo probamos? Nos hace falta la vista para poder probarlo. Pasamos a la siguiente sección.