## Métodos de Búsqueda de Bean Controlador

La búsqueda en el contenedor controlador descrita en el capítulo 2 está basada en el mécanismo del método finder donde el descriptor de desarrollo, en lugar del Bean, especifica el comportamiento del método finder. Mientras el mecanismo del método finder funciona bien para consultas sencillas, no puede manejar operaciones complejas que impliquen más de un tipo de Bean o tablas de bases de datos. También, la especificación 1.1 de los JavaBeans de Enterprise actualmente no proporciona para poner las reglas del método finder en el descriptor de desarrollo.

Por eso, para consultas y búsquedas más complejas, tenemos que escribir búsquedas y consultas controladas por el Bean. Esta sección explica cómo escribir una versión de la facilidad de búsqueda de la casa de subastas controlada por el Bean. La búsqueda controlada por el Bean inplica cambios en el método AuctionServlet.searchItems y un nuevo Bean de sesión, SearchBean.

- AuctionServlet.searchItems
- SearchBean

### AuctionServlet.searchItems

La búsqueda empieza cuando el usuario final envía una cadena de búsqueda a la facilidad de búsqueda de la página principal de la casa de subastas, y pulsa el boton Submit. Esto llama a AuctionServlet, que recupera la cadena de búsqueda desde la cabecera HTTP y la pasa al método searchItem.

> Nota: La lógica de búsqueda para este ejemplo es bastante simple. El propósito es mostrar cómo mover la lógica de búsqueda a otro Bean Enterprise separado para que podamos mover búsquedas más complejas nosotros solos.

La operación searchItem se hace en dos partes: 1) usar la cadena de búsqueda para recuperar las claves primarias, y 2) usar las claves primarias para recuperar los ítems de la subasta

Parte 1: Lo primero que hace el método searchItems es pasar la cadena de búsqueda enviada por el usuario final al Bean de sesión SearchBean.

SearchBean (descrito en la siguiente sección) implementa una búsqueda controlada por Bean que recupera una lista de claves primarias para todos los ítems de la subasta cuyo campo Summary contenga caracteres que correspondan con los de la cadena de búsqueda. Esta lista es devuelta al método searchItems en una variable Enumeration.

>     Enumeration enum=(Enumeration)
>       search.getMatchingItemsList(searchString);

Parte 2: El método searchItems usa la lista Enumeration devuelta en la parte 1 y usa AuctionItemBean para recuperar cada Bean por turno llamando a findByPrimaryKey sobre cada clave primaria de la lista. Esta es una búsqueda controlada por contenedor basada en el mecanismo del método finder descrito en el capítulo 2.

>     //Iterate through search results
>     while ((enum != null) &&
>         enum.hasMoreElements())) {
>      while(enum.hasMoreElements(in)) {

>     //Locate auction items
>      AuctionItem ai=ahome.findByPrimaryKey((
>         AuctionItemPK)enum.nextElement());
>      displayLineItem(ai, out);
>      }
>     }

### SearchBean

La clase SearchBean.java define una búsqueda controlada por el Bean para claves primarias de ítems de subasta con los campos summary que contienen caracteres que corresponden con la cadena de búsqueda. Este Bean establece una conexión con la base de datos, y proporciona los métodos getMatchingItemsList y EJBCreate.

#### Conexión con la Base de Datos

Como este Bean controla su propio acceso a la base de datos, tiene que establecer su propia conexión con ella. No puede delegar esto al contenedor..

La conexión con la base de datos se establece ejemplarizando una clase Driver estática y proporcionando el método getConnection. Este método requiere una clase estática DriverManager para registrar un driver con la base de datos que corresponda con la URL. En este caso la URL es weblogic.jdbc.jts.Driver.

>     //Establish database connection
>       static {
>         new weblogic.jdbc.jts.Driver();
>       }

>       public Connection getConnection()
>             throws SQLException {
>         return DriverManager.getConnection(
>             "jdbc:weblogic:jts:ejbPool");
>       }

#### Obtener la Lista de Ítems Encontrados

El método getMatchingItemsList busca AuctionItemsBean y crea un objeto PreparedStatement para hacer una consulta a la base de datos por los campos summary que contengan la cadena de búsqueda. Los datos se leen desde la base de datos dentro de un ResultSet, almacenado en un Vector, y devuelto a AuctionServlet.

>       public Enumeration getMatchingItemsList(
>     	String searchString)
>     	throws RemoteException {

>         ResultSet rs = null;
>         PreparedStatement ps = null;
>         Vector v = new Vector();
>         Connection con = null;

>         try{
>     //Get database connection
>           con=getConnection();
>     //Create a prepared statement for database query
>           ps=con.prepareStatement("select id from
>     	auctionitems where summary like ?");
>           ps.setString(1, "%"+searchString+"%");
>     //Execute database query
>           ps.executeQuery();
>     //Get results set
>           rs = ps.getResultSet();
>     //Get information from results set
>           AuctionItemPK pk;
>           while (rs.next()) {
>             pk = new AuctionItemPK();
>             pk.id = (int)rs.getInt(1);
>     //Store retrieved data in vector
>     	v.addElement(pk);
>           }
>           rs.close();
>           return v.elements();

>         }catch (Exception e) {
>     	System.out.println("getMatchingItemsList:
>     			    "+e);
>     	return null;
>         }finally {
>           try {
>     	 if(rs != null) {
>                rs.close();
>              }
>     	 if(ps != null) {
>                ps.close();
>              }
>     	 if(con != null) {
>                con.close();
>              }
>           } catch (Exception ignore) {}
>         }
>       }

#### Método Create

El método ejbCreate crea un objeto javax.naming.InitialContext. Esta es una clase JNDI (Java Nanimg and Directory) que permite a SearchBean acceder a la base de datos sin relacionarse con el contenedor:

>       public void ejbCreate() throws CreateException,
>         RemoteException {
>         Properties p = new Properties();
>         p.put(Context.INITIAL_CONTEXT_FACTORY,
>     	"weblogic.jndi.TengahInitialContextFactory");
>         try{
>     	ctx = new InitialContext(p);
>         }catch(Exception e) {
>     	System.out.println("create exception: "+e);
>         }
>       }

Ozito