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!
+
+
+
+
+
+
+
+<%@ 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) {