Site hosted by Angelfire.com: Build your free website today!

 EL CONCEPTO DE JSP. 
 

• JSP es una especificación de Sun Microsystems

• Sirve para crear y gestionar páginas web dinámicas

• Permite mezclar en una página código HTML para generarla parte estática, con contenido dinámico generado a partir de marcas especiales <% .... %>

• El contenido dinámico se obtiene, en esencia, gracias a la posibilidad de incrustar dentro de la página código Java de diferentes formas

• Su objetivo final es separar la interfaz (presentación visual) de la implementación (lógica de ejecución)
 

• La página JSP se convierte en un servlet

• La conversión la realiza en la máquina servidora el motor o contenedor JSP, la primera vez que se solicita la página JSP

• Este servlet generado procesa cualquier petición para esa página JSP

• Si se modifica el código de la página JSP, entonces se regenera y recompila automáticamente el servlet y se recarga la próxima vez que sea solicitada
 

Así pues, la funcionalidad de una aplicación puede ser itegrada de tres modos:

• Como código Java dentro de las páginas JSP

    - No separa la interfaz de la implementación

• Con el uso de JavaBeans llamados desde las páginas JSP

    - Separa la interfaz de la implementación en gran medida

• Con el uso de etiquetas personalizadas

    - Evitan la necesidad de inclusión de cualquier código Java en la página JSP

-->Un buen diseño pasa por evitar en la medida de lo posible lo primero



CICLO DE VIDA DE UN SERVLET GENERADO PARA JSP 
 

Cuando se llama por primera vez al fichero JSP, se genera un servlet con las siguientes operaciones

• jspInit()

    - Inicializa el servlet generado

    - Sólo se llama en la primera petición

• jspService(petición,respuesta)

    - Maneja las peticiones. Se invoca en cada petición, incluso en la primera

• jspDestroy()

    - Invocada por el motor para eliminar el servlet

    Duplicar una JSP

    Echando un vistado a una JSP básica, todavía necesitamos algunas características básicas para poder facilitar nuestra migración.

    En el ejemplo de abajo, seleccionamos el tipo de contenido, ejemplarizamos un JavaBean (un objeto Date), incluimos un par de ficheros JSP "fragmentados", y utilizamos la librería JSTL fmt para poder mostrar una cabecera y un mensaje de un ResourceBundle. La última línea llama al método getTime del Date (esto se podría hacer más fácilmente llamando a la etiqueta JSTL c:out para obtener el mismo dato):

     

    <%@ page contentType="text/html; charset=UTF-8" %>
    <fmt:setBundle basename="com.lateralnz.messages" var="sysm" />
    <jsp:useBean id="test" scope="session" class="java.util.Date" />
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <%@ include file="htmlhead.jsf" %>
    
    <body>
    <%@ include file="header.jsf" %>
    
    <h1><fmt:message key="app.welcome_title" bundle="${sysm}" /></h1>
    
    <p><fmt:message key="app.welcome_text" bundle="${sysm}" /></p>
    
    <p><%= test.getTime() %></p>
    
    </div>
    </body>
    </html>
    

    Velocity proporciona directivas para publicar algo de esta JSP, pero no toda. En una instalación típica de Velocity, un servlet situaría los objetos Date y ResourceBundle en el contexto para que pudieran ser llamados desde dentro de la plantilla. Luego el paso dos, es evitar esta necesidad (ignora por el momento que hacer esto equivale a dar un paso atrás en el objetivo MVC mencionao antes). He crado mi propia directiva llamada #usebean (puedes ver su código fuente en UseBeanDirective.java), a la que se le pasa un nombre, el nombre de la clase a utilizar, y su ámbito. Entonces UseBeanDirective crea el JavaBean y lo pone en el contexto. Si el ámbito es "application", almacena el bean en un HashMap estático para su uso posterior; si el ámbito es "session" se almacena en la sesión del usuario.

    También se necesita un método en VMServlet para seleccionar el tipo de contenido de la plantilla, de una forma similar a como se hace en una página JSP. Mi elección actual es almacenar los tipos de contenidos registrados por su requestURI, y utilizar el método getData de la plantilla de Velocity para buscar una variable ($contentType) en la página:

     

    private final String determineContentType(Node node) {
      for (int i = 0; i < node.jjtGetNumChildren(); i++) {
        StringBuffer sb = new StringBuffer();
        Node n = node.jjtGetChild(i);
        
        if (n instanceof org.apache.velocity.runtime.parser.node.ASTSetDirective) {
          Token t = findTokenWithPrefix(n.getFirstToken(), "$");
          if (t == null || !t.toString().equalsIgnoreCase("$contentType")) {
            continue;
          }
          else {
            t = findTokenWithPrefix(t, "\"");
            String ct = StringUtils.remove(t.toString(), "\"");
            return ct;
          }
        }
      }
    
      return "text/html";
    }
    
    private final Token findTokenWithPrefix(Token t,String prefix) {
        
      if (t == null) {
        return null;
      }
      else if (t.toString().startsWith(prefix)) {
        return t;
      }
      else {
        return findTokenWithPrefix(t.next, prefix);
      }
    }
    

    Admitámoslo, esto es un atajo, pero hace el trabajo. Por lo tanto, he añadido lo siguiente a processRequest:

     

    String contentType;
    if (contentTypes.containsKey(requestURI)) {
      contentType = (String)contentTypes.get(requestURI);
    }
    else {
      contentType = determineContentType((Node)tmp.getData());
      contentTypes.put(requestURI, contentType);
    }