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);
+ }
+}