Benvenuti al Tutorial di Struts per principianti. Struts è uno dei framework più antichi per la creazione di Applicazioni Web Java.
Tutorial di Struts
Struts è stata la prima implementazione del design pattern MVC ed è evoluta molto insieme agli ultimi miglioramenti nelle tecnologie Java e Java EE. L’articolo del tutorial di Struts ha lo scopo di fornire dettagli di base su Struts 2 e su come creare la nostra prima applicazione “Hello World” con Struts 2.
Struts 2
Apache Struts 2 è un framework open source, standard del settore, flessibile ed estensibile per la creazione di applicazioni web Java EE. Struts 2 si basa sul framework OpenSymphony WebWork. Struts 2 è molto flessibile in termini di sviluppo e configurazioni e vedremo quanto sia facile sviluppare un’applicazione web utilizzando il framework Struts 2.
Diagramma dell’Architettura di Struts 2
Il diagramma seguente mostra i diversi componenti di Struts 2 in un’applicazione web.
Interceptor di Struts 2
Gli Interceptor di Struts sono simili ai Filtri Servlet che vengono eseguiti prima e dopo che la richiesta venga processata. Sono utilizzati per eseguire operazioni comuni per diverse azioni. Ad esempio, registrazione, convalida della sessione, aggiunta di intestazioni comuni alla risposta, ecc.
ValueStack e OGNL di Struts 2
ValueStack è l’area di archiviazione in cui i dati dell’applicazione vengono memorizzati da Struts 2 per elaborare una richiesta del client. I dati sono memorizzati negli oggetti ActionContext
che utilizzano ThreadLocal per avere valori specifici per il thread di richiesta particolare. Il linguaggio di navigazione dell’oggetto-grafo (OGNL) è un potente linguaggio di espressione utilizzato per manipolare i dati memorizzati nel ValueStack. Come puoi vedere nel diagramma dell’architettura, sia gli intercettori che le pagine dei risultati possono accedere ai dati memorizzati su ValueStack utilizzando OGNL.
Azione Struts 2
I componenti Azione Struts 2 gestiscono le richieste del client. Struts 2 fornisce diversi modi per creare classi Azione.
- Implementando l’interfaccia
com.opensymphony.xwork2.Action
. - Estendendo la classe
com.opensymphony.xwork2.ActionSupport
. Di solito viene utilizzata per creare classi di azioni vuote per inoltrare la richiesta a un’altra risorsa. - Annotando una classe con @Action o @Actions annotazione.
- Seguendo la convenzione di denominazione per le classi, il nome dovrebbe terminare con Action e dovrebbe avere il metodo execute().
Risultato di Struts 2
I componenti di risultato sono di solito pagine JSP o HTML per creare la vista per la risposta del client. Struts 2 fornisce i propri tag che possiamo utilizzare nelle pagine JSP per creare la risposta. I tag di Struts sono un ottimo esempio di Tag Personalizzati JSP.
Architettura e Cablaggio Dichiarativo di Struts 2
Struts 2 fornisce due modi per configurare la nostra applicazione per le classi di azione e le pagine di risultato.
- File XML di Struts: Abbiamo il file struts.xml nella directory WEB-INF/classes dove possiamo configurare le classi di azione e le pagine di risultato della nostra applicazione.
- Annotation: Possiamo utilizzare Annotation Java per fornire informazioni sui metadati su una classe. Il plugin di convenzione di Struts 2 può essere utilizzato per annotare le classi Java con le annotazioni @Action e @Result per creare classi di azione e pagine di risultato associate.
In ogni modo in cui configuriamo la nostra applicazione, il risultato finale sarà sempre lo stesso.
Struts Tutorial – Applicazione Hello World basata su XML
Vediamo come possiamo creare la nostra prima applicazione Hello World con Struts 2. Innanzitutto, abbiamo bisogno dei file jar di Struts 2, il modo più semplice è scaricarli dalla pagina ufficiale dei download di Struts 2. Ma quando controlli le librerie nell’archivio scaricato, vedrai molti file jar che non ci servono per la nostra semplice applicazione. Quindi creerò un progetto Maven e aggiungerò solo la dipendenza struts-core, tutte le altre dipendenze di trasporto verranno scaricate automaticamente e aggiunte all’applicazione. La nostra struttura finale del progetto sarà come nell’immagine sottostante. Crea un nuovo Progetto Web Dinamico Struts2XMLHelloWorld in Eclipse e convertilo in un progetto Maven come nell’immagine sottostante.
Noterai che il file pom.xml viene aggiunto nella directory principale del progetto. La nostra configurazione del progetto in Eclipse è pronta, vediamo i diversi componenti in ordine.
pom.xml
Apri il file pom.xml e aggiungi la dipendenza di struts core, il pom.xml finale avrà l’aspetto seguente.
<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>
Si noti che ho sovrascritto l’elemento finalName
per evitare che venga aggiunto il numero di versione nel file WAR quando eseguiamo la build di Maven. Altre parti sono aggiunte dall’Eclipse stesso, l’unica dipendenza di cui abbiamo bisogno è struts2-core, la cui versione attuale è 2.3.15.1 (al 10 settembre 2013). Esegui semplicemente la build di Maven dell’applicazione e vedrai che vengono aggiunti molti JAR alla directory lib dell’applicazione e mostrati nella sezione Dipendenze Maven del progetto come nell’immagine seguente.
Configurazione web.xml di Struts 2
Dobbiamo aggiungere il filtro org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
all’applicazione web e fornire il pattern URL dove vogliamo che Struts si occupi della richiesta del client. Il nostro web.xml appare come segue;
<?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>
Per Struts 2 versione inferiore a 2.1.3, la classe del filtro era org.apache.struts2.dispatcher.FilterDispatcher
.
Tutorial su Struts – Pagine di risultato
Abbiamo tre pagine JSP che verranno utilizzate dall’applicazione, stiamo utilizzando i tag Struts 2 per creare le nostre pagine 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>
Nota che i nomi dei campi del modulo sono nome e pwd, vedremo come vengono utilizzati nelle classi 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>
Nota il tag struts s:property che possiamo usare per ottenere gli attributi della richiesta, il nome è lo stesso di 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>
Questa è una semplice pagina JSP dove stiamo aggiungendo un messaggio di errore e includendo la pagina di accesso nella risposta.
Struts Tutorial – Classi di Azione
La nostra applicazione ha solo una classe Action dove stiamo implementando l’interfaccia Action di Struts 2. 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 per contenere i parametri del modulo
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;
}
}
Nota che la classe azione è anche un java bean con le stesse variabili di login.jsp e i relativi metodi getter e setter. Struts si occuperà di mappare i parametri della richiesta alle variabili della classe azione.
Struts Tutorial – File di Configurazione
Poiché stiamo utilizzando una configurazione basata su XML per collegare la nostra applicazione, è necessario creare un file di configurazione Struts che dovrebbe chiamarsi struts.xml e trovarsi all’interno della directory 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>
Per l’azione “home”, non esiste una classe Action e c’è solo un risultato, quindi la richiesta verrà inoltrata alla pagina login.jsp. Per l’azione “login”, la classe LoginAction è la classe di azione e se il metodo execute() restituisce “SUCCESS”, la richiesta verrà elaborata dalla pagina welcome.jsp e per “ERROR” verrà inoltrata alla pagina error.jsp. namespace=”/User” è importante e viene utilizzato nell’URL per accedere alle classi di azione, viene fornito per creare moduli diversi. Quindi possiamo accedere alla nostra applicazione tramite l’URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action
. Notare che l’URL termina con .action che è il suffisso predefinito per le azioni di Struts 2, come .do per Struts 1.
Struts Tutorial – Struts 2 Hello World Test
Quando eseguiamo la nostra applicazione, otteniamo le seguenti pagine di risposta.
Scarica Progetto Esempio Hello World Struts2
Questo è tutto per il tutorial per principianti di Struts 2, guarda il prossimo articolo in cui utilizziamo le annotazioni per creare un’applicazione Web Struts 2 senza utilizzare il file di configurazione struts.xml.
Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners