Добро пожаловать в учебник Struts для начинающих. Struts – один из старейших фреймворков для создания веб-приложений на Java.
Учебник по Struts
Struts был первоначальной реализацией шаблона проектирования MVC, и он существенно развивался вместе с последними улучшениями в технологиях Java, Java EE. Статья учебника по Struts призвана предоставить основные сведения о Struts 2 и о том, как создать наше первое приложение “Привет, мир” с использованием Struts 2.
Struts 2
Apache Struts 2 – это открытый стандартный, гибкий и расширяемый фреймворк для создания веб-приложений Java EE. Struts 2 основан на фреймворке OpenSymphony WebWork. Struts 2 очень гибок в разработке и настройке, и мы рассмотрим, насколько легко разрабатывать веб-приложение с использованием фреймворка Struts 2.
Диаграмма архитектуры Struts 2
Ниже приведена диаграмма, показывающая различные компоненты Struts 2 в веб-приложении.
Перехватчики Struts 2
Перехватчики Struts похожи на Фильтры Servlet, которые выполняются до и после обработки запроса. Они используются для выполнения общих операций для разных действий. Например, ведение журнала, проверка сеанса, добавление общих заголовков к ответу и т. д.
Стек значений и OGNL Struts 2
ValueStack – это область хранения, в которой приложение хранит данные для обработки запроса клиента в Struts 2. Данные хранятся в объектах ActionContext
, которые используют ThreadLocal для хранения значений, специфичных для конкретного потока запросов. Язык навигации по объектному графу (OGNL) – это мощный язык выражений, который используется для манипуляции данными, хранящимися в ValueStack. Как видно на схеме архитектуры, как интерцепторы, так и страницы результатов могут получать доступ к данным, хранящимся в ValueStack, используя OGNL.
Действие Struts 2
Компоненты действий Struts 2 обрабатывают запросы клиентов. Struts 2 предоставляет различные способы создания классов действий.
- Путем реализации интерфейса
com.opensymphony.xwork2.Action
. - Путем расширения класса
com.opensymphony.xwork2.ActionSupport
. Обычно используется для создания пустых классов действий для переадресации запроса другому ресурсу. - Аннотирование класса аннотацией @Action или @Actions.
- Следуя соглашению об именовании классов, имя должно заканчиваться на Action и должно содержать метод execute().
Результаты Struts 2
Компоненты результатов обычно являются JSP- или HTML-страницами для создания представления для ответа клиента. Struts 2 предоставляет собственные теги, которые мы можем использовать в JSP-страницах для создания ответа. Теги Struts отличный пример Пользовательских тегов JSP.
Декларативная архитектура и связывание Struts 2
Struts 2 предоставляет два способа настройки нашего приложения для классов действий и страниц результатов.
- Файл Struts XML: У нас есть файл struts.xml в каталоге WEB-INF/classes, где мы можем настроить классы действий и страницы результатов нашего приложения.
- Аннотация: Мы можем использовать Аннотации Java для предоставления метаданных о классе. Плагин соглашений Struts 2 может использоваться для аннотирования java-классов с аннотациями @Action и @Result для создания настройки классов действий и связанных страниц результатов.
Каким бы способом мы ни использовали для настройки нашего приложения, конечный результат всегда будет одинаковым.
Учебник по Struts – Привет, мир XML-приложения на основе
Давайте посмотрим, как мы можем создать наше первое приложение Hello World в Struts 2. Прежде всего нам нужны файлы jar Struts 2, самый простой способ – загрузить их с официальной страницы загрузок Struts 2. Но когда вы проверите библиотеки в загруженном архиве, вы увидите много файлов jar, которые нам не нужны для нашего простого приложения. Поэтому я создам проект Maven и добавлю только зависимость от struts-core, все остальные транзитивные зависимости будут автоматически загружены и добавлены в приложение. Наша конечная структура проекта будет такой, как на изображении ниже. Создайте новый динамический веб-проект Struts2XMLHelloWorld в Eclipse, а затем преобразуйте его в проект Maven, как показано на изображении ниже.
Вы заметите, что файл pom.xml добавлен в корневой каталог проекта. Наша настройка проекта в Eclipse готова, давайте рассмотрим различные компоненты по порядку.
pom.xml
Откройте файл pom.xml и добавьте зависимость от struts core, окончательный pom.xml будет выглядеть следующим образом.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Struts2XMLHelloWorld</groupId>
<artifactId>Struts2XMLHelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.15.1</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
Обратите внимание, что я переопределил элемент finalName
, чтобы избежать добавления номера версии в файл WAR при сборке с помощью Maven. Остальные части добавлены самим Eclipse, единственной зависимостью, которую нам нужно, является struts2-core, текущая версия которой 2.3.15.1 (на 10 сентября 2013 года). Просто выполните сборку приложения с помощью Maven, и вы увидите, что к приложению добавлено много JAR-файлов в каталог lib приложения и отображено в разделе Maven Dependencies проекта, как показано на изображении ниже.
Конфигурация web.xml для Struts 2
Нам нужно добавить фильтр org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
в веб-приложение и указать шаблон URL, где мы хотим, чтобы Struts обрабатывал запросы клиентов. Наш web.xml выглядит следующим образом;
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns="https://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Struts2XMLHelloWorld</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Для версии Struts 2 ниже 2.1.3 filter-class был org.apache.struts2.dispatcher.FilterDispatcher
.
Учебник по Struts – Страницы результатов
У нас есть три страницы JSP, которые будут использоваться приложением, мы используем теги Struts 2 для создания наших страниц JSP. login.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<%-- Using Struts2 Tags in JSP --%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<h3>Welcome User, please login below</h3>
<s:form action="login">
<s:textfield name="name" label="User Name"></s:textfield>
<s:textfield name="pwd" label="Password" type="password"></s:textfield>
<s:submit value="Login"></s:submit>
</s:form>
</body>
</html>
Обратите внимание, что имена полей формы – name и pwd, мы увидим, как они используются в классах Action. welcome.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Welcome Page</title>
</head>
<body>
<h3>Welcome <s:property value="name"></s:property></h3>
</body>
</html>
Обратите внимание на тег struts s:property, который мы можем использовать для получения атрибутов запроса, имя такое же, как в login.jsp. error.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<h4>User Name or Password is wrong</h4>
<s:include value="login.jsp"></s:include>
</body>
</html>
Это простая страница JSP, где мы добавляем сообщение об ошибке и включаем страницу входа в ответ.
Обучающий курс Struts – Классы действий
У нашего приложения есть только один класс Action, в котором мы реализуем интерфейс Struts 2 Action. LoginAction.java
package com.journaldev.struts2.action;
import com.opensymphony.xwork2.Action;
public class LoginAction implements Action {
@Override
public String execute() throws Exception {
if("pankaj".equals(getName()) && "admin".equals(getPwd()))
return "SUCCESS";
else return "ERROR";
}
//Java Bean для хранения параметров формы
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
Обратите внимание, что класс действия также является java bean с теми же переменными, что и в login.jsp, и их методами getter и setter. Struts будет заботиться о сопоставлении параметров запроса с переменными класса действия.
Обучающий курс Struts – Файл конфигурации
Поскольку мы используем конфигурацию на основе XML для настройки нашего приложения, нам нужно создать файл конфигурации Struts, который должен называться struts.xml и находиться внутри каталога WEB-INF/classes. struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"https://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" namespace="/User" extends="struts-default">
<action name="home">
<result>/login.jsp</result>
</action>
<action name="login" class="com.journaldev.struts2.action.LoginAction">
<result name="SUCCESS">/welcome.jsp</result>
<result name="ERROR">/error.jsp</result>
</action>
</package>
</struts>
Для действия “home” нет класса Action, и есть только один результат, поэтому запрос будет перенаправлен на страницу login.jsp. Для действия “login” классом действия является LoginAction, и если метод execute() возвращает “SUCCESS”, запрос будет обработан welcome.jsp, а для “ERROR” он будет перенаправлен на страницу error.jsp. Пространство имен = “/User” важно и используется в URL для доступа к классам действий, оно предоставляется для создания различных модулей. Таким образом, мы можем получить доступ к нашему приложению по URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action
. Обратите внимание, что URL заканчивается на .action, что является суффиксом по умолчанию для действий Struts 2, в то время как для Struts 1 это .do.
Руководство по Struts – Тестирование Hello World в Struts 2
Когда мы запускаем наше приложение, мы получаем следующие страницы ответа.
Загрузите пример проекта Struts2 Hello World
Вот и все для начинающих в Struts 2, ознакомьтесь со следующей статьей, где мы используем аннотации для создания веб-приложения Struts 2 без использования файла конфигурации struts.xml.
Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners