es
Feedback

¡No caigas en manos de tramposos! Telemetrio encuentra y marca estos canales 👉 Si quieres ver la etiqueta, suscríbete

Java | Вопросы собесов

Java | Вопросы собесов

Ir al canal en Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Mostrar más

📈 Análisis del canal de Telegram Java | Вопросы собесов

El canal Java | Вопросы собесов (@easy_java_ru) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 11 289 suscriptores, ocupando la posición 10 935 en la categoría Tecnologías y Aplicaciones y el puesto 56 548 en la región Rusia.

📊 Métricas de audiencia y dinámica

Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 11 289 suscriptores.

Según los últimos datos del 03 noviembre, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -46, y en las últimas 24 horas de 2, conservando un alto alcance.

  • Estado de verificación: No verificado
  • Tasa de interacción (ER): El promedio de interacción de la audiencia es 9.55%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 5.73% de reacciones respecto al total de suscriptores.
  • Alcance de las publicaciones: Cada publicación recibe en promedio 1 078 visualizaciones. En el primer día suele acumular 647 visualizaciones.
  • Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 6.
  • Intereses temáticos: El contenido se centra en temas clave como ставь, void, string, строка, static.

📝 Descripción y política de contenido

El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 04 noviembre, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.

11 289
Suscriptores
+224 horas
-187 días
-4630 días
Archivo de publicaciones
🤔 Что значит реляционная база данных? Реляционная база данных организует данные в виде таблиц, где строки представляют записи, а столбцы — атрибуты. 1. Взаимосвязь между таблицами осуществляется через первичные и внешние ключи. 2. Она поддерживает запросы на основе языка SQL, что упрощает выборку и модификацию данных. 3. Пример: PostgreSQL, MySQL. Ставь 👍 и забирай 📚 Базу знаний

🤔 Почему не рекомендуется использовать скриплеты, скриптовые элементы в JSP ? Использование скриплетов и скриптовых элементов (Java код внутри JSP страниц) не рекомендуется по ряду причин, связанных с лучшими практиками разработки, поддержкой, безопасностью и архитектурными принципами. 🚩Причины 🟠Поддерживаемость и читабельность кода Смешивание Java кода с HTML делает страницы трудночитаемыми и сложно поддерживаемыми. Когда бизнес-логика внедряется прямо в JSP страницы, это усложняет понимание и поддержку кода, особенно для больших проектов. 🟠Разделение логики и представления Использование нарушает принцип разделения логики и представления (Separation of Concerns). Логика должна быть размещена в сервлетах, контроллерах или других бизнес-слоях, тогда как JSP страницы должны быть ответственны только за представление данных. 🟠Трудности с тестированием Тестирование кода, включенного в скриплеты, сложнее, так как он тесно переплетается с HTML разметкой. Отладка логики, встроенной в JSP, затруднена, так как она находится в представлении, а не в логическом слое. 🟠Безопасность Смешивание логики и представления может привести к уязвимостям, таким как XSS (Cross-Site Scripting), если входные данные не обрабатываются должным образом. Центральная логика, размещенная в одном месте (например, в сервлетах), позволяет легче управлять безопасностью и обработкой исключений. 🟠Переход на современные технологии Современные технологии и фреймворки, такие как JavaServer Faces (JSF), Spring MVC, и другие, предоставляют более структурированные подходы к разработке веб-приложений. Эти фреймворки способствуют лучшему разделению логики и представления и предлагают более мощные инструменты для разработки и поддержки приложений. 🚩Альтернативные подходы 🟠JSP Expression Language (EL) Позволяет доступ к данным и выполнение простых операций без использования скриплетов. Более читаема и поддерживаемая, так как она не смешивает Java код с HTML.
<p>Username: ${user.name}</p>   
🟠JSTL (JavaServer Pages Standard Tag Library) Предоставляет набор стандартных тегов для выполнения общих задач, таких как итерация, условные конструкции, работа с форматированием и интернационализацией. Улучшает читабельность кода и способствует разделению логики и представления.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test="${user.loggedIn}">
  <p>Welcome, ${user.name}</p>
