Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
41 photos
3 videos
1.13K links
Download Telegram
🤔 Какие могут проблемы при реализации Hashcode?

Реализация метода hashCode в Java может привести к нескольким проблемам, если она сделана неправильно. Эти проблемы могут привести к некорректной работе хэш-структур данных, таких как HashMap, HashSet и другие. Рассмотрим основные проблемы, которые могут возникнуть при неправильной реализации метода hashCode.

🚩Основные проблемы

🟠Нарушение контракта между `equals` и `hashCode`
Если два объекта равны согласно методу equals, они должны иметь одинаковый хэш-код. Нарушение этого правила приведет к тому, что объекты, которые равны с точки зрения equals, могут оказаться в разных корзинах хэш-таблицы. Убедитесь, что если equals возвращает true для двух объектов, то их хэш-коды одинаковы.
@Override
public boolean equals(Object obj) {
// Реализация метода equals
}

@Override
public int hashCode() {
// Реализация метода hashCode
}


🟠Изменяемые объекты в качестве ключей
Если объект, который используется в качестве ключа в HashMap, изменяется таким образом, что изменяется его хэш-код, это может привести к тому, что объект станет недоступным. Избегайте использования изменяемых объектов в качестве ключей в хэш-таблицах или обеспечьте, чтобы поля, влияющие на хэш-код, не изменялись после создания объекта.
// Плохой пример
Map<Person, String> map = new HashMap<>();
Person person = new Person("Alice");
map.put(person, "Engineer");
person.setName("Bob"); // Изменение, влияющее на hashCode
String profession = map.get(person); // Может вернуть null


🟠Неравные объекты с одинаковым хэш-кодом
Два неравных объекта могут иметь одинаковый хэш-код, что приведет к увеличению числа коллизий. Это может снизить производительность хэш-таблицы. Хотя это невозможно полностью избежать, хорошая реализация hashCode должна стараться минимизировать количество таких коллизий.
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + age;
return result;
}


🟠Производительность метода `hashCode`
Если метод hashCode реализован неэффективно, это может привести к снижению производительности всей программы. Убедитесь, что метод hashCode выполняется быстро и эффективно, особенно для часто используемых объектов.

🟠Сложные вычисления хэш-кода
Слишком сложные вычисления в методе hashCode могут негативно сказаться на производительности. Используйте простые и эффективные алгоритмы для вычисления хэш-кода.
@Override
public int hashCode() {
return Objects.hash(name, age);
}


Пример правильной реализации equals и hashCode
import java.util.Objects;

public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}


Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍171🔥1
🤔 Расскажи про иерархию интерфейсов Collection Framework.

1. Collection — базовый интерфейс, от которого наследуются все коллекции.
2. List (например, ArrayList, LinkedList) — упорядоченные коллекции, поддерживающие дублирующиеся элементы.
3. Set (например, HashSet, TreeSet) — коллекции, хранящие только уникальные элементы.
4. Queue (например, PriorityQueue, LinkedList) — коллекции с FIFO-поведеним.
5. Map — пары ключ-значение (HashMap, TreeMap) — не наследуется от Collection.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍182
🤔 Для чего нужно стирание типов?

Это механизм, используемый в Java для обеспечения обратной совместимости между старым кодом, написанным до введения обобщений (generics) в Java 5, и новым кодом, который их использует. Стирание типов позволяет компилировать обобщенный код в байт-код, совместимый с JVM, который не поддерживает обобщения.

🚩Основные цели стирания типов

🟠Обратная совместимость
Позволяет использовать старый код, написанный до введения обобщений, вместе с новым обобщенным кодом без изменений в существующем коде.

🟠Сокращение избыточности
Обеспечивает единообразие работы с различными типами, минимизируя избыточность в коде и устраняя необходимость дублирования кода для разных типов.

🚩Как работает стирание типов

При компиляции обобщенного кода компилятор Java удаляет информацию о типах (стирает типы) и заменяет их на их необобщенные версии или верхние границы (bounds). В результате обобщенный код компилируется в байт-код, который может выполняться на обычной JVM.

Обобщенный класс
public class Box<T> {
private T value;

public void set(T value) {
this.value = value;
}

public T get() {
return value;
}
}


После стирания типов компилированный код будет выглядеть примерно так
public class Box {
private Object value;

public void set(Object value) {
this.value = value;
}

public Object get() {
return value;
}
}


🚩Ограничения и последствия стирания типов

🟠Потеря информации о типе во время выполнения
После стирания типов информация о типах удаляется, и во время выполнения типовые параметры становятся объектами Object.

