Páginas estáticas multilingues y con plantilla tiles en struts2

Si, es un título un poco largo, pero he tardado un poco en encontrar una solución a este problema y quiero compartirlo para todos aquellos que os encontréis en la misma tesitura.

Primero, un pequeño resumen de la situación:

  • Aplicación java con struts2+tiles+urlrewrite
  • internacionalización mediante i18n con archivos de properties
  • Necesidad de un número no trivial de páginas «estáticas» con textos largos poco susceptibles de entrar como property.

Los problemas:

  1. No queremos tener una entrada en el tiles.xml por cada página estática pero queremos utilizar las plantillas existentes.
  2. No queremos generar una acción nueva por cada página
  3. No queremos tener que hacer una nueva entrada urlrewrite por cada página
  4. Queremos poder generar páginas de error si no encontramos una página en un idioma determinado.
  5. Queremos poder generar el texto completo en cada idioma como una página html, no como properties.

Si todavía no os habéis hecho una idea, no os preocupeis, es algo normal. Esta situación no se da todos los días.

La solución

O mejor dicho, mi solución…

Voy a crear una única acción que se encargue de determinar el jsp a cargar dentro de la plantilla tiles y voy a modificar una plantilla existente para inyectarle esa nueva página. Además, como el título de la página estará en la plantilla, voy a encargarme de generar el texto en el idioma adecuado. Además, voy a crear un prefijo para el urlrewrite que permita que todo esto quede bonito para google…

Paso a paso:

Modificación del urlrewite.xml:

<rule>
    	<from>^/web/(.*)$</from>
    	<to>/Estaticas.action?pagina=$1.jsp</to>
    </rule>

Con esta regla le decimos que siempre que tengamos una url con la forma /web/mipagina llamaremos a la acción Estaticas y le pasaremos como parámetro mipagina.jsp

Modificacion en struts.xml:

<action name="Estaticas" 
           class="com.yoprogramo.web.action.EstaticasAction">
  <result>/estatica.jsp</result>
</action>

Con esa acción lo que hacemos es llamar a EstaticasAction.java (luego lo vemos) y redirigir a estatica.jsp que tiene este contenido (quitando las cabeceras):

<tiles:definition name="estatica.modif" extends="estatica">
  <tiles:putAttribute name="body" value="${pagina}" />
</tiles:definition>
<tiles:insertDefinition name="estatica.modif" />

Lo que estamos indicando es que se modifique la plantilla con nombre estatica, definida en el tiles.xml y que ponga como atributo body el valor que la acción nos ha devuelto en pagina, de esta manera estaremos utilizando la plantilla definida en el tiles.xml, pero pasándose un jsp distinto. Esta forma de utilizar tiles es lo que se denomina «mutable», para poder utilizarla hay que incluir en el archivo web.xml:

  <context-param>
        <param-name>org.apache.tiles.factory.TilesContainerFactory.MUTABLE</param-name>
        <param-value>true</param-value>
  </context-param>

Ahora que tenemos todo en su sitio, solo tenemos que crear una estructura donde guardar las páginas de cada idioma y poder localizarlas facilmente. Por ejemplo, yo he creado una con esta estructrura:

Arbol de páginas estáticas

Bajo «es» pondré las páginas en español, en «en» las páginas en inglés y en «multi» las páginas multilingues que utilizan el packages.properties para traducir sus claves.

Lo único que nos queda ahora es programar la acción EstaticasAction.java .. Os dejo el código del execute:

		// Eliminamos ruta de lenguaje
		int idx=pagina.lastIndexOf("/");
		String page_name = pagina;
		
		if (idx>0)
			page_name = pagina.substring(idx+1);
		
		idx = page_name.lastIndexOf(".");
		if (idx>0)
			page_name=page_name.substring(0,idx);
		
		//Parte multilingue.
		//Vamos a crear una página para cada idioma, excepto para las
		//que sean muy simples y esas estarán en el directorio /multi
		if (!pagina.contains("/multi")) {
			String lang = getText("locale.language");
			if (lang==null)
				lang="en";
			pagina = "/"+lang+"/"+pagina;
		}
		
		// Ahora comprobamos si existe la página y si no existe redirigimos
		// a una página de error del tipo multi
		String servletContext = 
                     ServletActionContext.getServletContext()
                                                 .getRealPath("/estaticas");
		String filePagina = servletContext+pagina;
		File f = new File (filePagina);
		if (f.exists())
			pagina="/estaticas"+pagina;
		else
			pagina="/estaticas/multi/noexiste.jsp";
		
		// Ahora ponemos el título, que deberá estar como un texto 
		// en package con la forma web.<nombre_pagina>.titulo
		String key = "web."+page_name+".titulo";
		titulo = getText(key);
		
		return SUCCESS;

