lunes, 30 de septiembre de 2013

Diferencias entre HttpServletResponse.sendRedirect y RequestDispatcher.forward


En nuestros proyectos tenemos la necesidad que debido a ciertas circunstancias debemos redireccionar al usuario de nuestro sitio web a una página diferente, por ejemplo cuando un usuario no registrado ingresa a la página index.html debemos redireccionarlo a la página login.html.
Para entender mejor los mecanismos a utilizar revisemos brevemente y de una manera superficial el funcionamiento del protocolo HTTP. Un cliente hace una petición a un servidor web solicitando un recurso por ejemplo una página web esta petición es un mensaje que contiene un header y un body, en el header se envia información como la versión del protocolo la url del recurso solicitado, etc. El servidor web entiende este mensaje busca el recurso y retorna un mensaje de respuesta, este mensaje contiene igualmente un header y un body, en el body se encuentra el contenido del recurso solicitado para el ejemplo contiene el html de la página solicitada, y en el header contiene entre otras cosas un código de resultado de la petición, si todo fue exitoso este código es el 200, el browser entiende este código y muestra la página con el html recibido.

El servidor web también puede devolver códigos de error(>500) así como códigos indicando que el recurso fue movido temporalmente hacia otra URL, cuando esto pasa el mensaje de respuesta tiene como código de respuesta el número 302 y en el body la url del nuevo recurso, así pues el browser entiende el número 302 y navega (redirecciona - redirect) a la url recibida. A este mecanismo se lo conoce como un redirect en el cliente, ya que es el browser del cliente el que realiza el redireccionamiento. En el siguiente enlace pueden revisar la Lista de códigos del protocolo HTTP.
El hacer un redirect en en el cliente nos permite tener actualizada la url del browser, pero debemos realizar 2 peticiones hacia el servidor web. En JEE podemos implementar un redirect para el cliente utilizando el método sendRedirect de la clase HttpServletResponse. A continuación se muestra el código de ejemplo de como realizar un redirect.

@WebServlet(urlPatterns = { "/RedirectServlet" }, 
 initParams = { @WebInitParam(name = "GoogleUrl", 
 value = "http://www.google.com.ec") })
public class RedirectServlet extends HttpServlet {

 private static final long serialVersionUID = 7384755119447773498L;

 @Override
 protected void doGet(HttpServletRequest request,
 HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html");
  response.getWriter().print("Escribiendo en el Html");
  String redirectUrl = getServletConfig()
    .getInitParameter("GoogleUrl");
  // Todo lo escrito anteriormente en el response 
  //se pierde al hacer// redirect
  response.sendRedirect(redirectUrl);
 }
}

También podemos realizar un redirect en el servidor es decir redireccionar la ejecución de un servlet o jsp hacia otro servlet o jsp, para ello debemos utilizar la clase RequestDispatcher. La ventaja principal es que el servlet o jsp al cual es redireccionado recibe el mismo request de la petición original, este mecanismo es muy utilizado para implementar un modelo MVC en el cual se solicita una url que es un servlet el servlet modifica el modelo e inserta valores en los atributos del request y hace un forward hacia un jsp que representa la vista. La principal ventaja del redirect en el servidor es que se realiza una sola petición la desventaja es que al realizarse la redirección en el servidor el cliente no es notificado y por lo tanto el browser permanece con la url original.
A continuación se muestra un ejemplo utilizando el RequestDispatcher.
@WebServlet("/DispatchServlet")
public class DispatchServlet extends HttpServlet {

 private static final long serialVersionUID = -3130067528647522202L;

 @Override
 protected void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {
  response.setContentType(
                         getServletContext().getMimeType(".html"));
  response.getWriter().print("Escribiendo en el Html");
  request.setAttribute("UserName", "César Loachamín");
  //Al utilizar el dispatcher del request la url 
                //debe ser relativa. Si se utiliza el dispatcher del
                //ServletContext la url debe ser absoluta
  RequestDispatcher dispatcher = request.
                                     getRequestDispatcher("Redirect.jsp");
  //Se pierde todo el response anterior, si no se desea ese 
                //comportamiento se puede usar la función include en lugar 
                //de forward
  dispatcher.forward(request, response);  
 } 
}

Cabe recalcar que al hacer un redirect se pierde todo el contenido del Response que hayamos modificado, además toca tener en cuenta de no hacer un flush al response antes de hacer un redirect pues ello lanazaría una excepción.

El proyecto en Maven  con los ejemplos esta disponible para su descarga en el siguiente link.
Downloadredirect-example.tar.gz

Para ejecutar, descomprimir el archivo. Dentro de la carpeta redirect-example ejecutar el siguiente comando mvn clean install tomcat7:run e ingresar a la url http://localhost:8080/redirect-example
También pueden deployar el war que genera en cualquier Application Server o contendor web como tomcat.

miércoles, 1 de mayo de 2013

Creación de una aplicación empresarial (EAR) con Eclipse


En el siguiente video se muestra como crear una aplicación empresarial sencilla que contendrá un modulo EJB y un modulo web con JSF 2.0. para ello se utiliza eclipse Juno y Glassfish.

Creación de un EAR con un EJB y una página JSF 2.0

En el siguiente enlace se pueden descargar el código fuente:
Proyecto

lunes, 24 de septiembre de 2012

Instalación y configuración de Glassfish con eclipse

Instalación de Glassfish

Primero debemos descargarnos el servidor de aplicaciones Glassfish de su sitio web. Debemos seleccionar la versión que deseamos descargarnos seleccionando el enlace Download de la lista de versiones disponibles, una vez seleccionado el link se nos muestra una nueva pantalla donde debemos seleccionar la versión de glassfish por sistema operativo, idioma, o seleccionar un archivo Zip, para el objetivo de esta guía se seleccionara la última opción a la fecha de la presente guía el archivo seleccionado es glassfish-3.1.2.2.zip. Si nos descargamos otra versión tenemos que tener en cuenta el path donde se instalara glassfish.

Prerrequisitos de instalación.

Debemos tener instalado el jdk de preferencia su última versión para esta guía será el jdk1.7.0_07.

Instalación.

La instalación de glassfish si seleccionamos el archivo Zip consiste en únicamente en descomprimir glassfish en el path que deseamos, si descargamos otro tipo de instalación como un exe debemos ejecutarlo e ingresar el path requerido donde se instalara glassfish. Para esta guía el path escogido es el siguiente: D:\Instaladores\Java

Configuración de glassfish desde eclipse

La versión que voy a utilizar es eclipse Juno for Java EE Developers, una vez abierto y seleccionado el workspace en eclipse, seleccionamos la perspectiva JEE.

Captura1

Damos clic derecho en la vista de Servers y seleccionamos la opción New –> Server

Agregar un nuevo Servidor

En la pantalla de Nuevo Servidor, seleccionamos el link Download additional server adapters que se encuentra al lado derecho. Se abrirá una nueva ventana Install New Extension, esperamos que cargue la lista de servidores disponibles y seleccionamos el ítem Oracle GlassFish Server Tools.

Selección del servidor glassfish

Para la instalación presionamos el botón Next, en la siguiente pantalla aceptamos la licencia y presionamos el botón Finish para terminar el proceso de instalación, con ello lo que hemos realizado es descargar una extensión para eclipse reconozca a glassfish como servidor. Esperamos que termine el proceso de descarga e instalación.

Descarga de la extensión de glassfish 

Una vez descargado e instalado tenemos que reiniciar eclipse y volver a seleccionar la vista Server dar clic derecho New –> Server, pero esta ves se nos muestra una lista con las versiones soportadas para glassfish seleccionamos la versión Glassfish 3.1.2.

Selección de la versión de glassfish

Podemos ingresar el hostname (Nombre de dominio) del servidor y podemos darle un nombre, caso contrario dejamos los valores por defecto. Presionamos el botón Next ahora debemos configurar el runtime, glassfish requiere que tengamos configurado el jdk y no solamente el jre para ello seleccionamos el link Installed JRE preferences.

Agregar jdk a eclipse

Seleccionamos el botón Add, se nos presenta la ventana de Add JRE seleccionamos el ítem Standar VM y presionamos el botón Next, en la ventana siguiente debemos ingresar el path del jdk instalado en nuestra maquina en mi caso C:\Program Files\Java\jdk1.7.0_07, el path se puede ingresado en el campo de texto de la opción JRE home, o presionar el botón Directory y navegar hasta la carpeta que deseamos seleccionar.

Configuración del path del jdk

Una vez ingresado el valor para JRE Home se lista el contenido de los jar que contiene nuestro jdk y presionamos el botón Finish y seleccionamos el check del jdk que hemos ingresado  y presionamos Ok.

Captura8

A continuación el pantalla de New Server para la opción JRE seleccionamos del combo el jdk agregado en el paso anterior, y para la opción Application Server Directory debemos ingresar el path donde esta instalado nuestro glasssfish en mi caso D:/Instaladores/Java/glassfish3/glassfish o podemos navegar al path a través del botón Browse, cabe notar que se requiere seleccionar la carpeta con nombre glassfish dentro de la carpeta glassfishX (donde X es la versión) caso contrario no nos aceptara como un path valido.

Configuración de JDK y Path de Glassfish

Presionamos el botón Next y se nos presenta la pantalla de configuración para el dominio, usuario y si guardamos la sessión cuando volvemos a desplegar una aplicación. Para el domain directory dejamos el domain1 por defecto, el Admin name es admin por defecto, y la contraseña podemos ingresar adminadmin, y presionamos el botón Finalizar ya que la siguiente ventana nos permite agregar aplicaciones de nuestro workspace para ser desplegadas en glassfish.

Configuración Glassfish

Con ello hemos configurado nuestro glassfish para ser utilizado en eclipse para probar que la configuración es correcta debemos iniciar el servidor seleccionándolo de la vista y dando clic derecho en Servers  GlassFish 3.1.2 at localhost –> Start. Una vez iniciado el servidor se agrega el texto [Started, Synchronized] al lado del nombre del servidor.

Servidor Glassfish iniciado

Si deseamos cambiar alguna configuración sobre el servidor glassfish damos doble clic o clic derecho –> Open, y se nos mostrara una pantalla de edición de las configuraciones donde podemos cambiar los puertos el tiempo de espera para arranque, entre otros aspectos.

Edición de configuraciones de Glassfish

jueves, 6 de septiembre de 2012

SyntaxhigHlighter v3 with v2 theme

Test Hightlight

         /**
          * Syntax highlighter
          */
         function testFunction() {
          alert('test');
          if(counter <= 10) {
           return;
          }
         }