diff --git a/pom.xml b/pom.xml index aab33f468a271cb2bceda860a5bf1e19a0f7ad14..7f77a0ebf5e4bdf7b1462ab887615bf9e4cc0653 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,13 @@ jstl 1.2 - + + + + org.mariadb.jdbc + mariadb-java-client + 3.1.4 + diff --git a/src/main/java/Forms/Checkable.java b/src/main/java/Forms/Checkable.java new file mode 100644 index 0000000000000000000000000000000000000000..52938045ee75483177a3de2477c6fff46f92ad31 --- /dev/null +++ b/src/main/java/Forms/Checkable.java @@ -0,0 +1,14 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package Forms; + +/** + * + * @author stag + */ +public interface Checkable { + boolean checkForm(); +} diff --git a/src/main/java/Forms/CreateArticleFormChecker.java b/src/main/java/Forms/CreateArticleFormChecker.java new file mode 100644 index 0000000000000000000000000000000000000000..c84200e9478076ab992587fed931674919c76b55 --- /dev/null +++ b/src/main/java/Forms/CreateArticleFormChecker.java @@ -0,0 +1,54 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package Forms; + +import fr.ldnr.beans.Article; +import fr.ldnr.beans.User; +import fr.ldnr.dao.DaoFactory; +import java.time.Instant; +import java.sql.Date; +import java.time.LocalDate; +import javax.servlet.http.HttpServletRequest; + +/** + * + * @author stag + */ +public class CreateArticleFormChecker extends FormChecker
{ + + private static final String TITLE_FIELD = "title"; + private static final String CONTENT_FIELD = "content"; + + public CreateArticleFormChecker(HttpServletRequest request) { + super(request); + } + + @Override + public boolean checkForm() { + boolean isFormOk = true; + String title = request.getParameter(TITLE_FIELD); + String content = request.getParameter(CONTENT_FIELD); + Integer id_author = ((User) (request.getSession().getAttribute("user"))).getId_user(); + bean = new Article(title, content, Date.valueOf(LocalDate.now()), id_author); + System.out.println(bean); + // Les tests + if (title == null) { + errors.put(TITLE_FIELD, "Le titre ne doit pas être vide"); + } + if (content == null || content.length() < 25) { + errors.put(CONTENT_FIELD, "Le contenu doit faire 25 caractères au moins"); + } + + // Ajouter l'article à la DB s'il est valide + if (errors.isEmpty()) { + DaoFactory.getArticleDao().insert(bean); + } + + return errors.isEmpty(); + + } + +} diff --git a/src/main/java/Forms/FormChecker.java b/src/main/java/Forms/FormChecker.java index d6b9b4809c6e62262b00c80061a90b233f88bfb9..90af78aacbe56f0c43178a940e59f16d998e13e5 100644 --- a/src/main/java/Forms/FormChecker.java +++ b/src/main/java/Forms/FormChecker.java @@ -12,7 +12,7 @@ import javax.servlet.http.HttpServletRequest; * * @author stag */ -public abstract class FormChecker { +public abstract class FormChecker implements Checkable{ protected final HttpServletRequest request; protected final HashMap errors; protected T bean; diff --git a/src/main/java/Forms/LoginFormChecker.java b/src/main/java/Forms/LoginFormChecker.java index 94a99a3e3c3717d979304c78049a557d2170800b..b39833fca43200d21668d3316cc0abd8b881b5d1 100644 --- a/src/main/java/Forms/LoginFormChecker.java +++ b/src/main/java/Forms/LoginFormChecker.java @@ -9,47 +9,48 @@ package Forms; * * @author stag */ +import static com.sun.tools.javac.tree.TreeInfo.name; import fr.ldnr.beans.User; -import java.util.HashMap; +import fr.ldnr.dao.DaoFactory; import javax.servlet.http.HttpServletRequest; -public class LoginFormChecker extends FormChecker{ +public class LoginFormChecker extends FormChecker { private static final String PSEUDO_FIELD = "pseudo"; private static final String PWD_FIELD = "pwd"; - public LoginFormChecker(HttpServletRequest request) { super(request); } + @Override public boolean checkForm() { String pseudo = request.getParameter(PSEUDO_FIELD); String pwd = request.getParameter(PWD_FIELD); - bean = new User(pseudo, pwd); - boolean isFormOK = true; + bean = new User(23, null, pseudo, pwd); + if (pseudo == null || pseudo.trim().length() < 3) { errors.put(PSEUDO_FIELD, "Doit faire au moins 3 caractères"); - isFormOK = false; } if (pwd.length() < 6) { errors.put(PWD_FIELD, "Doit faire au moins 6 caractères"); - isFormOK = false; } -// if (errors.isEmpty()) { -// // Si les champs sont valides, on peut créer l'utilisateur -// user = new User(pseudo, pwd); -// // isFormOK = true -// return true; -// } else { -// return false; -// } - return isFormOK; - } + if (errors.isEmpty()) { + User user = DaoFactory.getUserDao().getByName(pseudo); + // Vérifications de l'existence de l'utilisateur + if (user == null || !user.getPassword().equals(pwd)) { + errors.put(PSEUDO_FIELD, "Utilisateur ou mot de passe erroné"); + } else { + // L'utilisateur est le bon + bean = user; + } + } + + return errors.isEmpty(); - + } } diff --git a/src/main/java/Forms/SigninFormChecker.java b/src/main/java/Forms/SigninFormChecker.java index ffbca48e042a56c62fb27b3715ef7832bac9e357..26efc1678505c5dd08216f427f4325721083e5af 100644 --- a/src/main/java/Forms/SigninFormChecker.java +++ b/src/main/java/Forms/SigninFormChecker.java @@ -10,10 +10,10 @@ package Forms; * @author stag */ import fr.ldnr.beans.User; +import fr.ldnr.dao.DaoFactory; import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -public class SigninFormChecker extends FormChecker{ +public class SigninFormChecker extends FormChecker { private static final String EMAIL_FIELD = "email"; private static final String PWD_FIELD = "password"; @@ -24,8 +24,8 @@ public class SigninFormChecker extends FormChecker{ super(request); } + @Override public boolean checkForm() { - boolean isValid = true; String email = request.getParameter(EMAIL_FIELD); String password = request.getParameter(PWD_FIELD); @@ -36,39 +36,35 @@ public class SigninFormChecker extends FormChecker{ //traitement de la saisie email = pas necessaire if (email == null || email.trim().isEmpty()) { errors.put(EMAIL_FIELD, "L'adresse email est obligatoire."); - isValid = false; } else if (!email.contains("@")) { errors.put(EMAIL_FIELD, "L'adresse email n'est pas valide."); - isValid = false; } if (password == null || password.trim().isEmpty()) { errors.put(PWD_FIELD, "Le mot de passe est obligatoire."); - isValid = false; } else if (password.length() < 6) { errors.put(PWD_FIELD, "Le mot de passe doit contenir au moins 6 caractères."); - isValid = false; } if (confirmPassword == null || confirmPassword.trim().isEmpty()) { errors.put(CONFIRM_PWD_FIELD, "La confirmation du mot de passe est obligatoire."); - isValid = false; } else if (!confirmPassword.equals(password)) { errors.put(CONFIRM_PWD_FIELD, "La confirmation du mot de passe ne correspond pas."); - isValid = false; } if (pseudo == null || pseudo.trim().isEmpty()) { errors.put(PSEUDO_FIELD, "Le pseudo est obligatoire."); - isValid = false; } else if (pseudo.length() < 3) { errors.put(PSEUDO_FIELD, "Le pseudo doit contenir au moins 3 caractères."); - isValid = false; } - return isValid; - } + if (errors.isEmpty()) { // Si le formulaire est correct + // Créer l'utilisateur en DB + DaoFactory.getUserDao().insert(bean); + } - + return errors.isEmpty(); + + } } diff --git a/src/main/java/filters/ConnectFilter.java b/src/main/java/filters/ConnectFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..03b2355f94f3ec98e65de42ebf8f3d558a9aebeb --- /dev/null +++ b/src/main/java/filters/ConnectFilter.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package filters; + +import fr.ldnr.beans.User; +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * + * @author stag + */ +public class ConnectFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpSession session = ((HttpServletRequest) request).getSession(); + // Travail avant l'appel à la servlet + if (session.getAttribute("user") != null && ((User) session.getAttribute("user")).getId() == 1) { + session.setAttribute("isAdmin", true); + } + // Appel à la servlet + chain.doFilter(request, response); + // Travail après la servlet mais avant la réponse + + } + + @Override + public void destroy() { + } + +} diff --git a/src/main/java/filters/isAdminFilter.java b/src/main/java/filters/isAdminFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..567314d5c110a5dff25a5342dad7dce47e623005 --- /dev/null +++ b/src/main/java/filters/isAdminFilter.java @@ -0,0 +1,50 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package filters; + +import fr.ldnr.beans.User; +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * + * @author stag + */ +@WebFilter(urlPatterns = "/*") +public class isAdminFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + // À l'aller : je travaille sur la requête + HttpSession session = ((HttpServletRequest) request).getSession(); + + User user = (User) session.getAttribute("user"); + if (user != null && user.getId() == 1) { + session.setAttribute("isAdmin", true); + } else { + session.removeAttribute("isAdmin"); + } + + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + +} diff --git a/src/main/java/fr/ldnr/beans/Article.java b/src/main/java/fr/ldnr/beans/Article.java index 4b0b580fdb5dd143eb97f05d09bdd10afcd6243a..c0c6c2b3a910d4964850fcb1fdd2f70bf1162108 100644 --- a/src/main/java/fr/ldnr/beans/Article.java +++ b/src/main/java/fr/ldnr/beans/Article.java @@ -5,30 +5,41 @@ */ package fr.ldnr.beans; -import java.io.Serializable; - +import java.text.SimpleDateFormat; +import java.sql.Date; +import java.util.Locale; /** * * @author stag */ -public class Article implements Serializable{ +public class Article implements Identifiable { + + private Integer id_article; private String titre; private String contenu; - private String dateCreation; - private String auteur; + private Date dateCreation; + private Integer id_auteur; public Article() { } - public Article(String titre, String contenu, String dateCreation, String auteur) { + public Article(String titre, String contenu, Date dateCreation, Integer auteur) { + this.titre = titre; + this.contenu = contenu; + this.dateCreation = dateCreation; + this.id_auteur = auteur; + } + + public Article(Integer id_article, String titre, String contenu, Date dateCreation, Integer id_auteur) { + this.id_article = id_article; this.titre = titre; this.contenu = contenu; this.dateCreation = dateCreation; - this.auteur = auteur; + this.id_auteur = id_auteur; } - public String getTitre() { + public String getTitre() { return titre; } @@ -44,26 +55,48 @@ public class Article implements Serializable{ this.contenu = contenu; } - public String getDateCreation() { + public Date getDateCreation() { return dateCreation; } - public void setDateCreation(String dateCreation) { + public String getDate() { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return sdf.format(dateCreation); + } + + public void setDateCreation(Date dateCreation) { this.dateCreation = dateCreation; } - public String getAuteur() { - return auteur; + public Integer getId_auteur() { + return id_auteur; } - public void setAuteur(String auteur) { - this.auteur = auteur; + public void setId_auteur(Integer id_auteur) { + this.id_auteur = id_auteur; } - @Override public String toString() { - return super.toString(); //To change body of generated methods, choose Tools | Templates. + return "Article{" + "titre=" + titre + ", contenu=" + contenu + ", dateCreation=" + dateCreation + ", auteur=" + id_auteur + '}'; + } + + @Override + public Integer getId() { + return id_article; + } + + @Override + public void setId(Integer id) { + this.id_article = id; } - + + public Integer getId_article() { + return id_article; + } + + public void setId_article(Integer id_article) { + this.id_article = id_article; + } + } diff --git a/src/main/java/fr/ldnr/beans/ArticleOrm.java b/src/main/java/fr/ldnr/beans/ArticleOrm.java new file mode 100644 index 0000000000000000000000000000000000000000..4c786622a58b6d2c4716cacb7379e6959ccfd64c --- /dev/null +++ b/src/main/java/fr/ldnr/beans/ArticleOrm.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.beans; + +import fr.ldnr.dao.DaoFactory; + +/** + * + * @author stag + */ +public class ArticleOrm { + + private Article article; + private User author; + + public ArticleOrm(Article article) { + this.article = article; + } + + public Article getArticle() { + return article; + } + + public void setArticle(Article article) { + this.article = article; + } + + public User getAuthor() { + if (author == null) { + this.author = DaoFactory.getUserDao().getById(article.getId_auteur()); + } + return author; + } + + public void setAuthor(User author) { + this.author = author; + } +} diff --git a/src/main/java/fr/ldnr/beans/Identifiable.java b/src/main/java/fr/ldnr/beans/Identifiable.java new file mode 100644 index 0000000000000000000000000000000000000000..0a7b74c32aa206c4086b0bdc082813fda982e159 --- /dev/null +++ b/src/main/java/fr/ldnr/beans/Identifiable.java @@ -0,0 +1,18 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.beans; + +/** + * + * @author stag + */ +public interface Identifiable { + Integer getId(); + void setId(Integer id); +} + + + diff --git a/src/main/java/fr/ldnr/beans/User.java b/src/main/java/fr/ldnr/beans/User.java index 6fc67782f0a1f732eeb433165f99450e77426664..ac5740ef285b6fd74a31d6eef6eac8e2b2493959 100644 --- a/src/main/java/fr/ldnr/beans/User.java +++ b/src/main/java/fr/ldnr/beans/User.java @@ -9,8 +9,9 @@ package fr.ldnr.beans; * * @author stag */ -public class User { - private String id; +public class User implements Identifiable { + + private Integer id_user; private String email; private String pseudo; private String password; @@ -18,8 +19,8 @@ public class User { public User() { } - public User(String id, String email, String pseudo, String password) { - this.id = id; + public User(Integer id, String email, String pseudo, String password) { + this.id_user = id; this.email = email; this.pseudo = pseudo; this.password = password; @@ -30,16 +31,11 @@ public class User { this.pseudo = pseudo; this.password = password; } - - + public User(String pseudo, String password) { this.pseudo = pseudo; this.password = password; } - - public String getId() { - return id; - } // getters and setters public String getEmail() { @@ -53,21 +49,35 @@ public class User { public void setPseudo(String pseudo) { this.pseudo = pseudo; } - + public String getPassword() { return password; } - + public void setPassword(String password) { this.password = password; } - public void setId(String id) { - this.id = id; - } - public void setEmail(String email) { this.email = email; } - + + public Integer getId_user() { + return id_user; + } + + public void setId_user(Integer id_user) { + this.id_user = id_user; + } + + @Override + public Integer getId() { + return id_user; + } + + @Override + public void setId(Integer id_user) { + this.id_user = id_user; + } + } diff --git a/src/main/java/fr/ldnr/dao/Crudable.java b/src/main/java/fr/ldnr/dao/Crudable.java new file mode 100644 index 0000000000000000000000000000000000000000..5a4a35cdb04042412e2ff058aa6ce3c82937ac93 --- /dev/null +++ b/src/main/java/fr/ldnr/dao/Crudable.java @@ -0,0 +1,34 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.dao; + +import java.util.*; + + +/** + * + * @author stag + */ +public interface Crudable { + + Collection getAll(); + + int count(); + + T getById(int id); + + void insert(T obj); + + void update(T obj); + + void delete(T obj); + + void delete(int id); +} + + + + diff --git a/src/main/java/fr/ldnr/dao/Dao.java b/src/main/java/fr/ldnr/dao/Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..d8112f3a2570b40f05fbae384b628e0dd03403ed --- /dev/null +++ b/src/main/java/fr/ldnr/dao/Dao.java @@ -0,0 +1,86 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.dao; + +import fr.ldnr.beans.Identifiable; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; + +/** + * + * @author stag + */ +public abstract class Dao implements Crudable { + + protected Connection connection; + private String url; + private final String user = "blog"; + private final String pwd = "blog"; + private final String DBType = "mariadb"; + private final String DBip = "localhost"; + private final int DBPort = 3306; + private final String DBName = "blog"; + protected String tableName; + + public Dao(String tableName) { + this.tableName = tableName; + try { + Class.forName("org.mariadb.jdbc.Driver"); + url = "jdbc:" + DBType + "://" + DBip + ":" + DBPort + "/" + DBName; + connection = DriverManager.getConnection(url, user, pwd); + } catch (ClassNotFoundException | SQLException ex) { + JOptionPane.showMessageDialog(null, "Connexion à la DB impossible", "Erreur", JOptionPane.ERROR_MESSAGE); + System.exit(1); + } + } + + @Override + public int count() { + String req = "SELECT COUNT(*) AS total FROM " + tableName; + int count = 0; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + count = rs.getInt("total"); + } + } catch (SQLException ex) { + Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex); + } + return count; + } + + @Override + public void delete(T obj) { + String req = "DELETE FROM " + tableName + " WHERE id_" + tableName + "=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setInt(1, obj.getId()); + int nbLignesImpactees = pstmt.executeUpdate(); + } catch (SQLException ex) { + Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Override + public void delete(int id) { + String req = "DELETE FROM " + tableName + " WHERE id_" + tableName + "=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setInt(1, id); + int nbLignesImpactees = pstmt.executeUpdate(); + } catch (SQLException ex) { + Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex); + } + } + +} diff --git a/src/main/java/fr/ldnr/dao/DaoArticle.java b/src/main/java/fr/ldnr/dao/DaoArticle.java new file mode 100644 index 0000000000000000000000000000000000000000..37956c56c9f205dd6d75dbf0cd20d83507404ec3 --- /dev/null +++ b/src/main/java/fr/ldnr/dao/DaoArticle.java @@ -0,0 +1,172 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.dao; + +import fr.ldnr.beans.Article; +import fr.ldnr.beans.ArticleOrm; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author stag + */ +public class DaoArticle extends Dao
{ + + public DaoArticle() { + super("article"); + } + + @Override + public Collection
getAll() { + ArrayList
objects = new ArrayList<>(); + String req = "SELECT * FROM " + tableName; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + objects.add( + new Article( + rs.getInt("id_" + tableName), + rs.getString("titre"), + rs.getString("content"), + rs.getDate("creationDate"), + rs.getInt("id_author") + ) + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + + return objects; + } + + @Override + public Article getById(int id) { + Article obj = null; + String req = "SELECT * FROM " + tableName + " WHERE id_" + tableName + "=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setInt(1, id); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + obj = new Article( + rs.getInt("id_" + tableName), + rs.getString("titre"), + rs.getString("content"), + rs.getDate("creationDate"), + rs.getInt("id_author") + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + return obj; + } + + @Override + public void insert(Article obj) { + String req = "INSERT INTO " + tableName + " ( titre, content, creationDate, id_author) VALUES (?, ?, ?, ?)"; + try { + PreparedStatement pstmt = connection.prepareStatement(req, PreparedStatement.RETURN_GENERATED_KEYS); + pstmt.setString(1, obj.getTitre()); + pstmt.setString(2, obj.getContenu()); + pstmt.setDate(3, (Date) obj.getDateCreation()); + pstmt.setInt(4, obj.getId_auteur()); + int nbLignesImpactees = pstmt.executeUpdate(); + ResultSet generatedKeys = pstmt.getGeneratedKeys(); + if (generatedKeys.first()) { + obj.setId(generatedKeys.getInt(1)); + } + } catch (SQLException ex) { + Logger.getLogger(DaoArticle.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Override + public void update(Article obj) { + String req = "UPDATE " + tableName + " SET titre=?, content=?, creationDate=?, id_author=? WHERE id_" + tableName + "=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setString(1, obj.getTitre()); + pstmt.setString(2, obj.getContenu()); + pstmt.setDate(3, (Date) obj.getDateCreation()); + pstmt.setInt(4, obj.getId_auteur()); + pstmt.setInt(5, obj.getId()); + int nbLignesImpactees = pstmt.executeUpdate(); + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public Collection getBatchFrom(int qty, int offset) { + ArrayList objects = new ArrayList<>(); + String req = "SELECT * FROM " + tableName + " ORDER BY creationDate DESC LIMIT ? OFFSET ?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setInt(1, qty); + pstmt.setInt(2, offset); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + objects.add( + new ArticleOrm( + new Article( + rs.getInt("id_" + tableName), + rs.getString("titre"), + rs.getString("content"), + rs.getDate("creationDate"), + rs.getInt("id_author") + ) + ) + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + + return objects; + } + + public Integer getFirstId() { + Integer id = null; + String req = "SELECT * FROM " + tableName + " ORDER BY id_" + tableName + " ASC"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + id = rs.getInt("id_" + tableName); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + + return id; + } + + public Integer getLastId() { + Integer id = null; + String req = "SELECT * FROM " + tableName + " ORDER BY id_" + tableName + " DESC"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + id = rs.getInt("id_" + tableName); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + + return id; + } + +} diff --git a/src/main/java/fr/ldnr/dao/DaoFactory.java b/src/main/java/fr/ldnr/dao/DaoFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..558e283f5ba2ca0b282165b3dcd85856770bf138 --- /dev/null +++ b/src/main/java/fr/ldnr/dao/DaoFactory.java @@ -0,0 +1,21 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.dao; + +/** + * + * @author stag + */ +public class DaoFactory { + + public static DaoUser getUserDao() { + return new DaoUser(); + } + + public static DaoArticle getArticleDao() { + return new DaoArticle(); + } +} diff --git a/src/main/java/fr/ldnr/dao/DaoUser.java b/src/main/java/fr/ldnr/dao/DaoUser.java new file mode 100644 index 0000000000000000000000000000000000000000..cd3f8a3ce4aa2156e19a8272ae739334d342372a --- /dev/null +++ b/src/main/java/fr/ldnr/dao/DaoUser.java @@ -0,0 +1,155 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.dao; + +import fr.ldnr.beans.User; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author stag + */ +public class DaoUser extends Dao { + + public DaoUser() { + super("user"); + } + + @Override + public Collection getAll() { + ArrayList objects = new ArrayList<>(); + String req = "SELECT * FROM " + tableName; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + objects.add( + new User( + rs.getInt("id_" + tableName), + rs.getString("email"), + rs.getString("pseudo"), + rs.getString("pwd") + ) + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + + return objects; + } + + @Override + public User getById(int id) { + User obj = null; + String req = "SELECT * FROM " + tableName + " WHERE id_" + tableName + "=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setInt(1, id); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + obj = new User( + rs.getInt("id_" + tableName), + rs.getString("email"), + rs.getString("pseudo"), + rs.getString("pwd") + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + return obj; + } + + @Override + public void insert(User obj) { + String req = "INSERT INTO " + tableName + " (email, pseudo, pwd) VALUES (?, ?, ?)"; + try { + PreparedStatement pstmt = connection.prepareStatement(req, PreparedStatement.RETURN_GENERATED_KEYS); + pstmt.setString(1, obj.getEmail()); + pstmt.setString(2, obj.getPseudo()); + pstmt.setString(3, obj.getPassword()); + int nbLignesImpactees = pstmt.executeUpdate(); + ResultSet generatedKeys = pstmt.getGeneratedKeys(); + if (generatedKeys.first()) { + obj.setId(generatedKeys.getInt(1)); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Override + public void update(User obj) { + String req = "UPDATE " + tableName + " SET email=?, pseudo=?, pwd=? WHERE id_" + tableName + "=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setString(1, obj.getEmail()); + pstmt.setString(2, obj.getPseudo()); + pstmt.setString(3, obj.getPassword()); + pstmt.setInt(4, obj.getId()); + int nbLignesImpactees = pstmt.executeUpdate(); + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + } + + /** + * + * methode de recherche + * + * + */ + public User getByName(String pseudo) { + User obj = null; + String req = "SELECT * FROM " + tableName + " WHERE pseudo=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setString(1, pseudo); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + obj = new User( + rs.getInt("id_" + tableName), + rs.getString("email"), + rs.getString("pseudo"), + rs.getString("pwd") + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + return obj; + } + + //par Pseudo + public User getByName(User user) { + User obj = null; + String req = "SELECT * FROM " + tableName + " WHERE pseudo=?"; + try { + PreparedStatement pstmt = connection.prepareStatement(req); + pstmt.setString(1, user.getPseudo()); + ResultSet rs = pstmt.executeQuery(); + if (rs.first()) { + obj = new User( + rs.getInt("id_" + tableName), + rs.getString("email"), + rs.getString("pseudo"), + rs.getString("pwd") + ); + } + } catch (SQLException ex) { + Logger.getLogger(DaoUser.class.getName()).log(Level.SEVERE, null, ex); + } + return obj; + } + +} diff --git a/src/main/java/fr/ldnr/servelets/Article.java b/src/main/java/fr/ldnr/servelets/Article.java new file mode 100644 index 0000000000000000000000000000000000000000..de555d7b7c3c27cdc75920b2288d91dc92572f66 --- /dev/null +++ b/src/main/java/fr/ldnr/servelets/Article.java @@ -0,0 +1,56 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.servelets; + +import fr.ldnr.beans.ArticleOrm; +import fr.ldnr.dao.DaoFactory; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author stag + */ + +@WebServlet(urlPatterns = "/article") +public class Article extends HttpServlet { + + private static final String VIEW = "/WEB-INF/Article.jsp"; + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + int id = Integer.parseInt((String) request.getParameter("id")); + Integer firstId = DaoFactory.getArticleDao().getFirstId(); + Integer lastId = DaoFactory.getArticleDao().getLastId(); + if (firstId == null || lastId == null || id > lastId || id < firstId) { + throw new NumberFormatException(); + } + request.setAttribute("firstId", firstId); + request.setAttribute("lastId", lastId); + request.setAttribute("articleOrm", new ArticleOrm(DaoFactory.getArticleDao().getById(id))); + request.getServletContext() + .getRequestDispatcher(VIEW) + .forward(request, response); + } catch (NumberFormatException nfe) { + response.sendRedirect(request.getContextPath() + "/home"); + } + } + +} diff --git a/src/main/java/fr/ldnr/servelets/Home.java b/src/main/java/fr/ldnr/servelets/Home.java index f380163026eb7f2b35a5389b1837caf728ea6ae5..bfe1aec3925108ecf0e6c61dbb2e3169fb9f63f5 100644 --- a/src/main/java/fr/ldnr/servelets/Home.java +++ b/src/main/java/fr/ldnr/servelets/Home.java @@ -1,9 +1,7 @@ package fr.ldnr.servelets; -import fr.ldnr.beans.Article; +import fr.ldnr.dao.DaoFactory; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -13,23 +11,31 @@ import javax.servlet.http.HttpServletResponse; @WebServlet(name = "home", urlPatterns = {"/home"}) public class Home extends HttpServlet { + private static final String VIEW = "/WEB-INF/Home.jsp"; + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - // a remplacer par une base de donnees - List
articles = new ArrayList<>(); - articles.add(new Article("Article 1", "Contenu de l'article 1", "2023-04-27", "Auteur 1")); - articles.add(new Article("Article 2", "Contenu de l'article 2", "2023-04-28", "Auteur 2")); - articles.add(new Article("Article 3", "Contenu de l'article 3", "2023-04-29", "Auteur 3")); - articles.add(new Article("Article 4", "Contenu de l'article 4", "2023-04-30", "Auteur 4")); - - request.setAttribute("articles", articles); - - request.getRequestDispatcher("/WEB-INF/Home.jsp") + + // On récupère les articles depuis la DB + //request.setAttribute("articles", DaoFactory.getArticleDao().getAll()); + int page; + try { + page = Integer.parseInt(request.getParameter("page")); + } catch (NumberFormatException nfe) { + page = 1; + } + int offset = (page - 1) * 10; + request.setAttribute("articles", DaoFactory.getArticleDao().getBatchFrom(10, offset)); + request.setAttribute("page", page); + request.setAttribute("maxPage", 1 + (DaoFactory.getArticleDao().count() - 1) / 10); + + // On appelle la vue + request.getServletContext() + .getRequestDispatcher("/WEB-INF/Home.jsp") .forward(request, response); - } + } @Override public String getServletInfo() { diff --git a/src/main/java/fr/ldnr/servelets/Login.java b/src/main/java/fr/ldnr/servelets/Login.java index a9c26866014a8c8b9ee0624f967410d279ec5f6f..bbf2f73a3f4bbf35b9059f98ece53ae9a5c83f0a 100644 --- a/src/main/java/fr/ldnr/servelets/Login.java +++ b/src/main/java/fr/ldnr/servelets/Login.java @@ -11,11 +11,24 @@ import static jdk.internal.org.jline.utils.Log.error; @WebServlet(name = "login", urlPatterns = {"/login"}) public class Login extends HttpServlet { + + + private static final String VIEW = "/WEB-INF/Login.jsp"; + + + + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher("/WEB-INF/Login.jsp"); - dispatcher.forward(request, response); + if (request.getSession().getAttribute("user") == null) { + RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher(VIEW); + dispatcher.forward(request, response); + } else { + response.sendRedirect(request.getContextPath() + "/home"); + + } + } @Override @@ -23,12 +36,18 @@ public class Login extends HttpServlet { throws ServletException, IOException { LoginFormChecker checker = new LoginFormChecker(request); if (!checker.checkForm()) { + //Assurer que l'utilisateur n'est plus en session + request.getSession().invalidate(); + request.setAttribute("errors", checker.getErrors()); - request.setAttribute("userData", checker.getUser()); + request.setAttribute("userData", checker.getBean()); request.getServletContext() - .getRequestDispatcher("/WEB-INF/Login.jsp") + .getRequestDispatcher(VIEW) .forward(request, response); } else { + //je met l'utilisateur en session + request.getSession().setAttribute("user", checker.getBean()); + response.sendRedirect(request.getContextPath() + "/home"); } diff --git a/src/main/java/fr/ldnr/servelets/Logout.java b/src/main/java/fr/ldnr/servelets/Logout.java index e17884f319557e0c95714b569d6688afb7c46fc3..e1a86dbb2ad36da98a789ad834fab438eb2f7628 100644 --- a/src/main/java/fr/ldnr/servelets/Logout.java +++ b/src/main/java/fr/ldnr/servelets/Logout.java @@ -7,6 +7,7 @@ package fr.ldnr.servelets; import java.io.IOException; import java.io.PrintWriter; +import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -20,6 +21,11 @@ import javax.servlet.http.HttpServletResponse; @WebServlet(name = "Logout", urlPatterns = {"/logout"}) public class Logout extends HttpServlet { + + private static final String VIEW = "/WEB-INF/Home.jsp"; + + + // /** * Handles the HTTP GET method. @@ -32,10 +38,18 @@ public class Logout extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher(VIEW); + dispatcher.forward(request, response); + } else { //invalidation request.getSession().invalidate(); //redirection vers accueil response.sendRedirect(request.getContextPath() + "/home"); + + } + + } } diff --git a/src/main/java/fr/ldnr/servelets/Profile.java b/src/main/java/fr/ldnr/servelets/Profile.java new file mode 100644 index 0000000000000000000000000000000000000000..90d69c3c62f2799ca9260c25420639611fcdf26b --- /dev/null +++ b/src/main/java/fr/ldnr/servelets/Profile.java @@ -0,0 +1,56 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.servelets; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author stag + */ +@WebServlet(name = "Profile", urlPatterns = {"/profile"}) +public class Profile extends HttpServlet { + + + private static final String VIEW = "/WEB-INF/Profile.jsp"; + + + + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + //verifier que user est connecté + if (request.getSession().getAttribute("user") != null) { + request.getRequestDispatcher(VIEW) + .forward(request, response); + } else { + response.sendRedirect(request.getContextPath() + "/login"); + } + + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + } + +} diff --git a/src/main/java/fr/ldnr/servelets/Signin.java b/src/main/java/fr/ldnr/servelets/Signin.java index a5bc2a87b69559b9ef9b085a3d0a0b80c9dea20a..222499d8e5f5fabad12e04516e69956deb5cdeb7 100644 --- a/src/main/java/fr/ldnr/servelets/Signin.java +++ b/src/main/java/fr/ldnr/servelets/Signin.java @@ -13,11 +13,21 @@ import static sun.security.krb5.KrbException.errorMessage; @WebServlet(name = "sign-in", urlPatterns = {"/sign-in"}) public class Signin extends HttpServlet { + + private static final String VIEW = "/WEB-INF/Signin.jsp"; + + + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/Signin.jsp"); - dispatcher.forward(request, response); + if (request.getSession().getAttribute("user") == null) { + RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher(VIEW); + dispatcher.forward(request, response); + } else { + response.sendRedirect(request.getContextPath() + "/home"); + + } } @Override @@ -32,12 +42,17 @@ public class Signin extends HttpServlet { boolean authenticated = false; if (checker.checkForm()) { + //je met l'utilisateur en session + request.getSession().setAttribute("user", checker.getBean()); response.sendRedirect(request.getContextPath() + "/home"); } else { + //Assurer que l'utilisateur n'est plus en session + request.getSession().invalidate(); + request.setAttribute("errors", checker.getErrors()); - request.setAttribute("userData", checker.getUser()); + request.setAttribute("userData", checker.getBean()); request.getServletContext() - .getRequestDispatcher("/WEB-INF/Signin.jsp") + .getRequestDispatcher(VIEW) .forward(request, response); } } diff --git a/src/main/java/fr/ldnr/servelets/createArticle.java b/src/main/java/fr/ldnr/servelets/createArticle.java new file mode 100644 index 0000000000000000000000000000000000000000..d7fd5ef8112dc05c4c31bbe0fab947d01dbb76b3 --- /dev/null +++ b/src/main/java/fr/ldnr/servelets/createArticle.java @@ -0,0 +1,74 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package fr.ldnr.servelets; + +import Forms.CreateArticleFormChecker; +import fr.ldnr.beans.User; +import java.io.IOException; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author stag + */ +@WebServlet(name = "createArticle", urlPatterns = {"/back/createArticle"}) +public class createArticle extends HttpServlet { + + private static final String VIEW = "/WEB-INF/createArticle.jsp"; + + // + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Integer id_author = ((User) (request.getSession().getAttribute("user"))).getId_user(); + + if (request.getSession().getAttribute("isAdmin") != null) { + request.getServletContext() + .getRequestDispatcher(VIEW) + .forward(request, response); + } else { + response.sendRedirect(request.getContextPath() + "/login"); + } + + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + CreateArticleFormChecker checker = new CreateArticleFormChecker(request); + if (!checker.checkForm()) { + request.setAttribute("article", checker.getBean()); + request.setAttribute("errors", checker.getErrors()); + request.getServletContext() + .getRequestDispatcher(VIEW) + .forward(request, response); + } else { + response.sendRedirect(request.getContextPath() + "/home"); + } + } + +} diff --git a/src/main/webapp/WEB-INF/Article.jsp b/src/main/webapp/WEB-INF/Article.jsp new file mode 100644 index 0000000000000000000000000000000000000000..5997bc6f469196401ce08cdbc079d9b5740a1f51 --- /dev/null +++ b/src/main/webapp/WEB-INF/Article.jsp @@ -0,0 +1,36 @@ +<%-- + Document : Article + Created on : 5 mai 2023, 06:33:42 + Author : stag +--%> + +<%@page contentType="text/html" pageEncoding="UTF-8"%> + + + + + Article Page + "/> + + + <%@include file="/WEB-INF/jspf/Header.jsp" %> + +
+

${requestScope.articleOrm.article.titre}

+
Écrit par ${requestScope.articleOrm.author.pseudo} le ${requestScope.articleOrm.article.date}
+
${requestScope.articleOrm.article.contenu}
+ +
+ + <%@include file="./jspf/Footer.jsp" %> + + + diff --git a/src/main/webapp/WEB-INF/Home.jsp b/src/main/webapp/WEB-INF/Home.jsp index 4c7e88be52303455db09cf7a17fe28055ac450a4..94cac64b17318335cda20c90911b61cbdec1bcfb 100644 --- a/src/main/webapp/WEB-INF/Home.jsp +++ b/src/main/webapp/WEB-INF/Home.jsp @@ -1,29 +1,130 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> "/> Blog - - - <%@include file="/WEB-INF/jspf/Header.jsp" %> + + + + + <%@include file="/WEB-INF/jspf/Header.jsp" %> + +

Voici mes articles

+ + +
+

${articleOrm.article.titre}

+
Article créé le ${articleOrm.article.date} par ${articleOrm.author.pseudo}
+

${articleOrm.article.contenu}

+

">Lire l'article complet

+
+
+ <%@include file="./jspf/Footer.jsp" %> + + + diff --git a/src/main/webapp/WEB-INF/Login.jsp b/src/main/webapp/WEB-INF/Login.jsp index 4a2fe01a1baf57414240120eba70d20fde52385b..0300d8fa08c6bd810e813ec0085159ddd9503dcc 100644 --- a/src/main/webapp/WEB-INF/Login.jsp +++ b/src/main/webapp/WEB-INF/Login.jsp @@ -1,7 +1,7 @@ <%@include file="taglibs.jsp" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> - + "/> diff --git a/src/main/webapp/WEB-INF/Profile.jsp b/src/main/webapp/WEB-INF/Profile.jsp new file mode 100644 index 0000000000000000000000000000000000000000..3abb2b17398a6d04ad5bb1737d937c9c2d84dac3 --- /dev/null +++ b/src/main/webapp/WEB-INF/Profile.jsp @@ -0,0 +1,85 @@ +<%-- + Document : Profile + Created on : 5 mai 2023, 03:35:35 + Author : stag +--%> + +<%@page contentType="text/html" pageEncoding="UTF-8"%> + + + + + JSP Page + + + + <%@include file="/WEB-INF/jspf/Header.jsp" %> +

Vos informations personnelles

+ + + + + + + + + + + + + + + + + +
Votre id : ${sessionScope.user.id}
Votre Pseudo : ${sessionScope.user.pseudo}
Votre adresse mail : ${sessionScope.user.email}
Votre mot de passe : ${sessionScope.user.password}
+ + + <%@include file="./jspf/Footer.jsp" %> + + + + diff --git a/src/main/webapp/WEB-INF/createArticle.jsp b/src/main/webapp/WEB-INF/createArticle.jsp new file mode 100644 index 0000000000000000000000000000000000000000..2f57b42e068a31cb04d62587b5ca24371c5966ca --- /dev/null +++ b/src/main/webapp/WEB-INF/createArticle.jsp @@ -0,0 +1,47 @@ +<%-- + Document : createArticle + Created on : 5 mai 2023, 00:52:37 + Author : stag +--%> + +<%@page contentType="text/html" pageEncoding="UTF-8"%> + + + + + "/> + Page de création d'article + + + <%@include file="/WEB-INF/jspf/Header.jsp" %> +

Créer un article

+ + +

${errorMessage}

+
+ +
" method="post"> +
+ + "> + ${requestScope.errors.title} +
+
+ + + ${requestScope.errors.content} +
+
+ + +
+
+ + + + + + diff --git a/src/main/webapp/WEB-INF/jspf/Footer.jsp b/src/main/webapp/WEB-INF/jspf/Footer.jsp index 4ca89f444d17ac7f24e67225dcbd6a26e2ed5213..4635a0122cc4706ad6094f8b7bd53971dec74ab2 100644 --- a/src/main/webapp/WEB-INF/jspf/Footer.jsp +++ b/src/main/webapp/WEB-INF/jspf/Footer.jsp @@ -3,7 +3,26 @@ Created on : 27 avr. 2023, 12:59:37 Author : stag --%> - + <%@page contentType="text/html" pageEncoding="UTF-8"%> -

Ceci est un footer que je veut include!

- +
+ + Vous etes connecté avec le id: ${sessionScope.user.id} pseudo: + ${sessionScope.user.pseudo} et l'adresse mail : ${sessionScope.user.email} + + vous n'êtes pas connecté. + + + et vous êtes administrateur +
diff --git a/src/main/webapp/WEB-INF/jspf/Header.jsp b/src/main/webapp/WEB-INF/jspf/Header.jsp index 45032659d2bad50af6f9019b0e035e3d7d226d29..af1fa9bb477b35733a8ff7dfecb5304a5c12c496 100644 --- a/src/main/webapp/WEB-INF/jspf/Header.jsp +++ b/src/main/webapp/WEB-INF/jspf/Header.jsp @@ -6,51 +6,61 @@ <%@page contentType="text/html" pageEncoding="UTF-8"%> - + nav li a:hover { + background-color: #111; + } + + diff --git a/src/main/webapp/WEB-INF/taglibs.jsp b/src/main/webapp/WEB-INF/taglibs.jsp index 7ea6af02be3c18f6bb0102e0694154c981dc90eb..b402b33c463836edf795938796e4bb2f6068c824 100644 --- a/src/main/webapp/WEB-INF/taglibs.jsp +++ b/src/main/webapp/WEB-INF/taglibs.jsp @@ -1 +1 @@ -<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> diff --git a/src/main/webapp/rsc/css/Style.css b/src/main/webapp/rsc/css/Style.css index 900e4abc32549e2bc2b9e3370ca8b6b174ac6ba3..3d9fffa2e4f33e0eb063c36e565d9dbc8a961b3b 100644 --- a/src/main/webapp/rsc/css/Style.css +++ b/src/main/webapp/rsc/css/Style.css @@ -40,7 +40,7 @@ input[type=text],input[type=email], input[type=password] { font-size: 1.2rem; } -input[type=submit] { +input[type=submit], input[type=reset] { background-color: #F7DC6F; color: #2B3A42; padding: 15px 30px; @@ -50,34 +50,34 @@ input[type=submit] { cursor: pointer; } -input[type=submit]:hover { +input[type=submit]:hover , input[type=reset]:hover{ background-color: #34495E; color: #F7DC6F; } .error-message { - color: #ff0000; - font-size: 18px; - font-family: 'Bebas Neue', sans-serif; - text-transform: uppercase; - background-color: #0d0d0d; - border: 2px solid #ff0000; - padding: 10px; - margin-bottom: 10px; + color: #ff0000; + font-size: 18px; + font-family: 'Bebas Neue', sans-serif; + text-transform: uppercase; + background-color: #0d0d0d; + border: 2px solid #ff0000; + padding: 10px; + margin-bottom: 10px; } .error-message:before { - content: "!"; - color: #ff0000; - font-weight: bold; - font-size: 32px; - display: inline-block; - margin-right: 10px; - transform: translateY(-10%); + content: "!"; + color: #ff0000; + font-weight: bold; + font-size: 32px; + display: inline-block; + margin-right: 10px; + transform: translateY(-10%); } -.container { +.containerArticle { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; @@ -132,7 +132,7 @@ input[type=text],input[type=email], input[type=password] { font-size: 1.2rem; } -input[type=submit] { +input[type=submit] , input[type=reset]{ background-color: #F7DC6F; color: #2B3A42; padding: 15px 30px; @@ -142,7 +142,7 @@ input[type=submit] { cursor: pointer; } -input[type=submit]:hover { +input[type=submit]:hover , input[type=reset]:hover{ background-color: #34495E; color: #F7DC6F; } @@ -151,17 +151,120 @@ input[type=submit]:hover { color: red; font-weight: bold; } -input[type=submit] { - background-color: #F7DC6F; - color: #2B3A42; - padding: 15px 30px; +textarea { + padding: 15px; border: none; border-radius: 10px; + margin-bottom: 20px; + width: 100%; + height: 150px; /* Hauteur du textarea */ + background-color: #F7DC6F; + color: #2B3A42; font-size: 1.2rem; - cursor: pointer; + resize: vertical; /* Permet à l'utilisateur de redimensionner verticalement le textarea */ +} +.footer { + background-color: #333; + color: #fff; + padding: 20px; + text-align: center; +} +.pagination { + display: flex; + justify-content: center; + margin-top: 20px; + padding-bottom: 40px; } -input[type=submit]:hover { - background-color: #34495E; - color: #F7DC6F; +.pagination ul { + display: flex; + list-style: none; + padding: 0; + margin: 0; +} + +.pagination ul li { + margin-right: 5px; +} + +.pagination ul li.disabled a { + color: #ccc; + cursor: not-allowed; + text-decoration: none; +} + +.pagination ul li.active a { + color: #fff; + background-color: #007bff; + border-color: #007bff; + text-decoration: none; +} + +.pagination ul li a { + display: block; + padding: 5px 10px; + color: #007bff; + background-color: #fff; + border: 1px solid #007bff; + text-decoration: none; +} + +.pagination ul li a:hover { + background-color: #007bff; + color: #fff; + text-decoration: none; +} + +.article-container { + text-align: center; + max-width: 800px; + margin: 0 auto; + padding: 20px; + border: 1px solid #ccc; +} + +#pageArticle > h2 { + font-size: 2.5rem; + font-weight: bold; + margin-bottom: 1rem; +} + +#pageArticle > .sub { + font-size: 1rem; + color: gray; + margin-bottom: 1rem; +} + +#pageArticle > div { + font-size: 1.2rem; + line-height: 1.5; + margin-bottom: 2rem; +} + +#pageArticle > .pagingArticle { + display: flex; + justify-content: space-between; + margin-top: 2rem; +} + +#pageArticle > a { + font-size: 1.2rem; + color: black; + text-decoration: none; + border: 1px solid black; + padding: 0.5rem 1rem; + border-radius: 5px; + transition: all 0.2s ease-in-out; + +} + +#pageArticle > a:hover { + background-color: black; + color: white; +} +#pageArticle > .disabled { + color: gray; + border-color: gray; + pointer-events: none; + opacity: 0.6; } \ No newline at end of file diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties index bfe9a495f7367cf4e3ede8433fc0548a6ec39008..0e2eb9ad402f4d684857977fd6c6caa6c2738aa8 100644 --- a/target/maven-archiver/pom.properties +++ b/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Tue Apr 25 17:03:54 CEST 2023 +#Fri May 05 03:13:49 CEST 2023 groupId=fr.ldnr.mycompany artifactId=mavenproject3 version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 8c965aa53aeab316cec0a8f107a6b4faeaf17d67..0167b32dab60a7eef71b3379e84d232c6cd15fbe 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,4 +1,13 @@ -fr/ldnr/servelets/SteackServelet.class -fr/ldnr/servelets/Burger.class -Carotte.class +fr/ldnr/servelets/Logout.class +Forms/LoginFormChecker.class +fr/ldnr/servelets/createArticle.class +Forms/CreateArticleFormChecker.class +fr/ldnr/beans/Article.class +Forms/SigninFormChecker.class +Forms/FormChecker.class +fr/ldnr/servelets/Signin.class +fr/ldnr/beans/Personne.class +fr/ldnr/beans/User.class +fr/ldnr/servelets/Login.class fr/ldnr/servelets/Home.class +Forms/Checkable.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 52a37845d58000199f4ef85ea4c30b93c32acbb4..1027c00fec642013b75861cfde0fc88cc4de10bf 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,4 +1,13 @@ -/home/stag/NetBeansProjects/mavenproject3/src/main/java/fr/ldnr/servelets/Home.java -/home/stag/NetBeansProjects/mavenproject3/src/main/java/fr/ldnr/servelets/Carotte.java -/home/stag/NetBeansProjects/mavenproject3/src/main/java/fr/ldnr/servelets/Burger.java -/home/stag/NetBeansProjects/mavenproject3/src/main/java/fr/ldnr/servelets/SteackServelet.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/servelets/Logout.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/beans/Article.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/beans/User.java +/home/stag/Desktop/tester/java-web-td/src/main/java/Forms/SigninFormChecker.java +/home/stag/Desktop/tester/java-web-td/src/main/java/Forms/LoginFormChecker.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/beans/Personne.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/servelets/createArticle.java +/home/stag/Desktop/tester/java-web-td/src/main/java/Forms/CreateArticleFormChecker.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/servelets/Login.java +/home/stag/Desktop/tester/java-web-td/src/main/java/Forms/FormChecker.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/servelets/Signin.java +/home/stag/Desktop/tester/java-web-td/src/main/java/Forms/Checkable.java +/home/stag/Desktop/tester/java-web-td/src/main/java/fr/ldnr/servelets/Home.java diff --git a/target/mavenproject3-1.0-SNAPSHOT.war b/target/mavenproject3-1.0-SNAPSHOT.war index 4f050cc6222b347a9931808f3d2b4c5af7945964..bd2e6c4b57d37bb8f250b0dc413aad51da2ce67a 100644 Binary files a/target/mavenproject3-1.0-SNAPSHOT.war and b/target/mavenproject3-1.0-SNAPSHOT.war differ diff --git a/target/mavenproject3-1.0-SNAPSHOT/WEB-INF/web.xml b/target/mavenproject3-1.0-SNAPSHOT/WEB-INF/web.xml index a718bcfadba7604ab5419890c7d6edae93a3f188..8e105b3c0a7d8dfea3a5434c521afe016977ce51 100644 --- a/target/mavenproject3-1.0-SNAPSHOT/WEB-INF/web.xml +++ b/target/mavenproject3-1.0-SNAPSHOT/WEB-INF/web.xml @@ -1,18 +1,22 @@ - 30 - accueil.html - index.html - index.htm - index.jsp - default.html - default.htm - default.jsp + home + + + + *.jsp + /WEB-INF/taglibs.jsp + + + + + + diff --git a/target/mavenproject3-1.0-SNAPSHOT/accueil.html b/target/mavenproject3-1.0-SNAPSHOT/accueil.html index be275d65565207eb27d2f0602c49b43e304e213b..f87d2189cf87ee0459c263f2bfd8e62b5a1370f7 100644 --- a/target/mavenproject3-1.0-SNAPSHOT/accueil.html +++ b/target/mavenproject3-1.0-SNAPSHOT/accueil.html @@ -9,13 +9,56 @@ and open the template in the editor. TODO supply a title - + +

Ma page d'accueil

-
test div
- la page Home -
- la page steack