Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
34 photos
2 videos
1.13K links
Download Telegram
📌 Зачем нужны Hash Code & Equals Contract ?

💬 Спросят с вероятностью 56%

hashCode() и equals() играют важную роль в работе с объектами, особенно когда речь идет о коллекциях, таких как HashSet, HashMap, и Hashtable. Они определены в классе Object, и поэтому доступны для переопределения всеми классами. Правильное переопределение этих методов важно для эффективной работы коллекций, которые используют хеширование.

Контракт hashCode() и equals() - определяет, как эти методы должны взаимодействовать друг с другом:

🤔 Согласованность

Если два объекта равны согласно методу equals(Object obj), тогда вызов hashCode() на каждом из объектов должен возвращать одинаковое целое значение. Это не значит, что объекты, не равные друг другу, должны возвращать различные хеш-коды. Однако, разные хеш-коды могут помочь улучшить производительность хеш-таблиц.

🤔 Обратное не требуется

Если hashCode() двух объектов возвращает одинаковое значение, это не обязательно означает, что объекты равны согласно equals(). Ситуация, когда разные объекты имеют одинаковые хеш-коды, называется коллизией.

Переопределение equals(Object obj) используется для проверки равенства двух объектов. По умолчанию, этот метод проверяет равенство ссылок, что означает, что два объекта считаются равными, только если они указывают на одно и то же место в памяти. Переопределение метода equals() позволяет сравнивать объекты по содержанию.

🤔 При переопределении equals(), убедитесь, что он:

Рефлексивен: для любого ненулевого ссылочного значения x, x.equals(x) должно возвращать true.

Симметричен: для любых ненулевых ссылочных значений x и y, x.equals(y) должно возвращать true тогда и только тогда, когда y.equals(x) возвращает true.

Транзитивен: для любых ненулевых ссылочных значений x, y, и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то и x.equals(z) должно возвращать true.

Консистентен: для любых ненулевых ссылочных значений x и y, многократные вызовы x.equals(y) должны последовательно возвращать true или последовательно возвращать false.

Для любого ненулевого ссылочного значения x, x.equals(null) должно возвращать false.

🤔 Переопределение

Переопределение hashCode() возвращает хеш-код объекта, который используется хеш-таблицами для определения места хранения объекта. При переопределении equals(), необходимо также переопределить (), чтобы поддерживать общий контракт для методов hashCode() и equals().
public class Person {
private String name;
private int age;

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

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

В этом примере, equals() сравнивает объекты по name и age, а hashCode() использует эти же поля для генерации хеш-кода. Это обеспечивает соблюдение контракта между equals() и hashCode().

🤔 Правильное переопределение

Правильное переопределение equals() и hashCode() критически важно для корректной работы коллекций, основанных на хеш-таблицах. Это обеспечивает эффективное распределение объектов в коллекции и корректное сравнение объектов по содержанию.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143
🤔 Какое ключевое слово используется для импорта пакетов в Java?
Anonymous Quiz
97%
import
2%
include
1%
using
0%
require
🤯39👾5😁4👍2👀2
📌 Что такое deadlock ?

💬 Спросят с вероятностью 31%

Deadlock (взаимная блокировка) — это ситуация в многопоточном программировании, при которой два или более потока вечно ожидают друг друга, освободят ли они ресурсы, занятые в данный момент. Каждый из потоков держит замок (lock) на некотором ресурсе и ожидает получения замка на другом ресурсе, который в это время занят другим потоком. В результате ни один из потоков не может продолжить выполнение, поскольку каждый из них ждет освобождения ресурса, занятого другим потоком.

Представьте ситуацию, где есть два потока и два ресурса (например, два файла или два объекта в памяти).

Поток 1 захватывает ресурс A и ждет освобождения ресурса B.

Поток 2 захватывает ресурс B и ждет освобождения ресурса A.

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

🤔 Чтобы избежать такой ситуации, нужно использовать стратегии, такие как

1️⃣ Предотвращение зацикливания: Все потоки должны запрашивать ресурсы в одном и том же порядке, даже если это означает, что некоторым потокам придется ждать дольше.

2️⃣ Использование тайм-аутов: Потоки могут пытаться захватить ресурс с тайм-аутом. Если ресурс не получен за отведенное время, поток откатывает все свои текущие захваты ресурсов и пытается заново захватить их.

3️⃣ Обнаружение взаимных блокировок: Система может активно обнаруживать циклы ожидания и прерывать один из потоков для разрешения блокировки.

4️⃣ Использование однопоточных моделей: В некоторых случаях можно избежать проблем с многопоточностью, используя асинхронное программирование или реактивные модели, где логика выполнения не блокируется ожиданием ресурсов.

🤔 Понятие Deadlock

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍8
📌 В чём разница между final vs. finally vs. finalize ?

💬 Спросят с вероятностью 25%

Ключевые слова final, finally, и finalize имеют совершенно разные цели и контексты использования, хотя на первый взгляд могут показаться похожими из-за схожести их названий.

🤔 final

Это модификатор, который может быть использован с переменными, методами и классами.

Когда он применяется к переменной, это означает, что переменная может быть присвоена только один раз и её значение не может быть изменено после присваивания.

Когда он используется с методом, это предотвращает переопределение метода в подклассах.

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

🤔 finally

Это блок кода, который используется вместе с блоками try и catch для обработки исключений. Блок finally выполняется всегда после выполнения блока try/catch, независимо от того, было ли выброшено исключение или нет. Это идеальное место для кода очистки, например, для закрытия файловых потоков или освобождения других ресурсов.

final используется для создания констант, предотвращения наследования классов и переопределения методов.

finally гарантирует выполнение кода после блока try/catch, обычно для очистки ресурсов.

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

Каждое из этих ключевых слов имеет уникальное применение и важно в контексте разработки.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁21
🤔 Какие основные методы существуют в классе Object?
Anonymous Quiz
94%
equals(), hashCode(), toString()
4%
equals(), clone(), copy()
2%
toString(), print(), parse()
1%
hashCode(), parse(), format()
5🤯2👀2😁1
📌 В чем идея многопоточности ?

💬 Спросят с вероятностью 25%

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

В однопоточном приложении в любой момент времени выполняется только одна задача. Если эта задача включает в себя ожидание (например, ввод пользователя или чтение данных с диска), процессорное время не используется эффективно. Она же позволяет одновременно выполнять другие задачи во время ожидания, тем самым повышая производительность и отзывчивость приложения.

🤔 Основные преимущества

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

Отзывчивость приложения: В интерактивных приложениях, таких как графические пользовательские интерфейсы, многопоточность позволяет приложению оставаться отзывчивым к действиям пользователя, даже когда выполняются тяжелые задачи в фоновом режиме.

Эффективное использование ресурсов: Приложения могут более эффективно использовать доступные системные ресурсы, распределяя задачи между потоками, которые затем могут выполняться параллельно.

Примером многопоточности может служить создание потоков через наследование от класса Thread или реализацию интерфейса Runnable:
class MyThread extends Thread {
public void run() {
System.out.println("Поток запущен.");
}
}

class MyRunnable implements Runnable {
public void run() {
System.out.println("Поток запущен через Runnable.");
}
}

public class ThreadExample {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start();

Thread t2 = new Thread(new MyRunnable());
t2.start();
}
}


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

🤔 В чем сложность?

Однако она также вводит сложность в разработку программного обеспечения, поскольку разработчикам необходимо учитывать вопросы синхронизации доступа к общим ресурсам, управления состоянием потоков и потенциальных проблем с безопасностью потоков, таких как гонки за данные (race conditions), взаимные блокировки (deadlocks) и проблемы с последовательностью операций.

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

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

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

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

🤔 Типы:

1️⃣ Арифметические операторы

2️⃣ Логические операторы

3️⃣ Операторы сравнения

4️⃣ Условный оператор

5️⃣ Операторы доступа к свойствам и коллекциям

1️⃣ Арифметические операторы

Позволяют выполнять математические операции на числах.

Сложение (`+`): Складывает два числа.

    ${5 + 3}  <!-- Результат: 8 -->


Вычитание (`-`): Вычитает второе число из первого.

    ${10 - 4}  <!-- Результат: 6 -->


Умножение (`*`): Умножает два числа.

    ${2 * 3}  <!-- Результат: 6 -->


Деление (`/`): Делит первое число на второе.

    ${10 / 2}  <!-- Результат: 5 -->


Остаток от деления (`%`): Возвращает остаток от деления первого числа на второе.

    ${10 % 3}  <!-- Результат: 1 -->


2️⃣ Логические операторы

Позволяют выполнять логические операции, такие как И (AND), ИЛИ (OR), НЕ (NOT).

Логическое И (`&&` или `and`): Возвращает true, если оба операнда истинны.

    ${true && false}  <!-- Результат: false -->
${true and true} <!-- Результат: true -->


Логическое ИЛИ (`||` или `or`): Возвращает true, если хотя бы один из операндов истинен.

    ${true || false}  <!-- Результат: true -->
${false or false} <!-- Результат: false -->


Логическое НЕ (`!` или `not`): Возвращает true, если операнд ложен.

    ${!true}  <!-- Результат: false -->
${not false} <!-- Результат: true -->


3️⃣ Операторы сравнения

Позволяют сравнивать два значения.

Равно (`==` или `eq`): Возвращает true, если операнды равны.

    ${5 == 5}  <!-- Результат: true -->
${5 eq 5} <!-- Результат: true -->


Не равно (`!=` или `ne`): Возвращает true, если операнды не равны.

    ${5 != 3}  <!-- Результат: true -->
${5 ne 3} <!-- Результат: true -->


Меньше (`<` или `lt`): Возвращает true, если первый операнд меньше второго.

    ${3 < 5}  <!-- Результат: true -->
${3 lt 5} <!-- Результат: true -->


Меньше или равно (`<=` или `le`): Возвращает true, если первый операнд меньше или равен второму.

    ${3 <= 5}  <!-- Результат: true -->
${3 le 5} <!-- Результат: true -->


Больше (`>` или `gt`): Возвращает true, если первый операнд больше второго.

    ${5 > 3}  <!-- Результат: true -->
${5 gt 3} <!-- Результат: true -->


4️⃣ Условный оператор

Позволяет выполнять условное выражение и возвращает одно из двух значений в зависимости от логического условия.
${(5 > 3) ? 'Greater' : 'Lesser'}  <!-- Результат: Greater -->


5️⃣ Операторы доступа к свойствам и коллекциям

Позволяют получать доступ к свойствам объектов и элементам коллекций и массивов.

Доступ к свойствам объектов: Используется точечная нотация для доступа к свойствам JavaBeans.

    ${user.name}  <!-- Доступ к свойству name объекта user -->


Доступ к элементам коллекций и массивов: Используются квадратные скобки для доступа к элементам коллекций и массивов.

    ${users[0].name}  <!-- Доступ к первому элементу списка users -->
${map['key']} <!-- Доступ к значению по ключу 'key' в карте -->


🤔 Примеры:

Арифметические операторы
<p>Sum: ${5 + 3}</p>  <!-- Вывод: Sum: 8 -->
<p>Difference: ${10 - 4}</p> <!-- Вывод: Difference: 6 -->
<p>Product: ${2 * 3}</p> <!-- Вывод: Product: 6 -->
<p>Quotient: ${10 / 2}</p> <!-- Вывод: Quotient: 5 -->
<p>Remainder: ${10 % 3}</p> <!-- Вывод: Remainder: 1 -->


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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤔41
😁10👍21
📌 Какие есть неявные, внутренние объекты JSP EL и их отличия от объектов JSP ?

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

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

🤔 Описание неявных объектов

1️⃣ pageScope

Предоставляет доступ к атрибутам области видимости страницы (page scope).
<% pageContext.setAttribute("pageAttribute", "Page Scope Value"); %>
<p>Page Attribute: ${pageScope.pageAttribute}</p>


2️⃣ requestScope

Предоставляет доступ к атрибутам области видимости запроса (request scope).
<% request.setAttribute("requestAttribute", "Request Scope Value"); %>
<p>Request Attribute: ${requestScope.requestAttribute}</p>


3️⃣ sessionScope

