Desarrollo Web con componentes: Componentes en Wicket
Segundo ejemplo de Wicket: Calculadora
Segundo ejemplo de Wicket: Calculadora
El ejemplo lo pueden encontrar acá.
Veamos ahora la división según MVC:
- El usuario solicita la página: antes de renderizar la página html al cliente ya tenemos nuestro controller con:
- un objeto calculadora instanciado (operando1 y operando2 en 0.0)
- textfields asociados a operando1 y operando2
- un button asociado al submit de sumar
- En el cliente se visualiza 0 en ambos operandos
- El usuario ingresa 7 en el operando1, 9 en el operando2 y presiona el botón Sumar
- Se submite el formulario al Server, entonces se acciona el controller. El form de wicket setea al model todas las propiedades al model:
- en el operando1 de Calculadora se asignó 7.0 (setOperando1)
- en el operando2 de Calculadora se asignó 9.0 (setOperando2)
- Se envía el mensaje sumar() al objeto calculadora que es modelo de dominio
- Al sumar se actualizan los operandos 1 y 2
- Se refresca la página, entonces se llena la información del form html nuevamente (con la información de la calculadora.java):
- en el input type text operando1 se setea el valor de operando1 (getOperando1)
- en el input type text operando1 se setea el valor de operando2 (getOperando2)
- en el span resultado se setea el valor de resultado (método String getResultado())
- No hace falta que la calculadora mantenga un estado para el resultado, basta con que exista un método getResultado (es una property read-only).
- Como vemos hay un "maridaje" en la asociación Controller Wicket-View HTML:
- Form-Form (!)
- Label-Span,
- TextField-Input Type Text
- ListView-Tabla HTML (como pueden ver en el mismo ejemplo de la búsqueda de libros)
- en general hay que respetar la misma jerarquía del HTML, eso lo vuelve poco flexible (no es transparente el rediseño de la vista)
- Cambiar de input type=submit a input type=button produce que los controles no reciban los valores que cargó el usuario en pantalla (no viajan por el request, pruébenlo: los operandos quedan en cero). Este es un incoveniente propio del protocolo, que lamentablemente Wicket no esconde (la metáfora tiene un límite).
- Por otra parte, si se carga un operando con valores alfabéticos solito el wicket te muestra el error en formato de viñetas.
- Cada control observa la propiedad del modelo, esto es bueno porque no tengo que encargarme de codificar el binding: basta con seguir la convención de darle el mismo nombre en la vista html, en el controller de wicket y en el modelo de dominio (como pasa por ejemplo con el operando1 y operando2). Pero la actualización no es instantánea, esto sólo puede ocurrir cuando el usuario haga submit del form.
- Se puede debuggear para ver que al llamar a sumar() cada control observa la propiedad del modelo y en consecuencia se refresca.
Números aleatorios
Números aleatorios
Este proyecto es numerosRandom-ui-wicket y tiene el siguiente layout:
Tenemos 3 componentes donde cada uno consiste en
- un label y
- un botón que permite generar números random en un rango determinado
La vista no va a generar los números aleatorios, eso se lo vamos a dejar a un modelo. ¿Qué necesitamos que tenga ese modelo?
- El último número que salió (porque lo vamos a mostrar en pantalla)
- El rango de números (cota inferior/superior) sobre el cual vamos a elegir el número al azar
- Un método que genere ese número al azar
Entonces:
Es interesante notar que el HomePage actúa de container, generando un Composite de controles.
No hay un model aún, porque vamos a trabajar más granularmente, a nivel componente:
Trabajar con componentes nos permite
- concentrarnos en menos cosas a la vez
- resolver un problema y aplicarlo en muchos lugares (búsqueda de usuarios, combos anidados, etc.)
- no pensar en una ventana como un todo sino como un conjunto de partes relacionadas (aumenta la granularidad)
- lo bueno es que Wicket conserva un estado propio para cada componente (cada uno tiene su propio GeneradorRandom, los números aleatorios que genera nunca se cruzan: el primero va de 20 a 70, el segundo de 1 a 10 y el tercero de 70 a 170)
Búsqueda de libros
Búsqueda de libros
Volvemos al proyecto ejemplosBasicos-ui-wicket para ver cómo se trabaja una grilla en Wicket.
- Una grilla es un componente (como vimos recién)
- La consulta la queremos hacer por ajax con un remote link
- Aparece el form como otro container de controles
¿Cómo relaciono cada columna de la grilla?