Как написать сайт на java
Перейти к содержимому

Как написать сайт на java

  • автор:

Уроки Java Spring Boot

Уроки Java Spring Boot / #1 - Создание веб-сайта на Java

Уроки Java Spring Boot / #1 — Создание веб-сайта на Java

Представляем вам большой курс по изучению технологии Spring Boot MVC. В ходе курса вы научитесь работать с фреймворком Spring и на его основе создадите небольшой веб блог. Вы научитесь работать с базами данных, шаблонами и общим построением сайтов на основе языка Java.

Видеоурок

Полезные ссылки:

  • Официальный сайт IntelliJ IDEA ;
  • Официальный сайт Spring ;
  • Конструктор проекта на Spring.
Информация про Java Spring Boot

Платформа Java Spring Boot была впервые выпущена в 2004 году. С тех пор платформа постоянно обновляется и пополняется новыми функциями. На сегодняшний день платформа является наиболее продвинутым фреймворком для создания веб сайтов на основе языка Java.

C первых дней выпуска Spring был тепло встречен разработчиками Java, так как это был первый достойный конкурент технологии JavaBeans . JavaBeans, как и Spring, предоставляют набор различных решений для реализации веб проектов.

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

Spring содержит хорошо описанную документацию, а также множество готовых решений, что можно копировать и использовать в своих проектах.

Технология MVC

Spring реализует шаблон проектирования MVC. MVC расшифровывается как «model-view-controller» или же модель вид контроллер. Данный шаблон позволяет структурировать все файлы внутри проекта и делает чтобы каждый файл отвечал лишь за свою часть работы.

Рассмотрим простой запрос к веб сайту, написанному на Spring Boot. Когда пользователь переходит на какую-либо страницу сайта, то переход отслеживается в контроллере. Контроллер понимает по какому URL адресу перешёл пользователь и далее обращается к модели. Модели могут обратиться к базе данных, получить оттуда какие-то значение, выполнить различные вычисления и далее вернуть эти данные обратно в контроллер. Далее контроллер передает все данные в шаблон, который как раз и показывается пользователю. Шаблон в свою очередь представляет из себя простую HTML страницу с различными текстами, кнопками, картинками и прочим.

Таким образом, приложение делиться на три части, каждая из которых выполняет свою роль в проекте.

Создание проекта

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

В случае использования сервиса Start Spring.io вы можете выбрать нужные для вас пакеты, после чего нажать на клавишу «Generate» для генерации и скачивания архивного проекта.

Чтобы открыть проект вы можете воспользоваться любой средой разработки, к примеру программой IntelliJ IDEA .

План курса

В ходе курса мы научимся писать сайты с использованием Java Spring Boot MVC. Мы рассмотрим все основные моменты при работе с данным фреймворком. За курс мы создадим множество шаблонов, рассмотрим работу с шаблонизаторами, рассмотрим работу с базой данных, а также создадим небольшой полноценный проект по типу веб-блога.

К концу курса у вас будет достаточно знаний чтобы начать разрабатывать сайты на основе Java Spring.

Перед изучением курса вам необходимо ознакомиться с языками для вёрстки сайта: HTML , CSS и JavaScript . Также вам необходимо обладать навыками работы с языком Java прежде чем изучать платформу Спринг. Все дополнительные курсы можно посмотреть на нашем ресурсе.

Как написать сайт на java

Код Java , написанный на одной платформе ( то есть операционной системе ), можно запустить без изменений на других платформах.

Для запуска Java используется виртуальная машина Java ( Java Virtual Machine, JVM ). JVM обрабатывает байтовый код, после чего процессор обрабатывает код, полученный от JVM . Все виртуальные машины работают аналогично, поэтому один и тот же код работает одинаково во всех операционных системах, что и делает Java межплатформенным языком программирования.

Объектно-ориентированный язык программирования

Существуют различные стили программирования, и один из самых популярных — объектно-ориентированное программирование. При таком подходе сложная проблема разбивается на более мелкие путём создания объектов. Благодаря чему код можно использовать повторно.

Объектно-ориентированные функции есть во многих языках программирования, включая Java , Python и C++ . Если вы серьёзно настроены освоить программирование, объектно-ориентированный подход стоит включить в план своего обучения.

