Retroceder   Foros del Web > Programación para sitios web > Java y JSP

Respuesta
 
Herramientas Desplegado
Antiguo 14-may-2008, 08:42   #61 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y Coneccion a BD
Pregunta: Acceso a datos con un jndi segunda parte?
Respuesta: un jndi es un metodo de tener acceso a bases de datos mucho mas rapido que con un acceso jdbc tradicional.

En ocasiones dependiendo del Sistema operativo hay que hacer unos pasos más.

Si con el faq anterior no se ha realizado la conexión puedes entrar directamente al archivo Server.xml del tomcat y escribir el mismo código que escribiste en el archivo content.xml, ten cuidado en este archivo una mala configuración puede hacer que el tomcat no se levante.

Código PHP:
<Context path="/prueba" docBase="/home/lino/sitios_web/prueba" reloadable="true">
         <
Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="5" maxWait="20000" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/database"/>
      </
Context>¡ 
Otra cosa que puedes hacer es declarar las variables de entorno por ejemplo en Linux hacer algo como esto.

Código PHP:
JAVA_HOME="/usr/local/java/jdk1.5.0_10"
CLASSPATH="/usr/local/java/jdk1.5.0_10/lib/tools.jar:/usr/local/java/jdk1.5.0_10/lib/dt.jar:/usr/local/tomcat/common/lib/mysql-connector.jar:/usr/local/tomcat/common/lib/servlet-api.jar"
PATH="$PATH:/usr/local/java/jdk1.5.0_10/bin"
CATALINA_HOME="/usr/local/tomcat"
export JAVA_HOME
export CLASSPATH
export PATH
export CATALINA_HOME 
los valores del jdk cambian de acuerdo a la versión que tengas. Verifica el class path para que mysql-connector este levantado.

Para windows se puede hacer desde el asistente de variables de entorno en propiedades de mi PC.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 09:03   #62 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: Nomenclatura de clases?
Respuesta: El patrón MVC o Modelo Vista Controlador esta orientado a la programación en capas separando la lógica del negocio de la vista. Las capas que se utilizan son Modelo, Vista y Controlador.

Modelo: la capa de Modelo es la capa intermedia entre la Vista y el Controlador, esta capa tiene tres tipos de clases importantes o beans como las llaman los desarrolladores de java estas clases son: clases BO, clases DAO y clases DTO.

• BO (Business Object): son clases que se encargan de armar toda la lógica del negocio y así mismo separarla de las clases de acceso a datos, vista y modelo.

• DAO (Data Access Object): son las clases que se encargan del acceso a los datos, como consultas a Bases de Datos, ejecución de Stored Procedures.

• DTO (Data Transfer Object): son clases beans simples que su función primordial es servir de contenedor de datos para ser transferidos a otros lados de la aplicación.

Controlador: la capa de Controlador tiene la función de manipular el flujo de la aplicación por medio de clases que extienden de Action o DispatchAction, en estos ejemplos usaremos la clase DispatchAction ya que es mucho mas funcional al distribuir el flujo de la aplicación por medio de un despachador de peticiones.

Vista: la capa de Vista es la capa de presentación al usuario final de la aplicación, en esta capa se encuentran los JSP que mostraran la salida de los datos al usuario.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 09:11   #63 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: Clases DTO?
Respuesta: Como se vio anterior mente. Una clase DTO sirve para almacenar temporalmente datos y transferirlos a otras partes de la aplicación.

Este es un ejemplo de clase DTO.
Código PHP:
public class DireccionDTO {
  private 
String postalCode;
  private 
String ciudad;
  private 
String municipio;
  
public 
DireccionDTO(){}
  
  public 
String getPostalCode(){
   return 
postalCode;    
  }
  
  public 
void setPostalCode(String postalCode){
   
this.postalCode=postalCode;    
  }
  
  public 
String getCiudad(){
    return 
ciudad;    
  }
  
  public 
void setCiudad(String ciudad){
    
this.ciudad=ciudad;    
  }

public 
String getMunicipio(){
    return 
municipio;    
  }
  
  public 
void setMunicipio(String municipio){
    
this.municipio=municipio;    
  }

Como se puede observar no es mas que una simple clase bean pero la terminología es clase DTO.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 09:29   #64 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: Clases DAO?
Respuesta: Como se vio anterior mente. Una clase DAO sirve para comunicarse con la BD.

Clases DAO son de acceso a bases de datos, este es un ejemplo de clase DAO.

Código PHP:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.lino.prueba.utils.*;
import com.lino.prueba.dto.*;

public class 
DireccionDAO {

    public 
DireccionDAO(){}
    
    public 
DireccionDTO getDireccion(String postalCodethrows Exception{
        
Connection con=null;
        
PreparedStatement ps=null;
        
ResultSet rs=null;
                   
DireccionDTO direccionDTO=null;
        
        
String query="select CodigoPostal from Direcciones where CodigoPostal=?";
        
        try{
          
con=ConnectionFactory.getConnection();
          
ps=con.prepareStatement(query);
          
ps.setString(1,postalCode);
          
rs=ps.executeQuery();
          if(
rs.next()){
                  
direccionDTO=new DireccionDTO();
              
direccionDTO.setPostalCode(postalCode);
              
direccionDTO.setCuidad(rs.getString("cuidad"));
              
direccionDTO.setMunicipio(rs.getString("municipio"));
          }
        }catch(
Exception e){
          throw new 
Exception(e.getMessage());
        }
finally{
          if(
rs!=null){
               
rs.close();
          }if(
ps!=null){
              
ps.close();
          }
          
ConnectionFactory.closeConnection(con);
        }
        return 
direccionDTO;
    } 
Lo que hace esta clase es una consulta a la base de datos en el comando ps.setString(1,postalCode); se sustituye el signo ? por el contenido del string lo que hace que la consulta sea portable independientemente del DBMS. Para la implementación de la clase ConnectionFactory vean la página anterior en la pregunta de Acceso a datos con un jndi. Esta consulta trae un registro el cual se almacena en un objeto DTO y se transfiere.

Para preparar la consulta.
Código PHP:
          con=ConnectionFactory.getConnection();
          
ps=con.prepareStatement(query);
          
ps.setString(1,postalCode);
          
rs=ps.executeQuery(); 
Es aquí donde se llama a la clase estática y a su método getConnection() ( ConnectionFactory.getConnection), si el lector ha notado en la sentencia sql almacenada en el String query hay una parte así CodigoPostal=? Esto con el fin de establecer ese parámetro como un String, int o con algún otro dato esto se hace con la instrucción ps.setString(1,postalCode);

La sentencia
Código PHP:
if(rs.next()){
      
direccionDTO=new DireccionDTO();
    
direccionDTO.setPostalCode(postalCode);
    
direccionDTO.setCuidad(rs.getString("cuidad"));
    
direccionDTO.setMunicipio(rs.getString("municipio"));

Valida si existe esa información, el rs (ResultSet) tiene un metodo llamado next(), si al realizar una consulta esta devuelve por lo menos un registrio rs.next() encontrará una respuesta, en caso contrario no producira nada, como esta consulta es devuelve un solo elemento basta con ejecutar rs.next() una vez, si entra en el if significa que la consulta fue exitosa.

En caso de una excepción se tira para arriba, hay que recordar siempre en conexiones a bases de datos cerrar las conexiones que se habrán, para eso usamos la sentencia finally y dentro de ella cerramos la conexión.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 10:14   #65 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

B]Tema:[/b] NET y MVC
Pregunta: Clases BO?
Respuesta: Como se vio anteriormente. Una clase BO sirve para realizar la logica del negocio y no incluir la logica en un DAO o en un DTO.

Esta clase es en la que se desarrolla toda la lógica del negocio. En este caso no se realiza mucha lógica, pero es en esta clase donde se debe desarrollar la lógica para después enviar los resultados al Action que solo despachará el resultado a la vista.
Código PHP:
import com.lino.prueba.dao.*;
import com.lino.prueba.dto.*;

public class 
DireccionBO {
   
DireccionDAO direccionDAO=new DireccionDAO();
   
   public 
DireccionDTO getDireccion(String postalcode)throws Exception{
       
DireccionDTO direccionDTO=new DireccionDTO();
       
direccionDTO=direccionDAO.getDireccion (postalcode);
       
       if(
direccionDTO.getCiudad()==null){
          
direccionDTO=null;     
       }
       else if(
direccionDTO.getCiudad().equals(“”)){
           
direccionDTO=null;     
        }
        return 
direccionDTO;     
      }

Esta clase consta pasa el control a la clase DAO la cual valida contra la base de datos el código postal y determina la dirección, en el caso de ser valido devuelve un objeto DireccionDTO sino genera un Exception, en caso correcto manda el control al Action que lo llama.

Para la programación de una ActionForm y un DispatchAction pondré los faqs mañana.

Saludos.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 15:28   #66 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: Paquetes?
Respuesta:
Como se han podido dar cuenta en las clases anteriores he creado los paquetes com.lino.prueba.dao, com.lino.prueba.dto y com.lino.prueba.bo estos paquetes son los que contendrán las clases creadas, pos si alguien no sabe que es un paquete. Un paquete es un directorio dentro de la aplicación y cuando una clase pertenece a un paquete se agrega la palabra package al principio de la clase con el paquete al que corresponden. Por ejemplo las tres clases que ya creamos tienen que estar dentro de un paquete por ejemplo la clase DireccionDTO debe estar dentro del paquete com.lino.prueba.dto y al principio de la clase se debe poner la instrucción package com.lino.prueba.dto;

Así la clase DTO quedaría al principio algo así.

Código PHP:
package com.lino.prueba.dto;

public class 
DireccionDTO 
  private 
String postalCode
  private 
String ciudad
  private 
String municipio
Pero para que son los paquetes, bueno los paquetes son necesarios para administrar las clases, a veces no son necesarios es decir todas las clases podrían estar en el paquete por omisión pero en ocasiones al separar las cosas es mejor hacerlo generando paquetes.

Este tutorial trata de darle a entender al usuario como crear los paquetes que posiblemente pueda necesitar en sus aplicaciones.

Formas de generar paquetes.

1.- por fuera de la aplicación crea directorios y en tu aplicación importa los paquetes dependiendo de que IDE uses en eclipse por ejemplo basta con meter estos directorios dentro de la carpeta JavaSources y darle un refresh a la aplicación desde el eclipse.

2.- al momento de generar la clase crea el paquete, nuevamente en el eclipse al crear la clase hay un cuadro de texto que te permite crear el paquete donde estará dicha clase.

PD: para las clases DAO, DTO y BO de prueba genera paquetes y agrega la linea package con el paquete que le corresponda al principio de cada clase como se muestra aquí con la clase DTO.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 15:30   #67 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: clase ActionForm?
Respuesta:

Continuando con los mini tutos, este ejercicio consiste en realizar un ActionForm de prueba que implemente la dinámica de las clases anteriores.


DireccionForm.java

Esta clase extiende de ActionForm y la mayoría de sus metodos son get y set de sus atributos, para el caso de los tipos boléanos en lugar de get se usa el termino is, también contiene un método validate y un método reset los cuales se pueden sobre escribir para realizar validaciones a gusto del usuario.

Código PHP:
import org.apache.struts.action.ActionForm;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import com.lino.prueba.dto.*;

public class 
DireccionForm extends ActionForm{
    private 
String postalCode=null;
    private 
DireccionDTO direccion=new DireccionDTO();
    
    public 
DireccionForm(){}
    
    public 
void setPostalCode(String postalCode){
      
this.postalCode=postalCode;    
    }
    
    public 
String getPostalCode(){
       return 
this.postalCode;     
    }
    
    public 
DireccionDTO getDireccion(){
       return 
this.direccion;    
    }
    
    public 
void setDireccion(DireccionDTO direccion){
        
this.direccion=direccion;
    }
    
    public 
ActionErrors validate(ActionMapping mappingHttpServletRequest request) {
        
ActionErrors errors = new ActionErrors();
        if ((
postalCode == null) || (postalCode.length() < 1))
            
errors.add("postalcode1", new ActionError("error.postalcode.required"));
        return 
errors;
    }            
    
    public 
void reset(ActionMapping actionMapping,    HttpServletRequest Request) {
           
postalCode "";
    }
    

Este form tiene dos variables, un tipo String llamado postalCode y un tipo compuesto llamado direccion, algo que es importante definir en las reglas de java es que los nombres de variables siempre deben comenzar con minúscula en el caso de que estas variables contengan un método get y set, esto dado que el compilador no hallará estos métodos si las variables comienzan con mayúscula.

Una clase form debe tener para cada atributo (variable) que se presentara en un <html:form> un método get y set, la clase form puede tener atributos que no se presenten en un <html:form> e incluso métodos que no sean get y set, tal como una clase tradicional. Un error frecuente al momento de cargar una clase form en un <html:form> es que no encuentre los metodos get y set de los atributos. Esto por que los métodos get y set no corresponden a las variables (atributos que se declaran). Por ejemplo si tenemos lo siguiente
Código PHP:
String nombre=null;

public 
void setNombres(String nombre){
   
this.nombre=nombre;

Este fragmento de código es erróneo por que a pesar de que este método set use la variable “nombre” el método se llama “setNombres” cuando debería llamarse “setNombre” otro caso común de error como ya se menciono es este.
Código PHP:
String Nombre=null;

public 
void setNombre(String nombre){
   
this.nombre=nombre;

En este caso la variable y el método parecen llamarse igual pero no es así, por regla si quieres tener un método set y get para un atributo debe comenzar con minúscula por eso cuando el compilador encuentra que estamos usando el atributo Nombre en el <html:form> marca que no existe método set o get, en todo caso lo mas correcto seria llamar el método así.
Código PHP:
String nombre=null;

public 
void setNombre(String nombre){
   
this.nombre=nombre;

Una vez que se ha entendido esto es mucho más fácil evitar errores de este tipo. La clase Form puede o no tener los métodos validate y reset, estos métodos son sobre escríbibles y en ellos se puede establecer condiciones para que los datos lleguen de forma optima al ActionServlet, si el lector observa en este ejemplo de clase Form el método validate solamente comprueba de que el código postal no sea nulo o menor de 1 y el método reset establece a nulo la variable postalCode.

Los ActionErrors y ActionMessages son instrucciones que a final de cuentas se toman como mensajes que pueden ser visualizados en las paginas JSP esto mas adelante se verá un poco mas a profundidad, estos mensajes puede ser manipulados por el usuario o descritos en un archivo ApplicationResources.properties, este archivo no solo se ocupa para esto, pero eso también se verá mas adelante.

Esta clase se debe crear dentro del paquete com.lino.prueba.form
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 15:50   #68 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: clase Action?
Respuesta:

Esta clase extiende de Action o en el caso de un dispatch DispatchAction, pero ¿Por qué un DispatchAction y no un Action? Cuando en una aplicación se necesita ejecutar un solo metodo para el flujo de información se puede usar un Action tradicional y editar su método perform, pero que ocurre cuando con un mismo formulario se desea realizar diferentes procesos, pues lo óptimo es crear diferentes métodos y que dependiendo el caso se utilice un método o el otro.

En este caso se utiliza un DispatchAction a pesar de que solo se use un método, por que lo que se pretende es que el usuario se familiarice con el uso del DispatchAction.

Código PHP:
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*; 
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.*;
import com.lino.prueba.form.*;
import com.lino.prueba.bo.*;
import com.lino.prueba.dto.*;

public class 
DireccionAction extends DispatchAction{
   public 
ActionForward doConsulta(ActionMapping mappingActionForm form
                                         
HttpServletRequest requestHttpServletResponse response
                                         
throws IOExceptionServletException{
       
     
String target="results";
     
String postalcode="";
   
     
DireccionForm direccionForm=(DireccionForm)form;
     
     
ActionForward fwd null;
     
ActionErrors errors = new ActionErrors();
     
ActionMessages messages = new ActionMessages();
     
DireccionBO direccionBO = new DireccionBO();
     
     try{
            
postalcodedireccionForm.getPostalCode();
            
DireccionDTO direccionDTO=
                                        
direccionBO.getDireccion(postalcode);
            
direccionForm.setDireccion(direccionDTO);
            
fwd=mapping.findForward(target);
       } 
     }catch(
Exception e){
          
target="Error"
       
fwd=errorMessage(mapping,fwd,messages,request,target,"exception",
                                         
"error.exception.exception1");
     }  
     return 
fwd;
   } 
El paquete import org.apache.struts.action.*; contiene las clases ActionForm, ActionMapping, ActionForward, ActionErrors, ActionMessages, ActionMessage que se utilizan en esta clase.

En el método doConsulta se realiza todo el proceso, este método es del tipo ActionForward, lo que significa que después de realizar el proceso dirigirá el flujo de la aplicación a otro sitio, iniciando declaramos dos variables que son postalcode y target, postalcode guardara el código portal y target nos dirigirá a algún sitio si es correcto el proceso a “result” o si es incorrecto a “Error” y en caso de una validación incorrecta nos regresara el JSP principal con la palabra “main”.

Se hace un Cast del form que recibe el método doConsulta sobre el ActionForm direccionForm.
Código PHP:
DireccionForm direccionForm = (DireccionForm)form
Esto con la finalidad de obtener los datos que se almacenaron en el form.
Código PHP:
ActionForward fwd null;
ActionErrors errors = new ActionErrors();
ActionMessages messages = new ActionMessages();
DireccionBO direccionBO = new DireccionBO(); 
Se crea el ActionForward que dirigirá el flujo de la información, un ActionErrors junto con un ActionMessages para controlar mensajes de error o alerta y una instancia a la clase DireccionBO que es la clase del manejo de la lógica (business Object) de la que se habló anteriormente.
Código PHP:
     try{
            
postalcodedireccionForm.getPostalCode();
            
DireccionDTO direccionDTO=
                                        
direccionBO.getDireccion(postalcode);
            
direccionForm.setDireccion(direccionDTO);
            
fwd=mapping.findForward(target);
       } 
     } 
Dentro de un try se pregunta si el código postal recibido es valido, de no ser así se genera el error correspondiente a ese suceso, para ellos se hace una llamada al método errorMessage, de los cuales los parámetros que cambiarán constantemente son NameMsg que en este caso lleva el nombre de “postalcode2” y msg que en este caso lleva “error.postalcode.invalid”, de esto se hablara mas adelante.

Si el código postal es correcto se genera un objeto de tipo DireccionDTO llamado direccionDTO, este objeto guarda una serie de datos que serán almacenados en el objeto direccion del ActionForm direccionForm para después desplegarlos en pantalla. Después de este proceso se genera un fwd=mapping.findForward(target); esta instrucción busca el valor de la variable target dentro del apartado <action-mapping><forward> dentro del struts-config.xml, para determinar a donde debe irse. Estas y otras cosas mas las expondré en la configuración de la aplicación.
Código PHP:
}catch(Exception e){
    
target="Error"
    
fwd=errorMessage(mapping,fwd,messages,request,target,"exception",
                                         
"error.exception.exception1");
}  
return 
fwd
En caso de una excepción, se manda a llamar el método errorMessage que devuelve un forward a la pagina de error. Por ultimo retorna el control al JSP que se deba visualizar.
Código PHP:
public ActionForward errorMessage(ActionMapping mapping,ActionForward fwd,
                                                              
ActionMessages messages,HttpServletRequest       
                                                              request
,String targetString nameMsgString msg){
      
ActionMessage message;
      
message = new ActionMessage(msg);
         
messages.add(nameMsg,message);
         
saveMessages(request,messages);
         
fwd=mapping.findForward(target);
         return 
fwd;
   }

Este método recibe el nombre del mensaje de error y el mensaje de error, con ello construye el error y lo almacena en el request de la aplicación.

Cuando se crea una aplicación Web, automáticamente se crea el directorio de resources, dentro de este se crea un archivo llamado ApplocationResources.properties en el cual se puede poner un contenido parecido a esto.
Código PHP:
# Optional header and footer for <errors/> tag.
#errors.header=<ul>
#errors.footer=</ul>
error.postalcode.required=Codigo Postal No esta
error
.postalcode.invalid=Codigo Postal Invalido
error
.exception.exception1=No se pudo obtener el requerimiento 
Como el lector puede apreciar del lado izquierdo del = esta el nombre del mensaje o de la constante y del lado derecho su valor. Cuando por ejemplo se ejecuta la instrucción

El metodo errorMessage busca el valor error.exception.exception1 y obtiene el valor No se pudo obtener el requerimiento.
Lino-kun está desconectado   Responder Citando
Antiguo 14-may-2008, 15:59   #69 (permalink)
Lino-kun ha deshabilitado el karma
 
Avatar de Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 120
Enviar un mensaje por MSN a Lino-kun
Re: FAQ's de Java

Tema: NET y MVC
Pregunta: configurando Struts?
Respuesta:

Con los paquetes creados se configura el struts-config.xml de esta forma.
Código PHP:
<struts-config>
    <!-- 
Data Sources -->
    <
data-sources>
    </
data-sources>

     <!-- 
Form Beans -->
    <
form-beans>
      <
form-bean name="DireccionForm"   type="com.lino.prueba.form.DireccionForm">
     </
form-bean>
    </
form-beans>

    <!-- Global 
Exceptions -->
        <global-
exceptions>
        </global-
exceptions>

    <!-- Global 
Forwards -->
        <global-
forwards>
      <
forward name="Error" path="/Error.jsp"></forward>
        </global-
forwards>

    <!-- 
Action Mappings -->
        <
action-mappings>
      <
action path="/consulta" type="com.lino.prueba.action.DireccionAction" name="DireccionForm" scope="request" validate="true" input="/index.jsp">
        <
forward name="main" path="/index.jsp"></forward>
        <
forward name="results" path="/resultados.jsp"></forward>
      </
action>
     &