Extendiendo Java EL

Una de las tecnologías con las que más trabajamos en la capa de presentación es con Java EL (Expression Language) . Es la tecnología que nos permite mostrar información de forma sencilla en la capa de presentación, así como realizar operaciones básicas con ella. Vamos a ver un ejemplo sencillo a través de un Servlet y un JSP para luego extenderlo:


package com.arquitecturajava;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Servlet")
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

 RequestDispatcher despachador= request.getRequestDispatcher("/pagina.jsp");
 int numero=100;
 request.setAttribute("numero", numero);
 despachador.forward(request, response);
}

}

El Servlet tiene una variable que se denomina “numero” y que se la pasa al fichero “pagina.jsp” para que este la imprima. Si echamos un vistazo al fichero JSP veremos que este multiplica por 2 el número utilizando “expresión language”.


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${numero*2}
</body>
</html>

La página nos imprimirá el siguiente resultado por pantalla:

Extendiendo EL

Java EL soporta bastantes capacidades en su core y nos permite realizar operaciones aritméticas y acceder a las variables que se encuentran en los distintos scopes.

 

Sin embargo a veces sus capacidades se quedan cortas y necesitamos extenderlo. Para ello vamos a implementar una nueva función de EL que nos permita por ejemplo calcular un número primo. El primer paso será implementar la función en una clase Java.


package com.arquitecturajava;

public class FuncionEL {

 public static String calcularPrimo(Integer numero) {

 System.out.println(numero);

 for(int i=2;i<numero;i++) {

 if(numero %i==0) {

 return "el numero :" +numero+" no es primo";
 }
 }
 return "el numero:" +numero+" si es primo";

 }
}

Una vez definida la funcionalidad la registramos en un fichero tld a nivel de la carpeta WEB-INF (se podría ubicar en un jar para reutilizarlo).

El contenido del fichero tld es el siguiente que registra la función .


<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2eeimagesweb-jsptaglibrary_2_1.xsd"
 version="2.1">

<description>
 Funcion Numero Primo
 </description>
 <tlib-version>1.0</tlib-version>
 <function>
 <description>Primo</description>
 <name>calcularPrimo</name>
 <function-class>com.arquitecturajava.FuncionEL</function-class>
 <function-signature>
 java.lang.String calcularPrimo (java.lang.Integer)
 </function-signature>
 </function>
</taglib>

Una vez hecho esto estamos extendiendo Java EL para que soporte esta función. Podemos cambiar el contenido de la página por el siguiente :


<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
 <%@ taglib uri="/WEB-INF/tagfuncion.tld" prefix="funciones"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${funciones:calcularPrimo(numero)}
</body>
</html>

Hemos terminado de extender Java EL para que soporte una nueva función:

El resultado será el siguiente:

Hemos terminado de extender el lenguaje de expressiones (Java EL)

Otros artículos relacionados: Servlet 3.0 , ServletContext ,ServletFilter

Related Post