diff --git a/lib/jakarta.servlet.jsp.jstl-2.0.0.jar b/lib/jakarta.servlet.jsp.jstl-2.0.0.jar new file mode 100644 index 0000000..92712b0 Binary files /dev/null and b/lib/jakarta.servlet.jsp.jstl-2.0.0.jar differ diff --git a/lib/jakarta.servlet.jsp.jstl-api-3.0.0.jar b/lib/jakarta.servlet.jsp.jstl-api-3.0.0.jar new file mode 100644 index 0000000..ec63e6a Binary files /dev/null and b/lib/jakarta.servlet.jsp.jstl-api-3.0.0.jar differ diff --git a/lib/servlet-api.jar b/lib/servlet-api.jar new file mode 100644 index 0000000..712d3fa Binary files /dev/null and b/lib/servlet-api.jar differ diff --git a/resources/WEB-INF/jsp/footer.html b/resources/WEB-INF/jsp/footer.html new file mode 100644 index 0000000..6bdce1e --- /dev/null +++ b/resources/WEB-INF/jsp/footer.html @@ -0,0 +1,5 @@ + +
+
+

All rights reserved 2024

+
\ No newline at end of file diff --git a/resources/WEB-INF/jsp/header.jsp b/resources/WEB-INF/jsp/header.jsp new file mode 100644 index 0000000..57a80bb --- /dev/null +++ b/resources/WEB-INF/jsp/header.jsp @@ -0,0 +1,5 @@ +<%@ page contentType="text/html;charset=UTF-8" %> +
+

Charm <3

+
+
\ No newline at end of file diff --git a/resources/WEB-INF/jsp/profile.jsp b/resources/WEB-INF/jsp/profile.jsp new file mode 100644 index 0000000..ab56e13 --- /dev/null +++ b/resources/WEB-INF/jsp/profile.jsp @@ -0,0 +1,60 @@ +<%@ page contentType="text/html;charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + Charm Profile + + +<%@ include file="header.jsp" %> +
+ +

Hello new user!

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

Email

Name

Surname

About

Gender

+ +
+ +
+ + +
+ + + +
+
+
+<%@ include file="footer.html" %> + + \ No newline at end of file diff --git a/resources/WEB-INF/web.xml b/resources/WEB-INF/web.xml new file mode 100644 index 0000000..2a3867d --- /dev/null +++ b/resources/WEB-INF/web.xml @@ -0,0 +1,23 @@ + + + + diff --git a/resources/index.html b/resources/index.html new file mode 100644 index 0000000..70cb85a --- /dev/null +++ b/resources/index.html @@ -0,0 +1,26 @@ + + + + + + Charm + + +

Hello from Charm!

