Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
forked from JavaOPs/topjava

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

Notifications You must be signed in to change notification settings

duken1111/topjava

Open more actions menu
 
 

Repository files navigation

Онлайн проект Topjava

  • Не стоит стремится прочитать все ссылки урока, их можно использовать как справочник. Гораздо важнее пройти весь материал урока и сделать Домашнее Задание
  • Обязательно посмотрите правила работы с патчами на проекте
  • Код проекта обновляется и не всегда совпадает с видео (можно увидеть как развивался проект). Изменения в проекте указывается после соответствующего патча.

Материалы занятия (скачать все патчи можно черезЕго прямая замена Download папки patch)

image

hw Разбор домашнего задания HW0:

  • Apply 1-1-HW0-stream.patch

Изменения в проекте: переименовал классы UserMeal* в более красивые Meal*

  • Apply 1-2-HW0-cycle.patch

Изменения в проекте: map.getOrDefault земенил на map.merge, for заменены на forEach

question Ваши вопросы по HW0

что делает метод Map.merge ?

никогда не надо ленится зайти в код Map.merge и почитать там javadoc. Когда, если не сейчас?

что означает Integer::sum ?

это ссылка на метод, сокращенная форма лямбды. IDEA иногда предлагает замену, например m->m.getCalories() заменяет на Meal::getCalories.

почему не использовать в TimeUtil методы isBefore/isAfter ?

это строгие (excluded) сравнения, а нам также нужны краевые значения

В MealsUtil у нас где-то есть ключевое слово final, где-то нет. В чем разница?

В проекте (Wrike.com) final был обязательным (в сеттингах IDEA галочка стояла). Но это скорее исключение, чем правило в проектах java (в Java 8 вообще ввели эффективный финал, те по факту). Во всех новомодных языках переменные final по умолчанию, а в java нужно помнить и везде добавлять, утомительно. Но если приучитесь- хуже не будет. Я обычно ставлю там, где важно по смыслу (если не забываю).

Занятие 1:

video 4. Maven.

Перевод проекта на Web.

  • Apply 1-3-switch-to-war.patch

Обновил сервлеты до версии 3.1 (Tomcat 8 использует это API, хотя для нас не принципиально, т.к. мы никакие фичи 3.x Servlet API не используем)

Сервлет добавляется в следующем патче, те в web.xml он будет подчеркиваться красным.

  • Apply 1-4-add-servlet-api.patch

Если зависимость servlet-api не подтянулсаь, обновите maven проект.

  • Apply 1-5-forward-to-redirect.patch

Проверка, кто занял порт в Windows (в случае проблем с запуском и дебагом на портах 8080, 8000)

  • Apply 1-6-logging.patch

установите переменную окружения на TOPJAVA_ROOT на корень проекта и перезапустите IDEA

изменения в проекте: убрал LoggerWrapper и логирую напрямую в логгер SLF4J. При логгировании через вспомогательный класс, в логе теряется имя исходного класса.

удалил зависимость jul-to-slf4j. Она нам не нужена и, согласно видео Владимира Красильщика про логирование, она замедляет работу

Проверочные вопросы:

  • Что нужно изменить в pom.xml, чтобы перейти с logback на log4j ?
  • Apply 1-7-remote-jmx.patch

Для подключения к Remote Process (localhost:1099) положить setenv.bat в $TOMCET_HOME/bin.

question Ваши вопросы

