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

martes, 12 de marzo de 2013

Hibernate InvalidMappingException

Trabajando con Hibernate, en una relación 1-n bidireccional, obtuve un error en un mapeo

SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Could not parse mapping document from resource comentario1nbi.hbm.xml
Exception in thread "main" java.lang.NullPointerException
    at com.blog.dao.PostDAO.crearPost(PostDAO.java:48)
    at com.hib.TestHibBlog.main(TestHibBlog.java:26)



Esto surgía, porque en comentario1nb1.hbm.xml había puesto  como name el nombre de la tabla, y debe ser el del VO
 
  <many-to-one name="postVO" column="idPost"  />



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.blog.vo.Comentario1nBiVO" table="comentarios1nBi">
  <id name="id" type="int" column="id" >
   <generator class="identity"/>
  </id>
 
  <property name="cuerpo">
   <column name="cuerpo" />
  </property>
  <property name="fecha">
   <column name="fecha"/>
  </property>
 
  <!-- muchos comentarios pertenecen a un post
  indico el nombre del atributo dentro
  de Comentario1nBiVO al cual haré referencia
  con mi clave.
  La columna es la columna de posts, que es clave. -->
  <many-to-one name="postVO" column="idPost"  />
 </class>
</hibernate-mapping>



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.blog.vo.Post1nBiVO" table="posts1nBi">
  <id name="id" type="int" column="idPost" >
   <generator class="identity"/>
  </id>

  <property name="idAutor" type="int" column="idAutor"/>

  <property name="fecha">
   <column name="fecha" />
  </property> 
  <property name="titulo">
   <column name="titulo" />
  </property>
  <property name="contenido">
   <column name="contenido"/>
  </property>
 
  <list name="comentarios" cascade="all-delete-orphan">  
     <key column="idPost" /><!-- cuál columna de la tabla post será la clave externa -->
    <index column="ORDEN" />  <!-- para guardar en el mismo orden, una columna nueva -->
    <!-- ahora sí indico que hay una relación de 1 a n -->
    <one-to-many class="com.blog.vo.Comentario1nBiVO" />
  </list>

 </class>
</hibernate-mapping>




package com.blog.vo;

import java.util.Date;

public class Comentario1nBiVO {
        private int id;
        private String fecha;
        private Post1nBiVO postVO;
       
       
        public Comentario1nBiVO() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Comentario1nBiVO(String fecha, String cuerpo) {
            super();
            this.fecha = fecha;
            this.cuerpo = cuerpo;
        }
        private String cuerpo;
        /**
         * @return the id
         */
        public int getId() {
            return id;
        }
        /**
         * @param id the id to set
         */
        private void setId(int id) {
            this.id = id;
        }
       
        /**
         * @return the fecha
         */
        public String getFecha() {
            return fecha;
        }
        /**
         * @param fecha the fecha to set
         */
        public void setFecha(String fecha) {
            this.fecha = fecha;
        }
        /**
         * @return the cuerpo
         */
        public String getCuerpo() {
            return cuerpo;
        }
        /**
         * @param cuerpo the cuerpo to set
         */
        public void setCuerpo(String cuerpo) {
            this.cuerpo = cuerpo;
        }
        /**
         * @return the postVO
         */
        public Post1nBiVO getPostVO() {
            return postVO;
        }
        /**
         * @param postVO the postVO to set
         */
        public void setPostVO(Post1nBiVO postVO) {
            this.postVO = postVO;
        }

       
}




package com.blog.vo;

import java.util.ArrayList;
import java.util.List;

public class Post1nBiVO {

        private int id;
        private int idAutor;
        private String fecha;
        private String titulo;
        private String contenido;
        private List comentarios=new ArrayList();
       
        /**
         * DEBE EXISTIR UN CONSTRUCTOR POR DEFECTO PARA QUE
         * HIBERNATE FUNCIONE
         */
        public Post1nBiVO(){
            super();
        }
       
    public Post1nBiVO(int idAutor, String fecha, String titulo, String contenido) {
        super();
        this.idAutor = idAutor;
        this.fecha = fecha;
        this.titulo = titulo;
        this.contenido = contenido;
    }       
   
    public void addComentario(Comentario1nBiVO comentario){
        comentarios.add(comentario);
    }
       
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

       
        public String getFecha() {
            return fecha;
        }
        public void setFecha(String string) {
            this.fecha = string;
        }
        public String getTitulo() {
            return titulo;
        }
        public void setTitulo(String titulo) {
            this.titulo = titulo;
        }
        public String getContenido() {
            return contenido;
        }
        public void setContenido(String contenido) {
            this.contenido = contenido;
        }

        /**
         * @return the idAutor
         */
        public int getIdAutor() {
            return idAutor;
        }

        /**
         * @param idAutor the idAutor to set
         */
        public void setIdAutor(int idAutor) {
            this.idAutor = idAutor;
        }

        /**
         * @return the comentarios
         */
        public List getComentarios() {
            return comentarios;
        }

        /**
         * @param comentarios the comentarios to set
         */
        public void setComentarios(List comentarios) {
            this.comentarios = comentarios;
        }
       
       
}











jueves, 28 de febrero de 2013

Excepción en Hibernate

Esta excepción a mí me ocurrió cuando estaba intentando actualizar un registro de cuyo id no tenemos existencia en la base de datos, porque acababa de ser borrado.


org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)




lunes, 25 de febrero de 2013

Hacer un redirect con struts

Problema: He creado un post, y el forward me llevó al listado de post, sin embargo, como la url es /crearActionPost.do  , si le doy a refrescar me volverá a crear el mismo post.  Quiero que me cambie la url, para que aunque refresquen, sea imposible volver a crear el mismo post, que para crear un post, deban iniciar el proceso.

Solución:

   Esto sería lo que tendría habitualmente:  //return mapping.findForward("mostrarTodo");
 Esta, una primera aproximación: 
    // ActionForward ac = mapping.findForward("mostrarTodo");
    // ac.setRedirect(true);
    //return ac;
   En realidad ActionForward, hereda de ForwardConfig, entonces, puedo decirle, que quiero que 
vaya al listado pero indicándole que haga un redirect:       
    ForwardConfig f = new ActionRedirect(mapping.findForward("mostrarTodo"));
    f.setRedirect(true);
    return (ActionForward) f;

html:href .vs. a href

Problema:  Queremos llamar desde una jsp a un action de struts.
Posibilidades:  Usar una etiqueta "a" de html o usar una etiqueta "Conclusión:  Mejor usar la de Struts, puesto que relativiza y puedes llamar a un action sin .do y sin tener en cuenta dónde desde dónde haces la llamada.  Peor si quieres imprimir varios parámetros o usar el <bean:write>


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

    <%@page import="vo.PostVO" %>

    <%@page import="java.util.LinkedList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>

<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title></title>

</head>

<body>

<logic:iterate name="listaPost"  scope="session" id="post" >

    <bean:write property="titulo" name="post"/>

    <bean:write property="descripcion" name="post"/>

    <bean:write property="fecha" name="post"/>

    <a href="postAction.do?method=detallesPost&id=<bean:write property="id" name="post"/>">Más detalles...</a></br></br>

</logic:iterate> 
 
 
<!--


OPCIÓN 1:

con a href, debo buscar la ruta relativa y colocar el .do 

--> 
 <a href="../crearPost.do">Crear nuevo Post</a>
 
 
<!--

OPCIÓN 2:con html:link, no es necesario colocar .do ni las relativas

-->  


 <html:link action="crearPost">Crear nuevo Post versión pro</html:link> 
 
<!--


OPCIÓN 3:con html:link, pasándole un parámetro ID, donde adquiere el valor que tendrá la propiedad id dentro del form llamado post

http://localhost:8080/nombre_proyecto/crearPost.do?method=crear&titulo=4&ID=2

--> 

 
 <html:link action='crearPost?method=crear&titulo=4' paramName="post" 
paramProperty="id" paramId="ID" >Crear nuevo Post versión pro</html:link>



</body>

</html>






lunes, 21 de enero de 2013

Hibernate desde 0 usando Struts 1.3.10

Hoy me topé con la necesidad de integrar Hibernate junto con Struts, y aquí os dejo unos pasos y unos buenos tutoriales

1.-Me bajé el zip con el contenido de hibernate.  https://sourceforge.net/projects/hibernate/?source=dlp  y en el eclipse, en la carpeta lib, metí los jars siguientes:
  • Los que estaban dentro de required ( hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final\lib\required) : antlr-2.7.6, commons-collections-3.1, dom4j-1.6.1, javassist-3.12.0.GA, jta-1.1,  slf4j-api-1.6.1
  • Los de hibernate propiamente dicho (\hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final) : hibernate3  e hibernate3testing 
  • El de JPA (hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final\lib\jpa):  hibernate-jpa-2.0-api-1.0.1.Final
    • Este jar hay que meterlo para evitar la excepción Exception in thread “main” java.lang.NoClassDefFoundError: javax/persistence/EntityListeners    (solución hallada en http://technicalrecyclebin.wordpress.com/category/j2ee/hibernate/ )
2.-Metí en mi proyecto el jar de un conector de mysql, en mi caso:  mysql-connector-java-5.1.22-bin.jar

3.-Yo seguí un muy buen tutorial de creación de la aplicación, donde tras indicarte los ficheros que tienes que crear te brinda la oportunidad de dejar la prueba ejecutada
http://blog.sencide.com/2011/03/hibernate-tutorial-for-beginners.html

4.-Para ese mismo tutorial, os dejo los scripts de creación de mysql, puesto que , tuve algún error, por ejemplo, se me olvidó crear las claves primaras como autoincremental, y si no lo hacía, me salía el siguiente error:   org.hibernate.HibernateException: The database returned no natively generated identity value  o también otro que indicaba que no tenía un valor por defecto en el id.  OJO, yo le llamé a la base de datos, hibernatestruts  (con lo cual difiere del ejemplo del tutorial)

delimiter $$

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(100) DEFAULT NULL,
  `last_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$

delimiter $$

CREATE TABLE `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8$$

SELECT * FROM hibernatestruts.users;

delimiter $$

CREATE TABLE `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8$$

SELECT * FROM hibernatestruts.users;

5.-Una vez que ejecuté como una aplicación Java el test.  Procedí a introducirlo con Struts.  Para ello, tenía una aplicación creada con el struts-blank de la versión 1.3.10, creé un Action para poder ejecutar mi código y seguí el siguiente tutorial:

http://bernabetorres.wordpress.com/2011/07/27/integracion-de-hibernate-en-struts-1-3-10/

y este

http://www.mkyong.com/struts/struts-hibernate-integration-example/


6.-Finalmente, me leí una documentación adicional

Introducción resumida:  http://hareenlaks.blogspot.com.es/2011/03/introduction-to-hibernate.html
Introducción: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/tutorial.html
Lenguaje HQL:  http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
Variado: http://viralpatel.net/blogs/introduction-to-hibernate-framework-architecture/

7.-No olvidar, una buena herramienta para el eclipse (en mi caso eclipse Juno)
http://marketplace.eclipse.org/node/420896#.UP0aLoaTrIU

lunes, 3 de marzo de 2008

Simulación de Mocks con Java

El uso de los mocks o simulaciones es muy útil a la hora de trabajar con servicios web o con operaciones que realmente no necesitamos a la hora del desarrollo pero sí necesitamos una respuesta. Por ejemplo, queremos probar una lógica, para ello necesitamos que un método que llama a un servicio web nos devuelva una lista, pero no queremos ahora llamar al servicio web (puede que no esté ni en funcionamiento dicho servicio), entonces lo que hacemos es simular la respuesta.

Para hacer mocks, lo que se suele realizar es una interface, y luego 2 o más implementaciones, una que será la real, y las demás las que hagan las simulaciones. Luego escogeremos el uso de una u otra pues mediante código, o según una variable de un property esté a 1 o a 0, en fin... como queramos.

Para facilitar la tarea, está también el JMock, que nos ayuda a realizar objetos mocks en java.


Página Principal del Proyecto JMock

Ejemplo del uso del JMock

martes, 15 de enero de 2008

Imprimir el toXML() de un objeto de manera automática (Java)

Problema: Queremos imprimir todos los campos de un objeto simple (VO) con un formato XML. Para ello implementamos el método toXML() del objeto en cuestión.

Solución: Para evitarnos estar haciendo todos los campos de manera manual, usaremos la librería XStream
Pasos:

1.-Meto el jar de xstream ( por ejemplo xstream-1.1.3.jar )
2.-Creo un objeto de tipo XStream y le paso el objeto.
MiObjeto obj = new MiObjeto();
XStream xstream = new XStream();
logger.debug("Mi objeto en XML :\n"+xstream.toXML(obj));

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

jueves, 6 de septiembre de 2007

mostrar lista de radio y de checkbox en una jsp siendo válida xhtml

Para checkbox usando una lista de PropertyBean metida en sesión. Obviar los estilos.
Notas: "IDIOMAS" podría estar en una clase SessionKey y luego llamarla con scriptles.
Sustituir "MENOR" por "<" y "MAYOR" por ">"
Quitar los espacios luego del "<"



< c:set var="jTab" value="347" scope="session"/> <%-- es el orden de tabulación del punto anterior--%>
< logic:iterate name="IDIOMAS" id="idioma">
< c:set var="jTab" value="${jTab+1}" scope="session"/>
< c:set var="identificadorIdioma" scope="session">
< div class="clearBoth">
< label for ="MENOR % =(String)request.getSession().getAttribute("identificadorIdioma") % MAYOR" >
< html:multibox property="myNotification.idiomasId" styleId='MENOR%=(String)request.getSession().getAttribute("identificadorIdioma") %MAYOR' tabindex='MENOR%=request.getSession().getAttribute("jTab") %MAYOR' >< bean:write name='idioma' property="value"/>
< bean:write name="idioma" property="label"/>
< /label>
< /div>
< /logic:iterate>




2.-Ejemplo para radio. Es el típico para escoger el sexo. Tendría un ActionForm llamado "miForm" con una propiedad "sexo". También se hace uso de un par de etiquetas del ApplicationResources para mostrar los textos.


< label for="sex.man">
< html:radio name="miForm" property="sexo" styleId="sex.man" value="hombre" >
< /html:radio>
< bean:message key="etiqueta.sexo.hombre" />
< /label>

< label for="sex.woman">
< html:radio name="miForm" property="sexo" styleId="sex.woman" value="mujer">
< /html:radio>
< bean:message key="etiqueta.sexo.mujer" />
< /label>

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.

miércoles, 22 de agosto de 2007

Ordenando una lista Collections

Para ordenar una lista en Java, basta con implementar un comparador y hacer una llamada a la clase Collections. Incluso puede hacerse con una clase anónima como es el ejemplo que les muestro:


LinkedList solicitudes = new LinkedList();
/*imaginemos que miDelegate.getSolicitudes() me devuelve una lista LinkedList donde cada elemento es un objeto de tipo MiObjeto, que lo que tiene es un atributo long llamado id*/
solicitudes = miDelegate.getSolicitudes();

Collections.sort(solicitudes,
new Comparator()
{
/**
* Metodo encargado de realizar la comparacion.
* Ordena descendentemente por el identificador.
*/
public int compare(Object a, Object b)
{
long idA = Long.parseLong(((MiObjeto)a).getId());
long idB = Long.parseLong(((MiObjeto)b).getId());

if (idA>idB){
return -1;
}else if (idA<idB){
return 1;
}else{//son iguales
return 0;
}
}
}
);

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

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.





viernes, 16 de febrero de 2007

Abator: generando ibatis automáticamente

Para los que usan ibatis, que es un mecanismo para sentencias sql y mapeos entre VO's que yo uso en Java, aquí tienen la forma de generar automáticamente algunos ficheros de configuración.
En pocas palabras, genera los VO's y los ficheros XML a partir de la base de datos.

http://ibatis.apache.org/abator.html
http://ibatis.apache.org/docs/tools/abator/

Abrir automáticamente una impresión de una página html

Muchas veces al abrir una ventana queremos que se lance la ventana de impresión automáticamente, esto se consigue con un iframe oculto (accesibilidad=0).

1.-Función js para detectar el tipo de navegador, porque la impresión se lanzará de manera diferente (hace uso de la función para detectar el navegador que tengo en otro post):

/*Función que imprime el frame oculto*/
function imprimoFrame(){
var tipo = tipoNavegador();
if (tipo==1){
window.frames["popUpImpresion"].focus();
window.frames["popUpImpresion"].print();
}else{
if (tipo==2){
document.popUpImpresion.focus();
document.popUpImpresion.print();
}else{
if (tipo==3){
document.popUpImpresion.focus();
document.popUpImpresion.print();

}
}
}
}

2.-Coloco en mi página el iframe: (quitar el espacio luego del '<')

< iframe class="marcoOculto" src="/aplicacion/action/confirmPopUp" name="popUpImpresion" id="popUpImpresion" onload="imprimoFrame()">
Su navegador no soporta IFrame
< /iframe>


3.-La class marcoOculto de css tiene lo siguiente:

/*oculta un iframe, en realidad pone ancho y alto a 0*/
iframe.marcoOculto{
border:none;
width:0em;
height:0em;
}


4.-El action /aplicacion/action/confirmPopUp lo que hace es llevar a la tile aplicacion.respuestaHTML que en realidad es la página html a imprimir. En realidad, se podía haber colocado la página directamente, pero esta forma es más elegante.



detectando navegador con js

/*Función que detecta el tipo de navegador: firefox=1, ie7=2, ie6=3.*/

function tipoNavegador(){
var version=0;
if (window.XMLHttpRequest) {
if(document.all){
//IE7
version=2;
}else{
//mozilla, safari, opera 9, etc
version=1;
}
} else {
// IE6, o viejos navegadores
version=3;
}
return version;
}