Hola de nuevo, en este post continuare la creación de un componente de avisos, ahora enfocandame en la parte de Java y BD, es decir, el lado del servidor.
1. Crearemos un servlet ( también puede ser un Action, etc..) donde llamaremos a los DAO y otra lógica (tan compleja o básica como se necesite), para no extenderme en código solo pondré la parte de la función post.
/**
* Controlador de Componentes
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("->> BatchAjustesAction <<-");
String url="/blank.jsp";
try {
String componente = request.getParameter("component");
System.out.println("- componente:" + componente);
if ( componente != null) {
if ( componente.trim().equals("mostrarAvisos")) {
// Carga Mensajes del sistema
url="/jsp/componentes/avisos.jsp";
AvisoDAO avisosDAO = new AvisoDAO();
List listAvisos = avisosDAO.getAvisos();
request.setAttribute("listAvisos", listAvisos);
}
} catch( Exception e) {
e.printStackTrace();
url="/jsp/common/error.jsp";
}
this.dispatch(request, response, url);
}
protected void dispatch(HttpServletRequest request,HttpServletResponse response, String url) {
try {
System.out.println("-- dispatch: " + url);
RequestDispatcher rd= request.getRequestDispatcher(url);
rd.forward(request, response);
} catch(Exception e){}
}
6. Las clases axiliares de AvisoDAO y AvisoVO son como siguen:
public class AvisoDAO {
List listAvisos = null;
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rset = null;
try {
AvisoVO item = null;
String sql = "SELECT * FROM TBL_AVISO A, TBL_AVISO_DET B
WHERE B.IDAVISO = A.IDAVISO
AND A.ESTATUS = 'A' ORDER BY A.FECHA DESC, SECUENCIA ASC
conn = DBManager.getConnection();
pstm = conn.prepareStatement(sql);
pstm.clearParameters();
rset = pstm.executeQuery();
listAvisos = new ArrayList();
String key = "";
boolean primero = true;
while( rset.next()) {
String idAviso = rset.getString("IDAVISO").trim();
if( !key.equals(idAviso)) {
if( !primero) {
listAvisos.add(item);
}
item = new AvisoVO();
item.setIdAviso( idAviso);
item.setFecha( rset.getDate("FECHA"));
item.setDetalle( rset.getString("DETALLE"));
primero = false;
key = idAviso;
} else {
item.appendDetalle( rset.getString("DETALLE"));
}
}
if( item != null) {
listAvisos.add(item);
}
System.out.println("----- Total de avisos: " + listAvisos.size());
} catch( Exception e) {
e.printStackTrace();
} finally {
try{ if( rset !=null) rset.close(); }catch( Exception e) {}
try{ if( pstm !=null) pstm.close(); }catch( Exception e) {}
try{ if( conn !=null) conn.close(); }catch( Exception e) {}
}
}
public class AvisoVO {
private Date fecha;
private String idAviso;
private String detalle;
public void appendDetalle(String detalle) {
if( this.detalle == null) {
this.detalle = detalle;
} else {
this.detalle += detalle;
}
}
getters() ..
setters() ..
}
7. Las tablas tienen la siguiente estructura:
CREATE TABLE TBL_AVISO (
IDAVISO CHAR(10),
FECHA DATE,
ESTATUS CHAR(1),
PRIMARY KEY(IDAVISO)
);
CREATE TABLE TBL_AVISO_DET (
IDAVISO CHAR(10),
SECUENCIA NUMBER,
DETALLE CHAR(250),
PRIMARY KEY(IDAVISO, SECUENCIA)
);
Donde TBL_AVISO tiene el encabezado del aviso, y TBL_AVISO_DET contiene el mensaje del aviso, se tiene esta estructura ya que el mensaje se encuentra en el campo de DETALLE y si este supera los 250 caracteres se tiene que crear otro registro en la tabla de AVISO_DET con un numero de secuencia mayor, un ejemplo de aviso seria:
INSERT INTO SIPAB_AVISO VALUES ('TEST',SYSDATE,'A');
INSERT INTO SIPAB_AVISO_DET VALUES('TEST',0,'Mensaje de Prueba');
INSERT INTO SIPAB_AVISO_DET VALUES('TEST',1,' continucacion del mensaje de prueba');
Integrando esta parte con el primer Post estará listo y funcional un componente para Mostrar Avisos Básico y puede ser posicionado en cualquier parte de la página.
Todos los comentarios, sugerencias y dudas son bien recibidos.