/topjava

Java Enterprise: Maven/ Spring/ Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery

Primary LanguageJava

Codacy Badge

Java Enterprise Online Project

Разработка полнофункционального 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.

topjava_structure

Когда вы слышите что-то, вы забываете это.
Когда вы видите что-то, вы запоминаете это.
Но только когда вы начинаете делать это,
вы начинаете понимать это

Старинная китайская поговорка

Вводное занятие (обязательно смотреть все видео)

  • ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) c:\projects\topjava\. Иначе впоследствии будут проблемы
  • Плагин уже Git Intergation не требуется и вкладку Version control в IDEA переименовали в Git

Для переключения режима отображения изменений из вкладки Commit в Git: Local Changes нужно переключить Settings/Preferences | Version Control | Commit | Use non-modal commit interface или в контекстном меню вкладки Commit:

image image

Патч prepare_to_HW0.patch (скачать и положить в каталог вашего проекта)

Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео:

  • переименовал класс UserMealWithExceed и его поле exceed в UserMealWithExcess.excess
  • в UserMeals/UserMealWithExcess поля изменились на private
  • обновил данные UserMealsUtil.meals и переименовал некоторые пременные, поля и методы
  • добавил UserMealWithExcess.toString() и метод для выполнения Optional домашнего задания
  • метод фильтрации в TimeUtil переименовали в isBetweenHalfOpen (также изменилась логика сравнения - startTime включается в интервал)

GitHub поменял политику - теперь пушить нужно через токен. IDEA предложит его сгенерить при пуше или можно создать токен в настройках

Инструкция по шагам (из видео):

Вместо Fork, можно сделать клонирование проекта: он не будет привязан к исходному https://github.com/JavaOPs/topjava и у него не будет истории.

video 4. Maven

hw Домашнее задание HW0

ВНИМАНИЕ: НЕ НАДО в репозиторий делать Pull Request со своими решениями! См. видео выше - работа с проектом

Реализовать метод UserMealsUtil.filteredByCycles через циклы (forEach):

  • должны возвращаться только записи между startTime и endTime
  • поле UserMealWithExcess.excess должно показывать, превышает ли сумма калорий за весь день значение caloriesPerDay

Т.е UserMealWithExcess - это запись одной еды, но поле excess будет одинаково для всех записей за этот день.

  • Проверьте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды)
  • Оцените Time complexity алгоритма. Если она больше O(N), например O(NN) или Nlog(N), сделайте O(N).
    Внимание: внимательно прочитайте про O(N). O - это любой коэффициент, 2*N это тоже O(N).

ВНИМАНИЕ: варианты Optional делайте в UserMealsUtil в одной ветке в разных методах. Проще делать, проще проверять

Optional (Java 8 Stream API)

Реализовать метод `UserMealsUtil.filteredByStreams` через Java 8 Stream API.

Optional 2 (+5 бонусов, только после выполнения базового и Optional задания!)

Сделать реализацию со сложностью O(N) (обратите внимание на п.13 замечаний)
Решение должно быть рабочим в общем случае (работать в приложении с многими пользователями, не только при запуске main)
Нельзя 2 раза проходить по исходному списку (в том числе его отфильтрованной или преобразованной копии)

  • циклом за 1 проход по List<UserMeal>
    • без циклов по другим коллекциям/массивам (к ним также относим методы коллекций addAll()/removeAll())
  • через Stream API за 1 проход по исходному списку meals.stream()
    • нельзя использовать внешние коллекции, не являющиеся частью коллектора
    • возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента.

Ресурсы:

Замечания по использованию Stream API:

При использовании Stream API производительность улучшиться только на больших задачах, где возможно распараллеливание. Еще - просто так запустить и померять скорость JVM нельзя (как минимум дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например JMH, который мы юзаем на другом проекте (Mastejava).

error Замечания к HW0

  • 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 предлагает оптимизацию (желтым подчеркивает), например заменить лямбду на метод-референс, соглашайтесь (Alt+Enter)
  • 8: Пользуйтесь форматированием кода в IDEA: Alt+Ctrl+L
  • 9: Перед check-in проверяйте чендж-лист (курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему revert (Git -> Revert / Ctrl+Alt+Z).
  • 10: System.out.println нельзя делать нигде, кроме как в main. Позже введем логирование.
  • 11: Результаты, возвращаемые UserMealsUtil.filteredByStreams мы будем использовать в нашем приложении для фильтрации по времени и отображения еды правильным цветом.
  • 12: Обращайте внимание на комментарии к вашим коммитам в git. Они должны быть короткие и информативные (лучше на english)
  • 13: Не полагайтесь в решении на то, что список еды будет подаваться отсортированным. Такого условия нет.

  • ДЗ первого урока будет связано с созданием небольшого CRUD приложения (в памяти, без базы данных) на JSP и сервлетах
  • основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия

Полезные ресурсы

HTML, JavaScript, CSS

Java (базовые вещи)

Туториалы, разное

Сервлеты

JDBC, SQL

Разное

Книги