Java работает быстро

Ранние версии языка программирования Java часто критиковали за медленную работу. Но сегодня ситуация кардинально поменялась. Новые версии JVM работают значительно быстрее, а интерпретирующие их процессоры становятся всё шустрее.

Сегодня Java — один из самых быстрых языков программирования. Хорошо оптимизированный Java-код работает почти так же быстро как низкоуровневые языки программирования, такие как C/C++ и намного быстрее, чем Python , PHP и т.д.

Java — безопасная платформа

Java представляет собой :

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

Обширная базовая библиотека

Одна из причин широкого распространения Java — огромная стандартная библиотека. В ней можно найти сотни классов и методов из различных пакетов, облегчающих жизнь разработчикам. К примеру,

java.lang – это продвинутые функции для строк, массивов и т.д.

java.util – библиотека для работы со структурами данных, регулярными выражениями, датой и временем и т.д.

kava.io — библиотека для ввода/вывода файлов, обработки исключений и т.д.

Применение платформы Java

Перед обучением Java программированию с нуля , нужно знать, что на это платформе работает более 3 миллиардов устройств по всему миру. Для чего конкретно можно её применить:

  1. Приложения для Android — для разработки Android-приложений язык программирования Java часто используется в сочетании с Android SDK ( от английского software development kit — комплект разработки программного обеспечения ).
  2. Веб-приложения — Java используется для создания сетевых приложений с помощью серверных программ, фреймворка Struts и JSP . Вот некоторые популярные веб-приложения, написанные на Java: Google.com , Facebook.com , eBay.com , LinkedIn.com .

Стоит отметить, что эти сайты не обязательно написаны исключительно на Java , и могут использовать и другие языки программирования.

  1. Разработка программного обеспечения – на Java написаны такие программы как Eclipse , OpenOffice , Vuze , MATLAB и многие другие.
  2. Обработка Big Data – для обработки « больших данных » можно воспользоваться фреймворком Hadoop , написанным на Java .
  3. Трейдинговые системы – используя платформу Oracle Extreme Java Trading Platform , можно писать программы для трейдинга.
  4. Встраиваемые устройства – на основе технологии Java Embedded от Oracle сегодня работают миллиарды устройств, таких как телевизоры, SIM-карты , проигрыватели Blu-ray и т.д.

Также программирование на Java используется для разработки игр, научных приложений ( к примеру, для обработки естественного языка ) и во многих других областях.

Веб-приложение на Java

Веб-приложение на Java - 1

Когда-то Java укрепил свои позиции благодаря тому, что выбрал приоритетным направлением веб-приложения. С первых дней Java пытался найти свой путь. Сначала — предложил апплеты. Это предоставило много возможностей разработчикам по созданию динамического контента (содержимого) на статических HTML страницах. Однако апплеты не оправдали ожиданий по многим причинам: безопасность, накладные расходы и другие. Тогда разработчики языка Java предложили альтернативу — Servlet API. И это оказалось правильным решением. Servlet API — это спецификация, на которой построено любое веб-приложение на Java, будь то приложение с веб-интерфейсом или веб-сервис, который возвращает информацию согласно запросу. Поэтому путь к пониманию работы веб-приложений на Java начинается с понимания Servlet API.

Веб-приложение на Java - 2

Servlet API

Итак, Servlet API — это то, что предложили разработчики языка Java-разработчикам. Servlet API — это спецификация, которая должна отвечать на основные наши вопросы. Найти ее можно тут: «JSR-000340 JavaTM Servlet 3.1 Final Release for Evaluation». В главе «1.1 What is a Servlet?» сказано, что сервлет — это веб-компонент, основанный на Java-технологии, который создаёт динамический контент (то есть содержимое). «Основан на Java-технологии» означает, что сервлет — это Java-класс, скомпилированный в байт-код. Сервлеты управляются контейнером сервлетов, который иногда называют Servlet Engine. Сервлет контейнер — это расширение веб-сервера, которое предоставляет функциональность сервлетов. В свою очередь сервлеты обеспечивают взаимодействие с клиентом в парадигме запрос/ответ, которая и реализуется сервлет-контейнером. В главе «1.2 What is a Servlet Container?» сказано, что сервлет контейнер — это часть веб-сервера или сервера приложений, который предоставляет сетевые сервисы, при помощи которых посылаются запросы и ответы, формируются и обрабатываются MIME-based запросы и ответы. Кроме того, сервлет контейнеры управляют жизненным циклом сервлетов (т.е. решают, когда их создавать, удалять и т.п.). Все сервлет контейнеры должны поддерживать протокол HTTP для получения запросов и отправления ответов. Тут хочется добавить, что MIME — это такой стандарт, спецификация, которая говорит, как надо кодировать информацию и форматировать сообщения, чтобы их можно было пересылать по интернету.

