Foros del Web » Programación para mayores de 30 ;) » Java »

Formularios en Struts con datos previos

Estas en el tema de Formularios en Struts con datos previos en el foro de Java en Foros del Web. Hola a todos. A ver si soy capaz de explicarme bien Estoy haciendo una aplicacion con struts y tengo un problema con los formularios. Cuando ...
  #1 (permalink)  
Antiguo 06/05/2009, 06:07
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 16 años, 2 meses
Puntos: 4
Formularios en Struts con datos previos

Hola a todos.
A ver si soy capaz de explicarme bien

Estoy haciendo una aplicacion con struts y tengo un problema con los formularios. Cuando inserto un registro nuevo, la siguiente vez que doy a insertar, me aparecen los campos ya rellenados con los datos del anterior. Como puedo hacer para que se borren esos campos?

Como es posible que sea una pijada, de momento dejo asi el post. Si quereis, pongo las distintas opciones que he probado y los problemas que tengo con cada una.

Muchas gracias por adelantado.
  #2 (permalink)  
Antiguo 06/05/2009, 06:16
 
Fecha de Ingreso: agosto-2008
Mensajes: 57
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Formularios en Struts con datos previos

Hola, segun lo que pones yo creo que lo que te pasa es que al insertar en el action de inserccion recojes el form de la inserccion , insertarás los datos donde sea, y desde ese mismo action redireccionas de nuevo al jsp de inserccion, entonces en el form que le pasas tienes aun esos datos recogidos antes.

Depende para que lo quieras, pero puedes o bien no hacer el paso directamente(mostrar los datos insertados por ejemplo entre medias)

o justo antes de redireccionar cuando ya hayas usado los datos inicializar de nuevo el form que vas a pasar a la pagina de inserccion con el constructor de la clase.

1 saludo y suerte
  #3 (permalink)  
Antiguo 06/05/2009, 06:32
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Formularios en Struts con datos previos

Gracias por la sugerencia. Probe como decias a hacer un reset del formulario despues de hacer la insercion pero sigue igual.

Lo que hago es (aunque es generico, voy a ponerlo con usuarios que es donde estoy ahora mismo)

1.- Al pulsar en usuarios muestra un listado de estos
2.- Al pulsar en nuevo, la primera vez, muestra un formulario vacio para insertar uno nuevo
3.- Despues de rellenar los campos y hacer la validacion, inserta el usuario y nos muestra el detalle de ese usuario
4.- Al pulsar otra vez en nuevo, nos muestra otra vez el formulario, pero con los datos del anterior.
  #4 (permalink)  
Antiguo 06/05/2009, 09:23
 
Fecha de Ingreso: agosto-2008
Mensajes: 57
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Formularios en Struts con datos previos

joer pues si que es raro, porque yo estoy haciendo una aplicacion y tengo cosas similares y nunca me ha pasado eso... de hecho hay veces que he necesitado algo parecido y me las he tenido que ingeniar para conseguirlo jejeje.

el reset del form que le pasas al jsp donde te repite los datos del form como lo haces? supongo que en el actionForm de ese form tendras un constructor implementado por defecto para que te inicialice sin campos. Creo que si vuelves a instanciar el form sería suficiente. en plan usuariosForm = new UsuariosForm() por ejemplo

Pero ya te digo que tienes que estar haciendo algo raro porque los datos en teoria si los muestras y despues de mostrarlos vuelves al action no deberian de pasar de nuevo. a no ser que los muestres dentro de un html:form y luego vayas al action con un submit... que no tendria mucho sentido
  #5 (permalink)  
Antiguo 06/05/2009, 10:50
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Formularios en Struts con datos previos

Voy a poner todo lo que tengo a ver si alguien encuentra el error. Tambien agradezco mejoras, que de struts no tengo mucha idea y estoy aprendiendo sobre la marcha

struts-config.xml
Código:
<form-beans>
       <form-bean type="com.ejemplosjava.biblioteca.web.form.UsuarioForm" name="usuarioForm" />
