Skip to content

1. Вступ

PDF цього документа доступний за посиланням |TYT|.

Приклади з документа доступні за посиланням |TYT|.

У цій статті ми пропонуємо ознайомити вас із важливими поняттями Struts 2 на прикладах. Struts 2 — це веб-фреймворк, який надає:

  • певну кількість бібліотек у вигляді JAR-файлів
  • середовище розробки: Struts 2 впливає на спосіб розробки веб-додатків.

Для розуміння прикладів необхідні такі попередні знання:

  • базові знання мови Java
  • базові знання у сфері веб-розробки, зокрема мови HTML.

На сайті [http://developpez.com] можна знайти всі необхідні ресурси для виконання цих вимог. Деякі з них я написав сам, і їх можна знайти на сайті [https://stahe.github.io].

Приклади з цього документа доступні на сайтах URL та [http://tahe.developpez.com/java/struts2].

Для більш глибокого вивчення Struts 2 можна скористатися такими джерелами:

  • [ref1]: документація Struts 2, яку можна знайти на сайті Struts
  • [ref2]: книга «Struts 2 in Action», автори — Дональд Браун, Чад Майкл Девіс та Скотт Станлік, видавництво Manning. Ця книга має високу навчальну цінність.

Іноді ми будемо посилатися на [ref2], щоб вказати читачеві, що за допомогою цієї книги він може глибше вивчити певну тему.

Цей документ написано таким чином, щоб його можна було читати навіть без комп’ютера під рукою. Тому ми наводимо багато знімків екрана.

1.1. Місце Struts 2 у веб-додатку

Насамперед визначимо місце Struts 2 у розробці веб-додатку. Найчастіше такий додаток будується на багатошаровій архітектурі, наприклад, такій:

  • шар [web] — це шар, що взаємодіє з користувачем веб-додатка. Користувач взаємодіє з веб-додатком через веб-сторінки, що відображаються у браузері. Саме в цьому шарі, і лише в ньому, розташований Struts 2.
  • Рівень [metier] реалізує правила управління додатком, такі як розрахунок заробітної плати або рахунку-фактури. Цей рівень використовує дані, що надходять від користувача через рівень [web], та з СУБД через рівень [dao].
  • Рівень [dao] (Data Access Objects), рівень [jpa] (Java Persistence API) та драйвер JDBC керують доступом до даних СГБД. Рівень [jpa] виконує функцію ORM (Object Relational Mapper). Він слугує мостом між об’єктами, що обробляються рівнем [dao], та рядками й стовпцями даних реляційної бази даних.
  • Інтеграцію шарів можна здійснити за допомогою контейнера Spring або EJB3 (Enterprise Java Bean).

У більшості прикладів, наведених далі, буде використовуватися лише один рівень — рівень [web]:

Проте цей документ завершиться створенням багатошарового веб-додатку:

Набір шарів [metier], [dao], [jpa/hibernate] буде надано нам у вигляді архіву jar, щоб нам знову залишилося створити лише шар [web].

1.2. Модель розробки MVC у Struts 2

Struts 2 реалізує архітектурну модель, відому як MVC (Модель – Представлення – Контролер), наступним чином:

Обробка запиту клієнта відбувається наступним чином:

Запитані URL мають вигляд http://machine:port/contexte/rep1/rep2/.../Action.. Шлях [/rep1/rep2/.../Action] повинен відповідати дії, визначеній у конфігураційному файлі Struts 2, інакше він відхиляється. Дія визначається у XML-файлі у такому вигляді:

1
2
3
4
5
6
<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="page1">/vues/Page1.JSP</result>
      <result name="page2">/vues/Page2.JSP</result>
    </action>
</package>

У наведеному вище прикладі припустимо, що надходить запит URL або [ http://machine:port/contexte/actions/Action1]. У цьому випадку виконуються такі кроки:

  1. запит — браузер-клієнт надсилає запит до контролера [FilterDispatcher]. Цей контролер обробляє всі запити клієнтів. Це вхідні ворота додатка. Це літера «C» у MVC.

  2. Обробка

    • контролер C звертається до свого файлу конфігурації та виявляє, що дія actions/Action1 існує. namespace (рядок 1), об’єднаний з назвою дії (атрибут name з рядка 2), визначає дію actions/Action1.
    • контролер C створює екземпляр [2a] класу типу [actions.Action1] (атрибут class у рядку 2). Ім’я та пакет цього класу можуть бути будь-якими.
    • якщо запит на URL супроводжується параметрами типу [param1=val1&param2=val2&...], то контролер C присвоює ці параметри класу [actions.Action1] наступним чином:
[actions.Action1].setParami(valeuri) ;

Отже, клас [actions.Action1] повинен мати ці методи setParami для кожного з очікуваних параметрів parami.

  • (продовження)
    • контролер C викликає метод підпису [String execute()] класу [actions.Action1]. Цей метод може використовувати параметри parami, які клас отримав. Під час обробки запиту користувача їй можуть знадобитися рівні [metier] та [2b]. Після обробки запиту клієнта цей метод може викликати різні відповіді. Класичним прикладом є:
      • сторінка з повідомленням про помилку, якщо запит не вдалося обробити належним чином
      • сторінка підтвердження в іншому випадку

Метод execute повертає контролеру C результат у вигляді символьного рядка, який називається ключем навігації. У наведеному вище прикладі це [actions.Action1].execute може генерувати два ключі навігації: «page1» (рядок 3) та «page2» (рядок 4). Метод [actions.Action1].execute також оновить шаблон M [2c], який буде використовуватися сторінкою JSP, що буде надіслана користувачеві у відповідь. Цей шаблон може містити елементи:

  • (продовження)
    • класу [actions.Action1], інстанційованого
    • сесії користувача
    • даних області дії Application
  1. відповідь — контролер C запитує сторінку JSP, що відповідає ключу навігації, для відображення [3]. Це представлення, V, MVC. Сторінка JSP використовує шаблон M для ініціалізації динамічних частин відповіді, яку вона має надіслати клієнту.

Тепер уточнимо зв’язок між веб-архітектурою MVC та багатошаровою архітектурою. Насправді це дві різні концепції, які іноді плутають. Розглянемо одношаровий веб-додаток на базі Struts 2:

Якщо ми реалізуємо шар [web] за допомогою Struts 2, ми отримаємо веб-архітектуру MVC, але не багаторівневу архітектуру. У цьому випадку шар [web] відповідатиме за все: представлення, бізнес-логіку та доступ до даних. У Struts 2 цю роботу виконуватимуть класи типу [Action].

Тепер розглянемо багаторівневу веб-архітектуру:

Рівень [web] можна реалізувати без використання фреймворку та без дотримання моделі MVC. У цьому випадку ми маємо багаторівневу архітектуру, але веб-рівень не реалізує модель MVC.

У MVC ми зазначили, що модель M відповідає представленню V, c.a.d — сукупності даних, що відображаються представленням V. Іноді (часто) наводиться інше визначення моделі M з MVC:

Багато авторів вважають, що те, що знаходиться праворуч від шару [web], утворює модель M шару MVC. Щоб уникнути двозначностей, можна говорити про:

  • моделі домену, коли мається на увазі все, що знаходиться праворуч від шару [présentation]
  • моделі подання, коли дані, що відображаються поданням V, позначаються

Надалі термін «модель M» позначатиме виключно модель подання V.

1.3. Використані інструменти

Далі ми використовуємо (грудень 2011 р.)

  • IDE NetBeans 7.01, доступний за посиланням URL [http://www.netbeans.org]
  • плагін Struts 2 для NetBeans 7.01, доступний за посиланням URL [http://plugins.netbeans.org/plugin/39218]
  • версія 2.2.3 Struts 2 доступна за посиланням URL [http://struts.apache.org/]

Слід зазначити, що для розробки наведених нижче прикладів необхідні лише бібліотеки Struts 2, які можна завантажити за посиланнями URL та [http://struts.apache.org/]. NetBeans можна замінити іншим IDE (Eclipse, JDeveloper, IntelliJ тощо), а плагін Struts 2 призначений лише для полегшення роботи розробника. Він також не є обов’язковим.

1.3.1. IDE NetBeans

На сайті завантаження NetBeans ми обираємо версію Java EE:

Image

1.3.2. Плагін Struts 2

Залежно від версій NetBeans цей плагін не завжди був доступний. У грудні 2011 року його можна знайти за посиланням URL [http://plugins.netbeans.org]. Цей URL дозволяє ознайомитися з різними плагінами, доступними для NetBeans. Можна відфільтрувати результати пошуку. У [1] можна знайти плагіни, у назві яких міститься слово «struts».

  • переходимо за посиланням [2]

Завантажуємо плагін і розпаковуємо його [2]. Щоб інтегрувати його в NetBeans, можна вчинити так:

  • запускаємо NetBeans
  • у [1] виберіть меню Tools/Plugins
  • на вкладці [2] натисніть кнопку [3]
  • у [4] вибрати файли .nbm завантажених плагінів. Тут ми вибираємо бібліотеки Struts версії 2.2.3 замість Struts 2.0.14
  • повернувшись на вкладку [2], встановлюємо вибрані плагіни за допомогою кнопки [5].

Встановлення плагінів часто вимагає перезапуску NetBeans.

1.3.3. Бібліотеки Struts 2

Якщо ви завантажили плагін Struts 2 для NetBeans, у вас є основні бібліотеки Struts, але не всі. Далі нам знадобляться деякі бібліотеки, доступні на сайті Struts 2 [http://struts.apache.org/].

Переходимо за посиланням [1], а потім за посиланням [2], щоб завантажити zip-файл дистрибутива версії 2.2.3.1. Після розпакування дистрибутива бібліотеки, необхідні для Struts, знаходяться у папці [lib] [3] дистрибутива. Їх там кілька десятків, і виникає питання, які з них є обов’язковими. Саме тут нам допоможе плагін Struts.