jueves, 22 de marzo de 2007

Imprimir excepciones en código de jsp

Problema: Cuando una jsp nos está generando un error, y queremos saber cuál es, pero no mostrárselo al usuario.

Solución: (Quitar los espacios después de los '<')

Agregar en una tile, el pie siguiente...o colocar el código correspondiente en cada jsp que queramos lo planteado.


< %@ page isErrorPage="true" %>
< %@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
< %@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>

< !--
Información de errores JSP

< % if (exception != null) { %>
< pre><% exception.printStackTrace(new java.io.PrintWriter(out)); %>< /pre>
< % } else { %>
No hay ninguna excepcion visible, chequea los logs en busca del error
< % } %>
-->

miércoles, 21 de marzo de 2007

Confirmación de cancelar usando js

Problema:
Quiero que al pulsar un botón que en mi aplicación sirve para cancelar, me salga un popup para confirmar que lo deseo hacer.

Solución:
1.-Agrego una función javascript

/**
* Función para confirmar la cancelación de trámite
*/
function confirmCancel()
{
var message = "Ha seleccionado cancelar el proceso de solicitud que esta realizando.\n"
+ "?Desea cancelar realmente el proceso de solicitud?";
if (window.confirm(message))
{
document.forms[0].submit();
}
else
{
return (false);
}
}


2.-Hago la llamada de la función en mi botón (en mi caso es un html:submit, pero podría hacerse en el input de tipo submit normal y corriente), en el onclick: (quitar los espacios luego del <)



< html:submit property="buttons[14]"
altKey="boton.cancelar"
titleKey="boton.cancelar"
onclick="return confirmCancel();">

< /html:submit>

Poner dd/mm/aaaa en un text con javascript

Problema: Quiero colocar en un input para poner la fecha de nacimiento lo siguiente: dd/mm/aaaa, y que cuando el usuario escriba, este texto desaparezca.

Solución:
1.-En un fichero de funciones js coloco las siguientes:

//funcion para borrar el valor del campo de fecha
function clearFecha(){
if(document.getElementById("dateOfBirth").value=="dd/mm/aaaa"){
document.getElementById("dateOfBirth").value = "";
document.getElementById("dateOfBirth").style.color = "#000";
}
}

//funcion para cargar el valor del campo fecha como "dd/mm/aaaa", se coloca directamente en el texto con el identificador 'fechaNacimiento'
function loadFecha(){
if((document.getElementById("fechaNacimiento").value=="")||(document.getElementById("fechaNacimiento").value==null)||(document.getElementById("fechaNacimiento").value=="dd/mm/aaaa")){
document.getElementById("fechaNacimiento").value = "dd/mm/aaaa";
document.getElementById("fechaNacimiento").style.color = "#CCC";
}
}


2.-Hago las llamadas desde la página: (Quitar los espacios luego de '<')

< html:text name="miForm" onfocus="clearFecha();" styleId="fechaNacimiento" property="fechaNacimiento" size="10" maxlength="10" readonly="false"/>
< span onclick="clearFecha();">


3.-Recordar hacer el include en la jsp, algo como: (Quitar los espacios luego de '<')

< script src="scripts/empleo.js" type="text/javascript">< /script>

martes, 20 de marzo de 2007

Puedes colaborar :)

Bueno, viendo unas cosas que estaba haciendo un compañero de trabajo llegué -clicando y clicando y clicando, artículo va, noticia viene...-, a la siguiente página:

HacesFalta.org, es una web en la que puedes ser voluntario, buscar algún trabajo remunerado siempre relacionado con ong's o afines...hay ofertas para hacerlo desde tu casita: voluntario virtual.

Ahí lo dejo, por si le entra la vena colaborativa, o tienen ganas y un tiempito libre.

lunes, 19 de marzo de 2007

Displaytag: Ordenando columna por fecha

Si tenemos una tabla de la displaytag, en la que quiero que una columna ordene por fecha es algo más complicado que lo que se suele hacer, ya que, normalmente ordena alfanuméricamente.

Solución (Ordena por dd/MM/yyyy):

1.-Agrego la fecha, e indico el decorador que usa.

< display:table name="sessionScope.miLista"
align="center"
id="elemento"
pagesize="10"
export="false"
requestURI="../../action/citizen/MiAction?method=miMetodo">


< display:column titleKey="fechaConvocatoria"
property="fecha"
sortable="true"
decorator="es.miproyecto.web.view.DateColumnDecorator"/>
< /display:table>



2.-Agrego la clase java correspondiente al decorador.

package es.princast.personalSelection.web.view;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.displaytag.decorator.ColumnDecorator;
import es.princast.personalSelection.util.DateDecorator;

/**
* Decorador para formatear la fecha en la tabla de listado
*
*/
public class DateColumnDecorator implements ColumnDecorator
{

/**
* Formateador de la fecha
*/
private SimpleDateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );

/**
* Transformamos la reprentacion actual de la fecha en un string
*
* @param columnValue Object, el objeto date
*
* @return String value, el objeto string
*/
public final String decorate(Object columnValue)
{
if (columnValue!=null){
Date date = (Date) columnValue;
return this.dateFormat.format(date);
}else{
return new String("");
}
}
}

jueves, 15 de marzo de 2007

XSLT y eclipse

Hace tiempo en un curso (transparencias del curso) me mostraron un plugin bueno para eclipse el de orangevolt. Te permite hacer búsquedas con XPath, trae un editor XML, ejecutar las transformaciones...

Las páginas son las siguientes:
Página de orangevolt para eclipse
Página del plugin eclipsexslt de sourceforge (para descargas)

Es muy fácil de descargar, según la versión de eclipse que tengas, te descargas un versión u otra, la descomprimes, y colocas en features los archivos que te trae, y análogamente con plugins.

miércoles, 14 de marzo de 2007

XML y XSL con oc4j10

Bien, para hacer un xml con su xsl en oc4j (10 en mi caso), seguí las instrucciones de la página oficial...
instrucciones oficial

...sin embargo, resumo lo que entienden ahí como que 'todo el mundo lo sabe' y sino manuales y manuales.

1.-Agrega los jars que te indica en la página oficial en tu classpath:
a.-ojsputil.jar (está en oc4j\j2ee\home\jsp\lib\taglib)
b.-xmlparserv2.jar (está en oc4j\lib)
c.-xsu12.jar (está en oc4j\lib)

2.-En tu oc4j tienes los ejemplos que te ponen en la página, en la dirección:
oc4j\j2ee\home\demo\jsp\build\web\ojspdemos-web\jsp\xml . Así que con copiar y pegar en tu aplicación vale.

3.-La taglib uri de hello.xml cámbiala y coloca la siguiente:

<% @ taglib uri="/WEB-INF/tld/xml.tld" prefix="xml" %>

3.-En el web.xml de tu aplicación coloca, en la zona de los taglibs:

< taglib>
< taglib-uri>/WEB-INF/tld/xml.tld
< taglib-location>/WEB-INF/tld/xml.tld
< /taglib>

4.-Del jar ojsputil.jar que antes agregaste, extrae la xml.tld que está dentro de META-INF. Agrega esa tld en tu proyecto, en la ruta (location) indicada en el web.xml, que en este caso es /WEB-INF/tld/xml.tld .

5.-Arranca la jsp de hello.jsp y ¡LISTO!.

martes, 13 de marzo de 2007

Visor de logs: Chainsaw

Usando log4j para la generación de logs ya ha sido un primer paso.
Problema:Ahora está el engorro cuando el fichero es muy grande y el tiempo en pasarse al fichero.
Solución: Para verlo "en caliente" uso el Chainsaw . Es muy útil además, porque me permite buscar, filtrar por nivel de log,...

Lo que hago es colocar en el log4j.xml lo siguiente:
Nota: Quitar los espacios luego de los '<'.

< appender name="SOCKET" class="org.apache.log4j.net.SocketAppender">
< param name="Port" value="4445"/>
< param name="RemoteHost" value="localhost"/>
< param name="ReconnectionDelay" value="60000"/>
< param name="Threshold" value="DEBUG"/>
< /appender>


...y también lo agrego en el root para que me muestre desde la raíz.


< root>
< priority value="INFO"/>
< appender-ref ref="SOCKET"/>
< appender-ref ref="HTML"/>
< /root>


Finalmente, arranco el chainsaw, normalmente antes que mi servidor de aplicaciones, y ya me mostrará los logs por su consola.

lunes, 12 de marzo de 2007

'SetParameter' para la request

Me he topado con la necesidad de pasar por request un parameter, pero sólo tengo lo de "setAttribute" desde un Action.

Solución:
1.-Yo uso DispatchAction, pues en algún método que retorne ActionForward y que sea el que usen de base (en mi caso findSuccess), hacen lo siguiente:
  
//obtengo el path actual de la request
String uri = ServletPathUtils.getCompleteURL( request );
//llamo a la función que me da la nueva url a la que quiero ir
String url=miRequestNueva(uri);
//retorno el action forward con el redirect a true para que me redirija.
return ( new ActionForward( url,true ) );


2.-Función que me da la nueva dir a la que quiero ir

private String miRequestNueva(String uri){
String miRequestPath=uri;
//tomo la url y lo que hay luego de la última barra lo voy a cambiar
int ultimoIndexBarra= miRequestPath.lastIndexOf("/");
String primeraParte=miRequestPath.substring(0,ultimoIndexBarra+1);
//esto va a ser el final de mi request, cambio el action y paso un parámetro
String segundaParte="NuevaAction?paginate=true;
String requestCompuesta=primeraParte+segundaParte;
return requestCompuesta;
}

miércoles, 7 de marzo de 2007

Repopulando html:checkbox

Imaginemos que tengo 2 pantallas, la 1ra. de un formulario, y la siguiente, donde se presentan los datos introducidos en la primera.
En la 2da. tengo un check que puedo marcar o desmarcar, y lo que quiero es, que si vuelvo a la 1ra. se me quede almacenado lo que tengo en el check.
Puede haber otra solución, como recomiendan en la documentación del taglib, que sea poner en el reset el valor a false, pero esto no funciona si tengo varios botones en la página que redirigen a sitios distintos.

Solución:
1.- En el Form asociado tengo un atributo de tipo boolean, que en este caso llamo clausulas, con su respectivos getter y setter. Por defecto, quiero que aparezca marcado, con lo cual, coloco = true en su declaración.
2.- En la página de los datos, pongo el checkbox.
3.- Coloco también un atributo oculto con el mismo nombre que la propiedad y el valor de false. Si se desmarca el checkbox se envía el false, y si está marcado, se envía el true del checkbox.