From eff71ffa664ef58a3ae91431548b36e26e2ebe30 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 1 Dec 2016 18:18:14 -0600 Subject: [PATCH 01/42] add hello world message --- src/main/java/HelloWorldServlet.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/HelloWorldServlet.java b/src/main/java/HelloWorldServlet.java index dd49fb7133..c9f9fef714 100644 --- a/src/main/java/HelloWorldServlet.java +++ b/src/main/java/HelloWorldServlet.java @@ -1,9 +1,12 @@ +import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +@WebServlet(name = "HelloWorldServlet", urlPatterns = "/") public class HelloWorldServlet extends HttpServlet { - protected void doGet(HttpServletRequest req, HttpServletResponse res) { - + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.getWriter().println("

Hello, World!

"); } } From 7a638aa4c4d53827bc5659040d13ba87932bf14d Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 1 Dec 2016 18:19:08 -0600 Subject: [PATCH 02/42] add counter servlet for /count --- src/main/java/CounterServlet.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/CounterServlet.java diff --git a/src/main/java/CounterServlet.java b/src/main/java/CounterServlet.java new file mode 100644 index 0000000000..324140a0d1 --- /dev/null +++ b/src/main/java/CounterServlet.java @@ -0,0 +1,13 @@ +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "CounterServlet", urlPatterns = "/count") +public class CounterServlet extends HttpServlet { + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.getWriter().println("We're at the counter page"); + } +} From ff382d9281e958edb3b4af128ce7e9be4576762e Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 1 Dec 2016 18:21:29 -0600 Subject: [PATCH 03/42] increase and display count when /count is visited --- src/main/java/CounterServlet.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/CounterServlet.java b/src/main/java/CounterServlet.java index 324140a0d1..7beada9d5e 100644 --- a/src/main/java/CounterServlet.java +++ b/src/main/java/CounterServlet.java @@ -6,8 +6,10 @@ @WebServlet(name = "CounterServlet", urlPatterns = "/count") public class CounterServlet extends HttpServlet { + private int counter = 0; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - response.getWriter().println("We're at the counter page"); + counter += 1; + response.getWriter().println("

The count is " + counter + ".

"); } } From d3fff7cb0e3a987426f366a7003d532c820895e3 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 2 Dec 2016 09:46:28 -0600 Subject: [PATCH 04/42] add jstl dependency and example jsp page --- pom.xml | 5 +++++ src/main/webapp/index.jsp | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/main/webapp/index.jsp diff --git a/pom.xml b/pom.xml index 4782732164..9364a52064 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,11 @@ javax.servlet-api 3.0.1 + + jstl + jstl + 1.2 + \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000000..2e125edaf6 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,15 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + <%= "some title" %> + + + +

Variable names should be very descriptive

+
+ +

single letter variable names are good

+
+ + From bc7e5595afa8852d4561f6cdb15df0f2654732d2 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 2 Dec 2016 09:56:52 -0600 Subject: [PATCH 05/42] add and include html template partials --- src/main/webapp/index.jsp | 14 +++++++------- src/main/webapp/partials/head.jsp | 2 ++ src/main/webapp/partials/navbar.jsp | 12 ++++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 src/main/webapp/partials/head.jsp create mode 100644 src/main/webapp/partials/navbar.jsp diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 2e125edaf6..c0ccc208b6 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -2,14 +2,14 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> - <%= "some title" %> + + + - -

Variable names should be very descriptive

-
- -

single letter variable names are good

-
+ +
+

Welcome to the Adlister!

+
diff --git a/src/main/webapp/partials/head.jsp b/src/main/webapp/partials/head.jsp new file mode 100644 index 0000000000..a33443d65c --- /dev/null +++ b/src/main/webapp/partials/head.jsp @@ -0,0 +1,2 @@ +${param.title} + diff --git a/src/main/webapp/partials/navbar.jsp b/src/main/webapp/partials/navbar.jsp new file mode 100644 index 0000000000..8cf38cf3e1 --- /dev/null +++ b/src/main/webapp/partials/navbar.jsp @@ -0,0 +1,12 @@ + From 2dc9ea23889bf89456f9398aa602c0f5c0201ba1 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Mon, 5 Dec 2016 13:32:40 -0600 Subject: [PATCH 06/42] add login and profile jsps --- src/main/webapp/login.jsp | 25 +++++++++++++++++++++++++ src/main/webapp/profile.jsp | 16 ++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/webapp/login.jsp create mode 100644 src/main/webapp/profile.jsp diff --git a/src/main/webapp/login.jsp b/src/main/webapp/login.jsp new file mode 100644 index 0000000000..af95d93eff --- /dev/null +++ b/src/main/webapp/login.jsp @@ -0,0 +1,25 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Please Log In

+
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/src/main/webapp/profile.jsp b/src/main/webapp/profile.jsp new file mode 100644 index 0000000000..a6eb94d7e0 --- /dev/null +++ b/src/main/webapp/profile.jsp @@ -0,0 +1,16 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Viewing your profile.

+
+ + + From 34bd264fd2583b4c4b82861034c070114cd8fcbb Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Mon, 5 Dec 2016 13:26:36 -0600 Subject: [PATCH 07/42] check credentials when form is submitted redirect to the profile page if credentials check out --- src/main/webapp/login.jsp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/webapp/login.jsp b/src/main/webapp/login.jsp index af95d93eff..316775e052 100644 --- a/src/main/webapp/login.jsp +++ b/src/main/webapp/login.jsp @@ -1,4 +1,13 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + if (request.getMethod().equalsIgnoreCase("post")) { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + if (username.equals("admin") && password.equals("password")) { + response.sendRedirect("/profile"); + } + } +%> From 3604f194fe74a28d7468a186490d5e64884766af Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 2 Dec 2016 10:48:59 -0600 Subject: [PATCH 08/42] add Ads interface and DAO implementation --- src/main/java/Ad.java | 45 +++++++++++++++++++++++++++++++++++ src/main/java/Ads.java | 5 ++++ src/main/java/DaoFactory.java | 10 ++++++++ src/main/java/ListAdsDao.java | 42 ++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 src/main/java/Ad.java create mode 100644 src/main/java/Ads.java create mode 100644 src/main/java/DaoFactory.java create mode 100644 src/main/java/ListAdsDao.java diff --git a/src/main/java/Ad.java b/src/main/java/Ad.java new file mode 100644 index 0000000000..783490201c --- /dev/null +++ b/src/main/java/Ad.java @@ -0,0 +1,45 @@ +public class Ad { + private long id; + private long userId; + private String title; + private String description; + + public Ad(long id, long userId, String title, String description) { + this.id = id; + this.userId = userId; + this.title = title; + this.description = description; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + 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; + } +} diff --git a/src/main/java/Ads.java b/src/main/java/Ads.java new file mode 100644 index 0000000000..51f03f4070 --- /dev/null +++ b/src/main/java/Ads.java @@ -0,0 +1,5 @@ +import java.util.List; + +public interface Ads { + List all(); +} diff --git a/src/main/java/DaoFactory.java b/src/main/java/DaoFactory.java new file mode 100644 index 0000000000..68629380af --- /dev/null +++ b/src/main/java/DaoFactory.java @@ -0,0 +1,10 @@ +public class DaoFactory { + private static Ads adsDao; + + public static Ads getAdsDao() { + if (adsDao == null) { + adsDao = new ListAdsDao(); + } + return adsDao; + } +} diff --git a/src/main/java/ListAdsDao.java b/src/main/java/ListAdsDao.java new file mode 100644 index 0000000000..c7add3b94a --- /dev/null +++ b/src/main/java/ListAdsDao.java @@ -0,0 +1,42 @@ +import java.util.ArrayList; +import java.util.List; + +public class ListAdsDao implements Ads { + private List ads; + + public List all() { + if (ads == null) { + ads = generateAds(); + } + return ads; + } + + private List generateAds() { + List ads = new ArrayList<>(); + ads.add(new Ad( + 1, + 1, + "playstation for sale", + "This is a slightly used playstation" + )); + ads.add(new Ad( + 2, + 1, + "Super Nintendo", + "Get your game on with this old-school classic!" + )); + ads.add(new Ad( + 3, + 2, + "Junior Java Developer Position", + "Minimum 7 years of experience required. You will be working in the scripting language for Java, JavaScript" + )); + ads.add(new Ad( + 4, + 2, + "JavaScript Developer needed", + "Must have strong Java skills" + )); + return ads; + } +} From f911119de36ce023eecb46be98129a1282495bcc Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Tue, 6 Dec 2016 11:18:51 -0600 Subject: [PATCH 09/42] show profile page from servlet instead of a jsp --- src/main/java/ViewProfileServlet.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/ViewProfileServlet.java diff --git a/src/main/java/ViewProfileServlet.java b/src/main/java/ViewProfileServlet.java new file mode 100644 index 0000000000..c2afd42699 --- /dev/null +++ b/src/main/java/ViewProfileServlet.java @@ -0,0 +1,13 @@ +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "ViewProfileServlet", urlPatterns = "/profile") +public class ViewProfileServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/profile.jsp").forward(request, response); + } +} From b034c360f808e9f73f6df87c56c8ab0c025c8861 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Tue, 6 Dec 2016 11:19:01 -0600 Subject: [PATCH 10/42] move credential validation to servlet --- src/main/java/LoginServlet.java | 25 +++++++++++++++++++++++++ src/main/webapp/login.jsp | 11 +---------- 2 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 src/main/java/LoginServlet.java diff --git a/src/main/java/LoginServlet.java b/src/main/java/LoginServlet.java new file mode 100644 index 0000000000..68df26f9df --- /dev/null +++ b/src/main/java/LoginServlet.java @@ -0,0 +1,25 @@ +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "LoginServlet", urlPatterns = "/login") +public class LoginServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + boolean validAttempt = username.equals("admin") && password.equals("password"); + + if (validAttempt) { + response.sendRedirect("/profile"); + } else { + response.sendRedirect("/login"); + } + } +} diff --git a/src/main/webapp/login.jsp b/src/main/webapp/login.jsp index 316775e052..9c577d734c 100644 --- a/src/main/webapp/login.jsp +++ b/src/main/webapp/login.jsp @@ -1,13 +1,4 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> -<% - if (request.getMethod().equalsIgnoreCase("post")) { - String username = request.getParameter("username"); - String password = request.getParameter("password"); - if (username.equals("admin") && password.equals("password")) { - response.sendRedirect("/profile"); - } - } -%> @@ -18,7 +9,7 @@

Please Log In

-
+
From 1d22d9c4795d06b8655301e89d098c1ba6a29bbe Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 2 Dec 2016 11:10:39 -0600 Subject: [PATCH 11/42] show all ads on ads index page --- src/main/java/AdsIndexServlet.java | 15 +++++++++++++++ src/main/webapp/ads/index.jsp | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/main/java/AdsIndexServlet.java create mode 100644 src/main/webapp/ads/index.jsp diff --git a/src/main/java/AdsIndexServlet.java b/src/main/java/AdsIndexServlet.java new file mode 100644 index 0000000000..4921dc99dc --- /dev/null +++ b/src/main/java/AdsIndexServlet.java @@ -0,0 +1,15 @@ +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +@WebServlet(name = "AdsIndexServlet", urlPatterns = "/ads") +public class AdsIndexServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setAttribute("ads", DaoFactory.getAdsDao().all()); + request.getRequestDispatcher("/ads/index.jsp").forward(request, response); + } +} diff --git a/src/main/webapp/ads/index.jsp b/src/main/webapp/ads/index.jsp new file mode 100644 index 0000000000..5b1da907d9 --- /dev/null +++ b/src/main/webapp/ads/index.jsp @@ -0,0 +1,24 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Here Are all the ads!

+ + +
+

${ad.title}

+

${ad.description}

+
+
+
+ + + From abc5b15bb898bb58413326ec49e608dc9bf83db8 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Tue, 6 Dec 2016 10:51:21 -0600 Subject: [PATCH 12/42] track login status - display logged in user on '/profile' page - add a key in the session to keep track of whether a user is logged in - recreate session when visiting '/logout' - add logout link on navbar --- src/main/java/LoginServlet.java | 5 +++++ src/main/java/LogoutServlet.java | 14 ++++++++++++++ src/main/java/ViewProfileServlet.java | 4 ++++ src/main/webapp/partials/navbar.jsp | 1 + src/main/webapp/profile.jsp | 2 +- 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/LogoutServlet.java diff --git a/src/main/java/LoginServlet.java b/src/main/java/LoginServlet.java index 68df26f9df..f22e83558f 100644 --- a/src/main/java/LoginServlet.java +++ b/src/main/java/LoginServlet.java @@ -8,6 +8,10 @@ @WebServlet(name = "LoginServlet", urlPatterns = "/login") public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") != null) { + response.sendRedirect("/profile"); + return; + } request.getRequestDispatcher("/login.jsp").forward(request, response); } @@ -17,6 +21,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) boolean validAttempt = username.equals("admin") && password.equals("password"); if (validAttempt) { + request.getSession().setAttribute("user", username); response.sendRedirect("/profile"); } else { response.sendRedirect("/login"); diff --git a/src/main/java/LogoutServlet.java b/src/main/java/LogoutServlet.java new file mode 100644 index 0000000000..df97f05c19 --- /dev/null +++ b/src/main/java/LogoutServlet.java @@ -0,0 +1,14 @@ +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "LogoutServlet", urlPatterns = "/logout") +public class LogoutServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + request.getSession().removeAttribute("user"); + request.getSession().invalidate(); + response.sendRedirect("/login"); + } +} diff --git a/src/main/java/ViewProfileServlet.java b/src/main/java/ViewProfileServlet.java index c2afd42699..cf2b3eba48 100644 --- a/src/main/java/ViewProfileServlet.java +++ b/src/main/java/ViewProfileServlet.java @@ -8,6 +8,10 @@ @WebServlet(name = "ViewProfileServlet", urlPatterns = "/profile") public class ViewProfileServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } request.getRequestDispatcher("/profile.jsp").forward(request, response); } } diff --git a/src/main/webapp/partials/navbar.jsp b/src/main/webapp/partials/navbar.jsp index 8cf38cf3e1..8e1f98f662 100644 --- a/src/main/webapp/partials/navbar.jsp +++ b/src/main/webapp/partials/navbar.jsp @@ -6,6 +6,7 @@
diff --git a/src/main/webapp/profile.jsp b/src/main/webapp/profile.jsp index a6eb94d7e0..e61712a475 100644 --- a/src/main/webapp/profile.jsp +++ b/src/main/webapp/profile.jsp @@ -9,7 +9,7 @@
-

Viewing your profile.

+

Welcome, ${sessionScope.user}!

From 7b547d5e5d24a873b2cfe737a84dd7b475712635 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Wed, 7 Dec 2016 08:42:46 -0600 Subject: [PATCH 13/42] remove jsps from direct public access - move all the jsps to the WEB-INF folder, so that only our application can see them - update all the filepaths to reflect these changes --- src/main/java/AdsIndexServlet.java | 2 +- src/main/java/LoginServlet.java | 2 +- src/main/java/ViewProfileServlet.java | 2 +- src/main/webapp/{ => WEB-INF}/ads/index.jsp | 4 ++-- src/main/webapp/{ => WEB-INF}/login.jsp | 4 ++-- src/main/webapp/{ => WEB-INF}/partials/head.jsp | 0 src/main/webapp/{ => WEB-INF}/partials/navbar.jsp | 0 src/main/webapp/{ => WEB-INF}/profile.jsp | 4 ++-- src/main/webapp/index.jsp | 4 ++-- 9 files changed, 11 insertions(+), 11 deletions(-) rename src/main/webapp/{ => WEB-INF}/ads/index.jsp (82%) rename src/main/webapp/{ => WEB-INF}/login.jsp (88%) rename src/main/webapp/{ => WEB-INF}/partials/head.jsp (100%) rename src/main/webapp/{ => WEB-INF}/partials/navbar.jsp (100%) rename src/main/webapp/{ => WEB-INF}/profile.jsp (71%) diff --git a/src/main/java/AdsIndexServlet.java b/src/main/java/AdsIndexServlet.java index 4921dc99dc..73cc006a89 100644 --- a/src/main/java/AdsIndexServlet.java +++ b/src/main/java/AdsIndexServlet.java @@ -10,6 +10,6 @@ public class AdsIndexServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("ads", DaoFactory.getAdsDao().all()); - request.getRequestDispatcher("/ads/index.jsp").forward(request, response); + request.getRequestDispatcher("/WEB-INF/ads/index.jsp").forward(request, response); } } diff --git a/src/main/java/LoginServlet.java b/src/main/java/LoginServlet.java index f22e83558f..cd855afdd4 100644 --- a/src/main/java/LoginServlet.java +++ b/src/main/java/LoginServlet.java @@ -12,7 +12,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t response.sendRedirect("/profile"); return; } - request.getRequestDispatcher("/login.jsp").forward(request, response); + request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { diff --git a/src/main/java/ViewProfileServlet.java b/src/main/java/ViewProfileServlet.java index cf2b3eba48..ffe9e41221 100644 --- a/src/main/java/ViewProfileServlet.java +++ b/src/main/java/ViewProfileServlet.java @@ -12,6 +12,6 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t response.sendRedirect("/login"); return; } - request.getRequestDispatcher("/profile.jsp").forward(request, response); + request.getRequestDispatcher("/WEB-INF/profile.jsp").forward(request, response); } } diff --git a/src/main/webapp/ads/index.jsp b/src/main/webapp/WEB-INF/ads/index.jsp similarity index 82% rename from src/main/webapp/ads/index.jsp rename to src/main/webapp/WEB-INF/ads/index.jsp index 5b1da907d9..6f4371f0bb 100644 --- a/src/main/webapp/ads/index.jsp +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -2,12 +2,12 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> - + - +

Here Are all the ads!

diff --git a/src/main/webapp/login.jsp b/src/main/webapp/WEB-INF/login.jsp similarity index 88% rename from src/main/webapp/login.jsp rename to src/main/webapp/WEB-INF/login.jsp index 9c577d734c..83ce2d0a1f 100644 --- a/src/main/webapp/login.jsp +++ b/src/main/webapp/WEB-INF/login.jsp @@ -1,12 +1,12 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> - + - +

Please Log In

diff --git a/src/main/webapp/partials/head.jsp b/src/main/webapp/WEB-INF/partials/head.jsp similarity index 100% rename from src/main/webapp/partials/head.jsp rename to src/main/webapp/WEB-INF/partials/head.jsp diff --git a/src/main/webapp/partials/navbar.jsp b/src/main/webapp/WEB-INF/partials/navbar.jsp similarity index 100% rename from src/main/webapp/partials/navbar.jsp rename to src/main/webapp/WEB-INF/partials/navbar.jsp diff --git a/src/main/webapp/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp similarity index 71% rename from src/main/webapp/profile.jsp rename to src/main/webapp/WEB-INF/profile.jsp index e61712a475..384c2081c6 100644 --- a/src/main/webapp/profile.jsp +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -1,12 +1,12 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> - + - +

Welcome, ${sessionScope.user}!

diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index c0ccc208b6..68cf346ec9 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -2,12 +2,12 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> - + - +

Welcome to the Adlister!

