Mostrando entradas con la etiqueta Spring. Mostrar todas las entradas
Mostrando entradas con la etiqueta Spring. Mostrar todas las entradas

martes, 1 de diciembre de 2009

Java Day en la UNI

Después de mucho tiempo vuelvo a publicar en mi blog.

El motivo es que he participado por segunda vez en un evento acerca de Java. En esta ocasión fue en el Java Day que organizó la OSUM de la UNI el día 26 de Noviembre.

Realmente me sorprendi bastante cuando mi jefe me consultó si queria participar y cuando el organizador del evento, José Luis Casiano, me invitó directamente. Fue una agradable sorpresa.

En fin, ¿mi tema? Pues lo que más me gusta: la vista de las aplicaciones, en este caso usando Spring 3 MVC. Y es que realmente me estoy orientando hacia esa parte del desarrollo, poco a poco estoy investigando cada vez más acerca del tema y realmente me encantaria llevar el famoso curso de Rich Web Applications with Spring, desde que me lo propusieron este año, he tenido en mente llevarlo. Ojalá se pueda.

Cuando me dijeron cual seria la estructura que más o menos podia seguir para mi exposición, me pareció chevere. Entonces decidí primero construir un modelo de negocio para basarme en el, tanto en la presentación como en la demo que presentaría.

La demo que decidí hacer fue acerca de un restaurante de comida mexicana...y realmente fue una casualidad que coincidera que también fuera de comida (como el que presentamos en el Spring Community Day). Lo digo, porque al inicio pensé en una agenda pero al no hallar ningún template libre (lo admito: desarrollo, pero de diseñadora web tengo poco) que me gustara lo suficiente...lo descarté =P.

Entonces me quedé entre un diario y un restaurant de comida mexicana. El del diario me pareció algo...difícil de acomodar a lo que queria hacer: un maestro simple, un maestro-detalle que use la info del maestro y finalmente un catálogo de imágenes que use la info guardada desde los maestros. Queria darle al público algo relativamente completo. Si no fuera que pudiera enseñarlo todo en la expo, al menos se quedarian con el material para que lo puedan chequear.

Entonces asi fue, hice el modelo de datos y una vez lo tenia me puse a trabajar en la arquitectura que iba a usar. Fue una tarea relativamente sencilla, puesto que habia escogido la versión 3 de Spring, ya tenia la experiencia que me dejó el Spring Community Day y el pasado taller de Spring que habia dictado.

Sin embargo, he de admitir que en esta ocasión hacer todo sola (análisis, diseño, retoque, ajuste a mis necesidades, modelo, dao, servicios, controladores, vista, datos, etc) fue más trabajoso. Mucho más trabajoso. Extrañé mucho al team que se habia formado en el Spring Day, donde cada uno habia hecho lo que más le gustaba y las tareas se habian dividido tan bien que no se sintió tan pesado de presentar.

Pero era todo un reto y a mi me gustan los retos :D. Creo que es una de las cosas que más me motivan: los retos.

En fin, me puse a ello y en una semana, dándole unas horas durante la noche, pude terminar mi demo. Y me gustó como quedó :D. Claro me hubiera encantado hacer más: meterle más Ajax, enriquecer más la vista, etc. Pero bueno, al final el resultado me gusto y mucho.

Ahora hacer la presentación. Hay que ser prácticos y es que realmente armar una presentación no es cosa del otro mundo cuando se trata de contenido. Sabia que queria poner, sabia donde hacer hincapié...lo que no contaba era que unos dias despues mi jefe me dijera que "seria bueno que tú expusieras primero y dieras la intro a Spring" O_O! Jejej bueno en realidad lo pensé pero no tanto. Entonces, me di a ello: una breve introducción.

El contenido ya estaba...ahora solo faltaba algo que la amenizara la cuestión y que gráficamente me apoyara al entendimiento de las ideas. Entonces me puse a revisar algunas diapositivas de mis senseis =^^= y anoté algunas cosas que me llamaron la atención...y segui sus patrones. Asi es como pude agregar algunas imágenes, algunas entre las cuales se encuentra aquella que se no les permitirá nunca olvidar de que trata la inyección dependencias :D.

En fin, terminé de armar la ppt, di un último control de calidad y quedó todo listo.

Cuando llegó el dia, todo fue mejor de lo esperado. Realmente hay que felicitar el grupo OSUM de la UNI: se lucieron. Desde la organización, la recepción, la atención tanto a los asistentes como a los expositores. Y es que realmente se reunió a un grupo de excelentes profesionales:

Diego Limaco - JAVA EE 6
Yo - Spring MVC
José Diaz Diaz - Spring Roo
Juan Carlos Vergara - TDD
Javier Rosado Carrizo - SOA

Se notó perfectamente que la mayoría manejaba su tema.

Al final del evento hubieron algunos sorteos y bueno a los expositores nos secuestraron para agasajarnos con una riquísima cena y un brindis.

Realmente un gran trabajo de parte de los chicos de OSUM y ojalá se repita tanto el evento como la invitación. Un éxito. Gracias por la invitación.

Solo me resta dejarles la presentación que usé



Y la URL de la demo para que la descarguen

https://joedayz.sourcerepo.com/joedayz/susan/demorestaurant usuario invitado pwd invitado

Saludos, y hasta la próxima!

martes, 7 de abril de 2009

Obtener etiquetas de un .properties con JavaScript, DWR y Spring

Hoy por fin retomo la publicación en el blog...¿la razón? Tengo algo interesante que comentar y compartir =).

Tenia asignada una tarea donde tenia que usar una lista dinámica como command de un controller, con Spring, claro.

Ese problema menos mal ya lo habia solucionado con anterioridad. Pero sabia que la parte fuerte estaba en las validaciones y que estas tendrian que ser via JavaScript. ¡Look and Feel!

Bueno eso tampoco era problema...de no ser porque la aplicación maneja muchos idiomas. Aunque por ahora solo nos han pedido Ingles y Español.

¿Y cual es el problema? Pues que los mensajes debian ser estandarizados y mostrados según el idioma que el usuario hubiera escogido desde la primera ventana.

Estamos usando archivos para los mensajes (.properties). Asi que tambien estaban estandarizados los textos de los mensajes.

Entonces...el problema era invocar esas etiquetas desde JavaScript enviando simplemente el key de las mismas...y quizás algún argumento adicional.

Pensando, consultando y leyendo algo...finalmente tome partecitas de algunos consejos, de algunas clases ya implementadas en nuestro framework y un poco de imaginación.

Les presento la solución que le di a este pequeño inconveniente de llamar etiquetas de un archvio de mensajes desde un método JavaScript...usando DWR y Spring =).

Usemos el ejemplo siguiente para mostrar como se podria solucionar la cuestión planteada: deseamos registrar una a una un listado de personas asistentes a un evento. Sin embargo, debemos cuidar que el nombre de la persona siempre sea ingresado.

La solución fue planteada basandome en un método que tiene el SimpleFormController:

[sourcecode language='java']
public String getText(String msgKey, Locale locale) {
return getMessageSourceAccessor().getMessage(msgKey, locale);
}
[/sourcecode]

Entonces la idea para llamar a este método desde algún metodo JavaScript era al menos pasar el Key y el Locale (por el idioma).

Sabia que el Key dependia de lo que quisiera mostrar asi que ello no era problema. Sin embargo el Locale...bueno lo podia conseguir haciendo uso del HttpServletRequest...entonces el foquito empezo a prenderse. Si requeria un objeto HttpServletRequest lo podria obtener a través del Controller.

Entonces, conversando con un compañero de trabajo acerca de ello me sugirió que podria inyectar el request en alguna clase que hiciera un llamado al metodo getText u otro método que hiciera lo mismo. Entonces la idea empezó a tener consistencia:

1. Debia crear una clase a la que pudiera inyectar un objeto HttpServletRequest a través del Controller.
2. Crear un método en la clase mencionada que hiciera lo mismo que el getText del SimpleFormController.
3. Llamar a este método desde otro JavaScript, para lo cual podría usar DWR.
4. Mostrar el mensaje que requiera.

Manos a la obra.

1. class MessagePropertiesLoader: esta clase nos permitirá obtener un objeto HttpServletRequest para obtener el Locale que nos dirá con que idioma se está trabajando en la aplicación. De esta manera al llamarlo desde la vista podremos obtener el mensaje en el idioma correcto.
[sourcecode language='java']
public class MessagePropertiesLoader {

private HttpServletRequest request;
...

public void setRequest(HttpServletRequest request) {
this.request = request;
}
....
}
[/sourcecode]
2. getMessageByResourceBundle: este será el método de MessagePropertiesLoader que será llamado desde la vista y que nos devolverá el mensaje que requrimos.
[sourcecode language='java']
public String getMessageByResourceBundle(String key, String before, String after)
{
String filename = Constants.BUNDLE_KEY;
ResourceBundle bundle = ResourceBundle.getBundle(filename, this.request.getLocale());
String message = bundle.getString(key).trim();

if(ValidationUtil.validateString(before))
{
before = bundle.getString(before).trim();
message = before + " "+message;
}

if(ValidationUtil.validateString(after))
{
after = bundle.getString(after).trim();
message = message + " "+ after;
}
return message;
}
[/sourcecode]
Donde:

[sourcecode language='java']String key [/sourcecode] es el nombre de la etiqueta que deseamos obtener.

[sourcecode language='java']String filename = Constants.BUNDLE_KEY [/sourcecode] nos da el nombre del archivo de propiedades que usamos en la aplicación, en este caso el valor es "resources.properties" para inglés y "resources_es.properties" para español.

[sourcecode language='java']ResourceBundle bundle = ResourceBundle.getBundle(filename, locale) [/sourcecode] nos permitirá acceder al archivo que necesitamos.

[sourcecode language='java']String message = bundle.getString(key).trim() [/sourcecode]una vez abierto el archivo podemos obtener la etiqueta requerida.

Las otras líneas son poder agregar algun parámetro antes o despues del mensaje. Finalmente devolvemos la cadena requerida.

3. Usar la clase implementada: teniendo nuestro controller:
[sourcecode language='java']
public class PeopleFormController extends BaseFormController {

private MessagePropertiesLoader messagePropertiesLoader;
...

protected Object formBackingObject(HttpServletRequest request) throws Exception {

if (!isFormSubmission(request)) {

messagePropertiesLoader.setRequest(request);
People people = new People();
return people;
}
return super.formBackingObject(request);
}
...
}
[/sourcecode]
Donde:
[sourcecode language='java']messagePropertiesLoader.setRequest(request) [/sourcecode]es la sentencia que nos permite acceder al objeto HttpServletRequest.

En nuestro applicationContext.xml:
[sourcecode language='java']


[/sourcecode]

En nuestro action-servlet.xml:
[sourcecode language='java']





[/sourcecode]

Y finalmente para poder acceder a la clase via DWR, en el dwr.xml:
[sourcecode language='java']



[/sourcecode]

4. Solo nos quedaria llamar a la clase y al método desde nuestra vista.
[sourcecode language='html']




Ejemplo Properties, DWR, JS y Spring




Registro de personas asistentes











:
















... ...




[/sourcecode]
Donde:

[sourcecode language='html'] [/sourcecode] nos permitirá acceder a la clase donde estará nuestro método que nos devolverá el valor de la etiqueta requerida.

[sourcecode language='html']input type="button" onclick="addPerson();" value="+"[/sourcecode] es el botón que disparará la acción de agregar una persona a las lista, pero antes validará que se haya ingresado el nombre.

[sourcecode language='html']MessagePropertiesLoader.getMessageByResourceBundle("errors.requiredField", "common.name", "",
function(data) {
alert(data);
}
); [/sourcecode] es el método que finalmente nos arroja?a el mensaje correspondiente al error hayado.

Por último lo que deberian mostrar las etiquetas se encuentran en los archivos .properties:

resources.properties:
[sourcecode language='java']
errors.requiredField= is required.
common.name= Name
common.address=Address
[/sourcecode]

resources_es.properties para español:
[sourcecode language='java']
errors.requiredField= es un campo obligatorio.
common.name= Nombre
common.address=Dirección
[/sourcecode]

Finalmente la aplicación se veria asi para espalñol:

[caption id="attachment_128" align="aligncenter" width="518" caption="Aplicación en Español"]Aplicación en Español[/caption]

Y para el inglés:

dwr_en

Definitivamente esto puede mejorar y se puede llegar a imitar realmente la funcionalidad del getText, que puede recibir argumentos en arreglos de Objetos y más. Pero por ahora me sirve y espero le sirva a alguien más que requiera lo mismo.

Saludos, hasta la próxima.