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"%>
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/.
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.
Cuando empezamos con Eclipse, tenemos delante un completísimo y muy complejo entorno de programación que de primeras puede echarnos para atrás si no estamos convencidos de que realmente nos hará la vida más fácil.
Escribo este tutorial para tenerlo como referencia cuando tenga que crear un proyecto web. El objetivo es tener un proyecto web listo para empezar a programar tanto Java como JSP y poder verlo en un servidor que también montaremos desde el mismo Eclipse.
Los pasos que seguiremos son los siguientes:
Configurar Eclipse
Añadir el servidor
Crear el proyecto
Añadir el proyecto al servidor
Prueba de que todo está preparado
1 Configurar Eclipse
Vamos a utilizar Java 1.5, así que haremos que sea la JVM por defecto. Vamos al menú Window -> Preferences, y en el diálogo vamos a Java -> Installed JREs
Si no aparece la jre o jdk 1.5, entonces la añadimos con el botón add… Una vez añadida la dejamos marcada como se ve en la imagen anterior para que sea la versión de Java por defecto de ahora en adelante.
2 Añadir el servidor
Si no tenemos la pestaña Servers, la añadimos desde el menú Window -> Show View -> Other, y en el diálogo buscamos Servers
Con esto debería aparecer la pestaña Servers en la parte inferior de la pantalla.
Hacemos clic derecho en el espacio de la pestaña y elegimos New -> Server, y en el diálogo seleccionamos Tomcat v6.0 y damos a Next. En este paso veremos que podemos elegir la carpeta donde está instalado o bien, y esta opción es la más recomendable, así estará todo limpio, descargarlo de Internet.
Si lo descargamos nos pide el directorio de instalación y en un momento lo tendremos listo.
3 Crear el proyecto
Vamos a crear un proyecto web, así que seleccionamos el menú File -> New -> Project. Y en el diálogo que aparezca buscamos Web -> Dynamic Web Project
4 Añadir el proyecto al servidor
Por último hay que incluir el proyecto que acabamos de crear en el servidor para que este lo cargue al arrancarse. Vamos a la pestaña de Servers, y sobre nuestro servidor hacemos clic derecho eligiendo Add and remove projects…, y después en el diálogo pasamos de la parte izquierda a la parte derecha nuestro proyecto.
5 Prueba de que todo está preparado
Para ver que nuestro servidor y nuestro proyecto están listos, crearemos una jsp, arrancaremos el servidor y veremos en el navegador que funciona.
1º Creamos una pagina de inicio
Para crear una jsp vamos a la carpeta del proyecto y hacemos clic derecho, eligiendo New -> Other y después en el diálogo buscando Web -> JSP
En el diálogo siguiente elegimos como nombre index.jsp
2º Editamos la jsp
Entre las etiquetas body lo siguiente:
<h1>Servidor arrancado con aplicación de prueba</h1>
3º Arrancamos el servidor
Desde la pestaña Servers arrancamos el servidor pulsando el botón verde Run () El servidor quedará arrancado en el puerto 8080 por defecto.
4º Vemos en el navegador el resultado
Abrimos el navegador y escribimos en la barra de direcciones:
http://localhost:8080/mi_proyecto/ (*)
Veremos la siguiente pantalla:
(*) el nombre del proyecto exacto para poner en la barra de direcciones, se encuentra configurado en eclipse, en la parte de ficheros del servidor que aparece en la izquierda. Debemos mirar el fichero server.xml al final del mismo. Esta línea define el nombre de la ruta para ver el resultado del proyecto en el explorador:
Pues bien, hasta aquí ya tenemos preparado nuestro entorno para empezar nuestro proyecto web.
Tal y como está la configuración, podemos ir creando páginas JSP en la carpeta Web Content para verlas en el explorador, crear clases Java, y añadir librerías etc para dar más funcionalidad al proyecto. En futuros artículos veremos como ir dando forma a proyectos concretos partiendo siempre de esta base.
Nota: Para ejecutar el flujo se llama a la siguiente URL http://localhost:8080/<Despligue del proyecto>/<Controlador de web-flow>?_flowId=uploadFichero . (Dependiendo de la configuración de nuestro entorno)
Creación del JSP donde vamos a meter la pantalla.
Los cambios o diferencias con un JSP normal son:
-La definición del form hay que poner un enctype para indicar que es multipart:
enctype="multipart/form-data">
Nota: Con esto le indicamos que vamos a mandar un multipart.
-Definimos un input para que el usario le pase el fichero:
<inputtype="file"name="file">
A continuación vemos un ejemplo de JSP de descarga, con los cambios que hemos indicado.
En file, podemos sacar el fichero, con los byte, pero tiene un método para transferir el fichero a una ubicaciónfísica (Fichero es una variable de tipo file que indica la ruta donde vamos).