В этой статье я бы хотел рассказать начинающим разработчикам, как можно с минимальными усилиями создать свою веб-платформу начального уровня.
В статье я расскажу, как практически с нуля можно, даже не владея огромным стеком технологий, развернуть на удаленном облаке свой собственный уютненький ресурс. Это может быть ваш личный блог, какой-то интересный сервис или просто ресурс о котором вы давно мечтаете. Что может быть приятнее, чем отправить другу ссылку на свой собственный ресурс и вместе обсудить какие-то интересные моменты или просто посмеяться.
Для предпринимателей или начинающих бизнесменов, или владельцев каких-либо площадок будет интересно узнать, что им в начале их бизнеса совсем не обязательно вкладывать большие деньги на «крутой» сайт, а достаточно воспользоваться открытыми библиотеками и единственное за что заплатить — это за то, чтобы взять в аренду виртуальный сервер.
В статье я покажу, как сделать простейший сайт, имеющий простую функциональность. Это скорее статья, посвященная именно тому, чтобы показать общую концепцию и помочь начинающим разработчикам сформировать понимание того, как именно создаются такие известные ресурсы, как Google, Facebook, Вконтакте.
Вы должны понимать, что все интернет-сервисы создаются по одному принципу, отличаются только детали и реализация каких-то уникальных и конкретных вещей, но суть остаётся единой.
Для тех, кто заинтересовался:
Подготовка
Установка того, что нам понадобиться:
Писать наш сервис мы будем на Java, как самом распространённом языке для веб-сервисов.
Проверьте, что на вашем компьютере установлена последняя версия Java, сейчас это 8 версия. Проверить это можно здесь проверить Java. В 97% случаях так оно и есть, но если это не так, то следуя инструкциями на этом сайте вы без труда исправите это, установив и настроив окружение.
Если же всё-таки это не удалось, сразу договоримся с вами так, первым делом вы пытаетесь решить проблему на этих сайтах:
Если даже это не помогло, то закройте эту статью, вам нужен материал для более низкого уровня подготовки.
Вообще, открою вам секрет, в программировании, когда у вас всё заработало с 1 раза — это означает только одно, что что-то не работает. Это неоспоримый факт. Куча ошибок, несовместимость версий, отсутствие в библиотеке классов и прочее — это нормальное явление.
Ваш покорный слуга сам просидел 3 недели с ошибкой, облазив такие закоулки интернета, что на какое-то время потерял связь с реальностью и пролежал несколько месяцев в психиатрической больнице, но не будем об этом… Это история для отдельной статьи.
Итак, Java стоит — всё хорошо.
Теперь нам нужен инструмент. Да, нам нужна идея. Качаем и ставим отсюда JetBrains.
Только учтите, что вам нужна именно Ultimate — версия. Простая версия не позволяет разрабатывать веб-приложения. Там есть бесплатный пробный период на 30 дней, думаю с этим не будет проблем.
Итак, среда разработки есть, Java есть.
Начнём
Запускаем идею.
В своё время я перечитал кучу статей и прочего, и решил, что в этой статье я исключу по максимуму картинки и визуальную составляющую, обычно она только отвлекает, у меня может быть другая версия, другой порядок модулей и прочее.
Часто вижу вопросы от новичков про такие интересные вещи, как Spring и Hibernate (https://spring.io/, hibernate.org). В 96% случаях вам это пока что не надо, и без хорошей подготовки и хорошего скилла «solve problem» вы увязните там очень надолго и выбраться обратно будет очень тяжело.
Ваша альма-матер на первых порах — это 2 технологии:
Вы должны иметь хотя бы общее представление об этих вещах, иначе дальше двигаться будет практически невозможно.
«Application server». Что это такое? А вот, что Application server.
Так, нам нужен этот сервер, будем использовать Tomcat . Качаем его, если скачали то, что надо, а скорее всего скачали какую-нибудь фигню, то проверьте, архив должен называться «apache-tomcat-7.0.67.zip», разархивируем. Не забудьте, куда распаковали, пригодиться он вам ещё.
Концепция веб-ресурсов
Суть такая, сервер. Что такое сервер? Это программный код, который «зацикленно» крутиться в системе и слушает порты. Это тема отдельного разговора. Но в общем, рассмотрим 2 варианта того, что вообще сервер умеет делать, он умеет отдать данные (GET) — просто вернуть число, страницу, или ещё бог знает что. Но, есть ещё и POST — он тоже возвращает данные, но и принимает от клиента их перед этим.
Если ничего не понятно, читаем тут ru.wikipedia.org/wiki/REST.
Статья начинает слишком сильно расти. Теперь буду стараться писать более кратко.
Идём в мой репозиторий. Предполагаем, что человек совершенно не понимает, что такое система контроля версий, поэтому идём путём дилетанта, там есть кнопка («Download ZIP» — качаем и разархивируем).
В окне приветствия идеи есть кнопка «import project» — жмём. Выбираем скачанный и разархивированный проект.
Жмём далее, далее и далее, пока не откроется проект.
Первые сложности
Проект открыт, но вы не запустите сервер и не сможете открыть сайт. Почему? Потому что, идея не знает, что ей делать, она умна, но не настолько.
Объяснение того, как это сделать, заняло бы пару страниц и оказало бы вам «медвежью» услугу. Первые сложности — первые трудности. Это будет вашим «боевым крещением». Программировать — не пирожки печь. Ссылки сверху вам помогут. Потратить 1-2 часа на это — это нормально. Я знаю хороших и опытных программистов, которые сидели несколько дней, но так и не сумели правильно запустить сервер. Это не делает им чести — но факт — есть факт. Вперед. Запустите — возвращайтесь к чтению.
Не забудьте сообщить идее, что используем tomcat (как? ссылки вверху, по ним есть ответ).
Локальное тестирование сервиса
Получиться у вас должно примерно вот это:
Но есть проблема — не работает! Ну что же, этого следовало ожидать. У нас не создана таблица в базе данных. В проекте мы используем базу данных SQLite
Объяснить, что это такое будет с 0 не просто. Попробуйте почитать об этом на специализированных ресурсах.
Могу посоветовать хороший сервис: www.codecademy.com (там есть Java, SQL, Git, JavaScript и другие супер полезные вещи), поэтому милости прошу.
В итоге, нам нужно создать нашу таблицу, делаем это так:
cd Path/apache-tomcat-7.0.64/bin/
sqlite3 SimpleDatabse
CREATE TABLE NAMES(
ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
NAME TEXT NOT NULL
);
Таблица создана. Можно проверить как работает наша система. Добавьте пару имён и посмотрите, как они будут вам возвращены уже из самой базы.
Разбор кода
Начнём смотреть, что же у нас в коде:
Так уж повелось, что в Java все конфигурации пишутся в xml-файлах, тут не исключение — файл web.xml контролирует, то, какой сервлет за что отвечает. Внимательно посмотрите на код и попробуйте поменять ссылку или имя сервлета.
Приложение у нас простое, поэтому у всего 2 класса (SQLiteClass и MainServlet).
Очевидно, думаю, что первый отвечает за работу с базой данных, а второй и есть наш пресловутый сервлет.
А вот и наши, упомянутые выше POST и GET запросы, эти функции являются обработчиками и задают поведение сервлета в ответ на запросы от клиента. Суть одна — данные пришли, данные ушли. Ничего сложного. Попробуйте поиграться с методами.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
protected void doPost(HttpServletRequest request, HttpServletResponse response)
Переходим к классу, реализующему JDBC:
public static void addName(String name)
public static ArrayList<String> getAllNames()
Здесь тоже всё просто, те же SQL запросы, только завёрнутые в Java-код. Небольшой совет — остерегайтесь всяких надстроек и фреймворков. Они хороши только в больших проектах, когда у вас миллионы записей, и сложные транзакционные операции. Но, настоящий контроль вы получите только, когда пишете именно вручную запрос, без таких вещей как сериализация жить намного проще (особенно поначалу).
Всё, с серверной частью закончим. Тут вам придётся посидеть, почитать специальные статьи и руководства. Без реальной практики тут никак.
Клиентская часть
Вот и пришло время взглянуть на то, что твориться у клиента в браузере. А ничего сверхъестественного. Но, скажу вам прямо, конечно всё зависит от проекта, но, клиентская часть обычно намного сложнее в реализации, чем серверная. И всё в основном из-за JavaScript-а. Очень быстро клиентский код превращается в набор «простыней», заплат, хардкода и прочих веселостей. JavaScript суров и беспощаден. На чистом нём писать очень тяжело. Поэтому мы используем JQuery. Есть куча других фреймворков и другого творения, но их касаться здесь не будем. Есть такая поговорка, что назови любое слово и это будет названием JS-фреймворка. Известен в узких кругах фреймфорк Mocha, я не представляю какие мысли посещали человека, когда он придумывал ему название, ну ладно, это было его право, конечно же.
Итак, что у нас там с клиентом?
Опять дам ссылку на отличнейший ресурс www.codecademy.com. Фронтенд там разобран очень хорошо и даёт необходимую базу для начинающих.
Тут рассмотрим только функцию
function serverConnectFunc(serverUrl, jsonData) {
$.ajax({
url: serverUrl + "/",
type: 'POST',
data: jsonData,
dataType: 'json',
async: true,
success: function (event) {
//do somehting
},
error: function (xhr, status, error) {
alert(error);
}
});
}
Что она делает? Правильно, шлёт тот самый POST — запрос и разбирает ответ. Всё просто, отдал данные и получил с сервера. По русски он говорит серверу «Дай мне имена всех, кто у тебя в базе» или «Занеси в базу это имя» и даёт ему имя.
Вот и вся клиентская часть.
Отправляем ресурс в настоящий мир
Как можно было заметить, наш сервис крутиться на локальном хосте. Другими словами на нашем же компьютере. Пришло время это исправить.
Тут я опишу лишь общий принцип сего действия. Это так или иначе потребует от вас денег на сервер, поэтому маловероятно, что кто-то действительно этим будет заниматься, особенно в самом начале своего программистского пути. Но понимать общую концепцию вы должны уже сейчас. Если кто решиться — знайте вы молодцы, вполне вероятно из вас может выйти толк.
И по традиции сразу несколько ссылок:
nginx
tomcat in real world
nginx config
SSH
Читаем, что там написано, формируем в голове общую концепцию, того, как происходит взаимодействие программиста и удаленного сервера.
Сами сервера можно приобрести на amazone. Ссылку не даю, ибо реклама, можете сами поискать, это не сложно. Есть бесплатный тестовый период. НО! Будьте предельно осторожны, ваш покорный слуга сам слышал истории, как со счетов списывались тысячи долларов без ведома хозяина, ибо система сама умеет докупать себе мощности. Не попадитесь, я сам уже платил несколько раз за непонятные услуги, там всё на английском. Если не уверены, что делаете — лучше вообще не делайте.
Порядок действий таков:
- Арендуете облако
- Подключаетесь по протоколу ssh
- Ставите нужные пакеты и настраиваете систему
- Собираете у себя war-пакет и деплоите его на сервер
- Решаете кучу ошибок и проблем
Сразу скажу, с первого раза это удалось единицам. Всегда есть что-то, что не хочет ставиться, запускаться или работать. Это нормально. Рано или поздно у вас будет красивый ip-шник вроде 74.125.224.72 и ваш сервер станет доступен в интернете. У меня ушло на это дело несколько месяцев, можно быстрее? Думаю да, попробуйте. Потом не забудьте купить себе красивый домен и передайте другу или знакомому ссылку. Если всё получилось — поздравляю, вы стали на один шаг ближе к тому, чтобы стать профессионалом.
На всякий случай я оставлю тут эти ссылки, вдруг, кто-то застопорился на каком-то моменте и решил спуститься в самый низ статьи, может помогут:
maven.apache.org
git-scm.com
Заключение
Вот мы и добрались до кульминации нашего здесь обсуждения Джавы и веб-разработки на ней. Сложно? Да. Интересно? Да. Все, абсолютно все сервисы, будь то, поисковая система с миллиардами индексов, будь то видео-сервис с миллионами стрим-каналов — всё строиться по одному принципу. Отдать — забрать данные. Понимая эту концепцию вы сможете написать любую систему, сервис или платформу.
Я не стану лукавить и обманывать вас уважаемые читатели. Вряд ли вы за 2 или 3 недели станете супер профессионалами и будете свободно писать код. Этому можно научиться только потом и долгими ночами. Чем дальше вы будете залазить в дебри, тем больше вы будете понимать, что вы так мало знаете. Дорогу осилит идущий, вперед, дерзайте.
Вперед. Пришло время действовать. Стареющим Дурову и Брину пора уйти на покой, время их славы уже прошло, пришло время обновить учебники истории и списки Forbs. И кто знает, может эту статью читает тот, кто в своё время напишет отличнейшую платформу, которая затмит собой таких гигантов как Google, Facebook и других. Удачи, спасибо, что дочитали до конца.
Комментарии (24)
nikitasius
06.01.2016 17:46apache-tomcat-7.0.67.zip
Зачем использовать 7й томкат, когда можно поставить 8й?
7й работает с java 1.6, 8й работает с java 1.7.Mugik
06.01.2016 19:12+2
Я очень боялся за то, чтобы лишний раз усложнить на первых порах ребятам настройку и поэтому указывал версии, которые сам тестировал. Но конечно, лучше всегда использовать последние версии.Borz
07.01.2016 02:41вместо зависимости «javax.servlet:servlet-api:3.0-alpha-1» лучше (если используете Tomcat) брать зависимость от конкретной версии Tomcat: bit.ly/1RtpzV2
Borz
07.01.2016 02:447-й работает с «java 1.6 и выше», а не с «java 1.6»
nikitasius
07.01.2016 15:24Ну, а что слева написано?
Я не против, что можно сидеть на старых спецификациях и старых версиях, каждый работает как хочет.
doom369
06.01.2016 18:17+2> Так, нам нужен этот сервер
Не нужен. Если речь о простом сервере, то Вам вполне подойдет HttpServer. Простой, удобный, быстрый, никаких зависимостей. На крайняк уж можно посмотреть в сторону jetty, grizzly. Tomcat, сам по себе, как application server нужен лишь для очень узкого круга задач, а то что его суют во все проекты, а это уже результат вот таких вот постов.gurinderu
06.01.2016 19:23И чем же jetty и grizzly лучше Tomcat в роли http server?
doom369
06.01.2016 19:37Ну хотя бы тем, что все можно запаковать в один джарник (упрощение деплоя, тестирования).
gurinderu
07.01.2016 00:50+1Tomcat можно тоже запаковать в один jar. Собственно говоря spring boot использует tomcat, jetty и undertow
doom369
07.01.2016 15:38Да, действительно. Только надо дополнительный плагин для сборки.
gurinderu
07.01.2016 16:04Ничего не нужно, кроме артефакта
http://search.maven.org/#artifactdetails%7Corg.apache.tomcat.embed%7Ctomcat-embed-core%7C9.0.0.M1%7Cjar
Класс org.apache.catalina.startup.Tomcat;doom369
07.01.2016 16:25Ну молодцы. Рад что они к этому пришли. Я еще начинал работать с 5-й версией томката. Тогда такого удовольствия не было =). Тут уже тогда вопрос к автору. Зачем разворачивать томкат отдельно. Если можно просто собрать джарку.
Mugik
06.01.2016 19:27С jetty я воюю уже много времени. Либо в нём что-то не так, либо со мной что-то не так. Не друзья мы с ним. Тут уже на любителя. Лучше мне кажется идти путём наименьшего сопротивления. На мой взгляд tomcat более податлив и более адекватен.
doom369
06.01.2016 19:40Это просто для примера. Томкат — это прошлое, раньше просто других решений не было.
umputun
06.01.2016 21:18+3Если уж предлагать подобный метод «нажми кнопки не понимая что делаешь» то проще делать с spring-boot. Останется такая-же магия для новичков, но хотя бы меньше писать и никаких бубнов «как мне поднять томкат в IDEA» и прочих ненужных телодвижений.
Вот тут они показывают простой и короткий пример — docs.spring.io/spring-boot/docs/current/reference/html/getting-started-first-application.html
Borz
07.01.2016 02:34Простая версия не позволяет разрабатывать веб-приложения
чёйта не позволяет-та? Просто для некоторых вещей не умеет подсказывать, превращаясь в навороченный текстовый редактор.
а про «мой репозитарий» и «качаем Tomcat» — если уж вы применили Maven, то задействуйте cargo-maven2-plugin
ruslanys
10.01.2016 17:23+1Я поддерживаю всех начинающих авторов на Хабре. И стоит отдать должное за время, потраченное на написание статьи. Надеюсь, в следующий раз у тебя получится гораздо лучше.
Что касается критики.
Во-первых, я не понял в чем преимущество этой статьи перед другими схожими по сервлетам и почему она должна быть опубликована.
Во-вторых, тема статьи не раскрыта, «Веб-платформа на Java за 30 минут» свелась к «установите Java, скачайте вот этот ZIP архив, проект готов».
В-третьих, много воды.
Ну и напоследок — грамматические ошибки, на это больно смотреть (хотя бы тот жеForbsForbes).Mugik
10.01.2016 18:59-1mruslan.com
не плохая личная страница. Полагаю на Spring Boot и MongoDb построена?
asm0dey
А почему именно sqlite? Кажется достаточно нетрадиционным выбором для Embedded БД в мире Java. Есть же derby, hsqldb и h2. А драйвера к sqlite ж два и оба имеют свои недостатки.
Mugik
Знакомство с sqlite пригодиться тем, кто начинает на Java. Рано или поздно возникнет необходимость написать что-нибудь под android. Это сэкономит много времени и позволит почувствовать себя уверенне.
asm0dey
За 7 лет промышленной разработки так ни разу и не понадобилось ничего писать под андроид. На моём нынешнем проекте этим вообще другая команда занимается. При этом я знаю, что на SQLite под андроид есть ограничения, окторых нет в обычном sqlite и в обычном sqlite есть ограничения, которых нет в нормальных БД.