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

Добро пожаловать в учебник 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 предоставляет различные способы создания классов действий.

  1. Путем реализации интерфейса com.opensymphony.xwork2.Action.
  2. Путем расширения класса com.opensymphony.xwork2.ActionSupport. Обычно используется для создания пустых классов действий для переадресации запроса другому ресурсу.
  3. Аннотирование класса аннотацией @Action или @Actions.
  4. Следуя соглашению об именовании классов, имя должно заканчиваться на Action и должно содержать метод execute().

Результаты Struts 2

Компоненты результатов обычно являются JSP- или HTML-страницами для создания представления для ответа клиента. Struts 2 предоставляет собственные теги, которые мы можем использовать в JSP-страницах для создания ответа. Теги Struts отличный пример Пользовательских тегов JSP.

Декларативная архитектура и связывание Struts 2

Struts 2 предоставляет два способа настройки нашего приложения для классов действий и страниц результатов.

  1. Файл Struts XML: У нас есть файл struts.xml в каталоге WEB-INF/classes, где мы можем настроить классы действий и страницы результатов нашего приложения.
  2. Аннотация: Мы можем использовать Аннотации 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