diff --git a/.gitignore b/.gitignore index 6ca05c4a5184..3185ada6371d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ +/.gitignore .idea out target *.iml log +*.patch +patch - +/Prepare_to_HW0.patch diff --git a/Procfile b/Procfile new file mode 100644 index 000000000000..4afeb7900918 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: java $JAVA_OPTS -Dspring.profiles.active="datajpa,heroku" -DTOPJAVA_ROOT="." -jar target/dependency/webapp-runner.jar --port $PORT target/*.war \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000000..ba0f51330725 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +Java Enterprise Online Project +=============================== + +[](https://www.codacy.com/app/javawebinar/topjava06) + + +Наиболее востребованные технологии /инструменты / фреймворки Java Enterprise: +Maven/ Spring/ Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + plugins. + + Когда вы слышите что-то, вы забываете это. + Когда вы видите что-то, вы запоминаете это. + Но только когда вы начинаете делать это, + вы начинаете понимать это + + Старинная китайская поговорка + +## Описание и план проекта +### Демо разрабатываемого приложения +### Требования к участникам, Wiki + +Вводное занятие +=============== +##  Системы управления версиями. Git. + +- Система управления версиями. VCS/DVSC. +- Ресурсы: + - Интерактивная Git обучалка + - Основы Git + - Working with remote repositories + - Видео по обучению Git + - Как начать работать с GitHub: быстрый старт + - Справочник в графическом виде + - Git Overview + - Видеокурс по Git + +##  Работа с проектом (выполнять инструкции) +- **Prepare_ to_ HW0.patch (скачать и положить в каталог вашего проекта)** +- Доступно о Java 8 Lambda + +## Инструкция по шагам (из видео): +- Установить ПО (git, JDK8, IntelliJ IDEA, Maven) +- Создать аккаунт на GitHub +- Сделать Fork ЭТОГО проекта (https://github.com/JavaOPs/topjava) +- Сделать локальный репозиторий проекта: +
git clone https://github.com/[Ваш аккаунт]/topjava.git+- Открыть и настроить проект в IDEA +- По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch +- Закоммитить и запушить изменения (commit + push) +- Сделать ветку домашнего задания +- Выполнить задание и залить на GitHub (commit + push) +- Переключиться в основную ветку проекта master. + +## Домашнее задание HW0 + +- Java 8 Date and Time API +- Time complexity +- Временная сложность алгоритма +- Вычислительная сложность +``` +Реализовать UserMealsUtil.getFilteredMealsWithExceeded: +- должны возвращаться только записи между startTime и endTime +- поле UserMealWithExceed.exceed должно показывать, + превышает ли сумма калорий за весь день параметра метода caloriesPerDay + +Т.е UserMealWithExceed - это запись одной еды, но поле exceeded будет одинаково для всех записей за этот день. + +- Проверте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды) +- Оцените Time complexity вашего алгоритма (если он O(N*N)- попробуйте сделать O(N). +``` +Optional + +- Java 8: Lambda выражения +- Java 8: Потоки +- Pуководство по Java 8 Stream +- Лямбда-выражения в Java 8 +- Шпаргалка Java Stream API +- stream.map vs forEach + +``` +Сделать реализация через Java 8 Stream API. Заменяйте forEach оператором stream.map(..) +``` + +### Ваши вопросы +> Как брать диапазон дат? Какие брать дефолтные значения для null? + +Для диапазона нужно использовать уже готовый `TimeUtil.isBetween`. Как приложение должно себя вести можно проверить на demo. + + +### Составление резюме, подготовка к интервью, поиск работы +### Ресурсы для подготовки к проекту +#### (желательно иметь представление для лучшего усвоения материала) + +#### Java Web (Servlets, JSP) +- Введение в сетевое программирование +- Основы Java на реальном примере (Servlets, JSP) +- Как создать Servlet? Полное руководство. +- Технологии Java для разработки веб-приложений + +#### HTML, JavaScript, CSS +- Основы работы с HTML/CSS/JavaScript +- jQuery для начинающих +- Уроки Bootstrap 3 + +#### Java Core (Reflection API, JUnit) +- Введение в Java Reflection API +- Java JUnit + +#### JDBC, SQL +- Уроки по JDBC +- Learn SQL +- Try SQL + +#### Разное +- Интуит. Программирование на Java +- Oracle Java tutorial на русском. +- Эффективная работа с кодом в IntelliJ IDEA diff --git a/config/Topjava-soapui-project.xml b/config/Topjava-soapui-project.xml new file mode 100644 index 000000000000..d8feb156c4c6 --- /dev/null +++ b/config/Topjava-soapui-project.xml @@ -0,0 +1,2 @@ + +
git clone https://github.com/[Ваш аккаунт]/topjava.git+- Открыть и настроить проект в IDEA +- По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch +- Закоммитить и запушить изменения (commit + push) +- Сделать ветку домашнего задания +- Выполнить задание и залить на GitHub (commit + push) +- Переключиться в основную ветку проекта master. + +##  Домашнее задание HW0 + +- Java 8 Date and Time API +- Time complexity +- Временная сложность алгоритма +- Вычислительная сложность +``` +Реализовать UserMealsUtil.getFilteredMealsWithExceeded: +- должны возвращаться только записи между startTime и endTime +- поле UserMealWithExceed.exceed должно показывать, + превышает ли сумма калорий за весь день параметра метода caloriesPerDay + +Т.е UserMealWithExceed - это запись одной еды, но поле exceeded будет одинаково для всех записей за этот день. + +- Проверте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды) +- Оцените Time complexity вашего алгоритма (если он O(N*N)- попробуйте сделать O(N). +``` +Optional + +- Java 8: Lambda выражения +- Java 8: Потоки +- Pуководство по Java 8 Stream +- Лямбда-выражения в Java 8 +- Шпаргалка Java Stream API +- stream.map vs forEach + +``` +Сделать реализация через Java 8 Stream API. Заменяйте forEach оператором stream.map(..) +``` + +###  Ваши вопросы +> Как брать диапазон дат? Какие брать дефолтные значения для null? + +Для диапазона нужно использовать уже готовый `TimeUtil.isBetween`. Как приложение должно себя вести можно проверить на demo. + +> Почему мы сначала суммируем калории, а потом фильтруем? Если записи за несколько лет то это лишняя работа. Не будет правильнее сначала фильтр, а потом все остальное? + +На вход в getFilteredWithExceeded подается список, уже отфильтрованный по датам. Будем делать это условием в SQL. + +> Лямбда выражения заменяют анонимные классы? + +Синтаксически лямбду можно преобразовать в анонимный класс (в IDEA Alt+Enter на лямбде и Replace lambda with anonymous class). +Наоборот- только SAM (Single Abstract Method) интерфейс можно преобразовать в lambda. В JVM вызов происходит через invokedynamic. + +> Как оценить временную сложность? Как определить: O(N), O(N*N) и O(N+N) ? + +Из wiki это зависимость объёма работы, которая выполняется некоторым алгоритмом, от размера входных данных. +O- это коэффициент. поэтому нет O(N+N), есть O(N). +Для нашего случая все просто- если вложенный цикл или стрим, то O(N*N), иначе O(N). + +> Какая сложность у map.containsKey(key)? не добрался до исходников. + +Вообще исходники есть: `java.util.HashMap.containsKey`. Устройство Map (и вообще коллекции)- одни из самых частых вопросов на собеседовании. +Читаем Структуры данных в картинках и Java собеседование. Коллекции. +При хорошем распределении ключей сложность `HashMap.containsKey - O(1), TreeMap.containsKey - O(log2 N), а LinkedList.contains- O(N)`. + +###  Типичные ошибки в домашнем задании: +- Объявление переменных + - объявляйте переменные непосредственно перед их использованием (не все вверху) + - если возможно, инициализируйте их сразу при объявлении. Если она неизменяемая, будет красиво сделать ее final. + - рассмотрите возможность сделать ее inline (вообще без переменной). Если логика несложная, становится лаконичнее. + - тип переменных-коллекций нужно объявлять интерфейсом: не HashMap, а Map + - имена переменных должны быть информативные и служить заменой комментариям + +- Оформление + - представьте, что это ваше тестовое задание на работу. Не должно быть лишних комментариев, TODO, .. + - комментариев должен быть минимум (самодокументируемый код). Если таки нужно - лучше на english. + - почаще пользуйтесь Ctrl+Alt+L - Reformat Code + - в `main()` можно выводить на `System.out`. Для этого подходит перопределение `toString` объектов вывода. diff --git a/doc/graduation.md b/doc/graduation.md new file mode 100644 index 000000000000..beeacd53ff41 --- /dev/null +++ b/doc/graduation.md @@ -0,0 +1,32 @@ +Java Enterprise Online Project +=============================== +Наиболее востребованные технологии /инструменты / фреймворки Java Enterprise: +Maven/ Spring/ Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + plugins. + +Graduation project +================= + +Design and implement a JSON API using Hibernate/Spring/SpringMVC (or Spring-Boot) **without frontend**. + +The task is: + +Build a voting system for deciding where to have lunch. + + * 2 types of users: admin and regular users + * Admin can input a restaurant and it's lunch menu of the day (2-5 items usually, just a dish name and price) + * Menu changes each day (admins do the updates) + * Users can vote on which restaurant they want to have lunch at + * Only one vote counted per user + * If user votes again the same day: + - If it is before 11:00 we asume that he changed his mind. + - If it is after 11:00 then it is too late, vote can't be changed + +Each restaurant provides new menu each day. + +As a result, provide a link to github repository. It should contain the code, README.md with API documentation and couple curl commands to test it. + +----------------------------- + +P.S.: Make sure everything works with latest version that is on github :) + +P.P.S.: Asume that your API will used by a frontend developer to build frontend on top of that. diff --git a/doc/lesson01.md b/doc/lesson01.md new file mode 100644 index 000000000000..e794ca3b788c --- /dev/null +++ b/doc/lesson01.md @@ -0,0 +1,187 @@ +# Онлайн проекта Topjava + +- **Напоминаю, что cвой код пишете только в ветках HWxx. Код в ветке MASTER трогать нельзя! +Модификация кода только через патчи в материалах урока (Apply Patch), иначе придется мержить код. +Все патчи объязательны и применяются по порядку. Если при применении патча предлагается мержд, cмотрите GIT Wiki, Patch не накатывается.** + +- **Делать Apply Patch лучше по одному непосредственно перед видео на эту тему - тогда при просмотре вы сразу сможете отслеживать изменения кода проекта.** После патча часто полезно запустить и посмотреть на работу приложения. + +- **Код проекта постоянно модифицируется, поэтому в видео вы можете увидеть старую версию кода. Иногда это способствует лучшему пониманию кода и вы видете, каким образом проект развивался** + +- **Не надо подробно читать все ссылки занятия, иначе времени не останется на ДЗ, что гораздо важнее. Пусть ссылки будут Вашим справочником, к которым вы в любое время можете обратиться.** + +- **Подсказка по работе с патчами (GIT Wiki)** + +## Материалы 1-го урока + +##  Разбор домашнего задания HW0: +###  1. Optional: реализация getFilteredMealsWithExceeded через Stream API +- **1-1-HW0-stream.patch** + +###  2. Работа с git в IDEA. Реализация через цикл. +- **1-2-HW0-cycle.patch** + +> Изменения в проекте: `map.getOrDefault` земенил на `map.merge`, `for` заменены на `forEach` + +## Занятие 1: +###  1. Обзор используемых в проекте технологий. Интеграция ПО. +- Обзор популярности инструментов и технологий Java за 2014 г. +- Видео "Приложение Spring Pet Clinic" +- Приложение Spring Pet Clinic. +- Demo Spring Pet Clinic + +###  2. Maven. +- Среда сборки проектов Maven. +- The Central Repository +- Настройка пропертей Maven: кодировка, java version, зависимости, maven-compiler-plugin +- The Reactor. Snapshots +- Недостатки Maven. Другие инструменты сборки. +- Справочник: + - Автоматизация сборки проекта + - Home Page + - Maven: The Complete Reference + - Разработка ПО вместе с maven + - Build Lifecycle + - Dependency Mechanism + - Создание своих архетипов и каталогов в Maven + - Зависимости, профили + - Bintray: gateway to Maven Central + +###  3. WAR. Веб-контейнер Tomcat. Сервлеты. +- **1-3-switch-to-war.patch** +> Сервлет добавляется в следующем патче, те в web.xml он будет подчеркиваться красным. + +- **1-4-add-servlet-api.patch** +- **1-5-forward-to-redirect.patch** + +- Перевод проекта на Web. +- Tomcat Home Page +- Сервлеты. +- Настройка и деплой в Tomcat. Tomcat manager. Remote debug. +- Запуск Tomcat из IDEA. Динамическое обновление без передеплоя. +- Redirect, Forward, Application context, Servlet context + - Томкат менеджер: http://localhost:8080/manager + - Наше приложение: http://localhost:8080/topjava + - Наш сервлет: http://localhost:8080/topjava/users + +- Справочник: + - Отладчик IntelliJ IDEA + - Yakov Fain: Intro to Java EE. Glassfish. Servlets (по русски) + - Yakov Fain: HTTP Sessions, Cookies, WAR deployments, JSP (по русски) + - Golovach Courses: Junior.February2014.Servlets + - Remotely debug on tomcat from IDEA + - Java Server Page + - Java Server Pages (JSP) + +###  4. Логирование. +- **1-6-logging.patch** +> **установите переменную окружения на TOPJAVA_ROOT на корень проекта и перезапустите IDEA** + +> изменения в проекте: убрал `LoggerWrapper` и логирую напрямую в логгер SLF4J. При логгировании через вспомогательный класс, в логе теряется имя исходного класса. + +- Java Logging: история кошмара +- Ведение лога приложения +- Log4j, Logback +- Добавление зависимостей логирования в проект. Переменная окружения TOPJAVA_ROOT +- Конфигурирование логирования. Настройка Live Template. +- Тестирование логирования в сервлете. + +#### Проверочные вопросы: +- Что нужно изменить в `pom.xml`, чтобы перейти с logback на log4j ? + +###  5. Подсоединение к логгеру по JMX. Выбор работы. +- **1-7-remote-jmx.patch** + +> Для подключения к Remote Process (`localhost:1099`) положить `setenv.bat` в `$TOMCET_HOME/bin`. + +- Управление логированием по Java Management Extensions. + +###  Ваши вопросы + +> Используются ли еще где-то в реальной разработке JSP, или это уже устаревшая технология? Заменит ли ее JSF (https://javatalks.ru/topics/38037)? + +JSF и JSP- разные ниши и задачи. +JSP- шаблонизатор, JSF- МVС фреймворк. Из моего опыта- с JSP сталкивался в 60% проектов. Его прямая замена: http://www.thymeleaf.org, но пока встречется достаточно редко. JSP не умирает, потому что просто и дешево. Кроме того включается в любой веб-контейнер (в Tomcat его реализация Jasper) + +JSF- sun-овский еще фреймворк, с которым я ни разу не сталкивался и особого желания нет. Вот он как раз, по моему мнению, активно замещается хотябы angular. + + +> А зачем мы использовали logback? Почему SLF4J нас не устроило? Почему реализация логирования не log4j? + +В `slf4j-api` это API. Там есть только пустая реализация `org.slf4j.helpers.NOPLogger` (можно посмотреть в исходниках). Logback для новых проектов стал стандарт. spring-petclinic и spring-boot используют его. http://logback.qos.ch/reasonsToSwitch.html + +--------- + +##  Домашнее задание HW01 (делаем ветку HW01 от последнего патча) + + По аналогии с Users добавить MealServlet и mealList.jsp. Время выводить без 'T'. + (пока фильтрацию не делаем и User к UserMeal не добавляем) + Задеплоить приложение (war) в Tomcat c applicationContext=topjava + (приложение должно быть доступно по http://localhost:8080/topjav) + Попробовать разные деплои в Tomcat, remote и local debug + + Сделать отображения списка еды в jsp, цвет записи в таблице зависит от параметра isExceeded (красный/зеленый). + Вариант реализации: + - из сервлета обращаетесь к реализации хранения еды в памяти; + - преобразуете результат в List