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.