Веб-приложение на Java - 3

Web-server

Веб-сервер — это сервер, который принимает HTTP-запросы от клиентов и выдающий им HTTP ответы (как правило, вместе с HTML страницей, изображением, файлом или другими данными). Запрашиваемые ресурсы обознаются URL-адресами. Одним из самых популярных веб-серверов с поддержкой Servlet API является Apache Tomcat. Большинство веб-серверов — сложные механизмы, которые состоят из различных компонентов, и каждый из них выполняет опредленные функции. Например:

Веб-приложение на Java - 4

Connectors

— На входе у нас есть Connectors (т.е. коннекторы), которые принимают входящие запросы от клиентов. HTTP коннектор в Tomcat реализован при помощи компонента «Coyote». Коннекторы принимают данные от клиента и передают их дальше в Tomcat Engine. Servlet Container — Tomcat Engine в свою очередь обрабатывает полученный от клиента request при помощи компонента «Catalina», который является сервлет контейнером. Подробнее см. документацию Tomcat : «Architecture Overview». Сущестуют и другие веб-серверы, поддерживающие спецификацию Servlet API. Например, «Jetty» или «Undertow». Их архитектура похожа, поэтому понимая принцип работы с одним сервлет контейнером, можно перестроиться на работу с другим.

Веб-приложение на Java - 5

Веб-приложение (Web Application)

Итак, чтобы мы смогли запустить веб-приложение, нам нужен веб-сервер, который поддерживает Servlet API (т.е. в котором есть компонент-расширение, реализующее для веб-сервера поддержку Servlet API). Хорошо. А что же такое вообще веб-приложение? Согласно главе «10 Web Applications» спецификации Servlet API, Web application — это набор сервлетов, HTML страниц, классов и других ресурсов, которые составляют законечнное приложение на веб-сервере. Согласно главе «10.6 Web Application Archive File«, веб-приложение может быть запаковано в Web ARchive (в архив с расширением WAR). Как сказано на странице «Glossary-219«:

Java-университет

Веб-приложение на Java - 6

То есть WAR сделано вместо JAR, чтобы показать, что это веб-приложение. Следующий важный факт: у нас должна быть определённая структура каталогов в нашем WAR архиве. В спецификации Servlet API в главе «10.5 Directory Structure«. В этой главе сказано, что есть особый каталог, который называется «WEB-INF». Данный каталог особен тем, что он не виден клиенту и напрямую ему не показывается, но он доступен для кода сервлетов. Также сказано, что может содержать каталог WEB-INF:

Веб-приложение на Java - 7

Из всего этого списка нам теперь неизвестен и непонятен пункт про какой-то файл web.xml, называемый deployment descriptor (дескриптор развёртывания). Что же это такое? Деплоймент дескриптору отведена глава «14. Deployment Descriptor«. Если кратко, то деплоймент дескриптор — это такой xml файл, который описывает, как нужно разворачивать (то есть запускать) на веб-сервере наше веб-приложение. Например, в деплоймент дескрипторе указывается по каким URL надо обращаться к нашему приложению, указываются настройки безопасности, которые относятся к нашему приложению и т.д. В главе «14.2 Rules for Processing the Deployment» сказано, что web.xml прежде чем наше приложение будет настроено и запущено будет провалидирован по схеме (то есть будет выполнена проверка, что содержимое web.xml написано правильно согласно схеме). А в главе «14.3 Deployment Descriptor» указано, что схема лежит здесь: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Если посмотреть на содержимое файла, мы можем увидеть:

Веб-приложение на Java - 8

