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

STRUTS 1.2.9 (NetBeans 6.1) - Problemas con llenado de <html:text> desde BD

Estas en el tema de STRUTS 1.2.9 (NetBeans 6.1) - Problemas con llenado de <html:text> desde BD en el foro de Java en Foros del Web. Cuando un usuario se logea tiene la opcion de cambiar sus datos personales ( nombres y apellidos)... al dar click en el <html:link> "Cambiar Datos" ...
  #1 (permalink)  
Antiguo 29/10/2009, 09:35
 
Fecha de Ingreso: enero-2007
Mensajes: 63
Antigüedad: 17 años, 3 meses
Puntos: 2
Pregunta STRUTS 1.2.9 (NetBeans 6.1) - Problemas con llenado de <html:text> desde BD

Cuando un usuario se logea tiene la opcion de cambiar sus datos personales ( nombres y apellidos)...

al dar click en el <html:link> "Cambiar Datos" se carga una nueva pagina en donde tengo 2 <html:text> (nombres y apellidos c/u con sus validaciones required) y tomando como parametro el nombre del usuario se muestran en estos su nombre y apellidos respectivamente ... hasta ahi todo entendible y funcionando bien...

el problema es q estos datos los cargo desde un ArrayList (q me devuelve la funcion listar_persona(user) en mi clase personaDAO) q se guarda como una variable de session ...

ademas tengo un <html:hidden> para almacenar el persona_id (q tb toma su valor del mismo ArrayList) para poder hacer luego la actualizacion

mi codigo es el sgte.

linkAction extends DispatchAction (este es para el link "Cambiar Datos" q carga el DatosUser.jsp)
Código:
public ActionForward datosUser(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        HttpSession sesion = request.getSession();
        String username = sesion.getAttribute("username").toString();
        ArrayList a = new ArrayList();
        
        a= personaDAO.listar_persona(username);
        
        HttpSession s =request.getSession(true);
                        
        s.setAttribute("rsDatosUser", a);

        return mapping.findForward("datosUser");
    }

DatosUser.jsp
Código:
                        <h3>
                            Datos Personales
                        </h3>
                        <hr>
			<html:hidden property="persID" value='<%= ((ArrayList)session.getAttribute("rsDatosUser")).get(0).toString() %>' />                        
                        <table border="0" align="center" cellpadding="5" cellspacing="4" width="650">
                            <tbody> 
                                
                                <tr>
                                    <td align="right" valign="middle">
                                        Nombres:
                                    </td>
                                    <td  valign="middle">
                                        <html:text property="txtNom" value='<%= ((ArrayList)session.getAttribute("rsDatosUser")).get(1).toString() %>' />
                                        <html:errors property="txtNom" />
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right" valign="middle">
                                        Apellidos:
                                    </td>
                                    <td  valign="middle">
                                        <html:text property="txtPat" value='<%= ((ArrayList)session.getAttribute("rsDatosUser")).get(2).toString() %>' />
                                        <html:errors property="txtApe" />
                                    </td>
                                </tr>
				<tr>
                                    <td colspan="2" align="center" valign="middle">
                                        <html:submit property="method" >
                                            <bean:message key="buttons.btnUpdateDatosUser"/>
                                        </html:submit>
                                    </td>
                                </tr>
			    </tbody>
			</table>

submitAction extends LookupDispatchAction (esto es para el submit)
Código:
public ActionForward updateDatosUser(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        DynaValidatorActionForm frm = (DynaValidatorActionForm) form;
        SimpleDateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");

        String id = frm.get("persID").toString();
        String nom = frm.get("txtNom").toString();
        String ape = frm.get("txtApe").toString();
       
        Integer persID = Integer.parseInt(id);
        personaDAO.actualizar_persona(persID, nom, ape);

        return mapping.findForward("updateDatosUser");

    }


personaDAO
Código:
static public ArrayList listar_persona(String username) throws Exception {

        PreparedStatement ps = null;
        ResultSet rs = null;
        conexion db = new conexion();
        Connection cnn = db.getConnection();
        ArrayList a = new ArrayList();

        try {
            String sql = "select dbo.persona.* from dbo.persona " +
                    "INNER JOIN dbo.usuario_persona ON " +
                    "dbo.persona.persona_id = dbo.usuario_persona.persona_id " +
                    "INNER JOIN dbo.usuario ON dbo.usuario_persona.usuario_id = dbo.usuario.usuario_id " +
                    "where dbo.usuario.usuario= ?";
            ps = cnn.prepareStatement(sql);
            ps.setString(1, username);
            rs = ps.executeQuery();

            while (rs.next()) {
                a.add(rs.getString("persona_id"));
                a.add(rs.getString("nombres"));
                a.add(rs.getString("apellidos"));                
            }

        } finally {
            if (cnn != null) {
                cnn.close();
            }
        }
        return a;
    }

 static public void actualizar_persona(Integer persID, String nom, String ape) throws Exception {

        PreparedStatement ps = null;
        conexion db = new conexion();
        Connection cnn = db.getConnection();

        try {
            String sql = "update persona set nombres=?,apellidos=? where persona_id=?";
            ps = cnn.prepareStatement(sql);
            ps.setString(1, nom);
            ps.setString(2, ape);           
            ps.setInt(3, persID);
            ps.executeUpdate();
        } finally {
            if (cnn != null) {
                cnn.close();
            }
        }
    }


todo funciona correctamente pero los errores aparecen cuando:

1.Como los valores que salen de la BD para llenar sus respectivos <html:text> se alamcenan en una session si borro los valores de los <html:text> y preciono el <html:submit> las validaciones se activan mostrando los <html:errors> a pesar de q por el postback y la session los <html:text> se han vuelto a llenar

2.Para evitar esto puse en vez de session un request cambiando en

linkAction
Código:
s.setAttribute("rsDatosUser", a);

...por...

request.setAttribute("rsDatosUser", a);

y en el jsp
Código:
<html:text property="txtNom" value='<%= ((ArrayList)session.getAttribute("rsDatosUser")).get(1).toString() %>' />

...por...

<html:text property="txtNom" value='<%= ((ArrayList)request.getAttribute("rsDatosUser")).get(1).toString() %>' />

y lo mismo para el <html:text> apellido y en el <html:hidden>
Al dar click en el link "Cambiar Datos" nuevamente, los datos son mostrados correctamente pero si borro el contenido de algun <html:text>, y despues preciono el submit, o simplemente lo presiono me genera un error

Código:
...
causa raíz 

java.lang.NullPointerException
	org.apache.jsp.datosUser_jsp._jspService(datosUser_jsp.java:263)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.internalModuleRelativeForward(RequestProcessor.java:1023)
	org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:345)
	org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:988)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
Supongo q java.lang.NullPointerException es debido a q como ya no es session ahora es request el ArrayList y sus valores se pierden al momento del postback y como el <html:hidden> es el primer control q necesita de un valor del ArrayList se genera este error

Existira alguna manera a parte de utilizar session y beans (ya q utilizo ValidatorActionForm y con esto no necesito de ActionsForms) para llenar los <html:text> desde una BD y q no ocurran los problemas antes mencionados???
o necesariamente tengo q utilizar beans para almacenar los datos? ... como lo haria?? Pero al crear un bean del tipo persona no tendria q tb pasarlo al final en el request del linkAction?? :S

...Entiendo bean como una clase por ejemplo persona con sus metodos get y set estoy en lo correcto?? ... :P

gracias por todo de antemano...
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 21:57.