Учебники

Struts 2 — Действия

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

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

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

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

При желании вы можете расширить класс ActionSupport, который реализует шесть интерфейсов, включая интерфейс Action . Интерфейс 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 и ERROR. Теперь давайте изменим наш файл 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 в проводнике проекта и выберите « Создать»> «Файл JSP» . Этот файл будет вызываться в случае, если возвращаемый результат — SUCCESS, который является строковой константой «success», как определено в интерфейсе 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>

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

Выполнить заявку

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

Hello World Struts4

Давайте введем слово как «СЕКРЕТ», и вы должны увидеть следующую страницу —

helloworldstruts51

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

helloworldstruts6

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

Вы будете часто определять более одного действия для обработки разных запросов и предоставления разных 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 дублируются.

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