Розробка веб-додатку на основі Java EE JSP Hibernate Maven Spring MVC в NetBeans
Вступ
Це буде серія статей, які допомагають розробникам-початківцям Java в їх нелегкому шляху. Покажу приклад створення інтернет-магазину. Перше що вам знадобиться - це NetBeans 7.3. Завантажити можна тут. Чому саме він? Думаю для початківців у ЇЇ – це ідеальний варіант.
Використовувані технології: 1) NetBeans 7.3; 2) Maven; 3) Hibernate; 4) Spring MVC; 5) JSP+JSTL; 6) Знання про Сервлети, Сесії, JavaBean, XML і т.д.; 7) HTML+CSS (трохи краси на Ваш смак, але краще заплатити лівим людям, — у Вас із серверною стороною отже клопоту вистачить); 8) Java SE (знання колекцій, вміння обробляти винятки… Загалом стандартний набір); 9) Знання патернів проектування (DAO, Factory); 10) JPA; 11) SVN; 12) SQL (для написання скриптів, що заповнюють наші БД).
Почнемо з того, де ми зберігатимемо наш код і як обмінюватимемося їм з друзями. Думаю, не всі початківці знають про репозиторії, і ця частина для них.
Є таке поняття, як репозиторій – віддалений сервер зберігання коду. Якщо Вам дадуть тестове завдання, і Ви надішлете його архівом, то Вас швидше за все теж пошлють. Може, не надішлють, але точно розчаруються у Вас. Існують різні репозиторії CVS, SVN, Git. Для початківців я вважаю оптимальним SVN. Ну а Вам головне не знати, що це, а вміти застосовувати. Поки достатньо буде й цього, решта прийде із досвідом.
Отже, є сайт www.assembla.com/ - Вам потрібно там зареєструватися. Після реєстрації слід створити на цьому сайті відкритий репозиторій на стартовій сторінці. Після реєстрації буде. Створити свій власний простір.
Отже, якщо нам потрібно з кимосьподілитися кодом, показати його комусь, - ми тепер озброєні гарним інструментом для цього.
Ви вже завантажили NetBeans, погралися з SVN - тепер перейдемо до справи. Створюєте проект. Натискаєте "Створити проект", там вибираєте Maven-> Веб-додаток. Називаєте, як хочете, це все Ваша фантазія. Отже, у нас є веб-додаток, складання нашого проекту йде мавеном, у нас є мета і тепер настав час подумати над тим, як її здійснити. Тобто Ви, як розробник, повинні подумати над тим, як виглядатиме Ваша програма, яку матиме архітектуру, дерево пакетів і так далі. Загальна кількість рядків коду тут близько 4000 і краще подбати про красиву архітектуру заздалегідь, інакше потім Ви просто не розумітимете що де і як у Вас працює, яким дивом Ви, наприклад, виводите останню куплену річ, як вважаєте загальну суму покупок. І якщо Вас потім попросять щось доробити або додати — Ви усвідомлюєте, що простіше написати все з нуля.
Ну і звичайно, нам потрібно прикинути наш план дій.
Отже: План дій
1) описуємо entity(entities) - сутності. Це POJO – клас, пов'язаний із БД за допомогою анотації (@Entity) або через XML. Використовуватимемо JPA, тому імпортувати треба javax.persistence.* Чому не Hibernate Persistence API, оскільки якщо використовувати його і потім ми захочемо змінити ORM бібліотеку, доведеться переписувати і наші класи, а JPA - це стандарт від Sun. З приводу того, що таке JPA — ну для Вас можу своїми словами сказати так: це бібліотека, що надає API для роботи з об'єктами, що довго живуть, тобто дозволяє нам зручно зберігати наші об'єкти в БД. Можу дати пораду: створіть для цього окремий пакет назвіть його entity або domain — як хочете, головне, щоб Вам було зрозуміло. Зрештою це може виглядатитак: edu.shop.model.domain.Customer.java edu.shop.model.domain.Notebook.java. Докладніше описуватиму безпосередньо при розгляді даного пункту. Наразі завдання варто прикинути план дій.
2) Створюємо HibernateUtil (взагалі суфікс або приставка Util має на увазі, що код у цьому класі є універсальним і використовується безліччю класів). Отже, в HibernateUtil ми розміщуємо SessionFactory. Він великоваговий. Цей код, за ідеєю, має бути незалежним від усього додатка, оскільки він встановлює з'єднання з базою даних при старті і повинен нам давати тільки Сесії з базою даних. Ще ми в цьому класі реєструємо наші класи-сутності. Докладніше про цей клас розповім пізніше. Засунемо його теж в окремий пакет, наприклад, edu.shop.model.hbutil.HibernateUtil.java
3) Пишемо DAO. Що в ньому писати? Пишемо те, що ми хочемо отримати від бази даних, але нам не потрібно думати, як вийшли ці дані, важливий результат. Наприклад, ми визначаємо інтерфейс ProductDAO і пишемо у ньому методи List> getAllProducts(); Потім пишемо його реалізацію ProductDAOImpl.
У чому ідея? Якби цей додаток писав я і Ви, Ви б сказали: «Миха, мені потрібні від БД такі дані: всі товари, що у мене є в БД». Я відповідаю: не питання. І далі наступний розвиток подій: ви у своєму коді, скрізь де потрібно робити запити до бази, пишете наступне%
*тут звернення до методу*.getAllProducts(); — і бачите, що компілятор не свариться, а реалізацію цього інтерфейсу я ще міг не встигнути написати. І який результат? У Вас все скомпіло, а робочого коду навіть немає. Тут ми застосуємо Enums і патерн Factory, і ще дещо, але усьому свій час. Саме в DAO потрібно приділити особливу увагу обробці винятків, хоча б генерувати сторінки помилок. Щоб Ви швидко знаходилишматок непрацюючого коду. Інакше Ви просто замучитеся з налагодженням.
4) Тут у нас будуть допоміжні класи, що додають усілякі смакоти в наш проект: підрахунок загальної суми покупок; остання куплена річ; допоміжні змінні, які стануть у нагоді нам для роботи методу, який, наприклад, виводитиме нам з БД речі не дорожчі за 5000 грн, або не дешевше за 500; виведення всіх ноутбуків марки Асус. Цей пункт тісно взаємопов'язаний із попереднім.
Поки що зупинимося на цьому. З рештою розберемося трохи згодом. Отже, ми маємо намічений план, приступимо до його реалізації.
Ми створили наш проект та створили наш пакет із сутностями. Нехай буде edu.shop.entity. Там ми створюємо такі класи:
Примітка. Кошик, в якому зберігатимуться наші куплені товари, буде як таблиця в БД, це я зробив тому що на ній покажу деякі основи роботи з БД. Для реального випадку доцільніше використовуватиме колекції для зберігання наших товарів.
1) Product 2) Notebook 3) Camera 4) Book 5) Cable 6) Customer 7) Cart
Поговоримо трохи про те, що таке клас-сутність. Entity (Сутність) - POJO-клас, пов'язаний з БД за допомогою анотації (@Entity) або через XML. До такого класу пред'являються такі вимоги:
- повинен мати порожній конструктор (public або protected); — Не може бути вкладеним, інтерфейсом чи enum; — Не може бути final і не може містити final-полів/властивостей; — Має містити хоча б одне @Id-поле.
При цьому entity може:
- утримувати непусті конструктори; - успадковуватися і бути успадкованим; — Утримувати інші методи та реалізовувати інтерфейси.
Entities можуть бути пов'язані один з одним: один-до-одного, один-до-багатьом, багато-до-одного і багато-до-багатьом.
Використовувати ми будемо інструкції. І тут одразу у нас з'являється можливість описати двома способами. Або ми будемо писати інструкції безпосередньо над полями, або над гетерами. Скажу одне: правильно писати над гетерами, а причину Ви запитаєте у кути. Не можу я всі теми тут абсолютно описати.
Є ще одне, що хочу сказати. Для цього доведеться показати 2 приклади опису класу сутності. Отже, перший приклад: Коментарі до нього я написав у самому коді:
Другий спосіб: пишемо над гетерами. Пояснення дивимось у коді.
Тепер наведемо приклад нашого HibernateUtil
Приступимо до наступної частини. Що таке DAO | Це шаблон проектування.
Його зміст: - Весь доступ до бази даних у системі здійснюється через DAO для інкапсуляції. — Кожен екземпляр DAO відповідає за один первинний доменний об'єкт чи сутність. Якщо доменний об'єкт має незалежний цикл життя, він повинен мати власний DAO. — DAO відповідає за операції створення, читання (за первинним ключем), оновлення та видалення (тобто CRUD (create, read, update, delete)) доменного об'єкта. — DAO може дозволяти запити, засновані на критерії, відмінному від первинного ключа. Я посилаюся на такі методи, як finder або finders. Метод finder зазвичай повертає колекцію доменних об'єктів, які відповідає DAO. - DAO не займається обробкою транзакцій, сесій або з'єднань. Це робиться поза DAO для забезпечення гнучкості. Докладніше завжди розповість гугл.
Реалізація нашого інтерфейсу. Пояснення дивимося у коді
Отже, тепер ми маємо можливість отримувати дані з БД. Ви можете, використовуючи скриплети, створити нехитрий цикл for-each та вивести свою продукцію на вашу сторінку index.jsp
Але це спочатку, а взагалі так робити погано. Цепорушує наш патерн MVC. Як зробити правильно я поясню у наступному уроці, якщо мені дадуть інвайт. У другому уроці ми займемося Spring, у третьому торкнемося патерна Factory, і заглибимося в хібернейт. Для особливо нетерплячих, покажу як треба видаляти з БД, зберігати в БД і повністю видаляти всі з БД. Ну, а як зробити, щоб усе це взаємодіяло загалом із нашим додатком та докладний розгляд залишимо на потім.
Зберегти у БД
Видалити з бази id
Видалення з бази групи id.
Також Вам потрібен файл налаштування Hibernate. Створіть у Derby БД shop. Ім'я та пароль користувача root та pass відповідно. Якщо не вийде - не засмучуйтесь - я приділю ще цього часу.
Про те, як заповнювати наші БД, поговоримо пізніше. Ви можете заповнити їх вручну. Або дочекатися наступного уроку.
Хардкорна конфа за С++. Ми запрошуємо лише профі.