2013-09-02 3 views
0

Я пытаюсь создать свою регистрационную страницу для регистрации, которая будет сопровождать ее сервлет. Но когда я пытаюсь зарегистрироваться, это не сработает. Проблема здесь в том, что когда 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("([^[email protected]]+)(\\.[^[email protected]]+)*@([^[email protected]]+\\.)+([^[email protected]]+)")) { 
      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."); 
     } 
    } 
} 

InscriptionForm

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"); 
     } 

    } 
} 

Может кто-то помочь, пожалуйста?

+0

Возможный дубликат [Как загрузить файлы на сервер с помощью JSP/Servlet?] (Http://stackoverflow.com/questions/2422468/how-to-upload-files-to-server-using-jsp-servlet) – BalusC

+0

Спасибо, BalusC, я только что видел ваш комментарий! –

+0

@BalusC, я следил за этой [ссылкой] (http://balusc.blogspot.in/2007/11/multipartfilter.html), чтобы перестроить мою форму и фильтр. Но, когда я пытаюсь отобразить записанное изображение (загруженный файл), изображение отображается неправильно (как неработающая ссылка), можете ли вы помочь? –

ответ

0

Как вы используете enctype="multipart/form-data", вы не можете получить значения параметров запроса напрямую, используя request.getParameter("param");. Это всегда будет возвращать значение null. Чтобы извлечь данные формы, вы можете использовать Apache commons fileupload. Вот как это работает (from Commons fileUpload user guide): запрос загрузки

Файл содержит упорядоченный список элементов, которые являются кодироваться в соответствии с RFC 1867, «на основе форм загрузки файла в HTML» .each пункт файл имеет количество объектов, которые могут представлять интерес для вашей заявки. Например, каждый элемент имеет имя и тип контента и может предоставлять InputStream для доступа к его данным. С другой стороны, вам может потребоваться обработать элементы по-разному, в зависимости от , является ли элемент регулярным полем формы, то есть данные поступают из обычного текстового поля или аналогичного поля HTML - или загруженного файла. Интерфейс FileItem предоставляет методы для такого определения, и для доступа к данным наиболее подходящим образом.

Here является хорошей статьей для решения вопросов с multipart/form-data.

Смежные вопросы