Java Web Development – ¿Alguna novedad?

Desde hace algún tiempo venía buscando un framework Web ligero para Java. En ese proceso encontré algunos frameworks que quiero comentar.

Spark framework – A tiny Java Web framework

Aclaración, Spark framework no tiene relación alguna con Spark de Scala. El primero es un framework para crear aplicaciones Web, mientras que el segundo es para el procesamiento de BigData.

Link

Desde mi punto de vista, su principal característica es la simplicidad y su utilidad está en el desarrollo rápido de servicios REST para prototipos o educación, en cuestión de segundos puedes tener un API Web funcional sin mayor esfuerzo.

Como ya lo mencioné se puede usar en educación para una introducción rápida a REST y Java 8 (lambdas) ya que usa esa característica de Java. Algo de código:

import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

Y para ejecutarlo visitar: http://localhost:4567/hello

Vert.x

Link

Vertx es un framework diferente, completo y específico para tareas de alto desempeño muchos lo llegan a comparar con Node.js. Lo que me llamó la atención es su arquitectura, la forma de comunicación que emplea entre los componentes del lado del servidor, el uso de nuevos estándares como WebSockets y finalmente que es políglota se puede usar con Javascript, Java, Ruby, Groovy, Python, Clojure, Ceylon y pronto en Scala.


public class ApiServer extends Verticle {

   @Override
   public void start() {
      HttpServer server = vertx.createHttpServer();
      RouteMatcher routeMatcher = new RouteMatcher();

      routeMatcher.get("/users/", new Handler<HttpServerRequest>() {
         @Override
         public void handle(HttpServerRequest request) {
            request.response().putHeader("content-type", "text/plain");
            request.response().end(String.format("%s[%s]\n", request.path(), request.method()));
         }
      });
   }
}

Y para ejecutarlo se debe visitar: http://localhost:8080/users

Si bien los frameworks anteriores tienen su utilidad yo buscaba algo diferente, algo más orientado al desarrollo de clientes Web que por ejemplo maneje un sistema de Templates.

Ninja Web framework

Link

Completo para mis necesidades, simple, elegante y bastante potente. Desarrollé mi primera aplicación Ninja y me fue muy bien.

Este framework tiene muchas características y su propia filosofía, no existen sesiones manejadas en el servidor y el uso de un grupo de estándares Java perfectamente integrados que hace que el desarrollo sea rápido, orientado a las pruebas y extensible.

Para los relacionados con Scala, Ninja es algo así como un fork de Play y como leí en algún lado sigue en algo la filosofía de Rails de Ruby.

En resumen un framework Web orientado a acciones y no a componentes, que desde mi punto de vista es la tendencia.

Algo de código, así se manejan las rutas en Ninja:


public class Routes implements ApplicationRoutes {

@Inject
NinjaProperties ninjaProperties;

@Override
public void init(Router router) {

///////////////////////////////////////////////////////////////////////
// Login / Logout
///////////////////////////////////////////////////////////////////////
router.GET().route("/login").with(LoginLogoutController.class, "login");
router.POST().route("/login").with(LoginLogoutController.class, "loginPost");
router.GET().route("/logout").with(LoginLogoutController.class, "logout");

...

También existen otros frameworks:

Y poco tiempo después se anunció que la nueva versión de Java EE tendrá un nuevo framework MVC orientado a acciones (así como Ninja), detalles aquí.

Scrapping la Web con Java – Jsoup y jARVEST

Una de las tareas en las que he trabajado últimamente es recuperar información de links URLs, principalmente información que se encuentra publicada en forma de anotaciones que dentro del HTML se expresan a través de Metatags. Básicamente estoy interesado en recuperar el título de la página Web (claro que no es una metatag) y las meta «description» y «keywords«.

Hasta el momento he trabajado con Jsoup y he tenido muy buenos resultados, Jsoup es una framework que permite representar a una página HTML, que se puede leer desde una url, una variable o un archivo, como un objeto y a través de algunos métodos manipular el DOM. Otra de las características que destaco la manera de seleccionar los elementos del DOM, que es similar a jQuery.

Estas son las líneas de código que utilizo para leer una página Web desde una URL:


Document doc = Jsoup.connect(urlHome).
userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4  (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4").
timeout(10 * 1000).
ignoreContentType(true).
ignoreHttpErrors(true).
followRedirects(true).
get();

Mencionar el método userAgent que le dice al servidor Web quién hace la llamada, uso el de Safari para «tratar» de converser al servidor Web que es una persona que quiere ver la página y no un programa que esta haciendo scrap. Otros métodos que mencionaré son ignoreContentType e ignoreHttpErrors, estos métodos ayudan a que no se lancen excepciones cuando la URL a visitar, no apunta a una página HTML sino a un archivo con extensión diferente a html, y que en lugar de lanzar una excepción cuando existen errores HTTP 4xx o 5xx, este error se convierta en un objeto.

Para obtener las meta, utilicé el siguiente código:


doc.title();

Elements metaElements = doc.select("meta[name]");

Así puedo obtener el título y todas las meta que tienen la propiedad name, para luego trabajar en las que son de mi interés.

Luego de hacer scrapping a varios miles de páginas, me di cuenta que muchas de ellas no poseían, ni la etiqueta title ni las meta description o keywords y que en muchos casos preferían utilizar anotaciones de Facebook Open Graph o de Twitter Cards. Así que modifiqué el código para que también seleccione estas meta y quedando así:

doc.title();

Elements metaElements = doc.select("meta[name]");
Elements others = doc.select("meta[property]");

Con esto se mejoró notablemente la recuperación de la información, pero aún quedaban algunas URL con un comportamiento extraño, por ejemplo esta: Can Emotional Intelligence Be Taught? que cuando se la abre desde cualquier navegador funciona sin problema, pero cuando la proceso con Jsoup me aparece una página de login.

El problema parece ser que ese sitio Web, recibe la solicitud, escribe algunas cookies y envía una página de redirección, recibe la segunda página y busca las cookies escritas previamente, esto es normal en navegador Web, pero no en Jsoup busqué la forma de arreglarlo, pero no tuve éxito.

Es así que recordé otro framework que permite hacer scrapping que se llama jARVEST. Estudiando la escasa documentación pude comprender el potencial de la herramienta. Mi primera prueba fue cargar el contenido de la página de ejemplo y usar Jsoup para hacer el scrap, así:

Document doc;
String url = "http://www.nytimes.com/2013/09/15/magazine/can-emotional-intelligence-be-taught.html?_r=1&";
Jarvest scrapper;
String html;

scrapper = new Jarvest();
html = scrapper.exec("wget",url)[0];

doc = Jsoup.parse(html);

System.out.println(doc.title());

Y así pude ver que ya no se devolvía el título de la página de login, sino el mismo título que muestra el navegador. El problema real con jARVEST es la falta de documentación, estuve buscando un par de días y no pude encontrar ni la Javadoc. Pero con varios intentos prueba/error pude construir este «transformador» para obtener los mismos datos que con Jsoup. Este código se puede ejecutar desde una ventana terminal.


echo "http://www.nytimes.com/2013/09/15/magazine/can-emotional-intelligence-be-taught.html?_r=1&" | ./jarvest.sh run -p "wget
branch(:BRANCH_DUPLICATED, :ORDERED){ 
 pipe{
 xpath('//title')
 }
 branch(:BRANCH_DUPLICATED, :SCATTERED){
 select(:selector=>'meta[name]', :attribute=>'name')
 select(:selector=>'meta[name]', :attribute=>'content')
 }
 branch(:BRANCH_DUPLICATED, :SCATTERED){
 select(:selector=>'meta[property]', :attribute=>'name')
 select(:selector=>'meta[property]', :attribute=>'content') 
 }
}"

En una siguiente entrada hablaré un poco más de jARVEST, su potencial y lo que he aprendido, ya que veo un potencial bastante grande en esta herramienta.

Problemas con Jena y Google App Engine

A los tiempos un post.

Ahora no presento soluciones sino un problema.

Estamos desarrollando un proyecto en el cual trabajamos con Jena (para hacer unas consultas a una ontología). La aplicación es Web y estamos trabajando con GWT 2 (como la han mejorado a la esta herramienta, al fin pude hacer debbug desde la Mac!) la GUI full Ajax y RPC sin problemas. Necesitamos subirla a un servidor público y se me ocurrió subirla al Google App Engine, desde un principio tuve dudas relacionadas sobre las restricciones que impone Google (número de archivos y clases restringidas) y las dudas se convirtieron en problemas.

El problema se da en el método hasNext() de la clase ResultSet para versión 2.5.7 del Jena al parecer deriva de algunas clases no permitidas. Cambié los .jar del Jena a la versión 2.6.2 y el problema se dio en el método create(String) de la clase QueryFactory.

He encontrado los siguientes links que mencionan el algo el problema:

Aquí se detallan los Frameworks y APIs  soportados parcial, total o definitivamente por Google App Engine

Mientras que en éste link se habla sobre un problema que se presenta.

Finalmente aquí se presenta una solución (aunque no estoy seguro que sea para mi problema) trataré de implementar lo que se recomienda.

Por ahora el problema está sin solución, si alguien ha logrado solucionar o tienes más detalles del problema y quiere compartir sus ideas o soluciones, les pido su ayuda.

RichFaces en NetBeans

Luego de una conversación con mi amigo zepolar, me decidí a leer algo sobre RichFaces, así que empecé por descargar RichFaces Developer Guide.

Buscaba un IDE con el cual trabajar y en la documentación  encontré, aunque ya sabía de su existencia, a JBoss Developer Studio que lamentablemente es una herramienta paga, únicamente existe una versión Trial de 30 días. Ahora volví a buscar algún plugin para NetBeans y me encontré con RichFaces4NB y RichFacesPalette, ambos se necesitan para poder realizar trabjar, aquí los pueden encontrar.

También encontré las siguientes direcciones(Parte I, Parte II y Parte III) en donde se puede encontrar información sobre el trabajo de éste plugin, que puede trabajar con Apache Tomcat como servidor, aunque luego se necesitará GlassFish para el trabajo con EJB mediante Seam.

Espero que sea de su ayuda.

Tutorial JSF – Tercera entrega

Pues nada, para quienes están siguiendo éste tutorial sencillo sobre JSF, aquí les traigo la tercera entrega.

En ésta entrega podrán ver cómo agregar ciertas características a los elementos que se agregaron la semana pasada (a los inputText). Además de agregar otros elementos como: inputTextArea, selectOneRadio, selectOneMenu).

Espero que sea de su ayuda, y les dejo el link

Working With Form Tags in the JSF Framework

Introducción a JSF un tutorial con entregas progresivas

Según he leído en la página de NetBeans, se publicará una serie de documentos en donde se demostrará el uso básico de JSF para constriuir aplicaciones Web utilizando NetBeans. En ésta serie de tutoriales se ceará una aplicación denominado jAstrologer, que toma el nombre del usuario y su fecha de nacimiento y devuelve información como signo del zodiaco, la piedra preciosa que te corresponde según tú fecha de nacimiento y el horoscopo.

Aquí la URL: Introduction to the JavaServer Faces Framework

Utilizando EJB 3 de sesión en una aplicación Web JSF

Aparentemente éste tema no debería ser complejo, al menos eso pensé, pero luego de buscar información resulta que es un tema que genera pasiones, como dice un buen amigo de la UTPL.

Es así que los foros de Java (especialmente los de Sun) se encuentran varias entradas en donde se habla de diferentes maneras de realizar la integración. He incluso la gente de JBoss está desarrollando un framework – JBoss Seam que permite integrar JSF con EJB 3.

Dejaré el tema de Seam para un próximo post, ahora les comentaré la solución que propone la gente de Sun y que se encuentra descrita en un blueprint denominado Using an EJB Session Bean as a Model Facade. Que en pocas palabras propone que desde Managed Bean se haga al invocación a un EJB de Sesión que hace de fachada. En la explicación de la gente de Sun no se muestra un ejemplo con JSF, sino con un servlet, pero se menciona que se podría reemplazar el servlet por algún managed bean. Les dejo una figura explicativa:

Seguiré tratando de buscar contenido sobre éstos temas y llegar a construir (por fin) una aplicación que pueda distribuirse y que justifique dicha acción.

Powered by ScribeFire.