martes, 21 de abril de 2009

Obtener Beans del IoC de Spring en JSP's

Bien en un modulo que estoy realizando unos cambios me encontre con la sorpresa de que se estaban instanciando Daos (data acces object) dentro del jsp y esto pues es un pequeño problema de performance pues cada vez que se presenta el jsp se crea un objeto.

Lo primero que hice fue declarar los Daos asi:

<%!DaoCatalogo daoCatalogo = new DaoCatalogo();%>

Con lo anterior aseguro que solo habrá una instancia del objeto para cada peticion al jsp, pero ya que estamos usando spring porque no mejor obtener los objetos del contenedor de spring (IoC).

Este pequeño detalle no se hubiera dado si el desarrollador anterior hubiera ocupado bien el springMVC, pero bueno lo que hice fue una clase estatica con un metodo estatico al cual le paso el nombre del bean definido en nuestro applicationContext y el ServletContext para poder obtener el objeto la clase es la siguiente

package com.example.nl;

import javax.servlet.ServletContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class SpringLocateBean {

public static Object getBean (String nameBean, ServletContext sc){

Object objBean = null;
ApplicationContext actx = WebApplicationContextUtils.
getWebApplicationContext(sc);
objBean = actx.getBean(nameBean);
return objBean;
}

}

Como se observa en la clase lo que hace es obtener el ApplicationContext con la ayuda de la clase WebApplicationContextUtils con el metodo getWebApplicationContext(ServletContext) al cual se le pase el contexto de nuestro servlet (jsp), una vez obtenido el ApplicationContext obtenemos el bean (objeto) que queremos a travez del nombre que le pasamos al metodo getBean(String), este metodo nos devuelve el bean que queremos pero en tipo Object por lo que en el jsp tenemos que hacer un cast al tipo de objeto adecuado

En el jsp tenemos lo siguiente :

<%@ page import="com.example.nl.SpringLocateBean"%>
<%!
DaoCatalogo daoCatalogo;
public void jspInit() {
daoCatalogo = (DaoCatalogo) SpringLocateBean.
getBean ("daoCatalogo", getServletConfig().getServletContext());
}
%>

Como vemos en el jsp importamos nuestra clase que obtiene los objetos de spring, despues declaramos la variable DaoCatalogo y posteriorme un metodo jspInit() en el cual se inicializa el objeto con nuestra clase SpringLocateBean ejecutando el metodo getBean y pasando el nombre del bean (ojo este nombre esta definido en el applicationContext.xml ) y el contexto del jsp

Nota: el metodo jspInit() se ocupa cuando ocupamos alguna libreria de etiquetas (custom tags) como por ejemplo JSTL, si no utilizamos ninguna en nuestro jsp podemos usar el metodo _jspInit(), esto si usas algun servidor basado en tomcat o tomcat en otros no he probado


Bueno esto les puede servir si necesitan incorporar Spring a una aplicacion web con servltes y jsp pero sin usar springMVC.

1 comentario:

ceylon tee dijo...

Este artículo breve acerca de cómo un Bean de primavera se gestiona de la COI de contenedores. Frijoles primavera existen dentro del contenedor, siempre y cuando se necesitan en la Appplication. Hay fases de la vida del ciclo de interfaces y los métodos que serán llamados por el contenedor de la COI. El pre-requisito para este artículo es un conocimiento básico en la primavera, que se puede conseguir mediante la lectura del artículo en javabeat Introducción a Spring Web Framework.