From 3072446df07740cf0ca5c871c5e869710cde2ea3 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 17:53:54 +0100 Subject: [PATCH] feat: add jakarta-todo-jsp implementation --- FyneApp.toml | 6 + Icon.png | Bin 0 -> 2375 bytes cmd/jws/projects/jakarta-jsp-todo/Dockerfile | 62 +++++ .../jakarta-jsp-todo/docker-compose.yml | 50 ++++ cmd/jws/projects/jakarta-jsp-todo/init.sql | 17 ++ cmd/jws/projects/jakarta-jsp-todo/pom.xml | 89 +++++++ cmd/jws/projects/jakarta-jsp-todo/server.xml | 33 +++ .../main/java/com/todoapp/dao/TodoDAO.java | 111 ++++++++ .../main/java/com/todoapp/dao/UserDAO.java | 112 ++++++++ .../src/main/java/com/todoapp/model/Todo.java | 99 +++++++ .../src/main/java/com/todoapp/model/User.java | 98 +++++++ .../java/com/todoapp/servlet/AuthServlet.java | 154 +++++++++++ .../java/com/todoapp/servlet/TodoServlet.java | 182 +++++++++++++ .../java/com/todoapp/servlet/UserServlet.java | 73 ++++++ .../java/com/todoapp/util/AuthFilter.java | 44 ++++ .../java/com/todoapp/util/HibernateUtil.java | 109 ++++++++ .../src/main/liberty/config/server.xml | 34 +++ .../main/resources/META-INF/persistence.xml | 20 ++ .../src/main/resources/hibernate.cfg.xml | 26 ++ .../src/main/webapp/WEB-INF/web.xml | 27 ++ .../src/main/webapp/css/style.css | 246 ++++++++++++++++++ .../src/main/webapp/error.jsp | 23 ++ .../src/main/webapp/login.jsp | 45 ++++ .../src/main/webapp/register.jsp | 49 ++++ .../src/main/webapp/todo-form.jsp | 41 +++ .../src/main/webapp/todo-list.jsp | 80 ++++++ 26 files changed, 1830 insertions(+) create mode 100644 FyneApp.toml create mode 100644 Icon.png create mode 100644 cmd/jws/projects/jakarta-jsp-todo/Dockerfile create mode 100644 cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/init.sql create mode 100644 cmd/jws/projects/jakarta-jsp-todo/server.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/User.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/liberty/config/server.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/resources/hibernate.cfg.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp diff --git a/FyneApp.toml b/FyneApp.toml new file mode 100644 index 0000000..ef1a5d8 --- /dev/null +++ b/FyneApp.toml @@ -0,0 +1,6 @@ +[Default] +Icon = "Icon.png" +Name = "JavaWebStarter" +ID = "com.hegenberg.app" +Version = "0.0.1" +Build = 1 diff --git a/Icon.png b/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c666c8b562ce1ed8dc2a5dcaaded184093088a GIT binary patch literal 2375 zcmZuzdpwkB8@}I}mpNz{6XP^8z9msE6GHor*4 zNG(O0{W=iJOrkqOb9_`R{`NB?CEKvej8tPe@;{=086RBwwRAz|rO{Y~i!tr7qC#pL|dpn^8@ z=E4o9u_J8HOQu0RINzu1NVG2e*_bj#vGs<5Ji1V+bv%n$$2r6O?;IM7 zw*Q3*VRuK0V#m+Tx9{VG?}ga#kv!M9^RCx?4ick6W-60zS2RTP2wdBG#oeCqZM0JK z<{ujj3vT=w!HKue>)}O*-0#k}-R)fWxZJpQIo;ew*8a_#>o*QOi@HbM-13<1r1B}L z4$X?+H{v`ci{JQ!cf;1cN^BZ;ckdH}1@|5GmkS@XRGi5)CKNw&jAab@z8d=dU`NK( zZ-xJC7s;(MKBhEnbsLGESUTO|`_rGxqWfR8s2aLxo&CD{5<$bHQTG*(xnrnCrNXu8 z#oQ*96$>eN)4jh5-O0S9XsT5C^4dLo=B7Ot&)h|Ausf=%D{AtuYC6r-U@QJm9dx=3 zCik{B&N#_QO2!LqaF&zu6jwXP{JqHu?HQ^LuLRt#$qIh(IW9s+R~(2~$whiI7rt{2 zz#0V$E@w~DnEM^1_;u6*s1dcCJ4O@zl`2_!;>$*gv)lwGa-#G%6O`>iYNJ-GUZtM| z|EyMlf|I4Ij2hMrGxfq=ir<*si9{=(pAzq7qS9Up@((o|wj~G3N7mpjbRY%hXxMlN zA@2xPDLKUOp$W0`uGpR|9p*;9@~SQiTOtP84I=Eaz9JEGaOF<$>oxd`_x;NmF5OY+`C%)+mL;1LWK;8h7XY~k*RIy$#amz}m-bt1hQ`WLy2KFl zo`Iw@P%D89gFc|VQA$_3LKs5@ne#SCwbE83%uT~Yiv{2!A`E}^-f_FGspQecZ*`#8 z)#G_Lf;|sCU2VV+gf{ivzxeYa892u2_0!#cWr*+-Ke>Sn5t^l(`Ze{NMHumYEg!(@ zDA>kjqW3@AADwENJc)#9SteZXFVRBUZNN~=(qm}ByU$OF{u*KocW}RfF+W#wD2)P! zw}KG|eUYX_VU`0D3M>SWWSg-*7p8e89|U%*!5ukzPhg3g0a>8}KA>US3EB2a>_k~X z2fot64sE0@+a}WgpiygrTUJ%A(eBBop^$){4P_SkKXawIqhwo z@ro4>KfdUYq-SjXYqtfmMEBlG)l?CmhFOTjw)29Ypwn*6%n z4&Nw#d5#4zSQRmobM{=^hb*ue2HQy4#x_J2+3q}!L;(Cf3kM#Ya*x8NqM%)d_xZ-9 zReykzr@N0~ZX|mveM5Z;(??B@`Dg~2ezpWjU5PnSQ26k)yCr^D$4xt5OK=VavvPdV zn$Rc{S1eihh{Zt2Oo6Q{NX5rpz1om;Ng$$k)^Wh-1or5Q7^N!MbLrS5KA*N zU|7}@&7f$ln?OCv<>u~LI7`$cBqF~KEEI>2f~RtImG3NQA0E0z;$fQkoWrSry{wM0 zK^m*3T8qo^(?SG*M1Fh^uoxjl^c@KI^$xi$Y!GQ0`1$M4f$AG!9ak9 z1vVL)P!d9y6RE~4_Fa&mL{4RYoI5FxZpeE7Z~q|NEscE`9<>t0NOT${N|flqx@V)_ zCNjx^7Hot*Uzm3xEHDViUh)jNH-}nds{G0nf}AAv96=i0NC8-{b@zmQ@AQwlg3+RB z*Iy{8wd_;(bW@?P`plN@iT*d1Y@~f*jF#9#^n&yLCi>j)^+X}0HGi!d%An`#iM*c- z^oD!Y+n9`aFRaA}S}%7&R^9G+S3B`6xw$H)`bfd1?sVsb8I{P5wHLQaL7AP@-oDdi z^xCSP9b3{SE6&$@Zcgv#=3It2<%b)EwWG<|K4j_G)x^1(8C!KMi7QW>d${GP+Eg}j zyyx<9gM3HZrYUzj)_>F&ynnaKY4YjD;jY!=Ktjh d5l*yAg==Q5+oTg*Q}#I_`FaL;)Cfgc{{^bg+hqU% literal 0 HcmV?d00001 diff --git a/cmd/jws/projects/jakarta-jsp-todo/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/Dockerfile new file mode 100644 index 0000000..8889dbd --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/Dockerfile @@ -0,0 +1,62 @@ +# # Dockerfile für OpenLiberty +# FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +# COPY --chown=1001:0 /src/main/liberty/config /config +# +# # PostgreSQL JDBC-Treiber laden +# # RUN mkdir -p ./lib && \ +# # curl -o ./lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar +# +# RUN curl -o /config/lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar +# +# RUN features.sh +# +# COPY --chown=1001:0 target/*.war /config/apps +# +# RUN configure.sh +# +# # # Arbeitsverzeichnis setzen +# # WORKDIR /opt/ol/wlp/usr/servers/defaultServer +# # +# # # Notwendige Dateien kopieren +# # COPY target/todo-app.war ./apps/ +# # # COPY server.xml ./ +# # +# # # PostgreSQL JDBC-Treiber laden +# # RUN mkdir -p ./lib && \ +# # curl -o ./lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar +# # +# # # OpenLiberty starten +# # CMD ["/opt/ol/wlp/bin/server", "run", "defaultServer"] + +# FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +# +# # COPY --chown=1001:0 /src/main/liberty/config /config +# # +# # COPY --chown=1001:0 /src/main/liberty/config/server.xml /opt/ol/wlp/usr/servers/defaultServer/ +# +# RUN chmod 644 /opt/ol/wlp/usr/servers/defaultServer/server.xml +# +# +# # Verzeichnis erstellen und PostgreSQL JDBC-Treiber herunterladen +# RUN mkdir -p /config/lib && \ +# curl -o /config/lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar +# +# RUN features.sh +# +# COPY --chown=1001:0 target/*.war /config/apps +# +# RUN configure.sh + +FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi + +COPY --chown=1001:0 /src/main/liberty/config /config +# # Verzeichnis erstellen und PostgreSQL JDBC-Treiber herunterladen +RUN mkdir -p /config/lib && \ + curl -o /config/lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar + +RUN features.sh + +COPY --chown=1001:0 target/*.war /config/apps + +RUN configure.sh + diff --git a/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml b/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml new file mode 100644 index 0000000..df9af86 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml @@ -0,0 +1,50 @@ +version: "3.8" + +services: + postgres: + image: postgres:15 + networks: + - my_network + container_name: postgres_db + restart: always + environment: + POSTGRES_DB: todo_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 10 + + openliberty: + build: . + container_name: openliberty_app + networks: + - my_network + restart: always + ports: + - "9080:9080" + - "9443:9443" + depends_on: + - postgres + environment: + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_DB=todo_db + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + volumes: + - ./src/main/liberty/config/server.xml:/config/server.xml + # - ./src/main/liberty/config/server.xml:/opt/ol/wlp/usr/servers/defaultServer/server.xml + +volumes: + postgres_data: +networks: + my_network: + driver: bridge diff --git a/cmd/jws/projects/jakarta-jsp-todo/init.sql b/cmd/jws/projects/jakarta-jsp-todo/init.sql new file mode 100644 index 0000000..9d98295 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/init.sql @@ -0,0 +1,17 @@ +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + username VARCHAR(255) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL +); + +CREATE TABLE todos ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description VARCHAR(1000), + target_date DATE, + completed BOOLEAN, + user_id BIGINT NOT NULL, + FOREIGN KEY (user_id) REFERENCES users(id) +); + diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index e69de29..3158166 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + com.todoapp + todo-app + 1.0-SNAPSHOT + war + + + UTF-8 + 17 + 17 + 10.0.0 + 6.2.5.Final + 42.6.0 + + + + + + jakarta.platform + jakarta.jakartaee-api + ${jakartaee.version} + provided + + + + + org.hibernate.orm + hibernate-core + ${hibernate.version} + + + + + org.postgresql + postgresql + ${postgresql.version} + + + + + jakarta.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + 3.0.0 + + + org.glassfish.web + jakarta.servlet.jsp.jstl + 3.0.1 + + + + org.hibernate + hibernate-core + 6.3.1.Final + + + + at.favre.lib + bcrypt + 0.10.2 + + + + + todo-app + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + + io.openliberty.tools + liberty-maven-plugin + 3.7.1 + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/server.xml b/cmd/jws/projects/jakarta-jsp-todo/server.xml new file mode 100644 index 0000000..92a8bd8 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/server.xml @@ -0,0 +1,33 @@ + + + + + servlet-6.0 + pages-3.1 + jdbc-4.2 + jndi-1.0 + monitor-1.0 + + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java new file mode 100644 index 0000000..82c6107 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java @@ -0,0 +1,111 @@ +package com.todoapp.dao; + +import com.todoapp.model.Todo; +import com.todoapp.util.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +import java.util.List; + +public class TodoDAO { + + public void saveTodo(Todo todo) { + Transaction transaction = null; + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + transaction = session.beginTransaction(); + session.persist(todo); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void updateTodo(Todo todo) { + Transaction transaction = null; + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + transaction = session.beginTransaction(); + session.merge(todo); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void deleteTodo(Long id) { + Transaction transaction = null; + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + transaction = session.beginTransaction(); + Todo todo = session.get(Todo.class, id); + if (todo != null) { + session.remove(todo); + } + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public Todo getTodoById(Long id) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + return session.get(Todo.class, id); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public List getAllTodos() { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + return session.createQuery("FROM Todo", Todo.class).list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public List getTodosByUser(Long userId) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.id = :userId ORDER BY t.completed, t.targetDate", Todo.class); + query.setParameter("userId", userId); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public List getCompletedTodosByUser(Long userId) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.id = :userId AND t.completed = true", Todo.class); + query.setParameter("userId", userId); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public List getIncompleteTodosByUser(Long userId) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.id = :userId AND t.completed = false ORDER BY t.targetDate", Todo.class); + query.setParameter("userId", userId); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java new file mode 100644 index 0000000..eba60fc --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java @@ -0,0 +1,112 @@ +package com.todoapp.dao; + +import com.todoapp.model.User; +import com.todoapp.util.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +import java.util.List; +import java.util.Optional; + +public class UserDAO { + + public void saveUser(User user) { + Transaction transaction = null; + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + transaction = session.beginTransaction(); + session.persist(user); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void updateUser(User user) { + Transaction transaction = null; + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + transaction = session.beginTransaction(); + session.merge(user); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void deleteUser(Long id) { + Transaction transaction = null; + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + transaction = session.beginTransaction(); + User user = session.get(User.class, id); + if (user != null) { + session.remove(user); + } + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public User getUserById(Long id) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + return session.get(User.class, id); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public Optional getUserByUsername(String username) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query query = session.createQuery("FROM User WHERE username = :username", User.class); + query.setParameter("username", username); + User user = query.uniqueResult(); + return Optional.ofNullable(user); + } catch (Exception e) { + e.printStackTrace(); + return Optional.empty(); + } + } + + public List getAllUsers() { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + return session.createQuery("FROM User", User.class).list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public boolean usernameExists(String username) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query query = session.createQuery( + "SELECT COUNT(u) FROM User u WHERE u.username = :username", Long.class); + query.setParameter("username", username); + return query.uniqueResult() > 0; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean emailExists(String email) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query query = session.createQuery( + "SELECT COUNT(u) FROM User u WHERE u.email = :email", Long.class); + query.setParameter("email", email); + return query.uniqueResult() > 0; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java new file mode 100644 index 0000000..a240a0c --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java @@ -0,0 +1,99 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.time.LocalDate; + +@Entity +@Table(name = "todos") +public class Todo implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(length = 1000) + private String description; + + @Column(name = "target_date") + private LocalDate targetDate; + + private boolean completed; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + // Konstruktoren + public Todo() { + } + + public Todo(String title, String description, LocalDate targetDate, boolean completed) { + this.title = title; + this.description = description; + this.targetDate = targetDate; + this.completed = completed; + } + + // Getter und Setter + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LocalDate getTargetDate() { + return targetDate; + } + + public void setTargetDate(LocalDate targetDate) { + this.targetDate = targetDate; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Override + public String toString() { + return "Todo{" + + "id=" + id + + ", title='" + title + '\'' + + ", targetDate=" + targetDate + + ", completed=" + completed + + '}'; + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/User.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/User.java new file mode 100644 index 0000000..3938f64 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/User.java @@ -0,0 +1,98 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "users") +public class User implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true) + private String username; + + @Column(nullable = false) + private String password; + + @Column(nullable = false) + private String email; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + private List todos = new ArrayList<>(); + + // Konstruktoren + public User() { + } + + public User(String username, String password, String email) { + this.username = username; + this.password = password; + this.email = email; + } + + // Getter und Setter + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public List getTodos() { + return todos; + } + + public void setTodos(List todos) { + this.todos = todos; + } + + // Hilfsmethoden + public void addTodo(Todo todo) { + todos.add(todo); + todo.setUser(this); + } + + public void removeTodo(Todo todo) { + todos.remove(todo); + todo.setUser(null); + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java new file mode 100644 index 0000000..ad24e4c --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java @@ -0,0 +1,154 @@ +package com.todoapp.servlet; + +import at.favre.lib.crypto.bcrypt.BCrypt; +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +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 jakarta.servlet.http.HttpSession; + +import java.io.IOException; +import java.util.Optional; + +@WebServlet("/auth/*") +public class AuthServlet extends HttpServlet { + + private final UserDAO userDAO = new UserDAO(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String action = request.getPathInfo(); + + if (action == null) { + action = ""; + } + + switch (action) { + case "/register": + showRegisterForm(request, response); + break; + case "/logout": + logout(request, response); + break; + default: + showLoginForm(request, response); + break; + } + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String action = request.getPathInfo(); + + if (action == null) { + action = ""; + } + + switch (action) { + case "/register": + registerUser(request, response); + break; + case "/login": + loginUser(request, response); + break; + default: + response.sendRedirect(request.getContextPath() + "/auth/login"); + break; + } + } + + private void showLoginForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + private void showRegisterForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.getRequestDispatcher("/register.jsp").forward(request, response); + } + + private void registerUser(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String confirmPassword = request.getParameter("confirmPassword"); + String email = request.getParameter("email"); + + if (username == null || password == null || email == null || username.trim().isEmpty() || password.trim().isEmpty() + || email.trim().isEmpty()) { + request.setAttribute("errorMessage", "Alle Felder müssen ausgefüllt werden"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + if (!password.equals(confirmPassword)) { + request.setAttribute("errorMessage", "Passwörter stimmen nicht überein"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + if (userDAO.usernameExists(username)) { + request.setAttribute("errorMessage", "Benutzername ist bereits vergeben"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + if (userDAO.emailExists(email)) { + request.setAttribute("errorMessage", "E-Mail-Adresse ist bereits registriert"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + // Hash password + String hashedPassword = BCrypt.withDefaults().hashToString(12, password.toCharArray()); + + User user = new User(username, hashedPassword, email); + userDAO.saveUser(user); + + request.setAttribute("successMessage", "Registrierung erfolgreich. Bitte melden Sie sich an."); + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + private void loginUser(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + + if (username == null || password == null || username.trim().isEmpty() || password.trim().isEmpty()) { + request.setAttribute("errorMessage", "Benutzername und Passwort sind erforderlich"); + request.getRequestDispatcher("/login.jsp").forward(request, response); + return; + } + + Optional optionalUser = userDAO.getUserByUsername(username); + + if (optionalUser.isPresent()) { + User user = optionalUser.get(); + BCrypt.Result result = BCrypt.verifyer().verify(password.toCharArray(), user.getPassword()); + + if (result.verified) { + HttpSession session = request.getSession(); + session.setAttribute("user", user); + session.setAttribute("userId", user.getId()); + session.setAttribute("username", user.getUsername()); + + response.sendRedirect(request.getContextPath() + "/todos"); + return; + } + } + + request.setAttribute("errorMessage", "Ungültiger Benutzername oder Passwort"); + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + private void logout(HttpServletRequest request, HttpServletResponse response) throws IOException { + HttpSession session = request.getSession(false); + if (session != null) { + session.invalidate(); + } + response.sendRedirect(request.getContextPath() + "/auth/login"); + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java new file mode 100644 index 0000000..5426464 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java @@ -0,0 +1,182 @@ +package com.todoapp.servlet; + +import com.todoapp.dao.TodoDAO; +import com.todoapp.dao.UserDAO; +import com.todoapp.model.Todo; +import com.todoapp.model.User; +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 jakarta.servlet.http.HttpSession; + +import java.io.IOException; +import java.time.LocalDate; +import java.util.List; + +@WebServlet("/todos/*") +public class TodoServlet extends HttpServlet { + + private final TodoDAO todoDAO = new TodoDAO(); + private final UserDAO userDAO = new UserDAO(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = request.getSession(false); + if (session == null || session.getAttribute("userId") == null) { + response.sendRedirect(request.getContextPath() + "/auth/login"); + return; + } + + String action = request.getPathInfo(); + + if (action == null) { + action = "/list"; + } + + switch (action) { + case "/new": + showNewForm(request, response); + break; + case "/edit": + showEditForm(request, response); + break; + case "/delete": + deleteTodo(request, response); + break; + case "/complete": + completeTodo(request, response); + break; + default: + listTodos(request, response); + break; + } + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = request.getSession(false); + if (session == null || session.getAttribute("userId") == null) { + response.sendRedirect(request.getContextPath() + "/auth/login"); + return; + } + + String action = request.getPathInfo(); + + if (action == null) { + action = "/insert"; + } + + switch (action) { + case "/insert": + insertTodo(request, response); + break; + case "/update": + updateTodo(request, response); + break; + default: + response.sendRedirect(request.getContextPath() + "/todos"); + break; + } + } + + private void listTodos(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + List todos = todoDAO.getTodosByUser(userId); + request.setAttribute("todos", todos); + request.getRequestDispatcher("/todo-list.jsp").forward(request, response); + } + + private void showNewForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.getRequestDispatcher("/todo-form.jsp").forward(request, response); + } + + private void showEditForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo == null || !todo.getUser().getId().equals(userId)) { + response.sendRedirect(request.getContextPath() + "/todos"); + return; + } + + request.setAttribute("todo", todo); + request.getRequestDispatcher("/todo-form.jsp").forward(request, response); + } + + private void insertTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + User user = userDAO.getUserById(userId); + + if (user == null) { + response.sendRedirect(request.getContextPath() + "/auth/login"); + return; + } + + String title = request.getParameter("title"); + String description = request.getParameter("description"); + LocalDate targetDate = LocalDate.parse(request.getParameter("targetDate")); + + Todo todo = new Todo(title, description, targetDate, false); + todo.setUser(user); + + todoDAO.saveTodo(todo); + response.sendRedirect(request.getContextPath() + "/todos"); + } + + private void updateTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo == null || !todo.getUser().getId().equals(userId)) { + response.sendRedirect(request.getContextPath() + "/todos"); + return; + } + + String title = request.getParameter("title"); + String description = request.getParameter("description"); + LocalDate targetDate = LocalDate.parse(request.getParameter("targetDate")); + + todo.setTitle(title); + todo.setDescription(description); + todo.setTargetDate(targetDate); + + todoDAO.updateTodo(todo); + response.sendRedirect(request.getContextPath() + "/todos"); + } + + private void deleteTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo != null && todo.getUser().getId().equals(userId)) { + todoDAO.deleteTodo(todoId); + } + + response.sendRedirect(request.getContextPath() + "/todos"); + } + + private void completeTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo != null && todo.getUser().getId().equals(userId)) { + todo.setCompleted(!todo.isCompleted()); + todoDAO.updateTodo(todo); + } + + response.sendRedirect(request.getContextPath() + "/todos"); + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java new file mode 100644 index 0000000..c7806c4 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java @@ -0,0 +1,73 @@ +package com.todoapp.servlet; + +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +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; +import java.util.List; +import java.util.Optional; + +@WebServlet("/users") +public class UserServlet extends HttpServlet { + private final UserDAO userDAO = new UserDAO(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String idParam = request.getParameter("id"); + if (idParam != null) { + Long id = Long.parseLong(idParam); + User user = userDAO.getUserById(id); + request.setAttribute("user", user); + } else { + List users = userDAO.getAllUsers(); + request.setAttribute("users", users); + } + request.getRequestDispatcher("/user-list.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String email = request.getParameter("email"); + + if (username == null || password == null || email == null || userDAO.usernameExists(username)) { + response.sendRedirect("error.jsp?message=Invalid%20input%20or%20username%20exists"); + return; + } + User user = new User(username, password, email); + userDAO.saveUser(user); + response.sendRedirect("users"); + } + + @Override + protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Long id = Long.parseLong(request.getParameter("id")); + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String email = request.getParameter("email"); + + Optional userOptional = userDAO.getUserByUsername(username); + if (userOptional.isPresent() && !userOptional.get().getId().equals(id)) { + response.sendRedirect("error.jsp?message=Username%20already%20exists"); + return; + } + User user = new User(username, password, email); + user.setId(id); + userDAO.updateUser(user); + response.sendRedirect("users"); + } + + @Override + protected void doDelete(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Long id = Long.parseLong(request.getParameter("id")); + userDAO.deleteUser(id); + response.sendRedirect("users"); + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java new file mode 100644 index 0000000..49b8cb3 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java @@ -0,0 +1,44 @@ +package com.todoapp.util; + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +import java.io.IOException; + +@WebFilter(urlPatterns = { "/todos/*", "/users/*" }) +public class AuthFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // Initialisierung + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + + HttpSession session = httpRequest.getSession(false); + + boolean isLoggedIn = (session != null && session.getAttribute("userId") != null); + boolean isLoginRequest = httpRequest.getRequestURI().contains("/auth/login"); + boolean isRegisterRequest = httpRequest.getRequestURI().contains("/auth/register"); + boolean isResourceRequest = httpRequest.getRequestURI().contains("/css/") || + httpRequest.getRequestURI().contains("/js/"); + + if (isLoggedIn || isLoginRequest || isRegisterRequest || isResourceRequest) { + chain.doFilter(request, response); + } else { + httpResponse.sendRedirect(httpRequest.getContextPath() + "/auth/login"); + } + } + + @Override + public void destroy() { + // Aufräumen + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java new file mode 100644 index 0000000..2e5f645 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java @@ -0,0 +1,109 @@ +//package com.todoapp.util; +// +//import org.hibernate.SessionFactory; +//import org.hibernate.boot.Metadata; +//import org.hibernate.boot.MetadataSources; +//import org.hibernate.boot.registry.StandardServiceRegistry; +//import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +//import org.hibernate.cfg.Configuration; +// +//public class HibernateUtil { +// private static StandardServiceRegistry registry; +// private static SessionFactory sessionFactory; +// +// public static SessionFactory getSessionFactory() { +// if (sessionFactory == null) { +// try { +// // Create registry +// registry = new StandardServiceRegistryBuilder() +// .configure() +// .build(); +// +// // Create MetadataSources +// MetadataSources sources = new MetadataSources(registry); +// +// // Create Metadata +// Metadata metadata = sources.getMetadataBuilder().build(); +// +// // Create SessionFactory +// sessionFactory = metadata.getSessionFactoryBuilder().build(); +// +// } catch (Exception e) { +// e.printStackTrace(); +// if (registry != null) { +// StandardServiceRegistryBuilder.destroy(registry); +// } +// } +// } +// return sessionFactory; +// } +// +// public static void shutdown() { +// if (registry != null) { +// StandardServiceRegistryBuilder.destroy(registry); +// } +// } +//} + +package com.todoapp.util; + +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.sql.DataSource; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + try { + Configuration configuration = new Configuration(); + configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver"); + configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://postgres:5432/todo_db"); + configuration.setProperty("hibernate.connection.username", "postgres"); + configuration.setProperty("hibernate.connection.password", "postgres"); + + // Entity-Klassen registrieren + configuration.addAnnotatedClass(com.todoapp.model.User.class); + configuration.addAnnotatedClass(com.todoapp.model.Todo.class); + sessionFactory = configuration.buildSessionFactory(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return sessionFactory; + } + + // public static SessionFactory getSessionFactory() { + // if (sessionFactory == null) { + // try { + // // Create Configuration + // Configuration configuration = new Configuration(); + // + // // Set JNDI DataSource + // Context ctx = new InitialContext(); + // DataSource ds = (DataSource) ctx.lookup("jdbc/PostgresDataSource"); + // configuration.setProperty("hibernate.connection.datasource", + // "jdbc/PostgresDataSource"); + // + // //// Load hibernate.cfg.xml + // // configuration.configure("hibernate.cfg.xml"); + // + // // Build SessionFactory + // sessionFactory = configuration.buildSessionFactory(); + // + // } catch (Exception e) { + // e.printStackTrace(); + // } + // } + // return sessionFactory; + // } + + public static void shutdown() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/liberty/config/server.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/liberty/config/server.xml new file mode 100644 index 0000000..f834402 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/liberty/config/server.xml @@ -0,0 +1,34 @@ + + + + + servlet-6.0 + pages-3.1 + jdbc-4.2 + jndi-1.0 + monitor-1.0 + + + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..c69c584 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,20 @@ + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.todoapp.model.User + com.todoapp.model.Todo + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/hibernate.cfg.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..33bdd20 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,26 @@ + + + + + + jdbc/PostgresDataSource + + + org.hibernate.dialect.PostgreSQLDialect + + + true + + + thread + + + update + + + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..9fe71a3 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,27 @@ + + + + Todo Application + + + auth/login + + + + 404 + /error.jsp + + + + 500 + /error.jsp + + + + 30 + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css new file mode 100644 index 0000000..1de9c26 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css @@ -0,0 +1,246 @@ +/* Allgemeine Stile */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + background-color: #f4f4f4; + color: #333; +} + +.container { + max-width: 900px; + margin: 0 auto; + padding: 20px; +} + +h1 { + margin-bottom: 20px; + text-align: center; + color: #333; +} + +/* Header und Navigation */ +header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 1px solid #ddd; +} + +.user-info { + display: flex; + align-items: center; + gap: 20px; +} + +.logout-btn { + background-color: #f44336; + color: white; + padding: 5px 10px; + border-radius: 4px; + text-decoration: none; +} + +.logout-btn:hover { + background-color: #d32f2f; +} + +/* Formulare */ +.form-group { + margin-bottom: 15px; +} + +.form-group label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} + +.form-group input, +.form-group textarea { + width: 100%; + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; +} + +.form-group button { + background-color: #4caf50; + color: white; + padding: 10px 15px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} + +.form-group button:hover { + background-color: #45a049; +} + +/* Alerts */ +.alert { + padding: 10px; + margin-bottom: 15px; + border-radius: 4px; +} + +.alert-danger { + background-color: #f8d7da; + color: #721c24; + border: 1px solid #f5c6cb; +} + +.alert-success { + background-color: #d4edda; + color: #155724; + border: 1px solid #c3e6cb; +} + +/* Links */ +a { + color: #007bff; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* Buttons */ +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + text-decoration: none; +} + +.btn:hover { + text-decoration: none; +} + +.add-btn { + background-color: #4caf50; + color: white; +} + +.add-btn:hover { + background-color: #45a049; +} + +.edit-btn { + background-color: #2196f3; + color: white; +} + +.edit-btn:hover { + background-color: #0b7dda; +} + +.delete-btn { + background-color: #f44336; + color: white; +} + +.delete-btn:hover { + background-color: #d32f2f; +} + +.complete-btn { + background-color: #ff9800; + color: white; +} + +.complete-btn:hover { + background-color: #e68a00; +} + +.cancel-btn { + background-color: #9e9e9e; + color: white; +} + +.cancel-btn:hover { + background-color: #7e7e7e; +} + +.save-btn { + background-color: #4caf50; + color: white; +} + +.save-btn:hover { + background-color: #45a049; +} + +/* Todo-Liste */ +.todo-actions { + margin-bottom: 20px; + text-align: right; +} + +.todo-table { + width: 100%; + border-collapse: collapse; + margin-bottom: 20px; +} + +.todo-table th, +.todo-table td { + padding: 10px; + text-align: left; + border-bottom: 1px solid #ddd; +} + +.todo-table th { + background-color: #f2f2f2; +} + +.todo-table tr:hover { + background-color: #f5f5f5; +} + +.todo-table tr.completed { + background-color: #f0f0f0; + color: #666; +} + +.status { + padding: 3px 8px; + border-radius: 12px; + font-size: 12px; +} + +.status.completed { + background-color: #4caf50; + color: white; +} + +.status.pending { + background-color: #ff9800; + color: white; +} + +.no-todos { + text-align: center; + padding: 20px; + background-color: #f9f9f9; + border-radius: 4px; + margin-top: 20px; +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp new file mode 100644 index 0000000..a032cd1 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %> + + + + + Fehler + + + +
+

Oops! Es ist ein Fehler aufgetreten

+ +
+

Etwas ist schiefgelaufen. Bitte versuchen Sie es später erneut.

+

Fehlercode: ${pageContext.errorData.statusCode}

+
+ + +
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp new file mode 100644 index 0000000..5a5ae08 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp @@ -0,0 +1,45 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + + + Login + + + +
+

Login

+ + +
+

${errorMessage}

+
+
+ + +
+

${successMessage}

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

Noch keinen Account? Registrieren

+
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp new file mode 100644 index 0000000..496fba3 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp @@ -0,0 +1,49 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + + + Registrierung + + + +
+

Registrierung

+ + +
+

${errorMessage}

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

Bereits registriert? Anmelden

+
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp new file mode 100644 index 0000000..86afc63 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp @@ -0,0 +1,41 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + + + ${todo != null ? 'Aufgabe bearbeiten' : 'Neue Aufgabe'} + + + +
+

${todo != null ? 'Aufgabe bearbeiten' : 'Neue Aufgabe'}

+ +
+ + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + Abbrechen +
+
+
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp new file mode 100644 index 0000000..e0539c0 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp @@ -0,0 +1,80 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> + + + + + Meine Aufgaben + + + +
+
+

Meine Aufgaben

+ +
+ + + + + +
+

Keine Aufgaben vorhanden. Erstellen Sie eine neue Aufgabe!

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
TitelBeschreibungFälligkeitsdatumStatusAktionen
${todo.title}${todo.description}${todo.targetDate} + + + Erledigt + + + Offen + + + + Bearbeiten + Löschen + + + + Als offen markieren + + + Als erledigt markieren + + + +
+
+
+
+ +