JavaDabbaDoo.org -Tu comunidad Java parlante Implementar el patrón MVC
Inicio | Cursos infosintesis.net liberados | Java EE | Registrar a un usuario en un sitio Web (MVC)
Registrar a un usuario en un sitio Web (MVC)
Paso 6: Operativa

Controlador/Modelo - Rellenar las propiedades de un JavaBean con introspección

Ahora que ya tenemos el esqueleto de la utilidad TraspasoPropiedades, vamos a invocarla desde nuestro controlador FormularioFachadaControladorServlet de la siguiente forma

package paqservlets;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import java.io.IOException;

import paqbeans.ValidadorDatosBean;

public class FormularioFachadaControladorServlet extends HttpServlet {

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   ValidadorDatosBean validadorDatosBean = new ValidadorDatosBean();
   request.setAttribute("validadorDatosBean", validadorDatosBean);

   TraspasoPropiedades.traspasarPropiedad(validadorDatosBean, request);

   RequestDispatcher requestDispatcher = null;
   requestDispatcher = request.getRequestDispatcher("index.jsp");
   requestDispatcher.forward(request, response);
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   processRequest(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
   processRequest(request, response);
  }

  public String getServletInfo() {
   return "Short description";
  }
}

Debido a que el método traspasarPropiedad(...) lanza una excepción de tipo TraspasoPropiedadesException, la vamos a capturar haciendo clic con el ratón sobre la bombilla que está en el margen izquierdo del código y seleccionamos Surround Statement with try-cath

NetBeans 6 - Realizar try-catch - Surround Statement with try-catch

Este es el código generado por el asistente de NetBeans

package paqservlets;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import java.io.IOException;

import java.util.logging.Level;
import java.util.logging.Logger;

import paqbeans.ValidadorDatosBean;

public class FormularioFachadaControladorServlet extends HttpServlet {

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   ValidadorDatosBean validadorDatosBean = new ValidadorDatosBean();
   request.setAttribute("validadorDatosBean", validadorDatosBean);

   try {   
    
TraspasoPropiedades.traspasarPropiedad(validadorDatosBean, request);
   } catch (TraspasoPropiedadesException ex) {
     Logger.getLogger(FormularioFachadaControladorServlet.class.getName()).log(Level.SEVERE,                       null, ex);
   }

   RequestDispatcher requestDispatcher = null;
   requestDispatcher = request.getRequestDispatcher("index.jsp");
   requestDispatcher.forward(request, response);
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   processRequest(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
   processRequest(request, response);
  }

  public String getServletInfo() {
   return "Short description";
  }
}

Antes de seguir adelante podemos ejecutar la aplicación y ver que la página Web se muestra correctamente

Navegador - Ejecutar la aplicación Web desde NetBeans

Haciendo uso de la introspección en el método traspasarPropiedadIntrospeccion(....), vamos a rellenar las propiedades del JavaBean ValidadorDatosBean con los datos que han llegado al servidor a través de un mensaje HTTP.

Nota: Para repasar los fundamentos de la introspección podemos seguir el siguiente vínvulo Examinar objetos con una venda en los ojos y para ver un ejemplo de invocación de métodos a través de la introspección podemos seguir este otro vínculo Invocación de los métodos de un Objeto de tipo Class.

package paqutilidades;

public class TraspasoPropiedades {

 private static void traspasarPropiedadIntrospeccion(Object javaBean,
                              HttpServletRequest request)
                              throws Exception {

  Map<String, Method> mapaMethod = new HashMap<String, Method>();
  
Class c = javaBean.getClass();
  Method[] matrizMethod = c.
getMethods();
  for (Method method : matrizMethod) {
   mapaMethod.put(method.getName(), method);
  }

  Enumeration<String> enumeration = request.getParameterNames();
  while (enumeration.hasMoreElements()) {
   String strNombrePropiedad = enumeration.
nextElement();
   String strValorPropiedad = request.
getParameter(strNombrePropiedad);
   System.out.println("INTROSPECCION - strNombrePropiedad: " + strNombrePropiedad +
                      "\tstrValorPropiedad: " + strValorPropiedad);

   String[] matrizValorPropiedad = request.getParameterValues(strNombrePropiedad);

   // nombrePropiedad: apellido
   strNombrePropiedad = strNombrePropiedad.substring(0, 1).toUpperCase() +
   strNombrePropiedad.substring(1);
   
// nombrePropiedad: Apellido

   // strMetodoAccesoPropiedad: setApellido
   String strMetodoAccesoPropiedad = "set" + strNombrePropiedad;
   System.out.println("INTROSPECCION - strMetodoAccesoPropiedad: " +                       strMetodoAccesoPropiedad);
   if (mapaMethod.get(strMetodoAccesoPropiedad) != null) {
    Method method = mapaMethod.get(strMetodoAccesoPropiedad);
    Class[] paramTypes = method.
getParameterTypes();

    System.out.println("INTROSPECCION - strMetodoAccesoPropiedad -->                        paramTypes[0].getName(): " +
                       strMetodoAccesoPropiedad + " ---> " + paramTypes[0].getName());

    if ((method.getReturnType() == void.class) && (paramTypes.length == 1)) {
     if (paramTypes[0]
.getName().equals("java.lang.String")) {
      method.invoke(javaBean, strValorPropiedad);
     } else {
      
List<String> listaValorPropiedad = Arrays.asList(matrizValorPropiedad);
      method.invoke(javaBean,
(Object) listaValorPropiedad);
     }
    }
   }
  } 

 }

 public static void traspasarPropiedad(Object javaBean, HttpServletRequest request)
                    throws TraspasoPropiedadesException {
  try {
   traspasarPropiedadIntrospeccion(javaBean, request);
  } catch (Exception e) {
   throw new TraspasoPropiedadesException(e);
  }
 }
}

Si introducimos nuestro nombre en el campo de texto nombre y seguidamente hacemos clic sobre el botón Enviar, podemos ver que la nueva página nos retorna nuestro nombre para que no lo tengamos que volver a escribir. Por otro lado también se ha podido demostrar que a través de la utilidad TraspasoPropiedades la propiedad o variable de instancia nombre del JavaBean ValidadorDatosBean se ha rellenado correctamente.

Navegador - Ejecutar la aplicación Web desde NetBeans | Nombre: Igansi
Página anterior
Ignasi Pérez Valls
fundador-director Infosintesis Solutions Group
asesor-formador independiente
ignasiperez[ARROBA]javadabbadoo[PUNTO]org
Febrero 2009
JavaDabbaDoo.org
Tu comunidad Java parlante. Cursos abiertos, tutoriales y mucho mucho más ...