Arquitectura MVC ANDROID (1. Preparando la capa Modelo y Controlador J2EE Servlets)

martes, 18 de diciembre de 2012

Paso 1 de 2 - Preparando la capa Modelo y Controlador (Arquitectura MVC ANDROID J2EE) 



Tecnologías: Android, JSON (o XML), J2EE (o PHP), DAO (TO: Transfer Object) y MySQL.


El archivo de descarga del proyecto se encuentra al final del artículo.


Descripción


Preparamos la capa Modelo y Controlador del patrón MVC para desarrollar una aplicación de 3 capas con un cliente Android que incluya una pantalla de Login.
La consulta de datos en el lado del Servidor se hace a través del uso del patrón FrontController, DAO y conexión a SGBD MySQL.


Arquitectura




Glosario de términos


JSON
JSON, acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos.
JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.

GSON
Gson (también conocido como Google Gson) es una biblioteca de código abierto para el lenguaje de programación Java que permite la serialización y deserialización entre objetos Java y su representación en notación JSON.

Más información y descarga:
Android
Android en un Sistema Operativo además de una plataforma de Software basada en el núcleo de Linux.
Diseñada en un principio para dispositivos móviles, Android permite controlar dispositivos por medio de bibliotecas desarrolladlas o adaptados por Google mediante el lenguaje de programación Java.
Android es una plataforma de código abierto.

MySql
MySQL es un gestor de base de datos sencillo de usar y increíblemente rápido. También es uno de los motores de base de datos más usados en Internet, la principal razón de esto es que es gratis para aplicaciones no comerciales.

GlassFish
GlassFish es un servidor de aplicaciones de software libre desarrollado por Sun Microsystems, compañía adquirida por Oracle Corporation, que implementa las tecnologías definidas en la plataforma Java EE y permite ejecutar aplicaciones que siguen esta especificación.

WampServer 2
WampServer es un paquete para el desarrollo de sitios web dinámicos para Windows que combina las últimas versiones del servidor Apache, de la base de datos MySQL y del lenguaje de programación PHP.

Más información y descarga:
NetBeans
NetBeans es un entorno de desarrollo integrado libre, hecho principalmente para el lenguaje de programación Java. Existe además un número importante de módulos para extenderlo.

NetBeans IDE es un producto libre y gratuito sin restricciones de uso.

Más información y descarga: http://netbeans.org/
Eclipse IDE for Java EE Developers
Entorno de desarrollo para implementar aplicaciones que se ejecutan en dispositivos Android.

Más información y descarga: http://www.eclipse.org/downloads/
Android SDK
Android SDK es el kit de desarrollo necesario para programar e implementar todo tipo de aplicaciones para Android, el sistema operativo para teléfonos móviles propuesto por Google.
Este paquete o kit de desarrollo incluye las APIs y herramientas necesarias para desarrollar aplicaciones utilizando JAVA como lenguaje de programación.

Más información y descarga: 


Requisitos de Software


Eclipse IDE for Java EE Developers (ADT Eclipse)
SDK Android
WampServer 2
NetBeans IDE 7.2
Glassfish 3.x
Librerías GSON y MySqlConnector para Java

Base de datos


Esquema de tablas
Creamos una tabla USUARIO con dos usuarios registrados para poder validar desde la pantalla de “Login” desde Android.

-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 18-12-2012 a las 15:27:51
-- Versión del servidor: 5.5.16
-- Versión de PHP: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de datos: `sanvalero`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `usuario`
--

CREATE TABLE IF NOT EXISTS `usuario` (
  `ID_USUARIO` int(4) NOT NULL AUTO_INCREMENT,
  `USER` varchar(50) COLLATE utf8mb4_spanish2_ci NOT NULL,
  `PASS` varchar(50) COLLATE utf8mb4_spanish2_ci NOT NULL,
  PRIMARY KEY (`ID_USUARIO`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish2_ci AUTO_INCREMENT=3 ;

--
-- Volcado de datos para la tabla `usuario`
--

INSERT INTO `usuario` (`ID_USUARIO`, `USER`, `PASS`) VALUES
(1, 'PEPE', 'PEPE'),
(2, 'LUIS', 'LUIS');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Servidor J2EE – Capa Controlador


Crear Servlet que gestione las peticiones desde el cliente Android

Preparamos un “Servlet” que reciba 3 parámetros – ACTION=LOGINUSER=LUIS Y PASS=LUIS -, valide que el usuario se encuentra en la base de datos y nos devuelva la respuesta en JSON.

Package controller
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // Recoger parámetros
            String action = request.getParameter("ACTION");
            if(action.equals("LOGIN")){
                // Pedir datos a la base de datos
                out.println(new LoginAction().execute(request, response));
            }
        } catch (Exception e) {
            // Imprimir en JSON
            out.println("[{\"error\": " + e.getMessage() + " \"}]");
        } finally {           
            out.close();
        }
    }

Package action
Clase Action

public interface Action {
    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception;   
}
Clase LoginAction

public class LoginAction implements Action{
    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception{
                String resp = "";
                String user = request.getParameter("USER");
                String pass = request.getParameter("PASS");
                UsuarioDAO usuarioDAO = new UsuarioDAO();
                Usuario usuario = new Usuario(user,pass);
                usuarioDAO.find(usuario);
                if(usuario.getIdUsuario()>0){
                   //Pruebas
                    //ArrayList<Usuario> listUsers = usuarioDAO.findAll(usuario);
                // Imprimir en JSON
                               resp = usuario.toJson();
                            //resp = Usuario.toArrayJSon(listUsers);
                }else{
                    resp = "[{\"error\":\"Usuario no existe. \"}]";
                }
                return resp;
    }
}

