Controlador
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
# 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
Methods
- GET
- POST
- PUT
- DELETE
- HEAD
Play también soporta WS para indicar una petición de WebSocket
UriPattern
#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
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
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
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();
}
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
}
Result types
- render(…)
- renderText(String)
- renderBinary
- renderTemplate
- redirect
- renderJson
- renderTemplate
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
Este método lo que hace es renderizar la plantilla definida para esta acción.
Si tenemos un controllador en
Renderizará la plantilla
Los parámetros que se le pasan al método, se le pasan directamente a la plantilla.
Creando nuestro controlador
app/controller/Timeline.java
import java.util.List;
import play.mvc.Controller;
import models.*; public class Timeline extends Controller { }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package controllers;
<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"><</span><span class="n">Tweet</span><span class="o">></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.