Действие в Stuts2

Struts2 - это фреймворк, ориентированный на действия (Action), которые являются основным элементом данного фреймворка, его ядром. Действия обрабатывают запросы пользователей и определяют результат его выполнения для представления информации.

Struts2 - назначает каждому действию свой уникальный URL и набор результатов. Фреймворк включает пять констант, которые определяют результат выполнения действия и которые можно использовать в приложении :
  • public static final String ERROR "error";
  • public static final String INPUT "input";
  • public static final String LOGIN "login";
  • public static final String NONE "none";
  • public static final String SUCCESS "success".

Если этих констант будет недостаточно, то можно дополнительно определить любые свои.

Действие в Struts2 представляет простой Java-класс ( Action-класс ), который должен наследовать свойства класса org.apache.struts2.interceptor.ServletRequestAware. Класс ServletRequestAware содержит виртуальную функцию execute (), возвращающую строковое значение. Именно в этой функции определяется результат выполнения действия, или результат обработки запроса HttpServletRequest.

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

Создадим простейший пример с использованием действия GreetingAction. Основная функция данного действия будет заключаться в том, чтобы проверить заполнение текстового поля JSP-страницы Entry.jsp. Если пользователь заполнил текстовое поле, то метод execute () вернет строковое значение "success", если не заполнил - то "none". В зависимости от результата фреймворк будет открывать либо страницу Wellcome.jsp, либо Empty.jsp.

Листинг класса действия GreetingAction.java
package examples.greeting; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; public class GreetingAction extends ActionSupport { private String name; public String execute () throws Exception { if (( getName () != null ) && ( getName ().trim ().length () > 0 )) return Action.SUCCESS; else return Action.NONE; } public String getName { return name; } public void setName (String name) { this.name = name; } }

Действие GreetingAction наследует все свойства класса com.opensymphony.xwork2.ActionSupport и переопределяет функцию execute. Как только будет обращение к действию GreetingAction, фреймворк Struts2 сразу же вызовет execute, которая проверит поле "name", и, в зависимости от состояния, вернет либо "success", либо "none".

На странице проверки данных показано, как использовать метод validate () для проверки данных пользователя.

JSP-страница ввода Entry.jsp

Представим страницу Entry.jsp, в которой оператору будет предложено ввести свое имя и вызвать действие (Action) Greeting нажатием кнопки.

Листинг JSP-страницы Entry.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Приглашение</title> </head> <body> <h1>Приглашение пользователя</h1> Введите имя и нажмите кнопку "Войти" <s:form action="Greeting" <s:textfield label="Ваше имя" name="name"></s:textfield> <s:submit value="Войти"></s:submit> </s:form> </body> </html>

На данной странице в строке <%@ taglib prefix="s" uri="/struts-tags" %> подключаются теги Struts2, после чего обращение к объектам фреймворка производится через префикс "s".

На странице несколько тегов Struts2. Первый тег - это <s:form ... >, который указывает какое действие будет отвечать за обработку данных. Далее установлено текстовое поле <s:textfield ... >, которое определено как "name". При нажатии на кнопку <s:submit ... > "Войти" Struts2 вызывает действие Greeting.

Файл конфигурации struts.xml

Теперь необходимо связать страницу Entry.jsp с действием GreetingAction в файле конфигурации struts.xml.

Листинг файла конфигурации 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> <package name="Default" namespace="/" extends="struts-default"> <action name="Greeting" class="examples.greeting.GreetingAction"> <result name="success">/Wellcome.jsp</result> <result name="none">/Empty.jsp</result> </action> </package> </struts>

В файле конфигурации Struts2 определено, что действие Greeting связано с классом examples.greeting.GreetingAction. В зависимости от результата ( result ) выполнения Action-класса будет открыта либо страница Wellcome.jsp, либо Empty.jsp.

Теперь необходимо создать две JSP-страницы Empty.jsp и Wellcome.jsp.

Пустая JSP-страница Empty.jsp

Листинг JSP-страницы Empty.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Пустая страница</title> </head> <body> Вы не определили свое имя </body> </html>

JSP-страница Empty.jsp не использует тегов Struts2. Данная страница выполняет только одну функцию - сообщить пользователю, что он не ввел свое имя.

JSP-страница приветствия Wellcome.jsp

Листинг JSP-страницы Wellcome.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Приветствие</title> </head> <body> Добро пожаловать, <strong><s:property value="name" /></strong>. </body> </html>

JSP-страница Wellcome.jsp использует теги Struts2, для отображения имени пользователя. Доступ к имени пользователя name осуществляется через тег <s:property ... />.

Необходимо отметить, что фреймворк передает данные через свой внутренний объект ValueStack, к которому мы имеем доступ на странице JSP через тег <s:property .... Но это уже отдельный вопрос и он рассмотрен на странице OGNL.

Теперь, когда Action-класс определен, все JSP-страницы созданы, файл конфигурации настроен, пример можно тестировать. Для этого необходимо вызвать действие Entry.action, и далее по предложенному сценарию.

Для размещения ссылки обращения к определенному действию необходимо использовать тег url. Например, ссылка вызовы Action-класса Entry может выглядеть так :
<a href="<s:url action='Entry.action'/>">Приглашение</a>

Примечание : Конечно, можно открыть JSP-страницу и без обращения к действию. Например, нашу страницу Wellcome.jsp можно открыть по ссылке

<a href="Wellcome.jsp?name=Guest">Главная страница</a>,

но кто вызовет действие examples.greeting.GreetingAction без фреймворка, и увидем ли мы на странице имя пользователя?