Logo Fran Tello
Sígueme en Twitter Mi perfil en LinkedIn

HotSwap en Tomcat con Eclipse

31 julio, 2013 20:21

Me gusta Tomcat, me gusta Eclipse, pero aunque el título te sugiera otra cosa, no voy a hablar del club de intercambio de parejas que frecuentan ambos. Me centraré en el HotSwap, una característica de la JVM que permite realizar cambios en el código de las clases Java sin que la aplicación deje de ejecutarse. Esto se consigue recompilando la clase de forma externa y enviando el nuevo bytecode con las modificaciones, que sustituye al antiguo.

Antes de continuar, me gustaría que hicieras un cálculo del tiempo que pierdes a diario cuando realizas cambios en las clases de tu aplicación web y tienes que hacer un redeploy de toda la aplicación, sumándole el tiempo de stop/star que emplea Tomcat en reiniciarse. Una vez obtenido el tiempo, multiplícalo por tu sueldo/hora, aplícale el 30% y esta será la cantidad que deberás ingresarme por PayPal desde el momento que empieces a usar esta solución. Si ya has realizado el ingreso, puedes seguir leyendo...

Para preparar esta receta necesitaras:

  1. IDE Eclipse, asegurate de tener instalado el plugin WTP si quieres hacer funcionar HotSwap en aplicaciones web.
  2. Contenedor de Servlet Tomcat correctamente configurado en Eclipse.

Enumero los pasos del proceso para un proyecto web:

  1. Crear un proyecto web dinámico.
  2. Desplegar el proyecto en el servidor Tomcat configurado en Eclipse.
  3. Asegurate en la configuración del Deployment Assembly de que tus clases se despliegan en WEB-INF/classes.
  4. Comprueba que en la configuración de publicación de Tomcat está marcada Automatically publish when resources change, podemos indicar el intervalo de publicacion en segundos.
  5. En la configuración de los Web Modules de Tomcat desactiva el Auto Reload en el contexto de tu aplicación.
  6. Arranca Tomcat en modo depuración.

Ahora puedes probar a cambiar código en tus clases Java y ver como estos cambios son efectivos casi al instante, sin necesidad de detener Tomcat.

Pero no es la solución definitiva, hay una pequeña limitación. Funciona siempre que no modifiquemos la estructura de una clase, esto quiere decir que si añades, eliminas o modificas atributos a tus clases, Tomcat necesitará reiniciarse. Si añades, o eliminas métodos, o si cambias la signatura de uno que ya exista, Tomcat también necesitará reiniciarse. Por tanto lo único que podemos modificar en caliente será el cuerpo de los métodos de nuestras clases. ¡Menos es nada!

Si quieres algo más potente te recomiendo que busques información sobre JRebel.

Finalmente, si usas JSF y quieres tener los cambios de las vistas sin reiniciar el servidor, a partir de la versión 2.0, sólo hay que establecer el parámetro javax.faces.PROJECT_STAGE a Development. No olvides devolverlo a Production cuando tu aplicación esté lista para explotación.



Botón Twittear validable XHTML en JSF

09 abril, 2012 21:05

Si intentas desarrollar tu página web usando JSF y que pase la validación W3C XHTML 1.0 Transitional. Cuando incrustas los botones de twitter para compartir contenidos, en la etiqueta de enlace aparecen atributos de HTML5 (data-url, data-text, data-via, data-lang). Se utilizan para formar una dirección URL con la información necesaria para twittear.

<a href="https://twitter.com/share" class="twitter-share-button" 
	data-url="http://jfrantello.appspot.com/hola-mundo"
	data-text="¡Hola Mundo! | Fran Tello"
	data-via="frantello"
	data-lang="es">Twittear</a>

Estos atributos no pertenecen al estandar XHTML 1.0 Transational, pero si usas JSF puedes utilizar el componente outputLink en conjunción con param para construir un enlace de similares características, comportamiento y apariencia que sea 100% compatible con el validador.

<h:outputLink
	value="https://twitter.com/share?text=¡Hola Mundo! | Fran Tello"
	styleClass="twitter-share-button">
	<h:outputText value="Twittear" />
	<f:param name="original_referer"
			value="http://jfrantello.appspot.com/hola-mundo" />
	<f:param name="source" value="tweetbutton" />
	<f:param name="url"
			value="http://jfrantello.appspot.com/hola-mundo" />
	<f:param name="via" value="frantello" />
</h:outputLink>

Hay que tener en cuenta que los parámetros introducidos con param serán codificados a un formato de URL válido, lo que se incluya como value del outputLink se introducirá en la URL tal cual. Si no lo tienes en cuenta podras ver que los espacios en blanco son sustituidos por el simbolo +. Esto ocurre porque internamente usa la clase URLEncoder del paquete java.net.

Es importante notar que en los ejemplos no he incluido el código javaScript, no requiere cambios para usarlo con la versión JSF, pero sigue siendo necesario para ambos casos. Puedes encontrarlo en la página de botones de twitter.

Esta integración es útil si además de validar quieres utilizar la potencia de Language Expresion en JSF. Pero eso ya es otra historia.



Protege páginas XHTML en JSF

31 marzo, 2012 18:46

A diferencia de JSP con el que no podrás acceder a las páginas sin renderizar, dado que su mapeo es idéntico al recurso. En JSF se suele emplear mapeos con extensión .jsf sobre los recursos renderizables con extensión .xhtml. Esto puede dar lugar, bajo algunas configuraciones, a la no ocultación del código de presentación, dando pistas de la implementación. Además de no tener ninguna utilidad desde el punto de vista funcional, puede convertirse en un problema de vulnerabilidad.

Cuando usas JSF, además de incluir las librerías en el proyecto web, debes incluir la configuración en el fichero web.xml. Normalmente suele ser algo parecido a esto:

            <context-param>
              <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
              <param-value>.xhtml</param-value>
            </context-param>
           
            <servlet>
              <servlet-name>Faces Servlet</servlet-name>
              <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
              <load-on-startup>1</load-on-startup>
            </servlet>
           
            <servlet-mapping>
              <servlet-name>Faces Servlet</servlet-name>
              <url-pattern>*.jsf</url-pattern>
            </servlet-mapping>

Es una configuración típica, de las que se encuentran en los libros, las que aconsejan las implementaciones de la especificación de JSF como MyFaces o Mojarra, muchísimas aplicaciones están configurando JSF así en la actualidad. El comportamiento es el esperado, al acceder a un recurso con extensión .jsf, el controlador, que te adelanto para cuando hable de patrones, cumple el patrón front controller, renderiza el .xhtml de forma dinámica, generando el código HTML que posteriormente es enviado al navegador. Quizas nunca has probado qué ocurriría, si en lugar de usar la extensión .jsf, accedes al recurso con la extensión .xhtml. Te recomiendo que lo intentes y te darás cuenta de que ocurre algo inesperado. Efectivamente, en este caso el recurso no será renderizado por el controlador y será enviado directamente al navegador, jugoso y fresco código XHTML con muchas pistas indeseables para gente indeseable.

Quizás nadie se ha dado cuenta hasta ahora, todavía puedes enmendarlo pasando totalmente desapercibido, como verás las soluciones son efectivas e inmediatas. Propondré varias estrategias, una de ellas sólo es viable si estás desplegando la aplicación en la App Engine de Google.

  • La rápida: en lugar de mapear las páginas JSF con extensión .jsf, mapealas con extensión .xhtml, así cuando accedas al recurso .xhtml será renderizado. Al más puro estilo JSP.
  • La fullera: si te gusta la extensión .jsf, le has cogido cariño, y quieres seguir usándola. Podrías mapear ambas extensiones en Faces Servlet, *.xhtml y *.jsf. De forma que ambas accederan a la misma página, el problema es el SEO de la página que caerá en picado por tener información duplicada. Así que esta opción viable en intranet, pero descartada para Internet.
  • La del listillo: si utilizas seguridad gestionada por el contenedor, puedes restringir el acceso a los recursos *.xhml. Si intentas acceder te pedirá usuario y password, ¿demasiado confuso no? Además de resultar tentador, ¿qué escondes ahí?
  • La exclusiva: esta sólo es válida para la App Engine, donde también son válidas las tres opciones anteriores. GAE es capaz de servir contenidos estáticos o dinámicos, la configuración por defecto mostrará los .xhtml al igual que cualquier otro contenedor web, puesto que serán servidas de forma estática. Pero puedes indicar extensiones que sólo sean servidas dinámicamente, de forma que si no las enlazas desde la aplicación nunca serán mostradas. Para ello tienes que modificar el fichero de configuración appengine-web.xml, donde debes añadir lo siguiente:
    <static-files>
        <exclude path="/**.xhtml" />
    </static-files>

Puedes aplicarlo también a directorios u otros tipos de recursos que quieras proteger.

Espero que te sirva de ayuda y lo apliques a tus proyectos web dinámicos con JavaEE. Te animo también a aportar tus soluciones, aunque como no puedes dejar todavía comentarios, la intención es lo que cuenta. Me despido hasta la próxima con una buena taza del mejor java.



No lo sé todo, pero sé buscar

05 marzo, 2012 23:26

Cuanta razón tenía mi profesor Pedro Abad aquella mañana de prácticas de Sistemas Operativos, una de esas frases míticas que te acaban acompañando el resto de tu vida: "No lo sé todo, pero sé buscar". A la velocidad que se producen los avances es imposible estar a la última en las tecnologías de la información y la comunicación, por eso es imprescindible saber buscar. Con un buen libro o en la red, no todos los contenidos son válidos, en el proceso de búsqueda también se incluye un proceso de filtrado de la información. Este es el principio de un buen autodidacta. Pero hay otro más, que Confucio supo expresar perfectamente cuando dijo: "Me lo contaron y lo olvidé, lo vi y lo entendí, lo hice y lo aprendí".

Tienes que hacer para aprender, huye del peligroso copy/paste. Prueba, experimenta, entiende, comprende, entonces serás poseedor del conocimiento. Aquí desvelo otros de los misterios de este portfolio, ¿por qué no he usado un CMS? Con un sistema de gestión de contenidos me olvidaría de todos los tecnicismos y me podría centrar sólo en los contenidos, cosa que está bien pero dejaría de aprender. He preparado una bonita lista con las cosas que si bien no todas han sido nuevas para mí, las he reforzado:

  • PaaS Google App Engine (DataStore, API's, escalabilidad): lo he usado como infraestructura tecnológica, donde alojo este portfolio que se ejecuta en máquinas virtuales de Java, es una plataforma como servicio sobre una nube altamente escalable, y lo mejor, si no sobrepasas las cuotas es totalmente gratuito. En lo que a dinero se refiere claro, no dudo que Google lo está rentabilizando a la vieja usanza, espiando."
  • Frameworks JSF, PrettyFaces, Objectify: para ayudarme a seguir patrones de diseño y buenas prácticas de desarrollo, elegí JavaServer Faces porqué es mi favorito para MCV, PrettyFaces para camuflar las URLs y hacer un buen SEO y finalmente Objectify para persistir la información dinámica en el DataStore.
  • Librerías de componentes PrimeFaces y RichFaces. AJAX: dos de las más potentes librerías de componentes para JSF, la primera está tomando gran relevancia y la segunda es una vieja conocida en desarrollos empresariales. Ambas están perfectamente integradas con AJAX.
  • Skeleton CSS Boilerplate: bonito, elegante, adaptable, ampliable, fácil, intuitivo y muy práctico, este conjunto de reglas CSS ayuda a homogeneizar la renderización en la mayoría de los navegadores, por si fuera poco además se adapta a diferentes resoluciones de pantalla.
  • Validadores W3C: haz que tu lenguaje de marcado cumpla los estandares, este validador te ayudará a escribir html o xhtml sintacticamente perfecto, puedes probar como funciona haciendo clic en el icono que aparece en el pie de página.
  • SEO, RESTful, Bookmarkable URLs: o la historia de como hacerse amigo de los robots de búsqueda. ¿Tráfico de influencia, cohecho, extorsión? ¡Descubre los mejores métodos para aparecer el primero!
  • The Single Page Interface Manifesto (SPI): una única página web y navegación marcada por estados, como su nombre indica es un simple escrito que nos intenta convencer de ello, conmigo lo consiguieron, ¿cuántas páginas hay aquí? Yo te digo que una, ¿tú que crees?

Seguramente esté dejando en el tintero más cosas, lo próximo será incluir paginación, categorías y comentarios, resaltado de los ejemplos con código fuente e integración con twitter. También se me ocurre que podría haber puesto en este artículo algunos links con los elementos de la lista por si algo no te suena. Pero confío en que también sabes buscar y no los necesitas ;-)



¡Hola Mundo!

12 febrero, 2012 16:55

Suele ser la primera toma de contacto con un nuevo lenguaje de programación, su codificación y ejecución es muy sencilla, muestra por pantalla el texto que le da nombre. Eso permite, saber de una forma simple, como funciona una de las instrucciones más fundamentales de una aplicación, la que establece comunicación de salida con el usuario.

En mi lenguaje de alto nivel preferido, vease Java, el código es como sigue:

public class HolaMundo {
	public static void main(String[] args) {
		System.out.println("¡Hola Mundo!");
	}
}

Si has llegado a este párrafo y no has desistido antes, seguramente sabrás que Java es un lenguaje orientado a objetos, así que tienes que crear una clase nueva, por ejemplo en el paquete default, con un método estático y público, no de instancia, que debe tener por defecto la signatura main y tomar como argumento un array de Strings, Cuando ejecutas una objeto Java, nótese que aún no hay instancia alguna, la máquina virtual buscará este método, si existe realizará las instrucciones que contiene. En este caso mostrará por pantalla el texto.

Fácil, ¿no?, en la mayoría de los casos la programación es más fácil que la comunicación con humanos, sobre todo si lo que quieres decirle a un humano es lo que debe hacer una programa que está desarrollando. Si esto te ha sacado una sonrisa, eres digno de leer cuantos artículos aquí aparezcan. Este es el primero de todos ellos, me ha servido también como “Hola Mundo” particular, el primer mensaje de salida dirigido a ti. Todo lo que comente estará en torno a las tecnologías de la información y la comunicación, el desarrollo web y Java en general.

Mi objetivo es que algo de lo que en algún momento escriba te resulte de interés o te arroje algo de luz en el día a día del desarrollo de software. Durante todo este tiempo me he ilustrado del contenido creado por cientos de personas altruistas en Internet, han compartido su experiencia para que la sociedad 2.0 avance, el conocimiento es uno de los valores más importantes en esta época que nos ha tocado vivir. Es el momento de compartir el mío.

Gracias por tu tiempo, muy pronto mucho más.







©2012-2013 Fran Tello. Todos los derechos reservados.
Valid XHTML 1.0 Transitional Con la tecnología de Google App Engine