Contacto

Nos puedes enviar un artículo a publicar (si te fue útil, seguro que a otros también).
Nos puedes sugerir temas/profundidad de interés.
correo-e - perfil

Busquedas

Validar datos de formulario con Spring mvc

 Continuando con los ejemplos de spring mvc, al formulario del artículo anterior (Formulario con Spring MVC) le agregamos validación de los datos.

  1) Para esto agregamos un campo adicional en el formulario (la edad del usuario), para validar un entero como ejemplo, por lo que incluimos en la página usuario.jsp la siguiente línea:
    Edad: <form:input path="edad"/>

  2) En la clase que se mantiene los datos del formulario, test.bean.Usuario.java, se tiene que incluir el atributo "edad", con el get/set correspondiente.

 private int edad;
 public int getEdad() { return edad; }
 public void setEdad(int edad) { this.edad = edad; }


  3) Creamos una nueva clase, que será la encargada de la validación de los campos del formulario. Se tiene que implementar la interface Validator (org.springframework.validation.Validator), junto con los métodos 'supports' y 'validate'.

 Usamos ValidationUtils.rejectIfEmptyOrWhitespace, que verifica que el campo que indicamos (segundo parámetro, por ejemplo "nombre") no este vacío, ni contenga solo espacios en blanco.
 Si se cumple la condición, genera un error con un código (tercer parámetro, por ejemplo 'error.usuario.nombre', el cuál se busca en el archivo de resource bundle configurado (si se hizo), para desplegar el texto que corresponda con ese código.
 En caso de no encontrar el código, se muestra el mensaje por defecto (cuarto parámetro, por ejemplo 'Error en nombre').

test.bean.validator.UsuarioValidator.java
   package test.bean.validator;
   import org.springframework.validation.Errors;
   import org.springframework.validation.ValidationUtils;
   import org.springframework.validation.Validator;
   import test.bean.Usuario;
     /** @author dlix */
   public class UsuarioValidator implements Validator {
     public boolean supports(Class type) {
       return Usuario.class.isAssignableFrom(type);
     }
     public void validate(Object command, Errors errors) {
       Usuario form = (Usuario) command;
       ValidationUtils.rejectIfEmptyOrWhitespace(errors, "nombre", "error.usuario.nombre", "Error en nombre");
       ValidationUtils.rejectIfEmptyOrWhitespace(errors, "apellido", "error.usuario.apellido", "Error en apellido");

      validateEdad(form.getEdad(), errors);
      validateApellido(form.getApellido(), errors);
   }
      // tiene que ser mayor de 18
   private void validateEdad(int edad, Errors errors) {
       if( edad < 18){ errors.rejectValue("edad", "error.usuario.edad", "Error en  edad"); } }

      // El apellido solo puede tener letras 
   private void    validateApellido(String apellido, Errors errors) {
      if (!apellido.trim().matches("[a-zA-Z]*") ) {
           errors.reject("error.usuario.apellido.nomatches", 
               "El apellido solo tiene  que tener letras"); } } 
}

 4) Se le tiene que indicar al framework, la clase encargada de validar el formulario.
  Una de las formas de hacer esto, es en la configuración del Dispatcher Servlet. En el archivo dispatcher-servlet.xml, en el bloque donde se configuró el controlador (<bean id="usuController" ...), se agrega:
   <property name="validator">
     <bean class="test.bean.validator.UsuarioValidator"/>
   </property>


 5) Se tiene que modificar la página nuevamente, en esta oportunidad para mostrar los mensajes de error.
  Para esto tenemos varias posibilidades, según la forma que se quiera desplegar los mensajes al usuario.
 En la página tenemos que tener el taglibs 'core' <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>, y recordamos que ya tenemos el 'form' de spring (<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" % > )

  Los errores pueden representar un campo del formulario (al validar, cuando se indica, por ejemplo, errors.rejectValue("edad", ...) ).
  En este caso, podemos ver el error mediante: <form:errors path="edad" />. Con la propiedad 'path' se indica el campo del formularo que representa el error.

  Pueden haber errores que no representen un campo en particular, por ejemplo, al validar, errors.reject("error.usuario.apellido.nomatches",...).
  En la página podemos desplegar todos estos errores mediante: <form:errors />

  Con <form:errors path="*"> estamos indicando todos los errores ('path=*' matchea con todos los valores), y de esta forma podemos reccorrer todos los mensajes (en la variable 'messages') de error, de la siguiente forma:

  <form:errors path="*">
     <c:forEach items="${messages}" var="message">
        <c:out value="${message}"/><br />
     </c:forEach>
  </form:errors>


 En este momento podemos ejecutar la aplicación, y verificar que se realizan las validaciones correctamente.

 Si en el campo de 'edad', que corresponde a un entero, ingresamos un valor que no puede ser convertido a Integer, en la página se desplega el error:
'Failed to convert property value of type [java.lang.String] to required type [int] for property 'edad'; nested exception is java.lang.NumberFormatException: For input string: "5AA"

 Por último configuramos ResourceBundleMessageSource, para tener fuera del código los mensajes de error, y agregar un mensaje amigable al usuario, para la exception de NumberFormatException.

 6) Configuración de mensajes.
  6.1) Se crea dentro del paquete "test.resource" (obviamente, puede tener la ruta y nombre de nuestra preferencia), el archivo "messages.properties" en donde se va a ingresar los mensajes de error a desplegar en la página.

     messages.properties
  error.usuario.nombre=Se tiene que ingresar nombre valido.
  error.usuario.apellido=Se tiene que ingresar apellido valido.
  error.usuario.edad=Se tiene que ingresar edad.
  error.usuario.apellido.nomatches=El apellido solo puede contener letras, sin espacios.
  typeMismatch.usuario.edad=Edad solo puede tener Nros. enteros.


 Nota: con typeMismatch contolamos el mensaje del error NumberFOrmatException

 Se puede agregar caracteres especiales en el texto. Por ejemplo, si tienes que incluir tildes y eñes, agrega estos caracteres con su código unicode.
 Los códigos unicode para tildes y eñes se pueden obtener en el articulo Caracteres Html y Unicode en español.
 Por ejemplo, se pudo haber indicado el siguiente error:
  "error.usuario.edad=N\u00famero inv\u00e1lido para edad." para indicar :"Número inválido ..."

  6.2) Se modifica 'dispatcher-servlet.xml' para configurar el archivo que contiene los mensajes, agregando el siguiente bloque:

  <bean id="messageSource"   class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename">
       <value>test.resource.messages</value>
    </property>
  </bean>


Al ejecutar la aplicación con estos nuevos cambios, y generar los errores, podemos ver los diferentes textos que que incluimos en el archivo "messages.properties", en lugar de los mensajes por defecto "hardcodeados" en el código.

(El proyecto TestSpring para descargar fuentes y .war)

Leer más...

Formulario con Spring MVC

 Vamos a modificar el proyecto anterior con spring mvc (Implementar Spring MVC) para incluir un formulario de ejemplo.
 Para esta tarea, vamos a crear nuestra propia clase que actúa como controller, que hereda de SimpleFormController. Usamos dos páginas (vistas), una encargada de mostrar el formulario, y otra para los resultados.

1) Primero modificar el archivo de configuración del servlet que funciona como Front Controller ( Dispatcher Servlet), en nuestro proyecto, el archivo: dispatcher-servlet.xml

1.1) Lo primero que indicamos en la configuración del 'Handler Mapping', cuál es la url del formulario, y el nombre del controlador responsable de manejar esa url. Para esto, se agrega la siguiente línea: <prop key="usuario.htm">usuController</prop>
 Básicamente, lo que estamos indicando en esta línea es: Las consultas a la url 'usuario.htm' redirigir al Controller con nombre: 'usuController'.

EL bloque completo de la configuración del HandlerMapping :
<bean id="urlMapping"  
 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="mappings">
      <props>
         <prop key="index.htm">indexController</prop>
        <prop key="usuario.htm">usuController</prop>
      </props>
   </property>
</bean>

Leer más...

Implementar Spring MVC

 La idea es dar una presentación sencilla de Spring MVC (usamos Spring MVC 2.5), y poder avanzar en ejemplos posteriores.

 Spring MVC es un framework open source que forma parte de Spring Framework. Provee una implementación del patrón Model View Controller (MVC - modelo vista controlador) en java.
 Al ser parte de Spring Framework, es posible utilizar fácilmente las ventajas que éste nos aporta, como ser la Inyección de Dependencia.
 La Inyección de Dependencia hace posible que el framework se encargue del trabajo de incluir las dependencias necesarias por la aplicación, eliminando de las clases la creación de objetos.

 Una explicación muy breve y generalizada del funcionamiento de spring mvc sería:
