sábado, 29 de octubre de 2011

Configurar formato UTF-8 para todos los ficheros en eclipse (jsp, html, java, properties...)

Para asegurar que todo nuestro código está en UTF-8, aquí dejo cómo configurar:

  • eclipse

  • workspace concreto


Eclipse
Hace tiempo encontré una opción para el fichero eclipse.ini que me ha ahorrado muchos problemas de codificación y que fija por defecto la codificación en UTF-8.
En el fichero eclipse.ini añadimos esta línea:
-Dfile.encoding=utf8

Lo que hace es que por defecto nuestro eclipse fije a utf-8 la codificación de los workspaces que creemos, y la mayoría de los ficheros también se traten en UTF-8.

Workspace
La configuración anterior hay que combinarla configurando alguna cosa más en el workspace.

1. Entramos en el menú Window > Preferences

2. En el espacio de búsqueda ponemos "encoding". Entre los resultados, nos interesa seleccionar General > Content Types.

3. Veremos entonces a la derecha varias opciones, y seleccionamos Text. En ese momento, seleccionado Text, en la parte de abajo tenemos una caja de texto con título "Default encoding", lo rellenamos con UTF-8 y finalmente pulsamos en el botón Update.



4. Después desplegamos esa opción Text, y vamos una a una por las opciones internas, algunas de ellas tienen fijado otro valor diferente a UTF-8, y lo que haremos es cambiarlo.

Con esto haremos que todos los ficheros que manejemos con eclipse, se traten como UTF-8.

OJO: Si el proyecto es nuevo, todo irá como la seda, pero si estáis importando un fichero con ficheros que estaban en otra codificación, no es solución suficiente, ya que eclipse no cambia la codificación física de los ficheros existentes con estas configuraciones. Para esta tarea de transformar ficheros de otra codificación hacia UTF-8... no he encontrado nada por ahí automático, y siempre he utilizado herramientas tan básicas como Notepad++, en el que desde su menú Codificación, puedes seleccionar Convertir a UTF-8.

viernes, 18 de marzo de 2011

Problema con templates javascript #{...} en JSP

Trabajando con Tomcat 6 y jsp, me he encontrado con un problema cuando intento utilizar plantillas (templates) para utilizar desde la parte de javascript con jQuery o Prototype.

La sintaxis para utilizar estos templates tiene esta forma #{...}, pero al compilar las JSPs que tienen estos templates en su contenido, Tomcat arroja esta excepción:
(...)

org.apache.jasper.JasperException: /WEB-INF/jsp/home.jsp(45,5) #{..} no está permitido en texto de plantilla
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:102)
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:706)
at org.apache.jasper.compiler.Node$ELExpression.accept(Node.java:958)

(...)

Buscando por el problema en Internet, la mejor solución que he encontrado es añadir en la JSP la siguiente sentencia:

<%@page deferredSyntaxAllowedAsLiteral="true"%>


En mi caso lo he incluido justo después de declarar las taglib que utilizo, quedando así:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"
%><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"
%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"
%><%@ taglib prefix="spring" uri="http://www.springframework.org/tags"
%><%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json"
%><%
/*Para evitar error #{..} is not allowed in template text  */
%><%@page deferredSyntaxAllowedAsLiteral="true"%>

Página donde encontré finalmente la mejor solución: http://mail-archives.apache.org/...

Espero que os sirva.

domingo, 14 de febrero de 2010

Herramientas de control de calidad de código

Existen herramientas que nos facilitan 'medir' la calidad del código de nuestras aplicaciones. El uso de estas herramientas resulta muy interesante en proyectos grandes donde sería una locura revisar una a una las clases que componen el proyecto, pero todavía pueden sernos más útiles si nos acostumbramos a utilizarlas desde el inicio de los proyectos, previniendo que nuestro código vaya tomando un volumen de incorrecciones que de otra forma costará mucho tiempo corregir.

