СОДЕРЖАНИЕ ЦИКЛА СТАТЕЙ
Переиспользование чужого труда — это святое дело для любого разработчика 😌
Чтобы двигаться дальше, необходимо понимать основы компьютерной сети, вот серия статей. Обратите внимание на основные моменты: принцип работы HTTP, что такое GET, POST, PUT, статусы ответов, MVC , про JSON и сериализацию читайте отдельно.
Будет полезно реализовать предложенный пример с сервлетами, это поможет полюбить spring-boot всей душой. Пример приложения на spring-boot из данного цикла, довольно прост, но он поможет понять суть MVC. Ниже будет ссылка на проект по интереснее.
Для ознакомления с REST и использованием его в Spring прочитайте, вот эти три статьи.
В первой статье почитаете что такое REST.
Во второй статье говориться о запросах и ответах, обязательно прочитайте и примите к сведению комментарий товарища Fidel.
В третьей статье будет предложен практический пример реализации на Spring, подход к созданию приложения не много другой (полезно посмотреть и сравнить), реализуйте его.
Обратите внимание на место где говориться про HttpStatus, ResponseEntity <?> (если <?> вводит в ступор, то читайте главу 13. Обобщения из "Java. Руководство для начинающих", Герберт Шилдт ), в этой же статье почитайте про POSTMAN (дополнительно короткое видео про него) установите POSTMAN, все возможности вам не нужны, посмотрите, как создавать различные запросы.
В примере встречаются тернарные операторы , освежите в памяти, если забыли.
Обратите внимание на то, как в примере статьи реализовано внедрение бинов с использованием @Autowired
@RestController
public class ClientController {
private final ClientService clientService;
@Autowired
public ClientController(ClientService clientService) {
this.clientService = clientService;
}
}
Необходимо знать, что начиная с версии Spring 4.3 аннотацию @Autowired можно опустить, если у класса всего один конструктор. О том, что в конструкторе надо внедрить бин, фреймворк догадается сам. Подробнее можно прочитать в этом источнике.
И если вы будете внимательны, то у вас должен возникнуть вопрос по структуре пакета service, а именно: зачем там interface ClientService и public class ClientServiceImpl – это правильная практика, позднее, мы поговорим зачем она нужна и будем ее использовать.
Со статьями всё.
Прежде чем читать, давайте по пишем.
Как говориться: «Ни дня без кода!»
Для затравки создадим простой GET запросик.
В прошлый раз мы написали приложение для спекуляции овощами,
git clone https://FromJava@bitbucket.org/FromJava/speculation.git
git clone git@bitbucket.org:FromJava/speculation.git
Открываем приложение, и в пакете ru.java.rush создадим пакет controllers (здесь будут располагаться контролеры из паттерна MVC).
Создаем класс public class ProductController
@RestController
@RequestMapping("/speculation")
public class ProductController {
}
Аннотация @RestController – указывает Spring что это рест-контроллер.
@RequestMapping – все методы контроллера будут получать запросы с URI, который будет начинаться строкой, указанной в скобках аннотации ("/speculation").
Пишем в классе следующий метод
@GetMapping("/simple")
public String simple(){
return "Легкий GET запросик";
}
Запускаем проект, в строке браузера набираем: http://localhost:8080/speculation/simple
Получаем ответ:
Легкий GET запросик
Немного объяснений:
1. Мы создали класс, который пометили @RestController как контроллер, указали к нему путь @RequestMapping ("/speculation") – эта аннотация является не обязательной, без нее путь будет начинаться с "/".
2. Мы создали метод, который при выполнении возвращает строку (Легкий GET запросик), пометили его аннотацией @GetMapping (что этот метод именно для GET запросов) и указали к методу путь ("/simple")
3. Запустили проект (сервер) на порту 8080, и сделали GET запрос по адресу: сервер/ контроллер/метод (http://localhost:8080/speculation/simple)
4. По данному запросу отработал метод
public String simple(){
return "Легкий GET запросик";
}
5. Результат работы метода вернулся в браузер в виде строки "Легкий GET запросик".
Ну что, начало положено! Вас ждут увлекательнейшие стати.
Освоение предложенного выше материала займет не один день, здесь торопиться не надо, эта тема очень важна и ее необходимо понять, «ешьте слона по частям».
Для тренировки(после освоения материала):
Дополните контроллер приложения speculation .
Создайте методы:
1) Поиск товара по id
Используйте метод
productService.findById();
Пример вывода
{
"id": 1,
"name": "Картофель",
"purchasePrice": 20,
"packaging": null,
"salePrice": null
}
После реализации остальных методов контроллера, подумайте: "Почему в двух последних полях стоят null? Что нужно сделать, что бы там оказались какие нибудь значения?"
2) Просмотр всех продуктов на витрине:
Для поиска всех продуктов используйте метод productService.findAll();
Для заполнения полей упаковки и наценки используйте
productService.pack();
productService.makeMoney();
на выводе должен быть массив JSON-ов с перечислением товаров, пример:
[
{
"id": 1,
"name": "Картофель",
"purchasePrice": 20,
"packaging": "Упаковано в лучшем виде",
"salePrice": 100
},
{
"id": 2,
"name": "Морковь",
"purchasePrice": 14,
"packaging": "Упаковано в лучшем виде",
"salePrice": 70
}
]
3) Добавления нового товара в БД (добавьте товар:капуста и цену оптовой закупки)
Используйте:
productService.save();
Метод должен вернуть соответствующий Http статус.
4) Удаления товара по id
Для этого, сначала реализуйте в ProductService метод, содержащий
productRepository.deleteById();
А затем, используйте его в контроллере.
Метод контроллера должен вернуть соответствующий Http статус.
5) Изменения товара по id (изменение оптовой цены товара и наименования товара)
Эта операция будет по сложнее предыдущих.
Сначала необходимо найти товар, который мы хотим изменить по id
Используйте
productService.findById();
Затем, в найденном товаре (объекта) замените значение полей, на значение полей объекта, полученного в теле Put запроса (объект_json)
Это можно сделать примерно так:
найденный_товар = productService.findById(id);
найденный_товар.setName(объект_json.getName);
найденный_товар.setPurchasePrice(объект_json.getPurchasePrice);
После этого измененный товар необходимо сохранить
productService.save(найденный_товар);
Метод должен вернуть соответствующий Http статус.
Если с этим методом возникнут проблемы, то можно погуглить «put запрос java», интернет еще никто не отменял)
Работа с контроллерами на этом не заканчивается, впереди еще много тем…
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