Paso 1 de 2 – Preparando las capas: Modelo y Controlador (Arquitectura MVC ANDROID J2EE)

Seguimos con el apasionante mundo de Android y la arquitectura MVC, en esta ocasión el profesor Alberto Hernández Akkari colaborador de este blog y de nuestro blog amigo FSV Electrónica e Informática, ha realizado una interesante entrada, donde nos enseña a preparar las capas, Modelo y Controlador del patrón MVC, para desarrollar una aplicación de 3 capas con un cliente Android.

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.

Más información: http://es.wikipedia.org/wiki/JSON

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:

http://code.google.com/p/google-gson/

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.

Más información: http://www.configurarequipos.com/doc1107.html

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.Más información: http://www.webestilo.com/mysql/intro.phtml
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.Más información: http://es.wikipedia.org/wiki/GlassFish
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:

http://www.todoprogramas.com/programa/wampserver

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:

http://developer.android.com/sdk/index.html

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+F” y nos aparece la siguiente ventana:

Ventana de respuesta:

Descargar proyecto: Pincha aquí.

Autor: Alberto Hernández Akkari

Etiquetas:, , , , , , , , , , ,

Acerca de José María Megino

Ingeniero Informático por la Universidad de Zaragoza y Máster Universitario en Formación de Profesorado de ESO y Bachillerato, FP y Enseñanza de Idiomas, Especialidad de Tecnología e Informática por la Universidad Internacional de La Rioja, Actualmente, Profesor Titular y Coordinador Docente en SEAS, Estudios Superiores Abiertos. (Grupo San Valero)

Una respuesta a “Paso 1 de 2 – Preparando las capas: Modelo y Controlador (Arquitectura MVC ANDROID J2EE)”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: