SlideShare una empresa de Scribd logo
1 de 128
Descargar para leer sin conexión
Struts2

Евгений Кривошеев
EKrivosheev@luxoft.com
План курса
Roadmap




             1-2
Архитектура
Шаблон проектирования MVC
   Model – View – Controller
   Основная задача – упростить
   разработку и поддержку
   приложений с графическим
   интерфейсом
   В дальнейшем под приложениями
   мы будем понимать
   веб-приложения на базе
   платформы J2EE
                                   1-3
Архитектура
Классическое веб-приложение на JSP
         JSP
        JSP                 Специфика:
         или
        или
         HTML
                              Hard-coded links
        HTML     JSP
                JSP
                 или
                или
                              Бизнес-логика
                 HTML
                HTML          реализована
 JSP
JSP                           посредством JSP или
 или
или                           сервлетов
 HTML
HTML


                   Данные
                            Для больших приложений:
                  Данные
          JSP
         JSP                  Сложность разработки
          или
         или
         HTML                 Сложность поддержки
        HTML

                                                    1-4
Архитектура
 Веб-приложение на базе 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
Архитектура
Последовательность работы
   Все запросы проходят через
   Controller
   Controller определяет, какую бизнес-
   логику активировать и принимает
   данные от неё
   Controller определяет, какую View
   использовать и передает ей данные
   View предназначена только для
   вывода данных пользователю             1-6
Архитектура
Выводы
   Четкое разделение структуры
   приложения, его бизнес-логики и
   представления данных клиенту
   Это снижает стоимость разработки и
   поддержки сложных приложений




                                        1-7
Архитектура
MVC дает возможность представить
структуру приложения (web-flow)




                                   1-8
Архитектура
Вопросы реализации
   Как возможно реализовать Controller?
   Как возможно реализовать View?
   Как Controller будет определять,
   какую бизнес логику вызывать?
   Как Controller будет определять,
   какую View выводить пользователю?
   Как Controller будет передавать
   данные для отображения во View?см. далее
                                          1-9
Архитектура
 Веб-приложение на базе 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
Архитектура
Реализация MVC в Struts2
   Каркас Struts2 предлагает уже
   реализованный Controller
   Каркас Struts2 предлагает
   стандартный подход к разработке
   модели
   Каркас Struts2 предлагает
   стандартный подход к разработке
   представлений
                                     1-11
Архитектура
Архитектура каркаса 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
Архитектура
Dependency Injection
   Шаблон проектирования Inversion of
   Control / Dependency Injection
   Популизирован Мартином Фаулером
   Основная идея – снизить степень
   зависимости компонентов
   Factory vs Container

       http://www.martinfowler.com/articles/injection.html
                                                             1-13
Архитектура
Dependency Injection
   Стандартная
   зависимость:



   Dependency
   Injection:


                       1-14
Архитектура
Dependency Injection
   Технически инъекция может
   производиться как:
     Constructor Injection
     Setter Injection
     Interface Injection (Aware–интерфейсы)




                                              1-15
Архитектура
Dependency Injection в Struts2
    Struts2 активно использует DI
    Это значит, что в большинстве
    случаев разработчику не придется
    самостоятельно обращаться за
    ресурсами
    Они будут автоматически переданы
    компонентам


                                       1-16
Архитектура
Dependency Injection в Struts2
    Передача стандартных типов объектов
    осуществляется средствами Struts2
    Передача нестандартных типов
    объектов осуществляется средствами
    DI-контейнеров, подключаемых как
    плагины:
     Plexus
     PicoContainer
     Spring
                                     1-17
Архитектура
Выводы по архитектуре




                                     View
                                    View


                       @@
     web.xml
    web.xml         struts.xml
                   struts.xml
                struts.properties
               struts.properties




                                            1-18
Архитектура
Struts2 – open-source framework




        http://struts.apache.org/2.x/
                                        1-19
План курса
Roadmap




             1-20
Конфигурация
Конфигурирование Dispatcher Filter




                                     View
                                    View


                       @@
     web.xml
    web.xml         struts.xml
                   struts.xml
                struts.properties
               struts.properties




                                            1-21
Конфигурация
Конфигурирование 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
Конфигурация
Конфигурирование приложения




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-23
Конфигурация
Базовые настройки (properties)
   Определяют стандартное поведение
   каркаса
   Как правило, нет нужды их менять
   Меняются обычно для обеспечения
   более детального режима
   тестирования и отладки



                                      1-24
Конфигурация
Базовые настройки (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
Конфигурация
Базовые настройки (properties)
   Базовые настройки могут быть
   определены в:
     Базовом дескрипторе развертывания
     web.xml как наcтроечные параметры
     фильтра (init-param)
     В файле struts.properties. Он
     поставляется в комплекте Struts2
     Как константы в файле конфигурации
     struts.xml

                                          1-26
Конфигурация
Конфигурация Struts2-приложения
   Определяет структуру и состав
   приложения




                                        View
                                       View


                          @@
        web.xml
       web.xml         struts.xml
                      struts.xml
                   struts.properties
                  struts.properties



                                               1-27
Конфигурация
Конфигурация приложения
   Приложение может быть
   сконфигурировано:
    В xml-файле конфигурации
    (по умолчанию struts.xml)
    C помощью аннотаций и умолчаний
    (в этом случае файл конфигурации может
    вообще отсутствовать)



                                             1-28
Конфигурация
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
Конфигурация
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
Конфигурация
Включение внешних файлов
  <?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
План курса
Roadmap




             1-32
ActionContext &
Value Stack




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-33
ActionContext
Механизм обмена данными между
компонентами Struts2-приложения
   Специальный контейнерный объект,
   хранящий необходимые компонентам
   объекты
   Является Thread-local
   Избавляет компоненты от
   зависимости к Servlet API


                                      1-34
ActionContext
Содержимое контейнера ActionContext




                                      1-35
ActionContext
Содержимое контейнера ActionContext




   При этом есть возможность помещать в него
   произвольные объекты
                                               1-36
Value Stack
Виртуальный стек объектов
   Виртуальность: является единой
   совокупностью свойств включенных
   объектов
   Стек: «сверху вниз»
   По умолчанию включает в себя в
   указанном порядке:
                      При использовании model objects,
     The Model Object текущий model object находится в стеке
                      перед action
    The Action Object Выполняемый action-объект
                                                               1-37
Value Stack
Виртуальный стек объектов




                            1-38
Value Stack
Доступ к данным в Value Stack
   При запросе необходимого свойства
   из Value Stack указывается имя
   свойства, при этом стек будет
   автоматически пройден сверху вниз и
   вернется требуемое свойство первого
   попавшегося объекта
   Т.е. верхнего в стеке


                                     1-39
OGNL
Язык выражений OGNL
     Object Graph Navigational Language
     Читается «όджинл»
     Обеспечивает унифицированый
     способ доступа к объектам в
     ActionContext
     Используется в основном для доступа
     к ActionContext из представлений

  http://www.ognl.org/2.6.9/Documentation/html/LanguageGuide/index.html
                                                                          1-40
OGNL
Язык выражений OGNL
   OGNL поддерживает:
    Точечную нотацию доступа к свойствам
    person.address вместо getPerson().getAddress()
    Приведение типов
    Вызов методов
    Создание и управление коллекциями
    Выполнение выражений
    (expression evaluation)
    Лямбда-выражения

                                                     1-41
OGNL
Язык выражений OGNL
   Выражения могут заключаться в
   конструкцию %{ expr }
   Адресация объекта в ActionContext
   осуществляется оператором #
           #session['user']
   Объект в ActionContext по
   умолчанию - ValueStack

                                   1-42
План курса
Roadmap




             1-43
Interceptors




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-44
Interceptors
Специальные объекты, обеспечивающие
пред- и пост-обработку запроса и ответа
для Action
    Interceptors упорядочены
   Они имеют доступ к окружению и
   выполняемому Action
   Реализуют аспектный подход
   (separation of concerns)
   Позволяют при разработке Actions
   сконцентрироваться на разработке
   только бизнес-логики
                                      1-45
Interceptors
Стандартные задачи Interceptors
   Обработка исключений
   Загрузка файлов с клиентской машины
   Извещение компонентов о событиях
   жизненного цикла (lifecycle callbacks)
   Валидация пользовательских данных
   Dependency Injection нужных ресурсов
   в компоненты
   Etc
                                       1-46
Interceptors
Регистрация Interceptors
   Для использования собственного или
   поставляемого вместе со Struts2
   interceptor его необходимо включить в
   конфигурацию приложения
   Для этого в конфигурационом файле
   Struts2 следует воспользоваться
   элементами <interceptors … /> и
   <interceptor … />

                                       1-47
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
Interceptors
Включение Interceptors для Actions
   Для того, чтобы Interceptors
   отрабатывали для нужных Actions,
   следует связать их
   Это можно сделать двумя способами:
     Явно связать каждый Action с необходимыми
     ему Interceptors
     Определить Interceptors по умолчанию для
     всего пакета

                                                1-49
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
Interceptors
Interceptor по умолчанию для всего
пакета

<struts>                                Таким образом можно
   <package ... >                       задать только один
       <default-interceptor-ref         Interceptor по
              name="myInterceptor1"/>   умолчанию для пакета
       ...
   </package>
</struts>
                                                 struts.xml



                                                               1-51
Interceptors
Именованные стеки Interceptors
   Обычно при конфигурировании
   приложения возникает задача
   определить целую группу Interceptors
   в заданном порядке
   Чтобы не делать это каждый раз,
   можно единожды задать именованный
   стек и многократно ссылаться на него


                                      1-52
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
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
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
Interceptors
Стек Interceptors по умолчанию для
всего пакета
     При регистрации дефолтного
     Interceptor можно сослаться на стек
<struts>
   <package ... >
       <default-interceptor-ref
              name="basicStack"/>
       ...
   </package>
</struts>
                                    struts.xml

                                                 1-56
Interceptors
Interceptors в составе Struts2
    Struts2 уже изначально поставляется с
    целым набором Interceptors
    Они описаны и зарегистрированы в
    конфигурации по умолчанию
    Так же описаны и зарегистрированы
    их стеки для наиболее
    распространенных типов задач


                                       1-57
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
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
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
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
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
Interceptors
Стеки Interceptors в составе Struts2
    Для использования готового стека из
    состава Struts2 для Actions можно:
     Расположить необходимый Action в
     дефолтном пакете, где этот стек определен
     (с помощью аннотации или константы)
     Сконфигурировать собственный пакет,
     наследующий конфигурацию от дефолтного,
     и определить Action в нем
      <package name="mypackage"
         extends="struts-default" namespace="/mypackage">
      </package>

                                                            1-63
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
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
Interceptors
Разработка собственных Interceptors
   Разработка собственных Interceptor
   обеспечивает элегантный способ
   разделения аспектов логики
   приложения
   Interceptor – обычный POJO,
   реализующий интерфейс
   com.opensymphony.xwork2.interceptor.
   Interceptor


                                        1-66
Interceptors
Разработка собственных Interceptors
public interface Interceptor extends Serializable {
  void destroy();
  void init();
  String intercept(ActionInvocation invocation)
      throws Exception;
}


    Для упрощения разработки существует класс
    AbstractInterceptor, предлагающий
    пустую реализацию методов destroy() и
    init()

                                                      1-67
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
План курса
Roadmap




             1-69
Actions




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-70
Actions
Action – это Unit of Work приложения
   Action инкапсулирует в себе
   бизнес-логику приложения
   Action является Model в парадигме
   MVC
     Инкапсулирует данные для других
     компонентов приложения (в т.ч. View)




                                            1-71
Actions
Разработка и использование Actions
   Action – это POJO
   Нет необходимости наследоваться от
   каких-либо классов или реализовать
   интерфейсы
   Actions должны быть включены в
   конфигурацию приложения:
     Zero-configuration
     Явная регистрация в конфигурации
     приложения – пакете
                                        1-72
Actions
Разработка класса Action
      Пример класса Action

  Имя класса Action           Бизнес-метод
                      ( по умолчанию execute() )
class MyAction {
   public void String execute() throws Exception {
        return "success";
   }
}        Возвращаемый строковый Result (исход).
         Result может так же быть специальным
                                                     MyAction.java
                      объектом.




                                                                     1-73
Actions
Класс ActionSupport
   Для упрощения разработки можно
   наследоваться от класса
   ActionSupport
   Этот класс предоставляет реализацию
   по умолчанию поддержки валидации
   входных параметров,
   интернационализации и других
   возможностей

                                     1-74
Actions
Разработка класса Action
   В классе Action присутствует
   бизнес-метод (по умолчанию
   execute() )
   Этот бизнес-метод возвращает
   специальный Result, который
   определяет, какой именно результат
   отображать клиенту – исход
   Result может быть специальным
   объектом или простой строкой
                                        1-75
Actions
Разработка класса Action
      Пример класса Action
class MyAction {
   public void String execute() throws Exception {
        if( myLogicWorked() ) return "success";
        else return "error";
   }                                  Первый исход выполнения
}        Второй исход выполнения           бизнес-логики
             бизнес-логики
                                                    MyAction.java

      Что будет сформировано каркасом
      как результат клиенту в каждом из
      случаев?
                                                                    1-76
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
Actions
Регистрация Action
    Дефолтное имя исхода

...            По умолчанию success
<action name="my" class="MyAction" >
  <result>view.jsp</result>
  <result name="error">error.jsp</result>
</action>
...

                                            struts.xml




                                                         1-78
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
Actions
Разработка и регистрация Action –
простой сценарий
   Разрабатывается POJO-класс Action
   Регистрируется в пакете
   Для Action регистрируются возможные
   исходы (Results)
   Бизнес-метод Action возвращает строку –
   имя одного из возможных исходов
   В данном простом случае
   логика Result – вывод JSP-страницы
                                         1-80
Actions
Разработка и регистрация Action –
расширенные сценарии
   Возможно применять различные типы
   Results с достаточно сложной логикой
   формирования ответа пользователю
   (об этом – в модуле по Results)
   Регистрацию Action можно
   производить неявно
   (zero-configuration)
                                      1-81
Actions
Zero-configuration Action
    Для упрощения регистрации Actions
    можно воспользоваться аннотациями
    Это позволит не регистрировать
    Actions в пакете
    Но для этого необходимо указать
    каркасу дополнительную
    информацию – задать параметр
    actionPackages
                                        1-82
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
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
Actions
Данные форм в Action
   Для упрощения обработки HTML-форм
   каркас автоматически передаст
   данные формы в Action
   (ParametersInterceptor)
   Для этого необходимо определить в
   классе Action JavaBean-свойства,
   соответствующие полям формы
   JavaBean-свойство – совокупность set-
   и get-метода
                                       1-85
Actions
Преобразования типов параметров
   Каркас автоматически приводит типы
   Это делается для примитивных типов
   и wrappers
   При необходимости возможно
   разработать собственные
   преобразователи
   (с использованием аннотации
   @TypeConversion)
                                    1-86
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
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
Actions
Object-backed Actions
   Данные таких Actions точно так же
   доступны в ValueStack с помощью
   OGNL:
          %{user.username}




                                       1-89
Actions
Model-driven Actions
    Все рассмотренные Actions
    инкапсулировали в себе данные
    модели (в терминах MVC)
    Часто необходимо обособить данные
    модели в отдельные объекты
     Для использования как DTO
     Данные модели представлены классами из
     внешних библиотек

                                              1-90
Actions
Model-driven Actions
    Для обособления данных модели
    Struts2 предлагает следующий подход:
     Action возвращает объект – model data
     Этот объект помещается в ValueStack выше
     Action
    Это работа интерфейса
    com.opensymphony.xwork2.
    ModelDriven и modelDriven
    interceptor
                                            1-91
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
Actions
Валидация входных параметров
   Проверку (валидацию) входных
   параметров можно осуществлять:
     Программно
     Декларативно
   Сам процесс валидации запускается
   соответствующим Interceptor
     Validation и Workflow



                                       1-93
Actions
Программная валидация
   Для самостоятельной реализации
   логики валидации в классе Action
   следует реализовать два интерфейса:
     Validateable
     Содержит метод валидации
     ValidationAware
     Содержит методы работы с ошибками
     валидации
   Или наследоваться от класса
   ActionSuport                          1-94
Actions
Декларативная валидация
   В этом случае логика валидации
   описывается декларативно:
     С помощью аннотаций
     Аналогичны xml-элементам
     В xml-файле
     По умолчанию имя файла с конфигурацией
     валидации ActionName-validation.xml



        http://struts.apache.org/2.x/docs/validation.html
                                                            1-95
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
Actions
Обработка исключений
   Обработку исключений, как и
   валидацию, можно проводить вручную
   или декларативно
   Декларативная обработка
   осуществляется соответствующим
   Interceptor (exception),
   разработчику необходимо
   декларативно определить политику
   обработки
                                   1-97
Actions
Декларативная обработка исключений
     При декларации политики обработки
     исключений её можно определить как
     глобальную для всех Actions:
                         Формируемый в случае исключения Result
                             (должен быть сконфигурирован)
<global-exception-mappings>
   <exception-mapping result="sqlException"
       exception="java.sql.JDBCConnectionException"/>
</global-exception-mappings>
                        Тип обрабатываемого
                                                    struts.xml
                             исключения

                                                                  1-98
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
Actions
Декларативная обработка исключений
    Чтобы выбранному Result можно
    было вывести информацию об
    исключении, exception Interceptor
    добавляет в Value Stack объекты:
        exception The exception object that was thrown
  exceptionStack The string value of the stack trace




                                                         1-100
Actions




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-101
План курса
Roadmap




             1-102
Dependency Injection
Recap
   Struts2 активно использует DI
   Это значит, что в большинстве
   случаев разработчику не придется
   самостоятельно обращаться за
   ресурсами
   Они будут автоматически переданы
   компонентам


                                      1-103
Dependency Injection
Recap
   Передача стандартных типов объектов
   осуществляется средствами Struts2
   Передача нестандартных типов
   объектов осуществляется средствами
   DI-контейнеров, подключаемых как
   плагины:
        Plexus
        PicoContainer
        Spring
                                    1-104
Dependency Injection
Recap
   Технически инъекция может
   производиться как:
        Constructor Injection
        Setter Injection
        Interface Injection (Aware–интерфейсы)




                                                 1-105
Dependency Injection
Стандартные инъектруемые типы
   Это стандартные объекты технологии
   Servlets
     HTTPSession
     HTTPServletRequest/Response
     ServletContext
     ServletConfig
     etc



                                    1-106
Dependency Injection
Стандартные инъектруемые типы
   Стандартные типы инъектируются
   ServletConfigInterceptor
   Чтобы показать, какие объекты нужны
   Action, этот класс должен реализовать
   соответствующий Aware-интерфейс




                                      1-107
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
План курса
Roadmap




             1-109
Results




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-110
Results
Типы исходов – Results
   Бизнес-метод Action возвращает
   какой-либо исход (Result)
   Этот Result определяет, что будет
   сформировано в качестве контента
   пользователю
   В комплекте Struts2 поставляется
   набор готовых типов Result
   Разработчик может писать свои типы
   Results                          1-111
Results
Типы результатов в поставке Struts2
   Помимо результатов, приводящих к
   выводу JSP или сервлета
   (ServletDispatcherResult и
   ServletRedirectResult), Struts2
   предлагает поддержку других
   технологий вывода результатов:
     Velocity Templates
     Freemarker Templates
     XSLT Transformations
                                      1-112
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
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
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
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
Results
Глобальные Results
     Часто у нескольких Action появляются
     одни и те же исходы
     Чтобы не дублировать код
     конфигурации, можно ввести
     глобальные Results на уровне всего
     пакета
<global-results>
   <result name=”logon”>/logon.jsp</result>
   <result name=”error”>/error.jsp</result>
<global-results>
                                              1-117
Results
Собственные типы результатов
     Разработчик может написать
     собственный тип результата и
     процедурно формировать в нем сколь
     угодно сложный контент
     Класс результата реализует
     интерфейс Result
public interface Result extends Serializable {
   public void execute(ActionInvocation invocation)
       throws Exception;
}
                                                      1-118
Results
JSP custom tags
   Одним из наиболее распространенных
   типов выводимого контента остаются
   JSP-страницы
   Struts2 поставляется с собственной
   библиотекой custom tags




                                   1-119
Results
JSP custom tags
   Custom tags выполняют целый ряд
   задач:
     Генерирут HTML-разметку элементов
     Связывают вывод с темами
     Связывают значения элементов формы со
     свйствами Actions как при выводе элемента,
     так и при подтверждении формы
     Обеспечивают преобразования типов
     Обеспечивают валидацию
     Обеспечивают интернационализацию        1-120
Results
JSP custom tags
   Наиболее востребованные теги:
     property, text
     url
     form
       textfield, password, textarea,
       checkbox, select, hidden, label
     set, push, bean
     iterator


                                         1-121
Results
Custom tags data binding
   Связывание данных тега с данными
   Action осуществляется с помощью
   OGNL




                                      1-122
Results




                                    View
                                   View


                      @@
    web.xml
   web.xml         struts.xml
                  struts.xml
               struts.properties
              struts.properties




                                           1-123
Выводы
Roadmap




          1-124
Введение в Struts2




 Буду рад ответить на Ваши вопросы




                                     1-125
Дополнительные темы
Темы, не вошедшие в рассмотрение
   Преобразование типов
   Валидация
   Темы оформления
   Dependency Injection нестандартных
   объектов
   I18N
   Plug-ins
   Single Action for operation groups
   Advanced URL mappings for Actions
                                        1-126
Struts2

Евгений Кривошеев
EKrivosheev@luxoft.com
УЦ Luxoft
О нашем Учебном Центре
   УЦ Luxoft предлагает более 200
   курсов и тренингов по различным
   направлениям промышленной
   разработки ПО
   Наши инструкторы – практики,
   готовые передать свою экспертизу

   http://www.luxoft.ru/edu
                                      1-128

Más contenido relacionado

Destacado

2013 09 17 архитектура веб-приложений
2013 09 17 архитектура веб-приложений2013 09 17 архитектура веб-приложений
2013 09 17 архитектура веб-приложенийYandex
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without JavaOlena Syrota
 
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!CodeFest
 
Вебинар начало
Вебинар началоВебинар начало
Вебинар началоcatarus
 
Осознанность рефакторинга: Модель принятия инженерных решений
Осознанность рефакторинга: Модель принятия инженерных решенийОсознанность рефакторинга: Модель принятия инженерных решений
Осознанность рефакторинга: Модель принятия инженерных решенийEvgeniy Krivosheev
 
Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)
Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)
Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)Matt Rutter
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Nikita Lipsky
 
Transactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsTransactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsVlad Mihalcea
 
High-Performance JDBC Voxxed Bucharest 2016
High-Performance JDBC Voxxed Bucharest 2016High-Performance JDBC Voxxed Bucharest 2016
High-Performance JDBC Voxxed Bucharest 2016Vlad Mihalcea
 
High-Performance Hibernate Devoxx France 2016
High-Performance Hibernate Devoxx France 2016High-Performance Hibernate Devoxx France 2016
High-Performance Hibernate Devoxx France 2016Vlad Mihalcea
 
Lean UX, Уровни UX, UXD процесс
Lean UX, Уровни UX, UXD процессLean UX, Уровни UX, UXD процесс
Lean UX, Уровни UX, UXD процессMitya Osadchuk
 
Сайдпроекты БВШД 2016
Сайдпроекты БВШД 2016Сайдпроекты БВШД 2016
Сайдпроекты БВШД 2016Igor Silkin
 
High Performance Hibernate JavaZone 2016
High Performance Hibernate JavaZone 2016High Performance Hibernate JavaZone 2016
High Performance Hibernate JavaZone 2016Vlad Mihalcea
 
Ярослав Шуваев – Lean ux strategy
Ярослав Шуваев – Lean ux strategyЯрослав Шуваев – Lean ux strategy
Ярослав Шуваев – Lean ux strategy404fest
 

Destacado (19)

2013 09 17 архитектура веб-приложений
2013 09 17 архитектура веб-приложений2013 09 17 архитектура веб-приложений
2013 09 17 архитектура веб-приложений
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without Java
 
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
 
Вебинар начало
Вебинар началоВебинар начало
Вебинар начало
 
Tdd Workshop Disscussions
Tdd Workshop DisscussionsTdd Workshop Disscussions
Tdd Workshop Disscussions
 
Осознанность рефакторинга: Модель принятия инженерных решений
Осознанность рефакторинга: Модель принятия инженерных решенийОсознанность рефакторинга: Модель принятия инженерных решений
Осознанность рефакторинга: Модель принятия инженерных решений
 
Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)
Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)
Бережливый стартап путеводитель (Lean Startup Roadmap, Russian)
 
Google GIN
Google GINGoogle GIN
Google GIN
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
Основы Java. 4. Web
Основы Java. 4. WebОсновы Java. 4. Web
Основы Java. 4. Web
 
Transactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsTransactions and Concurrency Control Patterns
Transactions and Concurrency Control Patterns
 
High-Performance JDBC Voxxed Bucharest 2016
High-Performance JDBC Voxxed Bucharest 2016High-Performance JDBC Voxxed Bucharest 2016
High-Performance JDBC Voxxed Bucharest 2016
 
High-Performance Hibernate Devoxx France 2016
High-Performance Hibernate Devoxx France 2016High-Performance Hibernate Devoxx France 2016
High-Performance Hibernate Devoxx France 2016
 
Design. Mobile.
Design. Mobile.Design. Mobile.
Design. Mobile.
 
Lean UX, Уровни UX, UXD процесс
Lean UX, Уровни UX, UXD процессLean UX, Уровни UX, UXD процесс
Lean UX, Уровни UX, UXD процесс
 
Сайдпроекты БВШД 2016
Сайдпроекты БВШД 2016Сайдпроекты БВШД 2016
Сайдпроекты БВШД 2016
 
High Performance Hibernate JavaZone 2016
High Performance Hibernate JavaZone 2016High Performance Hibernate JavaZone 2016
High Performance Hibernate JavaZone 2016
 
Ярослав Шуваев – Lean ux strategy
Ярослав Шуваев – Lean ux strategyЯрослав Шуваев – Lean ux strategy
Ярослав Шуваев – Lean ux strategy
 

Similar a Введение в веб каркас Struts2

Web Interface
Web InterfaceWeb Interface
Web Interfacescassau
 
Проблемы в прикладных системах: как найти и обезвредить
Проблемы в прикладных системах: как найти и обезвредитьПроблемы в прикладных системах: как найти и обезвредить
Проблемы в прикладных системах: как найти и обезвредитьКРОК
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?GetITAbroad
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Ontico
 
