From 569201df71075558e62134b3215e85d8eec40fbb Mon Sep 17 00:00:00 2001 From: Zach Gulde Date: Thu, 1 Dec 2016 18:06:13 -0600 Subject: [PATCH 01/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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 0d6dd5f8ee1a4764bbdcd11c32d41768cbf584ee Mon Sep 17 00:00:00 2001 From: afonse03 Date: Thu, 18 Nov 2021 21:18:28 -0700 Subject: [PATCH 24/29] working solution for user-input exercise --- .../adlister/controllers/RegisterServlet.java | 1 + .../com/codeup/adlister/dao/MySQLAdsDao.java | 2 ++ .../com/codeup/adlister/dao/MySQLUsersDao.java | 4 ++++ src/main/webapp/register.jsp | 16 ++++++++++++++++ 4 files changed, 23 insertions(+) create mode 100644 src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java create mode 100644 src/main/webapp/register.jsp diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index 638fa3a231..f0fbfff3a9 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -17,3 +17,4 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) // TODO: if a user was successfully created, send them to their profile } } +// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index 42508fa6b8..f0b34f52ea 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -2,6 +2,7 @@ import com.codeup.adlister.models.Ad; import com.mysql.cj.jdbc.Driver; +import sun.security.krb5.Config; import java.io.FileInputStream; import java.io.IOException; @@ -75,3 +76,4 @@ private List createAdsFromResults(ResultSet rs) throws SQLException { return ads; } } +// \ No newline at end of file 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..8bb1d57974 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -0,0 +1,4 @@ +package com.codeup.adlister.dao; + +public class MySQLUsersDao { +} diff --git a/src/main/webapp/register.jsp b/src/main/webapp/register.jsp new file mode 100644 index 0000000000..8959ab21d2 --- /dev/null +++ b/src/main/webapp/register.jsp @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: amanda + Date: 11/18/21 + Time: 9:17 PM + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + + + From 5c6fb0976f4f702754873375199d16cde41feee6 Mon Sep 17 00:00:00 2001 From: afonse03 Date: Thu, 18 Nov 2021 21:19:26 -0700 Subject: [PATCH 25/29] working solution for user-input exercise --- .../com/codeup/adlister/dao/MySQLAdsDao.java | 158 +++++++++--------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java index f0b34f52ea..a29871d531 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -1,79 +1,79 @@ -package com.codeup.adlister.dao; - -import com.codeup.adlister.models.Ad; -import com.mysql.cj.jdbc.Driver; -import sun.security.krb5.Config; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; - -public class MySQLAdsDao implements Ads { - private Connection connection = null; - - public MySQLAdsDao(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() { - 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; - } -} -// \ No newline at end of file +//package com.codeup.adlister.dao; +// +//import com.codeup.adlister.models.Ad; +//import com.mysql.cj.jdbc.Driver; +//import sun.security.krb5.Config; +// +//import java.io.FileInputStream; +//import java.io.IOException; +//import java.io.InputStream; +//import java.sql.*; +//import java.util.ArrayList; +//import java.util.List; +// +//public class MySQLAdsDao implements Ads { +// private Connection connection = null; +// +// public MySQLAdsDao(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() { +// 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; +// } +//} +//// \ No newline at end of file From 88bb040fd21c6b961c2fe3d5b0856f417bc07eaf Mon Sep 17 00:00:00 2001 From: afonse03 Date: Sat, 20 Nov 2021 09:24:12 -0700 Subject: [PATCH 26/29] working solution for user input --- .../java/com/codeup/adlister/controllers/RegisterServlet.java | 1 - src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java | 1 + src/main/webapp/register.jsp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index f0fbfff3a9..638fa3a231 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -17,4 +17,3 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) // TODO: if a user was successfully created, send them to their profile } } -// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java index 8bb1d57974..5a7e3cb76c 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -1,4 +1,5 @@ package com.codeup.adlister.dao; public class MySQLUsersDao { +// } diff --git a/src/main/webapp/register.jsp b/src/main/webapp/register.jsp index 8959ab21d2..45e8678f1b 100644 --- a/src/main/webapp/register.jsp +++ b/src/main/webapp/register.jsp @@ -8,7 +8,7 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> - Title + Register From 27a1e16b5bb82501d40fa9cbaf15ea15a8fe2a4a Mon Sep 17 00:00:00 2001 From: afonse03 Date: Sat, 20 Nov 2021 10:40:43 -0700 Subject: [PATCH 27/29] working solution for user input exercise --- .../java/com/codeup/adlister/controllers/RegisterServlet.java | 1 + src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java | 1 + src/main/webapp/register.jsp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index 638fa3a231..f0fbfff3a9 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -17,3 +17,4 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) // TODO: if a user was successfully created, send them to their profile } } +// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java index 5a7e3cb76c..8ae4165ae7 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -3,3 +3,4 @@ public class MySQLUsersDao { // } +// \ No newline at end of file diff --git a/src/main/webapp/register.jsp b/src/main/webapp/register.jsp index 45e8678f1b..ba990e6dfa 100644 --- a/src/main/webapp/register.jsp +++ b/src/main/webapp/register.jsp @@ -14,3 +14,4 @@ +<%----%> \ No newline at end of file From 9ad7cc3a62ff8ec9fd94fa18b151011ab43c3102 Mon Sep 17 00:00:00 2001 From: afonse03 Date: Sun, 21 Nov 2021 22:43:52 -0700 Subject: [PATCH 28/29] working solution --- .../java/com/codeup/adlister/controllers/RegisterServlet.java | 1 - src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java | 1 - src/main/webapp/register.jsp | 1 - 3 files changed, 3 deletions(-) diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index f0fbfff3a9..638fa3a231 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -17,4 +17,3 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) // TODO: if a user was successfully created, send them to their profile } } -// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java index 8ae4165ae7..de474a432d 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -1,6 +1,5 @@ package com.codeup.adlister.dao; public class MySQLUsersDao { -// } // \ No newline at end of file diff --git a/src/main/webapp/register.jsp b/src/main/webapp/register.jsp index ba990e6dfa..45e8678f1b 100644 --- a/src/main/webapp/register.jsp +++ b/src/main/webapp/register.jsp @@ -14,4 +14,3 @@ -<%----%> \ No newline at end of file From b83a53d477685b928958752d9bb183f9f4bf4d4f Mon Sep 17 00:00:00 2001 From: afonse03 Date: Sun, 21 Nov 2021 23:01:17 -0700 Subject: [PATCH 29/29] working solution --- .../java/com/codeup/adlister/controllers/RegisterServlet.java | 1 + src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java | 1 - src/main/webapp/register.jsp | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java index 638fa3a231..f0fbfff3a9 100644 --- a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -17,3 +17,4 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) // TODO: if a user was successfully created, send them to their profile } } +// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java index de474a432d..8bb1d57974 100644 --- a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -2,4 +2,3 @@ public class MySQLUsersDao { } -// \ No newline at end of file diff --git a/src/main/webapp/register.jsp b/src/main/webapp/register.jsp index 45e8678f1b..ba990e6dfa 100644 --- a/src/main/webapp/register.jsp +++ b/src/main/webapp/register.jsp @@ -14,3 +14,4 @@ +<%----%> \ No newline at end of file