viernes, 23 de marzo de 2012

Cuando no sabes que hacer con JSTL

Llevo ya mas de un mes teniendo fallos intermitentes en codigo JSTL que un dia va pero otro no. Conclusión: el servidor tomcat según le da me ignora las etiquetas EL. Para solucionarlo tendremos que poner en la cabecera de los jsp lo siguiente:

<%@ page isELIgnored="false" %>

Detectar tablas/registros

Para saber si tenemos tablas o registros bloqueados basta con lanzar una sql tal que así:

select
  t.relname,
  l.locktype,
  page,
  virtualtransaction,
  pid,
  mode,
  granted 
from 
  pg_locks l, pg_stat_all_tables t 
where 
  l.relation=t.relid 
order by 
  relation asc;

jueves, 22 de marzo de 2012

Usar otro nombre para log4j.properties

Para poder usar otro nombre de fichero distinto en log4j dentro de una aplicación web deberemos hacer los siguiente en el metodo init del servlet:

String prefix = event.getServletContext().getRealPath("/");
if (prefix.endsWith(File.separator) == false)
 prefix += File.separator;
PropertyConfigurator.configure(prefix + "log4j.revisarConsultasPendientes.properties");

Al fichero que me refiero es al log4j.properties

viernes, 16 de marzo de 2012

Generar números aleatorios con Postgres

Muchas veces nos encontraremos con que tenemos que poblar una BD con numeros para poder testear un funcionalidad que estemos programando. En postgres es tan sencillo como:

update schema.tabla set columnaNumerica = floor(random() * N) + desviacion;

Con desviación me refiero a que, si no lo añadimos, random generara numeros empezando por el 0 hasta N. El uso de floor es para redondear y quedarme solo con la parte entera. Ya que random genera floats entre 0 y 1.

Espero os sirva este pequeño truquillo. Un saludico.

viernes, 9 de marzo de 2012

Formatear fecha JSON

Para poder representar de forma bonita y humana una fecha retornada por un JSON por ejemplo, la función quedaría tal que así. En mi caso, el formato esperado es: dd/MM/yyyy hh:mm

    function FormatDate(fecha) {
     var fechaObj = new Date(fecha);
  return (fechaObj.getDate() < 10 ? '0' : '') + fechaObj.getDate()
   + '/' + (fechaObj.getMonth() < 10 ? '0' : '') + fechaObj.getMonth() 
   + '/' + fechaObj.getYear()
   + ' ' + (fechaObj.getHours() < 10 ? '0' : '') + fechaObj.getHours() 
   + ':' + (fechaObj.getMinutes() < 10 ? '0' : '') + fechaObj.getMinutes(); 
    };

martes, 6 de marzo de 2012

JSTL algo raro y nuevo

Hoy me he encontrado con alguien que me ha dicho que JSTL, que lo estoy usando en un proyecto nuevo, es algo nuevo y raro.

Cito de la wikipedia:
JSTL was developed under the Java Community Process (JCP) as Java Specification Request (JSR) 52. On May 8, 2006, JSTL 1.2 was released.
Fuente: JSTL - Wikipedia

Acceder a un tipo enumerado con JSTL

Bueno, como no, en mi día a día hoy me he visto forzado a usar un tipo enumerado con JSTL. El problema es que si usas la siguiente sentencia no funciona:
<c:if test="${consulta.estado eq EstadoConsulta.PENDIENTE">...</c:if>
Solución, guardarse los valores en el pageContext y usarlos mas tarde:
<% pageContext.setAttribute("pendiente", EstadoConsulta.PENDIENTE); %>
<c:if test="${consulta.estado eq pendiente}"/>...</c:if>
Otra solución que he visto es esta otra si tenemos un tipo enumerado tuneado:
public enum EstadoConsulta {
  PENDIENTE(1, "Pendiente"),
  LEIDA(2, "Leida");
 
  private int value;
  private String text;
  private static final Map typesByValue = new HashMap();

  static {
    for (EstadoConsulta type : EstadoConsulta.values())
      typesByValue.put(type.value, type);
  }

  private EstadoConsulta(int value, String text) {
    this.value = value;
    this.text = text;
  }

  public int getValue() { return value; }
 
  public String getText() { return text; }
 
  public static Map getMapValues() {
    return EstadoConsulta.typesByValue;
  }
}
Podremos hacer lo siguiente en nuestro JSP con JSTL:
<% pageContext.setAttribute("estados", EstadoConsulta.getMapValues()); %>
<c:out value="${estados[consulta.estado].text}" />