Mostrando entradas con la etiqueta j2ee. Mostrar todas las entradas
Mostrando entradas con la etiqueta j2ee. Mostrar todas las entradas

lunes, 12 de noviembre de 2007

Analizando el tráfico web con tcpmon.jar

Problema: Queremos ver lo que estamos recibiendo como respuesta de un servicio web. Imaginemos que el servicio web está en http://dirServWeb:7777/masDir/masCarpeta
Solución:
1.-Con el tcpmon.jar, le damos doble click, introducimos en

localPort= 7777
ServerName= dirServWeb
ServerPort= 7777
...y le damos click en "Add Monitor"

2.-Luego la dirección donde teníamos http://dirServWeb:7777/masDir/masCarpeta pasa a ser http://localhost:7777/masDir/masCarpeta

3.-Posteriormente, entramos en la aplicación y ya podemos ver las respuestas.

Para más consulta: Web TCPMon

martes, 28 de agosto de 2007

Validación usando validation.xml, validator-rules.xml y un validador propio

Problema: Hacer un validador externo para ser usado desde el validation.xml.

Solución:
1.- Hago una clase que tenga mi método de validación

public class MiValidation implements Serializable{

/**
* Valida un dce con el formato de dos dígitos seguidos de una barra y luego 4 dígitos. Ej.: 33/12345
* @return false si no hubo error, true si hubo algún error
*/
public static boolean validateDCE(java.lang.Object bean,
org.apache.commons.validator.ValidatorAction va,
org.apache.commons.validator.Field field, ActionMessages errors,
Validator validator, javax.servlet.http.HttpServletRequest request) {
// reflejamos el metodo en el logger
if (ValidationCortas.logger.isDebugEnabled()) {
ValidationCortas.logger
.debug("ValidationCortas: Método validateDCE");
}

// miramos si el objeto es un string
String value = null;
if (MiValidation.isString(bean)) {
// metemos el string en la variable value
value = ((String) bean);
} else {
// obetenemos el valor del bean
value = ValidatorUtils.getValueAsString(bean, field.getProperty());
}

// comprobamos que tenga algo
if (!GenericValidator.isBlankOrNull(value)) { //esa función es propia es para que no sea null o cadena vacía
String expReg = "^(\\d{2})(/\\d{4})$"; //ej.: 33/12345
boolean mach=value.matches(expReg);
if (value.matches(expReg) ){
return (false);
}else{
errors.add(field.getKey(), Resources.getActionMessage(request, va,
field));
return (true);

}
}
return (false);
}

/**
* Método que determina si el objeto es o no de tipo String
*
* @param Object o, el objeto a analizar
* @return boolean true si es String, false en caso contrario o si es null
*/
private static boolean isString(Object o) {
// si es null, es string
if (o == null) {
return (true);
}
return (String.class.isInstance(o));
}

} //fin de la clase


2.-En el validator-rules hago un validador. El msg lo extraerá del ApplicationResources respectivo. Nota: Quitar los espacios luego del '<'

< validator name="validateDCE"
classname="es.mipaquete.web.validator.MiValidation"
method="validateDCE"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.invalid.dce" >
< /validator>


3.-En el validation.xml, indico que campo del formulario está sometido a la validación. En el ejemplo muestro como colocar para el form. El key que coloco lo
extraerá del ApplicationResources respectivo. Nota: Quitar los espacios luego del '<'


< formset>
< form name="miFormBase">
< field property="maderistaForm.calificacionEmpresarial" depends="validateDCE">
< arg0 key="error.maderista.calificacionEmpresarial" name="validateDCE"/>
< /field>
< /form>
< /formset>


4.-En el ApplicationResources meto las variables necesarias:

errors.invalid.dce=\"{0}\" debe ser un DCE válido, ejemplo: 33/9999.
error.maderista.calificacionEmpresarial = Documento de Calificación Empresarial


5.-Queda colocar en struts que el validate=true y el input en el action correspondiente.

lunes, 16 de julio de 2007

Imprimiendo mensajes de error para relacionar con html:errors

Problema: Queremos imprimir mensajes de error para que sean tomados por la etiqueta

Soluciones: Dependiendo de la versión de struts que usemos valdrán unas u otras.

Solución con ActionMessages: Hago un método que redirigirá y con el código del almacenamiento del mensaje dentro. Puede variar el método, pero el registro del error es casi idéntico siempre.

protected ActionForward findSuccess(ActionMapping mapping, ActionForm arg1, HttpServletRequest request, HttpServletResponse arg3) {


if (this.getActionParameter(ExceptionCortasKeys.PARAM_ID_NO_SELECCIONADO)!=null){
String mensaje = new String("Mensaje de error a mostrar");
// registramos el error
ActionMessages errores = getErrors(request, true);
errores.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("idErrorGlobal", mensaje));
saveErrors(request, errores);
//redirijo a la página de input del mapeo de struts
return mapping.getInputForward();
}

return super.findSuccess(mapping, arg1, request, arg3);
}


Solución con ActionErrors:
Explicación idéntica que lo anterior, varía el tipo de mensajes, es decir, el registro del error, quedando así:

ActionErrors errors = getErrors(request, true);
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("global.princastexception", exception.getMessage()));
saveErrors(request, errors);

Mostrando pdf usando struts.

Problema: Queremos poner un enlace para que se llame un action y se muestre un pdf (típica ventana para abrir o descargar). El pdf nos viene en un array de bytes.

Solución: Desde la propia action que es llamada desde el enlace, colocaríamos el siguiente código:



try{
//obtengo el array de bytes del pdf
byte[] respuestaByte= this.miDelegate.getPDF();

//digo que es un pdf
response.setContentType("application/pdf");

//asigno el nombre del pdf, para cuando el usuario lo abra o descargue
response.setHeader("Content-Disposition",("attachment;filename=\"" +
nombrePDF+ ".pdf\""));

int longitud = respuestaByte.length;

//especifico el tamaño
response.setContentLength(longitud);

/*volcando a fichero*/
ServletOutputStream ouputStream = response.getOutputStream();

ouputStream.write(respuestaByte);

ouputStream.flush();

ouputStream.close();

}
catch(Exception e){
logger.error("No se ha podido regenerar correctamente el pdf");
}

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!.

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;
}