...
Contenido de la Aplicación
La aplicación Inventario consiste en En el inventario de la aplicación se encuentra la siguiente lista de paquetes.
- org.apache.geronimo.samplesejemplos.dbtester.beans
- DBManagerBean - Corazón de la aplicación, el cual controla la mayor parte de la lógica de la aplicación (incluyendo el acceso al Kernel de Geronimo).
- org.apache.geronimo.samplesejemplos.dbtester.web
- ContentTableServlet - Obtiene el contenido de una tabla de la Base de Datos y le dirige a la capa de presentación.
- ListTablesServlet - Obtiene la lista de esquemas y tablas asociadas a una pool de conexiones a BD.
La lista de los archivos web de la aplicación, se ilustran en el diagrama siguiente.
Code Block | ||||
---|---|---|---|---|
| ||||
|- jsp | |- commoncontenido_de_errortabla.jsp | |- popuperror_comun.jsp | |- tablelista_de_contenttablas.jsp | |- table_listpopup.jsp |- WEB-INF | |- geronimo-web.xml | |- web.xml |- index.jsp |
geronimo-web.xml define la lista de dependencias que deben ser cargadas al por el cargador de clases de la aplicación web.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"> <environment> <moduleId> <groupId>org.apache.geronimo.samples.dbtester</groupId> <artifactId>dbtester</artifactId> <version>1.0</version> </moduleId> <dependencies> <dependency> <groupId>geronimo</groupId> <artifactId>geronimo-kernel</artifactId> </dependency> <dependency> <groupId>geronimo</groupId> <artifactId>geronimo-connector</artifactId> </dependency> <dependency> <groupId>geronimo</groupId> <artifactId>geronimo-management</artifactId> </dependency> <dependency> <groupId>mx4j</groupId> <artifactId>mx4j</artifactId> </dependency> </dependencies> </environment> <context-root>/dbtester</context-root> </web-app> |
web.xml define dos servlets que actuarán como la capa de control entre la capa de presentación y la capa de servicio.
...
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>ContentTableServlet</display-name>
<servlet-name>ContentTableServlet</servlet-name>
<servlet-class>
org.apache.geronimo.samples.dbtester.web.ContentTableServlet
</servlet-class>
</servlet>
<servlet>
<display-name>ListTablesServlet</display-name>
<servlet-name>ListTablesServlet</servlet-name>
<servlet-class>
org.apache.geronimo.samples.dbtester.web.ListTablesServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContentTableServlet</servlet-name>
<url-pattern>/listContent</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ListTablesServlet</servlet-name>
<url-pattern>/listTables</url-pattern>
</servlet-mapping>
</web-app>
La parte más importante en esta aplicación es el cómo tener acceso al kernel de Geronimo y asà obtener la lista de las pools de conexiones a bases de datos que se encuentren activas. Esta tarea es constrolada por la clase DBManagerBean.
...
private void init(){
Kernel kernel = KernelRegistry.getSingleKernel();
Set cfList = kernel.listGBeans(new AbstractNameQuery(ConnectionFactorySource.class.getName()));
for(Iterator iterator = cfList.iterator();iterator.hasNext();){
AbstractName name = (AbstractName)iterator.next();
try {
Object rs = kernel.invoke(name, "$getResource", new Object[]{}, new String[]{});
if(rs instanceof javax.sql.DataSource){
DataSource ds = (DataSource)rs;
poolMap.put(name.getArtifact().getArtifactId(), ds);
}
} catch (GBeanNotFoundException e) {
e.printStackTrace();
} catch (NoSuchOperationException e) {
e.printStackTrace();
} catch (InternalKernelException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.1"
xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.1"
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1">
<sys:environment>
<sys:moduleId>
<sys:groupId>org.apache.geronimo.ejemplos</sys:groupId>
<sys:artifactId>dbtester</sys:artifactId>
<sys:version>1.0</sys:version>
<sys:type>car</sys:type>
</sys:moduleId>
<sys:dependencies>
<sys:dependency>
<sys:groupId>geronimo</sys:groupId>
<sys:artifactId>geronimo-kernel</sys:artifactId>
</sys:dependency>
<sys:dependency>
<sys:groupId>geronimo</sys:groupId>
<sys:artifactId>geronimo-connector</sys:artifactId>
</sys:dependency>
<sys:dependency>
<sys:groupId>geronimo</sys:groupId>
<sys:artifactId>geronimo-management</sys:artifactId>
</sys:dependency>
<sys:dependency>
<sys:groupId>mx4j</sys:groupId>
<sys:artifactId>mx4j</sys:artifactId>
</sys:dependency>
</sys:dependencies>
</sys:environment>
<context-root>/dbtester</context-root>
</web-app>
|
web.xml define dos servlets que actuarán como la capa de control entre la capa de presentación y la capa de servicio.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>dbtester</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>ContentTableServlet</display-name>
<servlet-name>ContentTableServlet</servlet-name>
<servlet-class>
org.apache.geronimo.ejemplos.dbtester.web.ContentTableServlet
</servlet-class>
</servlet>
<servlet>
<display-name>ListTablesServlet</display-name>
<servlet-name>ListTablesServlet</servlet-name>
<servlet-class>
org.apache.geronimo.ejemplos.dbtester.web.ListTablesServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContentTableServlet</servlet-name>
<url-pattern>/listContent</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ListTablesServlet</servlet-name>
<url-pattern>/listTables</url-pattern>
</servlet-mapping>
</web-app>
|
La parte más importante en esta aplicación es el cómo tener acceso al kernel de Geronimo y asà obtener la lista de las pools de conexiones a bases de datos que se encuentren activas. Esta tarea es constrolada por la clase DBManagerBean.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
private void init() {
Kernel kernel = KernelRegistry.getSingleKernel();
Set cfList = kernel.listGBeans(new AbstractNameQuery(
ConnectionFactorySource.class.getName()));
for (Iterator iterator = cfList.iterator(); iterator.hasNext();) {
AbstractName name = (AbstractName) iterator.next();
try {
Object rs = kernel.invoke(name, "$getResource",
new Object[] {}, new String[] {});
if (rs instanceof javax.sql.DataSource) {
DataSource ds = (DataSource) rs;
poolMap.put(name.getArtifact().getArtifactId(), ds);
}
} catch (GBeanNotFoundException e) {
e.printStackTrace();
} catch (NoSuchOperationException e) {
e.printStackTrace();
} catch (InternalKernelException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
Para obtener la lista de esquemas y sus tablas, la aplicación usa metadatos de la base de datos proporcionados por un controlador JDBC. Metadata de ResultSet ha sido usada para obtener datos relacionados con registros y para desplegar el contenido de la base de datos. El siguiente código snippet ilustra el cómo solicita la aplicación a los esquemas y a sus tablas en un DataSource.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public Map getTableList(String poolName) throws SQLException {
tableMap = new HashMap();
if (poolMap.containsKey(poolName)) {
DataSource ds = (DataSource) poolMap.get(poolName);
Connection con = null;
try {
con = ds.getConnection();
DatabaseMetaData metaData = con.getMetaData();
String[] tableTypes = { "TABLE" };
ResultSet rs = metaData.getTables(null, null, null, tableTypes);
while (rs.next()) {
String schemaName = rs.getString("TABLE_SCHEM");
String tableName = rs.getString("TABLE_NAME");
ArrayList tableList = null;
if (tableMap.containsKey(schemaName)) {
tableList = (ArrayList) tableMap.get(schemaName);
tableList.add(tableName);
} else {
tableList = new ArrayList();
tableList.add(tableName);
}
tableMap.put(schemaName, tableList);
}
} catch (SQLException e) {
throw e;
} finally {
if (con != null) {
try {
con.close();
|
Para obtener la lista de esquemas y sus tablas, la aplicación usa metadata de base de datos proporcionada en un controlador JDBC. Meta data de ResultSet ha sido usada para obtener datos relacionados con registros y para despliegar el contenido de la base de datos. El siguiente código snippet ilustra el cómo solicita la aplicación a los esquemas y a sus tablas en un DataSource.
Code Block | |
---|---|
java | java |
borderStyle | solid |
title | DBManagerBean.java | public Map getTableList(String poolName) throws SQLException { tableMap = new HashMap(); if(poolMap.containsKey(poolName)){ DataSource ds = (DataSource)poolMap.get(poolName); Connection con = null; try { con = ds.getConnection(); DatabaseMetaData metaData = con.getMetaData(); String[] tableTypes = {"TABLE"}; ResultSet rs = metaData.getTables(null, null, null, tableTypes); while(rs.next()){ String schemaName = rs.getString("TABLE_SCHEM"); String tableName = rs.getString("TABLE_NAME"); ArrayList tableList = null; if(tableMap.containsKey(schemaName)){ tableList = (ArrayList)tableMap.get(schemaName); tableList.add(tableName); }else { tableList = new ArrayList(); tableList.add(tableName); } tableMap.put(schemaName, tableList); } } catch (SQLException e) { throw e; }finally { if(con != null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } } } } return tableMap; } |
Herramientas usadas
Las herramientas usadas para el desarrollo y construcción de la aplicación ejemplo DB Listdbtester, han sido:
Eclipse
El IDE Eclipse fue usado para el desarrollo de esta aplicación ejemplo. Es una herramienta de desarrollo muy poderosa, popular y open-source. También están disponibles plug-ins de integración con el servidor de aplicaciones Geronimo. Eclipse puede ser descargado de la siguiente URL:
http://www.eclipse.org, popular y open-source. También están disponibles plug-ins de integración con el servidor de aplicaciones Geronimo. Eclipse puede ser descargado de la siguiente URL:
http://www.eclipse.org
_NOTA: en la traducción al español, se hizo la adaptación al IDE EclipseWTP (http://www.eclipse.org/webtools) junto con el plugin de integración con Geronimo: g-eclipse-plugin-1.1.x-deployable (http://geronimo.apache.org/devtools.html)_
Apache Maven 2
Maven es una herramienta popular de construcción open-source para proyectos Java enterprise, diseñada para facilitar el tedioso trabajo del proceso de construcción. Maven usa una propuesta declarativa, donde la estructura del proyecto y su contenido se describen, en lugar de la propuesta basada-en-tareas que emplea, por ejemplo, Ant ó en archivos make tradicionales. Esto ayuda a consolidar estándares comúnes-en-grupo y reduce el tiempo requerido para escribir y mantener scripts de construcción. La propuesta declarativa, basada-en-ciclo-de-vida que usa Maven 1 es, para muchos, un salto radical de las técnicas tradicionales de construcción, y Maven 2 da mayor énfasis en ese sentido. Maven 2 puede ser descargado de la siguiente URL:
http://maven.apache.org
_NOTA: En la traducción al español no se empleó Maven2_
Regresar a la sección superior
FALTA TRADUCCION ----------------->
...
Construyendo y Activando la Aplicación Ejemplo
Anchor | ||||
---|---|---|---|---|
|
Download the dbtester application from the following linkDescarga la aplicación dbtester de la siguiente liga:
dbtester
After extracting the zip file, the dbtester directory will be created.
Building
dbtester application comes with a Maven 2 script to help users to build from source code. Open a command prompt window and navigate to the dbtester directory and issue the mvn clean install command. This will create a dbtester-1.0.war file under the target folder within dbtester. Now,dbtester web application is ready to be deployed on the Geronimo Application server.
Deploying
Deploying sample application is pretty straight forward, since we will be using Geronimo Console.
- Navigate to Deploy New link from the Console Navigation panel.
- Load dbtester-1.0.war file from dbtester/target folder onto the Archive input box.
- Press Install button to deploy the application in the server.
...
Después de extraer el archivo zip, el directorio dbtester será creado. Como alternativa, puedes importar directamente al archivo zip en un nuevo proyecto dbtester dentro de EclipseWTP; sólo faltarÃa configurar a .project y .classpath en el proyecto, al dar de alta de un servidor Geronimo en dicho IDE.
Construcción
Al emplear la perspectiva J2EE dentro de EclipseWTP, basta con elegir exportar al proyecto como archivo WAR.
Activación
Activar dbtester es bastante simple, al emplear la Consola de Geronimo.
- Navega a la liga Deploy New (Activar Nuevo) del panel Console Navigation _(Navegación de Consola)_.
- Carga al archivo dbtester.war, ubicado en el directorio destino de tu exportación a WAR, dentro al campo Archive.
- Presina al botón Install para activar la aplicación en el servidor.
Regresar a la sección superior
Probando la Aplicación Ejemplo
Anchor | ||||
---|---|---|---|---|
|
También puedes aprovechar al plugin g-eclipse-plugin-1.1.x-deployable para agregar y probar al proyecto dentro de EclipseWTP, mediante la opción Add and Remove Projects..., la cual se encuentra disponible a partir del servidor Geronimo de tu workspace.
Con ello puedes probar la aplicación mediante un explorador web, en la dirección *
...
To test the sample application, open a browser and type http://localhost:8080/dbtester. This will load the index page of dbtester application which acts as a notice board, with the list of database pools deployed in Geronimo.
The user can directly test the listed database pools with this sample application. Furthermore, the application can be used to list the contents of the databases.
...
*. Lo anterior cargará la página Ãndice de la aplicación, la cual actua como notificador de la lista de pools de bases de datos que se encuentren activas en Geronimo.
El usuario puede probar directamente a las pools enlistadas en esta aplicación. Además, la aplicación puedes ser usada para listar el contenido de las bases de datos.
Resumen
Anchor | ||||
---|---|---|---|---|
|
This article has shown you how to access Geronimo related features from a J2EE application. You followed step-by-step instructions to build, deploy and test a sample application to elaborate these features. This sample application can be used as tester for database connection pools deployed in Geronimo.
<----------------- FALTA TRADUCCIONEste artÃculo te ha mostrado como tener acceso a recursos de Geronimo a partir de una aplicación J2EE. Con esto puedes construir, activar y probar una aplicación ejemplo para comprobar el acceso a algunos recursos. Esta aplicación ejemplo puede ser usada como un tester para pools de conexiones a bases de datos activas en Geronimo.