Історія про те, як я робив інтернет-магазин на java
В якості передмови
Більшу частину своєї професійної кар'єри я займався розробкою бізнес-додатків на Java. Програмні продукти призначалися, як правило, для різних фінансових організацій або інших порівнянних з ними за розміром комерційних структур. Розробка велася для Enterprise Level обладнання та серверів додатки. Варто відзначити, що дуже багато java програміст працює саме в цьому секторі. Можливо Ви уявляєте, що це таке - дороге обладнання, широкий канал, швидка пам'ять, база даних Oracle та інші атрибути безбідного IT-життя. Але буває так, що умови змінюються з точністю до навпаки.
Що робити, якщо потрібно створити інтернет-додаток для маленької фірми на хостингу зі скромними ресурсами?
Кілька років тому моя сестричка відкрила магазин одягу в Нижньому Новгороді. Вони з подружкою самі розробляли моделі, закуповували тканини і шили там же, в Нижньому Новгороді.
Звичайно, не було мови про великих серверах, промислових базах даних і інших дорогих іграшках. Потрібно було зробити щось просте, спритне й недороге.
Оскільки я живу в Москві, а вона в Нижньому, потрібен був сайт, інформацію на якому вона могла б міняти без моєї участі (або з моїм мінімальним).
Мені відразу стало видно два шляхи: PHP або Java. Щоб зробити вибір, вирішив провести невеликі дослідження, так як не хотілося винаходити велосипед. Оскільки цей сегмент розробки ПО був для мене новим, я поставив Денвер, подивився на PHP-ні рішення, потім скачав різні java-based CMS-ки, поцікавився у хостерів, що вони можуть мені порадити, запитав у друзів PHP-ник.
У підсумку зробив для себе висновки:
- дешевий хостинг (в кілька разів дешевше в порівнянні з java, якщо не брати до розгляду Google App Engine.)
- безліч готових рішень для цього сегмента, як платних так і безкоштовних.
- я не знаю PHP і не хочу його вивчати
- хостинг дорожче (не враховуємо Google App Engine, це окрема пісня)
- більшість рішень великовагових, призначені для великих і товстих серверів. Навіть для Java Pet Store, все одно потрібен нормальний Application Server.
- я знаю Java досить добре, все-таки досвід роботи більше 8 років, сертифікати SCJP, SCWCD, SCEApart1. Я не вважаю себе Über-програмістом, просто при роботі саме з java я відчуваю себе комфортно і впевнено.
- бажання зробити саме на java
В силу своєї природної упертості, а можливо з небажання покидати зону комфорту, я вибрав другий шлях. Може це нерозумно і нераціонально, але дико хотілося спробувати. Не потрібні мені ці готові монстрообразность розміру CMS-ки, хотілося зробити щось зовсім просте. Зробити рішення на LAMP тільки на Tomcat 'е і Java' ой.
Завдання, як показав подальший досвід, досить проста, все зробив сам.
вибір хостингу
При всьому багатстві вибору, як виявилося, не так вже й багато альтернатив.
Варіант 1. brim.ru - найвідоміший хостинг в рунеті, що спеціалізується на java, дуже навіть непоганий.
Буде потрібно мінімальний тариф від 2112 руб / рік - 32 (!) Мб оперативної пам'яті.
Реєстрацію доменного імені можна виконати самостійно, наприклад через nic.ru (+620 руб / рік), або через хостера - тоді безкоштовно. Якщо страшно втратити домен, можете запитати потім у хостера дані по свого облікового запису у реєстратора і вивести.
Як надходити, залежить від обставин. У будь-якому випадку, потрібно буде відправити скани документа, що посвідчує особу (тобто паспорта), так що будьте до цього готові.
Зарубіжний хостинг вийде дорожче, або сильно урізаний по можливостям. Можна орендувати VPS і гратися з ним скільки душі буде завгодно, але це буде в рази дорожче і зовсім інша історія.
Варіант 2.Google App Engine (GAE) - Безкоштовно! + Реєстрація доменного GoDaddy.com (10 $)
Функціональні можливості такі ж. В добавок отримаєте різні плюшки від google, але майже скрізь є свої відмінності, особливості.
- Хочете JSTL + EL? потрібно додавати <%@ page isELIgnored="false" %>
- Своя база даних
- Своє API для роботи з картинками
- Своє API для аутентифікації інтегроване з Google-службами
Якщо перераховувати все, отримаємо цілий букет різних фішок-граблів на які доведеться наступати, якщо Ви до цього мали досвід написання веб-додатків під Java. З іншого боку, Google радує програмістів безліччю цікавого API (наприклад робота з XMMP, тобто чат). Думаю, в подальшому зроблю окремий пост про Google App Engine, в якому розповім про свій реальний досвід роботи з цією платформою.
Зараз сайт працює вже більше двох років на брімовском хостингу. Я їх сервісом цілком задоволений.
архітектура
Архітектура проста, як молоток. Є три компонента, назвемо їх умовно: Фронт. Адаменко і Сховище.
Сховище потрібно для того, щоб отримувати, зберігати і видаляти продукцію по каталогам. Іншими словами це jar-ик в якому знаходиться набір DAO (Data Access Object) для роботи з БД і набір POJO об'єктів представляють сутності (продукт, каталог і т.д.).
Фронт - сам сайт. Тут все просто. Для уявлення використовуємо JSP в зв'язці з JSTL і EL. У парі місць, де зручніше Model 2, використовуємо звичайні сервлети з форвардом на JSP-ку. Struts не потрібен, а тим більше JSF. Позаду JSP-ок з Сервлетами знаходяться класики з бізнес логікою, які лізуть в Сховище.
Адаменко дозволяє додавати, видаляти і редагувати інформацію про продукти і каталогах. Адаменко закрита від публічного доступу. Призначена для звичайного користувача. Так само, як і фронт використовує класи з Місце.
Так, звичайно, можна було своїми пустотливими рученятами лізти прямо в базу даних з JSP-ек або використовувати для цих цілей JSTL SQL теги. На жаль, такий підхід викликає у мене блювотний рефлекс і я не зміг себе пересилити. Довелося дотримати мінімальні рамки пристойності.
Збереження даних
Відразу стало питання ORM або НЕ ORM?
Звичайно можна використовувати:
- у мене є досвід роботи з цією платформою (знаю, які є підводні камені і т.д.)
- відмінно документований фреймворк
- буде жерти ресурси, а у мене всього 32 Mb, немає вже.
Взагалі хотів відразу сказати щодо Hibernate - він звичайно спрощує життя програміста, але багато хто не розуміють, що роблять, коли його використовують. Наприклад, ось мої улюблені граблі, на які багато хто постійно наступають - популярні граблі.
- Менш популярний в порівнянні з Hibernate, як наслідок - інформації менше.
- Спритніші буде, але все одно у мене адже 32 (!) Mb.
- Використовується в Google App Engine. Якщо захочеться потім зіскочити на GAE хостинг, то це буде легше, ніж зістрибувати разом з Hibernate.
iBatis - можна, але навіщо?
Загалом, щоб закрити це питання, моя думка: ORM-и зручні, коли у вас більше десятка різних класів, об'єкти яких потрібно зберігати в базі даних і з кожної робочим тижнем начальство або замовник підкидає Вам як мінімум по парочці нових, змінюючи при цьому старі. Плюс Ви не економити на hardware, а це не мій випадок. І якщо це не так, то ORM не потрібен. Якщо хочете отримати дійсно швидке та робастності додаток, то краще використовувати JDBC (!), І не вірте якщо Вам говорять, що JDBC - це архаїзм.
Особисто мене не особливо стомлює написати кілька select, insert, update, delete, раніше все так робив, і нічого, стало погано.
Ось невелика пам'ятка, що не потрібно забувати (для тих хто не знає):
- використовувати preparedstatement
- Закривати connection, statement і result set
- Використовувати connection pool (dpcp або c3p0)
- Не забути про індекси
подання
Звичайний JSP + JSTL + EL. Ось все, що потрібно насправді. JavaServerFaces - не потрібен.
Якщо Ви не маєте художніх навичок, краще не намагатися робити його самостійно. Дизайн варто брати професійний, тобто доведеться купувати. Я купив на стоці, рублів за 500. Ну не Артемій Лебедєв, згоден, але за 500 рублів піде. Все відносно адже, наприклад, перекусити в "граблі" або "Му-Му" буде коштувати приблизно таких же грошей.
Краще витратитися на дизайн, ніж зробити самому, а в підсумку буде какашка (перепрошую за вираз). Навіть якщо друзі і родичі будуть говорити "ну ніби нічого так, для першого разу піде", вони швидше за все не хочуть Вас образити.
Якщо все-таки вирішили робити самі, скористайтеся хоча б готовими палітрами кольорів, їх в інтернеті повно.
Вся справа в деталях
Деталі, в яких буває заритий собака:
Отже, сайт (інтернет-магазин одягу для вагітних). mamberry.ru
Сайт працює більше двох років. Час від часу, у міру появи вільного часу додаю всякі дрібниці.
На SEO та розкрутку гроші не витрачаємо, все-таки це маленький магазинчик, масштаб не той, та й платити гроші оптимізаторів не охота з принципу. Думаю, пройде небагато часу і свій покупець нас знайде. Наприклад, недавно несподівано для себе виявив, що за запитом в Яндексі "одяг для вагітних Львів" сайт виліз в перші рядки.
- за перший рік витрачено: хостинг 2112 руб / рік + дизайн 500 руб + Яндекс.Директ 1000 руб = 3612 руб.
- Витрачений час: в сумі вихідні і вечори, витрачені протягом року, дадуть десь місяць чистої роботи.
- Набутий досвід - безцінний.
- Щаслива сестра, для якої брат зробив інтернет-магазин.
P.S. Кому потрібна порада або хто зіткнувся зі схожою завданням - пишіть, може що підкажу 😉