</c:if>   
🟠MVC (Model-View-Controller) архитектура Использование данной позволяет разделить бизнес-логику, управление данными и представление. Сервлеты и контроллеры (например, Spring MVC) обрабатывают бизнес-логику и данные, а JSP используется только для отображения данных.
   @WebServlet("/user")
public class UserController extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = new User("John Doe", true);
        request.setAttribute("user", user);
        request.getRequestDispatcher("/user.jsp").forward(request, response);
    }
}   
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое Parallel Stream? Это способ обработки потоков данных в Java параллельно с использованием нескольких ядер процессора. 1. Он автоматически разбивает поток данных на подзадачи, выполняемые одновременно. 2. Используется для увеличения производительности в задачах, где данные можно обрабатывать независимо. 3. Но его применение может усложнять отладку и требует учёта потокобезопасности. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как сконфигурировать параметры инициализации для JSP ? Параметры инициализации могут быть настроены через файл конфигурации web.xml или с помощью аннотаций в сервлетах. Могут быть настроены для всего веб-приложения или для конкретных сервлетов и страниц. 🚩Конфигурация параметров инициализации через web.xml 🟠Параметры инициализации для сервлетов и JSP страниц Можно настроить в разделе <servlet> элемента конфигурационного файла web.xml.
<web-app>
    <servlet>
        <servlet-name>ExampleServlet</servlet-name>
        <jsp-file>/example.jsp</jsp-file>
        <init-param>
            <param-name>param1</param-name>
            <param-value>value1</param-value>
        </init-param>
        <init-param>
            <param-name>param2</param-name>
            <param-value>value2</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>ExampleServlet</servlet-name>
        <url-pattern>/example</url-pattern>
    </servlet-mapping>
</web-app>
Доступ к параметрам инициализации в JSP можно получить через объект config в JSP.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Initialization Parameters Example</title>
</head>
<body>
    <h1>Initialization Parameters Example</h1>
    
    <%
        // Получение параметров инициализации
        String param1 = config.getInitParameter("param1");
        String param2 = config.getInitParameter("param2");
    %>
    
    <p>Param1: <%= param1 %></p>
    <p>Param2: <%= param2 %></p>
</body>
</html>
🟠Параметры инициализации для всего приложения Можно настроить в разделе <context-param> элемента конфигурационного файла web.xml.
<web-app>
    <context-param>
        <param-name>globalParam1</param-name>
        <param-value>globalValue1</param-value>
    </context-param>
    <context-param>
        <param-name>globalParam2</param-name>
        <param-value>globalValue2</param-value>
    </context-param>
</web-app>
Доступ к параметрам инициализации для всего приложения можно получить через объект ServletContext.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Global Initialization Parameters Example</title>
</head>
<body>
    <h1>Global Initialization Parameters Example</h1>
    
    <%
        // Получение глобальных параметров инициализации
        String globalParam1 = application.getInitParameter("globalParam1");
        String globalParam2 = application.getInitParameter("globalParam2");
    %>
    
    <p>Global Param1: <%= globalParam1 %></p>
    <p>Global Param2: <%= globalParam2 %></p>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🧠 Machine Learning — авторский канал, где собрана вся база по ИИ и машинному обучению. Senior разработчик AI-алгоритмов и ав
+5
🧠 Machine Learning — авторский канал, где собрана вся база по ИИ и машинному обучению. Senior разработчик AI-алгоритмов и автономных агентов, разбирает гайды, редкую литературу и код топовых моделей машинного обучения и искусственного интеллекта. В 2025 году ИИ выйдет на совершенно новый уровень тот, кто не успеет за прогрессом - отстанет, а кто разберется - сорвет куш. Стоит подписаться: t.me/ai_machinelearning_big_data

