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.
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);
}
}
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");
}
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) {}
}
}
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);
}
}