¡La versión 2.0 de Play ya está lista! Ayúdanos a traducir la documentación de la útlima versión y sigue nuestro progreso.

Manuales, tutoriales & referencias

Consulte

Contenidos

Elija la versión

Buscar

Busque con google

Libros

Play 1.0.1 — Cambios de la versión 1.0.1

Play 1.0.1 es una actualización de mantenimiento de la versión de play 1.0. En esta se corrigen muchos bugs pequeños, hay mejoras en el binding para los objetos persistentes de JPA y el reemplazo automático de código en las plantillas HTML y Javascript para evitar problemas de seguiridad XSS.

play 1.0.1 es una versión de mantenimiento y es totalmente compatible con la versión 1.0. Si encuentras cualquier problema por favor pregúntenos en el grupo de Google.

Puede consultar la lista de los bugs corregidos en la página de avances de la versión 1.0.1. Los cambios más importantes están mencionados en esta página.

Reemplazo (escape) automático de código HTML en las plantillas

Ahora todas las expresiones dinámicas son reemplazadas (escaped) en el motor de plantillas para evitar ataques XSS en su aplicación. Así que si la variable title contiene <h1>Title</h1> es escapada de la siguiente manera:

${title} --> &lt;h1&gt;Title&lt;/h1&gt;

Si realmente quiere desplegar el texto en su forma original, debe llamar explícitamente al método raw():

${title.raw()} --> <h1>Title</h1>

Incluso si quiere desplegar un bloque de texto en HTML plano, puedes usar la etiqueta #{verbatim /}:

#{verbatim}
    ${title} --> <h1>Title</h1>
#{/verbatim}

Esta característica no está habilitada por defecto debido a que puede dañar aplicaciones existentes. Puedes habilitarla agregando la siguiente línea en su archivo application.conf:

future.escapeInTemplates=true

Esta línea será agregada a las nuevas aplicaciones creadas con la liberación 1.0.1.

Soporte para @javax.inject.Inject

Puede usar la anotación @Inject si está usando un contenedor de Inyección de Dependencias como el provisto por el módulo Spring. La anotación @Inject automáticamente inyecta los beans definidos en los controladores, tareas y envío de correos. Funciona en campos estáticos.

Por ejemplo, para inyectar un servicio en uno de sus controladores llamado PriceWatcher definido en Spring, solo es necesario hacer:

public class Application extends Controller {
    
    @Inject
    static PriceWatcher prices;
    
    public static void index() {
        prices.getAll(); // prices is defined here
    }
    
}

La auto recarga debe trabajar como lo esperado.

Mejoras en el binding para los objetos JPA

Anteriormente no había forma de hacer un binding automático de un objeto JPA proveniente de una llamada HTTP al controlador, por ejemplo:

public static void save(User user) {
    user.save(); // error en 1.0
}

Siendo User una entidad JPA, este código fallaba por que user era un objeto transitorio creado por el Binder y que aún no estaba manejado por Hibernate.

La forma en la que esto se hacía era con el método edit(), por ejemplo:

public static void save(Long id) {
    User user = User.findById(id);
    user.edit(params);
    user.save(); // ok
}

Ahora puede proveer la propiedad user.id en los parámetros HTTP. Cuando Play encuentra la propiedad id carga la instancia correspondiente desde la base de datos antes de editarla. Los demás parámetros en la solicitud HTTP son aplicados después, así que puede guardarla directamente:

public static void save(User user) {
    user.save(); // ok with 1.0.1
}

Esta característica no está habilitada por defecto debido a que puede dañar aplicaciones existentes. Puede habilitarla agregando la siguiente línea en su archivo application.conf:

future.bindJPAObjects=true

Esta línea será agregada a las nuevas aplicaciones creadas con la liberación 1.0.1.

El id de Framework puede ser establecido desde la línea de comandos

El id de framework permite establecer diferentes configuraciones para una misma aplicación de Play! (por ejemplo desarrollo, pruebas, producción, etc...).

Usando la línea de comando ahora puede especificar el id del framework que la aplicaicón va a usar, por ejemplo, para correr una aplicación en modo de producción:

play run --%production

Y con estas líneas definidas en el archivo application.conf:

application.mode=dev
%production.application.mode=prod

Es compatible con todos los párametros de configuración usando el id de framework. El id por defecto sigue siendo el definido usando el comando play id:

Por cierto, play test es equivalente a:

play run --%test

Validaciones personalizadas

¿No encuentra el validador que necesita en en paquete play.data.validation? Escriba el suyo. Puede usar la anotación @CheckWith genérica para acoplar su propia implementación de Check.

Por ejemplo:

public class User {
    
    @Required
    @CheckWith(MyPasswordCheck.class)
    public String password;
    
    static class MyPasswordCheck extends Check {
        
        public abstract boolean isSatisfied(Object user, Object password) {
            return notMatchPreviousPasswords(password);
        }
        
    }
}

Mejoras en el ejecutor de pruebas (Test runner)

Hemos actualizado a la versión final 1.0.1 de Selenium y mejoramos la interfaz de usuario. Las pruebas de selenium ahora corren en pantalla completa y algunas nuevas funcionalidades como “Correr todas las pruebas” han sido agregadas.

Además la documentación local está disponible cuando ejecuta la aplicación en modo de pruebas.

Tipo de documento HTML5 y JQuery en las nuevas aplicaciones

Las nuevas aplicaciones vienen con un esqueleto HTML nuevo. Antes era un HTML con formato XHTML 1.0 Transitional, ahora tienen un tipo de documento HTML5 por defecto.

<!DOCTYPE html>
 
<html>
    <head>
        <title>#{get 'title' /}</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
        #{get 'moreStyles' /}
        <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
        <script src="@{'/public/javascripts/jquery-1.6.min.js'}" type="text/javascript" charset="utf-8"></script>
        #{get 'moreScripts' /}
    </head>
    <body>
        #{doLayout /}
    </body>
</html>

Es sólo la configuración por defecto y por supuesto que puede cambiarla por cualquier tipo de documento que desee, sin embargo HTML5 es sin duda el futuro y es mucho más simple.

La plantilla por defecto viene con la librería de Javascript JQuery. Esto es porque las aplicaciones web modernas necesitan un buen framework de Javascript y nos gusta mucho JQuery. Una vez más, es solo por defecto y por supuesto puede sobreescribirla con cualquier otra librería de Javascript que prefiera.

Ah, y viene con 2 placeholders para inyectar aún más scripts y/o estilos. Por ejemplo, agregue en su vista:

#{set 'moreScripts'}
<script src="@{'/public/javascripts/gears_init.js'}" type="text/javascript" ></script>
#{/set}

Y la librería gear de Javascript estará accesible en sus vistas.

Mejoras en la etiqueta #{list}

El parámetro items es ahora opcional y puede ser reemplazado por el argumento arg por defecto:

Así que puedes reescribir:

#{list items:users, as:'user'}
    <li>${user}</li>
#{/list}

por:

#{list users, as:'user'}
    <li>${user}</li>
#{/list}

También el parámetro as es ahora opcional. Usará _ como el nombre de la variable por defecto:

#{list users}
    <li>${_}</li>
#{/list}

Nueva etiqueta #{jsAction /}

La nueva etiqueta #{jsAction /} permite importar rutas definidas como funciones de javascript. Es muy útil si necesita llamar una URL mediante una llamada AJAX usando alguna variable:

Veamos un ejemplo:

GET     /users/{id}        Users.show

Ahora puede importar esta ruta en el lado del cliente:

<script type="text/javascript">
    var showUserAction = #{jsAction @Users.show(':id')}
    
    var displayUserDetail = function(userId) {
        $('#userDetail').load( showUserAction({id: userId}) )
    }
</script>

Como puede ver puede usar la sintáxis :name para declarar variables libres. Puede mezclar variables libres y fijas. La etiqueta #{jsAction /} genera una función Javascrpit que toma como argumento un objeto javascript que debe definir todas las variables libres.

Nueva aplicación de ejemplo: 'booking'

La aplicación booking es parte de la conocida Aplicación de reservas del framework Seam de JBoss.

Muestra cómo puede manejar estados complejos en el lado del cliente de un modo RestFul mediante un framework web sin estado.

¡El plugin de Eclipse está en camino!

Estamos trabajando duro para proveer un plugin de eclipse. El estado actual es alfa pero ya se puede usar, puede encontrarlo en el directorio support/eclipse de su instalación de play.

Soporte para IDEA de IntelliJ

El framework de Play! ahora soporta IDEA de IntelliJ... ¡sin configurar nada!

Para convertir una aplicación de Play! en un proyecto IDEA usa el comando idealize

# play idealize myApp

Ahora puede ejecutar y debuggear usando el menú contextual.

Siguiente: Cambios de la versión 1.0.2