Сервлеты выполняемые на одном сервере иногда совместно используют ресурсы. Это справедливо для сервлетов, которые являются компонентами одного приложения, как, например, сервлеты магазина Duke's Bookstore. Сервлеты исполняемые на одном сервере могут совместно использовать ресурсы с помощью методов интерфейса ServletContext для манипулирования атрибутами: setAttribute, getAttribute, и removeAttribute.

Отметим что использование атрибутов — один из способов удаления устаревшего метода getServlet из предшествующих JSDK2.1 версий сервлетов.

Договоренности именования атрибутов

Все сервлеты в контексте совместно используют атрибуты, находящиеся в интерфейсе ServletContext. Чтобы избежать столкновений имен атрибутов, имена их используют те же правила что и имена пакетов. Например, сервлеты магазина Duke's Bookstore совместно используют атрибут examples.bookstore.database.BookDBFrontEnd. Имена, начинающиеся с префиксов java.*, javax.*, и sun.* зарезервированы.

 

setAttribute — установка атрибута

Сервлеты устанавливают атрибуты, используя метод ServletContext.setAttribute; обычно это производится во время инициализации. Когда у Вас несколько сервлетов используют атрибут, каждый должен проинициализировать этот атрибут. А раз так, каждый сервлет должен проверить значение атрибута, и устанавливать его только в том случае если предыдущий сервлет не сделал этого.

Следующий пример демонстрирует метод init сервлета CatalogServlet, который пробует установить совместно-используемый атрибут для магазина Duke's Bookstore:

public class CatalogServlet extends HttpServlet { 
    public void init() throws ServletException {
        BookDBFrontEnd bookDBFrontEnd = ...
        if (bookDBFrontEnd == null) {
            getServletContext().setAttribute(
                    "examples.bookstore.database.BookDBFrontEnd",
                    BookDBFrontEnd.instance());
        }
    }
    ...
}

Если сервлет установил атрибут, каждый другой сервлет в том же контексте может запрашивать его значение, переопределять это значение, или удалять атрибут.

 

getAttribute — получение значения атрибута

Получение значения атрибута также просто как вызов метода ServletContext.getAttribute. Следующий пример демонстрирует, как сервлет CatalogServlet получает значение атрибута во время инициализации:

public class CatalogServlet extends HttpServlet { 
    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());
        }
    }
    ...
}
 

removeAttribute — удаление атрибута

Любой сервлет может удалить атрибут из объекта ServletContext. Поскольку атрибуты являются совместно используемыми, Вам надо проявить осторожность, чтобы не удалить атрибут, который используется в этот момент другим сервлетом. Duke's Bookstore не использует метод removeAttribute.

 

Конвертация сервлетов из JSDK2.0

Это замечание относится к сервлетам написанным под JSDK2.0: Методы для управления атрибутами могут оказаться полезными, если Вы удаляете обращения к методу getServlet. Эти методы, разработанные для сервлетов, которые вызывают метод getServlet и затем вызывают общедоступные методы отличные от метода service.

Для удаление обращений к методу getServlet из этих сервлетов проделайте следующие четыре пункта:

  1. Замените сервлет с обращением к методу getServlet на класс не являющийся сервлетом.
  2. Назовите атрибут, который будет поддерживать состояние нового класса для использования сервлетами вызывающими метод getServlet.
  3. Замените все вызовы метода getServlet вызовами значения вышеуказанного атрибута.
  4. Замените обращения к методам объекта Servlet на обращения к методам состояния возвращенного от атрибута.