Oracle ADF для Java EE разработчика
Oracle ADF для Java EE разработчикаOracle ADF для Java EE разработчика
Oracle ADF для Java EE разработчикаDmitry Nefedkin
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработкиIT-Доминанта
 
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10OdessaFrontend
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCGetDev.NET
 
Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.
Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.
Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.UNETA
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в SpringUnguryan Vitaliy
 
08-170327133157.pdf
08-170327133157.pdf08-170327133157.pdf
08-170327133157.pdfssuser0562f1
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: FootprintVladimir Ivanov
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NETVitaly Baum
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектированияITCP Community
 
Oracle Application Management and Testing Suites for Siebel CRM
Oracle Application Management and Testing Suites for Siebel CRMOracle Application Management and Testing Suites for Siebel CRM
Oracle Application Management and Testing Suites for Siebel CRMАлексей Распопов
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Constantin Kichinsky
 

Similar a Введение в веб каркас Struts2 (20)

Web Interface
Web InterfaceWeb Interface
Web Interface
 
Проблемы в прикладных системах: как найти и обезвредить
Проблемы в прикладных системах: как найти и обезвредитьПроблемы в прикладных системах: как найти и обезвредить
Проблемы в прикладных системах: как найти и обезвредить
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
 
Balashov
BalashovBalashov
Balashov
 
Oracle ADF для Java EE разработчика
Oracle ADF для Java EE разработчикаOracle ADF для Java EE разработчика
Oracle ADF для Java EE разработчика
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
 
Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.
Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.
Uneta 17.04.15 Dekhtiar - Entity framework 7 and co.
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
08-170327133157.pdf
08-170327133157.pdf08-170327133157.pdf
08-170327133157.pdf
 
Symfony 3
Symfony 3Symfony 3
Symfony 3
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: Footprint
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
 
Oracle Application Management and Testing Suites for Siebel CRM
Oracle Application Management and Testing Suites for Siebel CRMOracle Application Management and Testing Suites for Siebel CRM
Oracle Application Management and Testing Suites for Siebel CRM
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!
 

Más de Evgeniy Krivosheev

Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...Evgeniy Krivosheev
 
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.Evgeniy Krivosheev
 
[Skill trek] type idioms at domain analysis
[Skill trek] type idioms at domain analysis[Skill trek] type idioms at domain analysis
[Skill trek] type idioms at domain analysisEvgeniy Krivosheev
 
[SkillTrek] Бизнес-кейсы
[SkillTrek] Бизнес-кейсы[SkillTrek] Бизнес-кейсы
[SkillTrek] Бизнес-кейсыEvgeniy Krivosheev
 
[SkillTrek] Презентация
[SkillTrek] Презентация[SkillTrek] Презентация
[SkillTrek] ПрезентацияEvgeniy Krivosheev
 
Вебинар "Введение в процесс разработки ПО"
Вебинар "Введение в процесс разработки ПО"Вебинар "Введение в процесс разработки ПО"
Вебинар "Введение в процесс разработки ПО"Evgeniy Krivosheev
 

Más de Evgeniy Krivosheev (9)

Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
 
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
 
[Skill trek] type idioms at domain analysis
[Skill trek] type idioms at domain analysis[Skill trek] type idioms at domain analysis
[Skill trek] type idioms at domain analysis
 
Design&Process Models
Design&Process ModelsDesign&Process Models
Design&Process Models
 
[SkillTrek] Бизнес-кейсы
[SkillTrek] Бизнес-кейсы[SkillTrek] Бизнес-кейсы
[SkillTrek] Бизнес-кейсы
 
[SkillTrek] Презентация
[SkillTrek] Презентация[SkillTrek] Презентация
[SkillTrek] Презентация
 
Вебинар "Введение в процесс разработки ПО"
Вебинар "Введение в процесс разработки ПО"Вебинар "Введение в процесс разработки ПО"
Вебинар "Введение в процесс разработки ПО"
 
Tdd Workbook
Tdd WorkbookTdd Workbook
Tdd Workbook
 
Design Rules And Principles
Design Rules And PrinciplesDesign Rules And Principles
Design Rules And Principles
 

Введение в веб каркас Struts2

  • 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
  • 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
  • 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
  • 36. ActionContext Содержимое контейнера ActionContext При этом есть возможность помещать в него произвольные объекты 1-36
  • 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
  • 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
  • 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
  • 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
  • 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
  • 125. Введение в Struts2 Буду рад ответить на Ваши вопросы 1-125
  • 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