=> todas las peticiones de los usuarios/clientes pasan por un servlet (Front Controller - Dispatcher Servlet), cuyo comportamiento se configura en un archivo xml. Este servlet envía el request a ser procesado por un 'Controller', el cual encapsula los datos resultantes (Model), y por último se muestran los resultados en una 'vista' (View, la cual puede ser una página, un documento pdf, etc).

 En Spring MVC, la responsabilidad para el manejo de los request realizados por los usuarios, se delegan a controladores (Controllers).
 Se tiene que configurar (mapear) de alguna forma, a qué controlador se envía un request en particular. El encargado de manejar esta tarea es un servlet que funciona como Front Controller, al que se le da el nombre de 'Dispatcher Servlet'.
 Este mapeo entre request y controller se configura mediante el Handler Mapping.
 Spring nos provee de varios Handler Mapping entre los que podemos seleccionar, dependiendo como indicamos el controlador a usar (ej. SimpleUrlHandlerMapping, BeanNameUrlHandlerMapping). Es posible configurar varios de estos tipos de Handler Mapping en la misma aplicación, indicando el orden de preferencia (se usa la propiedad 'order', ej: <property name="order"> <value>1</value> </property> ).

 Las clases que se implementen para realizar la tarea de controlador, tienen que heredar de alguna de las clases Controller que dispone Spring. Estos Controller disponibles, nos facilitan la tarea para diferentes funcionalidades, como pueden ser, un controller orientado a mostrar datos (View Controller), un controller que nos facilita el trabajo con formularios (Form Controller), uno que nos permite el manejo de varias pantallas (Wizard Controller), etc.
 Esta clase no es responsable (directamente) de mostrar en algún medio el resultado. De esto se encarga un tipo de clase 'View'.

 Como parte de la lógica del controller, se puede tener como resultado un grupo de datos que representen la respuesta y que se tendrán que mostrar de alguna forma. Estos datos son conocidos como 'Model'.
 Una vez que el contoller implementado realiza la lógica requerida, se tiene que pasar estos datos a una 'vista' (View), que será lo siguiente a ver por el usuario, donde se mostrará los datos (Model) de la consulta.
 En el Controller se encapsula en una clase de tipo ModelAndView, la combinación del los objetos Model y el objeto View.
 Para mantener un bajo acoplamiento, el Model es un Map de objetos, y normalmente el View se indica por medio de un nombre lógico.

Comenzando con un ejemplo
----------------------------
 A continuación vamos a realizar un ejemplo práctico para ver la configuración de las diferentes partes de spring mvc. Para esto voy a usar el ide NetBeans (http://netbeans.org/), el cuál es sumamente sencillo de instalar, y trae todo lo necesario para las tareas a realizar aquí.
 Es posible usar el ide que cada uno prefiera, incluso es suficiente con tener ant, las bibliotecas necesarias ( http://www.springsource.org/download), y un editor de texto como 'vi', 'emacs', etc. Si tu elección es ant + vi ... vas a tener una tarde un poco más divertida :-)

A 'picar' código ;-)
1) Lo primero es tener un proyecto web.
 Si estamos comenzando con el proyecto, desde NetBeans seleccionamos "nuevo proyecto", en la ventana que se despliega, buscamos en la categoría de proyectos "java web", y en seleccionamos la opción "aplicación web".
 Se completa los pasos siguientes, como ser, dar un nombre y ubicación física al proyecto, seleccionar el server a usar (en mi caso Apache Tomcat 6.0.20), y la versión de java (en mi caso, Java EE 5).
 Por último podemos seleccionar el/los frameworks a incluir en el proyecto. Seleccionamos "Spring Web MVC 2.5", finalizando la creación del proyecto.
Se deja la configuración por defecto que ofrece NetBeans para el nombre del servlet dispatcher ('dispatcher'), y mapping ( *.htm).

1.2) En caso tener un proyecto web en el que queremos agregar el Spring MVC , seleccionamos "propiedades" en el proyecto. En la ventana de propiedades seleccionamos la opción de "Frameworks" -> "Agregar ...", y "Spring Web MVC 2.5" (tener en cuenta que se va a modificar el proyecto, y se agrega configuración el el archivo web.xml.

2) Una vista de la estructura del proyecto.
 Lo que obtenemos al terminar nuestra creación / configuración del proyecto web + spring con NetBeans es una estructura, con los archivos y configuración mínima que necesitamos
 -imagen estructura directorios-

Configuración de web.xml
-----------------------------------------------
 En el archivo WEB-INF/web.xml se declara el nombre del servlet que funciona como Dispatcher (o Front Controller), en este caso 'dispatcher', y se configura
el mapeo de las url's a este servlet.

