Struts 2 - Akcje

Actionssą rdzeniem frameworka Struts2, podobnie jak w przypadku każdej struktury MVC (Model View Controller). Każdy adres URL jest mapowany do określonej akcji, która zapewnia logikę przetwarzania niezbędną do obsługi żądania od użytkownika.

Ale akcja spełnia również dwie inne ważne funkcje. Po pierwsze, akcja odgrywa ważną rolę w przekazywaniu danych od żądania do widoku, niezależnie od tego, czy jest to JSP, czy inny typ wyniku. Po drugie, działanie musi wspomagać ramy w określeniu, który wynik powinien dawać pogląd, który zostanie zwrócony w odpowiedzi na żądanie.

Utwórz akcję

Jedyny wymóg dotyczący działań w Struts2polega na tym, że musi istnieć jedna metoda noargument, która zwraca obiekt String lub Result i musi być POJO. Jeśli nie określono metody bezargumentowej, domyślnym zachowaniem jest użycie metody execute ().

Opcjonalnie możesz przedłużyć ActionSupport klasa, która implementuje sześć interfejsów, w tym Actionberło. Interfejs akcji jest następujący -

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;
}

Przyjrzyjmy się metodzie akcji w przykładzie 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;
   }
}

Aby zilustrować punkt, w którym metoda akcji kontroluje widok, wprowadźmy następującą zmianę w pliku execute i rozszerz klasę ActionSupport w następujący sposób -

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;
   }
}

W tym przykładzie mamy pewną logikę w metodzie execute, aby spojrzeć na atrybut name. Jeśli atrybut jest równy łańcuchowi"SECRET", wracamy SUCCESS w rezultacie w przeciwnym razie wrócimy ERRORjako wynik. Ponieważ rozszerzyliśmy ActionSupport, więc możemy używać stałych typu StringSUCCESSi ERROR. Teraz zmodyfikujmy nasz plik struts.xml w następujący sposób -

<?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>

Utwórz widok

Stwórzmy poniższy plik jsp HelloWorld.jspw folderze WebContent w projekcie eclipse. Aby to zrobić, kliknij prawym przyciskiem myszy folder WebContent w eksploratorze projektów i wybierzNew >JSP File. Ten plik zostanie wywołany w przypadku, gdy wynikiem zwrócenia jest SUCCESS, czyli stała typu „sukces” typu String, zgodnie z definicją w interfejsie akcji -

<%@ 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>

Poniżej znajduje się plik, który zostanie wywołany przez framework w przypadku, gdy wynikiem akcji jest ERROR, co jest równe stałej typu „error”. Poniżej znajduje się treśćAccessDenied.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>

Musimy też tworzyć index.jspw folderze WebContent. Ten plik będzie służyć jako początkowy adres URL akcji, w którym użytkownik może kliknąć, aby przekazać platformie Struts 2 wywołanie plikuexecutemetody klasy HelloWorldAction i wyrenderuj widok 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>

To wszystko, nie ma potrzeby zmiany pliku web.xml, więc użyjmy tego samego web.xml, który utworzyliśmy w Examplesrozdział. Teraz jesteśmy gotowi do uruchomienia naszegoHello World aplikacja wykorzystująca framework Struts 2.

Uruchom aplikację

Kliknij prawym przyciskiem myszy nazwę projektu i kliknij Export > WARPlik, aby utworzyć plik wojny. Następnie wdróż tę WAR w katalogu webapps serwera Tomcat. Na koniec uruchom serwer Tomcat i spróbuj uzyskać dostęp do adresu URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Spowoduje to wyświetlenie następującego ekranu -

Wpiszmy słowo jako „TAJNE”, a powinieneś zobaczyć następującą stronę -

Teraz wprowadź dowolne słowo inne niż „SECRET”. Powinna zostać wyświetlona następująca strona -

Utwórz wiele działań

Często będziesz definiować więcej niż jedną akcję, aby obsłużyć różne żądania i zapewnić użytkownikom różne adresy URL, w związku z tym zdefiniujesz różne klasy zgodnie z poniższą definicją -

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;
   }
   ...
}

Skonfigurujesz te akcje w pliku struts.xml w następujący sposób -

<?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>

Jak widać na powyższym hipotetycznym przykładzie, akcja skutkuje SUCCESS i ERROR’s są zduplikowane.

Aby obejść ten problem, sugeruje się utworzenie klasy zawierającej wyniki wyników.