Предоставляет доступ к атрибутам области видимости сессии (session scope).
<% session.setAttribute("sessionAttribute", "Session Scope Value"); %>
<p>Session Attribute: ${sessionScope.sessionAttribute}</p>


4️⃣ applicationScope

Предоставляет доступ к атрибутам области видимости приложения (application scope).
<% application.setAttribute("applicationAttribute", "Application Scope Value"); %>
<p>Application Attribute: ${applicationScope.applicationAttribute}</p>


5️⃣ param

Предоставляет доступ к параметрам запроса (query parameters) в виде строк.
<!-- URL: http://example.com/page.jsp?name=John -->
<p>Request Parameter: ${param.name}</p>


6️⃣ paramValues

Предоставляет доступ к параметрам запроса в виде массивов строк (для параметров с несколькими значениями).
<!-- URL: http://example.com/page.jsp?name=John&name=Doe -->
<p>Request Parameter Values: ${paramValues.name[0]}, ${paramValues.name[1]}</p>


7️⃣ header

Предоставляет доступ к заголовкам HTTP запроса в виде строк.
<p>User-Agent: ${header['User-Agent']}</p>


8️⃣ headerValues

Предоставляет доступ к заголовкам HTTP запроса в виде массивов строк (для заголовков с несколькими значениями).
<p>Header Values: ${headerValues['Accept'][0]}, ${headerValues['Accept'][1]}</p>


🤔 Отличия между неявными объектами

1️⃣ Синтаксис и доступность:

JSP: Неявные объекты доступны напрямую в скриптлетах и выражениях внутри JSP страниц (например, request, response, session, application).

JSP EL: Неявные объекты EL доступны через синтаксис ${...} и обеспечивают более чистый и понятный способ доступа к данным.

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

JSP: Неявные объекты предоставляют доступ к данным и контексту выполнения напрямую через Java объекты (например, request.getParameter("name")).

JSP EL: Неявные объекты EL упрощают доступ к данным через области видимости, такие как pageScope, requestScope, sessionScope, и applicationScope, что позволяет легко различать источники данных.

3️⃣ Функциональность:

JSP: Обеспечивает полный доступ ко всем методам и свойствам Java объектов.

JSP EL: Обеспечивает ограниченный, но удобный доступ к часто используемым данным и свойствам, улучшая читабельность и поддержку кода.

🤔 Примеры:

JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>JSP Example</noscript>
</head>
<body>
<% request.setAttribute("attribute", "Request Scope Value"); %>
<p>Request Attribute: <%= request.getAttribute("attribute") %></p>
</body>
</html>


JSP EL
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>JSP EL Example</noscript>
</head>
<body>
<% request.setAttribute("attribute", "Request Scope Value"); %>
<p>Request Attribute: ${requestScope.attribute}</p>
</body>
</html>


Неявные объекты JSP EL (pageScope, requestScope, sessionScope, applicationScope, param, paramValues, header, headerValues, cookie, initParam, pageContext) предоставляют удобный и чистый способ доступа к данным и контексту выполнения веб-приложения. В отличие от неявных объектов JSP, они обеспечивают более структурированный и читаемый подход к управлению данными и их обработке в JSP страницах.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🤯1
📌 Что такое JSTL, JSP Standard tag library ?

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

JSTL (JSP Standard Tag Library) — это библиотека стандартных тегов для JSP (JavaServer Pages), которая предоставляет набор общих функций для JSP страниц. JSTL упрощает разработку веб-приложений, уменьшая количество Java-кода, который нужно писать в JSP, за счёт использования стандартных тегов для выполнения различных задач.

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

1️⃣ Циклы и условия: Теги для выполнения итераций (циклов) и условий, что упрощает управление логикой внутри JSP страниц.

2️⃣ Манипуляции с XML: Теги для работы с XML-документами, позволяющие парсить, трансформировать и выводить данные из XML.

3️⃣ Форматирование: Теги для форматирования чисел, дат и строк, что помогает в локализации и интернационализации веб-приложений.

4️⃣ SQL теги: Теги для выполнения SQL-запросов и обработки результатов внутри JSP страниц, хотя их использование в реальных проектах обычно не рекомендуется по соображениям безопасности и архитектурной чистоты.