web.xml (fragmento de la configuración usada para spring-mvc)
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class> 
       org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
       org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

 Otra sección importante que podemos ver aquí es el 'contexto de la aplicación', configurado por medio del listener-class 'ContextLoaderListener', y el nombre del archivo a usar -applicationContext.xml-. Aquí se configura, por ejemplo, la inyección de dependencias.

Dispatcher Servlet
-------------------
 Se tiene que crear (en nuestro caso lo hizo NetBeans) el archivo WEB-INF/dispatcher-servlet.xml. El nombre de este archivo esta determinado por el dado en <servlet-name> en el archivo web.xml, seguido de '-servlet'.
 En este archivo configuramos lo necesario por 'dipatcher servlet'. Veamos lo que agrego netbeans en este archivo.

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <bean id="urlMapping"   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 <property name="mappings">
    <props>
        <prop key="index.htm">indexController</prop>
    </props>
 </property>
</bean>

<bean id="viewResolver"     class="org.springframework.web.servlet.view.InternalResourceViewResolver"
     p:prefix="/WEB-INF/jsp/"
     p:suffix=".jsp" />
   <!-- The index controller. -->

<bean name="indexController"    class="org.springframework.web.servlet.mvc.ParameterizableViewController"
    p:viewName="index" />
 </beans>

 Primero se define el manejo del mapeo request con controller. Se usa SimpleUrlHandlerMapping, y se indica que el request a "index.html" se delega al controller con nombre 'indexController'.

 Luego se declara el 'viewResolver', esto es una forma de realizar un mapeo entre vistas (view) y el nombre lógico dado a estas vistas. En el ejemplo, se usa InternalResourceViewResolver. Indicamos el directorio donde se almacenan las vistas por medio de la propiedad 'prefix'. En nuestro proyecto, las vistas (las páginas) están en el directorio '/WEB-INF/jsp' ( p:prefix"/WEB-INF/jsp/" o <property name="prefix" value="/WEB-INF/jsp/" /> ).
 Se indica el tipo de vistas que se usan para mostrarcon la propiedad 'p:suffix', como ser paginas jsp's (p:suffix=".jsp").

 Por último se definió la implementación del controlador. En 'bean name' se indica el nombre del controlador, el cual es igual al usado en la propiedad 'mappings' en el HandlerMapping al comienzo del archivo. Luego se tiene que indicar la clase concreta que implementa el controller.
 Dado que solo vamos a mostrar un mensaje en una página, sin realizar ninguna lógica, se define un controller de spring usado cuando solo se quiere mostrar información: 'ParameterizableViewController'. La vista a la que se tiene que retornar el modelo (model) es 'index' (p:viewName="index").

=> "Traduciendo" esta simple configuración, lo que se dice es: Los request a index.htm, pasarlos al controlador indexController, cuya clase que implementa este controlador es ParameterizableViewController, y retornar el resultado a la pagina "index.jsp", que se encuentra en el directorio /WEB-INF/jsp/ .

Creación del View ( la página index.jsp)
----------------------------------------
 Se tiene que crear la página index.jsp, dentro del directorio /WEB-INF/jsp/ , la cual será mostrada al consultar por index.htm. Si bien netbeans nos ha ahorrado esta tarea, vamos a ingresar un texto mas breve, como ser: "Hola Spring!!"

WEB-INF/jsp/index.jsp
 <%@page contentType="text/html" pageEncoding="UTF-8"%>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
      "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <title>Welcome to Spring Web MVC project</title>
  </head>
  <body>
      <p>Hola Spring!</p>
  </body>
</html>

 Con lo realizado hasta aquí, ya podemos ejecutar la aplicación web, y ver el resultado al teclear en el navegador 'index.htm', en mi caso: http://localhost:8080/TestSpring/index.htm.
 Si el proyecto se ha realizado desde netbeans, tenemos un archivo extra. En la raíz de la aplicación ('Web Pages' en el ide), se creó una página redirect.jsp, la cual solo redirecciona a la url: index.htm
   <%@page contentType="text/html" pageEncoding="UTF-8"%>
   <% response.sendRedirect("index.htm"); %>
y es configurada como página de inicio en web.xml
   <welcome-file-list>
      <welcome-file>redirect.jsp</welcome-file>
   </welcome-file-list>
De esta forma en el navegador solo hacemos: http://localhost:8080/TestSpring

 En el próximo articulo (Formulario con Spring MVC), vamos a modificar un poco el ejemplo, para armar un formulario con validación.
 En este otro artículo (Validar datos de formulario con Spring mvc ), el código con el ejemplo disponible para bajar.

 La documentación de spring es muy completa