Для чего используется схема для XML файлов? В схемах указано, как правильно заполнять XML документ: какие элементы можно использовать, какого типа данные в элементах могут быть указаны, в каком порядке элементы должны идти, какие элементы обязательны и т.д. Можно сравнить схему XML документа с интерфейсом в Java, ведь схема в Java тоже указывает, каким образом должны быть написаны классы, которые удовлятворяют данному интерфейсу (т.е. которые реализуют данный интерфейс). Итак, мы вооружены тайными знаниями и готовы создавать своё первое веб-приложение!

Веб-приложение на Java - 9

Создание веб-приложения

Работы с современным Java-приложением уже трудно представить без использования систем автоматической сборки проектов. Одними из самых популярных систем являются Maven и Gradle. Воспользуемся для данного обзора Gradle. Установка Gradle описана на официальном сайте. Для создания нового приложения нам понадобится встроенный в Gradle плагин: «Build Init Plugin». Для создания Java-приложения необходимо выполнить следующую команду: gradle init —type java-application

Веб-приложение на Java - 10

После создания проекта нам понадобится отредактировать файл build.gradle. Это так называемый Build Script (подробнее см. документацию Gradle: «Writing Build Scripts»). В данном файле описывается то, каким образом необходимо собирать проект и другие аспекты работы с Java проектом. В блоке plugins описывается, какие «Gradle плагины» необходимо использовать для текущего Gradle проекта. Плагины расширяют возможности нашего проекта. Например, по умолчанию исопльзуется плагин «java». Данный плагин всегда используется, если нам нужна поддержка Java. Но вот плагин «application» нам не нужен, т.к. в его описании указано, что он служит для создания «executable JVM application», т.е. выполняемых JVM приложений. Нам же нужно создание Web приложения в виде WAR архива. И если мы в документации Gradle поищем слово WAR, найдём и «War Plugin». Следовательно, укажем следующие плагины:

 plugins

Так же в «War Plugin Default Settings» сказано, что каталог со всем содержимым веб-приложения должен быть «src/main/webapp», там должен лежать тот самый каталог WEB-INF, в котором должен лежать web.xml. Создадим такой файл. Заполнять же его будем несколько позднее, т.к. мы ещё не имеем достаточно информации для этого. В блоке «dependencies» указываем зависимости нашего проекта, то есть те библиотеки/фрэймворки, без которых не может работать наше приложение. В данном случае, мы пишем веб-приложение, а значит мы не можем работать без Servlet API:

 dependencies

providedCompile говорит о том, что зависимость не нужно включать в наш WAR архив веб-приложения: она нужна только для компиляции. А при выполнении данная зависимость будет предоставлена кем-то другим (то есть веб-сервером). Ну и оставляем в build script информацию о том, какой репозиторий зависимостей мы хотим использовать — из него будут скачаны все указанные dependencies:

 repositories

Всё остальное из файла build script’а убираем. Теперь отредактируем класс src\main\java\App.java. Сделаем из него сервлет. В спецификации Servlet API в главе «CHAPTER 2. The Servlet Interface» сказано, что Servlet Interface имеет базовую реализацию HttpServlet, которой должно быть достаточно в большинстве случаев и разработчикам достаточно унаследоваться от неё. А в главе «2.1.1 HTTP Specific Request Handling Methods» указаны основные методы, которые обрабатывают входящие запросы. Таким образом, перепишем класс App.java:

 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.io.IOException; public class App extends HttpServlet < public String getGreeting() < return "Hello world."; >public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException < // https://www.oracle.com/technetwork/java/servlet-142430.html PrintWriter out = resp.getWriter(); out.println(this.getGreeting()); out.close(); >> 

Итак, у нас вроде всё готово. Осталось правильно написать дескриптор развёртывания. Из схемы скопируем в web.xml следующий текст:

А также путь к схеме, который указан в ней: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Теперь посмотрим пример того, как должен выглядеть web.xml в спецификации Servlet API. Данный пример указан в главе «14.5.1 A Basic Example«. Совместим то, что указано в схеме с примером, который указан в спецификации. Получим следующее:

  A Simple Web Application app App  app /app   

Как видно, мы использовали схему и schemaLocation, которые были указаны ранее. А описание самих элементов взяли из примера из главы 14.5.1. Если мы сделали всё правильно, выполним gradle задачу gradle war без ошибок:

Веб-приложение на Java - 11