Una vez todo puesto en su sitio la mecánica para crear páginas estáticas y usarlas en nuestra aplicación es bastante simple:

  1. Crear un jsp con el texto para cada idioma y colocarlos bajo el directorio correcto (p.je. es/mipagina.jsp y en/mipagina.jsp)
  2. Crear una entrada en el package_en.properties y package_es.properties con la clave web.mipagina.titulo indicando el título de la página en cada idioma. (Recordemos que el titulo está en el head de la página y eso suele estar en la plantilla, no en el jsp que estamos modificando).
  3. Ya podemos acceder a /web/mipagina y ver cómo queda dentro de nuestra plantilla.

Igual inicialmente parece mucho trabajo, pero una vez hecho esto podréis hacer tantas páginas estáticas como queráis sin ningún esfuerzo y ligadas a las plantillas del resto de vuestra aplicación.

Hablando con las paredes (del banco digital)

UNO-E te roba

Cuando en el año 2000 aparecío el banco uno-e, el primer banco en España completamente digital, yo me apunté y cree una cuenta en parte como experimento, en parte como apoyo a este tipo de operativa por internet que tanto me gustaba.

Este banco siempre se ha caracterizado por cosas que ahora son normales, como no cobrar comisiones por operativa ni por tarjetas de crédito. A cambio, solo se podía operar por internet o por teléfono. Sufrí la primera implementación del banco, donde todo iba muy, pero que muy lento, el sistema de seguridad dejaba mucho que desear con claves de 4 y 5 caracteres y no ha sido hasta finales de 2010 cuando han lanzado la versión movil (con operativa limitada).

Cuento todo esto para que sepáis que estoy comprometido con la entidad ya que es en ella en la que voy ahorrando mes a mes lo poco que puedo e ingresándolo en una cuenta remunerada ligada a una cuenta corriente. Según lo que operes con la cuenta corriente te dan más o menos interés cada mes en la cuenta remunerada. Entre las cosas que valoran está el hecho de (según el contrato) tener un abono de nómina mensual mayor que 600 Euros (en su publicidad dicen «domiciliando la nómina»). Y yo la tengo domiciliada.

El caso es que me llegó el extracto sobre los intereses que iba a recibir por el mes de octubre y no me incluyen el 1% correspondiente a la nómina. Después de comprobar que efectivamente en septiembre había tenído nómina, pongo una reclamación por internet (método incómodo y con un formulario feo-feo), esperando que reparen su error. Dos días después (haciendo gala de una velocidad impresionante) y a las 9 de la noche, me llaman al movil…

La señorita, tras explicarle de nuevo el problema, me indica que el ingreso de mi nómina ese mes aparece como transferencia y no como abono de nómina (el código interno) y por eso no tengo derecho al 1% de intereses en la otra cuenta. Yo, obviamente, intento hacerle ver que si el importe es el mismo, la fecha es la misma e incluso la cuenta de origen es la misma, es evidente que se trata de mi nómina, independientemente del código interno. Después de tenerme al teléfono durante media hora, consultando con su ¿supervisor? me indican que no, que es un proceso automático y que no tengo derecho. Le indico que puedo pasarles el justificante del banco de origen o incluso pedir un certificado a dicho banco indicando que se trata de una nómina (o incluso de la empresa, que por algo soy empresario)… Pero ella erre-que-erre que no querían considerar como nómina el ingreso.