5️⃣ Функции: JSTL предоставляет набор функций, которые могут быть использованы в выражениях EL (Expression Language) для работы со строками, коллекциями и другими данными.


<%@ taglib uri="htp://jav.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="htp://jav.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<noscript>Пример JSTL</noscript>
</head>
<body>
<h2>Пример использования циклов и условий JSTL</h2>
<c:choose>
<c:when test="${user != null}">
<p>Добро пожаловать, ${user.name}!</p>
</c:when>
<c:otherwise>
<p>Пожалуйста, войдите в систему.</p>
</c:otherwise>
</c:choose>

<h2>Пример форматирования даты JSTL</h2>
<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd" />

<h2>Пример итерации по коллекции JSTL</h2>
<ul>
<c:forEach var="item" items="${items}">
<li>${item}</li>
</c:forEach>
</ul>
</body>
</html>


JSTL — это библиотека стандартных тегов для JSP, которая упрощает разработку веб-приложений.

Включает теги для циклов, условий, работы с XML, форматирования данных и выполнения SQL-запросов.

Пример кода показывает использование тегов для условий, форматирования даты и итерации по коллекции.

JSTL позволяет писать меньше Java-кода и использовать более понятные и удобные теги для выполнения часто встречающихся задач в JSP.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Какой метод используется для клонирования объекта в Java?
Anonymous Quiz
85%
clone()
12%
copy()
1%
replicate()
2%
duplicate()
👍71
📌 Из каких групп тегов состоит библиотека JSTL ?

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

Библиотека JSP Standard Tag Library (JSTL) состоит из нескольких групп тегов, каждая из которых предназначена для выполнения определенных типов задач.

1️⃣ Core Tags (Основные теги)

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

🤔 Основные теги:

`<c:out>`: Выводит значение выражения EL.

    <c:out value="${user.name}" />


<c:if>: Выполняет условную проверку и отображает содержимое, если условие истинно.

    <c:if test="${user.loggedIn}">
<p>Welcome, ${user.name}!</p>
</c:if>


<c:choose>,📌 Из каких 📌 Из каких групп Выполняет многоуровневую условную проверку.

    <c:choose>
<c:when test="${user.role == 'admin'}">
<p>Admin Section</p>
</c:when>
<c:otherwise>
<p>User Section</p>
</c:otherwise>
</c:choose>


(Основные те Итерация по коллекции или массиву.

    <c:forEach var="item" items="${items}">
<p>${item}</p>
</c:forEach>


2️⃣ Formatting Tags (Теги форматирования)

Теги форматирования JSTL используются для форматирования текста, чисел, дат и выполнения интернационализации.

🤔 Основные теги:

<fmt:formatNumber>: Форматирует число.

    <fmt:formatNumber value="${amount}" type="currency" />


<fmt:formatDate>: Форматирует дату.

    <fmt:formatDate value="${date}" pattern="yyyy-MM-dd" />


<fmt:parseNumber>: Парсит строку в число.

    <fmt:parseNumber var="number" value="1,234.56" type="number" />


3️⃣ SQL Tags (Теги SQL)

Позволяют выполнять запросы к базе данных и обрабатывать результаты.

🤔 Основные теги:

<sql:setDataSource>: Устанавливает источник данных.

    <sql:setDataSource var="dataSource" driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"
user="root" password="password" />


1️⃣ Core T Выполняет SQL-запрос и сохраняет результат.

    <sql:query dataSource="${dataSource}" var="result">
SELECT * FROM users
</sql:query>


<sql:update>: Выполняет SQL-операцию обновления (INSERT, UPDATE, DELETE).

    <sql:update dataSource="${dataSource}">
UPDATE users SET name='John Doe' WHERE id=1
</sql:update>


4️⃣ XML Tags (Теги XML)

Используются для работы с XML-документами, таких как парсинг, трансформация и выполнение XPath-запросов.

🤔 Основные теги:

<x:parse>: Парсит XML-документ.

    <x:parse var="doc" xml="${xmlContent}" />


5️⃣ Functions (Функции)

Также предоставляет набор функций для выполнения различных операций на строках, коллекциях и других данных.

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

1️⃣ Cor Проверяет, содержит ли строка подстроку.

    ${fn:contains(user.name, 'John')}


fn:containsIgnoreCase: Проверяет, содержит ли строка подстроку без учета регистра.

    ${fn:containsIgnoreCase(user.name, 'john')}


fn:endsWith: Проверяет, заканчивается ли строка заданной подстрокой.

    ${fn:endsWith(user.name, 'Doe')}


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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤯2
📌 Как можно расширить функциональность JSP ?

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

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

1️⃣ Использование сторонних библиотек и JSTL

JavaServer Pages Standard Tag Library (JSTL)
JSTL предоставляет набор стандартных тегов для выполнения распространённых задач, таких как итерация, условные конструкции, работа с коллекциями, форматирование и интернационализация.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

<c:if test="${user.loggedIn}">
<p>Welcome, ${user.name}!</p>
</c:if>

<fmt:formatDate value="${date}" pattern="yyyy-MM-dd" />

<sql:query dataSource="${dataSource}" var="result">
SELECT * FROM users
</sql:query>


2️⃣ Создание пользовательских тегов и теговых библиотек

Пользовательские теги позволяют инкапсулировать повторяющийся код и функциональность в простые и переиспользуемые компоненты.

🤔 Шаги для создания пользовательского тега:

1️⃣ Создание теговой библиотеки (TLD файл):

      <?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>custom</short-name>
<uri>http://example.com/custom</uri>
<tag>
<name>hello</name>
<tag-class>com.example.tags.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>


2️⃣ Создание класса пользовательского тега:

      package com.example.tags;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;

public class HelloTag extends TagSupport {
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello, World!");
} catch (IOException e) {
throw new JspException("Error: " + e.getMessage());
}
return SKIP_BODY;
}
}