Используются ли еще где-то в реальной разработке JSP, или это уже устаревшая технология? Заменит ли ее JSF (https://javatalks.ru/topics/38037)?

JSF и JSP- разные ниши и задачи. JSP- шаблонизатор, JSF- МVС фреймворк. Из моего опыта- с JSP сталкивался в 60% проектов. Его прямая замена: http://www.thymeleaf.org (в Spring-Boot по умолчанию), но в уже запущенных проектах встречется достаточно редко. JSP не умирает, потому что просто и дешево. Кроме того включается в большнство веб-контейнеров (в Tomcat его реализация Jasper)

JSF- sun-овский еще фреймворк, с которым я ни разу не сталкивался и особого желания нет. Вот он как раз, по моему мнению, активно замещается хотя бы javascript фреймворками (angular, ember, react).

А зачем мы использовали logback? Почему SLF4J нас не устроило? Почему реализация логирования не log4j?

SLF4J-API это API. Там есть только пустая реализация org.slf4j.helpers.NOPLogger (можно посмотреть в исходниках). Logback для новых проектов стал стандарт. spring-petclinic и spring-boot используют его.


hw Домашнее задание HW01 (накатывает патчи урока, коммитим/пушим в master и после делаем ветку HW01 от последнего патча):

Реализуем сервлет с отображением в таблице списка еды (в памяти и пока без учета пользователя)

  • По аналогии с UserServlet добавить MealServlet и mealList.jsp.
    • Задеплоить приложение (war) в Tomcat c applicationContext=topjava (приложение должно быть доступно по http://localhost:8080/topjava)
    • Попробовать разные деплои в Tomcat, remote и local debug
  • Сделать отображения списка еды в jsp, цвет записи в таблице зависит от параметра isExceeded (красный/зеленый).
    • Время выводить без 'T', список выводим БЕЗ фильтрации, поле user в класс Meal НЕ добавляем.
    • Вариант реализации:
      • из сервлета преобразуете еду в памяти в List<MealWithExceeded>;
      • кладете список в запрос (request.setAttribute);
      • делаете forward на jsp для отрисовки таблицы (при redirect аттрибуты теряются).
    • Деплоиться лучше как war exploded: нет упаковки в war и при нажатой кнопке Update Resources on Frame Deactivation можно обновляться css, html, jsp без передеплоя. При изменении web.xml, добавлении методов, классов необходим redeploy.
    • В JSP для цикла можно использовать JSTL tag forEach. Для подключения JSTL в pom.xml и шапку JSP нужно добавить:
    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
    </dependency>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    ...

Optional

Реализуем в ПАМЯТИ CRUD (create/read/update/delete) для еды

  • Хранение в памяти будет одна из наших CRUD реализаций (позже будет JDBC, JPA и DATA-JPA).
  • Работать с реализацией через интерфейс, который не должен ничего знать о деталях реализации (Map, DB или что-то еще).
  • Добавить поле id в Meal/ MealWithExceed и реализовать генерацию счетчика, учитываем многопоточность сервелтов!
  • Сделать форму редактирования в JSP: AJAX/JavaScript использовать НЕ надо, делаем через <form method="post"> и doPost() в сервлете.
  • Для ввода дат и времени можно использовать html5 типы, хотя они поддерживаются не всеми браузерами (протестировать свой браузер). В конце курса мы добавим DateTimePicker jQuery plugin, который будет работать на всех браузерах.
  • Simple CRUD using Servlet/JSP
  • Обзор java.util.concurrent.*

После выполнения ДЗ обязательно проверьте решение на ошибки

question Вопросы по HW1

Не попадаю на страничку/брекпойнт в сервлете.

  • внимательно проверь url и applicationContext (Application Context должен быть тот же, что и url приложения: wiki IDEA)
  • посомтрите в task manager: возможно запущено несколько JVM и они мешают друг другу. Лишние java приложения убить.

Приложение не видит TOPJAVA_ROOT.

После выставления переменной окружения IDEA нужно рестартовать. Проверить, видит ли java переменную окружения можно так: System.getenv("TOPJAVA_ROOT"). Еще вариант: добавить -DTOPJAVA_ROOT=... в опции запуска приложения, тогда она доступна из java как System.getProperty("TOPJAVA_ROOT").

Проблемы с кодировкой в POST (кракозябры).

Возможное решение - выставьте кодироку ДО первого чтения из request:

protected void doPost(HttpServletRequest request, ...) {
    request.setCharacterEncoding("UTF-8");

Если сервлет тыкают несколько пользователей / несколько браузеров, какого должно быть поведение? Нужно ли что-то делать с сессиями?

Нужно делать реализацию хранения (в Optional) многопоточной (оно одно на всех и шарится между пользователями). Cессии пока не используем (начнутся, когда будет прикручивать авторизацию).

Предпочтительнее ли создавать новый объект Meal при каждом update?

Обычно так, особенно если используется Spring MVC. Если при обновлении не создавать копию, то нам сохраненный в памяти объект могут попортить. Вопрос скорее доверия к коду- если проект большой и людей над ним трудится много, то обычно нужно копировать.

Почему теряются атрибуты при передаче на сервлет: http://localhost:8080/topjava/meals?action=add&... и req.getAttribute("action") = null ?

См. Difference between getAttribute() and getParameter(). Отсюда также следует, что при редиректе что аттрибуты теряются.


error Типичные ошибки

  • Хранить нужно Meal и конвертировать ее в MealWithExceed когда отдаем список на отображение в JSP. Иначе при редактировании любой записи или изменении юзером своей нормы caloriesPerDay нужно будет пересчитывать все записи юзера.
  • Стили color можно применять ко всей строке таблицы tr, а не каждой ячейке.
  • DateTimeFormatter можно сделать один заранее (он потокобезопасный в отличии от SimpleDateFormatter), а не создавать новый при каждом запросе.
  • Реализаций интерфейса хранения будет несколько. Нужно учитывать это в названии класса.
  • Если в названии класса есть Meal, не нужно использовать слово meal в методах класса.
  • В web.xml принято группировать сервлет со своим маппингом
  • Не размещайте никакую логику (форматирование, счетчики) в бинах, где хранятся только данные (Meal, MealWithExceed)
  • Еще раз- детали реализации в памяти не должны быть никому видны. Те НЕ НАДО счетчик размещать в Meal или MealServlet или MealsUtil, в базе же он будет по другому генерится. И volatile при ++ не помогает от многопоточности. Почему? Обратите также внимание на то, чтобы реализация вашей коллекции для хранения еды была также многопоточной.
  • Не делайте дублирование кода MealsUtil. Возможно вам пригодятся константы LocalTime.MIN и LocalTime.MAX
  • Не дублируйте строки в jsp. Посмотрите на тернарный оператор.

About

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

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 95.0%
  • JavaScript 4.1%
  • Other 0.9%
Morty Proxy This is a proxified and sanitized view of the page, visit original site.