Pull to refresh

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.