3️⃣ Использование пользовательского тега в JSP странице:

      <%@ taglib uri="http://example.com/custom" prefix="custom" %>
<custom:hello />


3️⃣ Интеграция с Java фреймворками

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

🤔 Пример контроллера Spring MVC:
@Controller
public class UserController {
@GetMapping("/user")
public String getUser(Model model) {
User user = new User("John Doe");
model.addAttribute("user", user);
return "user";
}
}


🤔 Пример:
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<html>
<head>
<noscript>User Page</noscript>
</head>
<body>
<h1>Welcome, <spring:eval expression="user.name" /></h1>
</body>
</html>


🤔 Для расширения функциональности JSP вы можете использовать:

1️⃣ JSTL и сторонние библиотеки для выполнения распространённых задач.

2️⃣ Пользовательские теги и теговые библиотеки для инкапсуляции повторяющегося кода.

3️⃣ Интеграцию с Java фреймворками, такими как Spring MVC, для создания более структурированных приложений.

4️⃣ Expression Language (EL) и функции EL для упрощения доступа к данным и выполнения специальных операций.

Эти методы помогут сделать код более чистым, поддерживаемым и функциональным.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👀21
📌 Как сделать перенос строки в HTML средствами JSP ?

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

Для переноса строки в HTML с помощью JSP можно использовать несколько методов, включая непосредственно HTML теги, JSP Expression Language (EL) и JSTL (JavaServer Pages Standard Tag Library).

1️⃣ Использование HTML тегов

Самый простой способ сделать перенос строки в HTML — использовать тег <br>.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>Line Break Example</noscript>
</head>
<body>
<p>This is line 1.<br>This is line 2.</p>
</body>
</html>


2️⃣ Использование JSP Expression Language (EL)

Если получаете строку из бэкэнда и хотите вставить переносы строк, можно преобразовать символы новой строки (\n) в HTML тег <br>.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<noscript>EL Line Break Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.";
request.setAttribute("text", text);
%>
<p>${fn:replace(text, '\n', '<br>')}</p>
</body>
</html>


3️⃣ Использование JSTL и тегов c:forEach

Можно разделить строку на части и вывести каждую часть в отдельном абзаце или строке.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<noscript>JSTL Line Break Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.\nThis is line 3.";
request.setAttribute("text", text);
%>
<c:forEach var="line" items="${fn:split(text, '\n')}">
<p>${line}</p>
</c:forEach>
</body>
</html>


