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.

lunes, 13 de abril de 2009

Problema texto largo en jasperreports y linux

Les cuento que en la aplicacion que desarrollo tengo unos reportes y usamos jasperreports3.0 para generar archivos pdf, bien teniamos un problema con estos reportes en un campo de texto que podia ser corto o muy largo, el problema es que a veces el texto se cortaba, en windows funcionaba muy bien, todo el texto se mostraba perfecto, pero en linux no, entonces escribi a jasperreport.org y me contestaro que se debia a un problema con las fuentes, en este campo la fuente definida es Arial y en windows esta fuente trabaja muy bien pues es nativa de este sisteama operativo pero en linux no la tiene ya que es una fuente propietaria, y bueno para esto installe la fuente Arial en linux y el problema se soluciono.

Para saber mas acerca de este bug pueden leer en este FAQ de jasper, en la parte donde dice:

Why is my text not displayed correctly in PDF?

Para instalar la fuente arial segui los siguientes pasos (el servidor linux que usamos es un red hat enterprise 5):

1.- Crear una carpeta en la ruta /usr/share/fonts
mkdir windowsfonts

2.- Copiar las fuentes Arial de la carpeta c:\WINDOWS\fonts a la carpeta creada en el punto 1 (windowsfonts)

3.- Cambiar el propietario y los permisos de las fuentes que se copiaron
Ejecutar :
cd /usr/share/fonts/windowsfonts
chown root.root *.tff
chmod 644 *.ttf

4.- Ejecutar el commando mkfontdir dentro de la carpeta que contiene las fuentes (windowsfonts)

5.- Cambiar al directorio padre (fonts), ejecutando cd ..

6.- Ejecutar el comando fc-cache windowsfonts

Para mas referencias sobre installar la fuente arial aqui estan estos links:

http://linuxhelp.blogspot.com/2005/12/adding-windows-fonts-in-linux.html

Este es de redhat
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.2/html/Deployment_Guide/s3-x-fonts-fontconfig-add.html