Gmaps4jsf integrado en icefaces y con carga dinamica de Google API key

Recientemente tuve que integrar todas las tecnologías descritas en el titulo y aunque icefaces dispone de su propio control para Google maps, es en cierta forma limitado. La gracia de Java es que no hay o no debería haber vendor lock-in  y pude utilizar Gmaps4jsf sin problemas. Cada proyecto tiene una documentación bastante descriptiva para su uso asi que me centrare en definir algunas particularidades del caso.

Integración con paginas jsp bajo xml estricto

Para los que aun no lo sepan al escribir paginas jsp tenemos dos estilos de creación:

  • JSP Tradicionales: Ideales para scriptlets y lógica escrita en la pagina .jsp (php style le dicen algunos)
  • JSP XHTML: Estas solo permiten xml estricto, se utilizan en conjunto con backing beans y restringen al programador para que no escriba lógica en el archivo .jsp

La documentación de gmaps4jsf indica que para integrar el control a nuestra aplicación jsf basta con agregar el siguiente taglib:

<%@ taglib uri="http://code.google.com/p/gmaps4jsf/" prefix="m" %>

Sin embargo esto no se puede utilizar con paginas jsp escritas en xml estricto. ¿Solución?, traducir el tag a la siguiente estructura equivalente, esto es útil cuando nuestro generador de paginas (como el difunto plugin visual de icefaces en netbeans) genera paginas en xml estricto

<jsp:root version="2.1"
...
xmlns:m="http://code.google.com/p/gmaps4jsf/"
>

Integración con icefaces

Para que el control se integre bien en el ciclo de vida de los componentes de icefaces hay que utilizar el siguiente atributo propio de Gmaps4jsf  «renderOnWindowLoad», si no se utiliza este atributo el mapa no sera renderizado adecuadamente.

Ejemplo:

<m:map width="1000px" height="740px" zoom="16" type="G_HYBRID_MAP " renderOnWindowLoad="false">
....

Carga dinamica de la clave de Google api key

Aunque la documentación del control de icefaces indica que se debe establecer la clave en una sección del archivo web.xml y la documentacion de Gmaps4jsf indica que debe hacerse incluyendo el tag de script al inicio de la pagina podemos hacer algo más interesante, establecer la clave desde un backing bean. Para esto icefaces cuenta un mecanismo para acceder al contexto de javascript de nuestra pagina actual denominado JavascriptContext (logico no?).

Asi pues para cargar de manera dinamica la clave sin añadir ningun tag a nuestra pagina jsf se utilizaria un codigo similar al siguiente:

String googleAPIKey="seqwerui1298qrioyiuywopiuwrqepowqclaveDEEjempl0";
 
JavascriptContext.includeLib("http://maps.google.com/maps?file=api&amp;v=2&amp;key="+googleAPIKey, FacesContext.getCurrentInstance());

Con esto podemos cargar la clave sin necesidad de escribirla directamente en la pagina jsp

Y por ultimo TADA!! tenemos nuestro mapa (convenientemente ubicado en alguna región no determinada):

 

 

One Reply to “Gmaps4jsf integrado en icefaces y con carga dinamica de Google API key”