Интерфейс ServletContext

ServletContext – контекст является объектом общим для всего приложения.

В объекте ServletContext можно хранить какие-либо данные общие для всех сервлетов приложения. И потом эти данные можно извлекать из этого объекта в сервлетах приложения.

Например, из него получать параметры инициализации прописанные в web.xml или сохранять в него какие-то аттрибуты с помощью метода setAttribute, и потом получать их с помощью getAttribute.

Аттрибуты это какие-то данные для внутренней коммуникации сервлетов. Сервлеты могут обмениваться ими в пределах контекста или сессии.

Положим аттрибут в ServletContext в сервлете MyServlet

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

Пример программы:

import java.util.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletContext; import javax.servlet.annotation.*; @WebServlet(“/contextservlet”) public class MyServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{ PrintWriter pw = resp.getWriter(); //Получаем контекст всего приложения. ServletContext scont = getServletContext(); //Создадим аттрибут с именем attrName //и положим туда какие-то данные //В данном случае просто строку “attrVal”. scont.setAttribute(“attrName”, “attrVal”); //getAttributeNames – получаем имена атрибутов. //Вот таким образом можем просмотреть //все атрибуты сервлета. Enumeration attrNames=scont.getAttributeNames(); while(attrNames.hasMoreElements()) { String attrName = attrNames.nextElement(); //выводим значение атрибута pw.println(attrName+”: “+scont.getAttribute(attrName)); pw.println(“-------------“); } //Ниже также несколько полезных методов контекста. //с помощью getRealPath можно вернуть полный путь //сервлета засунув аргументом относительный. pw.println(getServletContext().getRealPath(req.getServletPath())); //Можно получить некоторую информацию о сервере. pw.println(getServletContext().getServerInfo()); } }

Прием этого аттрибута в другом сервлете MyServlet1.

С помощью getAttribute получаем аттрибут из контекста, ранее положенный туда в другом сервлете.

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.*; import javax.servlet.ServletContext; import javax.servlet.http.Cookie; @WebServlet(“/myservlet”) public class MyServlet1 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ PrintWriter pw = resp.getWriter(); //здесь получаем значение атрибута attrName (будет attrVal) ServletContext scont = getServletContext(); String str = scont.getAttribute(“attrName”).toString(); pw.write(str); } }

Скомпилируем файлы сервлетов и в адресной строке перейдем по адресу /contextservlet.

Видим содержимое контекста приложения. Это все аттрибуты, которые в нем хранятся. Внизу можно увидеть тот, который был создан в MyServlet.

Также, как можно увидеть, последние две строки это результат методов getRealPath и getServerInfo.

Если перейдем по пути /myservlet, то можно увидеть значение аттрибута, который был создан в MyServlet.

То есть, очевидно, что аттрибут attrName доступен не в одном сервлете приложения. Он доступен всем сервлетам на уровне контекста.

Интерфейс ServletConfig

Изучите ServletConfig в Java: работа с параметрами инициализации для отдельных сервлетов. Отличия от ServletContext и примеры настройки в web.xml.
Time to read: 15

encodeURL и encodeRedirectURL в Java сервлетах

Разберитесь, как поддерживать сессии в Java сервлетах при отключенных cookies. Используйте encodeURL и encodeRedirectURL для передачи JSESSIONID в URL.
Time to read: 16

Синхронизация в Java сервлете

Узнайте, как обеспечить потокобезопасность в Java сервлетах. Изучите работу с синхронизацией, deprecated SingleThreadModel и лучшие практики для многопоточных сервлетов.
Time to read: 12