Una vez quedado claro que no voy a conseguir arreglar el tema, decido poner una reclamación y es ahí donde viene lo mejor:

Yo:

Señorita, ¿podía indicarme el procedimiento para hacer una reclamación?

Ella:

Ya le tomamos nota nosotros de lo que dice, no le corresponde una reclamación.

Yo:

¿Cómo que no? Yo tengo derecho a hacer una reclamación

Ella:

No, como no se ha ingresado como nómina no le corresponde y no puede reclamar

Yo:

Señorita, yo puedo poner una reclamación tenga razón o no, estoy en mi derecho como cliente.

Ella:

Ya dejamos constancia aqui de su caso

Yo:

Señorita, tengo todo el derecho del mundo a hacer una reclamación formal y recibir una respuesta a la misma. Solo le estoy preguntando por el procedimiento

En este punto todo me parecía tan subrealista que no me lo podía creer, ¿realmente no hay forma de poder poner una reclamación? He tenido menos problemas reclamando a telefónica, y eso ya es mucho decir.

Finalmente me pasan con otra señora de atención al cliente (recordemos, las 9:30 de la noche ya) que me insiste que no es un problema suyo, que ellos no lo consideran nómina y que no tengo derecho a la renumeración ¡ni siquiera derecho a quejarme!. Finalmente me dan un numerito para que me quede constancia de que he planteado un problema.

En resumen, una entidad de la que soy cliente desde hace más de 10 años me dice que no puedo quejarme de sus servicios… Bueno, pues me quejaré y no solo eso, sino que me cambiaré de banco: bye-bye uno-e, bienvenido ing…

Para el que esté interesado, este es el enlace para el Servicio de reclamaciones del banco de España y aquí el enlace al procedimiento telemático para presentar las quejas. Aunque eso, si, el plazo de resolución es de 4 meses (solo si estáis dispuestos a esperar).

Y mientras yo perdía el tiempo hablando con las pareces del banco me perdía cómo mi hijo terminaba el Uncharted 3 que estábamos jugando a medias… grrrr…

Como tratar a los intratables (en internet)

No alimentes al troll

Hace mucho tiempo que pertenezco a la red linkedIn, de hecho llevo más de 5 años perteneciendo a esta red. Siempre la he considerado como un sitio serio y donde era posible hacer buenos contactos de negocios. Alguna vez he usado mi perfil de linkedin como carta de presentación o he entablado contacto con algún cliente a través de esta red. En suma, algo profesional.

Desde un tiempo a esta parte, linkedin se está llenando de más y más gente que no tiene el caracter suficiente para estar en una red profesional, que pretende usarlo como un simple altavoz de sus demandas laborales o de sus opiniones politico-económicas. Siempre he tratado de alejarme de estos últimos porque, al fin y al cabo, una red de contactos profesionales no es para eso.

Hace unos pocos días me invitaron a un grupo cerrado que se llama: «Emprendedores de Nuevas Tecnologías», no es que yo me considere un emprendedor, pero si que soy empresario del sector (aunque de empresa pequeña y a la fuerza), pero si que considero emprendimiento mi última aventura con biblioeteca. Me pareció una buena oportunidad de poner en común ilusiones y problemas que seguro que todos hemos tenido.

Me sorprendió mucho que en ese grupo alguien pusiera un mensaje titulado: «¿Se pueden encontrar emprendedores en el movimiento las acampadas del 15M?» y preguntase directamente si entre los participantes en el 15M podría encontrar colaboradores para un proyecto suyo. Es una pena que no os pueda poner un enlace al diálogo completo, pero es un grupo cerrado y se necesita invitación para entrar. Os haré un resumen muy, muy somero:

Tras no recibir respuestas positivas ni negativas (solo algunos consejos bienintencionados para ayudarle a captar gente), parece que se harta del tema y pasa a quejarse:

