Обучение Java. Сервлеты

       

Инициализация сервлета


Когда сервер загружает сервлет, сервер запускает метод сервлета init. Инициализация выполняется, прежде чем сервлет начнет обрабатывать запросы клиентов, и прежде чем сервлет будет уничтожен.

И хотя сервлеты выполняются на много-потокотоковых серверах, у сервлета во время инициализации нет одновременно выполняющихся потоков. Сервер вызывает метод init один раз, затем сервер загрузит сервлет, и больше метод init не вызывается до тех пор, пока сервер не перезагрузит сервлет. Сервер не может перезагрузить сервлет до тех пор, пока он не уничтожит его, используя метод destroy.


По умолчанию инициализация класса HttpServlet инициализирует сервлет и идентифицирует инициализацию. Чтобы проинициализировать сервлет определенным образом, переопределите метод init согласно той версии JSDK, которую используете: метод init(ServletConfig) для версии 2.0 и метод init() для версии 2.1. При переопределении метода init следуйте следующим правилам: 

  • В случае возникновения ошибки инициализации, которая приводит сервлет в состояние неработоспособности, вызывайте исключение UnavailableException.

    Как пример возникновения такого типа ошибок - невозможность установления необходимого сетевого соединения.

  • Не вызывайте метод System.exit. 
  • Только для версии 2.0: Сохраняйте параметр ServletConfig так, чтобы метод getServletConfig мог вернуть эту величину. Самый простой способ реализовать это - надо, чтобы новый метод init вызывал super.init.
  • Здесь приведен пример метода init для версии 2.1:

    public class BookDetailServlet ... {

    public void init() throws ServletException { BookDBFrontEnd bookDBFrontEnd = (BookDBFrontEnd)getServletContext().getAttribute( "examples.bookstore.database.BookDBFrontEnd");

    if (bookDBFrontEnd == null) { getServletContext().setAttribute( "examples.bookstore.database.BookDBFrontEnd", BookDBFrontEnd.instance()); } ... }

    Как видите метод init простой: он пытается получить параметр, и если параметр еще не получил значения, он создает его.

    Есть и другие инициализирующие задачи, которые сервлет может выполнять. Например, если сервлет использует базу данных, метод init может открыть соединение с ней и в случае неудачи вызвать исключение UnavailableException. Ниже приведен псевдокод о том, как мог бы выглядеть метод init:

    public class DBServlet ... {

    Connection connection = null;

    public void init() throws ServletException {

    // Соединяемся с базой данных перед запросами

    try { databaseUrl = getInitParameter("databaseUrl"); ...

    // Тем же способом берем параметры пользователя и пароля

    connection = DriverManager.getConnection(databaseUrl, user, password); } catch(Exception e) { throw new UnavailableException (this, "Could not open a connection to the database"); } } ... }



    Содержание раздела