Если ты уже закончил изучение Java SE или близок к этому, пришло время задуматься о дальнейших шагах в покорении профессии Java-девелопера. Часть 1. Что нужно знать перед изучением Spring и JavaEE - 1С одной стороны, ты уже неплохо разбираешься в Java: знаешь, как работать с IDE, писать программы и многое другое. Но что с ними, программами, нужно делать дальше? Как сделать их круче и “выпустить в мир”? Становится очевидно, что пора браться за изучение Enterprise-технологий. И тут-то начинается самое интересное. Неважно, с какого стека технологий ты решишь начать. Будь то JavaEE или Spring, ты наверняка столкнешься с массой вещей, которые пока что находятся за пределами твоего понимания. Между основами Java и продвинутыми технологиями есть еще промежуточная ступенька знаний, которые помогут тебе не растерять остатки самообладания и веры себя при чтении объемной документации. Поэтому цель данного цикла статей — дать тебе минимум необходимых теоретических знаний для дальнейшего изучения JavaEE или Spring. Весь материал разбит на 7 частей:
  1. Поговорим немного о сети.
  2. Рассмотрим устройство клиент-серверной и трехуровневой архитектуры.
  3. Разберемся с HTTP/HTTPS протоколами.
  4. Узнаем все, что нужно, о Maven.
  5. Поговорим о сервлетах.
  6. Контейнерах сервлетов.
  7. И наконец — об MVC.

Часть 1. Поговорим немного о сети

Начнем с самого главного и поговорим о том, на основе чего строятся все социальные сети, web-сервисы и приложения, мессенджеры и простенькие сайты — о сети (в контексте этого цикла статей под термином “сеть” подразумевается Глобальная сеть Интернет). Сеть состоит из громадного количества компьютеров: они соединены между собой и способны коммуницировать. Важно понимать, как они это делают, потому что web-приложения как раз и занимаются передачей информации от одного компьютера другому.

Сетевая модель OSI

Модель OSI (Open Systems Interconnection) создает уровневый подход к построению сети. Она четко показывает как и на каком уровне между собой могут взаимодействовать члены одной сети. Всего данная модель содержит 7 уровней:
7 Прикладной
6 Представления
5 Сеансовый
4 Транспортный
3 Сетевой
2 Канальный
1 Физический
Разбивка на уровни абстракции позволяет специалистам, которые работают, например, над транспортным уровнем, не задумываться о деталях реализации сети на сетевом и сеансовых уровнях. Такой подход используется и в программировании. Рассмотрим все уровни модели OSI, и выясним, какие из них нам интересны:
  1. 1. Физический уровень — здесь свое дело делают законы физики, а задача человека — использовать и направлять это в своих целях. Например, создание кабелей и прокладывание их к членам сети.

    Нам не интересен.

  2. Канальный уровень — отвечает за передачу данных сетевым узлам, создание каналов передачи данных на физических объектах.

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

  3. Сетевой уровень — для определения адресов отдельных пользователей сети и маршрутов к ним. На этом уровне стоит остановиться подробнее, а именно — на адресе пользователя в сети.

    Он определяется специальным протоколом: самый распространённый — IPv4 (Internet Protocol version 4). Именно его нужно использовать веб-программисту для обращения к другому абоненту сети.

    IPv4 состоит из четырех байтовых значений, разделенных точкой, например: 192.0.2.235. Стоит помнить, что значения байтовые, а значит, они лежат в пределах 0..255.

    IP-адреса, в свою очередь, делятся на классы, и просто так присвоить себе красивую комбинацию циферок не получится, но так сильно углубляться мы не станем. Достаточно понимать, что IP-адрес — это уникальный идентификатор абонента в сети, по которому мы сможем к нему обратиться.

  4. Транспортный уровень — занимается доставкой информации адресату. Для этого используются разные протоколы, которые нам пока не интересны. Гораздо больше нас интересует понятие, которое появляется на этом уровне, — port.

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

    Порт представляет собой число от 0 до 65535. Он добавляется к IP-адресу после двоеточия: 192.0.2.235:8080. Но нельзя использовать все порты из указанного диапазона: часть из них зарезервирована под операционную систему, еще часть принято использовать с конкретно оговоренной целью. В предназначение разных портов углубляться не будем, пока достаточно понимать их роль в процессе общения в сети.

  5. Сеансовый уровень — создает и управляет сеансами связи приложений. На этом уровне становится возможным взаимодействие приложений, отправка запросов служебного уровня. Для нас важно знать, что на этом уровне между двумя абонентами открывается сессия (session), с которой нам часто придется работать.

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

    Если приложение общается одновременно с несколькими пользователями, устанавливается соответствующее количество соединений, а значит и сессий. У каждой сессии есть уникальный идентификатора (ID), что позволяет приложению различать пользователей, с которыми происходит общение.

  6. Уровень представления — отвечает за кодирование/декодирование данных. Очевидно, что если нам нужно передать другому пользователи строку “Hello web”, сначала она преобразуется (кодируется) в бинарный код, и только потом отправляется. Достигнув адресата, сообщение преобразуется обратно (декодируется), и адресат может увидеть исходную строку. Эти действие происходят на уровне представления.

  7. Прикладной уровень — самый интересный уровень для нас. Он обеспечивает взаимодействие приложений с сетью. На этом уровне мы будем принимать, отправлять сообщения, делать запросы к сервисам и удаленным базам данных.

    Существует множество протоколов, которые используются на этом уровне: POP3, FTP, SMTP, XMPP, RDP, SIP, TELNET и, конечно же, HTTP/HTTPS. Протокол — это всеобщее соглашение, которого мы придерживаемся, составляя сообщения. О протоколах HTTP/HTTPS мы обязательно поговорим отдельно и подробнее.

