3 octubre, 2013
Websphere con JSP. Recuperar datos del iSeries.
En el anterior post os contaba como definir una conexión JDBC en nuestro servidor Websphere para poder recuperar datos de las tablas DB2 del iSeries. Hoy voy a contaros como explotar esa conexión y recuperar datos para nuestra Intranet con el lenguaje JSP.
Dentro de nuestro proyecto Web del servidor WebSphere creamos una página nueva donde vamos a recuperar los datos del iSeries y mostrarlos en una tabla. Esa es la parte fácil, partir de ahí ya podemos complicarnos todo lo que queramos.
Como es lógico, en nuestro fichero JSP lo primero que tenemos que hacer es declarar los tipos de datos necesarios para la conexión
<%! // Definimos variables de la Conexión java.sql.Connection conexionDB = null; java.sql.PreparedStatement pStmt = null; String sql = null; javax.naming.InitialContext ic = null; javax.sql.DataSource ds = null; %>
Posteriormente procedemos a realizar la conexión con el iSeries con el siguiente código
// Conexion a la base de datos try { ic = new javax.naming.InitialContext(); ds = (javax.sql.DataSource) ic.lookup("jdbc/server"); conexionDB = ds.getConnection(); } catch (Exception e) { // gestiona el error producido %> <DIV id="cabeceraerror">Error de Conexion</DIV> <DIV id="textoerror"><%=e.getMessage()%></DIV> <% conexionDB = null; }
Para ello, dentro de un bloque try para controlar un posible error en la conexión, creamos un nuevo contexto ic y lo enganchamos con la conexión al iSeries que declaramos en la configuración del servidor, especificando el nombre que le dimos al Origen de datos, en este caso jdbc/server y luego abrimos la conexión con el getConnection. En caso de producirse un error lo contralaremos en el bloque Catch siguiente y en caso de que no se haya producido la conexión, la variable conexionDB tendrá el valor nulo, con lo cual para seguir con el proceso controlamos que el valor no lo sea.
Bien, en este momento ya estamos conectados al iSeries con el origen de datos y proveedor que definimos anteriormente. Ahora tenemos que recuperar los datos que nos hagan falta. Para ello definimos la variable sql que contiene la sentencia SQL que queremos realizar. Es un String normal y corriente, por lo que podemos complicarlo todo lo que queramos y condicionarlo a variables o parámetros para realizar sentencias condicionales.
sql = "select codigo, descripcion "+ "from articulos "+ "where baja <> '' " + "order by codigo";
Después de definir la sentencia SQL que vamos a ejecutar, hay que decirle que la prepare y ejecute con las siguientes instrucciones
pStmt = conexionDB.prepareStatement(sql); resultado = pStmt.executeQuery();
A partir de aquí, tendremos que ir leyendo los datos generados en la variable resultado con la propiedad next() y recuperando cada valor con las propiedades getString, getDouble, … dependiendo del dato que queramos recuperar.
Un bucle típico para realizar la consulta y mostrar todos los datos sería el siguiente código
while(resultado.next()) { %> <TR> <TD class="DatosInf"><%=resultado.getDouble(1)%></TD> <TD class="DatosInf"><%=resultado.getString(2)%></TD> </TR> <% } // end while
Las propiedades que recuperan los datos del resulSet llevan como parámetro el numero de columna que devuelve la sentencia SELECT. Una buena práctica para realizar un código mas claro es definir variables tipo byte cuyo valor corresponda a cada columna y así usaremos un nombre como parametro para reconocer fácilmente el resultado que estamos tratando. Por ejemplo, en el caso anterior
byte codigo = 1; byte descripcion = 2; while(resultado.next()) { %> <TR> <TD class="DatosInf"><%=resultado.getDouble(codigo)%></TD> <TD class="DatosInf"><%=resultado.getString(descripcion)%></TD> </TR> <% } // end while
Por último, una vez finalizada la consulta debemos cerrar los cursores con las sentencias siguientes
resultado.close(); pStmt.close();
Este ejemplo daría como resultado una tabla HTML con todos los códigos y descripciones de mis artículos. Es una consulta muy simple, pero como ya he comentado, podemos complicarla como queramos para explotar al máximo nuestra base de datos DB2 y crear informes Web en nuestra Intranet.