Java Server Pages JSP
Otra forma de hacer servlets
Las JSP
• Son páginas HTML a las que se le inserta código
que produce servlets
• Se usan cuando la parte estática de la página que se
debe generar es relativamente importante (la parte
que no cambia)
• Al cargarse una página JSP esta se compila, se
genera el servlet y se ejecuta
• Por esto, la primera invocación a una JSP demora
más que las siguientes
Contenido de una JSP
• Una JSP, aparte de código HTML puede
contener 3 tipos de instrucciones :
– Elementos de scripting: son los elementos que
definen el comportamiento dinámico del servlet,
es decir su código
– directivas: afectan la estructura general del servlet
que resulta de la JSP (import, include)
– acciones: permiten redirigir el request a otra
instancia JSP, servlet o página HTML
Elementos de scripting
• 1. Expresiones de la forma <%= expresión %>, son
evaluadas e insertadas en el output del servlet
• 2. Scriptlets son instrucciones Java de la forma <%
code %>, que son insertadas en el método _jspService
que se llama cuando se contacta a la página jsp (el
equivalente al doGet)
• 3. Declaraciones de la forma <%! code %>, que son
insertadas en el cuerpo de la clase del servlet, fuera de
todo método, definiendo así variables de instancia
Variables predefinidas
• Para simplificar las expresiones, existen
variables predefinidas que se pueden usar. Las
más importantes son:
– request, el HttpServletRequest
– response, el HttpServletResponse
– session, el HttpSession asociada al request
– out, el PrintWriter usado para mandar output al
cliente
Un Ejemplo (Ejemplo1.jsp)
<HTML>
<HEAD>
<TITLE>JSP Expressions</TITLE>
</HEAD>
<BODY>
<H2>JSP Expressions</H2>
<UL>
<LI>Current time: <%= new java.util.Date() %>
<LI>Your hostname: <%= request.getRemoteHost() %>
<LI>Your session ID: <%= session.getId() %>
<LI>The <CODE>testParam</CODE> form parameter:
<%= request.getParameter("testParam") %>
</UL>
</BODY>
</HTML>
Explicaciones
• El servidor crea un servlet, lo compila y llama al
método _jspService que contiene todas las
sentencias escritas entre <% y %>
• El texto HTML es mandado al cliente por vía
out.print(....)
• Las expresiones se evalúan y se insertan en el texto
que se manda, por lo cual la expresión
<LI>Current time: <%= new
java.util.Date() %>
equivaldría en un servlet a hacer
out.println(“<LI>Current time: “+ new
Scriptlets
• Si se quiere hacer algo más complicado que insertar una
simple expresión en el output del servlet se pueden incluir
sentencias JAVA en scriptlets que tienen la siguiente
estructura:
<% String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData); %>
• Los Scriptlets tienene acceso a a las mismas variables
definidas automáticamente a las que tienen acceso las
expresiones
• En particular, esto también se pudo haber logrado con
El string mandado con GET fue: <%= request.getQueryString() %>
pero hay cosas que no se pueden hacer con expresiones:
<% response.setContentType("text/plain"); %>
Algo más serio (Ejemplo2.jsp)
<HTML> <HEAD> <TITLE>Color Testing</TITLE> </HEAD>
<% String bgColor = request.getParameter("bgColor");
boolean hasExplicitColor;
if (bgColor != null) {
hasExplicitColor = true;
} else {
hasExplicitColor = false;
bgColor = "WHITE";
} %>
<BODY BGCOLOR="<%= bgColor %>">
<H2 ALIGN="CENTER">Color Testing</H2>
<% if (hasExplicitColor)
out.println("You supplied color " +bgColor );
else
out.println("Using background color WHITE..");
%>
</BODY> </HTML>
Usando Scriptlets con código
HTML
Para entender esto hay que tener claro que el contenido de un
scriptlet se incluye exactamente como está escrito al método
_jspService y las sentencias HTML se traducen como un
out.println(...contenido de sentencia HTML...) en el mismo
orden en que aparecen en la página jsp
Scriptlets para hacer partes del
archivo JSP condicional
Lo siguiente
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
se traduce en el servlet que se genera en lo siguiente
if (Math.random() < 0.5) {
out.write("n");
out.write("Have a <B>nice</B> day!n");
} else {
out.write("n");
out.write("Have a <B>lousy</B> day! n");
}
¡¡¡¡ATENCION!!!!: los paréntesis sin
absolutamente necesarios
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
Debido a que el servidor genera lo siguiente
if (Math.random() < 0.5) {
out.write("n");
out.write("Have a <B>nice</B> day!n");
} else {
out.write("n");
out.write("Have a <B>lousy</B> day! n");
}
Scriptlets para repetir partes del del codigo HTML
<TABLE BORDER=2>
<% for ( int i = 0; i < n; i++ ) {%>
<TR> <TD>Number</TD> <TD>
<%= i+1 %>
</TD> </TR>
<% } %>
</TABLE>
Se traduce en ...
out.println(“<TABLE BORDE=2>”);
for ( int i = 0; i < 10; i++ ) {
out.write(" n");
out.write(" <TR> <TD>Number</TD> <TD>n");
out.print( i+1 );
out.write(“ n");
out.write("</TD> </TR> n");
}
out.write(" n");
out.write("</TABLE> n");
Declaraciones
• No generan output, se usan para declarar variables
que más tarde serán usadas en expresiones o
scriptlets
• Una declaración tiene la siguiente forma:
<%! Java
Java Code %>
• Son variables que se declaran globales para todo el
servlet
Un ejemplo (Ejemplo3.jsp) que cuenta cuantas veces
ha sido accesada una página desde que se cargó:
<%! private int accessCount = 0; %>
Accesses to page since server reboot:
<%= ++accessCount %>
Se pueden declarar Métodos
<%! int factorial(int x) {
int aux = 1;
for (int i = 2; i<=x; i++)
aux = aux * i;
return aux;
}
%>
El método se puede usar después
<% int n = (int)(10*Math.random());%>
El factorial de <%=n%> es <%= factorial(n) %>
Directivas
• Afectan la estructura general del servlet
generado
• Ejemplo de directiva page-import
<%@ page import =“java.util.*" %>
El atributo import
• Permite importar clases que no se incluyen automáticamente
• Por ejemplo, se pueden importar las usuales para java (java.util.*)
• Para las clases definidas por el programador, estas deben estar en
un lugar “visible”. Este lugar depende del servidor
• En tomcat es el mismo directorio en donde están los servlets
(Ejemplo4.jsp con ServletUtilities.java y LongLivedCookie.java)
<%@ page import=”java.util.*" %>
<%@ page import="package.class1,...,
package.classN" %>
Usando JDBC en JSP
<%@page import="com.mysql.jdbc.Driver"%>
<%@page import="java.sql.*"%>
<% Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost/biblioteca";
Connection con =
DriverManager.getConnection(url,"root","root");
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from personas");
while(rs.next()) {
%>
<br> RUT : <%=rs.getInt(“rut")%>
<%
}
%>
Incluyendo otros archivos
• Es posible hacerlo al momento en que se compila la página con la directiva
<%@ include file=”nombre del archivo" %>
• Esto implica que se incluirá el archivo referenciado como parte del actual
antes de compilarlo
• El problema es que si el archivo referenciado cambia, no cambiará en la
página que se muestra (a menos que se reinicie el servidor) (ver contacto.jsp
y pprincipal.jsp)
• Se puede hacer que cada vez que se referencie la página incluida se vuelva a
recargar el contenido con la siguiente directiva <jsp:include
page=”nombre del archivo" flush="true" />
(ver noticias.jsp e item1.html, item2.html,
item3.html)
Controlando el tipo de salida
• Se hace a través de la directiva
<%@ page contetType=”text/plain" %>
• Se puede usar para determinar cualquier tipo de salida que no sea text/html
• Puede ir en cualquier parte del archivo, a pesar de que en un servlet esto
debe ir antes de mandar cualquier cosa. Esto es porque primero la página se
compila, traduce y luego se ejecuta en el orden adecuado de las directivas
<HTML>
<BODY>
<H2>The contentType Attribute</H2>
<%@ page contentType="text/plain" %>
Esto debe verse como texto plano <B>no</B> como HTML.
</BODY>
</HTML>
Generando salida para excel
• Se hace a través de la misma directiva pero cambiando el tipo de salida que se
generará (ejemplo5.jsp)
<%@ page contentType="application/vnd.ms-excel" %>
<%- entre columnas poner tabs, no espacios.-%>
1997 1998 1999 2000 2001
12.3 13.4 14.5 15.6 16.7
• Tambien se puede lograr lo mismo escribiendo código HTML para generar una
tabla pero poner en la directiva que el contentType es ms-excel (ejemplo6.jsp)
<TABLE BORDER=1>
<TR><TH></TH><TH>Apples<TH>Oranges
<TR><TH>First Quarter<TD>2307<TD>4706
<TR><TH>Second Quarter<TD>2982<TD>5104
<TR><TH>Third Quarter<TD>3011<TD>5220
<TR><TH>Fourth Quarter<TD>3055<TD>5287
</TABLE>
Directiva Forward
• Se usa para redirigir el requerimiento a otra página
• Cuando se ejecuta se va a esa página sin que se tenga que hacer nada en
el browser
• Es equivalente a hacer
response.sendRedirect(“servlet2”);
Ejemplo:
<% percent = Math.random();
if (percent < 0.5) {
%>
<jsp:forward page="/forward/one.jsp"/>
<% } else { %>
<jsp:forward page="two.html"/>
<% } %>
errorPage & isErrorPage
• Es posible invocar una determinada página cuando en otra
sucede un error (se lanza una Exception )
• Para ello hay que poner en la página que puede generar el ellror
la directiva
<%@ page errorPage=”una_URL_relativa" %>
• En la página que debe recibir el control (una_URL_relativa)
debe ponerse lo siguiente
<%@ page isErrorPage="true" %>
(ver generaError.jsp y muestraError.jsp)
Java Beans
• Usar Beans es una buena manera de complementar JSP cuando
se requiere de estructuras de datos (clases) que hagan cosas más
complejas, y separar el código de programación de estas clases
de la JSP
• Un Bean es una clase con las siguientes características:
– Tiene un constructor que no tiene parámetros
– No tiene variables públicas
– Para cierto subconjunto de variables privadas llamadas propiedades, si la
variable es de tipo tipo1 y se llama variable1entonces existe un método
programado tipo1 getVariable1() que retorna el valor actual de la propiedad y
otro void setVariable1(tipo1 x) que modifica el valor de la variable con el que
está dado como parámetro
Usando Beans en JSP
• Para poder usar Beans con JSP en Tomcat estos deben ir en el mismo directorio
que los servlets
• Creación
– <jsp:useBean id=’bean1' class=’Nombre_Clase' scope=“validez”/>
• Es lo mismo que haber hecho en un programa Java
– Nombre_Clase bean1 = new Nombre_Clase();
• Obtención de valores
– <jsp:getProperty name=”bean1" property=”variable1" />
– <%= book1.getVariable1() %>
• Modificación valores
– <jsp:setProperty name=”bean1” property=”variable1” value=”valor1" />
– <% book1.setVariable1(”valor1"); %>

Java Server Page JSP, otra forma de hacer

  • 1.
    Java Server PagesJSP Otra forma de hacer servlets
  • 2.
    Las JSP • Sonpáginas HTML a las que se le inserta código que produce servlets • Se usan cuando la parte estática de la página que se debe generar es relativamente importante (la parte que no cambia) • Al cargarse una página JSP esta se compila, se genera el servlet y se ejecuta • Por esto, la primera invocación a una JSP demora más que las siguientes
  • 3.
    Contenido de unaJSP • Una JSP, aparte de código HTML puede contener 3 tipos de instrucciones : – Elementos de scripting: son los elementos que definen el comportamiento dinámico del servlet, es decir su código – directivas: afectan la estructura general del servlet que resulta de la JSP (import, include) – acciones: permiten redirigir el request a otra instancia JSP, servlet o página HTML
  • 4.
    Elementos de scripting •1. Expresiones de la forma <%= expresión %>, son evaluadas e insertadas en el output del servlet • 2. Scriptlets son instrucciones Java de la forma <% code %>, que son insertadas en el método _jspService que se llama cuando se contacta a la página jsp (el equivalente al doGet) • 3. Declaraciones de la forma <%! code %>, que son insertadas en el cuerpo de la clase del servlet, fuera de todo método, definiendo así variables de instancia
  • 5.
    Variables predefinidas • Parasimplificar las expresiones, existen variables predefinidas que se pueden usar. Las más importantes son: – request, el HttpServletRequest – response, el HttpServletResponse – session, el HttpSession asociada al request – out, el PrintWriter usado para mandar output al cliente
  • 6.
    Un Ejemplo (Ejemplo1.jsp) <HTML> <HEAD> <TITLE>JSPExpressions</TITLE> </HEAD> <BODY> <H2>JSP Expressions</H2> <UL> <LI>Current time: <%= new java.util.Date() %> <LI>Your hostname: <%= request.getRemoteHost() %> <LI>Your session ID: <%= session.getId() %> <LI>The <CODE>testParam</CODE> form parameter: <%= request.getParameter("testParam") %> </UL> </BODY> </HTML>
  • 7.
    Explicaciones • El servidorcrea un servlet, lo compila y llama al método _jspService que contiene todas las sentencias escritas entre <% y %> • El texto HTML es mandado al cliente por vía out.print(....) • Las expresiones se evalúan y se insertan en el texto que se manda, por lo cual la expresión <LI>Current time: <%= new java.util.Date() %> equivaldría en un servlet a hacer out.println(“<LI>Current time: “+ new
  • 8.
    Scriptlets • Si sequiere hacer algo más complicado que insertar una simple expresión en el output del servlet se pueden incluir sentencias JAVA en scriptlets que tienen la siguiente estructura: <% String queryData = request.getQueryString(); out.println("Attached GET data: " + queryData); %> • Los Scriptlets tienene acceso a a las mismas variables definidas automáticamente a las que tienen acceso las expresiones • En particular, esto también se pudo haber logrado con El string mandado con GET fue: <%= request.getQueryString() %> pero hay cosas que no se pueden hacer con expresiones: <% response.setContentType("text/plain"); %>
  • 9.
    Algo más serio(Ejemplo2.jsp) <HTML> <HEAD> <TITLE>Color Testing</TITLE> </HEAD> <% String bgColor = request.getParameter("bgColor"); boolean hasExplicitColor; if (bgColor != null) { hasExplicitColor = true; } else { hasExplicitColor = false; bgColor = "WHITE"; } %> <BODY BGCOLOR="<%= bgColor %>"> <H2 ALIGN="CENTER">Color Testing</H2> <% if (hasExplicitColor) out.println("You supplied color " +bgColor ); else out.println("Using background color WHITE.."); %> </BODY> </HTML>
  • 10.
    Usando Scriptlets concódigo HTML Para entender esto hay que tener claro que el contenido de un scriptlet se incluye exactamente como está escrito al método _jspService y las sentencias HTML se traducen como un out.println(...contenido de sentencia HTML...) en el mismo orden en que aparecen en la página jsp
  • 11.
    Scriptlets para hacerpartes del archivo JSP condicional Lo siguiente <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have a <B>lousy</B> day! <% } %> se traduce en el servlet que se genera en lo siguiente if (Math.random() < 0.5) { out.write("n"); out.write("Have a <B>nice</B> day!n"); } else { out.write("n"); out.write("Have a <B>lousy</B> day! n"); }
  • 12.
    ¡¡¡¡ATENCION!!!!: los paréntesissin absolutamente necesarios <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have a <B>lousy</B> day! <% } %> Debido a que el servidor genera lo siguiente if (Math.random() < 0.5) { out.write("n"); out.write("Have a <B>nice</B> day!n"); } else { out.write("n"); out.write("Have a <B>lousy</B> day! n"); }
  • 13.
    Scriptlets para repetirpartes del del codigo HTML <TABLE BORDER=2> <% for ( int i = 0; i < n; i++ ) {%> <TR> <TD>Number</TD> <TD> <%= i+1 %> </TD> </TR> <% } %> </TABLE> Se traduce en ... out.println(“<TABLE BORDE=2>”); for ( int i = 0; i < 10; i++ ) { out.write(" n"); out.write(" <TR> <TD>Number</TD> <TD>n"); out.print( i+1 ); out.write(“ n"); out.write("</TD> </TR> n"); } out.write(" n"); out.write("</TABLE> n");
  • 14.
    Declaraciones • No generanoutput, se usan para declarar variables que más tarde serán usadas en expresiones o scriptlets • Una declaración tiene la siguiente forma: <%! Java Java Code %> • Son variables que se declaran globales para todo el servlet Un ejemplo (Ejemplo3.jsp) que cuenta cuantas veces ha sido accesada una página desde que se cargó: <%! private int accessCount = 0; %> Accesses to page since server reboot: <%= ++accessCount %>
  • 15.
    Se pueden declararMétodos <%! int factorial(int x) { int aux = 1; for (int i = 2; i<=x; i++) aux = aux * i; return aux; } %> El método se puede usar después <% int n = (int)(10*Math.random());%> El factorial de <%=n%> es <%= factorial(n) %>
  • 16.
    Directivas • Afectan laestructura general del servlet generado • Ejemplo de directiva page-import <%@ page import =“java.util.*" %>
  • 17.
    El atributo import •Permite importar clases que no se incluyen automáticamente • Por ejemplo, se pueden importar las usuales para java (java.util.*) • Para las clases definidas por el programador, estas deben estar en un lugar “visible”. Este lugar depende del servidor • En tomcat es el mismo directorio en donde están los servlets (Ejemplo4.jsp con ServletUtilities.java y LongLivedCookie.java) <%@ page import=”java.util.*" %> <%@ page import="package.class1,..., package.classN" %>
  • 18.
    Usando JDBC enJSP <%@page import="com.mysql.jdbc.Driver"%> <%@page import="java.sql.*"%> <% Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://localhost/biblioteca"; Connection con = DriverManager.getConnection(url,"root","root"); Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery("select * from personas"); while(rs.next()) { %> <br> RUT : <%=rs.getInt(“rut")%> <% } %>
  • 19.
    Incluyendo otros archivos •Es posible hacerlo al momento en que se compila la página con la directiva <%@ include file=”nombre del archivo" %> • Esto implica que se incluirá el archivo referenciado como parte del actual antes de compilarlo • El problema es que si el archivo referenciado cambia, no cambiará en la página que se muestra (a menos que se reinicie el servidor) (ver contacto.jsp y pprincipal.jsp) • Se puede hacer que cada vez que se referencie la página incluida se vuelva a recargar el contenido con la siguiente directiva <jsp:include page=”nombre del archivo" flush="true" /> (ver noticias.jsp e item1.html, item2.html, item3.html)
  • 20.
    Controlando el tipode salida • Se hace a través de la directiva <%@ page contetType=”text/plain" %> • Se puede usar para determinar cualquier tipo de salida que no sea text/html • Puede ir en cualquier parte del archivo, a pesar de que en un servlet esto debe ir antes de mandar cualquier cosa. Esto es porque primero la página se compila, traduce y luego se ejecuta en el orden adecuado de las directivas <HTML> <BODY> <H2>The contentType Attribute</H2> <%@ page contentType="text/plain" %> Esto debe verse como texto plano <B>no</B> como HTML. </BODY> </HTML>
  • 21.
    Generando salida paraexcel • Se hace a través de la misma directiva pero cambiando el tipo de salida que se generará (ejemplo5.jsp) <%@ page contentType="application/vnd.ms-excel" %> <%- entre columnas poner tabs, no espacios.-%> 1997 1998 1999 2000 2001 12.3 13.4 14.5 15.6 16.7 • Tambien se puede lograr lo mismo escribiendo código HTML para generar una tabla pero poner en la directiva que el contentType es ms-excel (ejemplo6.jsp) <TABLE BORDER=1> <TR><TH></TH><TH>Apples<TH>Oranges <TR><TH>First Quarter<TD>2307<TD>4706 <TR><TH>Second Quarter<TD>2982<TD>5104 <TR><TH>Third Quarter<TD>3011<TD>5220 <TR><TH>Fourth Quarter<TD>3055<TD>5287 </TABLE>
  • 22.
    Directiva Forward • Seusa para redirigir el requerimiento a otra página • Cuando se ejecuta se va a esa página sin que se tenga que hacer nada en el browser • Es equivalente a hacer response.sendRedirect(“servlet2”); Ejemplo: <% percent = Math.random(); if (percent < 0.5) { %> <jsp:forward page="/forward/one.jsp"/> <% } else { %> <jsp:forward page="two.html"/> <% } %>
  • 23.
    errorPage & isErrorPage •Es posible invocar una determinada página cuando en otra sucede un error (se lanza una Exception ) • Para ello hay que poner en la página que puede generar el ellror la directiva <%@ page errorPage=”una_URL_relativa" %> • En la página que debe recibir el control (una_URL_relativa) debe ponerse lo siguiente <%@ page isErrorPage="true" %> (ver generaError.jsp y muestraError.jsp)
  • 24.
    Java Beans • UsarBeans es una buena manera de complementar JSP cuando se requiere de estructuras de datos (clases) que hagan cosas más complejas, y separar el código de programación de estas clases de la JSP • Un Bean es una clase con las siguientes características: – Tiene un constructor que no tiene parámetros – No tiene variables públicas – Para cierto subconjunto de variables privadas llamadas propiedades, si la variable es de tipo tipo1 y se llama variable1entonces existe un método programado tipo1 getVariable1() que retorna el valor actual de la propiedad y otro void setVariable1(tipo1 x) que modifica el valor de la variable con el que está dado como parámetro
  • 25.
    Usando Beans enJSP • Para poder usar Beans con JSP en Tomcat estos deben ir en el mismo directorio que los servlets • Creación – <jsp:useBean id=’bean1' class=’Nombre_Clase' scope=“validez”/> • Es lo mismo que haber hecho en un programa Java – Nombre_Clase bean1 = new Nombre_Clase(); • Obtención de valores – <jsp:getProperty name=”bean1" property=”variable1" /> – <%= book1.getVariable1() %> • Modificación valores – <jsp:setProperty name=”bean1” property=”variable1” value=”valor1" /> – <% book1.setVariable1(”valor1"); %>