diff --git a/lib/slf4j-api-2.0.17.jar b/lib/slf4j-api-2.0.17.jar new file mode 100644 index 0000000..26b1545 Binary files /dev/null and b/lib/slf4j-api-2.0.17.jar differ diff --git a/lib/slf4j-simple-2.0.17.jar b/lib/slf4j-simple-2.0.17.jar new file mode 100644 index 0000000..9a7348e Binary files /dev/null and b/lib/slf4j-simple-2.0.17.jar differ diff --git a/resources/WEB-INF/jsp/error.jsp b/resources/WEB-INF/jsp/error.jsp new file mode 100644 index 0000000..97973ad --- /dev/null +++ b/resources/WEB-INF/jsp/error.jsp @@ -0,0 +1,15 @@ +<%@ page contentType="text/html;charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + Charm Unexpected Error + <%@ include file="style.html" %> + + + <%@ include file="header.jsp" %> +
+

500 - ${requestScope.wordBundle.getWord("unexpected-error")}

+
+ <%@ include file="footer.jsp" %> + + \ No newline at end of file diff --git a/resources/WEB-INF/web.xml b/resources/WEB-INF/web.xml index 76c1445..9bfbaaa 100644 --- a/resources/WEB-INF/web.xml +++ b/resources/WEB-INF/web.xml @@ -29,4 +29,8 @@ 400 /WEB-INF/jsp/error400.jsp + + java.lang.Exception + /WEB-INF/jsp/error.jsp + diff --git a/resources/simplelogger.properties b/resources/simplelogger.properties new file mode 100644 index 0000000..055350f --- /dev/null +++ b/resources/simplelogger.properties @@ -0,0 +1,7 @@ +org.slf4j.simpleLogger.defaultLogLevel=info +org.slf4j.simpleLogger.showDateTime=true +org.slf4j.simpleLogger.dateTimeFormat=dd-MM-yyyy HH:mm:ss:SSS +org.slf4j.simpleLogger.logFile=System.out +org.slf4j.simpleLogger.levelInBrackets=true +org.slf4j.simpleLogger.showLogName=true +org.slf4j.simpleLogger.showShortLogName=false \ No newline at end of file diff --git a/src/ru/charm/back/controller/EmailController.java b/src/ru/charm/back/controller/EmailController.java index 13dc7f9..b27dc3d 100644 --- a/src/ru/charm/back/controller/EmailController.java +++ b/src/ru/charm/back/controller/EmailController.java @@ -5,6 +5,9 @@ import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.charm.back.controller.filter.ErrorFilter; import ru.charm.back.dto.ProfileGetDto; import ru.charm.back.dto.ProfileUpdateDto; import ru.charm.back.mapper.RequestToProfileUpdateDtoMapper; @@ -23,6 +26,7 @@ import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; public class EmailController extends HttpServlet { private final ProfileService service = ProfileService.getInstance(); private final RequestToProfileUpdateDtoMapper requestToProfileUpdateDtoMapper = RequestToProfileUpdateDtoMapper.getInstance(); + public static final Logger logger = LoggerFactory.getLogger(EmailController.class); @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { @@ -44,6 +48,7 @@ public class EmailController extends HttpServlet { ProfileUpdateDto dto = requestToProfileUpdateDtoMapper.map(req, new ProfileUpdateDto()); try { service.update(dto); + logger.info("Email {} was changed in profile with id = {}", dto.getEmail(), dto.getId()); resp.sendRedirect(String.format("/profile?id=%s", dto.getId())); } catch (DuplicateEmailException e) { resp.sendError(SC_BAD_REQUEST); diff --git a/src/ru/charm/back/controller/RegistrationController.java b/src/ru/charm/back/controller/RegistrationController.java index 271f785..b014977 100644 --- a/src/ru/charm/back/controller/RegistrationController.java +++ b/src/ru/charm/back/controller/RegistrationController.java @@ -5,15 +5,47 @@ import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.charm.back.dto.ProfileGetDto; +import ru.charm.back.dto.RegistrationDto; +import ru.charm.back.mapper.RequestToRegistrationDtoMapper; +import ru.charm.back.service.ProfileService; import java.io.IOException; @WebServlet("/registration") public class RegistrationController extends HttpServlet { + private final ProfileService service = ProfileService.getInstance(); + + private final RequestToRegistrationDtoMapper requestToRegistrationDtoMapper = RequestToRegistrationDtoMapper.getInstance(); + public static final Logger logger = LoggerFactory.getLogger(RegistrationController.class); + + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - req.setAttribute("profile", new ProfileGetDto()); - req.getRequestDispatcher("/WEB-INF/jsp/profile.jsp").forward(req, resp); + req.getRequestDispatcher("/WEB-INF/jsp/registration.jsp").forward(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + RegistrationDto dto = requestToRegistrationDtoMapper.map(req); + Long id = service.save(dto); + logger.info("Profile with the email address {} has been registered with id {}", dto.getEmail(), id); + resp.sendRedirect(String.format("/profile?id=%s", id)); + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String sId = req.getParameter("id"); + boolean success = false; + if (!sId.isBlank()) { + success = service.delete(Long.parseLong(sId)); + } + resp.setStatus(HttpServletResponse.SC_NO_CONTENT); + if (success) { + logger.info("Profile with id {} has been deleted", sId); + } + resp.sendRedirect("/registration"); } } diff --git a/src/ru/charm/back/controller/filter/ErrorFilter.java b/src/ru/charm/back/controller/filter/ErrorFilter.java new file mode 100644 index 0000000..a4547b2 --- /dev/null +++ b/src/ru/charm/back/controller/filter/ErrorFilter.java @@ -0,0 +1,33 @@ +package ru.charm.back.controller.filter; + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +import static jakarta.servlet.RequestDispatcher.ERROR_EXCEPTION; + +@WebFilter(value = "/*", dispatcherTypes = DispatcherType.ERROR) +public class ErrorFilter implements Filter { + public static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class); + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) servletRequest; + HttpServletResponse res = (HttpServletResponse) servletResponse; + + Throwable trowable = (Throwable) req.getAttribute(ERROR_EXCEPTION); + + if (res.getStatus() >= 500) { + logger.error("Error 500", trowable); + } else { + logger.warn("Exception code {}", res.getStatus()); + } + + filterChain.doFilter(servletRequest, servletResponse); + } +}