3. Архитектура
Шаблон проектирования MVC
Model – View – Controller
Основная задача – упростить
разработку и поддержку
приложений с графическим
интерфейсом
В дальнейшем под приложениями
мы будем понимать
веб-приложения на базе
платформы J2EE
1-3
4. Архитектура
Классическое веб-приложение на JSP
JSP
JSP Специфика:
или
или
HTML
Hard-coded links
HTML JSP
JSP
или
или
Бизнес-логика
HTML
HTML реализована
JSP
JSP посредством JSP или
или
или сервлетов
HTML
HTML
Данные
Для больших приложений:
Данные
JSP
JSP Сложность разработки
или
или
HTML Сложность поддержки
HTML
1-4
5. Архитектура
Веб-приложение на базе MVC
2
1
3
Веб-браузер Controller
Controller
6
5
Model 4
Model
Model
Model EJB,
Model Данные
Model
(JavaBean,
(JavaBean, EJB,
(JavaBean, EJB,
Данные
(JavaBean, EJB,
OR-tool)
OR-tool)
OR-tool)
OR-tool)
7
View
View
View
View
View
View
(JSP)
(JSP)
(JSP)
(JSP)
Веб-контейнер
1-5
6. Архитектура
Последовательность работы
Все запросы проходят через
Controller
Controller определяет, какую бизнес-
логику активировать и принимает
данные от неё
Controller определяет, какую View
использовать и передает ей данные
View предназначена только для
вывода данных пользователю 1-6
7. Архитектура
Выводы
Четкое разделение структуры
приложения, его бизнес-логики и
представления данных клиенту
Это снижает стоимость разработки и
поддержки сложных приложений
1-7
9. Архитектура
Вопросы реализации
Как возможно реализовать Controller?
Как возможно реализовать View?
Как Controller будет определять,
какую бизнес логику вызывать?
Как Controller будет определять,
какую View выводить пользователю?
Как Controller будет передавать
данные для отображения во View?см. далее
1-9
10. Архитектура
Веб-приложение на базе MVC
2
1
3
Веб-браузер Controller
Controller
6
5
Model 4
Model
Model
Model EJB,
Model Данные
Model
(JavaBean,
(JavaBean, EJB,
(JavaBean, EJB,
Данные
(JavaBean, EJB,
OR-tool)
OR-tool)
OR-tool)
OR-tool)
7
View
View
View
View
View
View
(JSP)
(JSP)
(JSP)
(JSP)
Веб-контейнер
1-10
11. Архитектура
Реализация MVC в Struts2
Каркас Struts2 предлагает уже
реализованный Controller
Каркас Struts2 предлагает
стандартный подход к разработке
модели
Каркас Struts2 предлагает
стандартный подход к разработке
представлений
1-11
13. Архитектура
Dependency Injection
Шаблон проектирования Inversion of
Control / Dependency Injection
Популизирован Мартином Фаулером
Основная идея – снизить степень
зависимости компонентов
Factory vs Container
http://www.martinfowler.com/articles/injection.html
1-13
16. Архитектура
Dependency Injection в Struts2
Struts2 активно использует DI
Это значит, что в большинстве
случаев разработчику не придется
самостоятельно обращаться за
ресурсами
Они будут автоматически переданы
компонентам
1-16
17. Архитектура
Dependency Injection в Struts2
Передача стандартных типов объектов
осуществляется средствами Struts2
Передача нестандартных типов
объектов осуществляется средствами
DI-контейнеров, подключаемых как
плагины:
Plexus
PicoContainer
Spring
1-17
24. Конфигурация
Базовые настройки (properties)
Определяют стандартное поведение
каркаса
Как правило, нет нужды их менять
Меняются обычно для обеспечения
более детального режима
тестирования и отладки
1-24
25. Конфигурация
Базовые настройки (properties)
Включает возможность перезагрузки
файлов интернационализации. Эта
struts.i18n.reload
возможность позволяет вносить
изменения без рестарта приложения.
Включает режим разработки с
struts.devMode разширенными возможностями
отладки.
Включает возможность перезагрузки
xml-файлов конфигурации. Эта
struts.configuration.xml.reload
возможность позволяет вносить
изменения без рестарта приложения.
Указание серверного порта, на
котором работает struts2-
struts.url.http.port = 8080
приложение, для автогенерации
правильных URL в ссылках
http://struts.apache.org/2.x/docs/strutsproperties.html
1-25
26. Конфигурация
Базовые настройки (properties)
Базовые настройки могут быть
определены в:
Базовом дескрипторе развертывания
web.xml как наcтроечные параметры
фильтра (init-param)
В файле struts.properties. Он
поставляется в комплекте Struts2
Как константы в файле конфигурации
struts.xml
1-26
27. Конфигурация
Конфигурация Struts2-приложения
Определяет структуру и состав
приложения
View
View
@@
web.xml
web.xml struts.xml
struts.xml
struts.properties
struts.properties
1-27
28. Конфигурация
Конфигурация приложения
Приложение может быть
сконфигурировано:
В xml-файле конфигурации
(по умолчанию struts.xml)
C помощью аннотаций и умолчаний
(в этом случае файл конфигурации может
вообще отсутствовать)
1-28
29. Конфигурация
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC Пакет. По сути,
конфигурация
"-//Apache Software Foundation//DTD Struts Configuration
независимого Struts2-
2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
приложения в рамках
<struts>
единого J2EE веб-
<package приложения.
name="struts2"
extends="struts-default"
namespace="/struts2">
...
</package>
</struts>
struts.xml
1-29
30. Конфигурация
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
Свойства тега package:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts имя пакета
name Уникальное Configuration
2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
Имя пакета-предка. Вся
<struts> extends конфигурация из него будет
<package унаследована.
name="struts2" URL пакета. Определяет, как
extends="struts-default" пакет будет доступен
namespace
namespace="/struts2"> клиентам.
... Пакет не будет реализован, а
</package> abstract будет доступен только для
</struts> наследования
struts.xml
1-30
31. Конфигурация
Включение внешних файлов
<?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>
Содержат
<include file="struts-default.xml" />конфигурацию по
<include file="struts-plugin.xml" /> умолчанию для result
types, interceptors,
<include file="billing-config.xml" />interceptor
stacks, packages.
<include file="admin-config.xml" />
<include file="reports-config.xml" />
...
</struts>
struts.xml
1-31
34. ActionContext
Механизм обмена данными между
компонентами Struts2-приложения
Специальный контейнерный объект,
хранящий необходимые компонентам
объекты
Является Thread-local
Избавляет компоненты от
зависимости к Servlet API
1-34
37. Value Stack
Виртуальный стек объектов
Виртуальность: является единой
совокупностью свойств включенных
объектов
Стек: «сверху вниз»
По умолчанию включает в себя в
указанном порядке:
При использовании model objects,
The Model Object текущий model object находится в стеке
перед action
The Action Object Выполняемый action-объект
1-37
39. Value Stack
Доступ к данным в Value Stack
При запросе необходимого свойства
из Value Stack указывается имя
свойства, при этом стек будет
автоматически пройден сверху вниз и
вернется требуемое свойство первого
попавшегося объекта
Т.е. верхнего в стеке
1-39
40. OGNL
Язык выражений OGNL
Object Graph Navigational Language
Читается «όджинл»
Обеспечивает унифицированый
способ доступа к объектам в
ActionContext
Используется в основном для доступа
к ActionContext из представлений
http://www.ognl.org/2.6.9/Documentation/html/LanguageGuide/index.html
1-40
41. OGNL
Язык выражений OGNL
OGNL поддерживает:
Точечную нотацию доступа к свойствам
person.address вместо getPerson().getAddress()
Приведение типов
Вызов методов
Создание и управление коллекциями
Выполнение выражений
(expression evaluation)
Лямбда-выражения
1-41
42. OGNL
Язык выражений OGNL
Выражения могут заключаться в
конструкцию %{ expr }
Адресация объекта в ActionContext
осуществляется оператором #
#session['user']
Объект в ActionContext по
умолчанию - ValueStack
1-42
45. Interceptors
Специальные объекты, обеспечивающие
пред- и пост-обработку запроса и ответа
для Action
Interceptors упорядочены
Они имеют доступ к окружению и
выполняемому Action
Реализуют аспектный подход
(separation of concerns)
Позволяют при разработке Actions
сконцентрироваться на разработке
только бизнес-логики
1-45
46. Interceptors
Стандартные задачи Interceptors
Обработка исключений
Загрузка файлов с клиентской машины
Извещение компонентов о событиях
жизненного цикла (lifecycle callbacks)
Валидация пользовательских данных
Dependency Injection нужных ресурсов
в компоненты
Etc
1-46
47. Interceptors
Регистрация Interceptors
Для использования собственного или
поставляемого вместе со Struts2
interceptor его необходимо включить в
конфигурацию приложения
Для этого в конфигурационом файле
Struts2 следует воспользоваться
элементами <interceptors … /> и
<interceptor … />
1-47
48. Interceptors
Регистрация Interceptors
<?xml version="1.0" encoding="UTF-8" ?>
Свойства тега interceptor:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts имя interceptor. По
Уникальное Configuration
name нему будут ссылаться на этот
2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> interceptor
<package ... > class Java-класс interceptor
<interceptors>
<interceptor
name=“myInterceptor"
class="MyInterceptor"/>
</interceptors>
</package>
</struts>
struts.xml
1-48
49. Interceptors
Включение Interceptors для Actions
Для того, чтобы Interceptors
отрабатывали для нужных Actions,
следует связать их
Это можно сделать двумя способами:
Явно связать каждый Action с необходимыми
ему Interceptors
Определить Interceptors по умолчанию для
всего пакета
1-49
50. Interceptors
Явное связывание Interceptors и Actions
При регистрации Action производится
ссылка на необходимые Interceptors
<struts>
<package ... >
<action name="my" class="act_name" >
<result>view.jsp</result>
<interceptor-ref name="myInterceptor1"/>
<interceptor-ref name="myInterceptor2"/>
</action>
</package>
</struts>
struts.xml
1-50
51. Interceptors
Interceptor по умолчанию для всего
пакета
<struts> Таким образом можно
<package ... > задать только один
<default-interceptor-ref Interceptor по
name="myInterceptor1"/> умолчанию для пакета
...
</package>
</struts>
struts.xml
1-51
52. Interceptors
Именованные стеки Interceptors
Обычно при конфигурировании
приложения возникает задача
определить целую группу Interceptors
в заданном порядке
Чтобы не делать это каждый раз,
можно единожды задать именованный
стек и многократно ссылаться на него
1-52
53. Interceptors
Именованные стеки Interceptors
Пример прямо из struts-default.xml
<package ...>
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
</package>
struts-default.xml
1-53
54. Interceptors
Именованные стеки Interceptors
<package ...> Ссылка на
<interceptor-stack name="basicStack"> определенный
<interceptor-ref name="exception"/> выше
<interceptor-ref name="servlet-config"/> Interceptor или
их стек
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
</package>
struts-default.xml
1-54
55. Interceptors
Явное связывание стека Interceptors
и Actions
При регистрации Action можно
ссылаться на стек Interceptors
<struts>
<package ... >
<action name="my" class="act_name" >
<result>view.jsp</result>
<interceptor-ref name="basicStack"/>
</action>
</package>
</struts>
struts.xml
1-55
56. Interceptors
Стек Interceptors по умолчанию для
всего пакета
При регистрации дефолтного
Interceptor можно сослаться на стек
<struts>
<package ... >
<default-interceptor-ref
name="basicStack"/>
...
</package>
</struts>
struts.xml
1-56
57. Interceptors
Interceptors в составе Struts2
Struts2 уже изначально поставляется с
целым набором Interceptors
Они описаны и зарегистрированы в
конфигурации по умолчанию
Так же описаны и зарегистрированы
их стеки для наиболее
распространенных типов задач
1-57
58. Interceptors
Interceptors в составе Struts2
Имя Interceptor Функциональность
alias Converts similar parameters that may be named
differently between requests
Makes the previous Action's properties available to the
chain current Action. Commonly used together with <result
type="chain"> (in the previous Action)
conversionError Adds conversion errors from the ActionContext to the
Action's field errors
Create an HttpSession automatically, useful with
createSession certain Interceptors that require a HttpSession to
work properly (like the TokenInterceptor)
debugging Provides several different debugging screens to provide
insight into the data behind the page
1-58
59. Interceptors
Interceptors в составе Struts2
Имя Interceptor Функциональность
execAndWait Executes the action in the background and then sends
the user off to an intermediate waiting page
exception Maps exceptions to a result
fileUpload An interceptor that adds easy access to file upload
support
I18n Remembers the locale selected for a user‘s session
logger Outputs the name of the action
If the Action implements ModelDriven, pushes the
model-driven
getModel Result onto the Value Stack
If the action implements ScopedModelDriven, the
scoped-model-
driven interceptor retrieves and stores the model from a scope
and sets it on the action calling setModel()
1-59
60. Interceptors
Interceptors в составе Struts2
Имя Interceptor Функциональность
params Sets the request parameters onto the Action
Sets the “struts.xml” defined parameters onto the action.
static-params These are the <param …/> tags that are direct children
of the <action … /> tag.
scope Simple mechanism for storing action state in the session
or application scope
servlet-config Provide access to Maps representing
HttpServletRequest and HttpServletResponse
timer Outputs how long the action takes to execute (including
nested Interceptors and View)
token Checks for valid token presence in action, prevents
duplicate form submission
1-60
61. Interceptors
Interceptors в составе Struts2
Имя Interceptor Функциональность
token-session Same as token interceptor, but stores the submitted data
in session when handed an invalid token
validation Performs validation using the validators defined in
action-validation.xml
workflow Calls the validate method in your action class. If action
errors are created then it returns the INPUT view
Store and retrieve action messages / errors / field errors
store for action that implements ValidationAware interface
into session
Adds automatic checkbox handling code that detect an
checkbox unchecked checkbox and add it as a parameter with a
default (usually 'false') value
1-61
62. Interceptors
Interceptors в составе Struts2
Имя Interceptor Функциональность
profiling Activate profiling through parameter
roles Action will only be executed if the user has the correct
JAAS role
If the action implements Preparable, calls it’s
prepare
prepare() method
1-62
63. Interceptors
Стеки Interceptors в составе Struts2
Для использования готового стека из
состава Struts2 для Actions можно:
Расположить необходимый Action в
дефолтном пакете, где этот стек определен
(с помощью аннотации или константы)
Сконфигурировать собственный пакет,
наследующий конфигурацию от дефолтного,
и определить Action в нем
<package name="mypackage"
extends="struts-default" namespace="/mypackage">
</package>
1-63
64. Interceptors
Стеки Interceptors в составе Struts2
Имя стека Функциональность
The most basic stack provided by Struts2. Provides
basicStack exception handling, HTTP objects and request/form
parameters are injected into the action, and conversion
errors handled.
Validation Adds validation and workflow to the basic stack
WorkflowStack
fileUploadStack Adds automatic file uploading support to the basic stack
modelDrivenStack Adds support for model driven actions to the basic stack
chainStack Adds action chaining support to the basic stack
i18nStack Adds internationalization to the basic stack
For most scenarios it provides all the functionality that is
defaultStack required. In fact, it includes nearly all the interceptors
available in the core distribution
1-64
65. Interceptors
Стеки Interceptors в составе Struts2
Имя стека Функциональность
This is the most complex stack provided. It is used when
request parameters are to be applied to an action to load
data (or perform other task) when the prepare() method
paramsPrepare is called, and then the request parameters re-applied to
ParamsStack override some of the loaded values. A good example of
using this stack is for an object update. The id is used to
load the object out of the database, and then the data
from the request is used to override some of the data
loaded.
completeStack This stack provides backward compatibility for WebWork
applications by providing an alias to the “defaultStack”.
executeAnd Adds asynchronous execution of actions to the default
WaitStack stack
1-65
66. Interceptors
Разработка собственных Interceptors
Разработка собственных Interceptor
обеспечивает элегантный способ
разделения аспектов логики
приложения
Interceptor – обычный POJO,
реализующий интерфейс
com.opensymphony.xwork2.interceptor.
Interceptor
1-66
67. Interceptors
Разработка собственных Interceptors
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation)
throws Exception;
}
Для упрощения разработки существует класс
AbstractInterceptor, предлагающий
пустую реализацию методов destroy() и
init()
1-67
68. Interceptors
Разработка собственных Interceptors
Пример собственного Interceptor
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class SimpleInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)
throws Exception {
MyAction action = (MyAction)invocation.getAction();
action.setDate(new Date());
return invocation.invoke();
}
}
SimpleInterceptor.java
1-68
71. Actions
Action – это Unit of Work приложения
Action инкапсулирует в себе
бизнес-логику приложения
Action является Model в парадигме
MVC
Инкапсулирует данные для других
компонентов приложения (в т.ч. View)
1-71
72. Actions
Разработка и использование Actions
Action – это POJO
Нет необходимости наследоваться от
каких-либо классов или реализовать
интерфейсы
Actions должны быть включены в
конфигурацию приложения:
Zero-configuration
Явная регистрация в конфигурации
приложения – пакете
1-72
73. Actions
Разработка класса Action
Пример класса Action
Имя класса Action Бизнес-метод
( по умолчанию execute() )
class MyAction {
public void String execute() throws Exception {
return "success";
}
} Возвращаемый строковый Result (исход).
Result может так же быть специальным
MyAction.java
объектом.
1-73
74. Actions
Класс ActionSupport
Для упрощения разработки можно
наследоваться от класса
ActionSupport
Этот класс предоставляет реализацию
по умолчанию поддержки валидации
входных параметров,
интернационализации и других
возможностей
1-74
75. Actions
Разработка класса Action
В классе Action присутствует
бизнес-метод (по умолчанию
execute() )
Этот бизнес-метод возвращает
специальный Result, который
определяет, какой именно результат
отображать клиенту – исход
Result может быть специальным
объектом или простой строкой
1-75
76. Actions
Разработка класса Action
Пример класса Action
class MyAction {
public void String execute() throws Exception {
if( myLogicWorked() ) return "success";
else return "error";
} Первый исход выполнения
} Второй исход выполнения бизнес-логики
бизнес-логики
MyAction.java
Что будет сформировано каркасом
как результат клиенту в каждом из
случаев?
1-76
77. Actions
Регистрация Action
При регистрации Action могут
определяться возможные исходы
выполнения Action
Уникальное имя Action Java-класс Action
...
<action name="my" class="MyAction" >
<result>view.jsp</result>
<result name="error">error.jsp</result>
</action>
... Возможный Result (исход) выполнения
метода бизнес-логики
struts.xml
1-77
79. Actions
Регистрация Action
Определение имени метода
бизнес-логики
<action
По умолчанию execute()
name="my"
class="MyAction"
method="update" >
<result>view.jsp</result>
<result name="error">error.jsp</result>
</action>
struts.xml
1-79
80. Actions
Разработка и регистрация Action –
простой сценарий
Разрабатывается POJO-класс Action
Регистрируется в пакете
Для Action регистрируются возможные
исходы (Results)
Бизнес-метод Action возвращает строку –
имя одного из возможных исходов
В данном простом случае
логика Result – вывод JSP-страницы
1-80
81. Actions
Разработка и регистрация Action –
расширенные сценарии
Возможно применять различные типы
Results с достаточно сложной логикой
формирования ответа пользователю
(об этом – в модуле по Results)
Регистрацию Action можно
производить неявно
(zero-configuration)
1-81
82. Actions
Zero-configuration Action
Для упрощения регистрации Actions
можно воспользоваться аннотациями
Это позволит не регистрировать
Actions в пакете
Но для этого необходимо указать
каркасу дополнительную
информацию – задать параметр
actionPackages
1-82
83. Actions
Аннотации класса Action
Аннотация Функциональность
Namespace A string value of the desired namespace (defined in the
“struts.xml” configuration file)
ParentPackage A string value of the desired parent package
Results A list of the “Result” annotations
Result Provides the mapping to the results for the
action
1-83
84. Actions
Action Lifecycle Callbacks
В классе Action можно определить
методы, которые будут автоматически
вызываться каркасом на
определенных этапах работы Action
Эти методы следует проаннотировать:
@Before The method annotated will be invoked before the method that
performs the logic for the action
@Before The method annotated will be invoked after the method that performs
Result the logic for the action, but before the result is invoked
@After The method annotated will be invoked after result is invoked, but
before the result is returned to the user
1-84
85. Actions
Данные форм в Action
Для упрощения обработки HTML-форм
каркас автоматически передаст
данные формы в Action
(ParametersInterceptor)
Для этого необходимо определить в
классе Action JavaBean-свойства,
соответствующие полям формы
JavaBean-свойство – совокупность set-
и get-метода
1-85
86. Actions
Преобразования типов параметров
Каркас автоматически приводит типы
Это делается для примитивных типов
и wrappers
При необходимости возможно
разработать собственные
преобразователи
(с использованием аннотации
@TypeConversion)
1-86
87. Actions
Данные форм в Action
HTTP GET request: /UserAction.action?age=33
public class UserAction {
private int age;
public int getAge() { return age; }
public void setAge( int age ) { this.age = age; }
public String execute() throws Exception {
DAOService.udateAge(age);
return "success";
}
}
UserAction.java
1-87
88. Actions
Object-backed Actions
Actions, чьи свойства являются
JavaBeans
public class UserAction {
public String execute(){ ... }
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
UserAction.java
1-88
89. Actions
Object-backed Actions
Данные таких Actions точно так же
доступны в ValueStack с помощью
OGNL:
%{user.username}
1-89
90. Actions
Model-driven Actions
Все рассмотренные Actions
инкапсулировали в себе данные
модели (в терминах MVC)
Часто необходимо обособить данные
модели в отдельные объекты
Для использования как DTO
Данные модели представлены классами из
внешних библиотек
1-90
91. Actions
Model-driven Actions
Для обособления данных модели
Struts2 предлагает следующий подход:
Action возвращает объект – model data
Этот объект помещается в ValueStack выше
Action
Это работа интерфейса
com.opensymphony.xwork2.
ModelDriven и modelDriven
interceptor
1-91
92. Actions
Model-driven Actions
public class ModelDrivenRegister extends ActionSupport
implements ModelDriven {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Object getModel() {
return user;
}
}
1-92
93. Actions
Валидация входных параметров
Проверку (валидацию) входных
параметров можно осуществлять:
Программно
Декларативно
Сам процесс валидации запускается
соответствующим Interceptor
Validation и Workflow
1-93
94. Actions
Программная валидация
Для самостоятельной реализации
логики валидации в классе Action
следует реализовать два интерфейса:
Validateable
Содержит метод валидации
ValidationAware
Содержит методы работы с ошибками
валидации
Или наследоваться от класса
ActionSuport 1-94
95. Actions
Декларативная валидация
В этом случае логика валидации
описывается декларативно:
С помощью аннотаций
Аналогичны xml-элементам
В xml-файле
По умолчанию имя файла с конфигурацией
валидации ActionName-validation.xml
http://struts.apache.org/2.x/docs/validation.html
1-95
96. Actions
Декларативная валидация – пример xml
<!DOCTYPE ... >
<validators>
<field name="count">
<field-validator type="int" short circuit="true">
<param name="min">1</param>
<param name="max">100</param>
<message key="invalid.count">
Value must be between ${min} and${max}
</message>
</field-validator>
</field>
</validators>
MyAction-validation.xml
1-96
97. Actions
Обработка исключений
Обработку исключений, как и
валидацию, можно проводить вручную
или декларативно
Декларативная обработка
осуществляется соответствующим
Interceptor (exception),
разработчику необходимо
декларативно определить политику
обработки
1-97
98. Actions
Декларативная обработка исключений
При декларации политики обработки
исключений её можно определить как
глобальную для всех Actions:
Формируемый в случае исключения Result
(должен быть сконфигурирован)
<global-exception-mappings>
<exception-mapping result="sqlException"
exception="java.sql.JDBCConnectionException"/>
</global-exception-mappings>
Тип обрабатываемого
struts.xml
исключения
1-98
99. Actions
Декларативная обработка исключений
При декларации политики обработки
исключений её можно определить как
локальную для конкретного Action:
<action name="my" class="MyAction" >
<result>view.jsp</result>
<interceptor-ref name="basicStack"/>
<exception-mapping result="exists"
exception="ConstraintViolationException" />
</action>
struts.xml
1-99
100. Actions
Декларативная обработка исключений
Чтобы выбранному Result можно
было вывести информацию об
исключении, exception Interceptor
добавляет в Value Stack объекты:
exception The exception object that was thrown
exceptionStack The string value of the stack trace
1-100
103. Dependency Injection
Recap
Struts2 активно использует DI
Это значит, что в большинстве
случаев разработчику не придется
самостоятельно обращаться за
ресурсами
Они будут автоматически переданы
компонентам
1-103
104. Dependency Injection
Recap
Передача стандартных типов объектов
осуществляется средствами Struts2
Передача нестандартных типов
объектов осуществляется средствами
DI-контейнеров, подключаемых как
плагины:
Plexus
PicoContainer
Spring
1-104
107. Dependency Injection
Стандартные инъектруемые типы
Стандартные типы инъектируются
ServletConfigInterceptor
Чтобы показать, какие объекты нужны
Action, этот класс должен реализовать
соответствующий Aware-интерфейс
1-107
108. Dependency Injection
Aware-интерфейсы для Actions
SessionAware to provide access to all the session attributes via a Map
ServletRequestAware to provide access to the HttpServletRequest object
RequestAware to provide access to all the request attributes via a Map
ApplicationAware
to provide access to all the application attributes via a
Map
ServletResponseAware to provide access to the HttpServletResponse object
ParameterAware
to provide access to all the request string and form
values attributes via a Map
to provide access to the PrincipleProxy object; this
object implements the principle and role methods of the
PrincipalAware HttpServletRequest object in implementation, but by
providing a proxy, allows for implementation
independence in the action
ServletContextAware to provide access to the ServletContext object
1-108
111. Results
Типы исходов – Results
Бизнес-метод Action возвращает
какой-либо исход (Result)
Этот Result определяет, что будет
сформировано в качестве контента
пользователю
В комплекте Struts2 поставляется
набор готовых типов Result
Разработчик может писать свои типы
Results 1-111
112. Results
Типы результатов в поставке Struts2
Помимо результатов, приводящих к
выводу JSP или сервлета
(ServletDispatcherResult и
ServletRedirectResult), Struts2
предлагает поддержку других
технологий вывода результатов:
Velocity Templates
Freemarker Templates
XSLT Transformations
1-112
113. Results
Типы результатов в поставке Struts2
Chains from the execution of one action to another
chain
configured action. Copies all property values with getter
methods from the initial action to corresponding setter
methods on the target action
Renders Java server pages. This is the default result
dispatcher type, and is used if no result type is configured in the
action сonfiguration
redirect Redirects to any arbitrary URL
freemarker Renders Freemarker templates
httpheader Returns HTTP headers with user defined values
1-113
114. Results
Типы результатов в поставке Struts2
redirect-action
Redirect to a configured action. Can be used to provide
redirect after post functionality
stream
Streams data back to the browser. Used to stream PDF,
Microsoft Word, images, or other data
velocity Renders Velocity templates
xslt
Uses an XSLT to format the properties from the action
that has been previously executed
1-114
115. Results
Регистрация Results в пакете
Пример из конфигурации по
умолчанию
Имя типа результата Тип результата по умолчанию
<result-types>
<result-type name="dispatcher" default="true"
class="….dispatcher.ServletDispatcherResult"/>
<result-type name="redirect"
class="….dispatcher.ServletRedirectResult"/>
…
</result-types> Java-класс типа результата
struts-default.xml
1-115
116. Results
Регистрация Results для Action
Зарегистрировать Result для Action
можно в конфигурации приложения
<action name="my" class="MyAction" >
<result type="dispatcher">view.jsp</result>
</action>
Тип результата struts.xml
(по умолчанию dispatcher)
Зарегистрировать Result для Action
можно так же с помощью аннотаций
@Results и @Result
1-116
117. Results
Глобальные Results
Часто у нескольких Action появляются
одни и те же исходы
Чтобы не дублировать код
конфигурации, можно ввести
глобальные Results на уровне всего
пакета
<global-results>
<result name=”logon”>/logon.jsp</result>
<result name=”error”>/error.jsp</result>
<global-results>
1-117
118. Results
Собственные типы результатов
Разработчик может написать
собственный тип результата и
процедурно формировать в нем сколь
угодно сложный контент
Класс результата реализует
интерфейс Result
public interface Result extends Serializable {
public void execute(ActionInvocation invocation)
throws Exception;
}
1-118
119. Results
JSP custom tags
Одним из наиболее распространенных
типов выводимого контента остаются
JSP-страницы
Struts2 поставляется с собственной
библиотекой custom tags
1-119
120. Results
JSP custom tags
Custom tags выполняют целый ряд
задач:
Генерирут HTML-разметку элементов
Связывают вывод с темами
Связывают значения элементов формы со
свйствами Actions как при выводе элемента,
так и при подтверждении формы
Обеспечивают преобразования типов
Обеспечивают валидацию
Обеспечивают интернационализацию 1-120
121. Results
JSP custom tags
Наиболее востребованные теги:
property, text
url
form
textfield, password, textarea,
checkbox, select, hidden, label
set, push, bean
iterator
1-121
122. Results
Custom tags data binding
Связывание данных тега с данными
Action осуществляется с помощью
OGNL
1-122
126. Дополнительные темы
Темы, не вошедшие в рассмотрение
Преобразование типов
Валидация
Темы оформления
Dependency Injection нестандартных
объектов
I18N
Plug-ins
Single Action for operation groups
Advanced URL mappings for Actions
1-126
128. УЦ Luxoft
О нашем Учебном Центре
УЦ Luxoft предлагает более 200
курсов и тренингов по различным
направлениям промышленной
разработки ПО
Наши инструкторы – практики,
готовые передать свою экспертизу
http://www.luxoft.ru/edu
1-128