Sigo sin encontrar emprendedores entre la gente del 15M. Quieren un empleo estable, pero eso de arriesgar -trabajar sin cobrar hasta tener beneficios, en lugar de estar en casa sentado en el sofá-… como que no. :-(

Ante eso, que me parece muy raro, simplemente me limito a preguntarle sobre el tipo de trato que está ofreciendo, ya que a mi me ha pasado alguna vez que me ofrecían un puesto sin cobrar hasta que hubiese beneficios, pero sin entrar a ser socio… (si, hay gente que hace eso), mi mensaje, y que debió encender sus alarmas fué este:

A ver, una cosa es ser socio de un negocio y que no se cobre hasta que no se tengan beneficios (pero luego la propiedad y los beneficios son compartidos) y otra muy distinta trabajar gratis para luego, con suerte, cobrar el salario… ¿Qué les estás proponiendo exactamente?

A partir de este momento pasó a modo pasivo-agresivo y su próximo mensaje ya empezaba por un:

¿Tengo cara de cabrón? ¿Tú que crees…?

Y luego empezaba a echar pestes del 15M con perlitas como:

La gente que más llora, lo que quiere es un sueldo fijo, aunque sea una miseria, y prefiere quedarse comiendo donuts y viendo un reality deprimente que intentar esforzarse lo más mínimo en generar oportunidades de negocio….
En fin, es que me revuelve el estómago ver a gente emborrachándose en los bares los fines de semana, muchos de los cuales no tienen trabajo, y se están literalmente puliendo el paro en gilipolleces. A mi ese especímen de ciudadano, no me merece ningún respeto…

Viendo que la cosa pintaba mal, simplemente intento calmarle empezando por un:

Hugo, no te conozco, simplemente te preguntaba el tipo de propuesta que haces.

Y luego el repetía los consejos que a mi mismo me dieron en su momento.. Parece que el tema de que le aconsejase alguien de menos nivel que Steve Jobs ya le hacía de menos. Su siguiente mensaje (cada mensaje que mandaba este individuo era el doble de grande que el anterior) ya aplicaba ad-hominem, contra mi, contra mi empresa y contra mi experiencia… Parece ser que su señoría la divinidad no esperaba consejos en esto de emprender…

Cansado de la charlatanería, simplemente le dije que dejase de buscar entre la gente del 15M como si fuera una fábrica de parados y que si quiere socios los busque de entre la gente de confianza (no hay otra forma si quieres formar un proyecto serio), ante lo que en su respuesta (otra vez del doble de tamaño) dice cosas como:

Y tu actitud paternalista con frases como «Ya tendrás tiempo para quejarte cuando te lleguen los verdaderos problemas.» me encajan más en alguien con trayectoria profesional y vida a sus espaldas. No necesitamos medirnos el pene ni ponerle la mano en el hombro al otro. Y no me ha molestado, sencillamente me ha entrado la risa…
me siento dolido, sobre todo cuando veo a gente que como tú, directamente me etiqueta sin tener p. idea de lo que hay detrás de estos comentarios

una de las cosas que les pido a mis colaboradores, es que no se comporten como príncipes/princesitas, que me digan lo que piensan a la cara, que discutamos las cosas, sin tapujos, sin censura, sin complejos.

Y yo, como princesita llorando como una magdalena, me retiro a mis aposentos a mascar amargamente la derrota dialéctica infligida por alguien que no tiene más que hacer que engordar los post hasta convertirlos en avalanchas de gracietas sin sentido, quejas melindrosas y comparaciones odiosas… Olvidándome de mis 7 años como empresario, de mi etapa de profesor universitario, de mis proyectos europeos y de mis logros técnológicos (que seguro que él los supera todos y con las manos atadas a la espalda, y sin ofender a nadie).

Solo llevo desde 1989 conectado a internet y ya tuve mis primeros flames en los newsgroups de usenet en el 93 (todavía guarda algo google para el que dude de ello), no quiero gastar más tiempo en pobre gente como esa. Mi consejo de abuelo cebolleta ante gente intratable e irrazonable como esa es: «que les den…» todos viviremos más tranquilos haciendo oidos sordos a estupideces, por mucho que vengan de redes profesionales o de grupos más o menos selectos. Internet siempre será internet y a los trolls hay que ignorarlos.

Chim-pun.