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