From a3fef90153c9b9ebe0f286c1ac82bfabd739d6d3 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 8 Dec 2016 13:37:57 -0600 Subject: [PATCH 14/42] insert ads in list dao --- src/main/java/Ad.java | 6 ++++++ src/main/java/Ads.java | 3 +++ src/main/java/ListAdsDao.java | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/main/java/Ad.java b/src/main/java/Ad.java index 783490201c..79e155f722 100644 --- a/src/main/java/Ad.java +++ b/src/main/java/Ad.java @@ -11,6 +11,12 @@ public Ad(long id, long userId, String title, String description) { this.description = description; } + public Ad(long userId, String title, String description) { + this.userId = userId; + this.title = title; + this.description = description; + } + public long getId() { return id; } diff --git a/src/main/java/Ads.java b/src/main/java/Ads.java index 51f03f4070..6854954a42 100644 --- a/src/main/java/Ads.java +++ b/src/main/java/Ads.java @@ -1,5 +1,8 @@ import java.util.List; public interface Ads { + // get a list of all the ads List all(); + // insert a new ad and return the new ad's id + Long insert(Ad ad); } diff --git a/src/main/java/ListAdsDao.java b/src/main/java/ListAdsDao.java index c7add3b94a..0a2aaf56e6 100644 --- a/src/main/java/ListAdsDao.java +++ b/src/main/java/ListAdsDao.java @@ -11,6 +11,18 @@ public List all() { return ads; } + public Long insert(Ad ad) { + // make sure we have ads + if (ads == null) { + ads = generateAds(); + } + // we'll assign an "id" here based on the size of the ads list + // really the database would handle this + ad.setId((long) ads.size()); + ads.add(ad); + return ad.getId(); + } + private List generateAds() { List ads = new ArrayList<>(); ads.add(new Ad( From 729327247168c8acd3779fcfec3644f95baa552d Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 8 Dec 2016 13:17:40 -0600 Subject: [PATCH 15/42] ad creation functionality - add ad creation form and backend logic to handle the form's submissions --- src/main/java/CreateAdServlet.java | 24 ++++++++++++++++++++++++ src/main/webapp/WEB-INF/ads/create.jsp | 24 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/main/java/CreateAdServlet.java create mode 100644 src/main/webapp/WEB-INF/ads/create.jsp diff --git a/src/main/java/CreateAdServlet.java b/src/main/java/CreateAdServlet.java new file mode 100644 index 0000000000..057bb7bac7 --- /dev/null +++ b/src/main/java/CreateAdServlet.java @@ -0,0 +1,24 @@ +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "CreateAdServlet", urlPatterns = "/ads/create") +public class CreateAdServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/WEB-INF/ads/create.jsp") + .forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + Ad ad = new Ad( + 1, // for now we'll hardcode the user id + request.getParameter("title"), + request.getParameter("description") + ); + DaoFactory.getAdsDao().insert(ad); + response.sendRedirect("/ads"); + } +} diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp new file mode 100644 index 0000000000..f6332692f7 --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -0,0 +1,24 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + +
+

Create a new Ad

+ +
+ + +
+
+ + +
+ + +
+ + From a20fe818b84280403cd06419a1dd5cf5900059d3 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 8 Dec 2016 14:10:24 -0600 Subject: [PATCH 16/42] add mysql driver dependency --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 9364a52064..aa004087cd 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,11 @@ jstl 1.2 + + mysql + mysql-connector-java + 6.0.5 + \ No newline at end of file From a7c13615c34b47321ee55f1eac3e05608636ec97 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Tue, 6 Dec 2016 13:00:32 -0600 Subject: [PATCH 17/42] add migration script --- migration.sql | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 migration.sql diff --git a/migration.sql b/migration.sql new file mode 100644 index 0000000000..a70d2eab38 --- /dev/null +++ b/migration.sql @@ -0,0 +1,22 @@ +USE adlister_db; + +DROP TABLE IF EXISTS ads; +DROP TABLE IF EXISTS users; + +CREATE TABLE users ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + username VARCHAR(240) NOT NULL, + email VARCHAR(240) NOT NULL, + password VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE ads ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + user_id INT UNSIGNED NOT NULL, + title VARCHAR(240) NOT NULL, + description TEXT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (user_id) REFERENCES users(id) + ON DELETE CASCADE +); From 70f7bd83d7f08be0e0aa992e542292d4d501da24 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 8 Dec 2016 14:09:40 -0600 Subject: [PATCH 18/42] implement mysql ads dao --- src/main/java/DaoFactory.java | 2 +- src/main/java/MySQLAdsDao.java | 73 ++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/main/java/MySQLAdsDao.java diff --git a/src/main/java/DaoFactory.java b/src/main/java/DaoFactory.java index 68629380af..cfd744b184 100644 --- a/src/main/java/DaoFactory.java +++ b/src/main/java/DaoFactory.java @@ -3,7 +3,7 @@ public class DaoFactory { public static Ads getAdsDao() { if (adsDao == null) { - adsDao = new ListAdsDao(); + adsDao = new MySQLAdsDao(); } return adsDao; } diff --git a/src/main/java/MySQLAdsDao.java b/src/main/java/MySQLAdsDao.java new file mode 100644 index 0000000000..e87677236a --- /dev/null +++ b/src/main/java/MySQLAdsDao.java @@ -0,0 +1,73 @@ +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class MySQLAdsDao implements Ads { + private Connection connection = null; + + public MySQLAdsDao() { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + connection = DriverManager.getConnection( + "jdbc:mysql://localhost/adlister_db", + "root", + "codeup" + ); + } catch (SQLException e) { + throw new RuntimeException("Error talking to the database!", e); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Error initializing the MySQL driver.", e); + } + } + + @Override + public List all() { + Statement stmt = null; + try { + stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM ads"); + return createAdsFromResults(rs); + } catch (SQLException e) { + throw new RuntimeException("Error retrieving all ads.", e); + } + } + + @Override + public Long insert(Ad ad) { + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate(createInsertQuery(ad), Statement.RETURN_GENERATED_KEYS); + ResultSet rs = stmt.getGeneratedKeys(); + rs.next(); + return rs.getLong(1); + } catch (SQLException e) { + throw new RuntimeException("Error creating a new ad.", e); + } + } + + private String createInsertQuery(Ad ad) { + return "INSERT INTO ads(user_id, title, description) VALUES " + + "(" + ad.getUserId() + ", " + + "'" + ad.getTitle() +"', " + + "'" + ad.getDescription() + "')"; + } + + private Ad extractAd(ResultSet rs) throws SQLException { + return new Ad( + rs.getLong("id"), + rs.getLong("user_id"), + rs.getString("title"), + rs.getString("description") + ); + } + + private List createAdsFromResults(ResultSet rs) throws SQLException { + List ads = new ArrayList<>(); + while (rs.next()) { + ads.add(extractAd(rs)); + } + return ads; + } +} From 8e52d36cf88c342bb9b701e9fec372d8261e817a Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 08:40:47 -0600 Subject: [PATCH 19/42] split project into packages --- .../codeup/adlister/controllers}/AdsIndexServlet.java | 7 +++++-- .../codeup/adlister/controllers}/CounterServlet.java | 4 +++- .../codeup/adlister/controllers}/CreateAdServlet.java | 7 ++++++- .../codeup/adlister/controllers}/HelloWorldServlet.java | 4 +++- .../codeup/adlister/controllers}/LoginServlet.java | 4 +++- .../codeup/adlister/controllers}/LogoutServlet.java | 4 +++- .../codeup/adlister/controllers}/ViewProfileServlet.java | 4 +++- src/main/java/{ => com/codeup/adlister/dao}/Ads.java | 4 ++++ .../java/{ => com/codeup/adlister/dao}/DaoFactory.java | 2 ++ .../java/{ => com/codeup/adlister/dao}/ListAdsDao.java | 6 +++++- .../java/{ => com/codeup/adlister/dao}/MySQLAdsDao.java | 5 +++-- src/main/java/{ => com/codeup/adlister/models}/Ad.java | 2 ++ 12 files changed, 42 insertions(+), 11 deletions(-) rename src/main/java/{ => com/codeup/adlister/controllers}/AdsIndexServlet.java (78%) rename src/main/java/{ => com/codeup/adlister/controllers}/CounterServlet.java (81%) rename src/main/java/{ => com/codeup/adlister/controllers}/CreateAdServlet.java (81%) rename src/main/java/{ => com/codeup/adlister/controllers}/HelloWorldServlet.java (79%) rename src/main/java/{ => com/codeup/adlister/controllers}/LoginServlet.java (91%) rename src/main/java/{ => com/codeup/adlister/controllers}/LogoutServlet.java (81%) rename src/main/java/{ => com/codeup/adlister/controllers}/ViewProfileServlet.java (84%) rename src/main/java/{ => com/codeup/adlister/dao}/Ads.java (70%) rename src/main/java/{ => com/codeup/adlister/dao}/DaoFactory.java (85%) rename src/main/java/{ => com/codeup/adlister/dao}/ListAdsDao.java (91%) rename src/main/java/{ => com/codeup/adlister/dao}/MySQLAdsDao.java (94%) rename src/main/java/{ => com/codeup/adlister/models}/Ad.java (96%) diff --git a/src/main/java/AdsIndexServlet.java b/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java similarity index 78% rename from src/main/java/AdsIndexServlet.java rename to src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java index 73cc006a89..1763081228 100644 --- a/src/main/java/AdsIndexServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java @@ -1,12 +1,15 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.List; -@WebServlet(name = "AdsIndexServlet", urlPatterns = "/ads") +@WebServlet(name = "controllers.AdsIndexServlet", urlPatterns = "/ads") public class AdsIndexServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("ads", DaoFactory.getAdsDao().all()); diff --git a/src/main/java/CounterServlet.java b/src/main/java/com/codeup/adlister/controllers/CounterServlet.java similarity index 81% rename from src/main/java/CounterServlet.java rename to src/main/java/com/codeup/adlister/controllers/CounterServlet.java index 7beada9d5e..f66c52d7aa 100644 --- a/src/main/java/CounterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/CounterServlet.java @@ -1,10 +1,12 @@ +package com.codeup.adlister.controllers; + import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet(name = "CounterServlet", urlPatterns = "/count") +@WebServlet(name = "controllers.CounterServlet", urlPatterns = "/count") public class CounterServlet extends HttpServlet { private int counter = 0; diff --git a/src/main/java/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java similarity index 81% rename from src/main/java/CreateAdServlet.java rename to src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java index 057bb7bac7..5fd38ad79d 100644 --- a/src/main/java/CreateAdServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -1,3 +1,8 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.Ad; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -5,7 +10,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet(name = "CreateAdServlet", urlPatterns = "/ads/create") +@WebServlet(name = "controllers.CreateAdServlet", urlPatterns = "/ads/create") public class CreateAdServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/ads/create.jsp") diff --git a/src/main/java/HelloWorldServlet.java b/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java similarity index 79% rename from src/main/java/HelloWorldServlet.java rename to src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java index c9f9fef714..4ab9b9da70 100644 --- a/src/main/java/HelloWorldServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java @@ -1,10 +1,12 @@ +package com.codeup.adlister.controllers; + import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet(name = "HelloWorldServlet", urlPatterns = "/") +@WebServlet(name = "controllers.HelloWorldServlet", urlPatterns = "/") public class HelloWorldServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().println("

Hello, World!

"); diff --git a/src/main/java/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java similarity index 91% rename from src/main/java/LoginServlet.java rename to src/main/java/com/codeup/adlister/controllers/LoginServlet.java index cd855afdd4..977c13dc39 100644 --- a/src/main/java/LoginServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -1,3 +1,5 @@ +package com.codeup.adlister.controllers; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -5,7 +7,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet(name = "LoginServlet", urlPatterns = "/login") +@WebServlet(name = "controllers.LoginServlet", urlPatterns = "/login") public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getSession().getAttribute("user") != null) { diff --git a/src/main/java/LogoutServlet.java b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java similarity index 81% rename from src/main/java/LogoutServlet.java rename to src/main/java/com/codeup/adlister/controllers/LogoutServlet.java index df97f05c19..e88f9d5241 100644 --- a/src/main/java/LogoutServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java @@ -1,10 +1,12 @@ +package com.codeup.adlister.controllers; + import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet(name = "LogoutServlet", urlPatterns = "/logout") +@WebServlet(name = "controllers.LogoutServlet", urlPatterns = "/logout") public class LogoutServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { request.getSession().removeAttribute("user"); diff --git a/src/main/java/ViewProfileServlet.java b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java similarity index 84% rename from src/main/java/ViewProfileServlet.java rename to src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java index ffe9e41221..e1b8941067 100644 --- a/src/main/java/ViewProfileServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java @@ -1,3 +1,5 @@ +package com.codeup.adlister.controllers; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -5,7 +7,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet(name = "ViewProfileServlet", urlPatterns = "/profile") +@WebServlet(name = "controllers.ViewProfileServlet", urlPatterns = "/profile") public class ViewProfileServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getSession().getAttribute("user") == null) { diff --git a/src/main/java/Ads.java b/src/main/java/com/codeup/adlister/dao/Ads.java similarity index 70% rename from src/main/java/Ads.java rename to src/main/java/com/codeup/adlister/dao/Ads.java index 6854954a42..79dc59f484 100644 --- a/src/main/java/Ads.java +++ b/src/main/java/com/codeup/adlister/dao/Ads.java @@ -1,3 +1,7 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; + import java.util.List; public interface Ads { diff --git a/src/main/java/DaoFactory.java b/src/main/java/com/codeup/adlister/dao/DaoFactory.java similarity index 85% rename from src/main/java/DaoFactory.java rename to src/main/java/com/codeup/adlister/dao/DaoFactory.java index cfd744b184..5a6a8469cd 100644 --- a/src/main/java/DaoFactory.java +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -1,3 +1,5 @@ +package com.codeup.adlister.dao; + public class DaoFactory { private static Ads adsDao; diff --git a/src/main/java/ListAdsDao.java b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java similarity index 91% rename from src/main/java/ListAdsDao.java rename to src/main/java/com/codeup/adlister/dao/ListAdsDao.java index 0a2aaf56e6..8d3baaa369 100644 --- a/src/main/java/ListAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java @@ -1,3 +1,7 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; + import java.util.ArrayList; import java.util.List; @@ -17,7 +21,7 @@ public Long insert(Ad ad) { ads = generateAds(); } // we'll assign an "id" here based on the size of the ads list - // really the database would handle this + // really the dao would handle this ad.setId((long) ads.size()); ads.add(ad); return ad.getId(); diff --git a/src/main/java/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java similarity index 94% rename from src/main/java/MySQLAdsDao.java rename to src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index e87677236a..713172e17e 100644 --- a/src/main/java/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -1,3 +1,6 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; import com.mysql.cj.jdbc.Driver; import java.sql.*; @@ -17,8 +20,6 @@ public MySQLAdsDao() { ); } catch (SQLException e) { throw new RuntimeException("Error talking to the database!", e); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Error initializing the MySQL driver.", e); } } diff --git a/src/main/java/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java similarity index 96% rename from src/main/java/Ad.java rename to src/main/java/com/codeup/adlister/models/Ad.java index 79e155f722..9e9e02d87e 100644 --- a/src/main/java/Ad.java +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -1,3 +1,5 @@ +package com.codeup.adlister.models; + public class Ad { private long id; private long userId; From b4e94857453e1e5a948aac8c76854efb3e3b3a0a Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 8 Dec 2016 15:26:35 -0600 Subject: [PATCH 20/42] move configuration to external class our sensitive information will live in Config.java, and we will not track it with git --- .gitignore | 1 + .../java/com/codeup/adlister/dao/DaoFactory.java | 3 ++- .../java/com/codeup/adlister/dao/MySQLAdsDao.java | 15 +++++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index a65bf3836e..a2b7aa3f3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.iml target/ .idea/ +Config.java diff --git a/src/main/java/com/codeup/adlister/dao/DaoFactory.java b/src/main/java/com/codeup/adlister/dao/DaoFactory.java index 5a6a8469cd..05f2dafc28 100644 --- a/src/main/java/com/codeup/adlister/dao/DaoFactory.java +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -2,10 +2,11 @@ public class DaoFactory { private static Ads adsDao; + private static Config config = new Config(); public static Ads getAdsDao() { if (adsDao == null) { - adsDao = new MySQLAdsDao(); + adsDao = new MySQLAdsDao(config); } return adsDao; } diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index 713172e17e..42508fa6b8 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -3,6 +3,9 @@ import com.codeup.adlister.models.Ad; import com.mysql.cj.jdbc.Driver; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -10,16 +13,16 @@ public class MySQLAdsDao implements Ads { private Connection connection = null; - public MySQLAdsDao() { + public MySQLAdsDao(Config config) { try { - Class.forName("com.mysql.cj.jdbc.Driver"); + DriverManager.registerDriver(new Driver()); connection = DriverManager.getConnection( - "jdbc:mysql://localhost/adlister_db", - "root", - "codeup" + config.getUrl(), + config.getUser(), + config.getPassword() ); } catch (SQLException e) { - throw new RuntimeException("Error talking to the database!", e); + throw new RuntimeException("Error connecting to the database!", e); } } From ed7b62682026220e7c8ec5ed11138f8ca9233df4 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 11:32:04 -0600 Subject: [PATCH 21/42] add users interface and model --- .../java/com/codeup/adlister/dao/Users.java | 10 ++++ .../java/com/codeup/adlister/models/User.java | 49 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/main/java/com/codeup/adlister/dao/Users.java create mode 100644 src/main/java/com/codeup/adlister/models/User.java diff --git a/src/main/java/com/codeup/adlister/dao/Users.java b/src/main/java/com/codeup/adlister/dao/Users.java new file mode 100644 index 0000000000..62da74d20b --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Users.java @@ -0,0 +1,10 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; + +import java.util.List; + +public interface Users { + User findByUsername(String username); + Long insert(User user); +} diff --git a/src/main/java/com/codeup/adlister/models/User.java b/src/main/java/com/codeup/adlister/models/User.java new file mode 100644 index 0000000000..1c9c75cdb7 --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/User.java @@ -0,0 +1,49 @@ +package com.codeup.adlister.models; + +public class User { + private long id; + private String username; + private String email; + private String password; + + public User() {} + + public User(long id, String username, String email, String password) { + this.id = id; + this.username = username; + this.email = email; + this.password = password; + } + + 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 getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} From fa01b2570ae985e40a8a5957d36af1ee8f6be24b Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 11:58:36 -0600 Subject: [PATCH 22/42] plan out backend logic for user creation + login --- .../adlister/controllers/LoginServlet.java | 7 ++++++- .../adlister/controllers/RegisterServlet.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/codeup/adlister/controllers/RegisterServlet.java diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java index 977c13dc39..8e320d737f 100644 --- a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -20,9 +20,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); - boolean validAttempt = username.equals("admin") && password.equals("password"); + + // TODO: find a record in your database that matches the submitted password + // TODO: make sure we find a user with that username + // TODO: check the submitted password against what you have in your database + boolean validAttempt = false; if (validAttempt) { + // TODO: store the logged in user object in the session, instead of just the username request.getSession().setAttribute("user", username); response.sendRedirect("/profile"); } else { diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java new file mode 100644 index 0000000000..638fa3a231 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -0,0 +1,19 @@ +package com.codeup.adlister.controllers; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "controllers.RegisterServlet", urlPatterns = "/register") +public class RegisterServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + // TODO: show the registration form + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + // TODO: ensure the submitted information is valid + // TODO: create a new user based off of the submitted information + // TODO: if a user was successfully created, send them to their profile + } +} From 844d3cde9bb56fd566230a5b46bde2998e14b571 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 09:25:22 -0600 Subject: [PATCH 23/42] use prepared statements for ad creation --- .../com/codeup/adlister/dao/MySQLAdsDao.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index 42508fa6b8..d58c45f985 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -28,10 +28,10 @@ public MySQLAdsDao(Config config) { @Override public List all() { - Statement stmt = null; + PreparedStatement stmt = null; try { - stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM ads"); + stmt = connection.prepareStatement("SELECT * FROM ads"); + ResultSet rs = stmt.executeQuery(); return createAdsFromResults(rs); } catch (SQLException e) { throw new RuntimeException("Error retrieving all ads.", e); @@ -41,8 +41,12 @@ public List all() { @Override public Long insert(Ad ad) { try { - Statement stmt = connection.createStatement(); - stmt.executeUpdate(createInsertQuery(ad), Statement.RETURN_GENERATED_KEYS); + String insertQuery = "INSERT INTO ads(user_id, title, description) VALUES (?, ?, ?)"; + PreparedStatement stmt = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); + stmt.setLong(1, ad.getUserId()); + stmt.setString(2, ad.getTitle()); + stmt.setString(3, ad.getDescription()); + stmt.executeUpdate(); ResultSet rs = stmt.getGeneratedKeys(); rs.next(); return rs.getLong(1); @@ -51,13 +55,6 @@ public Long insert(Ad ad) { } } - private String createInsertQuery(Ad ad) { - return "INSERT INTO ads(user_id, title, description) VALUES " - + "(" + ad.getUserId() + ", " - + "'" + ad.getTitle() +"', " - + "'" + ad.getDescription() + "')"; - } - private Ad extractAd(ResultSet rs) throws SQLException { return new Ad( rs.getLong("id"), From 66260b86eeda768d3bb0e8742002ae245db4b69f Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 11:51:46 -0600 Subject: [PATCH 24/42] implement mysql users dao --- .../com/codeup/adlister/dao/DaoFactory.java | 8 +++ .../codeup/adlister/dao/MySQLUsersDao.java | 66 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java diff --git a/src/main/java/com/codeup/adlister/dao/DaoFactory.java b/src/main/java/com/codeup/adlister/dao/DaoFactory.java index 05f2dafc28..e002140f85 100644 --- a/src/main/java/com/codeup/adlister/dao/DaoFactory.java +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -2,6 +2,7 @@ public class DaoFactory { private static Ads adsDao; + private static Users usersDao; private static Config config = new Config(); public static Ads getAdsDao() { @@ -10,4 +11,11 @@ public static Ads getAdsDao() { } return adsDao; } + + public static Users getUsersDao() { + if (usersDao == null) { + usersDao = new MySQLUsersDao(config); + } + return usersDao; + } } diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java new file mode 100644 index 0000000000..4e69e57044 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -0,0 +1,66 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; + +public class MySQLUsersDao implements Users { + private Connection connection; + + public MySQLUsersDao(Config config) { + try { + DriverManager.registerDriver(new Driver()); + connection = DriverManager.getConnection( + config.getUrl(), + config.getUser(), + config.getPassword() + ); + } catch (SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + + @Override + public User findByUsername(String username) { + String query = "SELECT * FROM users WHERE username = ? LIMIT 1"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setString(1, username); + return extractUser(stmt.executeQuery()); + } catch (SQLException e) { + throw new RuntimeException("Error finding a user by username", e); + } + } + + @Override + public Long insert(User user) { + String query = "INSERT INTO users(username, email, password) VALUES (?, ?, ?)"; + try { + PreparedStatement stmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); + stmt.setString(1, user.getUsername()); + stmt.setString(2, user.getEmail()); + stmt.setString(3, user.getPassword()); + stmt.executeUpdate(); + ResultSet rs = stmt.getGeneratedKeys(); + rs.next(); + return rs.getLong(1); + } catch (SQLException e) { + throw new RuntimeException("Error creating new user", e); + } + } + + private User extractUser(ResultSet rs) throws SQLException { + if (! rs.next()) { + return null; + } + return new User( + rs.getLong("id"), + rs.getString("username"), + rs.getString("email"), + rs.getString("password") + ); + } + +} From ed6be1755f9c767288b283d82659f64084bcf602 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 12:12:39 -0600 Subject: [PATCH 25/42] add registration form --- src/main/webapp/WEB-INF/register.jsp | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/webapp/WEB-INF/register.jsp diff --git a/src/main/webapp/WEB-INF/register.jsp b/src/main/webapp/WEB-INF/register.jsp new file mode 100644 index 0000000000..4b64e10a43 --- /dev/null +++ b/src/main/webapp/WEB-INF/register.jsp @@ -0,0 +1,33 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Please fill in your information.

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + From dbd48dda9946ce54ca990a3ae23d02760f680d9a Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 12:31:43 -0600 Subject: [PATCH 26/42] persist users to database after registration - add no id contructor to user model to enable creation of a user model before a record exists in the database --- .../adlister/controllers/RegisterServlet.java | 34 +++++++++++++++---- .../java/com/codeup/adlister/models/User.java | 6 ++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index 638fa3a231..e1e997c17a 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -1,19 +1,41 @@ package com.codeup.adlister.controllers; +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; + +import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; @WebServlet(name = "controllers.RegisterServlet", urlPatterns = "/register") public class RegisterServlet extends HttpServlet { - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - // TODO: show the registration form + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); } - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - // TODO: ensure the submitted information is valid - // TODO: create a new user based off of the submitted information - // TODO: if a user was successfully created, send them to their profile + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + String username = request.getParameter("username"); + String email = request.getParameter("email"); + String password = request.getParameter("password"); + String passwordConfirmation = request.getParameter("confirm_password"); + + // validate input + boolean inputHasErrors = username.isEmpty() + || email.isEmpty() + || password.isEmpty() + || (! password.equals(passwordConfirmation)); + + if (inputHasErrors) { + response.sendRedirect("/register"); + return; + } + + // create and save a new user + User user = new User(username, email, password); + DaoFactory.getUsersDao().insert(user); + response.sendRedirect("/login"); } } diff --git a/src/main/java/com/codeup/adlister/models/User.java b/src/main/java/com/codeup/adlister/models/User.java index 1c9c75cdb7..d5a5b8b42d 100644 --- a/src/main/java/com/codeup/adlister/models/User.java +++ b/src/main/java/com/codeup/adlister/models/User.java @@ -8,6 +8,12 @@ public class User { public User() {} + public User(String username, String email, String password) { + this.username = username; + this.email = email; + this.password = password; + } + public User(long id, String username, String email, String password) { this.id = id; this.username = username; From 32c5dd59b8aac5e9719d5bd437bca85d76c453ff Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 12:56:52 -0600 Subject: [PATCH 27/42] check user credentials against database records --- .../codeup/adlister/controllers/LoginServlet.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java index 8e320d737f..80ddb9af6d 100644 --- a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -1,5 +1,8 @@ package com.codeup.adlister.controllers; +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -20,11 +23,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); + User user = DaoFactory.getUsersDao().findByUsername(username); + + if (user == null) { + response.sendRedirect("/login"); + return; + } - // TODO: find a record in your database that matches the submitted password - // TODO: make sure we find a user with that username - // TODO: check the submitted password against what you have in your database - boolean validAttempt = false; + boolean validAttempt = password.equals(user.getPassword()); if (validAttempt) { // TODO: store the logged in user object in the session, instead of just the username From 7a0c40fc20532123416e47074328275789498d6c Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 12:56:59 -0600 Subject: [PATCH 28/42] store logged in user in the session instead of just a username - modify profile page to reflect this change --- .../java/com/codeup/adlister/controllers/LoginServlet.java | 3 +-- src/main/webapp/WEB-INF/profile.jsp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java index 80ddb9af6d..a7e62dc54f 100644 --- a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -33,8 +33,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) boolean validAttempt = password.equals(user.getPassword()); if (validAttempt) { - // TODO: store the logged in user object in the session, instead of just the username - request.getSession().setAttribute("user", username); + request.getSession().setAttribute("user", user); response.sendRedirect("/profile"); } else { response.sendRedirect("/login"); diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp index 384c2081c6..05e3fa7a91 100644 --- a/src/main/webapp/WEB-INF/profile.jsp +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -9,7 +9,7 @@
-

Welcome, ${sessionScope.user}!

+

Welcome, ${sessionScope.user.username}!

From 3aae064fe533e68788c51566d8e0336e997309f7 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 13:43:19 -0600 Subject: [PATCH 29/42] add bcrypt dependency --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index aa004087cd..22a2e9c039 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,11 @@ + + org.mindrot + jbcrypt + 0.3m + javax.servlet javax.servlet-api From 35c03c64b0efb30146400a35a1f9dc1fec435bd9 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 13:44:09 -0600 Subject: [PATCH 30/42] add password utility class --- .../java/com/codeup/adlister/util/Password.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/com/codeup/adlister/util/Password.java diff --git a/src/main/java/com/codeup/adlister/util/Password.java b/src/main/java/com/codeup/adlister/util/Password.java new file mode 100644 index 0000000000..1ca33b20dd --- /dev/null +++ b/src/main/java/com/codeup/adlister/util/Password.java @@ -0,0 +1,15 @@ +package com.codeup.adlister.util; + +import org.mindrot.jbcrypt.BCrypt; + +public class Password { + private static final int ROUNDS = 12; + + public static String hash(String password) { + return BCrypt.hashpw(password, BCrypt.gensalt(ROUNDS)); + } + + public static boolean check(String password, String hash) { + return BCrypt.checkpw(password, hash); + } +} From 84ca65299ab82c03d3bbed153b5ee84c4f4a95b0 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 13:46:42 -0600 Subject: [PATCH 31/42] hash passwords ensure a password is hashed whenever the password field is set in the User model --- src/main/java/com/codeup/adlister/models/User.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/codeup/adlister/models/User.java b/src/main/java/com/codeup/adlister/models/User.java index d5a5b8b42d..e43bc0dc81 100644 --- a/src/main/java/com/codeup/adlister/models/User.java +++ b/src/main/java/com/codeup/adlister/models/User.java @@ -1,5 +1,7 @@ package com.codeup.adlister.models; +import com.codeup.adlister.util.Password; + public class User { private long id; private String username; @@ -11,7 +13,7 @@ public User() {} public User(String username, String email, String password) { this.username = username; this.email = email; - this.password = password; + setPassword(password); } public User(long id, String username, String email, String password) { @@ -50,6 +52,6 @@ public String getPassword() { } public void setPassword(String password) { - this.password = password; + this.password = Password.hash(password); } } From 724967230d9680aecabf648d602cbdee67eea923 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 13:48:01 -0600 Subject: [PATCH 32/42] verify password hashes when logging in --- .../java/com/codeup/adlister/controllers/LoginServlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java index a7e62dc54f..e5c52723a2 100644 --- a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -2,6 +2,7 @@ import com.codeup.adlister.dao.DaoFactory; import com.codeup.adlister.models.User; +import com.codeup.adlister.util.Password; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -30,7 +31,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) return; } - boolean validAttempt = password.equals(user.getPassword()); + boolean validAttempt = Password.check(password, user.getPassword()); if (validAttempt) { request.getSession().setAttribute("user", user); From f32e5ef27644350f19830f59a425db87d351d8ab Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Fri, 9 Dec 2016 13:53:22 -0600 Subject: [PATCH 33/42] only allow ad creation if a user is logged in - add the id of the logged in user when an ad is created --- .../com/codeup/adlister/controllers/CreateAdServlet.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java index 5fd38ad79d..38775bc6f7 100644 --- a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -2,6 +2,7 @@ import com.codeup.adlister.dao.DaoFactory; import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -13,13 +14,18 @@ @WebServlet(name = "controllers.CreateAdServlet", urlPatterns = "/ads/create") public class CreateAdServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } request.getRequestDispatcher("/WEB-INF/ads/create.jsp") .forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + User user = (User) request.getSession().getAttribute("user"); Ad ad = new Ad( - 1, // for now we'll hardcode the user id + user.getId(), request.getParameter("title"), request.getParameter("description") ); From 9b42e04362993a13079dd55ae6944fc7a1cb9700 Mon Sep 17 00:00:00 2001 From: Alexia Briones Ornelas Date: Mon, 20 Mar 2023 11:17:39 -0500 Subject: [PATCH 34/42] added more Ad bean entities and updated migration file --- migration.sql | 3 ++ .../adlister/controllers/CounterServlet.java | 17 ----------- .../controllers/HelloWorldServlet.java | 14 ---------- .../java/com/codeup/adlister/models/Ad.java | 28 +++++++++++++++++++ src/main/webapp/WEB-INF/ads/index.jsp | 1 + 5 files changed, 32 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/com/codeup/adlister/controllers/CounterServlet.java delete mode 100644 src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java diff --git a/migration.sql b/migration.sql index 2804d64c3f..308fc8b7e5 100644 --- a/migration.sql +++ b/migration.sql @@ -16,6 +16,9 @@ CREATE TABLE ads ( user_id INT UNSIGNED NOT NULL, title VARCHAR(240) NOT NULL, description TEXT NOT NULL, + img_url VARCHAR(150) NOT NULL, #MAYBE ADD DEFAULT STATE IF NO IMG ADDED + gender VARCHAR(5) NOT NULL, + price DECIMAL(10, 2), # 12,345,678.90 PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE diff --git a/src/main/java/com/codeup/adlister/controllers/CounterServlet.java b/src/main/java/com/codeup/adlister/controllers/CounterServlet.java deleted file mode 100644 index f66c52d7aa..0000000000 --- a/src/main/java/com/codeup/adlister/controllers/CounterServlet.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.codeup.adlister.controllers; - -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "controllers.CounterServlet", urlPatterns = "/count") -public class CounterServlet extends HttpServlet { - private int counter = 0; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - counter += 1; - response.getWriter().println("

The count is " + counter + ".

"); - } -} diff --git a/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java b/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java deleted file mode 100644 index 4ab9b9da70..0000000000 --- a/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.codeup.adlister.controllers; - -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "controllers.HelloWorldServlet", urlPatterns = "/") -public class HelloWorldServlet extends HttpServlet { - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - response.getWriter().println("

Hello, World!

"); - } -} diff --git a/src/main/java/com/codeup/adlister/models/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java index 9e9e02d87e..1ae9a79ce1 100644 --- a/src/main/java/com/codeup/adlister/models/Ad.java +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -5,6 +5,10 @@ public class Ad { private long userId; private String title; private String description; + private String img_url; + private String gender; + private double price; + public Ad(long id, long userId, String title, String description) { this.id = id; @@ -50,4 +54,28 @@ public String getDescription() { public void setDescription(String description) { this.description = description; } + + public String getImg_url() { + return img_url; + } + + public void setImg_url(String img_url) { + this.img_url = img_url; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } } diff --git a/src/main/webapp/WEB-INF/ads/index.jsp b/src/main/webapp/WEB-INF/ads/index.jsp index 6f4371f0bb..ad59930d8b 100644 --- a/src/main/webapp/WEB-INF/ads/index.jsp +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -15,6 +15,7 @@

${ad.title}

+

${ad.description}

From 669632688f0712096a623b3b8c3398682c6e7cc5 Mon Sep 17 00:00:00 2001 From: RydCri <> Date: Mon, 20 Mar 2023 10:02:31 -0700 Subject: [PATCH 35/42] project pom updated, fresh databse adlister_db_project used for storage --- migration.sql | 2 +- pom.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/migration.sql b/migration.sql index a70d2eab38..2804d64c3f 100644 --- a/migration.sql +++ b/migration.sql @@ -1,4 +1,4 @@ -USE adlister_db; +USE adlister_project_db; DROP TABLE IF EXISTS ads; DROP TABLE IF EXISTS users; diff --git a/pom.xml b/pom.xml index 22a2e9c039..a40f97cf49 100644 --- a/pom.xml +++ b/pom.xml @@ -16,8 +16,8 @@ maven-compiler-plugin 3.6.0 - 1.8 - 1.8 + 16 + 16 @@ -27,7 +27,7 @@ org.mindrot jbcrypt - 0.3m + 0.4 javax.servlet @@ -42,7 +42,7 @@ mysql mysql-connector-java - 6.0.5 + 8.0.32
From 200793128884651975c843930087a2eb7c6142f4 Mon Sep 17 00:00:00 2001 From: Alexia Briones Ornelas Date: Mon, 20 Mar 2023 12:05:59 -0500 Subject: [PATCH 36/42] added extra features and edited forms to match --- migration.sql | 1 + .../adlister/controllers/CreateAdServlet.java | 12 +++++++--- .../java/com/codeup/adlister/models/Ad.java | 22 +++++++++++++++++++ src/main/webapp/WEB-INF/ads/create.jsp | 20 +++++++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/migration.sql b/migration.sql index 308fc8b7e5..7c5114847e 100644 --- a/migration.sql +++ b/migration.sql @@ -19,6 +19,7 @@ CREATE TABLE ads ( img_url VARCHAR(150) NOT NULL, #MAYBE ADD DEFAULT STATE IF NO IMG ADDED gender VARCHAR(5) NOT NULL, price DECIMAL(10, 2), # 12,345,678.90 + age VARCHAR(128), PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE diff --git a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java index 38775bc6f7..997251015c 100644 --- a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -25,10 +25,16 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { User user = (User) request.getSession().getAttribute("user"); Ad ad = new Ad( - user.getId(), - request.getParameter("title"), - request.getParameter("description") + user.getId(), + request.getParameter("title"), + request.getParameter("description"), + request.getParameter("img_url"), + request.getParameter("gender"), + Double.parseDouble(request.getParameter("price")), + Integer.parseInt(request.getParameter("age")) ); + + DaoFactory.getAdsDao().insert(ad); response.sendRedirect("/ads"); } diff --git a/src/main/java/com/codeup/adlister/models/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java index 1ae9a79ce1..dba2e2ed45 100644 --- a/src/main/java/com/codeup/adlister/models/Ad.java +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -8,6 +8,7 @@ public class Ad { private String img_url; private String gender; private double price; + private int age; public Ad(long id, long userId, String title, String description) { @@ -23,6 +24,19 @@ public Ad(long userId, String title, String description) { this.description = description; } + + // additional features constructor + public Ad(long userId, String title, String description, String img_url, String gender, double price, int age) + { + this.userId = userId; + this.title = title; + this.description = description; + this.img_url = img_url; + this.gender = gender; + this.price = price; + this.age = age; + } + public long getId() { return id; } @@ -78,4 +92,12 @@ public double getPrice() { public void setPrice(double price) { this.price = price; } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } } diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp index f6332692f7..eee05ac4ed 100644 --- a/src/main/webapp/WEB-INF/ads/create.jsp +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -17,6 +17,26 @@
+
+ + +
+
+ + +
+
+ + +
+
+ + +
From b786f3ed39c3aff95b946e7970e05e4016eafde1 Mon Sep 17 00:00:00 2001 From: Kenneth Hayles Date: Mon, 20 Mar 2023 12:27:00 -0500 Subject: [PATCH 37/42] feat: added user specific navbar and edit profile servlet --- pom.xml | 2 +- .../adlister/controllers/CounterServlet.java | 17 --------------- .../controllers/EditProfileServlet.java | 21 +++++++++++++++++++ .../controllers/HelloWorldServlet.java | 14 ------------- src/main/webapp/WEB-INF/editProfile.jsp | 16 ++++++++++++++ src/main/webapp/WEB-INF/partials/navbar.jsp | 1 - .../webapp/WEB-INF/partials/userNavbar.jsp | 13 ++++++++++++ src/main/webapp/WEB-INF/profile.jsp | 2 +- 8 files changed, 52 insertions(+), 34 deletions(-) delete mode 100644 src/main/java/com/codeup/adlister/controllers/CounterServlet.java create mode 100644 src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java delete mode 100644 src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java create mode 100644 src/main/webapp/WEB-INF/editProfile.jsp create mode 100644 src/main/webapp/WEB-INF/partials/userNavbar.jsp diff --git a/pom.xml b/pom.xml index a40f97cf49..2d12dc7c5a 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ javax.servlet javax.servlet-api - 3.0.1 + 4.0.1 jstl diff --git a/src/main/java/com/codeup/adlister/controllers/CounterServlet.java b/src/main/java/com/codeup/adlister/controllers/CounterServlet.java deleted file mode 100644 index f66c52d7aa..0000000000 --- a/src/main/java/com/codeup/adlister/controllers/CounterServlet.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.codeup.adlister.controllers; - -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "controllers.CounterServlet", urlPatterns = "/count") -public class CounterServlet extends HttpServlet { - private int counter = 0; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - counter += 1; - response.getWriter().println("

The count is " + counter + ".

"); - } -} diff --git a/src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java b/src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java new file mode 100644 index 0000000000..3b441f7f42 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java @@ -0,0 +1,21 @@ +package com.codeup.adlister.controllers; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.EditProfileServlet", urlPatterns = "/edit-profile") +public class EditProfileServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/editProfile.jsp") + .forward(request, response); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java b/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java deleted file mode 100644 index 4ab9b9da70..0000000000 --- a/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.codeup.adlister.controllers; - -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "controllers.HelloWorldServlet", urlPatterns = "/") -public class HelloWorldServlet extends HttpServlet { - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - response.getWriter().println("

Hello, World!

"); - } -} diff --git a/src/main/webapp/WEB-INF/editProfile.jsp b/src/main/webapp/WEB-INF/editProfile.jsp new file mode 100644 index 0000000000..bab6857d89 --- /dev/null +++ b/src/main/webapp/WEB-INF/editProfile.jsp @@ -0,0 +1,16 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Edit your profile below ${sessionScope.user.username}!

+
+ + + diff --git a/src/main/webapp/WEB-INF/partials/navbar.jsp b/src/main/webapp/WEB-INF/partials/navbar.jsp index 8e1f98f662..8cf38cf3e1 100644 --- a/src/main/webapp/WEB-INF/partials/navbar.jsp +++ b/src/main/webapp/WEB-INF/partials/navbar.jsp @@ -6,7 +6,6 @@
diff --git a/src/main/webapp/WEB-INF/partials/userNavbar.jsp b/src/main/webapp/WEB-INF/partials/userNavbar.jsp new file mode 100644 index 0000000000..deb6cdca66 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/userNavbar.jsp @@ -0,0 +1,13 @@ + diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp index 05e3fa7a91..63ab8ab5a6 100644 --- a/src/main/webapp/WEB-INF/profile.jsp +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -6,7 +6,7 @@
- +

Welcome, ${sessionScope.user.username}!

From 758032fe6e3c6228738d2e5586d231bbdff121b9 Mon Sep 17 00:00:00 2001 From: RydCri <> Date: Mon, 20 Mar 2023 11:37:32 -0700 Subject: [PATCH 38/42] webapp folder given basic styling from style partial --- src/main/webapp/WEB-INF/ads/create.jsp | 1 + src/main/webapp/WEB-INF/ads/index.jsp | 25 ++++++++++++++----- src/main/webapp/WEB-INF/login.jsp | 3 +++ src/main/webapp/WEB-INF/logout.jsp | 28 ++++++++++++++++++++++ src/main/webapp/WEB-INF/partials/head.jsp | 2 +- src/main/webapp/WEB-INF/partials/style.jsp | 18 ++++++++++++++ src/main/webapp/WEB-INF/profile.jsp | 1 + src/main/webapp/WEB-INF/register.jsp | 1 + src/main/webapp/index.jsp | 1 + 9 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/main/webapp/WEB-INF/logout.jsp create mode 100644 src/main/webapp/WEB-INF/partials/style.jsp diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp index f6332692f7..6418bc6d57 100644 --- a/src/main/webapp/WEB-INF/ads/create.jsp +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -6,6 +6,7 @@ +

Create a new Ad

diff --git a/src/main/webapp/WEB-INF/ads/index.jsp b/src/main/webapp/WEB-INF/ads/index.jsp index ad59930d8b..4684b9863c 100644 --- a/src/main/webapp/WEB-INF/ads/index.jsp +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -7,19 +7,32 @@ - + +
-
-

Here Are all the ads!

+
+

Adlister

-
+

${ad.title}

-

${ad.description}

+
- + diff --git a/src/main/webapp/WEB-INF/login.jsp b/src/main/webapp/WEB-INF/login.jsp index 83ce2d0a1f..8cf2a99a9b 100644 --- a/src/main/webapp/WEB-INF/login.jsp +++ b/src/main/webapp/WEB-INF/login.jsp @@ -6,6 +6,7 @@ +

Please Log In

@@ -20,6 +21,8 @@
+ +

New user? Sign up!

diff --git a/src/main/webapp/WEB-INF/logout.jsp b/src/main/webapp/WEB-INF/logout.jsp new file mode 100644 index 0000000000..7bb5cff87b --- /dev/null +++ b/src/main/webapp/WEB-INF/logout.jsp @@ -0,0 +1,28 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + request.getSession().removeAttribute("user"); + request.getSession().invalidate(); +%> + + + + + + + + + +
+

You have been logged out

+

Redirecting to login page

+ +
+ + diff --git a/src/main/webapp/WEB-INF/partials/head.jsp b/src/main/webapp/WEB-INF/partials/head.jsp index a33443d65c..5bc6b167b5 100644 --- a/src/main/webapp/WEB-INF/partials/head.jsp +++ b/src/main/webapp/WEB-INF/partials/head.jsp @@ -1,2 +1,2 @@ ${param.title} - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/partials/style.jsp b/src/main/webapp/WEB-INF/partials/style.jsp new file mode 100644 index 0000000000..698f93e71f --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/style.jsp @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp index 05e3fa7a91..3fb987ff3c 100644 --- a/src/main/webapp/WEB-INF/profile.jsp +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -6,6 +6,7 @@
+
diff --git a/src/main/webapp/WEB-INF/register.jsp b/src/main/webapp/WEB-INF/register.jsp index 4b64e10a43..422478d7e4 100644 --- a/src/main/webapp/WEB-INF/register.jsp +++ b/src/main/webapp/WEB-INF/register.jsp @@ -6,6 +6,7 @@ +

Please fill in your information.

diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 68cf346ec9..1615c6e907 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -7,6 +7,7 @@ +

Welcome to the Adlister!

From c30ad1cf778b379b3752a60c4b28b8baf726f07b Mon Sep 17 00:00:00 2001 From: Alexia Briones Ornelas Date: Mon, 20 Mar 2023 14:45:21 -0500 Subject: [PATCH 39/42] added a blank default image if no image is added on the ad --- migration.sql | 4 ++-- .../adlister/controllers/CreateAdServlet.java | 11 ++++++++++- .../java/com/codeup/adlister/dao/MySQLAdsDao.java | 13 +++++++++++-- src/main/java/com/codeup/adlister/models/Ad.java | 14 ++++++++++++++ src/main/webapp/WEB-INF/ads/create.jsp | 2 +- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/migration.sql b/migration.sql index 7c5114847e..1f4e922e35 100644 --- a/migration.sql +++ b/migration.sql @@ -16,8 +16,8 @@ CREATE TABLE ads ( user_id INT UNSIGNED NOT NULL, title VARCHAR(240) NOT NULL, description TEXT NOT NULL, - img_url VARCHAR(150) NOT NULL, #MAYBE ADD DEFAULT STATE IF NO IMG ADDED - gender VARCHAR(5) NOT NULL, + img_url VARCHAR(300) NOT NULL, #MAYBE ADD DEFAULT STATE IF NO IMG ADDED + gender VARCHAR(20) NOT NULL, price DECIMAL(10, 2), # 12,345,678.90 age VARCHAR(128), PRIMARY KEY (id), diff --git a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java index 997251015c..8290844f09 100644 --- a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -24,17 +24,26 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { User user = (User) request.getSession().getAttribute("user"); + + String img = request.getParameter("img_url"); + + if(img.isEmpty()) + { + img = "https://core.trac.wordpress.org/raw-attachment/ticket/45927/placeholder-image-portrait.png"; + } + Ad ad = new Ad( user.getId(), request.getParameter("title"), request.getParameter("description"), - request.getParameter("img_url"), + img, request.getParameter("gender"), Double.parseDouble(request.getParameter("price")), Integer.parseInt(request.getParameter("age")) ); + DaoFactory.getAdsDao().insert(ad); response.sendRedirect("/ads"); } diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index d58c45f985..5b37548b8b 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -41,11 +41,16 @@ public List all() { @Override public Long insert(Ad ad) { try { - String insertQuery = "INSERT INTO ads(user_id, title, description) VALUES (?, ?, ?)"; + String insertQuery = "INSERT INTO ads(user_id, title, description, img_url, gender, price, age) VALUES (?, ?, ?, ?, ?, ?, ?)"; PreparedStatement stmt = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); stmt.setLong(1, ad.getUserId()); stmt.setString(2, ad.getTitle()); stmt.setString(3, ad.getDescription()); + stmt.setString(4, ad.getImg_url()); + stmt.setString(5, ad.getGender()); + stmt.setDouble(6, ad.getPrice()); + stmt.setInt(7, ad.getAge()); + stmt.executeUpdate(); ResultSet rs = stmt.getGeneratedKeys(); rs.next(); @@ -60,7 +65,11 @@ private Ad extractAd(ResultSet rs) throws SQLException { rs.getLong("id"), rs.getLong("user_id"), rs.getString("title"), - rs.getString("description") + rs.getString("description"), + rs.getString("img_url"), + rs.getString("gender"), + rs.getDouble("price"), + rs.getInt("age") ); } diff --git a/src/main/java/com/codeup/adlister/models/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java index dba2e2ed45..bdc8b6c92d 100644 --- a/src/main/java/com/codeup/adlister/models/Ad.java +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -25,6 +25,19 @@ public Ad(long userId, String title, String description) { } + // constructor with everything on it for extract DAO method + public Ad(long id, long userId, String title, String description, String img_url, String gender, double price, int age) + { + this.id = id; + this.userId = userId; + this.title = title; + this.description = description; + this.img_url = img_url; + this.gender = gender; + this.price = price; + this.age = age; + } + // additional features constructor public Ad(long userId, String title, String description, String img_url, String gender, double price, int age) { @@ -37,6 +50,7 @@ public Ad(long userId, String title, String description, String img_url, String this.age = age; } + public long getId() { return id; } diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp index eee05ac4ed..9fd9c3efc5 100644 --- a/src/main/webapp/WEB-INF/ads/create.jsp +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -26,7 +26,7 @@
- +
From 81a5a565070999d82b5a247cc72b7b25ab8562d2 Mon Sep 17 00:00:00 2001 From: Alexia Briones Ornelas Date: Mon, 20 Mar 2023 15:45:42 -0500 Subject: [PATCH 40/42] added seeder files --- adlister_seeder.sql | 16 ++++++++++++++++ .../com/codeup/adlister/dao/MySQLAdsDao.java | 2 ++ 2 files changed, 18 insertions(+) create mode 100644 adlister_seeder.sql diff --git a/adlister_seeder.sql b/adlister_seeder.sql new file mode 100644 index 0000000000..0e3a4c28a1 --- /dev/null +++ b/adlister_seeder.sql @@ -0,0 +1,16 @@ + +TRUNCATE table ads; +SET FOREIGN_KEY_CHECKS = 0; +TRUNCATE table users; +SET FOREIGN_KEY_CHECKS = 1; + + +INSERT INTO users(username, email, password) VALUES +('MikuHatsune', 'worldismine@email.com', '$2a$12$Ji/mV8KYcSht5MQyEFC.yOQGyOuXPoU.c8bBBVqS/UQd87/SKwAUK'), +('Yimothy', 'yimothy@yahoo.net', '$2a$12$33kjPr4iufbum3L37BLO6.nkLBqOplFO1AQTYGN7O0KqW4diamYSC'); + +INSERT INTO ads (user_id, title, description, img_url, gender, price, age) VALUES +(1, 'Dog', 'I dont know what it is', 'https://static.wikia.nocookie.net/warner-bros-entertainment/images/e/e5/Courage_cartoon_network.png','male',1, 20), +(1, 'Cat', 'Dont eat', 'https://upload.wikimedia.org/wikipedia/en/thumb/e/ed/Nyan_cat_250px_frame.PNG/220px-Nyan_cat_250px_frame.PNG', 'unknown', 100, 12); + + diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index 5b37548b8b..0bb288174c 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -1,6 +1,7 @@ package com.codeup.adlister.dao; import com.codeup.adlister.models.Ad; +import com.codeup.adlister.util.Password; import com.mysql.cj.jdbc.Driver; import java.io.FileInputStream; @@ -80,4 +81,5 @@ private List createAdsFromResults(ResultSet rs) throws SQLException { } return ads; } + } From 60dfe2d6432a527c6963f5c5b04ec3b97ea3bcf3 Mon Sep 17 00:00:00 2001 From: Kenneth Hayles Date: Mon, 20 Mar 2023 15:56:57 -0500 Subject: [PATCH 41/42] feat: add bootstrap 5.3 --- src/main/webapp/WEB-INF/partials/head.jsp | 2 +- .../webapp/WEB-INF/partials/userNavbar.jsp | 1 - src/main/webapp/WEB-INF/profile.jsp | 27 +++++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/WEB-INF/partials/head.jsp b/src/main/webapp/WEB-INF/partials/head.jsp index a33443d65c..5bc6b167b5 100644 --- a/src/main/webapp/WEB-INF/partials/head.jsp +++ b/src/main/webapp/WEB-INF/partials/head.jsp @@ -1,2 +1,2 @@ ${param.title} - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/partials/userNavbar.jsp b/src/main/webapp/WEB-INF/partials/userNavbar.jsp index deb6cdca66..3a5584b5c4 100644 --- a/src/main/webapp/WEB-INF/partials/userNavbar.jsp +++ b/src/main/webapp/WEB-INF/partials/userNavbar.jsp @@ -6,7 +6,6 @@
diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp index 63ab8ab5a6..17a18fa352 100644 --- a/src/main/webapp/WEB-INF/profile.jsp +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -8,9 +8,32 @@ -
-

Welcome, ${sessionScope.user.username}!

+
+ ... +
+

Welcome, ${sessionScope.user.username}!

+
+
    +
  • ${sessionScope.user.email}!

  • +
+
+<%--
--%> +<%--

Welcome, ${sessionScope.user.username}!

--%> +<%--
--%> + + + +<%--//TODO The profile page should display the username and email of the logged-in user and a list of links to all the ads a user has created in the AdLister.–%>--%> + +<%--//TODO When a user logs in the user should be redirected to their profile page.--%> +<%--done--%> + +<%--//TODO The profile view should only be accessible to users that are logged in.--%> +<%--done--%> \ No newline at end of file From e8f761372a60107e237ca66468afec2eafa4ba08 Mon Sep 17 00:00:00 2001 From: RydCri <> Date: Mon, 20 Mar 2023 14:08:03 -0700 Subject: [PATCH 42/42] functionality restored - RegisterServlet was hashing password, this was unnecessary --- migration.sql | 1 + .../codeup/adlister/controllers/LoginServlet.java | 6 +++--- .../adlister/controllers/LogoutServlet.java | 7 +++---- .../adlister/controllers/RegisterServlet.java | 8 ++++---- .../java/com/codeup/adlister/dao/ListAdsDao.java | 2 +- .../java/com/codeup/adlister/dao/MySQLAdsDao.java | 15 ++++++--------- src/main/java/com/codeup/adlister/dao/Users.java | 2 -- 7 files changed, 18 insertions(+), 23 deletions(-) diff --git a/migration.sql b/migration.sql index 308fc8b7e5..12fd2e20a5 100644 --- a/migration.sql +++ b/migration.sql @@ -1,3 +1,4 @@ +CREATE DATABASE IF NOT EXISTS adlister_project_db; USE adlister_project_db; DROP TABLE IF EXISTS ads; diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java index e5c52723a2..d6c920d1c7 100644 --- a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -2,7 +2,7 @@ import com.codeup.adlister.dao.DaoFactory; import com.codeup.adlister.models.User; -import com.codeup.adlister.util.Password; +import org.mindrot.jbcrypt.BCrypt; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -30,8 +30,8 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) response.sendRedirect("/login"); return; } - - boolean validAttempt = Password.check(password, user.getPassword()); + String hashedPassword = user.getPassword(); //hashed password + boolean validAttempt = BCrypt.checkpw(password, hashedPassword); //refactored to entered password to hashed password if (validAttempt) { request.getSession().setAttribute("user", user); diff --git a/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java index e88f9d5241..3d07bffbfd 100644 --- a/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java @@ -1,5 +1,6 @@ package com.codeup.adlister.controllers; +import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -8,9 +9,7 @@ @WebServlet(name = "controllers.LogoutServlet", urlPatterns = "/logout") public class LogoutServlet extends HttpServlet { - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - request.getSession().removeAttribute("user"); - request.getSession().invalidate(); - response.sendRedirect("/login"); + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.getRequestDispatcher("/WEB-INF/logout.jsp").forward(request,response); } } diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index e1e997c17a..ea2ab4d62a 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -24,9 +24,9 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) // validate input boolean inputHasErrors = username.isEmpty() - || email.isEmpty() - || password.isEmpty() - || (! password.equals(passwordConfirmation)); + || email.isEmpty() + || password.isEmpty() + || (! password.equals(passwordConfirmation)); if (inputHasErrors) { response.sendRedirect("/register"); @@ -38,4 +38,4 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) DaoFactory.getUsersDao().insert(user); response.sendRedirect("/login"); } -} +} \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/ListAdsDao.java b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java index 8d3baaa369..e0e6ccdc7c 100644 --- a/src/main/java/com/codeup/adlister/dao/ListAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java @@ -21,7 +21,7 @@ public Long insert(Ad ad) { ads = generateAds(); } // we'll assign an "id" here based on the size of the ads list - // really the dao would handle this + // really the com.codeup.adlister.dao would handle this ad.setId((long) ads.size()); ads.add(ad); return ad.getId(); diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index d58c45f985..62df4f4c3d 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -3,9 +3,6 @@ import com.codeup.adlister.models.Ad; import com.mysql.cj.jdbc.Driver; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -42,12 +39,12 @@ public List all() { public Long insert(Ad ad) { try { String insertQuery = "INSERT INTO ads(user_id, title, description) VALUES (?, ?, ?)"; - PreparedStatement stmt = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); - stmt.setLong(1, ad.getUserId()); - stmt.setString(2, ad.getTitle()); - stmt.setString(3, ad.getDescription()); - stmt.executeUpdate(); - ResultSet rs = stmt.getGeneratedKeys(); + PreparedStatement ps = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); + ps.setLong(1, ad.getUserId()); + ps.setString(2, ad.getTitle()); + ps.setString(3, ad.getDescription()); + ps.executeUpdate(); + ResultSet rs = ps.getGeneratedKeys(); rs.next(); return rs.getLong(1); } catch (SQLException e) { diff --git a/src/main/java/com/codeup/adlister/dao/Users.java b/src/main/java/com/codeup/adlister/dao/Users.java index 62da74d20b..c434147497 100644 --- a/src/main/java/com/codeup/adlister/dao/Users.java +++ b/src/main/java/com/codeup/adlister/dao/Users.java @@ -2,8 +2,6 @@ import com.codeup.adlister.models.User; -import java.util.List; - public interface Users { User findByUsername(String username); Long insert(User user);