Часть 1. Что нужно знать перед изучением Spring и JavaEE - 2 Знать, как работает каждый уровень этой модели нам не обязательно. Главное — разбираться в принципах работы элементов, с которыми нам придется сталкиваться при написании веб-приложений, а именно:
  • IP-адрес — адрес абонента в сети;
  • Порт — адрес приложения конкретного абонента;
  • Сессия — сущность которая существует на протяжении всего общения двух абонентов;
  • Прикладные протоколы (HTTP/HTTPS) — правила, которыми мы будем руководствоваться при составлении и отправке сообщений.
Когда мы переходим, скажем, в интернет-магазин, мы указываем его адрес нахождения и порт. При первом посещении создается сессия, в которую магазин может записывать информацию. Например, о товарах, которые мы оставили в корзине. Если мы закроем вкладку с интернет-магазином, а потом опять зайдем в него, наши товары останутся в корзине, потому что они сохранены в сессии. Ну и, естественно, всю информацию, которую мы получаем от магазина, мы получаем по протоколу HTTP/HTTPS, а наш браузер умеет его обрабатывать. Ты можешь возразить и сказать, что никогда не вводил адрес и порт в браузере, и будешь отчасти прав, ведь ты вводил доменное имя, которое преобразовывалось на DNS-сервере. А вот здесь давай разберемся получше, что к чему. Часть 1. Что нужно знать перед изучением Spring и JavaEE - 3

DNS (Domain Name System)

Как мы уже выяснили, у каждого абонента в сети есть уникальный адрес. Если речь идет о приложении, его уникальным адресом будет IPv4:port. Зная этот адрес, можно напрямую обратиться к приложению. Представим, что мы написали веб-приложение, которое отображает среднюю температуру воздуха во всех странах в режиме реального времени. Мы развернули его на сервере с адресом 226.69.237.119 и на порту 8080. Чтобы пользователь смог получить от нас информацию, ему нужно ввести в браузере 5 чисел: 226.69.237.119:8080. Люди не очень любят запоминать наборы чисел: далеко не все из нас помнят больше двух телефонным номеров. Вот поэтому и была придумана система доменных имен. Мы можем создать “псевдоним” нашего адреса — например, world-temperature.com, и пользователь вместо того, чтобы искать нас по адресу из пяти сложных чисел, может ввести в адресной строке браузера наше доменное имя. Для сопоставления доменных имен и реальных адресов существуют DNS-сервера. Когда пользователь в браузере вводит, например, javarush.ru, его запрос отправляется на DNS-сервер, где он превращается в реальный адрес. Часть 1. Что нужно знать перед изучением Spring и JavaEE - 4Нам важно это понимать, потому что в наших приложениях мы будем вызывать удаленные сервисы как по доменном имени, так и по реальному адресу, и это будут одни и те же сервисы. Вот и все! В этой статье мы рассмотрели основы устройства сети, которые пригодятся перед началом изучения веб-программирования. В следующий раз рассмотрим, что такое клиент-серверная архитектура и почему разбираться в ней так важно. Часть 2. Поговорим немного об архитектуре ПО Часть 3. Протоколы HTTP/HTTPS Часть 4.Основы Maven Часть 5. Сервлеты. Пишем простое веб-приложение Часть 6. Контейнеры сервлетов Часть 7. Знакомство с паттерном MVC (Model-View-Controller) Часть 8. Пишем небольшое приложение на spring-boot