Веб-приложение на Java - 12

Запуск веб-приложения

Как же происходит запуск веб-приложения? Давайте разберёмся сначала с более сложным вариантом. Мы ранее говорили, что есть Apache Tomcat веб-сервер, который поддерживает Servlet API. А это значит, что наш собранный war архив мы сможем развернуть (ещё говорят «задеплоить») на этом сервере. На странице «Download Tomcat» скачаем из раздела «Binary Distributions» тип поставки «Core» в формате zip. И распакуем скачанный архив в какой-нибудь каталог, например в C:\apache-tomcat-9.0.14. Прежде чем запускать сервер, откроем на редактирование файл conf\tomcat-users.xml и добавим в него следующую строку: Теперь в командной строке переходим в каталог bin и выполняем catalina.bat start . По умолчанию консоль сервера будет доступна по адресу http://localhost:8080/manager . Логин и пароль те самые, которые мы указали в tomcat-users.xml. У Tomcat’а есть каталог «webapps», в котором лежат веб-приложения. Если мы хотим развернуть своё, мы должны скопировать туда свой war архив. Когда мы ранее выполнили команду gradle war, то в каталоге \build\libs\ создался war архив. Вот его-то нам и надо скопировать. После копирования обновим страницу http://localhost:8080/manager и увидим:

Веб-приложение на Java - 13

Выполнив http://localhost:8080/javaweb/app , мы обратимся к нашему сервлету, т.к. обращение /app ранее мы «замапили» (то есть сопоставили) на сервлет App. Существует более быстрый способ проверить, как работает приложение. И в этом нам снова помогает система сборки. В build script нашего Gradle проекта мы можем добавить в секцию plugins новый плагин «Gretty»: id «org.gretty» version «2.3.1» И теперь мы можем выполнять gradle task для запуска нашего приложения: gradle appRun

Веб-приложение на Java - 14

Подробнее см. «Add the gretty plugin and run the app».

Веб-приложение на Java - 15

Spring и Servlet API

Сервлеты — основа всего. И даже популярный сейчас Spring Framework ничто иное, как надстройка над Servlet API. Для начала, Spring Framework — это новая зависимость для нашего проекта. Поэтому добавим её в build script в блок dependencies: compile ‘org.springframework:spring-webmvc:5.1.3.RELEASE’ В документации Spring Framework есть глава «1.1. DispatcherServlet». В ней сказано, что Spring Framework построен по шаблону «front controller» — это когда есть центральный сервлет, который называется «DispatcherServlet«. Все запросы поступают на этот сервлет, а он делегирует уже вызовы нужным компонентам. Видите, даже тут сервлеты. В деплоймент дескриптор необходимо добавить listener (слушателя):

  <listener-class>org.springframework.web.context.ContextLoaderListener  

Это слушатель событий сервлет контекста. То есть, когда стартует Servlet Context, стартует и контекст Spring’а (WebApplicationContext). Что такое Servlet Context? Он описан в спецификации Servle API в главе «CHAPTER 4. Servlet Context«. Сервлет контекст — это «взгляд» сервлетов на веб-приложение, внутри которого сервлеты запущены. У каждого веб-приложения свой Servlet Context. Дальше для включения Spring Framework необходимо указать context-param — параметр инициализации сервлет контекста.

  contextConfigLocation /WEB-INF/app-context.xml  

И завершает конфигурацию определение DispatcherServlet:

  app org.springframework.web.servlet.DispatcherServlet contextConfigLocation  1  app /  

И теперь нам осталось заполнить файл, указанный в contextConfigLocation. Как это сделать, описано в документации Spring Framework в главе «1.3.1. Declaration»:

Тут важно не только указать, какой пакет сканировать, но и то, что мы хотим annotation-driven, то есть управлять аннотациями тем, как будет работать Spring. Остаётся только создать пакет ru.javarush.javaweb и разместить в нём класс Spring контроллера:

 package ru.javarush.javaweb; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class SpringController < @GetMapping("/app") @ResponseBody public String getGreeting() < return "Hello world."; >> 

Запустив теперь gradle appRun и перейдя по адресу http://127.0.0.1:8080/javaweb/app мы получим всё тот же Hello World. Как видно, Spring Framework тесно переплетается с Servlet API и использует его, чтобы работать поверх него.

Веб-приложение на Java - 16

Аннотации

Как мы видели, аннотации — это удобно. И не мы одни так подумали. Поэтому в спецификации Servlet API начиная с версии 3.0 появилась глава «CHAPTER 8 Annotations and pluggability«, которая указывает, что сервлет контейнеры должны поддерживать возможность указывать то, что раньше указывалось в Deployment Descriptor’е через аннотации. Таким образом, web.xml можно совсем удалить из проекта, а над классом сервлета указывать аннотацию @WebServlet и указывать, на какой путь «мапить» сервлет. Тут вроде всё понятно. Но что делать, если мы к проекту подключили Spring, который требует более сложных настроек? Тут всё чуть-чуть сложнее. Во-первых, в документации Spring сказано, что для настройки Spring без web.xml нужно использовать свой класс, который будет реализовывать WebApplicationInitializer. Подробнее см. главу «1.1. DispatcherServlet». Получается, что это класс Spring’а. Как же тогда используется Servlet API тут? На самом деле, в Servlet API 3.0 был добавлен ServletContainerInitializer. Используя особый механизм в Java (называется SPI), Spring указывает свой инициализатор сервлет контейнера, который называется SpringServletContainerInitializer . В свою очередь, он уже ищет реализации WebApplicationInitializer и вызывает нужные методы и выполняет нужные настройки. Подробнее см. «How servlet container finds WebApplicationInitializer implementations». Вышеуказанные настройки можно выполнить так:

 package ru.javarush.javaweb.config; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; public class AppInitializer implements WebApplicationInitializer < @Override public void onStartup(ServletContext servletContext) throws ServletException < AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); // регистрируем конфигурацию созданую высше ctx.register(AppConfig.class); // добавляем в контекст слушателя с нашей конфигурацией servletContext.addListener(new ContextLoaderListener(ctx)); ctx.setServletContext(servletContext); // настраиваем маппинг Dispatcher Servlet-а ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); servlet.addMapping("/"); servlet.setLoadOnStartup(1); >> 

Теперь при помощи «Java-based configuration» укажем, какой пакет сканировать + включим аннотации:

 package ru.javarush.javaweb.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @Configuration @EnableWebMvc @ComponentScan(basePackages = "ru.javarush.javaweb.controllers") public class AppConfig

А сам SpringController был перенесён в ru.javarush.javaweb.controllers , чтобы при сканировании конфигурация не находила сама себя, а искала только контроллеры.

Веб-приложение на Java - 17

Подведение итогов

  • «Gradle: Building Java Web Applications»
  • «RESTful Web Services with Spring Framework — A quick start»
  • «Spring Core»
  • «Введение в JEE»

Веб-платформа на Java за 30 минут

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

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

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

Для предпринимателей или начинающих бизнесменов, или владельцев каких-либо площадок будет интересно узнать, что им в начале их бизнеса совсем не обязательно вкладывать большие деньги на «крутой» сайт, а достаточно воспользоваться открытыми библиотеками и единственное за что заплатить — это за то, чтобы взять в аренду виртуальный сервер.

В статье я покажу, как сделать простейший сайт, имеющий простую функциональность. Это скорее статья, посвященная именно тому, чтобы показать общую концепцию и помочь начинающим разработчикам сформировать понимание того, как именно создаются такие известные ресурсы, как Google, Facebook, Вконтакте.

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

Для тех, кто заинтересовался:

Подготовка

Установка того, что нам понадобиться:

Писать наш сервис мы будем на Java, как самом распространённом языке для веб-сервисов.

Проверьте, что на вашем компьютере установлена последняя версия Java, сейчас это 8 версия. Проверить это можно здесь проверить Java. В 97% случаях так оно и есть, но если это не так, то следуя инструкциями на этом сайте вы без труда исправите это, установив и настроив окружение.

Если же всё-таки это не удалось, сразу договоримся с вами так, первым делом вы пытаетесь решить проблему на этих сайтах:

  • www.google.ru
  • toster.ru
  • stackoverflow.com
  • ru.stackoverflow.com

Вообще, открою вам секрет, в программировании, когда у вас всё заработало с 1 раза — это означает только одно, что что-то не работает. Это неоспоримый факт. Куча ошибок, несовместимость версий, отсутствие в библиотеке классов и прочее — это нормальное явление.

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

Итак, Java стоит — всё хорошо.

Теперь нам нужен инструмент. Да, нам нужна идея. Качаем и ставим отсюда JetBrains.

Только учтите, что вам нужна именно Ultimate — версия. Простая версия не позволяет разрабатывать веб-приложения. Там есть бесплатный пробный период на 30 дней, думаю с этим не будет проблем.

Итак, среда разработки есть, Java есть.

Начнём

В своё время я перечитал кучу статей и прочего, и решил, что в этой статье я исключу по максимуму картинки и визуальную составляющую, обычно она только отвлекает, у меня может быть другая версия, другой порядок модулей и прочее.

Часто вижу вопросы от новичков про такие интересные вещи, как Spring и Hibernate (https://spring.io/, hibernate.org). В 96% случаях вам это пока что не надо, и без хорошей подготовки и хорошего скилла «solve problem» вы увязните там очень надолго и выбраться обратно будет очень тяжело.

Ваша альма-матер на первых порах — это 2 технологии:

  • Сервлет
  • JDBC

«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 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 — запрос и разбирает ответ. Всё просто, отдал данные и получил с сервера. По русски он говорит серверу «Дай мне имена всех, кто у тебя в базе» или «Занеси в базу это имя» и даёт ему имя.

Вот и вся клиентская часть.

Отправляем ресурс в настоящий мир

Как можно было заметить, наш сервис крутиться на локальном хосте. Другими словами на нашем же компьютере. Пришло время это исправить.

Тут я опишу лишь общий принцип сего действия. Это так или иначе потребует от вас денег на сервер, поэтому маловероятно, что кто-то действительно этим будет заниматься, особенно в самом начале своего программистского пути. Но понимать общую концепцию вы должны уже сейчас. Если кто решиться — знайте вы молодцы, вполне вероятно из вас может выйти толк.

И по традиции сразу несколько ссылок:

Читаем, что там написано, формируем в голове общую концепцию, того, как происходит взаимодействие программиста и удаленного сервера.

Сами сервера можно приобрести на amazone. Ссылку не даю, ибо реклама, можете сами поискать, это не сложно. Есть бесплатный тестовый период. НО! Будьте предельно осторожны, ваш покорный слуга сам слышал истории, как со счетов списывались тысячи долларов без ведома хозяина, ибо система сама умеет докупать себе мощности. Не попадитесь, я сам уже платил несколько раз за непонятные услуги, там всё на английском. Если не уверены, что делаете — лучше вообще не делайте.

Порядок действий таков:

  1. Арендуете облако
  2. Подключаетесь по протоколу ssh
  3. Ставите нужные пакеты и настраиваете систему
  4. Собираете у себя war-пакет и деплоите его на сервер
  5. Решаете кучу ошибок и проблем

На всякий случай я оставлю тут эти ссылки, вдруг, кто-то застопорился на каком-то моменте и решил спуститься в самый низ статьи, может помогут:

Заключение

Вот мы и добрались до кульминации нашего здесь обсуждения Джавы и веб-разработки на ней. Сложно? Да. Интересно? Да. Все, абсолютно все сервисы, будь то, поисковая система с миллиардами индексов, будь то видео-сервис с миллионами стрим-каналов — всё строиться по одному принципу. Отдать — забрать данные. Понимая эту концепцию вы сможете написать любую систему, сервис или платформу.

Я не стану лукавить и обманывать вас уважаемые читатели. Вряд ли вы за 2 или 3 недели станете супер профессионалами и будете свободно писать код. Этому можно научиться только потом и долгими ночами. Чем дальше вы будете залазить в дебри, тем больше вы будете понимать, что вы так мало знаете. Дорогу осилит идущий, вперед, дерзайте.

Вперед. Пришло время действовать. Стареющим Дурову и Брину пора уйти на покой, время их славы уже прошло, пришло время обновить учебники истории и списки Forbs. И кто знает, может эту статью читает тот, кто в своё время напишет отличнейшую платформу, которая затмит собой таких гигантов как Google, Facebook и других. Удачи, спасибо, что дочитали до конца.

  • Веб-разработка
  • Программирование
  • Java

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *