Filtrado por dato en formulario con Struts

Espero me puedas volver a ayudar, como las ultimas veces que lo hiciste genial y fuiste de gran ayuda.
Necesito saber como filtrar con Struts según los campos de un formulario. Ahora mismo solo consigo que dando al botón buscar me liste todos los datos de la tabla... Pero tengo unos campos y me gustaría que cuando yo introduzco en un campo por ejemplo el "2", solo me liste los de la tabla que coinciden con "2". Te recuerdo que mi nivel es básico.. Si necesitas algún archivo(los action, las jsp, oad etc..) me dices.

1 Respuesta

Respuesta
1
Te cuento el procedimiento: lo primero, necesitas incorporar estos nuevos campos de filtrado en dos sitios:
1) Formulario HTML
2) Action Form de java
Después, en el Action, necesitarás recuperar el valor de los campos del Action Form, y pasárselos a la clase que hace la consulta sql, para que meta una sentencia "WHERE" para filtrar. Supongamos que en el filtro quieres incorporar dos filtros, uno para un campo que es numérico (campo1) y otro para un campo de texto (campo2). Cuidado con los tipos de datos. Para un campo numérico la sql no lleva comillas:
Ej: WHERE cantidad=0
Sin embargo, cuando el campo es un literal, en la sql hay que incluir las comillas:
Ej: WHERE nombre='Carlos'
La sql se construye dinámicamente dependiendo de si el usuario ha metido algo en el filtro o no:
String sql = "SELECT * FROM miTabla ";
boolean primerFiltro = true;
if (!campo1.equals("")){
if (primerFiltro){ sql += " WHERE ";primerFiltro=false;}
else{sql += " AND ";}
sql += "campo1=" + campo1;
}
if (!campo2.equals("")){
if (primerFiltro){ sql += " WHERE ";primerFiltro=false;}
else{sql += " AND ";}
sql += "campo2='" + campo2 + "'";
}



Luego, usa esa sql en vez de la que tienes ahora.
Gracias por la rapidez en contestar. El html ya le tengo, me falta modificar el action..
Pero no se cual tengo que modificar, ya que uso dos métodos, uno es irModificar que lelva a la pantalla de modificar y otro es modificar, que realiza la modificación. Supongo que sea en modificar, de todas formas te pongo los dos, simplemente quiero que lo haga para cCategoriaFaqID, que es el identificador de cada registro. Gracias de verdad, me ayudas mucho.
public ActionForward irModificar(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
                              throws java.lang.Exception {
   ActionErrors errors = new ActionErrors();
   HttpSession session = request.getSession();
   try  {
      KUROConfigApp.logger.info(getClass().getName()+" irModificar: Inicio");
      validarAccion (mapping,form,request,response);
      //Recogemos el codigo de la activo a modificar
//      INVEConfigApp.LogErrorApli.error("entro en irModificar");
      String c_categoria_faq_id = request.getParameter("id");
      Long cCategoriaFaqID= new Long(c_categoria_faq_id);
      JCYLUsuario jcylUsuario = (JCYLUsuario) session.getAttribute(JCYLConfiguracion.NOMBRE_ATRIBUTO_USUARIO);    
      KUROCategoriasFaqLN categoriasFaqLN = new KUROCategoriasFaqLN(jcylUsuario);
      KUROCategoriasFaqOT categoriasFaqOT = categoriasFaqLN.obtenerActivo(cCategoriaFaqID);
      ((KUROCategoriasFaqForm)form).setCCategoriaFaqID(categoriasFaqOT.getCCategoriaFaqID());
      ((KUROCategoriasFaqForm)form).setCCategoriaFaqPadre(categoriasFaqOT.getCCategoriaFaqPadre());
      ((KUROCategoriasFaqForm)form).setDCategoriaFaq(categoriasFaqOT.getDCategoriaFaq());
      ((KUROCategoriasFaqForm)form).setUCreacion(categoriasFaqOT.getUCreacion());
      request.setAttribute("tipoAccion", "MODIFICAR");
      KUROConfigApp.logger.info(getClass().getName()+" irModificar: Fin");
   }catch(Exception ex){       
      KUROConfigApp.logger.info(getClass().getName()+" irModificar: ERROR: "+ex.getMessage());
      //INVEConfigApp.LogErrorApli.error("irModificar()",e);
      return mapping.findForward("sinPermisos");
   }
   if(errors== null || errors.isEmpty()) {
      KUROConfigApp.logger.info("NO ERRORES, DATOS MODIFICAR");;
      return mapping.findForward("irInsertar");
   } else {
      saveErrors(request, errors);
      KUROConfigApp.logger.info("ERRORES, DATOS MODIFICAR");;
      return mapping.findForward("error");
   }                      
}//Fin irModificar
public ActionForward modificar (ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
                              throws java.lang.Exception {
   HttpSession session = request.getSession();
   ActionErrors errors = new ActionErrors();
   String t = null;
   try {
      /*KUROConfigApp.logger.info(getClass().getName()+" modificar: Inicio");   
      validarAccion (mapping,form,request,response);
      KUROCategoriasFaqOT categoriasFaqOT = new KUROCategoriasFaqOT();
      KUROCategoriasFaqLN categoriasFaqLN = new KUROCategoriasFaqLN();
//      activosOT.setCActivoId(Integer.parseInt(((INVEActuacionesForm)form).getCActuacionId()));
      t = ((KUROCategoriasFaqForm)form).getCCategoriaFaqID();
      categoriasFaqOT.setCCategoriaFaqID(new Integer(t));
      categoriasFaqOT.setDCategoriaFaq(((KUROCategoriasFaqForm)form).getDCategoriaFaq());
      categoriasFaqOT.setCTipo(((KUROCategoriasFaqForm)form).getCTipo());
      categoriasFaqLN.actualizarActivo(categoriasFaqOT);
      KUROConfigApp.logger.info(getClass().getName()+" modificar: Fin");*/
   }catch(Exception e){       
      KUROConfigApp.logger.info(getClass().getName()+" modificar: ERROR: "+e.getMessage());
      //INVEConfigApp.LogErrorApli.error("modificar()",e);
      return mapping.findForward("sinPermisos");
    }
   if(errors== null || errors.isEmpty()) {
      request.setAttribute("rutaVuelta","KUROCategoriasFaq.do?accion=irModificar&id=" + t);
      KUROConfigApp.logger.error("modificar");
      return mapping.findForward("accionExito");
   } else {
      saveErrors(request, errors);
      KUROConfigApp.logger.info("ERRORES, DATOS MODIFICAR");
      return mapping.findForward("error");
   }        
}//Fin modificar
En el action que me pasas no hay nada de consultas, solo actualizaciones. La consulta la tendrás implementada en la jsp de la lista (lo cual es una chapuza), o en otro action. Postea el código de la jsp y te lo confirmo:
Carlos
Si, creo que está en la jsp... te la pongo. De nuevo, gracias.
<%@ taglib uri="html.tld" prefix="html" %>
<%@ taglib uri="bean.tld" prefix="bean" %>
<%@ taglib uri="logic.tld" prefix="logic" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN"    "http://w3.org/TR/REC-html40/frameset.dtd">
<html lang="es">
<head>
<title>..: Alten España :..</title>
<link href="css/EstilosJCYLFW.css" rel="stylesheet" media="screen">
</head>
<script language="javascript" src="javascript/formularios.js"></script>
<script language="javascript" src="javascript/comun.js"></script>
<script>
// limpiar campos
   function limpiaCampos() {
         document.all.DCategoriaFaq.value="";
   }
function validar(){
   var validacion = 0;
     // Validar numéricos
    //if (document.OCAPPreguntasForm.DNombre.value == "" && document.OCAPPreguntasForm.CPreguntaId.value == ""){
      // alert('Debe introducir el Texto o el Id de la Pregunta');
      // validacion=1;   
    //}
   if (validacion==0) enviar('KUROCategoriasFaq.do?accion=buscar');    
}
</script>
<body >
<DIV class="encuadre">
  <jsp:include page="/cabecera.jsp" flush="true" />
<div class="cuadroContenedor">
<div id="tituloOpcion" >
<h1>CONSULTA CATEGORIAS</h1>
</div>
<html:form action="/KUROCategoriasFaq.do">
<div id="titulocajaformulario">Introduce los datos de búsqueda</div>
<div id="cajaformulario">
         <fieldset class="normales">
            <legend class="normales">Datos Obligatorios</legend>
<hr class="hrblanco">
</hr>
<script>             function limpiaCampos() {
         document.all.CCategoriaFaqPadre.value="";
         document.all.DCategoriaFaq.value="";         
         document.all.FCreacion.value="";
         document.all.FModificacion.value="";
   }
 </script>
<br>
              <label class="obligado">* Categoria Faq Padre:</label>
<html:text property="CCategoriaFaqPadre"  tabindex="18" styleClass="inputColor colocaNombreAreaAlta" size="60" maxlength="100"/>
              </br>
              <br>
              <label class="obligado">* Descripcion Categoria FAQ:</label>
<html:textarea property="DCategoriaFaq"  cols="50" rows="4" tabindex="18" styleClass="inputColor colocaNombreAreaAlta" />
              </br>
              <br>
              <label class="obligado">* Fecha de Creación:</label>
<html:text property="FCreacion"  tabindex="18" styleClass="inputColor colocaNombreAreaAlta" size="60" maxlength="100"/>
              </br>
              <br>
              <label class="obligado">* Fecha de Modificación:</label>
<html:text property="FModificacion"  styleClass="inputColor colocaNombreAreaAlta"  size="50" maxlength="100"/>
              </br>
         </fieldset>     
      </div>
<div id="cajaformulario02">   
         <fieldset class="normales">
<html:button value="Buscar" property="botonAceptar" styleClass="botonformulario" onclick="javascript:validar();"/>
<html:reset value="Volver" property="Cancelar" styleClass="botonformulario" onclick="javascript:history.back()"/>
<input type="button" value="Limpiar formulario" onClick="javascript:limpiaCampos();">
         </fieldset>
    </div>
<br />
      <br />
<logic:present name="sinDatos">
<div id="divSinDatos">
<p><label><bean:write name="sinDatos"/></label></p>
</div>
</logic:present>
<table border="1" class="tabla5 tablaConsultas">
<logic:notPresent name="sinDatos">
   <logic:present name="primeraConsulta">
<tr>
<th align="center" colspan="5" class="col1">Nº </th>
      <th align="center" colspan="5" class="col2" id="cCategoriaFaqPadre"> Descripción </th>
      <th align="center" colspan="5" class="col3" id="dCategoriaFaq"> Categoria Padre </th>
      <th align="center" colspan="5" class="col4" id="fCreacion"> Fecha de Creación </th>
      <th align="center" colspan="5" class="col5" id="fModificacion"> Fecha de Modificación </th>
</tr>
</logic:present>
<logic:present name="paginaKUROCategoriasFaqOT" property="elementos">
<logic:iterate id="elemento" name="paginaKUROCategoriasFaqOT" property="elementos">
<tr>
<td colspan="5" align="left">
       <br />
       <a href="KUROCategoriasFaq.do?accion=irModificar&id=<bean:write name="elemento" property="CCategoriaFaqID"/>">
       <bean:write name="elemento" property="CCategoriaFaqID"/>
       </a>
       </td>
<td colspan="5" align="left">
       <br />
       <bean:write name="elemento" property="DCategoriaFaq"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="CCategoriaFaqPadre"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="FCreacion"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="FModificacion"/>
       </td>
</tr>
</logic:iterate>
</logic:present>
</logic:notPresent>
</table>
</html:form>
</div>
<!-- marco Contenedor -->
<div id="footer">
<div class="lineafooter"></div>
</div>
</DIV> <!-- Encuadre General -->
</body>
</html>
Disculpa Karlos, me acabo de dar cuenta que en el action están los métodos buscar e irBuscar... seguro que hay que utilizar el de buscar así que te le pongo.
public ActionForward buscar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
 {
   String sig = "error";
   String mensajeError = "Se ha producido un error";
   Logger log = null;
   ActionForward actionForward =null;
   try {
     KUROConfigApp.logger.info("");
     KUROConfigApp.logger.info("---------- CONSULTA DE KURO_PRUEBA --------- ");
     ActionErrors errores = new ActionErrors();
     request.setAttribute("primeraConsulta","false");
     int primerRegistro = Pagina.DEFAULT_PRIMER_REGISTRO;
     int registrosPorPagina = Pagina.DEFAULT_REGISTROS_POR_PAGINA;
     String s = null;
     s = request.getParameter(Pagina.PRIMER_REGISTRO_PARAMETER_NAME);
     if (s != null)
      primerRegistro = Integer.parseInt(s);
     s = request.getParameter(Pagina.REGISTROS_PAGINA_PARAMETER_NAME);
     if (s != null)
      registrosPorPagina = Integer.parseInt(s);
     KUROCategoriasFaqForm formulario = (KUROCategoriasFaqForm) form;
     KUROCategoriasFaqOT categoriasFaqOT = new KUROCategoriasFaqOT();
     HttpSession session = request.getSession();
     categoriasFaqOT.setCCategoriaFaqID(formulario.getCCategoriaFaqID());
     categoriasFaqOT.setCCategoriaFaqPadre(formulario.getCCategoriaFaqPadre());
     categoriasFaqOT.setDCategoriaFaq(formulario.getDCategoriaFaq());
     categoriasFaqOT.setDDescripcion(formulario.getDDescripcion());
     categoriasFaqOT.setBBorrado(formulario.getBBorrado());
     categoriasFaqOT.setUCreacion(formulario.getUCreacion());
     categoriasFaqOT.setFCreacion(formulario.getFCreacion());
     categoriasFaqOT.setUModificacion(formulario.getUModificacion());
     categoriasFaqOT.setFModificacion(formulario.getFModificacion());
     //Obtenemos los siguientes datos de la request para pasarlos a la página genérica como String
     JCYLUsuario jcylUsuario = (JCYLUsuario) session.getAttribute(JCYLConfiguracion.NOMBRE_ATRIBUTO_USUARIO);
     KUROCategoriasFaqLN kUROCategoriasFaqLN = new KUROCategoriasFaqLN(jcylUsuario);
     long cCategoriaFaqID = 0;
      long cCategoriaFaqPadre= 0;
      String dCategoriaFaq = null;
      String dDescripcion= null;      
     String bBorrado= null;      
     String uCreacion= null;         
     Date fCreacion= null;   
     String uModificacion= null;   
     Date fModificacion= null;
     //ArrayList elementos = kUROPrueba2LN.consultaKUROPrueba2(cPrueba,dPrueba,aDescripcion,FInicio, primerRegistro, registrosPorPagina);
     ArrayList elementos = kUROCategoriasFaqLN.consultaKUROCategoriasFaq(categoriasFaqOT, primerRegistro, registrosPorPagina);
     if (elementos != null){
       KUROConfigApp.logger.info("Se han recuperado "+elementos.size() +" Areas para la consulta");
        if (elementos.size()==0){
            request.setAttribute("sinDatos","No existen registros con los parametros especificados");
            request.removeAttribute("conDatos");
        }else{
          int nListado = 0;
          //nListado = kUROPrueba2LN.listadoPrueba2(cPrueba,dPrueba,aDescripcion,fInicio);
          request.removeAttribute("sinDatos");
          Pagina pagina = new Pagina(mapping.getPath()+".do", request);
          pagina.setElementos(elementos);
          pagina.setRegistroActual(primerRegistro);
          //pagina.setNRegistros(nListado);
          pagina.setNRegistros(elementos.size());
          pagina.setRegistrosPorPagina(registrosPorPagina);
          request.setAttribute("paginaKUROCategoriasFaqOT", pagina);
          request.getSession().setAttribute("conDatos","Hemos recuperado datos");
          request.removeAttribute("menu");
          request.getSession().removeAttribute("menu");
        }
      }else
       {
          request.setAttribute("errorConsultando","Error consultando en la base de datos");
       }
       KUROConfigApp.logger.info("---------- FIN CONSULTA KUROCategoriasFaq ------- ");
   }catch (Exception ex){
  KUROConfigApp.logger.error(ex.getMessage());
      request.setAttribute("mensaje",mensajeError);
   return mapping.findForward("error");
   }
   return mapping.findForward("irBuscar");
  }// Fin de buscar
Por lo que veo, la consulta sql se hace cuando llamas a:
KUROCategoriasFaqLN.consultaKUROCategoriasFaq(categoriasFaqOT, primerRegistro, registrosPorPagina);
El parámetro "categoriasFaqOT" es un bean con varios campos, y por lo que veo se usa para filtrar la query. Este bean se carga con los campos que vienen en el ActionForm "KUROCategoriasFaqForm".
Por tanto, los pasos que tienes que seguir son los siguientes:
1) En la página HTML desde donde estás llamando a este Action, tendrás que meter en el formulario HTML los nuevos campos por los que quieres filtrar.
2) En el Action Form "KUROCategoriasFaqForm" incluye los nuevos campos con los métodos get-set para poder acceder a ellos
3) En el Action, cuando rellenes el bean "categoriasFaqOT", mete los nuevos campos, sacándolos del form como haces con el resto de campos.
4) Modifica la clase kUROCategoriasFaqLN, dentro del método consultaKUROCategoriasFaq() tienes que incluir el código para añadir los filtros nuevos. Como no me has pasado esta clase, no se el alcance de las modificaciones que habrá que hacer, pero supongo que si te fijas cómo están implementados el resto de filtros, será copy-paste. Intenta hacerlo solo.
Me estas ayudando a aprender un montón, espero no cansarte. Acabo de ver que el problema esta en el LN y la sql del OAD, ya que lo único que hace es obtener todos los datos y no filtra.. te voy a poner el método del LN y la consulta a ver que te parecen, y ya no te molesto más. Te estoy muy agradecido.
public ArrayList consultaKUROCategoriasFaq(KUROCategoriasFaqOT categoriasFaqOT ,int inicio, int cuantos)
    {
      ArrayList array = null;
      try
      {
           variableOAD= KUROCategoriasFaqOAD.getInstance();
           //array = variableOAD.consultaKUROPrueba2(cPrueba,  dPrueba,  aDescripcion,  fInicio, inicio, cuantos);
           array = variableOAD.consultaKUROCategoriasFaq(categoriasFaqOT, inicio, cuantos);
      }catch (Exception e)
      {
          array  = null;
          KUROConfigApp.logger.error(e.getMessage());
       }
       return array;
     }//Fin de listadoKUROCategoriasFaq
::::::::::::::::::::::..
::::::::::::::::::::::::::.
:::::::::::::::::::::::::::
public ArrayList consultaKUROCategoriasFaq(KUROCategoriasFaqOT categoriasFaqOT, int inicio, int cuantos)
   //public ArrayList consultaKUROCategoriasFaq(long cPrueba, String dPrueba, String aDescripcion, Date fInicio, int inicio, int cuantos)
   throws Exception {
        PreparedStatement st = null;
        ResultSet rs = null;
        Connection con=JCYLGestionTransacciones.getConnection();
        ArrayList listado = null;
        try {
            String where        = "";
            StringBuffer sbWhere = new StringBuffer(100);
         String selectFrom = "SELECT C_CATEGORIA_FAQ_ID, C_CATEGORIA_FAQ_PADRE, D_CATEGORIA_FAQ, " +                      
                             "D_DESCRIPCION, B_BORRADO, U_CREACION, F_CREACION," +
                             " U_MODIFICACION, F_MODIFICACION " +
                                "FROM KURO_CATEGORIAS_FAQ " ;                            
         String orderBy="order by C_CATEGORIA_FAQ_ID";
       //  boolean isDPrueba = (dPrueba != null &&!dPrueba.equals(""));
            //if (isDPrueba) sbWhere.append("(upper(D_PRUEBA) like upper('%").append(dPrueba).append("%')) AND ");
         /*String orderBy=" order by C_PRUEBA";
            boolean isCPrueba = (cPrueba != 0);
            if (isCPrueba) sbWhere.append("C_AREA_ID = ?  AND ");
            boolean isDPrueba = (dPrueba != null&&!dPrueba.equals(""));
            if (isDPrueba) sbWhere.append("(upper(D_PRUEBA) like upper('%").append(dPrueba).append("%')) AND ");
            boolean isADescripcion = (aDescripcion != null&&!aDescripcion.equals(""));
         if (isADescripcion) sbWhere.append("(upper(A_DESCRIPCION) like upper('%").append(aDescripcion).append("%')) AND ");
            boolean isFInicio = (fInicio != null&&!fInicio.equals(""));
            int len = sbWhere.length();
            if (len>0) {        // Le concatena el WHERE y le elimina el último AND
                where = sbWhere.insert(0," Where ").substring(0,len+1);
            }*/
            String sqlStatement = new StringBuffer(selectFrom).append(where).append(orderBy).toString();
         KUROConfigApp.logger.info("Sentencia SQL:"+sqlStatement);
            st = con.prepareStatement(sqlStatement,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            int index=1;
            KUROCategoriasFaqOT datos = new KUROCategoriasFaqOT();            
            /*if (isCPrueba)
            st.setLong(index++,cPrueba);*/                    
            rs  = st.executeQuery();
            if (inicio >1)
                rs.absolute(inicio-1);
            listado = new ArrayList();
            int i = 0;
            while (rs.next()) {
                datos = new KUROCategoriasFaqOT();
            datos.setCCategoriaFaqID(rs.getLong("C_CATEGORIA_FAQ_ID"));
            datos.setCCategoriaFaqPadre(rs.getLong("C_CATEGORIA_FAQ_PADRE"));
            datos.setDCategoriaFaq(rs.getString("D_CATEGORIA_FAQ"));
            datos.setDDescripcion(rs.getString("D_DESCRIPCION"));               
            datos.setBBorrado(rs.getString("B_BORRADO"));
            datos.setUCreacion(rs.getString("U_CREACION"));
            datos.setFCreacion(rs.getString("F_CREACION"));
            datos.setUModificacion(rs.getString("U_MODIFICACION"));
            datos.setFModificacion(rs.getString("F_MODIFICACION"));
                listado.add(datos);
                if (++i == cuantos)
                break;
            } // while
        } catch (Exception ex) {            KUROConfigApp.logger.error(ex.getMessage());
            throw ex;
        } finally {
         if (rs != null)
            rs.close();
         if (st != null)
            st.close();
            JCYLGestionTransacciones.close(con.getAutoCommit());
         } // try-catch
        return listado;        
      }//Fin de consultaKUROCategoriasFaq
Efectivamente, parece que el código para filtrar y ordenar está comentado y no se ejecuta. Para filtrar unicamente por los campos nuevos (pongamos campo1 y campo2, de los que ya hablamos antes), la cosa quedaría más o menos así:
String where = "";
boolean primerFiltro = true; 
if (!campo1.equals("")){ 
if (primerFiltro){ where+= " WHERE ";primerFiltro=false;} 
else{where+= " AND ";} 
where += "campo1=" + categoriasFaqOT.getCampo1(); 

if (!campo2.equals("")){ 
if (primerFiltro){ where+= " WHERE ";primerFiltro=false;} 
else{where+= " AND ";} 
where+= "campo2='" + categoriasFaqOT.getCampo2()+ "'"; 
}



String sqlStatement = new StringBuffer(selectFrom).append(where).append(orderBy).toString();

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas