Spring Framework. Урок 20: Модель. Передача данных от контроллера к представлению.
Вставка
- Опубліковано 5 лип 2020
- ПОЛНЫЙ КУРС ПО SPRING (Hibernate, REST, Boot, Security): swiftbook.org/courses/438
Продвинутая Java - swiftbook.org/courses/415
Мои уроки по Java EE - • Java EE для начинающих
Репозиторий прошлого урока (Стартовый проект) - github.com/NeilAlishev/Spring...
Репозиторий урока - github.com/NeilAlishev/Spring...
Реклама и сотрудничество: alishev.neil@gmail.com
ПОЛНЫЙ КУРС ПО SPRING (Hibernate, REST, Boot): swiftbook.org/courses/438
Плейлист этого курса: ua-cam.com/play/PLAma_mKffTOR5o0WNHnY0mTjKxnCgSXrZ.html
Telegram: t.me/alishev_g
Я уж думал, что схожу с ума. Думаю вроде бы 20 урок был уже. Хорошо, что зашёл в комменты ))) спасибо за ваш труд
Пожалйуста не забрасывайте эти лекции по спрингу, я до сих пор жду новые...
мы все ждем)
эх я начинал тоже по этим урокам. прошло уже почти пол года......ппц.. Но скажу так, на англоязычном ютубе очень много информации) сейчас я гуру в спринг))) советую
@@user-cx5ry5tt6s посоветуй пожалуйста пару каналов если не сложно. Спасибо
@@hovhannesayvazyan2339 amigoscode ( один из тех, что прям запомнилось) у Гоши Дударя кстати есть уроки еще. ОБЯЗАТЕЛЬНО к просмотру)
@@user-cx5ry5tt6s понял, благодарю)
идет 2023 год. прошел полный курс джава по 4-5 летнему курсу давности и погнал спринг по 3ех годовому. спасибо большое Алишев. не зря говорят если сделано на совесть значит на века. курсы топчик.
Задание + последующее раскрытие решения - просто замечательно. Спасибо за полезные уроки!
Наиль, спасибо за домашние задания, которые вы даете на протяжении всего курса!
С Java 14 можно использовать особый switch, где не надо break писать)
Double result = switch (action){
case "multiply" -> a*b;
case "div" -> a/b;
case "sub" -> a - b;
case "add" -> a + b;
default -> null;
};
Спасибо, все как обычно на высшем уровне
Спасибо за урок! Как всегда всё отлично!!! Ждем REST)
в REST все гораздо проще: вместо @Controller пишите @RestController, а вместо имени view возвращаете JSON
С большим удовольствием смотрю Ваши уроки!
Жду платный курс по Spring:)
брат уже месяц нет новых видео(( как то можно ускорить??? может даже платно сделать.
Вы огромный молодец! Лучшие материалы по Spring. Спасибо!
Большое спасибо за курс 🙏
Все очень круто 😀
Все очень доступно и понятно
Ждём продолжения ))
Спасибо за урок. Классно объясняешь, побольше бы таких людей)
Вот это темп!
Спасибо!
Здравствуйте, Наиль. Сделайте, пожалуйста, продолжение этого курса. Очень хорошо рассказываете, такой подачи материала не нашел ни у кого. Приобрел "Продвинутую Java" и очень доволен , готов приобрести ваши новые курсы!
Держи, так будет быстрее. www.udemy.com/course/spring-hibernate-tutorial/
@@VladGeneral Кстати да отличный курс, разложил Spring на молекулы! Еще канал letsCode довольно хорош!
Sunder спасибо за ссылку ✊
бесплатного материала гора, а вы ждете продолжения здесь)
с таким успехом спринг поймете очень не скоро, один источник для учебы такое себе
@@the_leonik привет. Можешь посоветовать ещё ,по твоему мнению, хорошие источники для изучения Spring?)
Спасибо вам большое за урок, с нетерпением ждем продолжение.
Лучший курс в интернете по Spring!
Господи аж прослезилась. я тебя люблю.
😂 ну ты даешь
Просто, доступно, информативно!
неожиданно, я то думал нормальную форму для ввода значений нарисуешь, а ты схалтурил :) за уроки спасибо!
Спасибо огромное за твой труд, твои видео очень полезны! Прикрути донаты к видео, или способ как тебе помочь финансово, я думаю нашлось бы немало людей готовых тебе перевести, пусть и небольшую, но благодарность за твои старания, ты их заслужил!
Спасибо за курс!
Просто супер уроки. Жду продолжения, буду весьма благодарен !)
Продолжение: swiftbook.org/courses/438
Огромное Вам спасибо, посмотрел 2 плейлиста по Java EE и по String Framework. Очень много вещей разъяснили)
P.S. сразу питониста видно по решётке в качестве комментария))
В Целом подача огонь, спасибо тебе!
можно добавить, что у аннотации @RequstParam не обязательно указывать значение в скобках, в таком случае будет использоваться имя переменной, которая после аннотации
👍🏼 использоваться в качестве ключа.
Отличные уроки! Жаль что так редко.
мы требуем продолжения!
Спасибо за урок! ещё один способ написания калькулятора :D
Спасибо за урок
Спасибо большое!
то чувство, когда Домашка сработала правильно ) Спасибо.
Добрый день. В первую очередь, благодарю за видео уроки.
Подскажите, пожалуйста, будут ли ещё видеоуроки по спрингу? И если да, то как скоро планируются?
Спасибо за урок и хорошего дня!
Здравствуйте, какое количество видео планируется делать по этому курсу? Огромная благодарность за старания)
Спасибо за курс!!!) Благодаря вам есть интерес дальше по Spring двигаться))) Делал также калькулятор, но вместо "addition" и т.д. сделал '+' '-' '*' '/' через char. Знает кто, почему '+' не работает в этом случае - выдает 0.0? Вроде ошибок нет, остальные знаки работают отлично. Хммм...
Ждем урок с подключением к БД
годнота подъехала
Здравствуйте, Наиль! Спасибо огромное за ваш труд. Посмотрела все ваши уроки по Java, для начинающих, продвинутую, EE, досматриваю Spring. Могли бы посоветовать какие-то еще ресурсы - ютуб каналы, еще какие-нибудь курсы на юдеми может? Можно на английском. Интересно было бы посмотреть на реализацию целого проекта - какую-нибудь простенькую базу на несколько таблиц, самый примитивный интерфейс с кнопочками, чтение, запись данных, запрос к таблицам, вывод в файл.
Евгений Сулейманов и его сайт proselyte.net. На его канале уже меньше объяснений, а больше примеров приложений. Ну и серия мок интервью оч крутая. Крч, тут смотрим теорию, там практику, а дальше уже проще становится со всем разобраться
Спасибо
кайф чувак!
Вы можете сделать урок про внешние и внутренние циклы for на джаве?чтобы было более понятно,как они работают
А как сделать, чтобы в html русский текст отображался? А то у меня вместо "Результат" иероглифы
Провел анализ просмотров уроков. К сравнению: 1 урок - около 122000, 20 урок - 3583 просмотра. Не смотря на полезность и уникальность преподаваемого материала, сквозь тернии к звездам прорываются не многие. Спасибо большое Наиль!!!
ну так первый урок болтается в сети уже года 2? а 20й? месяц?
ты, конечно, аналитик от бога😂 вот чз 2 года и смотри просмотры на 20м уроке.
@@manOfPlanetEarth Прошел 1 месяц. Просмотров на текущий момент - 7662 (прирост около 4100 просмотров). Актуальность видео со временем только падает. Даже если предположить, что прирост просмотров в месяц останется стабильным, через 2 года с момента публикации ожидается - 4100*10+7662 = 48662, что существенно меньше, чем 122000. Не понимаю, что Вы нашли для себя на образовательном канале
Руслан Гаджиев
просто сравни чз 2 года и тогда и констатируй что-то. тебе в дурку надо со своими диагнозами по интернету☝🏼
на твой БЕССМЫСЛЕННЫЙ вопрос, что я делаю на образовательном канале ответ ПРОСТЕЙШИЙ: ОЗНАКАМЛИВАЮСЬ СО СПРИНГОМ!!
пс
первому уроку 18 мес, 20му 3 месяца, разница 15 месяцев. ты хоть свой прирост в 4.1к умножай на 15!!! месяцев, а не на 10. так что сиди и сам отвечай на вопрос: что ты тут забыл? аналитик от бога🤦♂️😂😂😂
@@manOfPlanetEarth вопрос был риторический. Хотя откуда Вам знать о культуре речи... У Вас тяжелый диагноз, обратитесь к психотерапевту
Руслан Гаджиев
у тебя слабоумие, пупсик, срочно к психиатру.
и по делу ничего, как и ожидалось. счетовод хоенов🤦♂️😂
spasibo
Здравствуйте. Планируется ли рассказ про Spring Security?
Угу
Все супер, только вместо switch предпочтительнее использовать enum
Чтобы не было ошибки без ввода параметров, добавить defaultValue к аргументам типа int и сделать проверку на null для стринга.
А при выполнении блока division разве не надо вставить проверку деления на ноль?
Всё посмотрел от и до. Абсолютно ВСЁ понял. Когда следующие уроки будут?
На следующей неделе
@@alishevN супер :-)
У вас будут еще уроки по java ee? Ну там может юдеми.
13:30
Для секции "default" ставить брейк не обязательно
man please, go on!
Вот бы еще узнать как добавить на страницу два edit поля для считывания а и б, и 4 кнопки для действий) было бы поинтересней.
Наиль,большое спасибо вам,за то что вы делаете!Вы - большой мастер своего дела!
3 дня назад решил посмотреть первый урок этого курса и не заметил как я уже оказался на последнем(на данный момент) уроке.
Что посоветуете дальше учить самостоятельно,чтобы стать Junior Java Developer-ом?(опыт работы с базами данных присутствует)
Очень жду новых видео!Буду рад вашему ответу!)
Спасибо!
Продолжать изучать Spring Framework.
@@alishevN Наиль, спасибо большое за прекрасные уроки.
Поддерживаю вопрос Beka Zhumashev,
Что после спринга учить?
А я немного иначе сделал, чтобы ноль не получать ноль по дефолту(ведь мы можем сделать 5 -5, например): Если операция некорректная, то в модель идет атрибут со строкой "Wrong operation", после цикла идет проверка по методу model.addAttribute, если false, то в атрибут идет полученный answer
Вы проводите онлайн курсы по python?
Здраствуйте, спасибо за уроки. Такая проблема: в проекте есть index.jsp, его успешно грузит Tomcat. Хочу поменять welcome page на index.html. Но при смене расширения файла его не находит Tomcat. В web.xml в папке conf в Tomcat ничего не менял, там есть:
index.html
index.htm
index.jsp
Пожалуйста, помогите, как сделать так чтоб находило index.html при загрузке localhost:8080/. В пустом проекте, без конфига в Java коде (с сгенерированным илеей пустым web.xml файлом), находит index.html, а вот при конфиге в коде, как в уроках, находит только jsp.
Буду ОЧЕНЬ благодарен за помощь
Как вернуть в одном запросе несколько файлов? Например мне хочется вернуть мой html, который включает css и парочку js файлов? (Конечно можно все скрипты и css вбить прям в html и вернуть, но принципиально сделать именно разными файлами)
Ахаха. Мне понравился комментарий: "Это можно сделать в Intellij IDEA, потому что она позволяет нам это сделать" lmao
Подскажите что сделать чтоб кириллицу отображало корректно.
А как то иначе можно импортировать класс в html? Не через модуль. Как вставить туда результат метода calculator?
Правильно ли я понимаю, что при использовании thymeleaf можно и в @GetMapping, и в return-e метода указывать одну и ту же страницу, здесь "/first/calculator" и это и будет динамическим отображением? То есть не нужно будет в return указывать другую страницу, на которой будет отображаться результат?
в return указывается не url, а название html файла, который отобразится в ответ на запрос по адресу, который указан в @GetMapping("...")
Добрый день, можно ли у вас спросить не по теме этого видео. Хочу попробовать изучать программирование, мне много лет уже, учили в школе паскаль и с++ , очень нравилось, потом выбрала не ту профессию. Когда это все вспоминаю - захватывает дух. Хочу обучаться сама, но я не ориентируюсь вообще, с чего начать и к чему это приведет. Что более восстербовано. Хотела бы для начала на фрилансе подрабатывать. Мне посоветовали начать изучать Пайтон (именно по первому уроку нашла ваш канал). Урок ваш 2018 года. Хочу спросить, актуален ли еще этот язык, восстребован ли он, на правильном ли я пути в 2020 году ?
лучше джаву, чем питон.
Здравствуйте! У Вас есть на каком-нибудь ресурсе платные или бесплатные уроки по СпрингБут или Гибернейт? Готов тратить деньги на обучение, но везде плохо "разжевывают" материал.
Пока нет. В процессе.
Спасибо. А почему в примере с калькулятором если передать в параметрах ( @RequestParam ( value="a" , requiered = false ) Double a , ...... , Model model ) { } и при деплой на томкат , то когда переходим на /first/calculator без передачи в браузере параметров то выбрасывает куча ошибок ? А в предыдущем методе контроллера sayHello() при @RequestParam ( value = "name" , requiered = false )все работает ?
у меня тоже самое вопрос
@alishev Как избавиться от "???" вместо русских букв?
Чтобы Было по-русски написано "Результат:"
вот так: github.com/NeilAlishev/SpringCourse/commit/4270957dd2f458c0c03630ff56cce4f41bf04f09
@@alishevN Спасибо большое, сам вчера уже нашел этот ответ. Теперь знаю, что он правильный. Еще раз спасибо.
@@alishevN Огромное спасибо за Ваши уроки, уважаемый Наиль. Внес все необходимые исправления в файлы, потом даже полностью (с необходимой правкой путей) скопировал в проект Ваши, но кодировка так и не исправилась. В конфигурацию Tomcat никаких правок вносить не надо было? Буду благодарен за ответ. P.S. С удовольствием прошел Ваш курс на Udemy "Продвинутая Java". Благодарю и присоединяюсь к просьбам касательно аналогичного курса по Spring.
Наиль, подскажите пожалуйста, почему у меня тимлиф в браузере не виден?
Что за next в 5 уроке продвинутой Java? Как он хранит ссылку на несколько объектов? Вообще не понял.
3 часа перечитываю код, вообще не пойму.
Спасибо за очень познавательные уроки! Я реализую корзину на сайте магазина. Можете направить куда копать? У меня есть сущность Корзина, я хочу туда добавлять сущность Продукт. Я так понимаю нужно методом Пост отправить Продукт и сущность Пользователь в метод для обработки и там же делать редирект на эту страницу. Но по-моему я задумал слишком геморройный путь... И как вообще отправить сущность текущего Пользователя?
Ну или дайте знать, через сколько уроков примерно я смогу это сделать?)
@@alialiev7503 один из вариантов добавления текущего юзера - использовать в параметрах нужного контролера @AuthenticationPrincipal User user - поищите в интернете что-как, там просто.
@@user-ue8tc1tk1n Спасибо за информацию! Посмотрю)
В лекции "Spring - Глубоко и не очень" Борисов ругался за использование switch case, там правда приводился пример проблемы в большом проекте.
У него же подсмотрел очевидную (кроме новичков, конечно) конструкцию через делегирование выполнения:
public class CalculatorLib {
private CalculatorAction calculatorAction;
private HashMap hashMapCalculatorAction = new HashMap();
public CalculatorLib() {
hashMapCalculatorAction.put("multiplication", new Multiplication());
hashMapCalculatorAction.put("addition", new Addition());
hashMapCalculatorAction.put("subtraction", new Subtraction());
hashMapCalculatorAction.put("division", new Division());
}
public int calculatorActionLib(int a, int b, String action) {
calculatorAction = hashMapCalculatorAction.get(action);
return calculatorAction.action(a, b);
}
}
для учебного примера свитч это то что нужно
здесь идет изучение спринга
Можно было в результирующую переменную поместить NaN(Not a Number)
Планируется ли контент по реактивному программированию вообще и реактивной java в частности?
Имеете в виду RxJava или Java 9 Flow API?
@@alishevN ну, я пока знаю только о project reactor - это из той же оперы?
да, из той же оперы.
такой контент планируется, но не в ближайшем будущем.
Как передать данные через ссылку href в контроллер ?
Java
Показывал на прошлом уроке
@@alishevN Увидел, но там статическая передача.
Как подставить значение в ссылку?
То есть, имеем так :
@@user-xt1zd4tm4u
переменная в представлении? так можно?
нашел как сделать?
А сколько уроков планируется на этом курсе? Ну чтобы подготовить ожидание к терпению )))
Многооо
Наиль, нужна работа в Спринге с БД (MySQL), реализация DAO - в подробностях, как вы умеете.
Извините меня за глупый вопрос , какой стек спринга мы используем? Spring Boot или Spring MVC? Я просто запутался с этими разными спрингами. Не судите строго ;)
В уроках используется MVC. Так как в pom.xml не подключен Spring Boot
Сейчас мы используем Spring MVC, но дальше в курсе подключим еще и Spring Boot для упрощения конфигурации.
MVC и Boot - это не разные спринги. Это компоненты Spring Framework и они используются вместе.
@@alishevN Благодарю за ответ
почему и откуда Model инжектится в контроллер безо всяких аннотаций?
Импортируется зависимость в класс import org.springframework.ui.Model;
Решил попробовать switc через char : + - / *. Так вот, почему то работает всё, кроме операции +, выбрасывает в дефолтовое поведение
кто нибудь знает в чем причина? Почему операция "+" не работает?
@@user-jj1wv7ds8r разобрался почему с «+» не работает?
Ещё будут видео о Spring?
Да
Очень хорошие видео. спасибо.
Только вот не понятно как заставить thymeleaf сменить кодировку на utf-8 и заставить его отображать русский текст на странице, я уже всю голову сломал, пробовал задать ее через templateResolver.setCharacterEncoding("UTF-8"), не помогает, в configureViewResolvers задавал, один фиг((((
Для будущих поколений может пригодиться))
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("UTF-8");
return templateResolver;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
registry.viewResolver(resolver);
}
Не понял только одну вещь: у нас один объект модели для всей программы или каждое представление имеет только тот объект модели который передавался в вызвавший его контроллер?
Вроде бы второе.Испрваьте,пожалуйста, если не прав.Тоже не догоняю
@@user-nv8hz7jl5s да, второе, я на практике проверил
Народ, кто может подсказать по архитектуре? Допустим, у меня есть одна html страница, где генерируется отображение для разных страниц одного раздела. Скажем, в разделе "словарь" есть подразделы разного уровня слов.
Через thymeleaf я могу каждому уровню присвоить свой параметр, затем перехватить параметр в контроллере и, в зависимости от параметра, вернуть список слов нужного уровня из БД, затем в html'е через thymeleaf определить, что это за данные (ибо страница одна для отображения разных данных) и отобразить html так, как мне нужно.
Либо я могу сделать для каждого уровня слов отдельный контроллер и всю логику разбирать в них, но получается огромное количество одинакового кода в каждом отдельном контроллере.
Как сделать правильно? Первый случай мне кажется неправильным, ибо огромное количество логики перекачевывает в html. Во втором огромное количество дубирования кода, его можно вынести в отдельный метод, конечно, но я не видел, чтоб в разделе контроллеров выносили отдельные методы.
Можно делать разные контроллеры и отсылать из них параметры для БД в какой-то общий контроллер, чтоб не дублировать код, а затем из него переходить в представление, но тогда опять через thymeleaf нужно разбирать, какие именно данные нам поступили - опять много логики в html. Где-нибудь вообще про такие моменты можно почитать?
В этом решении плохо то, что a и b могут быть вообще не проинициализированы, если просто зайти на страницу, калькулятор. Когда передавал эти параметры как строки и потом парсил к числам, легко можно было проверить на null, а для int эта задача становиться всё более интересной....
было бы здорово использовать вместо свича рефлексию
Мне кажется лучше было бы сделать реквест параметры строкой, а потом парсить до дабл, в варианте показанном в видео не сработает, если ввести числа с плавающей запятой
в default оператор break не нужен , так как он всегда самый последний)
Не всегда. Поставьте первым, и посмотрите что будет
Я несколько сложнее сделал калькулятор, а именно дал именно знаки, а не строку в качестве математического действия. Если кто тоже так сделал и не получается поймать из строки "+", то он заменяется на пробел как зарезервированное значение. Кому интересно ZeBatua git
не нашла в репозитарии ваш код по адресу ZeBatua, там только с и с++ код. Я сделала также как Вы. но в запросе ставлю вместо "+" "%2B"
День добрый! Вопрос наверно которым задаются многие, на сколько актуально сейчас изучать Spring framework если есть тот же MVC и Boot? Если для базового понимания как что работает, то вопросов нет. Или есть другие причины? А за курс отдельный респект!)
Spring MVC и Spring Boot - это составляющие компоненты Spring Framework.
@@alishevN То есть без знания Spring Framework будет сложно кодить на Boot и MVC?
@@user-yf8pf6ut9z Spring MVC и Spring Boot - это и есть Spring Framework. Посмотрите первый урок из плейлиста.
@@alishevN Спасибо за ответ!
Зачем return в методе helloPage? - Для наглядности?
Почему для наглядности? без него работать не будет.
@@alishevN Работает :) Spring - реализует интерфейс сервлета. А Servlet содержит всего 2 метода doGet() и doPost() которые по умолчанию void.
С помощью model.addAttribute() мы устанавливаем response.set (HttpServletResponse), а возвращаемые значения (return) каким-то образом передаются в метод response.sendRedirect (я не ковырялся в наследованиях, поэтому не могу точно сказать, где и как это происходит). Кроме того, у сервлета тоже есть Dispatcher, которому мы делаем @Override добавляя extends AbstractAnnotationConfigDispatcherServletInitializer
@@videosound7884 я просто не понимаю, как без этого return'а Спринг поймет, какое представление показывать пользователю.
@@alishevN Согласен, можно запутаться. Я тоже путаюсь... Нужно исходить из того, что HttpServletResponse - это поток. Хороший пример для понимания - ajax запросы. Можно объявить вместо Model в качестве параметра HttpServletResponse и через PrintWriter писать на страницу ответ сервера без перезагрузки страницы.
Я задавался этим вопросом на habr-е, и в комментариях сам же дал ответ. Нужно только поменять Writer на response в качестве параметра, а потом передать в PrintWriter response OutputStream qna.habr.com/q/955427
Следует также добавить: Spring я изучал (и сейчас учу и повторяю) по вашим урокам (хорошая ускоренная версия обучения). Так что мой комментарий - это не повод для каких-то выводов. Мало того! :) Благодаря вашим урокам, я уже задаюсь вопросами сборки и развёртывания проектов: ru.stackoverflow.com/questions/1259414/Как-правильно-собрать-jar-проект-spring-bootmaven
Сделал задачу в отдельном контроллере, также составил свитч, но там прописывал каждый раз свои атрибуты, чтобы выводилась строка что там к чему операция и чему равно. Сами операции в отдельных методах. И какой-то нуль поинт выпадает. Подергался, ошибок не нашел и стал смотреть урок. Разницы не понял. А когда ты ввел в строку параметры, то увидел, что я не прописал переменную операция=, а сразу влупил операцию. 1,5 часика поразвлекался.)) А иначе и не запомнишь. Теперь два запроса можно делать. кстати деление на ноль я учел. А ты?))))
Что ж у вас все вычисления в контроллере происходят? Вот молодые и будут городить там всю логику
Когда дойдем до сервисов, перенесем логику из контроллеров. Я же не могу все за один урок рассказать - нарушится последовательность.
@GetMapping("/calculator")
public String getCalculator(@RequestParam(value = "a", required = false) Double a,
@RequestParam(value = "b", required = false) Double b,
@RequestParam(value = "operation", required = false) String operation,
Model model){
StringBuilder stringBuilder=new StringBuilder();
if(operation.equals("multiplication")) stringBuilder.append(a+"*"+b +"=" +(a*b));
if(operation.equals("addition")) stringBuilder.append(a+"+"+b +"=" +(a+b));
if(operation.equals("subtraction")) stringBuilder.append(a+"-"+b +"=" +(a-b));
if(operation.equals("division")) stringBuilder.append(a+"/"+b +"=" +(a/b));
model.addAttribute("resOperation", stringBuilder.toString());
return "first/calculator";