- Home »

Учебник по Struts для начинающих
Если вы серьёзно взялись за Java-разработку или админите сервера, где крутятся энтерпрайзные веб-приложения, то рано или поздно столкнётесь с Apache Struts. Это один из тех фреймворков, который может как облегчить жизнь разработчикам, так и стать источником головной боли для админов. Struts — это MVC-фреймворк для создания веб-приложений на Java, который уже больше 20 лет помогает строить корпоративные системы. Сегодня разберём, как его поднять, настроить и не получить дырку в безопасности размером с космический корабль.
Что такое Struts и почему он всё ещё актуален
Apache Struts — это фреймворк для разработки веб-приложений на Java, который реализует паттерн Model-View-Controller (MVC). Существует две основные версии:
- Struts 1.x — legacy-версия, которая всё ещё встречается в старых проектах
- Struts 2.x — современная версия с более гибкой архитектурой
Да, многие кричат, что Spring Boot уже давно захватил мир, но Struts до сих пор живёт в банках, страховых компаниях и государственных системах. И если вам нужно поддерживать или развивать такие проекты, знание Struts — это не роскошь, а необходимость.
Как это работает: архитектура и принципы
Struts 2 работает на основе нескольких ключевых компонентов:
- Action — основная бизнес-логика приложения
- Result — определяет, какой view будет отображён
- Interceptor — обработчики, которые выполняются до и после Action
- Value Stack — контекст данных, доступных в view
Весь процесс обработки запроса выглядит примерно так: запрос попадает в FilterDispatcher, который определяет нужный Action, запускает цепочку Interceptor’ов, выполняет Action и возвращает Result.
Быстрая настройка: от нуля до Hello World
Для начала нужен сервер с Java. Если у вас его нет, можете взять VPS или выделенный сервер.
Шаг 1: Установка необходимых компонентов
# Обновляем систему
sudo apt update && sudo apt upgrade -y
# Устанавливаем Java 8 (Struts 2 хорошо работает с Java 8)
sudo apt install openjdk-8-jdk -y
# Устанавливаем Maven
sudo apt install maven -y
# Устанавливаем Tomcat
sudo apt install tomcat9 -y
# Проверяем версии
java -version
mvn --version
sudo systemctl status tomcat9
Шаг 2: Создание проекта
# Создаём новый Maven проект
mvn archetype:generate -DgroupId=com.example.struts \
-DartifactId=struts-hello-world \
-DarchetypeArtifactId=maven-archetype-webapp \
-DinteractiveMode=false
cd struts-hello-world
Шаг 3: Настройка pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.struts</groupId>
<artifactId>struts-hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<struts2.version>2.5.30</struts2.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Шаг 4: Настройка web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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-app_3_0.xsd"
version="3.0">
<display-name>Struts Hello World</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Шаг 5: Создание Action класса
// src/main/java/com/example/struts/HelloWorldAction.java
package com.example.struts;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String message;
public String execute() throws Exception {
setMessage("Hello World from Struts 2!");
return SUCCESS;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Шаг 6: Создание JSP страницы
<!-- src/main/webapp/hello.jsp -->
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1><s:property value="message" /></h1>
<p>Current time: <s:date name="new java.util.Date()" format="yyyy-MM-dd HH:mm:ss" /></p>
</body>
</html>
Шаг 7: Настройка struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="hello" class="com.example.struts.HelloWorldAction" method="execute">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
Шаг 8: Сборка и деплой
# Собираем проект
mvn clean package
# Копируем в Tomcat
sudo cp target/struts-hello-world-1.0-SNAPSHOT.war /var/lib/tomcat9/webapps/
# Перезапускаем Tomcat
sudo systemctl restart tomcat9
# Проверяем статус
sudo systemctl status tomcat9
Теперь можно открыть браузер и перейти по адресу: http://your-server-ip:8080/struts-hello-world-1.0-SNAPSHOT/hello
Практические примеры и кейсы
Положительные кейсы
Сценарий | Преимущества | Рекомендации |
---|---|---|
Корпоративные формы | Мощная валидация, интернационализация | Используйте аннотации для валидации |
CRUD-операции | Простая интеграция с Hibernate | Настройте connection pooling |
Файловые загрузки | Встроенная поддержка multipart | Ограничьте размер файлов |
Проблемные кейсы
Проблема | Симптомы | Решение |
---|---|---|
OGNL-инъекции | Странные запросы в логах | Обновите до последней версии, используйте whitelist |
Утечки памяти | OutOfMemoryError в Tomcat | Настройте правильные scope для Action |
Медленная работа | Долгие ответы сервера | Отключите devMode в продакшене |
Мониторинг и отладка
Для мониторинга Struts-приложений я рекомендую использовать следующие инструменты:
# Настройка логирования (log4j2.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="FileAppender" fileName="/var/log/tomcat9/struts.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="com.opensymphony.xwork2" level="DEBUG"/>
<Logger name="org.apache.struts2" level="DEBUG"/>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>
Безопасность: что нужно знать
Struts имеет богатую историю уязвимостей, особенно связанных с OGNL. Вот основные меры безопасности:
# Настройки безопасности в struts.xml
<struts>
<constant name="struts.devMode" value="false" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.enable.SlashesInActionNames" value="false" />
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
<constant name="struts.allowStaticMethodAccess" value="false" />
<!-- Ограничение на размер файлов -->
<constant name="struts.multipart.maxSize" value="10485760" />
</struts>
Альтернативы и сравнения
Вот сравнение Struts с другими популярными фреймворками:
Фреймворк | Сложность изучения | Производительность | Актуальность |
---|---|---|---|
Struts 2 | Средняя | Средняя | Legacy |
Spring MVC | Высокая | Высокая | Высокая |
Spring Boot | Низкая | Высокая | Очень высокая |
Основные альтернативы:
- Spring Framework — де-факто стандарт
- Javalin — лёгкий веб-фреймворк
- Spark Java — микро-фреймворк
- Quarkus — для cloud-native приложений
Интересные факты и нестандартные способы использования
Несколько интересных фактов о Struts:
- Struts 1 был выпущен в 2000 году и стал одним из первых популярных Java веб-фреймворков
- Struts 2 на самом деле основан на WebWork фреймворке, а не на Struts 1
- Самая известная уязвимость Struts (CVE-2017-5638) привела к взлому Equifax
- Struts до сих пор используется в критически важных системах банков и правительственных организаций
Нестандартные способы использования:
- REST API — с помощью struts2-rest-plugin можно создавать RESTful сервисы
- Интеграция с Docker — контейнеризация Struts-приложений для микросервисной архитектуры
- Интеграция с современными фронтендами — использование Struts как backend для React/Vue приложений
Автоматизация и скрипты
Вот несколько полезных скриптов для автоматизации работы со Struts:
#!/bin/bash
# Скрипт для автоматического деплоя Struts-приложения
APP_NAME="myapp"
WAR_FILE="target/${APP_NAME}.war"
TOMCAT_DIR="/var/lib/tomcat9/webapps"
BACKUP_DIR="/opt/backups"
# Создаём бэкап текущей версии
if [ -d "$TOMCAT_DIR/$APP_NAME" ]; then
echo "Creating backup..."
tar -czf "$BACKUP_DIR/${APP_NAME}_$(date +%Y%m%d_%H%M%S).tar.gz" -C "$TOMCAT_DIR" "$APP_NAME"
rm -rf "$TOMCAT_DIR/$APP_NAME"
rm -f "$TOMCAT_DIR/${APP_NAME}.war"
fi
# Копируем новую версию
echo "Deploying new version..."
cp "$WAR_FILE" "$TOMCAT_DIR/"
# Перезапускаем Tomcat
echo "Restarting Tomcat..."
sudo systemctl restart tomcat9
# Ждём запуска
sleep 10
# Проверяем статус
if curl -f -s "http://localhost:8080/$APP_NAME/health" > /dev/null; then
echo "Deployment successful!"
else
echo "Deployment failed! Check logs."
exit 1
fi
Оптимизация производительности
Для оптимизации Struts-приложений рекомендую:
# Настройки JVM для Tomcat
# /etc/default/tomcat9
CATALINA_OPTS="-Xms512m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC -XX:+UseStringDeduplication"
CATALINA_OPTS="$CATALINA_OPTS -Dfile.encoding=UTF-8 -Dnet.sf.ehcache.skipUpdateCheck=true"
# Отключение devMode в продакшене
<constant name="struts.devMode" value="false" />
<constant name="struts.configuration.xml.reload" value="false" />
<constant name="struts.freemarker.templatesCache" value="true" />
Заключение и рекомендации
Struts — это фреймворк с богатой историей, который до сих пор широко используется в энтерпрайзе. Несмотря на то, что новые проекты чаще стартуют на Spring Boot, знание Struts остаётся актуальным для поддержки legacy-систем.
Когда использовать Struts:
- Поддержка существующих приложений
- Миграция с Struts 1 на Struts 2
- Корпоративные системы с жёсткими требованиями к стабильности
- Команда с большим опытом работы со Struts
Когда НЕ использовать Struts:
- Новые проекты (лучше выбрать Spring Boot)
- Микросервисная архитектура
- Высоконагруженные системы
- Проекты с активной разработкой API
Ключевые рекомендации:
- Всегда используйте последнюю версию Struts для минимизации рисков безопасности
- Настройте мониторинг и логирование с первого дня
- Регулярно обновляйте зависимости и следите за CVE
- Рассмотрите возможность постепенной миграции на более современные фреймворки
Помните: Struts — это не плохой фреймворк, он просто принадлежит к другой эпохе. Если вам нужно с ним работать, делайте это правильно, соблюдая все меры безопасности и лучшие практики.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.