http://static.springsource.org/spring/docs/2.5.x/reference
y la pagina de spring downloads : http://www.springsource.org/download
Leer más...

Filtros en jsp y servlets

 Los filtros - filters - en una aplicación web, nos permiten interceptar el request antes de que éste llegue al servlet o jsp correspondiente, y también nos permite interceptar el response del servlet o jsp antes de que llegue al cliente.

  -------------------     request      -----------                   -----------------
 |    Cliente        |  ------------->  | FILTRO |   -------->  | Contenedor  |
 |    Navegador  | <-------------- |              | <--------   | jsp servlet    |
  ------------------      response    ------------                 -----------------

 Los filtros pueden estar encadenados. Para un request dado pueden ejecutarse más de un filtro. FILTRO_1 --> FILTRO_2 --> FILTRO_n --> CONTENEDOR

 Los filtros tienen que declararse en el Deployment Descriptor (el archivo web.xml). En este lugar se indica el/los filtros a ejecutar para un request, y el orden.

 La clase donde creamos el filtro tiene que implementar la interface Filter, e implementar tres métodos de esta interface, siendo "doFilter()" el que contiene  la lógica principal, y es llamado cada vez que se ejecuta el filtro.
 Dentro de este método, cuando se quiere ejecutar el siguiente filtro, se invoca a "doFilter" del objeto FilterChain (es uno de los parámetros de doFilter), si no hay más filtros, entonces el request llega al servlet/jsp invocado (si ninguno de los filtros interrumpió el proceso).

 Los otros dos métodos que se tiene que implementar son "init()" (se ejecuta una vez al iniciar el filtro por el contenedor), y "destroy()" (se ejecuta una vez, cuando se destruye el filtro).

 A continuación, un ejemplo simple para ver el funcionamiento de los Filtros, que imprime una línea en la salida estándar.

==> Primero, la clase que implementa el filtro.
FiltroEjemplo.jsp
  package filtros;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/* Se tiene que implementar Filter */
public class FiltroEjemplo implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
throws IOException, ServletException {

 /* El codigo antes de llamar a chain.doFilter() se ejecuta antes de enviar el
   request al servlet o jsp correspondiente */

        HttpServletRequest reqst = (HttpServletRequest) request;
        System.out.println("Antes de doFilter(): " + new Date() + " - " + getClass().getName() + " "
                + reqst.getRequestURL());

        chain.doFilter(request, response);

 /* El codigo luego de chain.doFilter() se ejecuta después de la respuesta del servlet o jsp,
   y antes de llegar al cliente */
        System.out.println("Luego de doFilter(): " + new Date() + " - " + getClass().getName() + " "
                + reqst.getRequestURL());
    }

    public void destroy() {
    }
    public void init(FilterConfig filterConfig) {
    }
}

==> Se declara el filtro en el archivo web.xml
 web.xml 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>filtro1</filter-name>
        <filter-class>filtros.FiltroEjemplo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filtro1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>SrvltFiltroTst</servlet-name>
        <servlet-class>servlet.SrvltFiltroTst</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SrvltFiltroTst</servlet-name>
        <url-pattern>/SrvltFiltroTst</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

 Los dos elementos usados para declarar el filtro son: filter y filter-mapping

 En el elemento 'filter' se tiene que indicar el nombre del filtro con filter-name (cualquier nombre válido),