🟠Невозможность использования примитивных типов
Обобщения работают только с ссылочными типами, так как примитивные типы не могут быть использованы в качестве типовых параметров.

🟠Рефлексия и обобщения
Невозможно получить информацию о типовых параметрах через рефлексию, так как она теряется во время компиляции.

🚩Пример ограничения

Невозможность создания массивов обобщенных типов
public class Box<T> {
private T value;

public T[] createArray(int size) {
return new T[size]; // Ошибка компиляции
}
}


Обходное решение с использованием рефлексии
public class Box<T> {
private T value;
private Class<T> type;

public Box(Class<T> type) {
this.type = type;
}

@SuppressWarnings("unchecked")
public T[] createArray(int size) {
return (T[]) java.lang.reflect.Array.newInstance(type, size);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
🤔 Что такое bean, какую роль он играет в Spring'е?

Это объект, управляемый контейнером Spring, который отвечает за его создание, настройку и управление жизненным циклом. Bean'ы используются для инъекции зависимостей и являются ключевой частью реализации IoC (Inversion of Control). Они позволяют отделить создание объектов от их использования.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28
🤔 Как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю ?

Процесс обработки JSP страницы начинается с запроса от клиента к серверу и заканчивается ответом серверу клиенту. Этот процесс включает несколько этапов, в которых страница компилируется в сервлет, выполняется, и результат возвращается клиенту.

1⃣Запрос клиента
Когда клиент (обычно это веб-браузер) отправляет HTTP-запрос для получения страницы, запрос передается на веб-сервер.

2⃣Передача запроса на сервлет-контейнер
Веб-сервер, получив запрос, передает его на сервлет-контейнер (например, Apache Tomcat), который обрабатывает запросы для JSP страниц.

3⃣Проверка и компиляция
Проверка необходимости компиляции:
Первый запрос или обновление: Если это первый запрос к данной JSP странице или если страница была изменена, сервлет-контейнер проверяет, скомпилирована ли JSP страница.
Кеширование: Если страница уже была скомпилирована и не изменялась, этот шаг пропускается.
Компиляция:
Страница компилируется в сервлетный код (Java класс).
Сервлетный код компилируется в байт-код (класс-файл).

4⃣Загрузка и инициализация сервлета
Скомпилированный сервлет загружается в память, и контейнер вызывает метод init(), если сервлет еще не был загружен.

5⃣Обработка запроса
Контейнер создает объекты HttpServletRequest и HttpServletResponse, представляющие запрос клиента и ответ сервера соответственно, и передает их методу service() сервлета, который затем вызывает соответствующие методы doGet() или doPost().
public class ExampleJspServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Dynamic content from JSP</h1>");
out.println("<p>Current time: " + new java.util.Date() + "</p>");
out.println("</body></html>");
}
}


6⃣Выполнение сервлета
Сервлет выполняет свою логику, включая:
Доступ к параметрам запроса.
Взаимодействие с базой данных или другими серверными ресурсами.
Динамическое создание HTML контента.

7⃣Формирование ответа
Сервлет формирует HTML страницу, которая возвращается клиенту. Содержимое передается через объект HttpServletResponse.

8⃣Отправка ответа клиенту
Ответ возвращается через веб-сервер клиенту (например, браузеру), который отображает полученный HTML контент пользователю.

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<noscript>Example JSP</noscript>
</head>
<body>
<h1>Welcome to JSP</h1>
<p>Current time: <%= new java.util.Date() %></p>
</body>
</html>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🎉1👀1
🤔 Что такое Dispatcher Servlet?

Центральный компонент в Spring MVC, который обрабатывает входящие HTTP-запросы. Он распределяет запросы к соответствующим контроллерам, управляет данными и формирует ответы. Этот компонент действует как координатор между различными частями приложения, такими как контроллеры, сервисы и представления.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141🔥1
🤔 Что известно об этапах (фазах) жизненного цикла JSP ?

Жизненный цикл JSP страницы включает несколько этапов, которые происходят с момента запроса страницы клиентом до ее ответа. Эти этапы позволяют сервлет-контейнеру управлять страницей, обеспечивая её корректное выполнение и оптимизацию.

🟠Перевод (Translation)
На этом этапе страница переводится в сервлетный код. Это означает, что JSP контейнер берет исходный код страницы и генерирует соответствующий Java код для сервлета.
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<noscript>Example JSP</noscript>
</head>
<body>
<h1>Welcome to JSP</h1>
<p>Current time: <%= new java.util.Date() %></p>
</body>
</html>


🟠Компиляция (Compilation)
Переведенный сервлетный код компилируется в байт-код (класс-файл). Это стандартная компиляция Java, которая создает скомпилированный класс из Java исходного кода.

🟠Загрузка (Loading)
На этом этапе скомпилированный класс загружается в память JVM (Java Virtual Machine). Это стандартный процесс загрузки классов в Java, осуществляемый класс-загрузчиком.

🟠Инициализация (Initialization)
Контейнер вызывает метод jspInit() сервлета, который соответствует JSP странице. Этот метод аналогичен методу init() в обычных сервлетах и вызывается один раз, когда сервлет загружается в память. Здесь можно выполнять любые операции инициализации, такие как настройка ресурсов.
public void jspInit() {
// Инициализационный код
}


🟠Обработка запроса (Request Processing)
Когда клиент отправляет запрос к JSP странице, контейнер создает объекты HttpServletRequest и HttpServletResponse и передает их методу jspService(), который обрабатывает запросы и генерирует ответ. Этот метод вызывается каждый раз при поступлении запроса.
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<html><head><noscript>Example JSP</noscript></head><body>");
out.println("<h1>Welcome to JSP</h1>");
out.println("<p>Current time: " + new java.util.Date() + "</p>");
out.println("</body></html>");
}
}


🟠Завершение (Termination)
Когда контейнер решает выгрузить JSP страницу (например, при завершении работы приложения или перезагрузке сервера), он вызывает метод jspDestroy(). Этот метод аналогичен методу destroy() в обычных сервлетах и позволяет выполнять любые операции очистки, такие как освобождение ресурсов.
public void jspDestroy() {
// Очистка ресурсов
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3
🤔 Что такое синхронизация и зачем она нужна?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍201
🤔 Что известно о методах жизненного цикла 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><noscript>Example JSP</noscript></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>
<noscript>Example JSP</noscript>
</head>
<body>
<h1>Welcome to JSP</h1>
<p>Current time: <%= new Date() %></p>
</body>
</html>

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


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤔 Что такое Future?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍101
🤔 Какие методы жизненного цикла 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>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
🤔 Что такое CompletableFuture?

Это расширенный класс, реализующий интерфейсы Future и CompletionStage. Он предоставляет удобные методы для построения асинхронных цепочек задач, обработки исключений и комбинирования нескольких асинхронных операций. Это упрощает написание асинхронного кода и избегает блокировки.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥141👍1
🤔 Как можно предотвратить прямой доступ к 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>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
🤔 Как создать поток?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🔥51
🤔 Какая разница между динамическим и статическим содержимым JSP ?

Java Server Pages (JSP) позволяет создавать как статическое, так и динамическое содержимое. Различие между ними заключается в способе генерации и отображения содержимого на веб-странице.

🚩Статическое содержимое

Это часть веб-страницы, которая остается неизменной при каждом запросе. Оно включает в себя ресурсы, которые не изменяются динамически сервером.
<html>
<head>
<noscript>Static Content Example</noscript>
</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>
<noscript>Dynamic Content Example</noscript>
</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>
<noscript>Static and Dynamic Content Example</noscript>
</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>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
🤔 Какие имплементации ExecutorService есть?

1. FixedThreadPool: пул с фиксированным количеством потоков.
2. CachedThreadPool: пул с динамическим количеством потоков, которые переиспользуются.
3. SingleThreadExecutor: пул с одним потоком.
4. ScheduledThreadPool: для выполнения задач с задержкой или периодически.
5. ForkJoinPool: для работы с задачами, которые можно разбить на подзадачи.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍41
🤔 Какая разница между динамическим и статическим содержимым 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>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🤔 Какие виды внедрения зависимости есть?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🤔4🔥2
🤔 Какие неявные объекты не доступны в обычной 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>
<noscript>Error Page</noscript>
</head>
<body>
<h1>An error occurred</h1>
<p>Exception: <%= exception.getMessage() %></p>
</body>
</html>


Примеры
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<noscript>Implicit Objects Example</noscript>
</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>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 В чём разница CHAR и VARCHAR?

1. Размер хранения: CHAR — фиксированный размер, добавляет пробелы до нужной длины; VARCHAR — переменный, хранит только фактические символы.
2. Производительность: CHAR быстрее для фиксированных данных, VARCHAR экономит память для переменных данных.
3. Применение: CHAR для одинаковой длины строк (например, коды), VARCHAR для строк переменной длины (например, имена).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6🤔1
🤔 Что известно о 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>
<noscript>PageContext Example</noscript>
</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>
<noscript>PageContext Example</noscript>
</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>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3