Блог о программировании

Июль 19, 2010

 

История о том, как я делал интернет-магазин на Java. Linux,Tomcat,MySQL и Java (No EJB,No Spring,No

В качестве предисловия

Большую часть своей профессиональной карьеры я занимался разработкой бизнес приложений на Java. Программные продукты предназначались как правило для различных финансовых организаций  или других сопоставимых с ними по размеру коммерческих организаций. Соответственно разработка велась для Enterprise Level оборудования и серверов приложения. Стоит отметить, что очень много java-программистов работает именно в этом секторе. Возможно Вы представляете, что это такое -- дорогое оборудование, широкий канал, быстрая память, база данных Oracle  и другие атрибуты безбедной IT-жизни...  Но бывает так, что условия меняются с точностью на оборот.

Что делать, если нужно создать интернет-приложения для маленькой фирмы на хостинге со скромными ресурсами?

Начало

Несколько лет назад моя сестренка открыла магазин одежды в Нижнем Новгороде. Они с подружкой сами разрабатывали модели, закупали ткани и шили там же, в Нижнем Новгороде.

Я захотел ей как-то помочь. Мы решили, что было бы здорово, если у нее будет сайт на котором покупатели смогут просматривать каталог с их моделями и размещать заказы на доставку, плюс возможность посмотреть как доехать до их магазинчика, информация для оптовиков, объявления о распродажах и другие полезные мелочи.  По сути нужен был простой интернет магазин для маленькой фирмы.

Конечно не было речи о больших серверах, промышленных базах данных и других дорогих игрушках. Нужно было сделать что-то простое, шустрое и не дорогое.

Поскольку я живу в Москве, а она в Нижнем, нужен был сайт, который она могла бы менять без моего участия (или с моим минимальным).

Мне сразу стало видно два пути:  PHP или Java. Чтобы сделать выбор, решил провести небольшие исследования, так как не хотелось изобретать велосипед. Так как этот сегмент разработки ПО был для меня новым, я поставил денвер, посмотрел на PHP-ные решения, потом скачал разные java-based CMS-ки, поинтересовался у хостеров, что они могут мне посоветовать, спросил у друзей PHP-ников.

В итоге сделал для себя вывод:

PHP

плюсы:

  • дешевый хостинг (в несколько раз дешевле по сравнению с java, если не брать в рассмотрение Google App Engine...)
  • множество готовых решений для этого сегмента, как платных так и бесплатных.

минусы:

  • я не знаю PHP и не хочу его изучать

Java

минусы:

  • хостинг дороже (не учитываем 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, в котором расскажу о своем реальном опыте работы с этой платформой.

Что касается меня, то у меня выбора не было, поскольку Google App Engine для Java выпустили только летом 2009 г и к этому времени я уже всё сделал.

Сейчас сайт работает уже больше двух лет на бримовском хостинге.  Я их сервисом вполне доволен.

Идем дальше...

Архитектура

Архитектура простая как молоток. Есть три компонента, назовем их условно:  Фронт, Админка и Хранилище.

Хранилище нужно для того чтобы получать, сохранять и удалять продукцию по каталогам. Другими словами это jar-ик в котором находится набор DAO (Data Access Object) для работы с БД и набор POJO объектов представляющих сущности (продукт, каталог и т.д.) .

Фронт - сам сайт. Тут все просто. Для представления используем JSP в связке с JSTL и EL. В паре мест, где удобней Model 2, используем обычные сервлеты с форвардом на JSP-ку. Struts не нужен, а тем более JSF.  Позади JSP-ок с сервлетами находятся классики с бизнес логикой, которые лезут в Хранилище.

Админка позволяет добавлять,удалять и редактировать информацию о продуктах и каталогах. Админка закрыта от публичного доступа. Админка предназначена для обычного пользователя. Админка также как и фронт используют классы из Хранилище.

Да, конечно можно было своими шаловливыми ручонками лезть прямо в базу данных из JSP-ек или использовать для этих целей JSTL SQL тэги. К сожалению, такой подход вызывает у меня рвотный рефлекс и я не смог себя пересилить. Пришлось соблюсти минимальные рамки приличия.

Хранение данных

Сразу стал вопрос ORM или не ORM?

Конечно можно использовать:

Нibernate

плюсы:

  • у меня есть опыт работы с этой платформой (знаю какие есть подводные камни и т.д..)
  • отлично документированный фреймворк

минусы:

  • будет жрать ресурсы,а у меня всего 32 Mb, нет уж...

Вообще хотел сразу сказать относительно Hibernate, он конечно упрощает жизнь программиста, но многие не соображают что делают, когда его используют. Например вот мои любимые грабли на которые многие постоянно наступают - популярные грабли.

DataNucleus

Минусы:

  • Менее популярный по сравнению с 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 - нафиг не нужен.

    Сейчас 21 век на дворе, так что если хотите чтобы было красиво, то используйте jQuery или другие javascript-овые библиотеки.

    Дизайн

    Дизайн стоит брать профессиональный, т.е. придется покупать. Я купил на стоке, рублей за 500. Ну не Артемий Лебедев, согласен, но за 500 рублей пойдет.  Всё относительно ведь, например перекусить в Граблях или Му-Му будет стоить приблизительно таких же денег.

    Лучше потратиться на дизайн, чем сделать самому, а в итоге будет какашка (извиняюсь за выражение). Даже если друзья и родственники будут говорить "ну вроде ничего так, для первого раза пойдет", они скорее всего не хотят Вас обидеть ... .

    Если все таки решили делать сами, воспользуйтесь хотя бы готовыми палитрами цветов, их в интернет полно.

    Всё дело в деталях

    Детали, в которых бывает зарыта собака:

    • Структура и сборка проекта :  maven (это скорее профессиональная привычка)
    • Редактор текстовых полей в админке:   jwysiwick
    • Оформление заказа. Нотификация по эл. почте. Обычный JavaMail
    • Ведение логов. Log4j через Slf4j (тоже профессиональная привычка)
    • Информация о расположении магазина на карте. Использую Яндекс.Карты. Нужно зарегистрировать и получить ключи в Яндексе.
    • Счетчик посещений. Использую Яндекс.Метрика. Делаете JSP-ку, которую инклудите в свой хедер или футер (ну или как душа пожелает...)
    • Реклама. Сервис предназначен для русскоязычной аудитории, пробовали рекламу от Яндекс.Директа. Где-то по 1000 руб на кампанию.
      Первая рекламная кампания прошла  неплохо. Сестра звонила, говорила, что в магазин стали постоянно приходить покупатели, которые нашли магазин через интернет.
      Вторую кампанию провел летом, на фоне сильного сезонного спада, так что количество покупателей было не много.
      Думаю следующую кампанию провести ближе к осени.
    • Почта.  Как правило, каждая компания хочет чтобы у ее сотрудников были электронный адрес похожие на ivan@company.ru , а не vanya_1977@yandex.ru.
      Как вариант, стоит попробовать сделать интеграцию с Google Apps. Это бесплатно. Получаете нормальный доступ к своей фирменной почте и с веб-интерфейсом похожим на GMail. Очень удобно. Нужно зарегистрироваться на Google Apps. Затем нужно написать письмо с просьбой админу в brim.ru, он подправляет нужные записи в DNS-серваке.

    Итак сайт (интернет магазин одежды для беременных) : mamberry.ru

    Итог

    Сайт работает больше двух лет. Время от времени, по мере появления свободного времени добавляю всякие мелочи.
    На SEO и раскрутку деньги не тратим, все-таки это маленький магазинчик, масштаб не тот, да и платить деньги оптимизаторам не охота из принципа.  Думаю пройдет немного временем и свой покупатель нас найдет. Например, недавно неожиданно для себя обнаружил, что по запросу в яндексе: одежда для беременных Нижний Новгород сайт вылез в первые строчки.

    В сумме:

    Минусы

    • за первый год потрачено: хостинг 2112 руб/год + дизайн 500 руб + яндекс.директ 1000 руб =3612 руб.
    • Потраченное время, в сумме  выходные  и вечера потраченные в течение года дадут где-то месяц чистой работы.

    Плюсы

    • Приобретенный опыт - бесценен.
    • Счастливая сестра, для которой брат сделал интернет магазин.

    P.S. Кому нужен совет или кто столкнулся с похожей задачей -- пишите, может что подскажу

    Java на habrahabr

    Июль 8, 2010

     

    JAVA / [Ссылка] Имитируем алгебраические типы данных в языке Java

    К сожалению, язык программирования Java не поддерживает такое красивое понятие, как алгебраические типы данных. В статье на примере описания бинарного дерева объясняется, что такое АТД, кодировка Черча и как можно использовать данные понятия, чтобы улучшить читабельность кода, написанного на языке Java.

    Копилка опыта

    Апрель 24, 2010

     

    Синонимайзер (Java)

    В последнее время я всё больше стал интересоваться Java. В частности её библиотекой для создания графического интерфейса - Swing. Я не стану распространяться о преимуществах этих технологий, в интернете и так полно соответствующей информации. Следуя тематике блога я буду продолжать делиться с вами получаемым опытом. Ранее я показывал вам пример синонимайзера реализованного на PyQt4. Довольно [...]

     
    << < 3 из 3 > >>