Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), DataTables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB.
Когда вы слышите что-то, вы забываете это.
Когда вы видите что-то, вы запоминаете это.
Но только когда вы начинаете делать это,
вы начинаете понимать это
Старинная китайская поговорка
2.1. Часть 1
2.2. Часть 2
2.3. Часть 3
- ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например,
c:\projects\topjava\
(Windows). Иначе впоследствии будут проблемы - Плагин Git Intergation уже не требуется, а вкладку
Version control
в IDEA переименовали вGit
Для переключения режима отображения изменений из вкладки Commit
в Git: Local Changes
нужно переключить Settings/Preferences | Version Control | Commit | Use non-modal commit interface
или в контекстном меню вкладки Commit
:
Патч prepare_to_HW0.patch (скачать и положить в каталог вашего проекта)
Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео:
- переименовал класс
UserMealWithExceed
и его полеexceed
вUserMealWithExcess.excess
- в
UserMeals/UserMealWithExcess
поля изменились наprivate
- обновил данные
UserMealsUtil.meals
и переименовал некоторые переменные, поля и методы- добавил
UserMealWithExcess.toString()
и метод для выполнения Optional домашнего задания- метод фильтрации в
TimeUtil
переименовал вisBetweenHalfOpen
(также изменилась логика сравнения:startTime
включается в интервал, аendTime
- не включается)
GitHub поменял политику: теперь пушить нужно через токен. IDEA предложит его сгенерировать при пуше, или можно создать токен в настройках
- Установить ПО (Git, JDK8, IntelliJ IDEA, Maven)
- Создать аккаунт на GitHub
- Сделать Fork ЭТОГО проекта (https://github.com/JavaOPs/topjava)
- Сделать локальный репозиторий проекта:
git clone https://github.com/[Ваш аккаунт]/topjava.git
Вместо Fork можно сделать клонирование проекта: он не будет привязан к исходному https://github.com/JavaOPs/topjava и у него не будет истории.
- Открыть и настроить проект в IDEA
- Выставить кодировку UTF-8 в консоли
- Поставить кодировку UTF-8
- Опционально: поменять шрифт по умолчанию на DejaVu или на новый JetBrains Mono
- По ходу видео сделать
Apply Patch...
скачанного патчаPrepare_to_HW0.patch
- Закоммитить и запушить изменения (
commit
+push
) - Сделать ветку домашнего задания
- Выполнить задание и залить на GitHub (
commit
+push
) - Переключиться в основную ветку проекта
master
.
7. Maven
- Руководство по Maven
- Wiki: Apache Maven
- The Central Repository
- Дополнительно:
- Мой Wiki по Maven
- Основы Maven
- JavaRush: Основы Maven
- Инструмент сборки проектов Maven
- Maven Getting Started Guide
- Видео: Maven vs Gradle vs SBT (Архипов, Борисов, Садогурский)
- Build Lifecycle
- Dependency Mechanism
ВНИМАНИЕ: НЕ НАДО в репозиторий делать Pull Request со своими решениями! См. видео выше ("Работа с проектом")
Реализовать метод UserMealsUtil.filteredByCycles
через циклы (forEach
):
- должны возвращаться только записи между
startTime
иendTime
- поле
UserMealWithExcess.excess
должно показывать, превышает ли сумма калорий за весь день значениеcaloriesPerDay
Т. е. UserMealWithExcess
- это запись одной еды, но поле excess
будет одинаково для всех записей за этот день.
- Проверьте результат выполнения ДЗ (можно проверить логику в http://javaops-demo.ru/topjava, список еды)
- Оцените Time complexity алгоритма. Если она больше O(N), например O(NN) или Nlog(N), сделайте O(N).
Внимание: внимательно прочитайте про O(N). O - это любой коэффициент, 2*N это тоже O(N).
- Java 8 Date and Time API
- Алгоритмы и структуры данных для начинающих: сложность алгоритмов
- Сложность алгоритмов и Big O Notation
- Головач: сложность алгоритмов в теме коллекций
- Time complexity
- Временная сложность алгоритма
- Вычислительная сложность
ВНИМАНИЕ: варианты Optional делайте в одной ветке в разных методах UserMealsUtil
. Проще делать, проще проверять
Реализовать метод `UserMealsUtil.filteredByStreams` через Java 8 Stream API.
- Видео: Доступно о Java 8 Lambda
- Java 8: Lambda выражения
- Java 8: Потоки
- Pуководство по Java 8 Stream
- Полное руководство по Java 8 Stream API в картинках и примерах
- 7 способов использовать groupingBy в Stream API
- Лямбда-выражения в Java 8
- A Guide to Java 8
- Шпаргалка Java Stream API
- Алексей Владыкин: Элементы функционального программирования в Java
- Yakov Fain о новом в Java 8
- stream.map vs forEach</a
- Дополнительно
- циклом за 1 проход по
List<UserMeal>
- без циклов по другим коллекциям/массивам (к ним также относим методы коллекций
addAll()/removeAll()
)
- без циклов по другим коллекциям/массивам (к ним также относим методы коллекций
- через Stream API за 1 проход по исходному списку
meals.stream()
- нельзя использовать внешние коллекции, не являющиеся частью коллектора
- возможны дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Т. е., например, нельзя разбить список на 2 подсписка с четными и нечетными датами и затем их объединить с подсчетом превышения для каждого элемента.
Временная сложность реализации должна быть O(N) (обратите внимание на п. 13 замечаний)
Решение должно быть рабочим в общем случае (должно работать в приложении с многими пользователями, не только при запуске main
)
Нельзя 2 раза проходить по исходному списку (в том числе по его отфильтрованной или преобразованной копии)
Ресурсы:
- Когда встречаешь что-то непривычное, приходится перестраивать мозги. Например, переход с процедурного на ООП-программирование дается непросто. Те, кто не знает шаблонов (и не хотят учить), также их встречают плохо. Хорошая новость в том, что если это принять и начать использовать, то начинаешь получать от этого удовольствие. И тут главное не впасть в другую крайность:
- Если вас беспокоит производительность стримов, обязательно прочитайте про оптимизацию
При использовании Stream API производительность улучшится только на больших задачах, где возможно распараллеливание. Еще: просто так запустить и померить скорость JVM нельзя (как минимум надо дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например JMH, который мы используем на другом проекте (Mastejava).
- 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно, при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находятся по истории VCS)
- 2: Наследовать
UserMealWithExcess
отUserMeal
нельзя, т. к. это разные сущности: Transfer Object и Entity. Мы будем их проходить на 2-м уроке. Это относится и к их зависимости друг от друга. - 3: Правильная реализация должна быть простой и красивой, можно сделать 2-мя способами: через стримы и через циклы. Сложность должна быть O(N), т. е. без вложенных стримов и циклов.
- 4: При реализации через циклы посмотрите в
Map
на методыgetOrDefault
илиmerge
- 5: При реализации через
Stream
заменяйтеforEach
операторомstream.map(..)
- 6: Объявляйте переменные непосредственно перед использованием (если возможно - сразу с инициализацией). При объявлении коллекций в качестве типа переменной используйте интерфейс (Map, List, ..)
- 7: Если IDEA предлагает оптимизацию (желтым подчеркивает), например, заменить лямбду на ссылку на метод (method reference), соглашайтесь (Alt+Enter)
- 8: Пользуйтесь форматированием кода в IDEA:
Alt+Ctrl+L
- 9: Перед check-in (отправкой изменений на GitHub) просматривайте внесенные изменения (Git -> Log -> курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему
revert
(Git -> Revert /Ctrl+Alt+Z
). - 10:
System.out.println
нельзя использовать нигде, кроме как вmain
. Позже введем логирование. - 11: Результаты, возвращаемые
UserMealsUtil.filteredByStreams
, мы будем использовать в нашем приложении для фильтрации по времени и отображения еды правильным цветом. - 12: Обращайте внимание на комментарии к вашим коммитам в Git. Они должны быть короткие и информативные (лучше на english)
- 13: Не полагайтесь в решении на то, что список еды будет подаваться отсортированным. Такого условия нет.
- ДЗ первого урока будет связано с созданием небольшого CRUD-приложения (в памяти, без базы данных) на JSP и сервлетах
- основы JavaScript необходимы для понимания проекта, начиная с 8-го занятия
- Basic HTML and HTML5
- Справочник по WEB
- Видео по WEB-технологиям
- Изучение JavaScript в одном видеоуроке за час
- HTML, CSS, JAVASCRIPT, SQL, JQUERY, BOOTSTRAP
- Введение в программирование на JavaScript
- Стандарты кодирования для HTML, CSS и JavaScript’a
- Основы работы с HTML/CSS/JavaScript
- JavaScript - Основы
- Основы JavaScript
- Bootstrap 3 - Основы
- jQuery для начинающих
- Интуит. Программирование на Java
- 1-й урок MasterJava: Многопоточность
- Основы Java garbage collection
- Размер Java объектов
- Введение в Java Reflection API
- Структуры данных в картинках
- Обзор java.util.concurrent.*
- Синхронизация потоков
- String literal pool
- Маленькие хитрости Java
- A Guide to Java 8
- Открытый курс: Spring Boot + HATEOAS
- Что нужно знать о бэкенде новичку в веб-разработке
- Туториалы: Spring Framework, Hibernate, Java Core, JDBC
- Основы SQL на примере задачи
- Уроки по JDBC
- Learn SQL
- Интуит. Основы SQL
- Try SQL
- Курс "Введение в базы данных"
- Вопросы по собеседованию, ресурсы для подготовки
- Эффективная работа с кодом в IntelliJ IDEA
- Quizful- тесты онлайн
- Введение в Linux
- Джошуа Блох: Java. Эффективное программирование. Второе издание
- Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования
- Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL
- Brian Goetz: Java Concurrency in Practice
- G.L. McDowell: Cracking the Coding Interview