Не смог нигде найти ссылку на самые основы веба для тех кто никогда не заглядывал за браузер, но уже начал учить Java и Spring.
Для начала стоит осознать, как вообще работает вэб (Или о том, что снаружи)
Например у нас есть два компьютера (обычных или виртуальных) один из которых (клиент) хочет получить от другого (сервер) какую-то информацию (да туже самую веб-страницу).
— Сервер, дай мне веб страницу, — говорит клиент примерно следующим URL запросом:
http://server.name:8080/folderName/pageName
В запросе, первым делом указывается протокол — http (для простоты осознания, это что-то вроде языка и правил общения между двумя программами), затем имя сервера — server.name (относительно уникальный идентификатор из нескольких слов разделенных точками: ru.wikipedia.org, habr.com), потом порт — 8080 (который читающий эту статью, вероятно никогда не указывал, но тогда он выбирался по умолчанию: 80), потом путь и имя страницы — folderName/pageName (прямо как в древе папок на вашем ПК /Windows/explorer.exe)
Тут появляется небольшая тонкость: было бы очень затратно обращаться к серверам по имени, поэтому в реальности обращение происходит по адресу, например 178.248.237.68, а для того чтобы его узнать этот адрес используются DNS сервера, которые работают примерно, как телефонный справочник (если очень условно) и сообщают адрес по имени. Далее этот адрес условно можно использовать вместо имени, но на самом деле нет и вот почему:
На стороне Сервера (если это интернет) обычно работает не один сайт, а несколько и вас встречает не собственно сам сайт, а например NGINX, который в зависимости от имени сайта отводит вас к нужному уже внутри Сервера.
Так или иначе главное тут вот что: мы (Клиент) послали запрос (Request) к Серверу он над ним подумал и вернул ответ (Responce).
И небольшое примечание. Мы ведь собираемся разрабатывать веб приложение на локальной машине и нам нужно как-то получить к нему доступ. Для начала, как и с любым сайтом хватит просто браузера. Как и у любого компьютера в сети у нас есть имя и адрес, но как и в реальной жизни не обязательно обращаться к себе по полному имени, достаточно сказать условное Я и в случае сети это localhost, те чтобы обратится к корневому ресурсу на вашем локальном веб-сервере нужно перейти по ссылке http://localhost:8080/ (специально не рабочая ссылка, чтобы не тыкали своими ручонками сервер-то никто не поднимал).
Теперь о том, как работает спринг (Или о том, что внутри)
В простейшем случае (вашем) на стороне Сервера (который ПК) нас встречает ваше приложение, те встретит когда вы ее напишете и поднимите. Так как сама по себе она жить не может, то она запущена на чем-то маленьком (контейнер сервлетов, например Tomcat) или большом (сервер приложений, например WebSphere). И то и другое это какой-то контейнер с большим или меньшим количеством функций в котором существует ваше приложение. Для начала нам хватит томката который включен в спринг бут.
Как развернуть самое элементарное приложение я рассказывать не буду, тк подобных инструкций в сети как у дурака фантиков.
Полезнее будет рассказать хотя бы самые основы о том как устроен Спринг внутри (для тех кому в книжках и статьях много букв):
Поднимаясь в конейнере или сервере приложений Спринг создает DispatcherServlet, который пожирает все запросы и выполняет функцию маршрутизатора.
Самое важноt что есть в Спринге (его сердце, можно сказать) это IoC контейнер, в котором он хранит и которым САМ выстраивает зависимости между компонентами (частями вашей программы).
В процессе нахождения ему попадаются компоненты помеченные аннотацией Controller или @RestController (тоже что и обычный, но все методы автоматически помечены @ResponceBody), которые он привязывает к диспетчер сервлету, чтобы тот знал какой запрос куда направлять.
Внутри контроллеров находятся методы помеченные аннотацией @RequestMapping (@GetMapping, @PostMapping, @PutMapping, @DeleteMapping такие же @RequestMapping, но с заранее указанным методом запроса). Отмечу, что если просто вбить адрес в строку браузера, то вы получите Get запрос.
Немного примеров:
|
Запрос любым методом
вернёт «Hello World!» |
|
Запрос Get методом
http://localhost:8080/index.html вернёт «Goodbye World!» |
|
Запрос Post методом
http://localhost:8080/folder/index.html вернёт «hi World!» |
|
Запрос Post методом
http://localhost:8080/folder1/folder2/index.html вернёт «hola World!» |
Но все это будут унылые статичные тесты, которые никому не пригодятся. Запросам не хватает параметров, и у нас есть 3 способа их получить: @RequestParam, @PathVariable и @RequestBody. Рассмотрим первые два (если вы читаете эту статью, то вам пока незачем использовать третье).
@RestController
public class HelloController {
@RequestMapping("/")
public String index(@RequestParam String name) {
return "Hello " + name;
}
}
Запрос http://localhost:8080/?name=Alex вернёт «Hello Alex»
@RestController
public class HelloController {
@RequestMapping("/abracadabra/{name}/bums")
public String index(@PathVariable String name) {
return "Hello " + name;
}
}
Запрос http://localhost:8080/abracadabra/Alex/bums вернёт «Hello Alex»
@RestController
public class HelloController {
@RequestMapping("/{foo}/{name}")
public String index(@PathVariable String name, @RequestParam String baz, @RequestParam String hell, @PathVariable String foo) {
return name + " " + baz + " " + hell + " " + foo;
}
}
Запрос http://localhost:8080/geese/steal?hell=love&baz=kill тоже что-то вернет
Совсем на прощанье:
@RestController
public class HelloController {
@RequestMapping("/{foo}/{name}")
public String index(@PathVariable String name, @PathVariable String foo) {
List list = new ArrayList();
list.add(foo);
list.add(name);
return list;
}
}
Запрос http://localhost:8080/geese/steal вернет [“geese”, “steal”] потому что JSON сериализация, а коллекции при ней идут по правилам массивов.
Автор: незнакомец