</form-beans>
.
.
.
.
        <action path="/usuarioAction" type="com.ejemplosjava.biblioteca.web.action.UsuarioCRUDAction" parameter="method">
           <forward name="list"     path="usuarios.list" />
           <forward name="retrieve" path="usuarios.detalle" />
           <forward name="create"   path="usuarios.crear" />
           <forward name="edit"     path="usuarios.actualizar" />
        </action>

        <action path="/insertUsuarioAction" type="com.ejemplosjava.biblioteca.web.action.UsuarioCRUDAction" parameter="method"
            name="usuarioForm" validate="true" input="usuarios.crear">
            <forward name="insert"   path="/action/usuarioAction?method=retrieve" />
        </action>
        <action path="/updateUsuarioAction" type="com.ejemplosjava.biblioteca.web.action.UsuarioCRUDAction" parameter="method"
            name="usuarioForm" validate="true" input="usuarios.actualizar">
            <forward name="update"   path="/action/usuarioAction?method=retrieve" />
        </action>
        <action path="/deleteUsuarioAction" type="com.ejemplosjava.biblioteca.web.action.UsuarioCRUDAction" parameter="method">
            <forward name="delete"   path="/action/usuarioAction?method=list" />
        </action>
UsuarioCRUDAction es un dispatchAction que tiene los metodos:

list .- Extrae la lista los usuarios de la base de datos y la pone en la request
create.- Pone en la sesion la lista de roles y redirige a usuarios.crear (donde esta el formulario que me da problemas)
insert.- Inserta en la base de datos y redirige a usuarios.detalle
edit.- Pone en la request el detalle de un usuario para editarlo
update.- Actualiza el usuario en la base de datos
delete.- Borra el usuario de la base de datos
retrieve.- Muestra el detalle de un usuario

Pongo el codigo de los metodos list, create, insert y retrieve, que es por donde se pasa para hacer todo el proceso

Código:
    public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String metodo = "create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)";
        loggerCRUDAction.info("Entrando en UsuarioCRUDAction." + metodo);

        try {
            request.getSession().setAttribute(RequestKeys.LISTA_ROLES, rolDelegate.getListaRoles()); //Extraemos la lista de roles
        } catch (Exception ex) {
            String mensajeError = "Se ha producido un error en " + this.getClass().getName() + "." + metodo + "Causa: " + ex.getMessage();
            Methods.sendErrorMail(metodo, this.getClass().getName(), mensajeError);
            request.setAttribute(RequestKeys.ERROR, ex.getMessage());
            loggerCRUDAction.error(mensajeError);
            return mapping.findForward("error");
        }
        loggerCRUDAction.info("Se completo con exito " + this.getClass().getName() + "." + metodo);

    public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String metodo = "insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)";
        loggerCRUDAction.info("Entrando en UsuarioCRUDAction." + metodo);

        UsuarioForm usuarioFormulario = (UsuarioForm) form;
        UsuarioVO usuarioVO = new UsuarioVO();
        usuarioFormulario.populate(usuarioVO);  //Rellenamos un usuario con los datos del formulario

        ImagenVO imagenVO = new ImagenVO(); //Creamos una nueva imagen
        imagenVO.setIdTabla(TablasKeys.TABLA_USUARIO);  //Le asignamos el idTabla
        FormFile formFile = null;
        
        formFile = usuarioFormulario.getImagenUsuario();

        if(!formFile.getFileName().equals("")){    //Si el usuario selecciono una imagen, usamos esa
            imagenVO.setImagen(formFile.getFileData());
            usuarioVO.setRutaFotoUsuario("../../images/usuarios/" + formFile.getFileName());
        }else{                   //Si no, usamos la imagen por defecto
            loggerCRUDAction.warn("Habria que cambiar esto para que funcione igual que en el update");
            Map parametros = new HashMap();
            parametros.put("idTabla", TablasKeys.TABLA_USUARIO);
            parametros.put("idRegistro", 0);
            imagenVO.setImagen(imagenDelegate.getDetalleImagen(parametros).getImagen());
            usuarioVO.setRutaFotoUsuario(Constantes.IMAGEN_DEFECTO_USUARIO);
        }
        try {
            usuarioDelegate.insertUsuario(usuarioVO, imagenVO); //Tratamos de insertar el usuario y la imagen en la base de datos
        } catch (Exception ex) {
            String mensajeError = "Se ha producido un error en " + this.getClass().getName() + "." + metodo + "Causa: " + ex.getMessage();
            Methods.sendErrorMail(metodo, this.getClass().getName(), mensajeError);
            request.setAttribute(RequestKeys.ERROR, ex.getMessage());
            loggerCRUDAction.error(mensajeError);
            return mapping.findForward("error");
        }

        loggerCRUDAction.info("Se completo con exito " + this.getClass().getName() + "." + metodo);
        request.setAttribute(RequestKeys.ID_USUARIO, usuarioVO.getIdUsuario());

        request.getSession().removeAttribute(RequestKeys.LISTA_ROLES);

        return mapping.findForward("insert");
    }
        return mapping.findForward("create");
    }

    public ActionForward retrieve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String metodo = "retrieve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)";
        loggerCRUDAction.info("Entrando en UsuarioCRUDAction." + metodo);

        String _idUsuario = request.getParameter(RequestKeys.ID_USUARIO); //Intentamos recuperar el id como un parametro
        Integer idUsuario = null;
        if (_idUsuario == null) {       //Si no existe, es por que venimos de un update o insert, y estara como atributo
            idUsuario = (Integer) request.getAttribute(RequestKeys.ID_USUARIO);
        } else {
            idUsuario = new Integer(_idUsuario);
        }

        UsuarioVO usuario = null;
        try{
            usuario = usuarioDelegate.getDetalleUsuario(idUsuario); //Extraemos el detalle del usuario de la base de datos
        }catch(Exception ex){
            String mensajeError = "Se ha producido un error en " + this.getClass().getName() + "." + metodo + "Causa: " + ex.getMessage();
            Methods.sendErrorMail(metodo, this.getClass().getName(), mensajeError);
            request.setAttribute(RequestKeys.ERROR, ex.getMessage());
            loggerCRUDAction.error(mensajeError);
            return mapping.findForward("error");
        }
        request.setAttribute(RequestKeys.DETALLE_USUARIO, usuario); //Depositamos el usuario en la peticion

        if (usuario!=null) { //Si existe el usuario, comprobamos si existe la imagen
            String imagenPath = usuario.getRutaFotoUsuario(); //Agregamos el nombre de la imagen a una clave generica para
            String imagenPathConvertida = "";                 //todas las tablas
            imagenPathConvertida = Constantes.PATH_IMAGES + imagenPath.substring(5);
            File imagen = new File(imagenPathConvertida);
            if (!imagen.exists()) { //Si no existe la imagen en el sistema de fichero, la extraemos de la base de datos
                Map parametros = new HashMap();
                parametros.put(Constantes.ID_REGISTRO, idUsuario);
                parametros.put(Constantes.ID_TABLA, TablasKeys.TABLA_USUARIO);
                try {
                    loggerCRUDAction.info("No existe la imagen. Se extraerá de la base de datos");
                    ImagenVO imagenVO = imagenDelegate.getDetalleImagen(parametros);
                    Methods.changeImagenToFileFromBlob(imagenVO.getImagen(), imagenPathConvertida);
                    log.info("Concluida la extraccion de la imagen");
                } catch (Exception ex) {    //Como no es un error grave, dejamos un aviso en el log, pero continua la carga normal
                                            //de la pagina
                    loggerCRUDAction.error("Error extrayendo la imagen en UsuarioCRUDAction.retrieve(). Causa: " + ex.getMessage());
                }
            }
        }else{  //El que no exista el usuario es un error grave, asi que se devuelve un error
            String mensajeError = "Se ha producido un error en " + this.getClass().getName() + "." + metodo + "Causa: " + "No existe el usuario";
            Methods.sendErrorMail(metodo, this.getClass().getName(), mensajeError);
            request.setAttribute(RequestKeys.ERROR, "No existe el usuario");
            loggerCRUDAction.error(mensajeError);
            return mapping.findForward("error");            
        }

        loggerCRUDAction.info("Se completo con exito " + this.getClass().getName() + "." + metodo);
        return mapping.findForward("retrieve");
    }
-------------->
  #6 (permalink)  
Antiguo 06/05/2009, 10:51
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Formularios en Struts con datos previos

El UsuarioForm es un ValidatorForm con el siguiente codigo

Código:
public class UsuarioForm extends EjemplosJavaValidatorForm{

    //<editor-fold defaultstate="collapsed" desc="Atributos">
    private Integer idUsuario;
    private String nombreUsuario;
    private String password;
    private String passwordConfirm;
    private String email;
    private String poblacion;
    private String rutaFotoUsuario;
    private String nacionalidadUsuario;
    private Integer idRol;

    private FormFile imagenUsuario;
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Constructores">
    public UsuarioForm(){}
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Setters y Getters">

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPasswordConfirm() {
        return passwordConfirm;
    }

    public void setPasswordConfirm(String passwordConfirm) {
        this.passwordConfirm = passwordConfirm;
    }

    public String getPoblacion() {
        return poblacion;
    }

    public void setPoblacion(String poblacion) {
        this.poblacion = poblacion;
    }

    public String getRutaFotoUsuario() {
        return rutaFotoUsuario;
    }

    public void setRutaFotoUsuario(String rutaFotoUsuario) {
        this.rutaFotoUsuario = rutaFotoUsuario;
    }

    public String getNacionalidadUsuario() {
        return nacionalidadUsuario;
    }

    public void setNacionalidadUsuario(String nacionalidadUsuario) {
        this.nacionalidadUsuario = nacionalidadUsuario;
    }

    public Integer getIdRol() {
        return idRol;
    }

    public void setIdRol(Integer idRol) {
        this.idRol = idRol;
    }

    public FormFile getImagenUsuario() {
        return imagenUsuario;
    }

    public void setImagenUsuario(FormFile imagenUsuario) {
        this.imagenUsuario = imagenUsuario;
    }



    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Metodos">
    public void populate(EjemplosJavaVO ejemplosJavaVO){
        UsuarioVO usuarioVO = (UsuarioVO) ejemplosJavaVO;

        usuarioVO.setIdUsuario(idUsuario);
        usuarioVO.setEmail(email);
        usuarioVO.setNacionalidadUsuario(nacionalidadUsuario);
        usuarioVO.setNombreUsuario(nombreUsuario);
        usuarioVO.setPassword(password);
        usuarioVO.setPoblacion(poblacion);
        usuarioVO.setIdRol(idRol);
    }
    public void set(EjemplosJavaVO ejemplosJavaVO){
        UsuarioVO usuarioVO = (UsuarioVO) ejemplosJavaVO;

        this.email = usuarioVO.getEmail();
        this.nacionalidadUsuario = usuarioVO.getNacionalidadUsuario();
        this.idRol = usuarioVO.getIdRol();
        this.idUsuario = usuarioVO.getIdUsuario();
        this.nombreUsuario = usuarioVO.getNombreUsuario();
        this.password = usuarioVO.getPassword();
        this.poblacion = usuarioVO.getPoblacion();
        this.rutaFotoUsuario = usuarioVO.getRutaFotoUsuario();
    }
    
    //</editor-fold>
}
Por ultimo, el codigo de las jsp

usuarios.crear
Código:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib uri="http://jakarta.apache.org/struts/tags-html"	prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<div id="formulario" style="width:27em">
<html:errors />
<html:form action="/insertUsuarioAction?method=insert" method="post" enctype="multipart/form-data">
    <label for="nombre">
        <span class="lbl"><bean:message key="usuarios.nombreUsuario" /></span><html:text property="nombreUsuario"  styleClass="txt" styleId="nombre"></html:text>
    </label><br/>
    <label for="password">
        <span class="lbl"><bean:message key="usuarios.password" /></span>
        <html:password property="password" styleClass="txt" styleId="password" value=""></html:password>
    </label>
    <label for="passwordConfirm">
        <span class="lbl"><bean:message key="usuarios.passwordConfirm" /></span>
        <html:password property="passwordConfirm" styleClass="txt" styleId="passwordConfirm" value=""></html:password>
    </label>
    <label for="rol">
        <span class="lbl" style="margin-top:0em"><bean:message key="usuarios.rol" /></span>
        <html:select property="idRol"  styleId="rol" styleClass="select">
            <option>-</option>
            <html:optionsCollection name="listaRoles" label="rol" value="idRol" />
        </html:select>
    </label>
    <label for="email">
        <span class="lbl"><bean:message key="usuarios.email" /></span>
        <html:text property="email"  styleClass="txt" styleId="email"></html:text>
    </label>
    <label for="nacionalidad">
        <span class="lbl"><bean:message key="usuarios.nacionalidad" /></span><html:text property="nacionalidadUsuario"  styleClass="txt" styleId="nacionalidad"></html:text>
    </label>

    <label for="poblacion">
        <span class="lbl"><bean:message key="usuarios.poblacion" /></span><html:text property="poblacion"  styleClass="txt" styleId="poblacion"></html:text>
    </label>

    <label for="imagenUsuario">
        <span class="lbl"><bean:message key="usuarios.imagen" /></span><span style="margin-bottom:0.85em"><html:file property="imagenUsuario" styleId="imagenUsuario"></html:file></span>
    </label>

    <html:submit value="Insertar" />

</html:form>

</div>
usuarios.detalle
Código:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<div style="margin-top:10px;">
        <table width="100%">
            <tr>
               <td rowspan="6" width="20%" >
                   <img class="imgCentrada" alt="Imagen del usuario" src="<c:out value="${requestScope.detalleUsuario.rutaFotoUsuario}" />" style="width:100%;height:100%;"/>
               </td>
            </tr>
            <tr>
               <td>
                   <b>Identificador:</b> <c:out value="${requestScope.detalleUsuario.idUsuario}" />
               </td>
               <td>
                   <b>Rol:</b> <c:out value="${requestScope.detalleUsuario.rol.rol}" />
               </td>
            </tr>
            <tr>
               <td>
                   Nombre
               </td>
               <td>
                   <c:out value="${requestScope.detalleUsuario.nombreUsuario}" />
               </td>
            </tr>
            <tr>
               <td>
                   Email
               </td>
               <td>
                   <c:out value="${requestScope.detalleUsuario.email}" />
               </td>
            </tr>
            <tr>
               <td>
                   Poblacion
               </td>
               <td>
                   <c:out value="${requestScope.detalleUsuario.poblacion}" />
               </td>
            </tr>
            <tr>
               <td>
                   Nacionalidad
               </td>
               <td>
                   <c:out value="${requestScope.detalleUsuario.nacionalidadUsuario}" />
               </td>
            </tr>
            
        </table>
</div>
Si alguien quiere, lo subo a un servidor y dejo la direccion para que lo veais funcionando

Gracias por adelantado
  #7 (permalink)  
Antiguo 06/05/2009, 17:09
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Formularios en Struts con datos previos

Ya encontre la solucion, y aunque tal vez no sea lo mejor, por lo menos es funcional. Me basto con crear un metodo reset en el formulario sin parametros, que pusiera todos los campos a null. Pense que esto era lo que hacia el reset(ActionMapping mapping, HttpServletRequest request) de ValidatorForm de struts, pero se ve que no.
En fin, que ya funciona. Muchas gracias por todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:52.