Теория весеннего веба для самых маленьких

в 16:01, , рубрики: java

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

Немного примеров:

@RestController
public class HelloController {
    @RequestMapping("/")
    public String index() {
        return "Hello World!";
    }
}
Запрос любым методом

http://localhost:8080/

вернёт «Hello World!»

@RestController
public class HelloController {
    @GetMapping("/index.html")
    public String index() {
        return "Goodbye World!";
    }
}

Запрос Get методом

http://localhost:8080/index.html

вернёт «Goodbye World!»

@Controller
public class HelloController {
    @ResponceBody
    @PostMapping("/folder/index.html")
    public String index() {
        return "hi World!";
    }
}
Запрос Post методом

http://localhost:8080/folder/index.html

вернёт «hi World!»

@Controller
@RequestMapping("/folder1")
public class HelloController {
    @ResponceBody
    @PostMapping("/folder2/index.html")
    public String index() {
        return "hola 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 сериализация, а коллекции при ней идут по правилам массивов.

Автор: незнакомец

Источник

Поделиться

* - обязательные к заполнению поля