Por mencionar alguno de los conceptos de corrección que se pueden medir:

  • Código duplicado

  • Variables no utilizadas

  • Casting imposible de variables

  • instanceof siempre devolverá false


Ojo, estas herramientas son altamente configurables, miden cantidad de conceptos de corrección parametrizables, y si no se ajustan correctamente pueden darnos resultados que no se ajustan a la realidad. Es por esto que uno no lo instala tal cual y se fía de todo lo que le dice la herramienta, ya que los ajustes variarán de un proyecto a otro.

Yo utlizo Eclipse, y por eso recomiendo los siguientes plugins que nos ayudan en estas tareas y que son complementarios:

PMD:

Web del proyecto: http://pmd.sourceforge.net/
Ruta para instalar la herramienta desde el menú Ayuda>Instalar software nuevo: http://pmd.sourceforge.net/eclipse

FindBugs:

Web del proyecto: http://findbugs.sourceforge.net/
Ruta para instalar la herramienta desde el menú Ayuda>Instalar software nuevo: http://findbugs.cs.umd.edu/eclipse/

Existen herramientas que actuan como contenedores de herramientas de este tipo y gestionan en un único entorno toda la información que proporcionan. Quizá la que más se está utilizando ahora es Sonar, y dejo aquí la ruta a la web del proyecto para que lo investigues si te parece interesante http://sonar.codehaus.org/.

domingo, 1 de marzo de 2009

Función periódica con javascript

En ocasiones es necesario realizar comportamientos javascript en pantalla de forma reiterada cada cierto intervalo de tiempo.

Por ejemplo realizar el refresco de una parte de la página, o esperar a que aparezca algo en pantalla para realizar cierta acción.

En algún caso lo he necesitado, y lo resolví de este modo, teniendo disponible la librería Prototype:
Prueba = {
  atributo1: '',
  atributo2: 1,
  hemosTerminado: false,

  inicializarComportamientoPeriodico: function(){

  new PeriodicalExecuter(

  function actualizacionDeLoQueSea(timer){
//Aquí realizamos las acciones que queramos
  this.atributo1 = this.atributo1 + 'vuelta ' + this.atributo2 + ',';
  this.atributo2 = this.atributo2 + 1;

//Comprobamos la condición de finalización
  this.hemosTerminado = ........

if(this.hemosTerminado)
  timer.stop();

  }.bind(this),
  2
  );
  }
}

Event.observe(window, "load", Prueba.inicializarComportamientoPeriodico.bindAsEventListener(Prueba));

Como vemos tenemos un objeto que hemos llamado Prueba.

Cuando la página se haya cargado llamaremos al método que inicializa nuestra función periódica.
El método que inicializa el comportamiento periódico crea un objeto PeriodicalExecuter que recibe como parámetros:

  • la función que ejecutará (en este caso le pasamos una función que definimos ahí mismo)

  • el intervalo de tiempo en segundos


Observaciones:
- Hay que tener en cuenta que será necesario en esta implementación el uso de bind al pasar la función a PeriodicalExecuter.
- Se ha incluido una condición de parada de las repeticiones que hace que deje de ejecutarse nuestra función.

domingo, 8 de febrero de 2009

Primera aplicación Spring

Ya vimos cómo Comenzar un proyecto web con Eclipse y servidor, y partiendo de ese punto queremos hacer un "hola mundo" con Spring.

Lo que haremos es incluir las librerías básicas de Spring y configurarlo para tener una prueba de concepto del patrón MVC.

El objetivo es tener una página de entrada desde la que mediante enlaces accedamos a dos operativas diferentes. Cada operativa funciona mediante un controlador que recibe la petición del navegador, realiza las operaciones necesarias y responde con una pantalla de resultado.

Los pasos que seguiremos son los siguientes:

  1. Incluir librerías en el proyecto

  2. Configurar el entorno

  3. Crear controladores

  4. Crear pantallas de resultados (la vista)

  5. Trazas de la aplicación

  6. Resumen gráfico

  7. Arranque de la aplicación