Java | Вопросы собесов
11.4K subscribers
33 photos
2 videos
1.11K links
Download Telegram
📌 В чем отличия ServletContext и ServletConfig?

💬 Спрашивают в 6 % собеседований

🤔 Основные отличия между `ServletContext` и `ServletConfig`:

1️⃣ Область видимости:

`ServletContext`: Общий для всех сервлетов в веб-приложении.

`ServletConfig`: Специфичен для конкретного сервлета.

2️⃣ Использование:

`ServletContext`: Для обмена данными между сервлетами и получения глобальных параметров.

`ServletConfig`: Для получения параметров инициализации конкретного сервлета.

3️⃣ Методы:

`ServletContext`:

getInitParameter(String name): Глобальные параметры.

getAttribute(String name), setAttribute(String name, Object object): Управление атрибутами.

`ServletConfig`:

getInitParameter(String name): Параметры инициализации сервлета.

getServletName(): Имя сервлета.

🤔 Итог:

ServletContext предоставляет глобальный контекст для всего приложения.

ServletConfig предоставляет конфигурацию для одного сервлета.

🤔 Кратко:

ServletContext — для всего приложения, ServletConfig — для одного сервлета.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤯2
📌 Для чего нужен интерфейс ServletResponse?

💬 Спрашивают в 6 % собеседований

Интерфейс ServletResponse в Java Servlet API используется для создания и отправки ответа клиенту (например, браузеру) от сервлета. Он предоставляет методы для настройки ответного сообщения, включая контент, заголовки и выходные данные.

🤔 Основные задачи `ServletResponse`:

1️⃣ Установка типа контента: Позволяет указать MIME-тип возвращаемых данных, например, text/html, application/json и т.д.

2️⃣ Получение выходного потока: Предоставляет возможность записывать данные ответа через потоки, такие как PrintWriter и ServletOutputStream.

3️⃣ Управление буферизацией: Позволяет контролировать буферизацию данных для эффективной отправки.

4️⃣ Установка заголовков ответа: Можно добавлять и изменять HTTP-заголовки, такие как кодировка, длина содержимого и т.д.

🤔 Основные методы `ServletResponse`:

`setContentType(String type)`: Устанавливает MIME-тип ответа.
  response.setContentType("text/html");


`getWriter()`: Возвращает объект PrintWriter для записи текстовых данных в ответ.
  PrintWriter out = response.getWriter();
out.println("<html><body>Hello, World!</body></html>");


`getOutputStream()`: Возвращает объект ServletOutputStream для записи бинарных данных в ответ.
  ServletOutputStream out = response.getOutputStream();
out.write(byteArray);


`setCharacterEncoding(String charset)`: Устанавливает кодировку символов для ответа.
  response.setCharacterEncoding("UTF-8");


`setContentLength(int length)`: Устанавливает длину содержимого в байтах.
  response.setContentLength(content.length());


🤔 Пример использования `ServletResponse`:

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;

public class ResponseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Установка типа контента и кодировки
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");

// Получение объекта PrintWriter для записи текста
PrintWriter out = response.getWriter();

// Запись HTML-ответа
out.println("<html>");
out.println("<head><title>Sample Response</title></head>");
out.println("<body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body>");
out.println("</html>");
}
}


🤔 Итог:

Интерфейс ServletResponse нужен для настройки и отправки HTTP-ответов клиенту, позволяя устанавливать тип контента, кодировку, заголовки и записывать данные в ответ.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👀1
📌 Для чего нужен интерфейс ServletRequest?

💬 Спрашивают в 6 % собеседований

Интерфейс ServletRequest в Java Servlet API используется для получения данных запроса от клиента (например, браузера) к сервлету. Он предоставляет методы для доступа к параметрам запроса, заголовкам, информации о клиенте и другим аспектам HTTP-запроса.

🤔 Основные задачи `ServletRequest`:

1️⃣ Получение параметров запроса: Позволяет извлекать параметры, переданные в запросе, как через URL (GET-запросы), так и через тело запроса (POST-запросы).

2️⃣ Доступ к атрибутам запроса: Позволяет устанавливать и получать атрибуты, которые могут быть использованы для передачи данных между сервлетами.

3️⃣ Информация о клиенте: Предоставляет информацию о клиенте, такую как IP-адрес, имя хоста, используемый протокол и т.д.

4️⃣ Чтение тела запроса: Позволяет читать данные из тела запроса, особенно важные для обработки POST-запросов с данными формы или JSON.

🤔 Основные методы `ServletRequest`:

`getParameter(String name)`: Возвращает значение параметра запроса по его имени.
  String paramValue = request.getParameter("paramName");


`getParameterValues(String name)`: Возвращает массив значений параметра, если он встречается несколько раз.
  String[] values = request.getParameterValues("paramName");


