Tabla de Contenidos

JSPs

Tipos de etiquetas

<%-- comentario --%>
<% if (i == 3) { %> Buenos días <% } %>
<%= clock.getDayOfMonth() %> 

Fíjate que no lleva el ';' al final de la línea de código.

<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
<jsp:useBean id=="clock" class=="jspCalendar" />

Sintaxis:
<jsp:accion nombre=“xxx” propiedad=“xxx” />
<jsp:accion nombre=“xxx” propiedad=“xxx” valor=“xxx” />

<%@ page language=="java" imports=="java.util.*" %>
<%@ include file=="copyright.html" %> 

Cómo programar con JSP?

response.sendRedirect("WEB-INF/pp.jsp");
request.getRequestDispatcher("WEB-INF/pp.jsp").forward(request, response);

Piensa que esto haría que las url de los elementos cambiasen por lo que las direcciones relativas en los links o css ya no serán válidas, tendrás hacer cambios del estilo: href=“download/app.zip” por href=“/pages/download/app.zip”.

Cómo unir todo?

  1. Usaremos beans para representar los datos
  2. Usaremos los servlets para procesar los datos de entrada.
  3. El servlet almacenará\leerá en la Base de Datos o realizará las acciones que deba.
  4. El servlet almacenará los datos de salida en beans que serán introducidos en el contexto debido mediante el setAttribute.
  5. El servlet eligirá qué JSP cargar mediante el forward del RequestDispatcher.
  6. En el JSP mediante el jsp:getProperty se mostrarán los datos.

La tag de declaraciones

El hecho que haya un tag para las declaraciones tiene su motivo bien fundado, por ejemplo, para definir métodos:

<%! private String holaIndio () {
	return "jau!";
} %>
<%= holaIndio() %>

Piensa que estas declaraciones son estáticas, por lo que si tu declaras una variable y la vas modificando, si se conecta otro usuario se puede topar con que esté modificada. El siguiente código lo demuestra sacando el número de veces que la página ha sido cargada desde que el server se inició:

<%! private int accessCount = 0; %>
Veces que la página se ha cargado:
<%= ++accessCount %>

La tag de directivas

synchronized (this) {
	out.print(i);
}

Variables predefinidas

Existen objetos que se crean automáticamente al hacerse una llamada a un archivo .jsp, estos sustituyen a los elementos accesibles desde los métodos doGet o doPost de un Servlet.

Añadir contenido dinámicamente

Podemos añadir contenido de forma dinámica a nuestro JSP. Una de las ventajas que esto nos dá es que podemos montar plantillas para nuestras páginas y no repetir así cabeceras, menús… Podemos insertar el contenido de una página html, el de un documento de texto plano, la salida de otro jsp o la de un servlet.

Para añadir contenido utilizamos la acción include: <jsp:include page=“pgs/chiguagua.jsp” />.

Podemos pasar parámetros a las páginas que incluimos, para ello usaremos el jsp:param:

<jsp:include page="pgs/StandardHeading.jsp">
  <jsp:param name="bgColor" value="YELLOW" />
</jsp:include>

Para recoger el valor de bgColor dentro del código de StandardHeading.jsp haremos un: request.getParameter(“bgColor”). Si a la página que ha incluido StandardHeading.jsp también se le han pasado parámetros (no tiene por qué ser por código, sino por dirección, algo así: direccion?fgColor=WHITE) estos podrán ser accedidos con el response.getParameter desde StandardHeading.

Para enviar el contenido de otra página (aunque en la dirección seguirá apareciendo la misma que a la que se llamó) utilizaremos jsp:forward:

<jsp:forward page="index.html" />

JavaBeans

Son unos tags que equivalen a código java en las páginas JSP. Su sintaxis es muy sencilla, para crear un objeto haremos <jsp:useBean id=“nombre del objeto” class=“nombre de la clase” />.

Jugaremos con la clase Prueba:

package pck;
public class Prueba {
	String msg = "";
	String name = "";
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}	
}

Uso

Si queremos jugar con las propiedades de los objetos usados en los beans sus clases tendrán que tener métodos getters y setters. Para ello usamos los tags: jsp:setProperty y jsp:getProperty, combinando sus atributos: name (nombre del objeto), property (nombre de la propiedad, sin get ni set y con la primera letra en minusculas) y value (el valor, esta sólo para setProperty).

Imaginemos que la página .jsp que tenemos que llamar para que se ejecute el código es page.jsp. Ahora lo que queremos es asignar los parámetros incluidos en la dirección de la página a las propiedades de nuestro objeto, para ello la sintaxis es la siguiente: <jsp:setProperty name=“nombre objeto” property=“propiedad a asignar” param=“nombre del parámetro”>:

Si por alguna de esas grandes casualidades de la vida, el parámetro pasado se llama igual que la propiedad que queremos asignar sólo tendremos que indicar el atributo property:

Otro atajo lo encontramos cuando los parámetros que nos vienen en la dirección tienen igual nombre que las propiedades del objeto, sólo tendremos que indicar el property como * y todas quedarán asignadas automáticamente.

Otra de las cosas que podemos hacer es anidarlo todo de la forma siguiente:

<jsp:useBean id="obj" class="pck.Prueba">
  <jsp:setProperty name="obj" property="*" />
</jsp:useBean>

Scope

El scope es otro atributo de jsp:useBean y se refiere a donde se guardan (y por tanto donde son accesibles), el contexto de los bean. Se usa con la siguiente sintaxis: <jsp:useBean … scope=“valor” /> Tiene cuatro posibles valores:

Expression Language (EL)

Se basa en escribir expresiones en los JSP de forma: ${expresión}. (Si quisiesemos poner esta sintaxis textualmente haríamos: \${expresión}). Podemos desactivar esta característica usando <%@ page isELEnabled=“false” %> … pero con lo que mola…

Aquí van unos cuantos ejemplos de EL:

request.setAttribute("hola", "buenos días");
request.getRequestDispatcher("pp.jsp").forward(request, response);

En el JSP:

${hola}
<jsp:useBean id="obj" class="pck.Kclass">
	<jsp:setProperty name="obj" property="*"/>
</jsp:useBean>
${obj.msg} <br /> ${obj.name}
${obj.vect[0]}
<td bgcolor="${cliente.dinero < 0 ? 'yellow' : 'red'}">
  ${cliente.dinero}
</td>

Archivos