- DispatcherServlet
- Controller
- Model
- View
- Thymeleaf
- Синтаксис
- Форма | th:method | th:action | th:object
- Перебор Элементов | th:each
Предполагает разработку web-приложений с использованием архитектуры Model - View - Controller.
Model- логика работы с данными (обращение к БД)View- логика представления, интерфейсController- логика навигации, обработки запросов
Входная точка Spring MVC приложения. Находится между Controller
и HTTP Request
HTTP запрос от пользователя:
- Приходит на сервер. Сервер обрабатывает запрос и передает его на Spring MVC приложение.
- Запрос попадает в DispatcherServlet.
- DispatcherServlet отправляет запрос на правильный контроллер.
@Controller- Обрабатывает запросы от пользователя
- Обменивается данными с моделью
- Показывает пользователю правильное представление
- Переадресовывает пользователя на другие страницы
@Controller - тот же @Component, но с дополнительными возможностями.
В контроллере может быть несколько методов, которые возвращают строки - названия представлений, которые нужно показать
пользователю. Обычно каждый метод соответствует одному URL'у
Связывают метод контроллера с адресом, по которому к этому можно к этому методу обратиться (из браузера, например)
@Controller
public class HelloController {
@GetMapping("/hello-world")
public String sayHello() {return "hello_world"; }
}Используется для того, чтобы указать, что ВСЕ МЕТОДЫ класса в начале адреса имели префикс
@Controller
@RequestMapping("/people"
public class PersonController {
@GetMapping("/new") // обрабатывает запросы /people/new
public String new() { return "new"; }
@GetMapping("/old") // обрабатывает запросы /people/old
public String old() { return "old"; }
}Обработка параметров GET-запроса
@GetMapping("/hello")
public String helloPage(@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "surname", required = false) String surname) {
System.out.println("Hello, " + name + " " + surname);
return "first/hello";
}
// URL: localhost/hello?name=nikita&surname=bereznev
// Result: Hello, nikita bereznev| HTTP метод | Аннотация | Описание |
|---|---|---|
| GET | @GetMapping | Самый используемый запрос. Получение данных с удаленного сервера (переход по адресу, ссылке, поисковой запрос и т.д.). Ничего не меняет на сервере Параметры нужны для передачи информации от клиента серверу во время запроса. Передаются в самом URL после знака ? в формате ключ=значение. Несколько параметров разделяются знаком &. https://vk.com/audios202613076?q=lilpeep§ion=playlist Параметры (?q=lilpeep§ion=playlist) |
| POST | @PostMapping | Добавить на сервер (отправка данных с веб-форм, создать учетную запись, твитнуть, загрузить фото, добавить запись в сообщество). Параметры закодированы в теле запроса. |
| PUT | @PutMapping | Создаёт новый ресурс или заменяет представление целевого ресурса, данными представленными в теле запроса |
| DELETE | @DeleteMapping | Удаляет указанный ресурс |
| PATCH | @PatchMapping | Частично изменяет ресурс |
- 200 - ОК;
- 3хх - редирект;
- 4хх - ошибка клиента (404 - клиент пытается попасть на несущестующую страницу);
- 5хх - ошибка сервера (502: Bad Gateway - сервер не смог обработать полученный запрос по техническим причинам);
Контейнер для данных приложения
- Хранит в себе данные
- Взаимодействует с бд для получения данных
- Отдает данные контроллеру
Используется для добавления тех пар ключ-значение, которые нужны во всех моделях этого контроллера.
@ModelAttribute("headerMessage")
public String populateHeaderMessage() {
return "Welcome!";
}
// Любая модель контроллера по умолчанию будет иметь значение "Welcome!" с ключом headerMessageМожет передавать в модель любой объект
@ModelAttribute("messageObject")
public MessageObject populayeHeaderMessage() {
MessageObject messageObject = new MessageObject();
messageObject.setSomeField("Hello");
return messageObject;
}Создает объект с полями - данными формы и записывает объект в модель.
@PostMapping()
public String create(@ModelAttribute("person") Person person) {
//Аннотация создает объект, инициализирует поля данными с формы и записывает объект в модель с ключом "person".
return "sucessPage";
}
// Если в форме не будет данных, то в модель будет положен новый объект со значениями по умолчанию (0, null, и тд)- Получает данные от контроллера и отображает их в браузере
- Для динамического отображения данных используются шаблонизаторы
(
Thymeleaf,Freemaker,Velocity)
- Простые выражения:
- Переменная: ${...}
- Выбранная переменная: *{...}
- Сообщение: #{...}
- Ссылка URL: @{...}
- Фрагмент: ~{...}
- Литералы/Literals:
- Текст: 'one text', 'Another one!',...
- Число: 0, 34, 3.0, 12.3,...
- Boolean: true, false
- Null: null
- Токены: one, sometext, main,...
- Текст:
- Соединение строк: +
- Подстроки: |The name is ${name}|
- Арифметика:
- Binary: +, -, *, /, %
- Минус (unary operator): -
- Boolean:
- Binary: and, or
- Boolean отрицание (unary operator): !, not
- Сравнение и равенство:
- Сравнение: >, <, >=, <= (gt, lt, ge, le)
- Равенство: ==, != (eq, ne)
- Условные:
- If-then: (if)? (then)
- If-then-else: (if)? (then): (else)
- Default: (value) ?: (defaultvalue)
- Специальные токены:
- No-Operation: _
Контроллер:
@GetMapping("/new")
public String newPerson(Model model) {
model.addAttribute("person", new Person()); // добавляем объект по ключу "person"
return "people/new"; // имя представления для отображения
}<form th:method="POST" th:action="@{/people}" th:object="${person}">
<label for="name">Enter name: </label>
<input type="text" th:field="*{name}" id="name"/>
<br>
<label for="email">Enter email: </label>
<input type="text" th:field="*{email}" id="email">
<br>
<input type="submit" value="Create"/>
</form>th:method="HTTP метод"
th:action="Для какой страницы сохраняем данные"
th:object="используемый объект"
<div th:each="person : ${peopleList}">
<a th:href="@{/people/{id}(id=${person.getId()})}"
th:text="${person.getName() + ', ' + person.getAge()}">user</a>
</div><form action="http://foo.com" method="get">
<div>
<label for="say">What greeting do you want to say?</label>
<input name="say" id="say" value="Hi">
</div>
<div>
<label for="to">Who do you want to say it to?</label>
<input name="to" id="to" value="Mom">
</div>
<div>
<button>Send my greetings</button>
</div>
</form>