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.
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.
<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.
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:
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 ;-)
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
"Un espacio de auténtica ingeniería informática basada en hechos reales"