Введение в веб каркас Struts2
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
10,197
On Slideshare
9,996
From Embeds
201
Number of Embeds
7

Actions

Shares
Downloads
141
Comments
0
Likes
2

Embeds 201

http://ekrs.blogspot.com 148
http://www.slideshare.net 26
http://ekrs.blogspot.ru 19
http://www.linkedin.com 4
http://ekrs.blogspot.co.uk 2
http://ekrs.blogspot.fi 1
https://www.linkedin.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Struts2 Евгений Кривошеев EKrivosheev@luxoft.com
  • 2. План курса Roadmap 1-2
  • 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
  • 8. Архитектура MVC дает возможность представить структуру приложения (web-flow) 1-8
  • 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
  • 12. Архитектура Архитектура каркаса Struts2 1 2 3 10 4 9 5 8 View View 7 6 @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-12
  • 13. Архитектура Dependency Injection Шаблон проектирования Inversion of Control / Dependency Injection Популизирован Мартином Фаулером Основная идея – снизить степень зависимости компонентов Factory vs Container http://www.martinfowler.com/articles/injection.html 1-13
  • 14. Архитектура Dependency Injection Стандартная зависимость: Dependency Injection: 1-14
  • 15. Архитектура Dependency Injection Технически инъекция может производиться как: Constructor Injection Setter Injection Interface Injection (Aware–интерфейсы) 1-15
  • 16. Архитектура Dependency Injection в Struts2 Struts2 активно использует DI Это значит, что в большинстве случаев разработчику не придется самостоятельно обращаться за ресурсами Они будут автоматически переданы компонентам 1-16
  • 17. Архитектура Dependency Injection в Struts2 Передача стандартных типов объектов осуществляется средствами Struts2 Передача нестандартных типов объектов осуществляется средствами DI-контейнеров, подключаемых как плагины: Plexus PicoContainer Spring 1-17
  • 18. Архитектура Выводы по архитектуре View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-18
  • 19. Архитектура Struts2 – open-source framework http://struts.apache.org/2.x/ 1-19
  • 20. План курса Roadmap 1-20
  • 21. Конфигурация Конфигурирование Dispatcher Filter View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-21
  • 22. Конфигурация Конфигурирование Dispatcher Filter <filter> <filter-name>action2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>action2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> web.xml 1-22
  • 23. Конфигурация Конфигурирование приложения View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-23
  • 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
  • 32. План курса Roadmap 1-32
  • 33. ActionContext & Value Stack View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-33
  • 34. ActionContext Механизм обмена данными между компонентами Struts2-приложения Специальный контейнерный объект, хранящий необходимые компонентам объекты Является Thread-local Избавляет компоненты от зависимости к Servlet API 1-34
  • 35. ActionContext Содержимое контейнера ActionContext 1-35
  • 36. ActionContext Содержимое контейнера ActionContext При этом есть возможность помещать в него произвольные объекты 1-36
  • 37. Value Stack Виртуальный стек объектов Виртуальность: является единой совокупностью свойств включенных объектов Стек: «сверху вниз» По умолчанию включает в себя в указанном порядке: При использовании model objects, The Model Object текущий model object находится в стеке перед action The Action Object Выполняемый action-объект 1-37
  • 38. Value Stack Виртуальный стек объектов 1-38
  • 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
  • 43. План курса Roadmap 1-43
  • 44. Interceptors View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-44
  • 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
  • 69. План курса Roadmap 1-69
  • 70. Actions View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-70
  • 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
  • 78. Actions Регистрация Action Дефолтное имя исхода ... По умолчанию success <action name="my" class="MyAction" > <result>view.jsp</result> <result name="error">error.jsp</result> </action> ... struts.xml 1-78
  • 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
  • 101. Actions View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-101
  • 102. План курса Roadmap 1-102
  • 103. Dependency Injection Recap Struts2 активно использует DI Это значит, что в большинстве случаев разработчику не придется самостоятельно обращаться за ресурсами Они будут автоматически переданы компонентам 1-103
  • 104. Dependency Injection Recap Передача стандартных типов объектов осуществляется средствами Struts2 Передача нестандартных типов объектов осуществляется средствами DI-контейнеров, подключаемых как плагины: Plexus PicoContainer Spring 1-104
  • 105. Dependency Injection Recap Технически инъекция может производиться как: Constructor Injection Setter Injection Interface Injection (Aware–интерфейсы) 1-105
  • 106. Dependency Injection Стандартные инъектруемые типы Это стандартные объекты технологии Servlets HTTPSession HTTPServletRequest/Response ServletContext ServletConfig etc 1-106
  • 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
  • 109. План курса Roadmap 1-109
  • 110. Results View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-110
  • 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
  • 123. Results View View @@ web.xml web.xml struts.xml struts.xml struts.properties struts.properties 1-123
  • 124. Выводы Roadmap 1-124
  • 125. Введение в Struts2 Буду рад ответить на Ваши вопросы 1-125
  • 126. Дополнительные темы Темы, не вошедшие в рассмотрение Преобразование типов Валидация Темы оформления Dependency Injection нестандартных объектов I18N Plug-ins Single Action for operation groups Advanced URL mappings for Actions 1-126
  • 127. Struts2 Евгений Кривошеев EKrivosheev@luxoft.com
  • 128. УЦ Luxoft О нашем Учебном Центре УЦ Luxoft предлагает более 200 курсов и тренингов по различным направлениям промышленной разработки ПО Наши инструкторы – практики, готовые передать свою экспертизу http://www.luxoft.ru/edu 1-128