サーブレットを伴うサインアップ フォーム ページを作成しようとしています。しかし、サインアップしようとすると、うまくいきません。ここでの問題は次のとおりです。InscriptionForm
その JSP からフィールドを回復し始めると、null
値が参照されます。この mvc を使用してサインアップするにはどうすればよいですか? xD
JSP
<%@ page pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Inscription</title> <link type="text/css" rel="stylesheet" href="<c:url value="/inc/form.css"/>" /> </head> <body> <c:import url="/inc/barre.jsp" /> <form method="post" action="<c:url value="/inscription" />" enctype="multipart/form-data"> <fieldset> <legend>Inscription</legend> <label for="email">Adresse email <span class="requis">*</span></label> <input type="text" class="btn" id="email" name="email" value="<c:out value="${utilisateur.email}"/>" size="20" maxlength="60" /> <span class="erreur">${form.erreurs['email']}</span> <br /> <label for="motdepasse">Mot de passe <span class="requis">*</span></label> <input type="password" class="btn" id="motdepasse" name="motdepasse" value="" size="20" maxlength="20" /> <span class="erreur">${form.erreurs['motdepasse']}</span> <br /> <label for="confirmation">Confirmation du mot de passe <span class="requis">*</span></label> <input type="password" class="btn" id="confirmation" name="confirmation" value="" size="20" maxlength="20" /> <br /> <label for="nom">Pseudo <span class="requis">*</span></label> <input type="text" id="nom" class="btn" name="nom" value="<c:out value="${utilisateur.nom}"/>" size="20" maxlength="20" /> <span class="erreur">${form.erreurs['nom']}</span> <br /> <label for="siteweb">Site-web </label> <input type="text" class="btn" id="siteweb" name="siteweb" value="" size="20" maxlength="20" /> <span class="erreur">${form.erreurs['siteweb']}</span> <br /> <label for="avatar">Avatar </label> <input type="file" id="avatar" name="avatar" value="<c:out value="${nomFichier}"/>" /> <span class="erreur">${form.erreurs['avatar']}</span><br /> <label for="localisation">Localisation </label> <input type="text" class="btn" id="localisation" name="localisation" value="" size="20" maxlength="20" /> <span class="erreur">${form.erreurs['localisation']}</span><br /> <label for="description">Description </label> <textarea id="description" name="description" rows="4" cols="50"></textarea> <span class="erreur">${form.erreurs['description']}</span> <br /> <input type="submit" value="Inscription" class="sansLabel" /> <input type="reset" value="Remettre à zéro" /> <br /> <p class="${empty form.erreurs ? 'succes' : 'erreur'}">${form.resultat}</p> </fieldset> </form> </body> </html>
サーブレット
package com.forum.form; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.forum.beans.Utilisateur; import com.forum.dao.UtilisateurDAO; import com.forum.utils.HibernateUtils; import eu.medsea.mimeutil.MimeUtil; public final class InscriptionForm { private static final String CHAMP_EMAIL = "email"; private static final String CHAMP_PASS = "motdepasse"; private static final String CHAMP_CONF = "confirmation"; private static final String CHAMP_NOM = "nom"; private static final String CHAMP_DESC = "description"; private static final String CHAMP_LOC = "localisation"; private static final String CHAMP_SW = "siteweb"; public static final String CHAMP_IMAGE = "avatar"; public static final int TAILLE_TAMPON = 10240; // 10 ko public static final String CHEMIN = "E:\\Bibliothèque logicielle\\workspace\\projetForum\\WebContent\\images\\bd\\"; private String resultat; private static Map<String, String> erreurs = new HashMap<String, String>(); public String getResultat() { return resultat; } public Map<String, String> getErreurs() { return erreurs; } public Utilisateur inscrireUtilisateur(HttpServletRequest request) { String email = getValeurChamp(request, CHAMP_EMAIL); String motDePasse = getValeurChamp(request, CHAMP_PASS); String confirmation = getValeurChamp(request, CHAMP_CONF); String nom = getValeurChamp(request, CHAMP_NOM); String description = getValeurChamp(request, CHAMP_DESC); String localisation = getValeurChamp(request, CHAMP_LOC); String siteweb = getValeurChamp(request, CHAMP_SW); String image = getValeurChamp(request, CHAMP_IMAGE); System.out.println("*********************"+email + motDePasse + confirmation + nom + description + localisation + siteweb + image); try { validationEmail(email); } catch (Exception e) { setErreur(CHAMP_EMAIL, e.getMessage()); } try { validationMotsDePasse(motDePasse, confirmation); } catch (Exception e) { setErreur(CHAMP_PASS, e.getMessage()); } try { validationNom(nom); } catch (Exception e) { setErreur(CHAMP_NOM, e.getMessage()); } if (image != null) try { image = validationImage(request, CHEMIN); } catch (Exception e) { setErreur(CHAMP_IMAGE, e.getMessage()); } Utilisateur utilisateur = new Utilisateur(email, motDePasse, nom, localisation, siteweb, description); utilisateur.setAvatar(image); if (erreurs.isEmpty()) { resultat = "Succès de l'inscription."; createORupdate(utilisateur, request); } else { resultat = "Échec de l'inscription."; } return utilisateur; } private String validationImage(HttpServletRequest request, String chemin) throws Exception { /* * Récupération du contenu du champ image du formulaire. Il faut ici * utiliser la méthode getPart(). */ SimpleDateFormat formater = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); Date aujourdhui = new Date(); String nomFichier = formater.format(aujourdhui).replace(" ", "") .replace("/", "").replace(":", "").replace("-", ""); InputStream contenuFichier = null; try { Part part = request.getPart(CHAMP_IMAGE); nomFichier = nomFichier + getNomFichier(part); /* * Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit * donc d'un champ de type fichier (input type="file"). */ if (nomFichier != null && !nomFichier.isEmpty()) { /* * Antibug pour Internet Explorer, qui transmet pour une raison * mystique le chemin du fichier local à la machine du client... * * Ex : C:/dossier/sous-dossier/fichier.ext * * On doit donc faire en sorte de ne sélectionner que le nom et * l'extension du fichier, et de se débarrasser du superflu. */ nomFichier = nomFichier.substring( nomFichier.lastIndexOf('/') + 1).substring( nomFichier.lastIndexOf('\\') + 1); /* Récupération du contenu du fichier */ contenuFichier = part.getInputStream(); /* Extraction du type MIME du fichier depuis l'InputStream */ MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector"); Collection<?> mimeTypes = MimeUtil.getMimeTypes(contenuFichier); /* * Si le fichier est bien une image, alors son en-tête MIME * commence par la chaîne "image" */ if (mimeTypes.toString().startsWith("image")) { /* Ecriture du fichier sur le disque */ ecrireFichier(contenuFichier, nomFichier, chemin); } else { throw new Exception( "Le fichier envoyé doit être une image."); } } } catch (IllegalStateException e) { /* * Exception retournée si la taille des données dépasse les limites * définies dans la section <multipart-config> de la déclaration de * notre servlet d'upload dans le fichier web.xml */ e.printStackTrace(); throw new Exception("Le fichier envoyé ne doit pas dépasser 1Mo."); } catch (IOException e) { /* * Exception retournée si une erreur au niveau des répertoires de * stockage survient (répertoire inexistant, droits d'accès * insuffisants, etc.) */ e.printStackTrace(); throw new Exception("Erreur de configuration du serveur."); } catch (ServletException e) { /* * Exception retournée si la requête n'est pas de type * multipart/form-data. */ e.printStackTrace(); throw new Exception( "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier."); } return nomFichier; } private void setErreur(String champ, String message) { erreurs.put(champ, message); } private static String getValeurChamp(HttpServletRequest request, String nomChamp) { String valeur = request.getParameter(nomChamp); if (valeur == null || valeur.trim().length() == 0) { return null; } else { return valeur; } } /* * Méthode utilitaire qui a pour unique but d'analyser l'en-tête * "content-disposition", et de vérifier si le paramètre "filename" y est * présent. Si oui, alors le champ traité est de type File et la méthode * retourne son nom, sinon il s'agit d'un champ de formulaire classique et * la méthode retourne null. */ private static String getNomFichier(Part part) { /* Boucle sur chacun des paramètres de l'en-tête "content-disposition". */ for (String contentDisposition : part.getHeader("content-disposition") .split(";")) { /* Recherche de l'éventuelle présence du paramètre "filename". */ if (contentDisposition.trim().startsWith("filename")) { /* * Si "filename" est présent, alors renvoi de sa valeur, * c'est-à-dire du nom de fichier sans guillemets. */ return contentDisposition .substring(contentDisposition.indexOf('=') + 1).trim() .replace("\"", ""); } } /* Et pour terminer, si rien n'a été trouvé... */ return null; } /* * Méthode utilitaire qui a pour but d'écrire le fichier passé en paramètre * sur le disque, dans le répertoire donné et avec le nom donné. */ private void ecrireFichier(InputStream contenuFichier, String nomFichier, String chemin) throws Exception { /* Prépare les flux. */ BufferedInputStream entree = null; BufferedOutputStream sortie = null; try { /* Ouvre les flux. */ entree = new BufferedInputStream(contenuFichier, TAILLE_TAMPON); sortie = new BufferedOutputStream(new FileOutputStream(new File( chemin + nomFichier)), TAILLE_TAMPON); /* * Lit le fichier reçu et écrit son contenu dans un fichier sur le * disque. */ byte[] tampon = new byte[TAILLE_TAMPON]; int longueur = 0; while ((longueur = entree.read(tampon)) > 0) { sortie.write(tampon, 0, longueur); } } catch (Exception e) { throw new Exception( "Erreur lors de l'écriture du fichier sur le disque."); } finally { try { sortie.close(); } catch (IOException ignore) { } try { entree.close(); } catch (IOException ignore) { } } } private static void createORupdate(Utilisateur u, HttpServletRequest request) { Session s = HibernateUtils.getSession(); Transaction tx = s.beginTransaction(); Query q = s .createQuery("from Utilisateur where Utilisateur_email = :email"); q.setString("email", u.getEmail()); Utilisateur userUpdt = (Utilisateur) q.uniqueResult(); if (userUpdt != null) { userUpdt.setNom(u.getNom()); userUpdt.setEmail(u.getEmail()); userUpdt.setSiteweb(u.getSiteweb()); userUpdt.setLocalisation(u.getLocalisation()); userUpdt.setDescription(u.getDescription()); s.update(userUpdt); } else { SimpleDateFormat formater = new SimpleDateFormat( "dd-MM-yyyy hh:mm:ss"); Date aujourdhui = new Date(); u.setDateInscrit(formater.format(aujourdhui)); s.persist(u); } tx.commit(); } private void validationEmail(String email) throws Exception { UtilisateurDAO<Utilisateur, String> ud = new UtilisateurDAO<Utilisateur, String>(); if (ud.findByID(email) != null) throw new Exception("Adresse mail déjà utilisée."); else if (email == null || ud.findByID(email) != null || !email.matches("([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)")) { throw new Exception("Merci de saisir une adresse mail valide."); } } private void validationMotsDePasse(String motDePasse, String confirmation) throws Exception { if (motDePasse != null && confirmation != null) { if (!motDePasse.equals(confirmation)) { throw new Exception( "Les mots de passe entrés sont différents, merci de les saisir à nouveau."); } else if (motDePasse.length() < 6) { throw new Exception( "Les mots de passe doivent contenir au moins 6 caractères."); } } else { throw new Exception( "Merci de saisir et confirmer votre mot de passe."); } } private static void validationNom(String nom) throws Exception { UtilisateurDAO<Utilisateur, String> ud = new UtilisateurDAO<Utilisateur, String>(); if (ud.findByNom(nom) != null) throw new Exception("Nom d'utilisateur déjà utilisée."); else if (nom == null || nom.length() < 3) { throw new Exception( "Le nom d'utilisateur doit contenir au moins 3 caractères."); } } }
碑文フォーム
package com.forum.servlets; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.forum.beans.Connecte; import com.forum.beans.Nombres; import com.forum.beans.Utilisateur; import com.forum.dao.ConnecteDAO; import com.forum.dao.NombresDAO; import com.forum.dao.UtilisateurDAO; import com.forum.form.InscriptionForm; public class Inscription extends HttpServlet { public static final String ATT_USER = "utilisateur"; public static final String ATT_FORM = "form"; public static final String VUE = "/WEB-INF/inscription.jsp"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { NombresDAO<Nombres, Integer> nd = new NombresDAO<Nombres, Integer>(); SimpleDateFormat formater = new SimpleDateFormat("dd-MM-yyyy"); Date aujourdhui = new Date(); Nombres n = nd.findByDay(formater.format(aujourdhui).replace("-", "")); if (n == null) { n = new Nombres(1); nd.create(n); } else { n.setNbvisiteurs(n.getNbvisiteurs() + 1); nd.update(n); } this.getServletContext().getRequestDispatcher(VUE) .forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); InscriptionForm form = new InscriptionForm(); Utilisateur utilisateur = form.inscrireUtilisateur(request); Connecte c = new Connecte(utilisateur.getNom()); ConnecteDAO<Connecte, String> cd = new ConnecteDAO<Connecte, String>(); if (cd.findByID(utilisateur.getNom()) != null) cd.update(c); else cd.create(c); cd.findAll5(); request.setAttribute(ATT_FORM, form); if (!form.getErreurs().isEmpty()) { request.setAttribute(ATT_USER, utilisateur); this.getServletContext().getRequestDispatcher(VUE) .forward(request, response); } else { UtilisateurDAO<Utilisateur, String> ud = new UtilisateurDAO<Utilisateur, String>(); ud.create(utilisateur); session.setAttribute(ATT_USER, utilisateur); response.sendRedirect("/projetForum/listforums"); } } }
誰か助けてくれませんか?