sábado, 1 de septiembre de 2012

Introduccion JavaEE


Hoy vamos a ver una rebanada de lo que es JavaEE, esta API es la que nos ayuda a desarrollar aplicaciones basadas en la web, en mi opinion es codigo escrito en Java que se encuentra publicado en un servidor.

Para realizar el objetivo de esta entrada es necesario contar con los siguientes:
  1. Un contenedor de servlets(Tomcat o Jetty) o un servidor de aplicaciones(GlassFish, JBoss, WebLogic, ...). La diferencia entre uno y otro, es que el un servidor es mucho mas robusto, estan diseñados para soportar la especifiacion de JavaEE y el contenedor unicamente nos sirve para correr JSPs y Servlets, de hecho los servidores tienen un contenedor dentro de ellos.(Para el ejemplo esta entrada es suficiente un contenedor, en mi caso elegi Tomcat por facilidad)
  2. La base de datos del ejemplo pasado con al menos un registro
  3. Un archivo .jar con las clases de los ejemplos anteriores
  4. Conocimientos basicos en HTML

Primero configuremos nuestro Eclipse para que trabaje directamente con Tomcat, hacemos esto en File > New > Other... en la ventana que se nos muestra vamos a lo opcion Server


En la siguiente ventana seleccionamos nuestra version de Tomcat que hayamos descargado y damos click en "Next"

Ahora seleccionamos la carpeta donde se encuentra Tomcat:


En seguida damos click en "Finish", con esto ya esta configurado el contenedor. Ahora vamos a crear el proyecto, para variar las cosas vamos a File > New > Other...

Buscamos la opcion Web, y ahi seleccionamos Dynamic Web Project


En la siguiente ventana escribimos el nombre del proyecto y clickeamos en "Finish"


Ahora debemos agregar a nuestro Class path el archivo jar que contiene las clases que creamos anteriormente.

Una vez hecho esto vamos a crear nuestro primer JSP(que de JSP no tiene nada =)), vamos a la carpeta que dice WebContent damos click derecho y seleccionamos New > JSP File, de ahi el procedimiento es muy similar como cuando creamos una clase


Un JSP es una pagina que contiene HTML y Java, el HTML nos sirve para darle forma y estructura a nuestra pagina, Java por otra parte nos ayuda a generar el contenido dinamico de nuestra aplicacion. El codigo java se escribe entre los simbolos <% %> en medio de ellos es valido escribir el codigo Java que necesitemos.

Para nuestro primer JSP vamos a tener el siguiente codigo:

  <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Bienvenido</title>
  </head>
  <body>
   <form action="actionServlet" method="post">
    <h1>Tu nombre</h1>
    <input type = "text" name="user" />
    <input type="submit" value="Click Me">
   </form>
  </body>
  </html>

En el atributo action del formulario escribimos el nombre del servlet que va a atender nuestra peticion. Siendo asi creemos el servlet, para hacerlo vamos a la parte de Java Resources con ayuda del poderoso click derecho creamos un nuevo servlet.

Los servlets son las clases que nos van a ayudar a atender todas las peticiones web que se realicen a nuestra aplicacion, hay ciertas cosas a tener en cuenta acerca de estas clases:

  • doGet(). es el metodo que se encarga de escuchar las peticiones que se hagan atraves de un GET al servidor, esto es cuando pasamos los valores que queremos procesar atraves de la URL:
    url?param1=val1&param2=val2&...
  • doPost(). atiende todas las peticiones que se hacen atreves del POST al servidor, estas permiten un mayor envio de informacion y seguridad.
  • @WebServlet(). esta anotacion nos va a ayudar a definir el nombre con el que se va a publicar nuestro servlet.

El codigo que vamos a utilizar es el siguiente:
package com.unapagina.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import sociedad.Persona;

import com.unapagina.negocio.Controller;


@WebServlet("/actionServlet")
public class ActionServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

 public ActionServlet() {
  super();
 }

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

 
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Persona usuario;
  HttpSession sesion;
  sesion = request.getSession();
  String usr = request.getParameter("user").trim();
  if((usuario = Login.autenticar(usr)) != null){
   sesion.setAttribute("user", usuario);
   getServletContext().getRequestDispatcher("/hola.jsp").forward(request, response);
  }else
   getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);
 }

}

El objeto HttpSession nos ayuda a manejar la sesion de nuestro usuario en la aplicacion, podemos registrar objetos en la sesion y posteriormente manipularlos en otra parte de la aplicacion. Utilizando el metodo getSession() del objeto HttpServletRequest obtenemos la sesion asociada a el si esta existe, de lo contrario se crea una nueva.

En este ejemplo haremos login en nuestra aplicacion validando unicamente el nombre de usuario en nuestra base de datos, para ello utilizaremos el metodo autenticar(), el cual se auxilia del metodo PersonaPersist.busqEspecifica()[es necesario modificar levemente este metodo para que se ajuste a la nueva estructura de la BD] si el usuario es valido lo registraremos como un objeto de la sesion con el metodo setAttribute() que recibe como parametros el nombre del objeto y el objeto que sera almacenado en sesion. Posteriormente navegamos a la pagina hola.jsp usamos el metodo getServletContext().getRequestDispatcher().forward() debido a que se trata de un recurso que esta dentro de nuestra misma aplicacion, de tal manera que tengamos que regresar el control al navegador y esta haga un nuevo POST al servidor preguntado por hola.jsp, optimizando los tiempos de respuesta.

Les dejo el codigo del metodo autenticar()

public static Persona autenticar(String user){
  Persona usr = null;

  Connection con = ConexionDB.conectar("127.0.0.1/sociedad?useServerPrepStmts=true", "root", "");

  try {
   usr = PersonaPersist.busqEspecifica(con, user);
  } catch (SQLException e) {
   e.printStackTrace();
  }

  return usr;

}

El ultimo paso sera crear nuestra pagina hola.jsp en la cual vamos a mostrarle al usuario su informacion personal que ya tenemos almacenada, vamos a utilizar las etiquetas de JSP <%= %> al utilizar las etiquetas de esta forma el JSP escribira en el HTML el valor que le pasemos entre las mismas. Para importar la clase Persona utilizamos las directivas de pagina las cuales se definen entre los tags <%@ page %>, es aqui donde definimos los pauqetes que vamos a utilizar, el juego de caracteres, etc. Siendo asi nuestro codigo debe lucir como el siguiente:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "sociedad.Persona" %>
<% Persona usuario = (Persona) session.getAttribute("user"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hola</title>
</head>
<body>
 <h1>Bienvenido <%= usuario.getNombre() %></h1>
 <table>
  <tr>
   <td>Peso:</td>
   <td><%= usuario.getPeso() %> kg</td>
  </tr>
  <tr>
   <td>Edad:</td>
   <td><%= usuario.getEdad() %> a&ntilde;os</td>
  </tr>
  <tr>
   <td>Sexo:</td>
   <td><%= usuario.isMujer() ? "Mujer" : "Hombre" %></td>
  </tr>
  <tr>
   <td>ID:</td>
   <td><%= usuario.getIdPersona() %></td>
  </tr>
 </table>
</body>
</html>


Como vemos lo primero que hacemos es obtener el objeto que almacenamos en la sesion con el metodo session.getAttribute() al cual le hacemos un cast a nuestra clase, esto debido a que en la sesion se guardan objetos del tipo Object, finalmente unicamente imprimimos su informacion personal utilizando los metodos get de la clase persona.

Al final obtendremos algo como esto:



Recuerden que aun falta escribir la pagina error.jsp en caso de que no sea un usuario valido, ya que si no la escribimos nos mandara error cuando lo estemos probando.

Saludos!!!