0

我尝试创建伴随其 servlet 的注册表单页面。但是当我尝试注册时,它不起作用。这里的问题是:当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");
      }

  }
}

有人可以帮忙吗?

4

1 回答 1

0

在使用的过程中enctype="multipart/form-data",无法直接通过使用获取请求参数值request.getParameter("param");。这将始终返回 null。要提取表单数据,您可以使用Apache commons fileupload。以下是它的工作原理(来自 Commons fileUpload 用户指南):

文件上传请求包含根据 RFC 1867“HTML 中基于表单的文件上传”编码的项目的有序列表。每个文件项目都有许多可能对您的应用程序感兴趣的属性。例如,每个项目都有一个名称和一个内容类型,并且可以提供一个 InputStream 来访问它的数据。另一方面,您可能需要以不同方式处理项目,具体取决于项目是常规表单字段(即数据来自普通文本框或类似的 HTML 字段)还是上传的文件。FileItem 接口提供了做出此类决定的方法,并以最合适的方式访问数据。

是一篇很好的文章来处理multipart/form-data

于 2013-09-02T13:53:20.007 回答