From 569201df71075558e62134b3215e85d8eec40fbb Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 1 Dec 2016 18:06:13 -0600 Subject: [PATCH 01/50] initial commit - pom.xml setup to include servlets - skeleton of a hello world servlet --- .gitignore | 3 +++ pom.xml | 34 ++++++++++++++++++++++++++++ src/main/java/HelloWorldServlet.java | 9 ++++++++ 3 files changed, 46 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/HelloWorldServlet.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a65bf3836e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.iml +target/ +.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..4782732164 --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + com.codeup.adlister + adlister + 1.0-SNAPSHOT + war + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.0 + + 1.8 + 1.8 + + + + + + + + javax.servlet + javax.servlet-api + 3.0.1 + + + + \ No newline at end of file diff --git a/src/main/java/HelloWorldServlet.java b/src/main/java/HelloWorldServlet.java new file mode 100644 index 0000000000..dd49fb7133 --- /dev/null +++ b/src/main/java/HelloWorldServlet.java @@ -0,0 +1,9 @@ +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HelloWorldServlet extends HttpServlet { + protected void doGet(HttpServletRequest req, HttpServletResponse res) { + + } +} From eff71ffa664ef58a3ae91431548b36e26e2ebe30 Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 1 Dec 2016 18:18:14 -0600 Subject: [PATCH 02/50] 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 03/50] 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 04/50] 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 05/50] 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 06/50] 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 07/50] 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 08/50] 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 09/50] 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 10/50] 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 11/50] 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 12/50] 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 13/50] 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 14/50] 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 15/50] 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 16/50] 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 17/50] 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 18/50] 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 19/50] 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 20/50] 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 21/50] 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 22/50] 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 23/50] 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 24/50] 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 25/50] 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 26/50] 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 27/50] 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 28/50] 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 29/50] 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 30/50] 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 31/50] 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 32/50] 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 33/50] 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 34/50] 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 5a8a0a5b1a2069c1c001812234e30dbbe0ae015c Mon Sep 17 00:00:00 2001 From: Nathan Haustveit Date: Fri, 6 May 2022 16:14:01 -0500 Subject: [PATCH 35/50] update mysql connector --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 22a2e9c039..f984c8e28f 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ mysql mysql-connector-java - 6.0.5 + 8.0.29 From dca66412b0acd47f5ab17f8ef4b01bc7626959a2 Mon Sep 17 00:00:00 2001 From: Christopher Berry Date: Sat, 7 May 2022 12:40:40 -0500 Subject: [PATCH 36/50] complete migration and seeder filesbased on group planning --- migration.sql | 22 ---------------------- src/main/java/db/migration.sql | 31 +++++++++++++++++++++++++++++++ src/main/java/db/seeder.sql | 18 ++++++++++++++++++ 3 files changed, 49 insertions(+), 22 deletions(-) delete mode 100644 migration.sql create mode 100644 src/main/java/db/migration.sql create mode 100644 src/main/java/db/seeder.sql diff --git a/migration.sql b/migration.sql deleted file mode 100644 index a70d2eab38..0000000000 --- a/migration.sql +++ /dev/null @@ -1,22 +0,0 @@ -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 -); diff --git a/src/main/java/db/migration.sql b/src/main/java/db/migration.sql new file mode 100644 index 0000000000..9dd3a34b79 --- /dev/null +++ b/src/main/java/db/migration.sql @@ -0,0 +1,31 @@ +DROP DATABASE IF EXISTS sa_lister_db; +CREATE DATABASE IF NOT EXISTS sa_lister_db; + +USE sa_lister_db; + +CREATE TABLE IF NOT EXISTS users ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, + username VARCHAR(50) NOT NULL, + email VARCHAR(50) NOT NULL, + password VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS ads ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, + user_id INT UNSIGNED NOT NULL, + title VARCHAR(100) NOT NULL, + description TEXT NOT NULL, + location VARCHAR(100) NOT NULL, + reputation INT, + PRIMARY KEY (id), + FOREIGN KEY (user_id) REFERENCES users(id) +); + +CREATE TABLE IF NOT EXISTS categories ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, + ad_id INT UNSIGNED NOT NULL, + category VARCHAR(50) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (ad_id) REFERENCES ads(id) +); \ No newline at end of file diff --git a/src/main/java/db/seeder.sql b/src/main/java/db/seeder.sql new file mode 100644 index 0000000000..9f744e2b5c --- /dev/null +++ b/src/main/java/db/seeder.sql @@ -0,0 +1,18 @@ +USE sa_lister_db; + +INSERT INTO users (username, email, password) +VALUES ('Chris', 'chris@email.com', 'password'), + ('Sam', 'sam@email.com', 'password'), + ('Nathan', 'nathan@email.com', 'password'); + +INSERT INTO ads (user_id, title, description, location) +VALUES ('1', 'Bunz', 'Local burger restaraunt with some of the best burgers in town.', '122 E Houston St, San Antonio, TX 78205'), + ('1', 'Witte Museum', 'The Witte Museum was established in 1926 and is located in Brackenridge Park in San Antonio, Texas. It is dedicated to telling the stories of Texas, from prehistory to the present.', '3801 Broadway, San Antonio, TX 78209'), + ('2', 'McAllister Park', 'Park located on the north side of San Antonio that is comprised of 713 acres. It is great for walking, biking, and even has a dog park.', '13102 Jones Maltsberger Rd, San Antonio, TX 78247'), + ('3', 'Pearl Brewery', 'The Pearl San Antonio is a district in the city with a rich history. Initially home to the Pearl Brewery, which operated from 1883 to 2001, the Pearl district offers shops, a twice-weekly farmers market, restaurants, apartments, an outdoor park area, the Culinary Institute of America, and the Hotel Emma.', 'The, Pearl Pkwy, San Antonio, TX 78215'); + +INSERT INTO categories (ad_id, category) +VALUES ('1', 'restaurant'), + ('2', 'history'), + ('3', 'outdoors'), + ('4', 'family'); From e67985ebc0eeaf83ec819c885f71c78e208abde9 Mon Sep 17 00:00:00 2001 From: Christopher Berry Date: Mon, 9 May 2022 09:51:45 -0500 Subject: [PATCH 37/50] update seeder users profiles with hashed passwords --- src/main/java/com/codeup/adlister/dao/Users.java | 2 +- src/main/java/db/seeder.sql | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/codeup/adlister/dao/Users.java b/src/main/java/com/codeup/adlister/dao/Users.java index 62da74d20b..52fe8ae252 100644 --- a/src/main/java/com/codeup/adlister/dao/Users.java +++ b/src/main/java/com/codeup/adlister/dao/Users.java @@ -7,4 +7,4 @@ public interface Users { User findByUsername(String username); Long insert(User user); -} +} \ No newline at end of file diff --git a/src/main/java/db/seeder.sql b/src/main/java/db/seeder.sql index 9f744e2b5c..3eacc30e28 100644 --- a/src/main/java/db/seeder.sql +++ b/src/main/java/db/seeder.sql @@ -1,9 +1,9 @@ USE sa_lister_db; INSERT INTO users (username, email, password) -VALUES ('Chris', 'chris@email.com', 'password'), - ('Sam', 'sam@email.com', 'password'), - ('Nathan', 'nathan@email.com', 'password'); +VALUES ('Chris', 'chris@email.com', '$2a$12$PR.9ruxGJVsOfOGHCIYzl.JyA2CCxhMJXsosr2GTRM0exQPej3H/O'), + ('Sam', 'sam@email.com', '$2a$12$PR.9ruxGJVsOfOGHCIYzl.JyA2CCxhMJXsosr2GTRM0exQPej3H/O'), + ('Nathan', 'nathan@email.com', '$2a$12$PR.9ruxGJVsOfOGHCIYzl.JyA2CCxhMJXsosr2GTRM0exQPej3H/O'); INSERT INTO ads (user_id, title, description, location) VALUES ('1', 'Bunz', 'Local burger restaraunt with some of the best burgers in town.', '122 E Houston St, San Antonio, TX 78205'), From 631138e27ab4f28f020051cfa91adbc040a60ebd Mon Sep 17 00:00:00 2001 From: Nathan Haustveit Date: Mon, 9 May 2022 09:52:53 -0500 Subject: [PATCH 38/50] updated jbcrypt and javax versions --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f984c8e28f..5587ee478f 100644 --- a/pom.xml +++ b/pom.xml @@ -27,12 +27,12 @@ org.mindrot jbcrypt - 0.3m + 0.4 javax.servlet javax.servlet-api - 3.0.1 + 4.0.1 jstl From ef2551ff46b1de4c2c1ee00abec2e34f2d9dd070 Mon Sep 17 00:00:00 2001 From: Samuel Arguello Date: Mon, 9 May 2022 10:03:15 -0500 Subject: [PATCH 39/50] refactored nav bar to include drop down user menu --- .gitignore | 2 +- src/main/webapp/WEB-INF/partials/navbar.jsp | 65 +++++++++++++++++---- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index a2b7aa3f3d..f335dee584 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ *.iml target/ .idea/ -Config.java +Config.java \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/partials/navbar.jsp b/src/main/webapp/WEB-INF/partials/navbar.jsp index 8e1f98f662..27a5f88f37 100644 --- a/src/main/webapp/WEB-INF/partials/navbar.jsp +++ b/src/main/webapp/WEB-INF/partials/navbar.jsp @@ -1,13 +1,58 @@ -
+ + +<%--
--%> +<%-- --%> From 3817be37540c7a0707665291b346a53ec201c4a3 Mon Sep 17 00:00:00 2001 From: Samuel Arguello Date: Mon, 9 May 2022 11:26:34 -0500 Subject: [PATCH 40/50] added category model and interface, updated DAOfactory and created CateforiesDoa methods --- .../com/codeup/adlister/dao/Categories.java | 13 ++++ .../com/codeup/adlister/dao/DaoFactory.java | 8 +++ .../adlister/dao/MySQLCategoriesDao.java | 64 +++++++++++++++++++ .../com/codeup/adlister/models/Category.java | 42 ++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 src/main/java/com/codeup/adlister/dao/Categories.java create mode 100644 src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java create mode 100644 src/main/java/com/codeup/adlister/models/Category.java diff --git a/src/main/java/com/codeup/adlister/dao/Categories.java b/src/main/java/com/codeup/adlister/dao/Categories.java new file mode 100644 index 0000000000..f7a3cb1061 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Categories.java @@ -0,0 +1,13 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Category; + +import java.util.List; + +public interface Categories { + // list all categories in the category table + List all(); + + // find all ads with a specific category + Category findByCategory(String category); +} diff --git a/src/main/java/com/codeup/adlister/dao/DaoFactory.java b/src/main/java/com/codeup/adlister/dao/DaoFactory.java index e002140f85..53b486634b 100644 --- a/src/main/java/com/codeup/adlister/dao/DaoFactory.java +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -3,6 +3,7 @@ public class DaoFactory { private static Ads adsDao; private static Users usersDao; + private static Categories categoryDao; private static Config config = new Config(); public static Ads getAdsDao() { @@ -18,4 +19,11 @@ public static Users getUsersDao() { } return usersDao; } + + public static Categories getCategoriesDao() { + if (categoryDao == null) { + categoryDao = new MySQLCategoriesDao(config); + } + return categoryDao; + } } diff --git a/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java b/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java new file mode 100644 index 0000000000..fe9ffef792 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java @@ -0,0 +1,64 @@ +package com.codeup.adlister.dao; +import com.codeup.adlister.models.Category; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class MySQLCategoriesDao implements Categories{ + private Connection connection; + + public MySQLCategoriesDao(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 List all() { + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement("SELECT * FROM categories"); + ResultSet rs = stmt.executeQuery(); + return createCategoriesFromList(rs); + } catch(SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + @Override + public Category findByCategory(String category) { + String query = "SELECT * FROM categories WHERE category = ? LIMIT 1"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setString(1, category); + return extractCategory(stmt.executeQuery()); + } catch(SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + private Category extractCategory(ResultSet rs) throws SQLException { + return new Category( + rs.getLong("id"), + rs.getLong("ad_id"), + rs.getString("category") + ); + } + + private List createCategoriesFromList(ResultSet rs) throws SQLException { + List categories = new ArrayList<>(); + while (rs.next()) { + categories.add(extractCategory(rs)); + } + return categories; + } +} diff --git a/src/main/java/com/codeup/adlister/models/Category.java b/src/main/java/com/codeup/adlister/models/Category.java new file mode 100644 index 0000000000..3f5dcc03f5 --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/Category.java @@ -0,0 +1,42 @@ +package com.codeup.adlister.models; + +public class Category { + private long id; + private long ad_id; + private String category; + + public Category(long id, long ad_id, String category){ + this.id = id; + this.ad_id = ad_id; + this.category = category; + } + + public Category(long ad_id, String category){ + this.ad_id = ad_id; + this.category = category; + } + + public long getId() { + return id; + } + + public long getAd_id() { + return ad_id; + } + + public String getCategory() { + return category; + } + + public void setId(long id) { + this.id = id; + } + + public void setAd_id(long ad_id) { + this.ad_id = ad_id; + } + + public void setCategory(String category) { + this.category = category; + } +} From e51bbf84d6f44c75a236ee568d073b4a328ebd75 Mon Sep 17 00:00:00 2001 From: Samuel Arguello Date: Mon, 9 May 2022 12:01:18 -0500 Subject: [PATCH 41/50] working on sql statement issue --- src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java b/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java index fe9ffef792..ca191e180d 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java @@ -36,7 +36,9 @@ public List all() { @Override public Category findByCategory(String category) { - String query = "SELECT * FROM categories WHERE category = ? LIMIT 1"; + String query = "SELECT * FROM ads a JOIN categories c ON a.id = c.ad_id WHERE category = ? LIMIT 1"; + +// WHERE category = ? LIMIT 1 try { PreparedStatement stmt = connection.prepareStatement(query); stmt.setString(1, category); From 6f57745b7d36ef7b6101335b4e539e63ad5bbaac Mon Sep 17 00:00:00 2001 From: Christopher Berry Date: Mon, 9 May 2022 12:14:40 -0500 Subject: [PATCH 42/50] feat: create add functionality --- .../adlister/controllers/CreateAdServlet.java | 3 +- .../adlister/controllers/UpdateAdServlet.java | 35 +++++++++++ .../java/com/codeup/adlister/dao/Ads.java | 5 ++ .../com/codeup/adlister/dao/ListAdsDao.java | 58 ------------------- .../com/codeup/adlister/dao/MySQLAdsDao.java | 42 +++++++++++--- .../java/com/codeup/adlister/models/Ad.java | 19 +++++- src/main/webapp/WEB-INF/ads/create.jsp | 4 ++ src/main/webapp/WEB-INF/ads/index.jsp | 18 +++++- 8 files changed, 114 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java delete mode 100644 src/main/java/com/codeup/adlister/dao/ListAdsDao.java diff --git a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java index 38775bc6f7..64c782c142 100644 --- a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -27,7 +27,8 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) Ad ad = new Ad( user.getId(), request.getParameter("title"), - request.getParameter("description") + request.getParameter("description"), + request.getParameter("location") ); DaoFactory.getAdsDao().insert(ad); response.sendRedirect("/ads"); diff --git a/src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java new file mode 100644 index 0000000000..0175c8748d --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java @@ -0,0 +1,35 @@ +//package com.codeup.adlister.controllers; +// +//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; +//import javax.servlet.http.HttpServlet; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +// +//@WebServlet(name = "controllers.CreateAdServlet", urlPatterns = "/ads/update") +//public class UpdateAdServlet 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( +// user.getId(), +// request.getParameter("title"), +// request.getParameter("description") +// ); +// DaoFactory.getAdsDao().insert(ad); +// response.sendRedirect("/ads"); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/Ads.java b/src/main/java/com/codeup/adlister/dao/Ads.java index 79dc59f484..ce3eb2e570 100644 --- a/src/main/java/com/codeup/adlister/dao/Ads.java +++ b/src/main/java/com/codeup/adlister/dao/Ads.java @@ -9,4 +9,9 @@ public interface Ads { List all(); // insert a new ad and return the new ad's id Long insert(Ad ad); + //edit existing ad + void update(Ad ad); + //delete existing ad + void destroy(Ad ad); + } diff --git a/src/main/java/com/codeup/adlister/dao/ListAdsDao.java b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java deleted file mode 100644 index 8d3baaa369..0000000000 --- a/src/main/java/com/codeup/adlister/dao/ListAdsDao.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.codeup.adlister.dao; - -import com.codeup.adlister.models.Ad; - -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; - } - - 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 dao 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( - 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; - } -} diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index d58c45f985..f4ffab1936 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -38,14 +38,23 @@ public List all() { } } + private List createAdsFromResults(ResultSet rs) throws SQLException { + List ads = new ArrayList<>(); + while (rs.next()) { + ads.add(extractAd(rs)); + } + return ads; + } + @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, location) 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.getLocation()); stmt.executeUpdate(); ResultSet rs = stmt.getGeneratedKeys(); rs.next(); @@ -60,15 +69,30 @@ 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("location") ); } - private List createAdsFromResults(ResultSet rs) throws SQLException { - List ads = new ArrayList<>(); - while (rs.next()) { - ads.add(extractAd(rs)); - } - return ads; + @Override + public void update(Ad ad) { +// try { +// String insertQuery = "UPDATE ads SET (title = ?, description = ?, location = ?)"; +// PreparedStatement stmt = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); +// stmt.setString(1, ad.getTitle()); +// stmt.setString(2, ad.getDescription()); +// stmt.setString(3, ad.getLocation()); +// stmt.executeUpdate(); +// ResultSet rs = stmt.getGeneratedKeys(); +// rs.next(); +// } catch (SQLException e) { +// throw new RuntimeException("Error updating ad.", e); +// } } -} + + @Override + public void destroy(Ad ad) { + + } + +} //end \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/models/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java index 9e9e02d87e..25660a043b 100644 --- a/src/main/java/com/codeup/adlister/models/Ad.java +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -5,12 +5,14 @@ public class Ad { private long userId; private String title; private String description; + private String location; - public Ad(long id, long userId, String title, String description) { + public Ad(long id, long userId, String title, String description, String location) { this.id = id; this.userId = userId; this.title = title; this.description = description; + this.location = location; } public Ad(long userId, String title, String description) { @@ -19,6 +21,13 @@ public Ad(long userId, String title, String description) { this.description = description; } + public Ad(long userId, String title, String description, String location) { + this.userId = userId; + this.title = title; + this.description = description; + this.location = location; + } + public long getId() { return id; } @@ -50,4 +59,12 @@ public String getDescription() { public void setDescription(String description) { this.description = description; } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } } diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp index f6332692f7..4aac76ba85 100644 --- a/src/main/webapp/WEB-INF/ads/create.jsp +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -17,6 +17,10 @@
+
+ + +
diff --git a/src/main/webapp/WEB-INF/ads/index.jsp b/src/main/webapp/WEB-INF/ads/index.jsp index 6f4371f0bb..dd5f718b7a 100644 --- a/src/main/webapp/WEB-INF/ads/index.jsp +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -13,9 +13,25 @@

Here Are all the ads!

-
+

${ad.title}

${ad.description}

+
+
+ + +
+<%--
--%> +
+ + +
+<%--
--%> +
+ + +
+
From 74d92c595e8d4f50d206178df5f588fc30610dbe Mon Sep 17 00:00:00 2001 From: Nathan Haustveit Date: Mon, 9 May 2022 12:30:01 -0500 Subject: [PATCH 43/50] edited navbar layout and added ads button --- src/main/webapp/WEB-INF/partials/navbar.jsp | 25 +++++++++++---------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/webapp/WEB-INF/partials/navbar.jsp b/src/main/webapp/WEB-INF/partials/navbar.jsp index 27a5f88f37..5a138d1f98 100644 --- a/src/main/webapp/WEB-INF/partials/navbar.jsp +++ b/src/main/webapp/WEB-INF/partials/navbar.jsp @@ -5,12 +5,17 @@
- + +
<%--