Struts 2 - Ações

Actionssão o núcleo da estrutura Struts2, como são para qualquer estrutura MVC (Model View Controller). Cada URL é mapeado para uma ação específica, que fornece a lógica de processamento necessária para atender à solicitação do usuário.

Mas a ação também serve em duas outras funções importantes. Em primeiro lugar, a ação desempenha um papel importante na transferência de dados da solicitação para a exibição, seja um JSP ou outro tipo de resultado. Em segundo lugar, a ação deve ajudar a estrutura a determinar qual resultado deve apresentar a visão que será retornada na resposta à solicitação.

Criar ação

O único requisito para ações em Struts2é que deve haver um método sem argumento que retorna um objeto String ou Result e deve ser um POJO. Se o método sem argumento não for especificado, o comportamento padrão é usar o método execute ().

Opcionalmente, você pode estender o ActionSupport classe que implementa seis interfaces, incluindo Actioninterface. A interface de ação é a seguinte -

public interface Action {
   public static final String SUCCESS = "success";
   public static final String NONE = "none";
   public static final String ERROR = "error";
   public static final String INPUT = "input";
   public static final String LOGIN = "login";
   public String execute() throws Exception;
}

Vamos dar uma olhada no método de ação no exemplo Hello World -

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Para ilustrar o ponto em que o método de ação controla a visualização, vamos fazer a seguinte alteração no execute método e estenda a classe ActionSupport da seguinte maneira -

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      if ("SECRET".equals(name)) {
         return SUCCESS;
      } else {
         return ERROR;  
      }
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Neste exemplo, temos alguma lógica no método execute para examinar o atributo name. Se o atributo for igual à string"SECRET", nós voltamos SUCCESS como resultado, caso contrário, retornamos ERRORcomo resultado. Porque estendemos ActionSupport, então podemos usar constantes StringSUCCESSe ERROR. Agora, vamos modificar nosso arquivo struts.xml da seguinte maneira -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Criar uma vista

Vamos criar o arquivo jsp abaixo HelloWorld.jspna pasta WebContent em seu projeto eclipse. Para fazer isso, clique com o botão direito na pasta WebContent no explorador de projetos e selecioneNew >JSP File. Este arquivo será chamado caso o resultado de retorno seja SUCCESS, que é uma constante String "sucesso" conforme definido na interface Action -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

A seguir está o arquivo que será chamado pelo framework caso o resultado da ação seja ERROR, que é igual à constante de String "error". A seguir está o conteúdo deAccessDenied.jsp

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>  
   <head>
      <title>Access Denied</title>
   </head>
   
   <body>
      You are not authorized to view this page.
   </body>
</html>

Também precisamos criar index.jspna pasta WebContent. Este arquivo servirá como o URL de ação inicial onde o usuário pode clicar para dizer ao framework do Struts 2 para chamar oexecutemétodo da classe HelloWorldAction e renderizar a visualização HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>  
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

É isso, não há nenhuma mudança necessária para o arquivo web.xml, então vamos usar o mesmo web.xml que criamos em Examplescapítulo. Agora, estamos prontos para executar nossoHello World aplicativo usando o framework Struts 2.

Execute o aplicativo

Clique com o botão direito no nome do projeto e clique Export > WARArquivo para criar um arquivo de guerra. Em seguida, implante esse WAR no diretório webapps do Tomcat. Finalmente, inicie o servidor Tomcat e tente acessar o URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Isso lhe dará a seguinte tela -

Deixe-nos inserir uma palavra como "SEGREDO" e você verá a seguinte página -

Agora digite qualquer palavra diferente de "SEGREDO" e você verá a seguinte página -

Crie várias ações

Freqüentemente, você definirá mais de uma ação para lidar com diferentes solicitações e fornecer diferentes URLs aos usuários, portanto, você definirá diferentes classes conforme definido abaixo -

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

class MyAction extends ActionSupport {
   public static String GOOD = SUCCESS;
   public static String BAD = ERROR;
}

public class HelloWorld extends ActionSupport {
   ...
   public String execute() {
      if ("SECRET".equals(name)) return MyAction.GOOD;
      return MyAction.BAD;
   }
   ...
}

public class SomeOtherClass extends ActionSupport {
   ...
   public String execute() {
      return MyAction.GOOD;
   }
   ...
}

Você vai configurar essas ações no arquivo struts.xml da seguinte forma -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorld" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
      
      <action name = "something" 
         class = "com.tutorialspoint.struts2.SomeOtherClass" 
         method = "execute">
         <result name = "success">/Something.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Como você pode ver no exemplo hipotético acima, os resultados da ação SUCCESS e ERROR’s são duplicados.

Para contornar esse problema, sugere-se que você crie uma classe que contenha os resultados dos resultados.