Section 6: The Java Server Pages (JSP) Tecnology Model
 

6.1 Identify, describe, or write the JSP code for the following elements: (a) template text, (b) scripting elements (comments, directives, declarations, scriptlets, and expressions), (c) standard and custom actions, and (d) expression language elements.

6.1 Template text: Es todo el HTML o XML que ponemos en la pagina JSP. Cuando se traduzca en un servlet, todo esto se traducira en sentencia out.write.

6.2 Scripting elements

Scriplets: Son trozos de codigo java embebidos en el JSP que se traducen en codigo en el metodo jspService() del servlet. Las sentencias deben ser terminadas con ; como siempre en Java. Podemos poner tbn. comentarios Java (// o /* */). sintaxis: <% %>

Declarations: Son trozos de codigo java embebidos fuera de jspService. Podemos declarar variables estaticas o metodos enteros. Incluso podemos sobreescribir los metodos jspInit() y jspDestroy(). Sintaxis: <%! %>

Expressions: Las expresiones se evaluan y se imprime el contenido en la pagina HTML resultante. Las expresiones deben ser expresiones de java validas. No debemos poner ;, ya que el contenido de la evaluacion sera volcado al contenido de out.write(). Se pueden poner expresiones que se evaluen a primitivas. <%= %>

Comments:Podemos poner 2 tipos de comentarios:

a. Comentarios JSP -  estos comentarios no se emiten en la pagina web resultante. <%- -%>

b. Comentarios HTML - <!- -> - Estos comentarios si son enviados al cliente (pero no son mostrados en el browser obviamente)

** Un punto a tener en cuenta cuando buscamos errores en un JSP es que los Scriplets llevan ; después de cada sentecia,  mientras que las expresiones no.

6.2 Write JSP code that uses the directives: (a) 'page' (with attributes 'import', 'session', 'contentType', and 'isELIgnored'), (b) 'include', and (c) 'taglib'.

Las directivas son procesadas en tiempo de compilación (esta es la mayor diferencia con los elementos descriptos en el punto anterior.

(a) page: Sintaxis <%@ page [atributo = "valor"]1o+ %>

   atributo import: con este atributo podemos importar clases/librerias

   EJ: <%@ page import="java.util.List" %> esto es traduce en el servlet como import java.util.List;

** Si queremos importar más de una libreria, separamos las librerias con "," o ponemos varias directivas.

- <%@ page import="java.util.List,java.text.*" %>

- <%@ page import="java.util.List" %><%@ page import="java.text.*" %>

   atributo session: por default, este valor es true. Si lo ponemos en false, evitamos obtener la sesion (optimizando un poco la performance)Ej. <%@ page session="false" %>

** No cometas el error de escribir la constante booleana false, en vez de "false". Los atributos siempre van entre comillas.

    atributo contentType: este atributo nos permite setear el contentType (igual que el método setContentType del ServletResponse.

   atributo isELIgnored: este atributo nos permite setear si el Lenguaje de Expresión esta habilitado o no. Si estamos bajo la versión 2.4, por default es true. Anterior a esta, por default is false. Aún estando en la versión 2.4, podemos querer deshabilitar EL y para ello usamos este atributo.

(b) include: Sintaxis <%@ include file="file" %>

El archivo es incluido en tiempo de compilación, por lo que se su contenido debe resultar en un jsp válido. El "file" puede contener un camino relativo (al jsp que lo incluye) o uno absoluto (desde el context root).

(c) taglib: Sintaxis <%@ taglib prefix="ejemplo" uri="aPath/file" %>

Cada libreria de tags que incluimos debe ser definida mediante esta directiva. Los 2 atributos definen cual va a ser el préfijo que se va a usar para identificar los tags de la libreria incluida y uri para indicar donde se encuentra la libreria (cápitulo 9 contiene una descripción mas completa).

6.3 Write a JSP Document (XML-based document) that uses the correct syntax.

Un documento JSP es un JSP que obedece las reglas de sintaxis de XML. La siguiente tabla aclara como traducir de sintaxis JSP a un documento JSP:

Elementos scriplets Sintaxis JSP Documento JSP
Scriplets <%..%> <jsp:scriplet>...</jsp:scriplet>
Expresiones <%=..%> <jsp:expresion>...</jsp:expresion>
Declaraciones <%!..%> <jsp:declaration>...</jsp:declaration>
Directivas
page <@ page attr="value"%> <jsp:directive.page> attr="value"</jsp:directive.page>
include <@ include file="URL"%> <jsp:directive.include> file="URL" </jsp:directive.include>
taglib <@ taglib prefix="jsp" uri="http://java.sun.com/JSPs" %> xmlns:jsp="value"
Comentarios
comentario JSP <%- -%> <!- -%>
comentario HTML <!- -%> &lt;!- -&gt;

El container tiene 3 maneras de darse cuenta que es un documento JSP. Las 2 primeras solo son válidas para la versión 2.4:

1. La extensión del archivo es .jspx

2. <jsp-config>

          <jsp-property-group>

                 <url-pattern> ... </url-pattern>

                 <is-xml> ... </is-xml>

          </jsp-property-group>

   </jsp-config>

3. Que el elemento root del documento JSP sea <jsp-root>

** Cuando estamos escribiendo código Java dentro de una acción en un documento JSP, debemos tener cuidado de escapar los caracteres no válidos en XML, por ejemplo "<".

** Una página no puede contener sintaxis de JSP clásico y de documentos JSP mezclados.     

6.4 Describe the purpose and event sequence of the JSP page life cycle: (1) JSP page translation, (2) JSP page compilation, (3) load class, (4) create instance, (5) call the jspInit method, (6) call the _jspService method, and (7) call the jspDestroy method.

Los JSPs son creados para simplificar el proceso de desarrollo. La creación de HTML a través de los servlets es muy incomoda para los programadores y directamente inaccesible para los diseñadores. Los JSPs son páginas web especiales, en las cuales se puede embeber pedazos de código Java que producen la parte dinámica. Si bien, en los comienzos se embebia el código Java directamente en el JSP, ahora es mucho más común usar tags (provistos o custom) y de esa forma dejar el JSP lo más limpio posible de código.

(1) JSP page translation: Se refiere a la traducción de la página JSP en una clase java. Con Tomcat, esta clase va a ser una extensión de org.apache.jasper.runtime.HttpJspBase (clase que implementa la interface javax.servlet.jsp.HttpJspPage. Si bien, algunos plugins de Eclipse permiten que se muestre como va a ser la clase de implementación, no se si esto se puede saber con certeza, ya que el container va a ser el encargado de generarlo.

(2) JSP page compilation: La compilación de la clase de implementación creada a partir del JSP, genera una clase (archivo .class) que es un servlet que va a ser usado como los servlets tradicionales.

** Los puntos (1) y (2) pueden ser hechos tán pronto como los JSPs son deployados en el container hasta justo antes de ser requeridos por algun cliente.

(3) Desde este punto en adelante, seguimos el módelo de Servlets. Es decir, cuando se hace un requerimiento el classloader carga la clase en el container inicializando todos los datos estáticos.

(4) Luego se crea una instancia del servlet. Si no se introdujo ninguna entrada en el deployment descriptor, entonces el container va a crear solamenta 1 instancia. Si se introducen entradas en deployment descriptor, se crearán 1 instancia por cada entrada.

(5) Luego se llama al método jspInit() del jsp servlet.

(6) Luego se llama 1 o más veces al jspService(). Se creará un thread por cada uno de los requerimientos.

(7) Cuando ya no se van a registrar más requerimientos, se llama a jspDestroy() para liberar todos los recursos ocupados ordenadamente.

6.5 Given a design goal, write JSP code using the appropriate implicit objects: (a) request, (b) response, (c) out, (d) session, (e) config, (f) application, (g) page, (h) pageContext, and (i) exception.

(a) y (b) request y response son objetos de tipo javax.servlet.http.HttpServletRequest y javax.servlet.http.HttpServletResponse.

(c) out es un objeto de tipo JspWriter. La mayor diferencia con el objeto obtenido a partir de get PrintWriter del response es que éste utiliza un buffer mientras que el otro hace el commit inmediatamente.

(d) session: es el objeto HttpSession disponible por default.

(e) y (g) config y page son 2 objetos que no son muy usados. config es de tipo ServletConfig y sirve para obtener los parametros seteados en el deployment descriptor. page es un objeto que representa la instancia del servlet resultante.

(h) pageContext representa un objeto madre a través del cual se pueden acceder atributos en todas los otros scopes. Ademas, a este objeto se le pueden atachar atributos por lo que define un scope (que es el más limitado de todos). Los métodos para obtener/setear/borrar atributos en otros scopes tienen los mismos nombres, pero incluyen un parámetro nuevo de tipo entero que define el scope. Para no usar números, la clase PageContext tiene definida constantes: PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE Y CONTEXT_SCOPE.

(i) exception es un objeto que puede ser accedido en las páginas de error, osea aquellas páginas que tengan una directiva <%@ page isErrorPage="true" %>.

6.7 Given a specific design goal for including a JSP segment in another page, write the JSP code that uses the most appropriate inclusion mechanism (the include directive or the jsp:include standard action).

La diferencia más importante entre la directiva <@ include file="URL"> y <jsp:include page="URL"/> es que la primera se procesa en tiempo de compilación del JSP, mientras que la segunda se procesa en tiempo de ejecución. Una implicancia de esto que en la acción se pueden usar expresiones para indicar la página a incluir (la página a incluir puede no existir cuando se deployea la aplicación y ser generada dinámicamente).