Package beans
public class Usuario {
    private int idUsuario;
    private String user;
    private String pass;

    public Usuario() {
    }
    public Usuario(String user, String pass) {
        this.user = user;
        this.pass = pass;
    }
    public int getIdUsuario() {
        return idUsuario;
    }
    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }
    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
   
    @Override
    public String toString() {
        return "Usuario{" + "idUsuario=" + idUsuario + ", user=" + user + ", pass=" + pass + '}';
    }
    public String toJson() {
        Gson gson = new Gson();
        return "[" + gson.toJson(this) + "]";               
    }
    public static String toArrayJSon(ArrayList<Usuario> listUser){
        Gson gson = new Gson();
        String arrayJson = "";
        int numUser = listUser.size();
        int contUser = 0 ;
        for (Iterator<Usuario> it = listUser.iterator(); it.hasNext();) {
            Usuario usuario = it.next();
            arrayJson = arrayJson + gson.toJson(usuario);
            contUser++;
            arrayJson+= (numUser!=contUser) ? "," : "";
        }
        return "[" + arrayJson + "]";
    }
}

Package dao
public interface DAO <E,I>{
    public I create(E entidad) throws Exception;
    public I update(E entidad) throws Exception;
    public I remove(I id) throws Exception;
    public void find(E entidad) throws Exception;
    public List<E> findAll(E entidad) throws Exception;
}

Package servicios
public class UsuarioDAO implements DAO<Usuario,Integer>{
    public Integer create(Usuario entidad) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    public Integer update(Usuario entidad) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    public Integer remove(Integer id) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    public void find(Usuario usuario) throws Exception {
        Conexion.connect();
        ResultSet rs = Conexion.executeQuery(
                "SELECT * FROM usuario WHERE user = '"+
                usuario.getUser()+"' "
                + "AND pass = '"+usuario.getPass()+"'"
        );
        if(rs.next()){
            usuario.setIdUsuario(rs.getInt(1));
            usuario.setUser(rs.getString(2));
            usuario.setPass(rs.getString(3));
        }
        Conexion.disconnect();
    }
    public ArrayList<Usuario> findAll(Usuario usuario) throws Exception {
        ArrayList<Usuario> listUsers = new ArrayList<Usuario>();
        Conexion.connect();
        ResultSet rs = Conexion.executeQuery(
                "SELECT * FROM usuario"
        );
        // Falta parametrizar la consulta
        while(rs.next()){
            usuario = new Usuario();
            usuario.setIdUsuario(rs.getInt(1));
            usuario.setUser(rs.getString(2));
            usuario.setPass(rs.getString(3));
            listUsers.add(usuario);
        }
        Conexion.disconnect();
        return listUsers;
    }
}

Package tools
public class Conexion {
    private static Connection con;
    private static Statement st;
    private static ResultSet rs;
    public static synchronized void connect(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sanvalero", "root", "");
                st = con.createStatement();
        }catch (Exception ex) {
            System.out.println("Error al conectar a la base de datos. Vuelva en 5 minutos. ");
        }
    }
    public static synchronized void disconnect(){
        try {
            if(rs!=null){ rs.close();}
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println("Error al cerrar la conexión. ");
        }
    }
    public static synchronized int execute(String sql){
        int respuesta = 0;
        try {
            respuesta = st.executeUpdate(sql);
        } catch (Exception ex) {
            System.out.println("Error al consultar los datos. "+ex.getMessage());
        }
        return respuesta;
    }
    public static synchronized ResultSet executeQuery(String sql){
        try {
            rs = st.executeQuery(sql);
        } catch (Exception ex) {
            System.out.println("Error al consultar los datos. "+ex.getMessage());
        }
        return rs;
   }
}

Librerías
1.      Recuerda añadir a tu proyecto las dos librerías que te indico a continuación:

Gson: Mapear objetos a notación JSON. 
Enlace: http://code.google.com/p/google-gson/downloads/list

Driver MySql: Conectar a base de datos MySql. 
Enlace: http://www.mysql.com/downloads/connector/j/


Realicemos una prueba……


URL:
localhost:8080/AndroidGroupon/Controller?ACTION=LOGIN&USER=LUIS&PASS=LUIS

Nos situamos en la clase Controller, pulsamos “CTRL+SHIFT+F5” y nos aparece la siguiente ventana:



Ventana de respuesta:




Descargar proyecto en Dropbox: Pincha aquí.

By Alberto Hernández Akkari







4 comentarios:

mario lope díez 19 de diciembre de 2012, 14:25  

¿ vas a poner la segunda parte para ver como quedaria en android ? gracias alberto¡

Anónimo,  27 de diciembre de 2012, 10:43  

pongan la segunda parte porfavor....

Alberto 31 de diciembre de 2012, 4:12  

Hola Alberto, la segunda parte estaría fenómeno!.
Gracias.

Alberto 9 de enero de 2013, 10:17  

Gracias Alberto, ha funcionado el proyecto a la perfección. Lo único es que no sé a qué te refieres cuando comentas lo siguiente, lo de Ctrl+Shift+F (es buscar, no asignar URI).

URL:
localhost:8080/AndroidGroupon/Controller?ACTION=LOGIN&USER=LUIS&PASS=LUIS

Nos situamos en la clase Controller, pulsamos “CTRL+SHIFT+F” y nos aparece la siguiente ventana:

Publicar un comentario

fsvelectronicainformatica agradece tu comentario.

  © Blogger template On The Road by Ourblogtemplates.com 2009

Back to TOP