Как избежать Java-кода (scriptlet) в JSP-файлах при использовании JSP 2?
Полный отказ от scriptlet'ов: используем EL и JSTL
Вы на верном пути. В JSP 2.0 и выше скриптлеты считаются устаревшим подходом. Основные инструменты для замены — Expression Language (EL) для доступа к данным и JSTL (JSP Standard Tag Library) для управления логикой представления. Давайте перепишем ваш пример шаг за шагом.
1. Подготовка сервлета (или контроллера)
Вся бизнес-логика и подготовка данных должны быть вынесены в сервлет или другой компонент (например, Spring MVC Controller). Ваш сервлет должен поместить данные в атрибуты запроса:
// UserServlet.java
@WebServlet("/users")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
List<User> users = userService.getAllUsers(); // получение данных
request.setAttribute("users", users);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
2. Использование Expression Language (EL) в JSP
EL позволяет обращаться к атрибутам напрямую. Например, чтобы вывести имя пользователя, вместо out.println(user.getName()) пишем ${user.name}. EL автоматически вызывает геттеры.
3. Замена цикла и условий на JSTL
Для замены цикла for используем тег <c:forEach>. Для условного вывода — <c:choose> или <c:if>. Вот как будет выглядеть ваш обновлённый index.jsp:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<table>
<c:forEach var="user" items="${users}">
<tr>
<td>${user.name}</td>
<td>
<c:choose>
<c:when test="${user.active}">Активен</c:when>
<c:otherwise>Неактивен</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
4. Дополнительные возможности JSTL
- Форматирование:
<fmt:formatDate>для дат,<fmt:formatNumber>для чисел. - Условные операторы:
<c:if>для простых условий,<c:choose>для сложных. - Работа со строками:
<c:out>для экранирования вывода (безопасность от XSS).
5. Что делать, если логика всё ещё сложна?
Если вам нужно выполнить сложное преобразование данных (например, подсчёт суммы), не пишите это в JSP. Создайте вспомогательный класс (например, UserHelper) и вызовите его метод через EL, зарегистрировав его как бин или используя статические методы с помощью @WebServlet или @Named в CDI.
Итоговый рецепт
Чтобы полностью избежать Java-кода в JSP:
- Вынесите всю логику в сервлеты/контроллеры.
- Подключите JSTL (добавьте зависимость
jstlвpom.xmlилиbuild.gradle). - Используйте EL для доступа к данным.
- Замените scriptlet'ы на теги JSTL.
- Для форматирования используйте библиотеку
fmt.
После этого ваши JSP-файлы станут чистыми, читаемыми и безопасными. Никаких больше <% %>!
Альтернативный подход: использование MVC-фреймворков (Spring MVC)
Если вы готовы к более серьёзной модернизации, рекомендую перейти на Spring MVC (или аналогичный фреймворк). Spring полностью исключает необходимость в scriptlet'ах, предоставляя:
- Контроллеры с аннотациями — вся логика в Java-классах, никаких сервлетов вручную.
- ModelAndView — данные передаются в модель, а JSP использует только EL.
- Встроенная поддержка JSTL — без дополнительных настроек.
- Формы и валидация — через Spring Form Tags (
<form:form>).
Пример контроллера:
@Controller
public class UserController {
@GetMapping("/users")
public String getUsers(Model model) {
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
return "index"; // имя JSP без расширения
}
}
В JSP остаётся только HTML и EL. Это самый чистый и современный подход, который используется в промышленной разработке. Если проект позволяет, мигрируйте на Spring Boot — это даст вам ещё больше удобств (автоконфигурация, embedded Tomcat).