Struts 2 - Действия

Actionsявляются ядром платформы Struts2, как и любой инфраструктуры MVC (Model View Controller). Каждый URL-адрес сопоставляется с определенным действием, которое обеспечивает логику обработки, необходимую для обслуживания запроса от пользователя.

Но действие также выполняет две другие важные функции. Во-первых, действие играет важную роль в передаче данных от запроса к представлению, будь то JSP или другой тип результата. Во-вторых, действие должно помочь платформе определить, какой результат должен отображать представление, которое будет возвращено в ответ на запрос.

Создать действие

Единственное требование к действиям в Struts2состоит в том, что должен быть один метод noargument, который возвращает либо объект String, либо объект Result и должен быть POJO. Если метод без аргументов не указан, по умолчанию используется метод execute ().

При желании вы можете продлить ActionSupport класс, который реализует шесть интерфейсов, включая Actionинтерфейс. Интерфейс действия выглядит следующим образом -

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

Давайте посмотрим на метод действия в примере 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;
   }
}

Чтобы проиллюстрировать, что метод действия управляет представлением, давайте внесем следующее изменение в execute метод и расширите класс ActionSupport следующим образом:

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

В этом примере у нас есть логика в методе execute, чтобы посмотреть на атрибут name. Если атрибут равен строке"SECRET", мы возвращаемся SUCCESS в результате иначе мы возвращаем ERRORв результате. Поскольку у нас есть расширенная поддержка ActionSupport, мы можем использовать строковые константыSUCCESSи ОШИБКА. Теперь давайте изменим наш файл struts.xml следующим образом:

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

Создать представление

Давайте создадим следующий файл jsp HelloWorld.jspв папке WebContent в вашем проекте eclipse. Для этого щелкните правой кнопкой мыши папку WebContent в проводнике проекта и выберитеNew >JSP File. Этот файл будет вызываться в случае, если результатом возврата будет УСПЕХ, который является строковой константой «успех», как определено в интерфейсе действий -

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

Ниже приведен файл, который будет вызываться фреймворком в случае, если результатом действия будет ОШИБКА, равная строковой константе «ошибка». Ниже приводится содержание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>

Нам также необходимо создать index.jspв папке WebContent. Этот файл будет служить URL-адресом начального действия, где пользователь может щелкнуть, чтобы сообщить платформе Struts 2 вызватьexecuteметод класса HelloWorldAction и визуализирует представление 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>

Вот и все, для файла web.xml никаких изменений не требуется, поэтому давайте использовать тот же web.xml, который мы создали в Examplesглаву. Теперь мы готовы запустить нашHello World приложение с использованием фреймворка Struts 2.

Запустить заявку

Щелкните правой кнопкой мыши имя проекта и щелкните Export > WARFile для создания файла War. Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресуhttp://localhost:8080/HelloWorldStruts2/index.jsp. Это даст вам следующий экран -

Позвольте нам ввести слово как "СЕКРЕТНО", и вы должны увидеть следующую страницу -

Теперь введите любое слово, кроме "СЕКРЕТНО", и вы должны увидеть следующую страницу -

Создать несколько действий

Вы часто будете определять более одного действия для обработки разных запросов и предоставления разных URL-адресов пользователям, соответственно вы определите разные классы, как определено ниже -

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

Вы настроите эти действия в файле struts.xml следующим образом:

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

Как вы можете видеть в приведенном выше гипотетическом примере, в результате действия SUCCESS и ERROR’s дублируются.

Чтобы обойти эту проблему, рекомендуется создать класс, содержащий результаты результатов.