🤔 В чём различие между Left Join, Right Join и Inner Join? 1. Left Join: возвращает все записи из левой таблицы и совпадающие из правой, незаполненные поля заполняются NULL. 2. Right Join: возвращает все записи из правой таблицы и совпадающие из левой, с аналогичным заполнением NULL для отсутствующих значений. 3. Inner Join: возвращает только те записи, которые совпадают в обеих таблицах. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что известно о PageContext и какие преимущества его использования? Это один из неявных объектов, который предоставляет доступ ко всем другим неявным объектам и различным областям видимости (scope) в странице. Он служит как контейнер для информации, связанной с обработкой страницы и предоставляет методы для взаимодействия с атрибутами, управления выходными потоками и получения информации о среде выполнения. 🚩Основные функции 🟠Доступ ко всем областям видимости (scope): Предоставляет методы для работы с атрибутами во всех областях видимости (page, request, session, application). Методы: setAttribute(), getAttribute(), removeAttribute(), findAttribute(). 🟠Управление выходными потоками Предоставляет доступ к JspWriter через метод getOut(), который используется для вывода данных на страницу. 🟠Работа с неявными объектами Предоставляет методы для получения ссылок на другие неявные объекты, такие как request, response, session, application, config, и page. 🟠Обработка исключений PageContext может использоваться для обработки исключений, которые происходят в JSP странице. 🚩Примеры Доступ к атрибутам в различных областях видимости
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>PageContext Example</title>
</head>
<body>
    <h1>PageContext Example</h1>
    
    <%-- Установка атрибутов в различные области видимости --%>
    <%
        pageContext.setAttribute("pageAttr", "Page Scope Attribute", PageContext.PAGE_SCOPE);
        pageContext.setAttribute("requestAttr", "Request Scope Attribute", PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("sessionAttr", "Session Scope Attribute", PageContext.SESSION_SCOPE);
        pageContext.setAttribute("applicationAttr", "Application Scope Attribute", PageContext.APPLICATION_SCOPE);
    %>
    
    <%-- Получение и вывод атрибутов --%>
    <p>Page Attribute: <%= pageContext.getAttribute("pageAttr", PageContext.PAGE_SCOPE) %></p>
    <p>Request Attribute: <%= pageContext.getAttribute("requestAttr", PageContext.REQUEST_SCOPE) %></p>
    <p>Session Attribute: <%= pageContext.getAttribute("sessionAttr", PageContext.SESSION_SCOPE) %></p>
    <p>Application Attribute: <%= pageContext.getAttribute("applicationAttr", PageContext.APPLICATION_SCOPE) %></p>
    
</body>
</html>
Получение неявных объектов
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>PageContext Example</title>
</head>
<body>
    <h1>PageContext Example</h1>
    
    <%-- Получение неявных объектов через PageContext --%>
    <p>Request URI: <%= pageContext.getRequest().getRequestURI() %></p>
    <p>Session ID: <%= pageContext.getSession().getId() %></p>
    <p>Servlet Context Name: <%= pageContext.getServletContext().getServletContextName() %></p>
    
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём разница CHAR и VARCHAR? 1. Размер хранения: CHAR — фиксированный размер, добавляет пробелы до нужной длины; VARCHAR — переменный, хранит только фактические символы. 2. Производительность: CHAR быстрее для фиксированных данных, VARCHAR экономит память для переменных данных. 3. Применение: CHAR для одинаковой длины строк (например, коды), VARCHAR для строк переменной длины (например, имена). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие неявные объекты не доступны в обычной JSP странице? В обычной JSP странице доступны большинство неявных объектов, предоставляющих различные аспекты управления веб-приложением. Однако один из неявных объектов, а именно exception, не доступен в обычной JSP странице. Рассмотрим это далее. 🚩Неявные объекты 🟠`request` Объект HttpServletRequest, представляющий запрос клиента. 🟠response Объект HttpServletResponse, представляющий ответ сервера. 🟠session Объект HttpSession, представляющий сессию пользователя. 🟠`application` Объект ServletContext, представляющий контекст приложения. 🟠out Объект JspWriter, используемый для записи данных в ответ. 🟠config Объект ServletConfig, содержащий параметры конфигурации сервлета. 🟠pageContext Объект PageContext, предоставляющий доступ ко всем областям видимости и другим неявным объектам. 🟠page Объект page, представляющий текущую JSP страницу. 🟠xception Объект `hrowable` представляющий исключение, вызвавшее ошибку (недоступен в обычной странице). `exception`: Объект Throwable, представляющий исключение, вызвавшее ошибку (недоступен в обычной странице). 🚩Недоступный неявный объект в обычной странице exception Объект exception представляет собой экземпляр Throwable, который содержит исключение, вызвавшее ошибку. Этот объект доступен только на страницах, объявленных как страницы обработки ошибок. Доступность: Недоступен в обычной JSP странице. Доступен только на страницах, объявленных с атрибутом isErrorPage="true". Пример страницы обработки ошибок
<%@ page isErrorPage="true" %>
<html>
<head>
    <title>Error Page</title>
</head>
<body>
    <h1>An error occurred</h1>
    <p>Exception: <%= exception.getMessage() %></p>
</body>
</html>
Примеры
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Implicit Objects Example</title>
</head>
<body>
    <h1>Implicit Objects in JSP</h1>

    <!-- Использование объекта request -->
    <p>Request URI: <%= request.getRequestURI() %></p>

    <!-- Использование объекта session -->
    <%
        session.setAttribute("user", "John Doe");
        String user = (String) session.getAttribute("user");
    %>
    <p>User from session: <%= user %></p>

    <!-- Использование объекта application -->
    <%
        application.setAttribute("appName", "MyApp");
        String appName = (String) application.getAttribute("appName");
    %>
    <p>Application Name: <%= appName %></p>

    <!-- Использование объекта config -->
    <p>Servlet Name: <%= config.getServletName() %></p>

    <!-- Использование объекта pageContext -->
    <%
        pageContext.setAttribute("pageMessage", "Page context message", PageContext.PAGE_SCOPE);
        String pageMessage = (String) pageContext.getAttribute("pageMessage");
    %>
    <p>Page Message: <%= pageMessage %></p>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие виды внедрения зависимости есть? 1. Через конструктор (Constructor Injection): зависимости передаются при создании объекта. 2. Через сеттеры или методы (Setter/Method Injection): зависимости устанавливаются после создания объекта. 3. Через поле (Field Injection): зависимости внедряются напрямую в поля класса с использованием аннотаций, таких как @Autowired. 4. Интерфейсное внедрение (Interface Injection): зависимости передаются через методы интерфейса, который реализует класс. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая разница между динамическим и статическим содержимым JSP? В JSP (Java Server Pages) существует несколько типов тегов, которые помогают разработчикам создавать динамически генерируемые веб-страницы. Основные типы тегов включают директивы, скриптлеты, выражения, декларации, действия и теги библиотек. 🟠Директивы (Directives) Используются для настройки JSP страницы и управления её поведением. Они предоставляют инструкции контейнеру JSP. page: Настраивает атрибуты страницы, такие как кодировка, импорт классов, обработка исключений и т.д.
  <%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.Date" %>  
include: Включает содержимое другого файла в JSP страницу во время компиляции.
<%@ include file="header.jsp" %>  
taglib: Декларирует использование библиотеки тегов.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
🟠Скриптлеты (Scriptlets) Позволяют включать произвольный Java код внутри JSP страницы. Код внутри скриптлета выполняется на сервере при генерации страницы.
<%
    String message = "Hello, World!";
    out.println(message);
%>
🟠Выражения (Expressions) Позволяют выводить значения Java переменных и методов в HTML код. Результат выражения автоматически включается в вывод страницы.
<p>Current time: <%= new java.util.Date() %></p>
🟠Декларации (Declarations) Позволяют объявлять методы и поля класса, в который компилируется JSP страница. Они используются для объявления переменных и методов, доступных в других частях страницы.
<%! 
    private int counter = 0;

    public int getCounter() {
        return counter++;
    }
%>
<p>Counter: <%= getCounter() %></p>
🟠Действия (Actions) Позволяют выполнять встроенные функции, такие как включение содержимого другого ресурса или использование JavaBeans. Эти теги начинаются с <jsp: и предоставляют различные функциональные возможности. jsp:include Включает другой ресурс (JSP, HTML, Servlet) в текущую страницу во время выполнения.
<jsp:include page="header.jsp" />  
jsp:forward Перенаправляет запрос на другой ресурс.
<jsp:forward page="anotherPage.jsp" />  
jsp:useBean Создает или извлекает JavaBean и делает его доступным на странице.
<jsp:useBean id="user" class="com.example.User" scope="session" />  
jsp:setProperty Устанавливает значение свойства JavaBean.
<jsp:setProperty name="user" property="name" value="John Doe" />  
jsp:getProperty Извлекает значение свойства JavaBean и выводит его.
  <jsp:getProperty name="user" property="name" />
  
🟠Теги библиотек (Tag Libraries) Предоставляют дополнительные функции и упрощают разработку JSP страниц. Они используются для выполнения часто встречающихся задач, таких как итерация, условная логика, обработка XML, и работа с форматированием.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:choose>
    <c:when test="${param.user == 'admin'}">
        <p>Welcome, admin!</p>
    </c:when>
    <c:otherwise>
        <p>Welcome, guest!</p>
    </c:otherwise>
</c:choose>

<c:forEach var="item" items="${items}">
    <p>${item.name}</p>
</c:forEach>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие имплементации ExecutorService есть? 1. FixedThreadPool: пул с фиксированным количеством потоков. 2. CachedThreadPool: пул с динамическим количеством потоков, которые переиспользуются. 3. SingleThreadExecutor: пул с одним потоком. 4. ScheduledThreadPool: для выполнения задач с задержкой или периодически. 5. ForkJoinPool: для работы с задачами, которые можно разбить на подзадачи. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая разница между динамическим и статическим содержимым JSP ? Java Server Pages (JSP) позволяет создавать как статическое, так и динамическое содержимое. Различие между ними заключается в способе генерации и отображения содержимого на веб-странице. 🚩Статическое содержимое Это часть веб-страницы, которая остается неизменной при каждом запросе. Оно включает в себя ресурсы, которые не изменяются динамически сервером.
<html>
<head>
    <title>Static Content Example</title>
</head>
<body>
    <h1>Welcome to My Website</h1>
    <p>This is a static content example.</p>
</body>
</html>
🚩Динамическое содержимое Это часть веб-страницы, которая генерируется или изменяется сервером на основе входящих запросов, данных из базы данных или других условий. Динамическое содержимое изменяется при каждом запросе в зависимости от параметров, данных пользователя и других факторов.
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.Date" %>
<html>
<head>
    <title>Dynamic Content Example</title>
</head>
<body>
    <h1>Welcome to My Website</h1>
    <p>This is a dynamic content example.</p>
    <p>Current time: <%= new Date() %></p>
</body>
</html>
🚩Основные различия 🟠Генерация содержимого Статическое содержимое: Не меняется при каждом запросе. Оно включено в JSP страницу как есть и отображается в неизменном виде. Динамическое содержимое: Генерируется сервером на основе данных, параметров запроса или других условий, что приводит к изменению отображаемого содержимого при каждом запросе. 🟠Выполнение на сервере Статическое содержимое: Не требует выполнения на сервере. Веб-сервер просто передает его клиенту (например, браузеру). Динамическое содержимое: Требует выполнения на сервере. JSP страница компилируется в сервлет, который затем генерирует HTML на основе логики и данных. Примеры использования: Статическое содержимое: Используется для отображения постоянных данных, таких как статические страницы, стиль, оформление, изображения и т.д. Динамическое содержимое: Используется для отображения изменяющихся данных, таких как пользовательская информация, результаты поиска, данные из базы данных и т.д.
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.Date" %>
<html>
<head>
    <title>Static and Dynamic Content Example</title>
</head>
<body>
    <h1>Welcome to My Website</h1>
    <p>This is a static content example.</p>
    
    <%
        // Динамическое содержимое: текущее время
        Date currentDate = new Date();
    %>
    <p>Current time: <%= currentDate %></p>
    
    <%
        // Динамическое содержимое: пользовательская информация
        String username = request.getParameter("username");
        if (username != null) {
            out.println("<p>Hello, " + username + "!</p>");
        } else {
            out.println("<p>Hello, Guest!</p>");
        }
    %>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как создать поток? 1. Наследование класса Thread: создайте подкласс Thread и переопределите метод run(). 2. Реализация интерфейса Runnable: создайте класс, реализующий Runnable, и передайте его экземпляр в конструктор Thread. 3. Использование пула потоков: через ExecutorService для управления потоками. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как можно предотвратить прямой доступ к JSP странице из браузера ? Для предотвращения прямого доступа к JSP странице из браузера можно использовать несколько методов. Основная идея заключается в том, чтобы ограничить доступ к страницам, оставив доступ только через контроллеры, такие как сервлеты, или посредством определенных условий доступа. 🟠Размещение файлов внутри WEB-INF Размещение файлов внутри папки WEB-INF предотвращает прямой доступ к ним из браузера. Любой файл в WEB-INF не может быть напрямую запрошен клиентом, но может быть доступен сервером, что позволяет контролировать доступ к через сервлеты.
/WEB-INF/
    /jsp/
        protectedPage.jsp
    web.xml
Теперь доступ к protectedPage.jsp можно получить только через сервлет.
@WebServlet("/protectedPage")
public class ProtectedPageServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/jsp/protectedPage.jsp").forward(request, response);
    }
}
🟠Использование фильтров (Servlet Filters) Фильтры могут быть использованы для проверки доступа к JSP страницам и перенаправления запросов при необходимости. Фильтр можно настроить так, чтобы он проверял доступ только для авторизованных пользователей.
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.FilterServletRequest;
import javax.servlet.FilterServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/jsp/*") // Применение фильтра ко всем запросам к JSP
public class AuthenticationFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        
        // Проверка сессии или авторизации
        if (httpRequest.getSession().getAttribute("user") == null) {
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
        } else {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        // Инициализация фильтра (если необходимо)
    }

    public void destroy() {
        // Очистка ресурсов (если необходимо)
    }
}
🟠Конфигурация в web.xml Можно использовать декларативную конфигурацию в файле web.xml, чтобы ограничить доступ к JSP страницам.
<web-app ...>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Protected JSP</web-resource-name>
            <url-pattern>/protected/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>AUTHORIZED_USER</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/login-error.jsp</form-error-page>
        </form-login-config>
    </login-config>

    <security-role>
        <role-name>AUTHORIZED_USER</role-name>
    </security-role>
</web-app>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое CompletableFuture? Это расширенный класс, реализующий интерфейсы Future и CompletionStage. Он предоставляет удобные методы для построения асинхронных цепочек задач, обработки исключений и комбинирования нескольких асинхронных операций. Это упрощает написание асинхронного кода и избегает блокировки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие методы жизненного цикла JSP могут быть переопределены ? Жизненный цикл JSP (JavaServer Pages) включает несколько ключевых методов, которые можно переопределить для управления поведением страницы. Эти методы определены в интерфейсе javax.servlet.jsp.HttpJspPage, который расширяет интерфейс javax.servlet.jsp.JspPage. 🟠`jspInit()` Этот метод запускается один раз при инициализации JSP. Он используется для выполнения начальных настроек, таких как создание объектов, которые будут использоваться на странице. Это аналог метода init() в сервлетах. 🟠jspDestroy() Этот метод вызывается перед удалением JSP со страницы сервера. Он используется для освобождения ресурсов или выполнения других задач очистки. Это аналог метода destroy() в сервлетах.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*, java.util.*" %>
<%!
    // Поля класса
    private Resource resource;

    // Переопределение метода jspInit()
    public void jspInit() {
        // Инициализация ресурсов
        resource = new Resource();
        System.out.println("JSP инициализирована.");
    }

    // Переопределение метода jspDestroy()
    public void jspDestroy() {
        // Освобождение ресурсов
        resource.close();
        System.out.println("JSP уничтожена.");
    }
%>
<html>
<body>
    <h2>Пример переопределения методов жизненного цикла JSP</h2>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое Future? Это интерфейс в Java, представляющий результат асинхронной операции, который будет доступен в будущем. С помощью Future можно получить результат выполнения задачи, проверить её состояние или отменить задачу. Однако интерфейс имеет ограничения, такие как блокировка при ожидании результата. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что известно о методах жизненного цикла JSP ? Жизненный цикл JSP страницы включает несколько ключевых методов, которые управляют её поведением от момента создания до завершения. Эти методы позволяют выполнять действия при инициализации, обработке запросов и завершении работы страницы. 🚩jspInit() Этот метод вызывается контейнером сервлетов один раз при инициализации страницы. Он аналогичен методу init() в сервлетах и используется для выполнения любых действий, которые необходимо выполнить до обработки первого запроса, таких как настройка ресурсов, инициализация параметров и т.д.
public void jspInit() {
    // Код инициализации, например, подключение к базе данных или настройка ресурсов
    System.out.println("JSP инициализирована");
}
🚩_jspService(HttpServletRequest request, HttpServletResponse response) Этот метод автоматически генерируется для каждой страницы и отвечает за обработку каждого HTTP-запроса, направленного к этой странице. Метод обрабатывает входящие параметры запроса, выполняет бизнес-логику и формирует ответ, который отправляется обратно клиенту. Этот метод вызывается каждый раз при поступлении запроса к JSP странице.
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        // Генерация HTML содержимого
        out.println("<html><head><title>Example JSP</title></head><body>");
        out.println("<h1>Welcome to JSP</h1>");
        out.println("<p>Current time: " + new java.util.Date() + "</p>");
        out.println("</body></html>");
    }
}
🚩jspDestroy() Этот метод вызывается контейнером сервлетов один раз при завершении работы страницы. Он аналогичен методу destroy() в сервлетах и используется для выполнения любых действий, которые необходимо выполнить перед выгрузкой страницы, таких как освобождение ресурсов, закрытие соединений и т.д.
public void jspDestroy() {
    // Код очистки ресурсов, например, закрытие соединений с базой данных
    System.out.println("JSP завершила работу");
}
🚩Как эти методы взаимодействуют в жизненном цикле 🟠Инициализация (Initialization) Контейнер вызывает jspInit() при первой загрузке страницы. Этот метод инициализирует необходимые ресурсы и выполняет любые действия, которые должны быть выполнены один раз. 🟠Обработка запросов (Request Processing) Каждый запрос к странице обрабатывается методом _jspService(). Контейнер сервлетов передает объекты HttpServletRequest и HttpServletResponse этому методу для обработки запроса и формирования ответа. 🟠Завершение (Termination) Когда контейнер выгружает страницу (например, при завершении работы приложения или перезагрузке сервера), вызывается метод jspDestroy(). Этот метод освобождает все ресурсы, занятые страницей, и выполняет любые действия по очистке.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.io.*" %>

<%
    // Инициализация (имитация вызова jspInit)
    application.log("JSP инициализирована");
%>

<html>
<head>
    <title>Example JSP</title>
</head>
<body>
    <h1>Welcome to JSP</h1>
    <p>Current time: <%= new Date() %></p>
</body>
</html>

<%
    // Завершение (имитация вызова jspDestroy)
    application.log("JSP завершила работу");
%>
Ставь 👍 и забирай 📚 Базу знаний