Bem-vindo ao Tutorial do Struts para Iniciantes. Struts é um dos frameworks mais antigos para construir Aplicações Web Java.
Tutorial do Struts
Struts foi a implementação inicial do padrão de design MVC e evoluiu muito juntamente com os últimos aprimoramentos em tecnologias Java e Java EE. O artigo do tutorial do Struts tem como objetivo fornecer detalhes básicos do Struts 2 e como podemos criar nossa primeira aplicação “Hello World” com o Struts 2.
Struts 2
O Apache Struts 2 é um framework de código aberto, padrão da indústria, flexível e extensível para construir aplicações web Java EE. Struts 2 é baseado no framework OpenSymphony WebWork. Struts 2 é muito flexível em termos de desenvolvimento e configurações e veremos como é fácil desenvolver uma aplicação web usando o framework Struts 2.
Diagrama da Arquitetura do Struts 2
Abaixo está o diagrama que mostra diferentes componentes do Struts 2 em uma aplicação web.
Interceptadores do Struts 2
Os interceptadores do Struts são como Filtros Servlet que são executados antes e depois da requisição ser processada. Eles são usados para realizar operações comuns para diferentes ações. Por exemplo, registro, validação de sessão, adição de cabeçalhos comuns à resposta, etc.
Struts 2 ValueStack e OGNL
ValueStack é a área de armazenamento onde os dados da aplicação são armazenados pelo Struts 2 para processar uma solicitação do cliente. Os dados são armazenados em objetos ActionContext
que usam ThreadLocal para ter valores específicos para a thread de solicitação particular. A Linguagem de Navegação em Grafo de Objetos (OGNL) é uma poderosa Linguagem de Expressão usada para manipular dados armazenados no ValueStack. Como você pode ver no diagrama de arquitetura, tanto interceptadores quanto páginas de resultado podem acessar dados armazenados no ValueStack usando OGNL.
Ação do Struts 2
Os componentes de Ação do Struts 2 lidam com as solicitações do cliente. O Struts 2 fornece diferentes maneiras de criar classes de Ação.
- Ao implementar a interface
com.opensymphony.xwork2.Action
. - Ao estender a classe
com.opensymphony.xwork2.ActionSupport
. Geralmente, é usado para criar classes de ação vazias para encaminhar a solicitação para outro recurso. - Anotando uma classe com a anotação @Action ou @Actions.
- Seguindo a convenção de nomenclatura para classes, o nome deve terminar com Action e deve ter o método execute().
Resultado do Struts 2
Os componentes de resultado geralmente são páginas JSP ou HTML para criar uma visualização para a resposta do cliente. O Struts 2 fornece suas próprias tags que podemos usar em páginas JSP para criar a resposta. As tags do Struts são um ótimo exemplo de Tags Personalizadas JSP.
Arquitetura Declarativa e Conexão do Struts 2
O Struts 2 fornece duas maneiras de configurar nossa aplicação para classes de ação e páginas de resultado.
- Arquivo XML do Struts: Temos o arquivo struts.xml no diretório WEB-INF/classes onde podemos configurar as classes de ação e páginas de resultado de nossa aplicação.
- Anotação: Podemos usar Anotações Java para fornecer informações de metadados sobre uma classe. O plugin de convenção do Struts 2 pode ser usado para anotar classes Java com as anotações @Action e @Result para configurar classes de ação e páginas de resultado associadas.
De qualquer maneira que usemos para configurar nossa aplicação, o resultado final sempre será o mesmo.
Tutorial do Struts – Aplicação Hello World Baseada em XML
Vamos ver como podemos criar nossa primeira aplicação Hello World usando o Struts 2. Primeiro de tudo, precisamos dos arquivos jar do Struts 2, a maneira mais fácil é baixá-los da página de Downloads Oficiais do Struts 2. Mas ao verificar as bibliotecas no arquivo baixado, você verá muitos arquivos jar que não precisamos para nossa aplicação simples. Então, vou criar um projeto Maven e adicionar apenas a dependência do struts-core, todos os outros jars de dependência transitiva serão baixados automaticamente e adicionados à aplicação. A estrutura final do nosso projeto será como na imagem abaixo. Crie um novo Projeto Web Dinâmico Struts2XMLHelloWorld no Eclipse e depois converta-o para projeto Maven como na imagem abaixo.
Você vai notar que o arquivo pom.xml é adicionado no diretório raiz do projeto. A configuração do nosso projeto no Eclipse está pronta, vamos analisar os diferentes componentes em ordem.
pom.xml
Abra o arquivo pom.xml e adicione a dependência do struts core, o pom.xml final ficará assim.
<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>
Observe que substituí o elemento finalName
para evitar que o número da versão seja adicionado ao arquivo WAR quando fazemos a construção do Maven. Outras partes são adicionadas pelo Eclipse em si, a única dependência que precisamos é o struts2-core, cuja versão atual é 2.3.15.1 (em 10 de setembro de 2013). Basta fazer a construção do Maven da aplicação e você verá muitos JARs adicionados ao diretório lib da aplicação e mostrados na seção Dependências do Maven do projeto, como na imagem abaixo.
Configuração do web.xml do Struts 2
Precisamos adicionar o filtro org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
à aplicação web e fornecer o padrão de URL onde queremos que o Struts cuide da solicitação do cliente. Nosso web.xml se parece com o seguinte;
<?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>
Para o Struts 2 versão abaixo de 2.1.3, a classe do filtro era org.apache.struts2.dispatcher.FilterDispatcher
.
Tutorial do Struts – Páginas de Resultado
Temos três páginas JSP que serão usadas pela aplicação, estamos usando tags Struts 2 para criar nossas páginas 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>
Observe que os nomes dos campos do formulário são name e pwd, veremos como eles são usados nas classes 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>
Observe a tag struts s:property que podemos usar para obter atributos de solicitação, o nome é o mesmo que em 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>
Esta é uma página JSP simples onde estamos adicionando mensagem de erro e incluindo a página de login na resposta.
Tutorial do Struts – Classes Action
Nossa aplicação tem apenas uma classe Action onde estamos implementando a interface Action do 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";
}
//Bean Java para armazenar os parâmetros do formulário
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;
}
}
Observe que a classe de ação também é um bean Java com as mesmas variáveis de login.jsp e seus métodos getter e setter. O Struts cuidará de mapear os parâmetros da solicitação para as variáveis da classe de ação.
Tutorial do Struts – Arquivo de Configuração
struts.xml e dentro do diretório 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>
Para a ação “home”, não há uma classe de ação e apenas um resultado, portanto, a solicitação será encaminhada para a página login.jsp. Para a ação “login”, LoginAction é a classe de ação e se o método execute() retornar “SUCCESS”, a solicitação será processada por welcome.jsp e para “ERROR” será encaminhada para a página error.jsp. namespace=”/User” é importante e usado na URL para acessar as classes de ação, é fornecido para criar diferentes módulos. Assim, podemos acessar nossa aplicação com a URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action
. Observe que a URL termina com .action, que é o sufixo padrão para ações do Struts 2, assim como .do para o Struts 1.
Struts Tutorial – Struts 2 Hello World Test
Quando executamos nossa aplicação, obtemos as seguintes páginas de resposta.
Download do Projeto Exemplo Olá Mundo do Struts2
Isso é tudo para o tutorial iniciante do Struts 2, confira o próximo artigo em que estamos usando anotações para criar Aplicação Web Struts 2 sem usar o arquivo de configuração struts.xml.
Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners