Действия являются ядром инфраструктуры 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 . Это даст вам следующий экран —
Давайте введем слово как «СЕКРЕТ», и вы должны увидеть следующую страницу —
Теперь введите любое слово, кроме «СЕКРЕТНО», и вы должны увидеть следующую страницу —
Создать несколько действий
Вы будете часто определять более одного действия для обработки разных запросов и предоставления разных 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 дублируются.
Чтобы обойти эту проблему, предлагается создать класс, который содержит результаты результатов.