4️⃣ Обработка многострочного текста с использованием pre тега

Для отображения многострочного текста без необходимости замены символов новой строки можно использовать HTML тег <pre>.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>Preformatted Text Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.\nThis is line 3.";
request.setAttribute("text", text);
%>
<pre>${text}</pre>
</body>
</html>


5️⃣ Использование пользовательского метода в JSP

Также можно создать пользовательский метод в классе Java, который будет заменять символы новой строки на теги <br>, и использовать его в JSP странице.

Класс утилит:
package com.example.util;

public class StringUtil {
public static String convertNewlinesToHtml(String text) {
if (text == null) {
return "";
}
return text.replace("\n", "<br>");
}
}


JSP страница:
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.example.util.StringUtil" %>
<html>
<head>
<noscript>Custom Method Line Break Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.";
%>
<p><%= StringUtil.convertNewlinesToHtml(text) %></p>
</body>
</html>


🤔 Для переноса строки в HTML с использованием JSP можно применять различные методы:

1️⃣ HTML тег `<br>`: Самый простой способ для статического текста.

2️⃣ JSP Expression Language (EL): Преобразование символов новой строки в теги <br> с помощью функции fn:replace.

3️⃣ JSTL и c:forEach: Разделение текста на строки и вывод каждой строки отдельно.

4️⃣ HTML тег <pre>: Для отображения многострочного текста без изменений.

5️⃣ Пользовательский метод: Создание и использование метода для преобразования символов новой строки в теги <br>.

Каждый из этих методов имеет свои преимущества и используется в зависимости от конкретных требований и контекста задачи.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Почему не нужно конфигурировать стандартные JSP теги в web.xml ?

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

Конфигурирование стандартных JSP тегов в web.xml не требуется по нескольким причинам. Основная причина заключается в том, что стандартные теги JSP, такие как JSTL (JavaServer Pages Standard Tag Library), уже поддерживаются контейнером сервлетов, и их использование упрощается с помощью декларативного подхода в самих страницах.

🔥 Причины:

1️⃣ Декларативное подключение в JSP страницах:

Стандартные теги, такие как JSTL, подключаются непосредственно в JSP страницах с помощью директивы <%@ taglib %>. Это упрощает процесс и устраняет необходимость дополнительных настроек в web.xml.
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>


2️⃣ Упрощение конфигурации:

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

3️⃣ Избежание избыточности:

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

4️⃣ Поддержка контейнером сервлетов:

Современные контейнеры сервлетов (например, Apache Tomcat) имеют встроенную поддержку JSTL и других стандартных теговых библиотек. Это означает, что контейнер автоматически управляет загрузкой и инициализацией этих библиотек.

5️⃣ Гибкость и масштабируемость:

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

6️⃣ Соответствие спецификациям:

Спецификации JSP и JSTL предусматривают использование теговых библиотек через директиву <%@ taglib %>, что является стандартным и рекомендуемым способом подключения. Это обеспечивает совместимость и переносимость кода между различными сервлет-контейнерами.

🤔 Примеры:

JSTL Core Tags
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<noscript>JSTL Core Tags Example</noscript>
</head>
<body>
<c:set var="user" value="John Doe" />
<c:if test="${not empty user}">
<p>Welcome, ${user}!</p>
</c:if>
</body>
</html>


JSTL Formatting Tags
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<noscript>JSTL Formatting Tags Example</noscript>
</head>
<body>
<fmt:formatDate value="${pageContext.request.time}" pattern="yyyy-MM-dd HH:mm:ss" var="formattedDate" />
<p>Current Date and Time: ${formattedDate}</p>
</body>
</html>


Конфигурирование стандартных JSP тегов в web.xml не требуется, потому что:

1️⃣ Теги подключаются декларативно в самих JSP страницах, что упрощает процесс.

2️⃣ Упрощается конфигурация и избегается избыточность.

3️⃣ Современные сервлет-контейнеры поддерживают стандартные теги и управляют их инициализацией автоматически.

4️⃣ Декларативное подключение на уровне страниц обеспечивает большую гибкость и соответствие спецификациям JSP и JSTL.

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

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

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