Oracle JavaServer Pages Developer's Guide and Reference Release 8.1.7 Part Number A83726-01 |
Library | Service | Contents | Index

## JSP Resource Management

The `javax.servlet.http` package offers a standard mechanism for managing session resources. Additionally, Oracle provides extensions for managing application, session, page, and request resources.

### Standard Session Resource Management--HttpSessionBindingListener

A JSP page must appropriately manage resources acquired during its execution, such as JDBC connection, statement, and result set objects. The standard `javax.servlet.http` package provides the `HttpSessionBindingListener` interface and `HttpSessionBindingEvent` class to manage session-scoped resources. Through this mechanism, a session-scoped query bean could, for example, acquire a database cursor when the bean is instantiated and close it when the HTTP session is terminated. (The example in "JSP Starter Sample for Database Access" opens and closes the connection for each query, which adds overhead.)

This section describes use of the `HttpSessionBindingListener` `valueBound()` and `valueUnbound()` methods.

Note: The bean instance must register itself in the event notification list of the HTTP session object, but the `jsp:useBean` statement takes care of this automatically.

#### The valueBound() and valueUnbound() Methods

An object that implements the `HttpSessionBindingListener` interface can implement a `valueBound()` method and a `valueUnbound()` method, each of which takes an `HttpSessionBindingEvent` instance as input. These methods are called by the servlet container--the `valueBound()` method when the object is stored in the session; the `valueUnbound()` method when the object is removed from the session or when the session times-out or becomes invalid. Usually, a developer will use `valueUnbound()` to release resources held by the object (in the example below, to release the database connection).

Note: OracleJSP provides extensions for additional resource management, allowing you to program JavaBeans to manage page-scoped, request-scoped, or application-scoped resources as well as session-scoped resources. See "OracleJSP Event Handling--JspScopeListener".

The next section, "JDBCQueryBean JavaBean Code", provides a sample JavaBean that implements `HttpSessionBindingListener` and a sample JSP page that calls the bean.

#### JDBCQueryBean JavaBean Code

Following is the sample code for `JDBCQueryBean`, a JavaBean that implements the `HttpSessionBindingListener` interface. (It uses the JDBC OCI driver for its database connection; use an appropriate JDBC driver and connection string if you want to run this example yourself.)

`JDBCQueryBean` gets a search condition through the HTML request (as described in "The UseJDBCQueryBean JSP Page"), executes a dynamic query based on the search condition, and outputs the result.

This class also implements a `valueUnbound()` method (as specified in the `HttpSessionBindingListener` interface) that results in the database connection being closed at the end of the session.

    package mybeans;

    import java.sql.*;
    import javax.servlet.http.*;

    public class JDBCQueryBean implements HttpSessionBindingListener
    {
      String searchCond = "";
      String result = null;

      public void JDBCQueryBean() {
      }

      public synchronized String getResult() {
        if (result != null) return result;
        else return runQuery();
      }

      public synchronized void setSearchCond(String cond) {
        result = null;
        this.searchCond = cond;
      }

      private Connection conn = null;

      private String runQuery() {
        StringBuffer sb = new StringBuffer();
        Statement stmt = null;
        ResultSet rset = null;
        try {
          if (conn == null) {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            conn = DriverManager.getConnection("jdbc:oracle:oci8:@",
                                               "scott", "tiger");

          }

          stmt = conn.createStatement();
          rset = stmt.executeQuery ("SELECT ename, sal FROM scott.emp "+
                (searchCond.equals("") ? "" : "WHERE " + searchCond ));
          result = formatResult(rset);
          return result;

        } catch (SQLException e) {
          return ("<P> SQL error: <PRE> " + e + " </PRE> </P>\n");
        }
        finally {
          try {
            if (rset != null) rset.close();
            if (stmt != null) stmt.close();
          }
          catch (SQLException ignored) {}
        }
      }

      private String formatResult(ResultSet rset) throws SQLException  {
        StringBuffer sb = new StringBuffer();
        if (!rset.next())
          sb.append("<P> No matching rows.<P>\n");
        else {
          sb.append("<UL><B>");
          do {  sb.append("<LI>" + rset.getString(1) +
                " earns $ " + rset.getInt(2) + "</LI>\n");
          } while (rset.next());
          sb.append("</B></UL>");
        }
        return sb.toString();
      }

      public void valueBound(HttpSessionBindingEvent event) {
        // do nothing -- the session-scoped bean is already bound
      }

      public synchronized void valueUnbound(HttpSessionBindingEvent event) {
        try {
          if (conn != null) conn.close();
        }
        catch (SQLException ignored) {}
      }
    }

Note: The preceding code serves as a sample only. This is not necessarily an advisable way to handle database connection pooling in a large-scale Web application.

#### The UseJDBCQueryBean JSP Page

The following JSP page uses the `JDBCQueryBean` JavaBean defined in the preceding section ("JDBCQueryBean JavaBean Code"), invoking the bean with `session` scope. It uses `JDBCQueryBean` to display employee names that match a search condition entered by the user.

`JDBCQueryBean` gets the search condition through the `jsp:setProperty` command in this JSP page, which sets the `searchCond` property of the bean according to the value of the `searchCond` request parameter input by the user through the HTML form. (The HTML `INPUT` tag is what specifies that the search condition entered in the form be named `searchCond`.)

    <jsp:useBean id="queryBean" class="mybeans.JDBCQueryBean" scope="session" />
    <jsp:setProperty name="queryBean" property="searchCond" />

    <HTML>
    <HEAD> <TITLE> The UseJDBCQueryBean JSP  </TITLE> </HEAD>
    <BODY BGCOLOR="white">

    <% String searchCondition = request.getParameter("searchCond");
       if (searchCondition != null) { %>
          <H3> Search results for : <I> <%= searchCondition %> </I> </H3>
          <%= queryBean.getResult() %>
          <HR><BR>
    <% }  %>

    <B>Enter a search condition for the EMP table:</B>

    <FORM METHOD="get">
    <INPUT TYPE="text" NAME="searchCond" VALUE="ename LIKE 'A%' " SIZE="40">
    <INPUT TYPE="submit" VALUE="Ask Oracle">
    </FORM>

    </BODY>
    </HTML>

Following is sample input and output for this page:

#### Advantages of HttpSessionBindingListener

In the preceding example, an alternative to the `HttpSessionBindingListener` mechanism would be to close the connection in a `finalize` method in the JavaBean. The `finalize` method would be called when the bean is garbage-collected after the session is closed. The `HttpSessionBindingListener` interface, however, has more predictable behavior than a `finalize` method. Garbage collection frequency depends on the memory consumption pattern of the application. By contrast, the `valueUnbound()` method of the `HttpSessionBindingListener` interface is called reliably at session shutdown.

### Overview of Oracle Extensions for Resource Management

Oracle provides the following extensions for managing application and session resources as well as page and request resources:

- `JspScopeListener`--for managing application, session, page, or request resources

  For information, see "OracleJSP Event Handling--JspScopeListener".

- `globals.jsa` application and session events--for start and end events for applications and sessions, typically in a servlet 2.0 environment such as Apache/JServ

  See "The globals.jsa Event Handlers" for information.

| Copyright © 1996-2000, Oracle Corporation. All Rights Reserved. |
Library | Service | Contents | Index