1. Java-сервлеты. Особенности реализации, ключевые методы, преимущества и недостатки относительно CGI и FastCGI.
Cервлет — это серверный сценарий, написанный на Java
- Жизненный Цикл
Сервлеты имеют жизненный цикл, управляемый контейнером сервлетов (веб-контейнером). Методы init(), service(), и destroy() основные в этом цикле.
- Потокобезопасность
Одному экземпляру сервлета могут одновременно обращаться несколько потоков. Это нужно учитывать для обеспечения потокобезопасности.
- Конфигурация
Можно настроить через аннотации или в web.xml.
init(): вызывается при инициализации сервлета.doGet(),doPost(): обрабатывают GET и POST запросы соответственно.service(): выбирает конкретный метод для обработки в зависимости от типа HTTP-запроса.destroy(): вызывается при завершении работы сервлета.
- Производительность: Сервлеты более производительны, так как они работают в отдельных потоках на веб-контейнере. В CGI, для каждого запроса создается новый процесс, что тяжелее с точки зрения системных ресурсов.
- Полноценный API: Сервлеты имеют доступ к мощному Java API, включая возможности для работы с сетью, базами данных и т.д.
- Портабельность: Благодаря JVM, сервлеты могут работать на любой операционной системе без изменения кода.
- Стартовые затраты по ресурсам: Сервлеты требуют больше памяти при инициализации по сравнению с FastCGI.
- Возможны конфликты при параллельной обработке запросов
Контейнер сервлетов — это часть веб-сервера, которая управляет жизненным циклом сервлетов, маршрутизацией запросов, и другими задачами.
- Загрузка класса сервлета
- Создание экземпляра сервлета (отвечает веб-контейнер)
- Инициализация: Вызывается метод
init(). - Обработка запросов (service): Методы
doGet(),doPost(), и т.д. вызываются в зависимости от типа запроса. - Завершение: Вызывается метод
destroy().
- Сервлеты могут делегировать обработку запросов другим ресурсам (сервлетам, JSP и HTML-страницам).
- Диспетчеризация осуществляется с помощью
реализаций интерфейса
javax.servlet.RequestDispatcher. - Два способа получения
RequestDispatcher— черезServletRequest(абсолютный или относительный URL) иServletContext(только абсолютный URL). - Два способа делегирования обработки запроса —
forwardиinclude.
Сервлетный фильтр занимается пред- и постобработкой запроса до и после передачи ресурсу.
Основой для формирования фильтров служит интерфейс javax.servlet.Filter, который реализует три метода:
void init (FilterConfig config) throws ServletException;
void destroy ();
void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; -
передает управление след. фильтру / ресурсу => возможна реализация последовательностей
фильтров для обработки одного и того же запроса.
Назначение: Сохранение состояния между различными запросами от одного и того же пользователя, привязана к конкретному приложению
Взаимодействие с сессией: Сервлеты взаимодействуют с сессией через интерфейс HttpSession, позволяет идентифицировать клиента
при обработке множества HTTP запросов от него. Экземпляр создается при первом обращении и сохраняется опр. время.
HttpSession session = request.getSession();
session.setAttribute("username", "John");Способы передачи идентификатора сессии: Cookies, добавление к URL, Hidden Form Fields. Если удалить - создастся новая сессия
Контекст сервлета - API, с помощью которого сервлет может взаимодействовать со своим контейнером.
Назначение: Хранение данных, которые доступны всем сервлетам в приложении.
Взаимодействие: Сервлеты взаимодействуют с контекстом через интерфейс ServletContext.
ServletContext context = getServletContext();
context.setAttribute("globalData", "someValue");На каждом экземпляре JVM контейнером создается свой контекст
JSP страницы - текстовые файлы, содержащие статический HTML и JSP-элементы
- Внедрение Java-кода в HTML: Возможность использовать Java-код внутри HTML-страницы.
- Преимущества: Удобство в создании динамических страниц, разделение бизнес-логики и представления, высокая производительность, платф.-назвис., Java API.
- Недостатки: Сложность поддержки и отладки, конфликты при || обработке запросов
- Генерация динамического HTML, создание простых веб-приложений.
- Трансляция JSP в код сервлета (.jsp -> .java)
- Компиляция сервлета (.java -> .class)
- Загрузка сервлета веб-контейнером
- Создание экземпляра сервлета
- Инициализация: Вызывается метод
init(). - Обработка запросов (_jspService): Методы
doGet(),doPost(), и т.д. вызываются в зависимости от типа запроса. - Завершение: Вызывается метод
destroy().
-
<%-- Это JSP-комментарий, виден только в JSP коде, не виден в response и сервлете --%>
-
<!-- Это HTML комментарий, появится в response --> -
<%
/* Это Java коммент, появится в сервлете, но
непоявится в response */%>
Управляют процессом трансляции страницы в сервлет
Page Directive: Управляет общим поведением страницы.
<%@ page language="java" contentType="text/html" %>Include Directive: Включает содержимое другого файла.
<%@ include file="header.jsp" %>Taglib Directive: Для подключения пользовательских или стандартных тегов.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>Объявления JSP позволяют задавать переменные, методы, внутренние классы и так далее. Существуют на протяжении всего жизенного цикла JSP
<%! int counter = 0; %>
<%! int increment() { return counter++; } %>Для задания Java кода, который будет выполняться при обработке запросов (при вызове _jspService)
<% int x = 10; %>
Для вывода результат вычисления выражений
Текущее время: <%= new java.util.Date() %>
9. Правила записи Java-кода внутри JSP. Стандартные переменные, доступные в скриптлетах и выражениях.
- Код должен быть заключен в соответствующие теги (<% %> для скриптлетов, <%= %> для выражений).
- Использование полноценных Java-конструкций (if-else, loops) допустимо внутри скриптлетов.
request: объект HttpServletRequestresponse: объект HttpServletResponseout: объект JspWritersession: объект HttpSessionapplication: объект ServletContextconfig: ServletConfigpage: java.lang.Objectexception: ThrowablepageContext: jsp.PageContext
JavaBeans — классы в языке Java, написанные по определённым правилам. Они используются для объединения нескольких объектов в один для удобной передачи данных. Представляют собой переиспользуемые куски кода, обычно инкапсулирующие некую бизнес-логику.
Правила описания:
- Класс должен иметь конструктор без параметров, с модификатором доступа public. Такой конструктор позволяет инструментам создать объект без дополнительных сложностей с параметрами.
- Свойства класса должны быть доступны через get, set и другие методы (так называемые методы доступа), которые должны подчиняться стандартному соглашению об именах. Это легко позволяет инструментам автоматически определять и обновлять содержание bean’ов.
- Класс должен быть сериализуем. Это даёт возможность надёжно сохранять, хранить и восстанавливать состояние bean независимым от платформы и виртуальной машины способом.
Специальные теги JSP позволяют легко интегрировать Beans в JSP-страницы.
<jsp:useBean id="user" class="com.example.User"/>
<jsp:setProperty name="user" property="name" value="John"/>
<jsp:getProperty name="user" property="name"/>
<jsp:useBean>: Создает или восстанавливает bean-компонент.<jsp:setProperty>и<jsp:getProperty>: Устанавливают и получают свойства bean-компонентов.<jsp:include>: Включает содержимое другой страницы или ресурса.<jsp:forward>: Перенаправляет запрос на другую страницу или ресурс.
Хотя это не "стандартные" JSP-теги, JSTL часто используется в JSP для предоставления дополнительных функций через теги, такие как циклы, условные операторы и интернационализация. Например:
<c:out>: Выводит текст.<c:forEach>: Цикл.<c:if>: Условный оператор.
<html>
<body>
<jsp:include page="header.jsp"/>
<c:out value="${message}"/>
</body>
</html>Expression Language (EL) в JSP предназначен для упрощения доступа к данным, хранящимся в различных областях (scopes), таких как request, session, application и так далее.
EL обеспечивает более чистый и читаемый способ доступа к атрибутам и параметрам в этих областях по сравнению с традиционными JSP-скриптлетами. Также имеет компактный синтаксис для обращения к массивам, коллекциям и тд.
Доступ к атрибутам
${requestScope.attributeName}${sessionScope.attributeName}${applicationScope.attributeName}
Операции и вычисления
${2 + 2}— результат будет 4.${'Hello ' + 'World'}— результат будет Hello World.
Доступ к свойствам объекта (JavaBean)
${user.name} — доступ к свойству name объекта user.
Java веб-приложения используют файл дескриптора развертывания для определения какие URL будут передаваться определенному сервлету, какие URL требуют аутентификации и др.
Этот дескриптор развертывания называется web.xml и находится в WAR приложения в WEB-INF/ директории. Web.xml – часть стандарта сервлета для веб-приложений.
Конфигурация находится внутри элемента jsp-config
<welcome-file-list>: Устанавливает начальную страницу веб-приложения.<servlet>и<servlet-mapping>: Описывают настройки сервлетов.<context-param>: Общие параметры для всего веб-приложения.
Архитектурные шаблоны:
-
MVC (Model-View-Controller): Разделяет логику приложения, UI и управление пользовательским взаимодействием.
-
MVVM (Model-View-ViewModel): Расширение MVC, добавляет ViewModel для упрощения двустороннего связывания между View и Model.
-
RESTful: Архитектура, основанная на принципах REST, для создания распределенных систем.
-
Microservices: Разделяет приложение на множество независимых, небольших служб, которые могут разрабатываться, развертываться и масштабироваться независимо.
-
Layered Architecture: Разделяет приложение на слои, такие как Presentation, Business и Data Access Layer.
Основные шаблоны проектирования:
- Factory Method: определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.;
- Abstract Factory: Предоставляет интерфейс для создания семейств взаимосвязанных объектов без указания их конкретных классов.
- Builder: Отделяет конструирование сложного объекта от его представления.
- Prototype: Создает новый объект путем копирования существующего объекта.
- Singleton: Гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру.
- Model: Содержит бизнес-логику. Предоставляет данные и методы работы с ними: запросы в базу данных, проверка на корректность (не зависит от представления, не знает как данные визуализировать) и контроллера (не имеет точек взаимодействия с пользователем).
- View: Отображение данных, получение необходимых данных из модели и отправляет их пользователю
- Controller: Обрабатывает запросы и управляет переходами, обеспечивает «связи» между пользователем и системой
-
Model 1: Все обрабатывается на уровне JSP. Не рекомендуется для крупных проектов из-за отсутствия разделения логики; за обработку данных и представление отвечает один и тот же компонент
-
Model 2 (MVC): Рекомендуется для больших проектов. Использует сервлеты в качестве контроллеров и JSP для представления.
-
Model 1: Просто JSP страницы, обработка данных и бизнес-логика встроены прямо в JSP.
-
Model 2: Использует JavaBeans или EJB для бизнес-логики, сервлеты в качестве контроллеров и JSP для представления. Поддерживает разделение логики и представления, что облегчает разработку и тестирование.
Фреймворки для реализации: Apache Struts, Apache Velocity, JSF