+ + diff --git a/src/ru/charm/back/CharmBackClientRunner.java b/src/ru/charm/back/CharmBackClientRunner.java deleted file mode 100644 index a21d9b4..0000000 --- a/src/ru/charm/back/CharmBackClientRunner.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.charm.back; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.util.Scanner; - -public class CharmBackClientRunner { - public static void main(String[] args) throws IOException { - try ( - Socket socket = new Socket("localhost", 8080); - DataInputStream rsStream = new DataInputStream(socket.getInputStream()); - DataOutputStream rqStream = new DataOutputStream(socket.getOutputStream()); - Scanner scanner = new Scanner(System.in) - ) { - while (scanner.hasNextLine()) { - System.out.println("Client: "); - String request = scanner.nextLine(); - rqStream.writeUTF(request); - - String response = rsStream.readUTF(); - System.out.println("Server: " + response); - } - } - } -} diff --git a/src/ru/charm/back/CharmBackServerRunner.java b/src/ru/charm/back/CharmBackServerRunner.java deleted file mode 100644 index aacc385..0000000 --- a/src/ru/charm/back/CharmBackServerRunner.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.charm.back; - -import ru.charm.back.controller.ProfileController; -import ru.charm.back.dao.ProfileDao; -import ru.charm.back.model.Command; -import ru.charm.back.service.ProfileService; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -public class CharmBackServerRunner { - public static void main(String[] args) throws IOException { - ProfileController controller = new ProfileController(new ProfileService(new ProfileDao())); - - try ( - ServerSocket serverSocket = new ServerSocket(8080); - Socket socket = serverSocket.accept(); - DataInputStream rqStream = new DataInputStream(socket.getInputStream()); - DataOutputStream rsStream = new DataOutputStream(socket.getOutputStream()); - ) { - String request = rqStream.readUTF(); - String response; - - while (!request.equals("stop")) { - if (request.startsWith(Command.SAVE.getPrefix())) { - response = controller.save(request.split("save ")[1]); - } else if (request.startsWith(Command.FIND_BY_ID.getPrefix())) { - response = controller.findById(request.split("findById ")[1]); - } else if (request.startsWith(Command.FIND_ALL.getPrefix())) { - response = controller.findAll(); - } else if (request.startsWith(Command.UPDATE.getPrefix())) { - response = controller.update(request.split("update ")[1]); - } else if (request.startsWith(Command.DELETE.getPrefix())) { - response = controller.delete(request.split("delete ")[1]); - } else { - response = "Unsupported method"; - } - - rsStream.writeUTF(response); - request = rqStream.readUTF(); - - System.out.println("Server: " + request); - } - } - } -} diff --git a/src/ru/charm/back/controller/ForwardController.java b/src/ru/charm/back/controller/ForwardController.java new file mode 100644 index 0000000..950f66a --- /dev/null +++ b/src/ru/charm/back/controller/ForwardController.java @@ -0,0 +1,19 @@ +package ru.charm.back.controller; + + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/forward") +public class ForwardController extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.sendRedirect("https://ya.ru"); + } + +} diff --git a/src/ru/charm/back/controller/LikeController.java b/src/ru/charm/back/controller/LikeController.java new file mode 100644 index 0000000..715cb42 --- /dev/null +++ b/src/ru/charm/back/controller/LikeController.java @@ -0,0 +1,33 @@ +package ru.charm.back.controller; + +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/like") +public class LikeController extends HttpServlet { + @Override + public void init(ServletConfig config) throws ServletException { + System.out.println("LikeController init" + config.getServletName() ); + super.init(config); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("text/plain"); + System.out.println("User-Agent: " + req.getHeader("User-Agent")); + resp.getWriter().write("Like count: 101"); + resp.setHeader("X-Custom-Header", "Zalupa"); + } + + @Override + public void destroy() { + System.out.println("LikeController destroy"); + super.destroy(); + } +} diff --git a/src/ru/charm/back/controller/ProfileController.java b/src/ru/charm/back/controller/ProfileController.java index 47ef62f..227039e 100644 --- a/src/ru/charm/back/controller/ProfileController.java +++ b/src/ru/charm/back/controller/ProfileController.java @@ -1,112 +1,72 @@ package ru.charm.back.controller; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import ru.charm.back.model.Gender; import ru.charm.back.model.Profile; import ru.charm.back.service.ProfileService; +import java.io.IOException; import java.util.Optional; -public class ProfileController { - private final ProfileService service; +@WebServlet("/profile") +public class ProfileController extends HttpServlet { + private final ProfileService service = ProfileService.getInstance(); - public ProfileController(ProfileService service) { - this.service = service; + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String sId = req.getParameter("id"); + String forwardUri = "/notFound"; + if (sId != null) { + Optional profile = service.findById(Long.parseLong(sId)); + if (profile.isPresent()) { + req.setAttribute("profile", profile.get()); + forwardUri = "/WEB-INF/jsp/profile.jsp"; + } + } + req.getRequestDispatcher(forwardUri).forward(req, resp); } - public String work(String request) { - return ""; + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Profile profile = getProfile(req); + service.save(profile); + resp.sendRedirect(String.format("/profile?id=%s", profile.getId())); } - public String save(String save) { - String[] params = save.split(","); - - if (params.length != 4) { - return "Bad request"; - } - - Profile profile = new Profile(); - profile.setEmail(params[0]); - profile.setName(params[1]); - profile.setSurname(params[2]); - profile.setAbout(params[3]); - - return service.save(profile).toString(); - } - - public String findById(String request) { - String[] params = request.split(","); - - if (params.length != 1) { - return "Bad request"; - } - - long id; - try { - id = Long.parseLong(params[0]); - } catch (NumberFormatException e) { - return "Bad request"; - } - - Optional maybeProfile = service.findById(id); - - if (maybeProfile.isEmpty()) { - return "Not found"; - } - - return maybeProfile.get().toString(); - } - - public String findAll() { - return service.findAll().toString(); - } - - public String update(String request) { - String[] params = request.split(","); - - if (params.length != 5) { - return "Bad request"; - } - - long id; - try { - id = Long.parseLong(params[0]); - } catch (NumberFormatException e) { - return "Bad request"; - } - - Profile profile = new Profile(); - profile.setId(id); - profile.setEmail(params[1]); - profile.setName(params[2]); - profile.setSurname(params[3]); - profile.setAbout(params[4]); - + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Profile profile = getProfile(req); service.update(profile); + resp.sendRedirect(String.format("/profile?id=%s", profile.getId())); - return "Update success\n" + profile.toString(); } - public String delete(String request) { - String[] params = request.split(","); + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String sId = req.getParameter("id"); + if (!sId.isBlank()) { + service.delete(Long.parseLong(sId)); + } + resp.sendRedirect("/registration"); + } - if (params.length != 1) { - return "Bad request"; + private Profile getProfile(HttpServletRequest req) { + Profile profile = new Profile(); + String sId = req.getParameter("id"); + + if (!sId.isBlank()) { + profile.setId(Long.parseLong(sId)); } - long id; - try { - id = Long.parseLong(params[0]); - } catch (NumberFormatException e) { - return "Bad request"; - } - - Optional maybeProfile = service.findById(id); - - if (maybeProfile.isEmpty()) { - return "Not found"; - } - - service.delete(id); - - return "Delete success"; + profile.setEmail(req.getParameter("email")); + profile.setName(req.getParameter("name")); + profile.setSurname(req.getParameter("surname")); + profile.setAbout(req.getParameter("about")); + profile.setGender(Gender.valueOf(req.getParameter("gender"))); + return profile; } } diff --git a/src/ru/charm/back/controller/RegistrationController.java b/src/ru/charm/back/controller/RegistrationController.java new file mode 100644 index 0000000..cc27005 --- /dev/null +++ b/src/ru/charm/back/controller/RegistrationController.java @@ -0,0 +1,19 @@ +package ru.charm.back.controller; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import ru.charm.back.model.Profile; + +import java.io.IOException; + +@WebServlet("/registration") +public class RegistrationController extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.setAttribute("profile", new Profile()); + req.getRequestDispatcher("/WEB-INF/jsp/profile.jsp").forward(req, resp); + } +} diff --git a/src/ru/charm/back/controller/filter/HiddenHttpMethodFilter.java b/src/ru/charm/back/controller/filter/HiddenHttpMethodFilter.java new file mode 100644 index 0000000..d45302f --- /dev/null +++ b/src/ru/charm/back/controller/filter/HiddenHttpMethodFilter.java @@ -0,0 +1,54 @@ +package ru.charm.back.controller.filter; + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; +import ru.charm.back.model.Gender; + +import java.io.IOException; +import java.util.Locale; + +@WebFilter("/*") +public class HiddenHttpMethodFilter implements Filter { + public static final String METHOD_PARAM = "_method"; + + @Override + public void init(FilterConfig filterConfig) { + ServletContext servletContext = filterConfig.getServletContext(); + if (servletContext.getAttribute("genders") == null) { + servletContext.setAttribute("genders", Gender.values()); + } + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + String paramValue = request.getParameter(METHOD_PARAM); + + if ("POST".equals(request.getMethod()) && paramValue != null && !paramValue.isBlank()) { + String method = paramValue.toUpperCase(Locale.ENGLISH); + HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method); + filterChain.doFilter(wrapper, response); + } else { + filterChain.doFilter(request, response); + } + } + + + public static class HttpMethodRequestWrapper extends HttpServletRequestWrapper { + public final String method; + + public HttpMethodRequestWrapper(HttpServletRequest request, String method) { + super(request); + this.method = method; + } + + @Override + public String getMethod() { + return method; + } + } +} diff --git a/src/ru/charm/back/dao/ProfileDao.java b/src/ru/charm/back/dao/ProfileDao.java index f0f61b8..437c908 100644 --- a/src/ru/charm/back/dao/ProfileDao.java +++ b/src/ru/charm/back/dao/ProfileDao.java @@ -1,5 +1,6 @@ package ru.charm.back.dao; +import ru.charm.back.model.Gender; import ru.charm.back.model.Profile; import java.util.ArrayList; @@ -12,9 +13,31 @@ public class ProfileDao { private final ConcurrentHashMap storage; private final AtomicLong idStorage; - public ProfileDao() { + private static final ProfileDao INSTANCE = new ProfileDao(); + + private ProfileDao() { this.storage = new ConcurrentHashMap<>(); - this.idStorage = new AtomicLong(); + Profile profile = new Profile(); + profile.setId(1L); + profile.setEmail("ivanov@mail.ru"); + profile.setName("Ivan"); + profile.setSurname("Ivanov"); + profile.setAbout("I am QA"); + profile.setGender(Gender.MALE); + this.storage.put(1L, profile); + Profile profile1 = new Profile(); + profile1.setId(2L); + profile1.setEmail("sidorova@mail.ru"); + profile1.setName("Elena"); + profile1.setSurname("Sidorova"); + profile1.setAbout("I am Java Dev"); + profile1.setGender(Gender.FEMALE); + this.storage.put(2L, profile1); + this.idStorage = new AtomicLong(2L); + } + + public static ProfileDao getInstance() { + return INSTANCE; } public Profile save(Profile profile) { diff --git a/src/ru/charm/back/model/Gender.java b/src/ru/charm/back/model/Gender.java new file mode 100644 index 0000000..97a65a1 --- /dev/null +++ b/src/ru/charm/back/model/Gender.java @@ -0,0 +1,6 @@ +package ru.charm.back.model; + +public enum Gender { + MALE, + FEMALE +} diff --git a/src/ru/charm/back/model/Profile.java b/src/ru/charm/back/model/Profile.java index 3f6236a..73a0198 100644 --- a/src/ru/charm/back/model/Profile.java +++ b/src/ru/charm/back/model/Profile.java @@ -6,6 +6,7 @@ public class Profile { private String name; private String surname; private String about; + private Gender gender; public Long getId() { return id; @@ -47,6 +48,14 @@ public class Profile { this.about = about; } + public Gender getGender() { + return gender; + } + + public void setGender(Gender gender) { + this.gender = gender; + } + @Override public String toString() { return "Profile{" + diff --git a/src/ru/charm/back/service/ProfileService.java b/src/ru/charm/back/service/ProfileService.java index 1089878..d1a8c9e 100644 --- a/src/ru/charm/back/service/ProfileService.java +++ b/src/ru/charm/back/service/ProfileService.java @@ -7,10 +7,12 @@ import java.util.List; import java.util.Optional; public class ProfileService { - private ProfileDao dao; + private static final ProfileService INSTANCE = new ProfileService(); + private final ProfileDao dao = ProfileDao.getInstance(); - public ProfileService(ProfileDao dao) { - this.dao = dao; + + public static ProfileService getInstance() { + return INSTANCE; } public Profile save(Profile profile) {