Home » Учебник по Struts для начинающих
Учебник по Struts для начинающих

Учебник по 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 — это не плохой фреймворк, он просто принадлежит к другой эпохе. Если вам нужно с ним работать, делайте это правильно, соблюдая все меры безопасности и лучшие практики.


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

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

Leave a reply

Your email address will not be published. Required fields are marked