Ver Mensaje Individual
  #68 (permalink)  
Antiguo 14/05/2008, 15:50
Avatar de Lino-kun
Lino-kun
 
Fecha de Ingreso: mayo-2008
Ubicación: Cuernavaca Morelos Mexico
Mensajes: 126
Antigüedad: 16 años, 7 meses
Puntos: 2
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.