Logo Fran Tello
Sígueme en Twitter Mi perfil en LinkedIn Mi canal en YouTube Mis fotos en Flickr RSS Feed

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.

"Un espacio de auténtica ingeniería informática basada en hechos reales"

Fran Tello, Desarrollador Web



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