y la clase (nombre totalmente cualificado de la clase) que implementa el filtro.
     <filter>
        <filter-name>filtro1</filter-name>
        <filter-class>filtros.FiltroEjemplo</filter-class>
    </filter>

 Una vez que se le dio el nombre al filtro, se tiene que indicar cuando se ejecuta. Para esto usamos filter-mapping, en donde se tiene que indicar el nombre del filtro que estamos 'mapeando' con filter-name, y luego tenemos dos opciones, asociar el filtro con un patrón url con url-pattern, de esta forma es posible asociar el filtro con paginas, grupos de servlets, etc.
  En nuestro ejemplo usamos el patron "/*", por lo que se ejecuta el filtro toda vez que se invoca la aplicación ya que se mapea con cualquier url ingresada, (por ejemplo, se ejecuta el filtro al ingresar url's del tipo: /index.jsp  /reportes/nuevo.jsp   /SrvltFiltroTst )
    <filter-mapping>
        <filter-name>filtro1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 También es posible asociar el filtro con un servlet específico usando el elemento servlet-name.
 Para el web.xml indicado anteriormente, se podría escribir el filter-mapping de la siguiente forma:
    <filter-mapping>
        <filter-name>filtro1</filter-name>
       
<servlet-name>SrvltFiltroTst</servlet-name>
    </filter-mapping>
 En este caso, solo se ejecuta el filtro al invocar el servlet "SrvltFiltroTst".

 Al ejecutar la aplicación web con el filtro y configuración anterior (también imprimiendo una línea de el servlet y la pagina usada para la prueba), podemos ver en la salida estándar:

 Antes de doFilter(): Fri Jul 10 23:09:36 UYT 2009 - filtros.FiltroEjemplo http://localhost:8084/FiltroTestBlog/SrvltFiltroTst
  Fri Jul 10 23:09:36 UYT 2009 - servlet.SrvltFiltroTst
  Fri Jul 10 23:09:36 UYT 2009 - org.apache.jsp.index_jsp
 Luego de doFilter(): Fri Jul 10 23:09:36 UYT 2009 - filtros.FiltroEjemplo http://localhost:8084/FiltroTestBlog/SrvltFiltroTst

 Con este sencillo ejemplo podemos comprobar el proceso normal que se menciono al comienzo: cliente -> filtro -> jsp/servlet ->filtro ->cliente

Orden de ejecución de filtros en cadena.
  Cuando un request concuerda con varios filter-mapping, todos los filtros se ejecutan en un orden dado, según la siguiente regla.
 1) Todos los filtros que concuerden con el url-pattern , son colocados al comienzo de la cadena, y en el orden como fueron declarados en el archivo web.xml.
2) Luego se agregan a la cadena los filtros que concuerden con servlet-name , en el orden como fueron declarados.


 En otra oportunidad vamos a dar algún ejemplo más complejo, y ver la opción del elemento 'dispatcher' dentro de filter-mapping

 un recurso para ver más sobre este tema:  http://java.sun.com/products/servlet/Filters.html
Leer más...

Caracteres Html y Unicode en español

 El siguiente listado son algunos de los caracteres especiales en español, y sus equivalentes unicode y equivalente por nombre y por valor numérico, que normalmente podemos necesitar al estar escribiendo una página web (html, xml, javascript ...).
 El objetivo es poder tenerlos juntos, para evitar estar buscando en un libro o la web cada vez que no recuerdo alguno de ellos ( ... siempre).
 Si alguien ve necesario / útil que agregue algún otro carácter, me lo hace saber y lo incluyo a la lista.
 Espero sea de utilidad, esta es la lista de caracteres:

Símbolo Numérico Nombre Unicode Descripción
" &#034; &quot; \u0022 Comillas dobles
$ &#036; \u0024 Símbolo Dolar/Peso
& &#038; &amp; \u0026 Ampersand
' &#039; &apos; \u0027 Apóstrofe
( &#040; \u0028 Paréntisis izquierdo
) &#041; \u0029 Paréntisis derecho
< &#060; &lt; \u003C Menor que
> &#062; &gt; \u003E Mayor que
@ &#064; \u0040 Arroba
&#128; &euro; \u20AC Euro
&#153; \u0099 Trademark (n.e)
&#160 &nbsp; \u0020 Espacio en blanco
© &#169; &copy; \u00A9 Copyright
® &#174; &reg; \u00AE Marca registrada
½ &#189; &frac12; \u00BD Fracción un medio
Á &#193; &Aacute; \u00C1 A mayúscula, acento agudo
É &#201; &Eacute; \u00C9 E mayúscula, acento agudo
Í &#205; &Iacute; \u00CD I mayúscula, acento agudo
Ñ &#209; &Ntilde; \u00D1 N mayúscula tilde (eñe mayúscula)
Ó &#211; &Oacute; \u00D3 O mayúscula, acento agudo
Ú &#218; &Uacute; \u00DA U mayúscula, acento agudo
Ü &#220; &Uuml; \u00DC U mayúscula, diéresis
á &#225; &aacute; \u00E1 a minúscula, acento agudo
é &#233; &eacute; \u00E9 e minúscula, acento agudo
í &#237; &iacute; \u00ED i minúscula, acento agudo
ñ &#241; &ntilde; \u00F1 n minúscula tilde, (eñe)
ó &#243; &oacute; \u00F3 o minúscula, acento agudo
ú &#250; &uacute; \u00FA u minúscula, acento agudo
ü &#252; &uuml; \u00FC u minúscula, diéresis
Leer más...