`getAttribute(String name)` и `setAttribute(String name, Object o)`: Получение и установка атрибутов запроса.
  request.setAttribute("attrName", "attrValue");
String attrValue = (String) request.getAttribute("attrName");


`getRemoteAddr()`: Возвращает IP-адрес клиента, который отправил запрос.
  String clientIp = request.getRemoteAddr();


`getReader()`: Возвращает объект BufferedReader для чтения данных из тела запроса.
  BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
// Обработка строки
}


`getInputStream()`: Возвращает объект ServletInputStream для чтения бинарных данных из тела запроса.
  ServletInputStream inputStream = request.getInputStream();
int data;
while ((data = inputStream.read()) != -1) {
// Обработка данных
}


🤔 Пример использования `ServletRequest`:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Получение параметров запроса
String username = request.getParameter("username");
String password = request.getParameter("password");

// Получение информации о клиенте
String clientIp = request.getRemoteAddr();

// Установка атрибута запроса
request.setAttribute("processed", true);

// Логика обработки запроса
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
response.getWriter().println("Username: " + username);
response.getWriter().println("Client IP: " + clientIp);
}
}


🤔 Итог:

Интерфейс ServletRequest нужен для получения данных от клиента, таких как параметры запроса, атрибуты, информация о клиенте и данные из тела запроса, что позволяет сервлету обрабатывать запросы и генерировать соответствующие ответы.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤯2
🤔 Каким образом передаются параметры в методы в Java?
Anonymous Quiz
45%
По ссылке
42%
По значению
7%
По указателю
6%
По копии
😁10👍6🤯1
📌 Что такое Request Dispatcher?

💬 Спрашивают в 6 % собеседований

RequestDispatcher — это интерфейс в Java Servlet API, который используется для передачи запроса от одного сервлета к другому ресурсу на сервере, например, к другому сервлету, JSP-странице или статическому файлу (HTML, изображение и т.д.). RequestDispatcher позволяет реализовать механизм включения или пересылки запросов и ответов.

🤔 Основные функции `RequestDispatcher`:

1️⃣ Перенаправление запроса (Forwarding):

Передает управление другому ресурсу на сервере без участия клиента. В этом случае URL в браузере не меняется.

2️⃣ Включение ресурса (Including):

Включает содержимое другого ресурса в ответ текущего запроса. Это позволяет комбинировать вывод нескольких ресурсов.

🤔 Методы `RequestDispatcher`:

1️⃣ `forward(ServletRequest request, ServletResponse response)`: Перенаправляет запрос и ответ от одного сервлета к другому ресурсу на сервере.
   RequestDispatcher dispatcher = request.getRequestDispatcher("targetResource");
dispatcher.forward(request, response);


2️⃣ `include(ServletRequest request, ServletResponse response)`: Включает содержимое другого ресурса в ответ текущего запроса.
   RequestDispatcher dispatcher = request.getRequestDispatcher("targetResource");
dispatcher.include(request, response);


🤔 Как получить объект `RequestDispatcher`:

Объект RequestDispatcher можно получить через методы getRequestDispatcher(String path) или getNamedDispatcher(String name) у объекта ServletRequest или ServletContext.

Использование `ServletRequest` для получения `RequestDispatcher`:
  RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/resource");


Использование `ServletContext` для получения `RequestDispatcher`:
  ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/path/to/resource");


🤔 Примеры использования `RequestDispatcher`:

Пример перенаправления (forward):
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;

public class ForwardServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Логика обработки запроса

// Перенаправление на другой ресурс
RequestDispatcher dispatcher = request.getRequestDispatcher("targetResource.jsp");
dispatcher.forward(request, response);
}
}


Пример включения (include):
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;

public class IncludeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Логика обработки запроса

// Включение другого ресурса
RequestDispatcher dispatcher = request.getRequestDispatcher("header.jsp");
dispatcher.include(request, response);

// Основной контент
response.getWriter().println("<h1>Main Content</h1>");

// Включение другого ресурса
dispatcher = request.getRequestDispatcher("footer.jsp");
dispatcher.include(request, response);
}
}


🤔 Итог:

RequestDispatcher используется для перенаправления запросов и включения содержимого других ресурсов на сервере, что позволяет более гибко и эффективно организовывать обработку запросов и формирование ответов в веб-приложениях.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤯21
🤔 Какие есть типы EL операторов?

JSP Expression Language (EL) поддерживает различные типы операторов, которые позволяют выполнять разнообразные операции на данных. Эти операторы включают в себя арифметические, логические, операторы сравнения, условные операторы и операторы доступа к свойствам и коллекциям.

Ставь 👍 если знал ответ и 🔥 если нет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👀3👍2
📌 Как из одного сервлета вызвать другой сервлет?

💬 Спрашивают в 6 % собеседований

Для вызова одного сервлета из другого в Java можно использовать интерфейс RequestDispatcher, который позволяет перенаправлять запросы (forward) или включать содержимое другого сервлета (include). Это делается внутри сервлета-инициатора с использованием метода getRequestDispatcher(String path) или getNamedDispatcher(String name) для получения объекта RequestDispatcher.

🤔 Основные методы:

1️⃣ `forward(ServletRequest request, ServletResponse response)`: Перенаправляет запрос и ответ от одного сервлета к другому ресурсу на сервере. В этом случае URL в браузере не меняется, и клиент не видит перенаправления.

2️⃣ `include(ServletRequest request, ServletResponse response)`: Включает содержимое другого ресурса в ответ текущего запроса. Это позволяет комбинировать вывод нескольких ресурсов.

🤔 Примеры использования `RequestDispatcher`:

1️⃣ Перенаправление запроса (forward):
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;

public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Логика обработки запроса
String username = request.getParameter("username");
request.setAttribute("user", username);

// Перенаправление запроса на другой сервлет
RequestDispatcher dispatcher = request.getRequestDispatcher("SecondServlet");
dispatcher.forward(request, response);
}
}


2️⃣ Включение содержимого другого сервлета (include):
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;

public class MainServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Включение заголовка
RequestDispatcher dispatcher = request.getRequestDispatcher("HeaderServlet");
dispatcher.include(request, response);

// Основной контент
response.getWriter().println("<h1>Main Content</h1>");

// Включение подвала
dispatcher = request.getRequestDispatcher("FooterServlet");
dispatcher.include(request, response);
}
}


3️⃣ Пример сервлета, к которому идет перенаправление или включение:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Получаем атрибут из запроса
String username = (String) request.getAttribute("user");

// Логика обработки
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
response.getWriter().println("Hello, " + username);
}
}


🤔 Основные шаги для вызова одного сервлета из другого:

1️⃣ Получить объект `RequestDispatcher`:

Через HttpServletRequest: request.getRequestDispatcher("SecondServlet").

Через ServletContext: getServletContext().getRequestDispatcher("/SecondServlet").

2️⃣ Использовать метод `forward` или `include` объекта `RequestDispatcher`:

dispatcher.forward(request, response): Перенаправляет запрос.

dispatcher.include(request, response): Включает содержимое.

🤔 Итог:

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71🤯1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133👾1
Java | Вопросы собесов pinned «👾 1715 вопросов собесов на Java Developer 🔒 База реальных собесов 🔒 База тестовых заданий 👾 Список менторов 👩‍💻 Java ├ Вакансии ├ LeetCode ответы └ Тесты 🖥 Python ├ Вопросы собесов ├ Вакансии ├ LeetCode ответы └ Тесты 🖥 Frontend ├ Вопросы собесов ├ Вакансии…»
📌 Для чего используются атрибуты сервлетов и как происходит работа с ними?

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

🤔 Виды атрибутов и их использование:

1️⃣ Атрибуты запроса (Request Attributes):

Используются: Для передачи данных между сервлетами и JSP в рамках одного запроса.
Методы: request.setAttribute("name", value), request.getAttribute("name").
     request.setAttribute("message", "Hello");
RequestDispatcher dispatcher = request.getRequestDispatcher("otherServlet");
dispatcher.forward(request, response);


2️⃣ Атрибуты сессии (Session Attributes):

Используются: Для хранения данных на время сессии пользователя.
Методы: session.setAttribute("name", value), session.getAttribute("name").
     HttpSession session = request.getSession();
session.setAttribute("user", "JohnDoe");


3️⃣ Атрибуты контекста (Context Attributes):

Используются: Для данных, доступных всем сервлетам и JSP в приложении.
Методы: context.setAttribute("name", value), context.getAttribute("name").
     ServletContext context = getServletContext();
context.setAttribute("globalData", "Important Data");


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯2🔥1
📌В чем отличия GenericServlet и HttpServlet?

💬 Спрашивают в 6 % собеседований

GenericServlet и HttpServlet — это два класса в Java Servlet API, которые служат основой для создания сервлетов. Они различаются по своему предназначению и областям применения.

🤔 Основные отличия:

1️⃣ Назначение:

`GenericServlet`: Это абстрактный класс, который предоставляет базовую реализацию интерфейса Servlet и может быть использован для создания сервлетов, работающих с любыми протоколами, не ограничиваясь HTTP.

`HttpServlet`: Это класс, предназначенный специально для создания сервлетов, работающих с протоколом HTTP. Он расширяет GenericServlet и добавляет методы, специфичные для обработки HTTP-запросов.

2️⃣ Методы:

`GenericServlet`: Определяет базовые методы, такие как init(), service(), destroy(), getServletConfig(), и getServletInfo().
     public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
}


`HttpServlet`: Добавляет методы для обработки конкретных типов HTTP-запросов, таких как doGet(), doPost(), doPut(), doDelete(), и doHead().
     public class HttpServlet extends GenericServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
// Другие методы...
}


3️⃣ Обработка запросов:

`GenericServlet`: Требует реализации метода service(), который должен обрабатывать все виды запросов.
     public class MyGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// Обработка запросов
}
}


`HttpServlet`: Позволяет переопределить методы для каждого типа HTTP-запроса (GET, POST, PUT и т.д.), что упрощает обработку запросов.
     public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Обработка GET-запроса
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Обработка POST-запроса
}
}


🤔 Когда использовать:

`GenericServlet`: Используется, когда необходимо создать сервлет, который может работать с любым протоколом, не ограничиваясь HTTP. Это редко встречается в современных веб-приложениях, где HTTP является основным протоколом.

`HttpServlet`: Используется для создания HTTP-сервлетов, что является наиболее распространенным случаем. Этот класс предоставляет удобные методы для обработки различных типов HTTP-запросов и является стандартом для веб-приложений.

🤔 Итог:

GenericServlet — базовый класс для создания сервлетов, работающих с любыми протоколами, требует реализации метода service().

HttpServlet — специализированный класс для HTTP-сервлетов, предоставляет методы для обработки конкретных типов HTTP-запросов (GET, POST и т.д.), что упрощает разработку веб-приложений.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤯1
📌 Почему HttpServlet класс объявлен как абстрактный?

💬 Спрашивают в 6 % собеседований

Класс HttpServlet объявлен как абстрактный, потому что он предназначен для предоставления базовой функциональности для создания HTTP-сервлетов, но не должен использоваться напрямую. Вместо этого разработчики должны расширять этот класс и переопределять методы, такие как doGet(), doPost(), doPut(), и т.д., для реализации конкретного поведения сервлета. Вот основные причины, почему HttpServlet объявлен абстрактным:

🤔 Основные причины, почему `HttpServlet` абстрактный:

1️⃣ Базовая функциональность:

HttpServlet предоставляет базовую реализацию методов, необходимых для обработки HTTP-запросов. Он реализует метод service(), который определяет логику маршрутизации запросов к соответствующим методам (doGet(), doPost(), и т.д.), но сами методы оставляет для переопределения.

2️⃣ Принуждение к переопределению:

Методы doGet(), doPost() и другие объявлены как защищенные и пустые. Это означает, что при создании нового HTTP-сервлета разработчик должен явно переопределить хотя бы один из этих методов для реализации необходимой логики.

Например:
     public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Реализация обработки GET-запросов
}
}


3️⃣ Предотвращение инстанцирования:

Объявление HttpServlet абстрактным предотвращает его прямое инстанцирование. Это делает невозможным создание экземпляра HttpServlet без предоставления конкретной реализации методов обработки запросов.

Например:
     HttpServlet servlet = new HttpServlet(); // Ошибка, так как HttpServlet абстрактный


4️⃣ Обеспечение расширяемости:

HttpServlet разработан с учетом того, что его будут расширять. Объявление класса абстрактным подчеркивает, что он предназначен для расширения, а не для использования как есть.

Это позволяет разработчикам создавать свои собственные сервлеты с минимальными усилиями, просто расширяя класс HttpServlet и переопределяя необходимые методы.

🤔 Пример:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, World!</h1>");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// Реализация обработки POST-запросов
}
}


🤔 Итог:

Класс HttpServlet объявлен абстрактным, чтобы обеспечить базовую функциональность для обработки HTTP-запросов, принудить разработчиков переопределять конкретные методы для создания своих собственных сервлетов и предотвратить создание экземпляров базового класса без реализации конкретной логики.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤯1
📌 Какие основные методы присутствуют в классе HttpServlet?

💬 Спрашивают в 6 % собеседований

🤔 Основные методы в классе `HttpServlet`:

1️⃣ `doGet(HttpServletRequest req, HttpServletResponse resp)`: Обработка GET-запросов.

2️⃣ `doPost(HttpServletRequest req, HttpServletResponse resp)`: Обработка POST-запросов.

3️⃣ `doPut(HttpServletRequest req, HttpServletResponse resp)`: Обработка PUT-запросов.

4️⃣ `doDelete(HttpServletRequest req, HttpServletResponse resp)`: Обработка DELETE-запросов.

5️⃣ `doHead(HttpServletRequest req, HttpServletResponse resp)`: Обработка HEAD-запросов.

6️⃣ `doOptions(HttpServletRequest req, HttpServletResponse resp)`: Обработка OPTIONS-запросов.

7️⃣ `doTrace(HttpServletRequest req, HttpServletResponse resp)`: Обработка TRACE-запросов.

8️⃣ `service(HttpServletRequest req, HttpServletResponse resp)`: Маршрутизация запросов к соответствующим методам.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71🤯1