Bem-vindo ao Tutorial do Struts para Iniciantes. O Struts é um dos frameworks mais antigos para construir Aplicações Web Java.
Tutorial do Struts
O Struts foi a implementação inicial do padrão de design MVC e evoluiu muito junto com as últimas melhorias nas 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” usando 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. O Struts 2 é baseado no framework OpenSymphony WebWork. O 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 de Arquitetura do Struts 2
O diagrama abaixo mostra os diferentes componentes do Struts 2 em uma aplicação web.
Interceptadores do Struts 2
Interceptadores do Struts são como Filtros de Servlet que são executados antes e depois que a solicitação está sendo 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.
ValueStack e OGNL do Struts 2
O 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 ao thread de solicitação particular. A Linguagem de Navegação em Grafo de Objetos (OGNL) é uma poderosa Linguagem de Expressão que é usada para manipular dados armazenados no ValueStack. Como você pode ver no diagrama de arquitetura, tanto os interceptadores quanto as páginas de resultado podem acessar dados armazenados no ValueStack usando OGNL.
Ação Struts 2
Os componentes de Ação 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 são geralmente 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 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 as 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 criar configurar classes de ação e páginas de resultado associadas.
Qualquer que seja a forma que usamos para configurar nossa aplicação, o resultado final será sempre o mesmo.
Tutorial Struts – Aplicação Hello World baseada em XML
Vamos ver como podemos criar nossa primeira aplicação Struts 2 Hello World. Em primeiro lugar, precisamos dos arquivos jar do Struts 2 e a maneira mais fácil é baixá-los na página oficial de downloads do Struts 2. No entanto, ao verificar as bibliotecas no arquivo baixado, você verá muitos arquivos jar que não são necessários para nossa aplicação simples. Portanto, vou criar um projeto Maven e adicionar apenas a dependência do struts-core; todos os outros jars de dependências transitivas 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 chamado Struts2XMLHelloWorld no Eclipse e depois converta-o em um projeto Maven, conforme a imagem abaixo.
Você notará que o arquivo pom.xml é adicionado no diretório raiz do projeto. Nossa configuração do projeto no Eclipse está pronta, agora vamos examinar 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 eu substituí o elemento finalName
para evitar que o número da versão seja adicionado ao arquivo WAR quando fazemos a construção com o Maven. Outras partes são adicionadas pelo próprio Eclipse, a única dependência que precisamos é o struts2-core, cuja versão atual é 2.3.15.1 (em 10 de setembro de 2013). Apenas faça a construção com o 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 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 parece com o abaixo;
<?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 a versão do Struts 2 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 de Ação. 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 uma mensagem de erro e incluindo a página de login na resposta.
Tutorial do Struts – Classes de Ação
Nossa aplicação tem apenas uma classe de Ação 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 que login.jsp e seus métodos getter e setter. O Struts cuidará do mapeamento dos parâmetros da solicitação para as variáveis da classe de ação.
Tutorial do Struts – Arquivo de Configuração
Desde que estejamos a utilizar uma configuração baseada em XML para a interligação da nossa aplicação, precisamos criar um ficheiro de configuração Struts que deve ser nomeado como struts.xml e localizado 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 existe uma classe de Ação e apenas um resultado, então 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 pela welcome.jsp e para “ERROR” será encaminhada para a página error.jsp. O namespace=“/User” é importante e é utilizado no URL para aceder às classes de ação, sendo fornecido para criar módulos diferentes. Assim, podemos aceder à nossa aplicação com o URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action
. Note que o URL termina com .action, que é o sufixo padrão para a ação Struts 2, assim como .do para o Struts 1.
Tutorial do Struts – Struts 2 Hello World Test
Quando executamos nossa aplicação, obtemos as seguintes páginas de resposta.
Download do Projeto de Exemplo Struts2 Hello World
Isso é tudo para o tutorial de iniciantes 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