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:
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 <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>
Código:
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... 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)
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...