doGet et doPost dans les servlets

J’ai développé une page HTML qui envoie des informations à un servlet. Dans la servlet, j’utilise les méthodes doGet() et doPost() :

 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Ssortingng id = req.getParameter("realname"); Ssortingng password = req.getParameter("mypassword"); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Ssortingng id = req.getParameter("realname"); Ssortingng password = req.getParameter("mypassword"); } 

Dans le code de page html qui appelle le servlet est:

 
User Name: Password:

Lorsque j’utilise method = "get" dans le servlet, j’obtiens la valeur id et password, mais lorsque vous utilisez method = "post" , id et password sont définis sur null . Pourquoi n’ai-je pas les valeurs dans ce cas?

J’aimerais également savoir comment utiliser les données générées ou validées par le Servlet. Par exemple, si le servlet indiqué ci-dessus authentifie l’utilisateur, j’aimerais imprimer l’ID utilisateur dans ma page HTML. Je devrais pouvoir envoyer la chaîne ‘id’ en réponse et utiliser cette information dans ma page HTML. C’est possible?

introduction

Vous devez utiliser doGet() lorsque vous souhaitez intercepter des requêtes HTTP GET . Vous devez utiliser doPost() lorsque vous souhaitez intercepter des requêtes HTTP POST . C’est tout. Ne processRequest() pas les uns sur les autres ou inversement (comme dans la méthode malheureuse auto-générée processRequest() Netbeans). Cela n’a pas de sens absolu.

OBTENIR

En règle générale, les requêtes HTTP GET sont idempotentes . C’est-à-dire que vous obtenez exactement le même résultat chaque fois que vous exécutez la requête (en laissant de côté l’autorisation / authentification et le caractère temporel de la page – résultats de recherche, dernières actualités, etc.). Nous pouvons parler d’une demande de signet. En cliquant sur un lien, en cliquant sur un signet, en saisissant une URL brute dans la barre d’adresse du navigateur, etc., une requête HTTP GET sera lancée. Si une servlet écoute l’URL en question, sa méthode doGet() sera appelée. Il est généralement utilisé pour prétraiter une demande. C’est-à-dire faire des affaires avant de présenter la sortie HTML d’un JSP, par exemple en rassemblant des données pour les afficher dans un tableau.

 @WebServlet("/products") public class ProductsServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List products = productService.list(); request.setAtsortingbute("products", products); // Will be available as ${products} in JSP request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); } } 
  
${product.name} detail

Voir / modifier les liens de détail comme indiqué dans la dernière colonne ci-dessus sont généralement idempotents.

 @WebServlet("/product") public class ProductServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Product product = productService.find(request.getParameter("id")); request.setAtsortingbute("product", product); // Will be available as ${product} in JSP request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response); } } 
 
ID
${product.id}
Name
${product.name}
Description
${product.description}
Price
${product.price}
Image

POSTER

Les requêtes HTTP POST ne sont pas idempotentes. Si l’utilisateur final a préalablement soumis un formulaire POST sur une URL, qui n’a pas effectué de redirection, l’URL n’est pas forcément un signet. Les données du formulaire soumis ne sont pas reflétées dans l’URL. La copie de l’URL dans une nouvelle fenêtre ou un nouvel onglet de navigateur peut ne pas aboutir nécessairement au même résultat qu’après l’envoi du formulaire. Une telle URL n’est alors pas lisible. Si une servlet écoute l’URL en question, son doPost() sera appelé. Il est généralement utilisé pour posttraiter une demande. C’est-à-dire collecter des données à partir d’un formulaire HTML soumis et faire des affaires avec elle (conversion, validation, sauvegarde dans la firebase database, etc.). Enfin, le résultat est généralement présenté en HTML à partir de la page JSP transmise.

 
${error}

… qui peut être utilisé en combinaison avec ce morceau de Servlet:

 @WebServlet("/login") public class LoginServlet extends HttpServlet { @EJB private UserService userService; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Ssortingng username = request.getParameter("username"); Ssortingng password = request.getParameter("password"); User user = userService.find(username, password); if (user != null) { request.getSession().setAtsortingbute("user", user); response.sendRedirect("home"); } else { request.setAtsortingbute("error", "Unknown user, please try again"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } } 

Vous voyez, si l’ User est trouvé dans la firebase database (c.-à-d. Le nom d’utilisateur et le mot de passe sont valides), l’ User sera placé dans la session (“connecté”) et le servlet sera redirigé vers une page principale http://example.com/contextname/home ), sinon un message d’erreur sera défini et la demande sera renvoyée à la même page JSP afin que le message s’affiche avec ${error} .

Vous pouvez si nécessaire aussi “masquer” le login.jsp dans /WEB-INF/login.jsp pour que les utilisateurs puissent y accéder uniquement par le servlet. Cela permet de conserver l’URL propre http://example.com/contextname/login . Tout ce que vous devez faire est d’append un doGet() à la servlet comme ceci:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } 

(et mettez à jour la même ligne dans doPost() conséquence)

Cela dit, je ne suis pas sûr que ce soit juste en train de jouer et de tourner dans l’obscurité, mais le code que vous avez posté ne semble pas bon (utiliser compareTo() au lieu de equals() et creuser les parameters au lieu de L’utilisation de getParameter() et de l’ id et du password semble être déclarée comme variable d’instance de servlet – ce qui n’est PAS threadsafe ). Je recommande donc fortement d’en apprendre un peu plus sur l’API Java SE de base en utilisant les didacticiels Oracle (consultez le chapitre “Trails Covering the Basics”) et comment utiliser JSP / Servlets correctement à l’aide de ces didacticiels .

Voir également:

  • La page wiki de nos servlets
  • Développement Web Java EE, par où commencer et quelles compétences ai-je besoin?
  • Servlet renvoie “HTTP Status 404 La ressource demandée (/ servlet) n’est pas disponible”
  • Afficher JDBC ResultSet en HTML dans la page JSP à l’aide du modèle MVC et DAO

Mise à jour : selon la mise à jour de votre question (qui est assez importante, vous ne devriez pas supprimer des parties de votre question originale, cela rendrait les réponses sans valeur… plutôt append les informations dans un nouveau bloc), il s’avère que vous êtes définir inutilement le type de codage du formulaire sur multipart/form-data . Cela enverra les parameters de la demande dans une composition différente de l’ application/x-www-form-urlencoded par défaut application/x-www-form-urlencoded qui envoie les parameters de la requête en tant que chaîne de requête (par exemple name1=value1&name2=value2&name3=value3 ). Vous n’avez besoin de multipart/form-data que si vous avez un élément dans le formulaire pour télécharger des fichiers qui peuvent être des données non-caractères (données binarys). Ce n’est pas le cas dans votre cas, il suffit donc de le supprimer et cela fonctionnera comme prévu. Si vous avez besoin de télécharger des fichiers, vous devrez définir le type de codage et parsingr vous-même le corps de la requête. Habituellement, vous utilisez Apache Commons FileUpload pour cela, mais si vous utilisez déjà la nouvelle API Servlet 3.0, vous pouvez simplement utiliser les fonctionnalités intégrées en commençant par HttpServletRequest#getPart() . Voir aussi cette réponse pour un exemple concret: comment télécharger des fichiers sur un serveur en utilisant JSP / Servlet?

GET et POST sont tous deux utilisés par le navigateur pour demander une seule ressource au serveur. Chaque ressource nécessite une requête GET ou POST distincte.

  1. La méthode GET est le plus souvent (et est la méthode par défaut) utilisée par les navigateurs pour extraire des informations des serveurs. Lorsque vous utilisez la méthode GET, la 3ème section du paquet de requête, qui est le corps de la requête, rest vide.

La méthode GET est utilisée de deux manières: Lorsqu’aucune méthode n’est spécifiée, c’est-à-dire lorsque vous ou le navigateur demandez une ressource simple telle qu’une page HTML, une image, etc. Lorsqu’un formulaire est soumis et que vous choisissez la méthode = GET sur la balise HTML. Si la méthode GET est utilisée avec un formulaire HTML, les données collectées via le formulaire sont envoyées au serveur en ajoutant un “?” à la fin de l’URL, puis en ajoutant toutes les paires nom = valeur (nom du champ html et valeur entrée dans ce champ) séparées par un “&” Exemple: GET /sultans/shop//form1.jsp?name= Sam% 20Sultan & iceCream = vanille HTTP / 1.0 en-tête facultatif en-tête optionnel << ligne vide >>>

Les données du formulaire name = value seront stockées dans une variable d’environnement appelée QUERY_STRING. Cette variable sera envoyée à un programme de traitement (JSP, Java Servlet, PHP, etc.)

  1. La méthode POST est utilisée lorsque vous créez un formulaire HTML et que request method = POST fait partie de la balise. La méthode POST permet au client d’envoyer des données de formulaire au serveur dans la section requête du corps de la requête (comme indiqué précédemment). Les données sont codées et sont formatées de manière similaire à la méthode GET, sauf que les données sont envoyées au programme via l’entrée standard.

Exemple: POST /sultans/shop//form1.jsp HTTP / 1.0 en-tête optionnel headeroptional << ligne vide >>> nom = Sam% 20Sultan & iceCream = vanille

Lorsque vous utilisez la méthode post, la variable d’environnement QUERY_STRING sera vide. Avantages / inconvénients de GET vs. POST

Avantages de la méthode GET: légèrement plus rapide Les parameters peuvent être saisis via un formulaire ou en les ajoutant après que la page URL ait pu être mise en signet avec ses parameters

Inconvénients de la méthode GET: ne peut envoyer que 4K de données. (Vous ne devriez pas l’utiliser lorsque vous utilisez un champ textarea) Les parameters sont visibles à la fin de l’URL

Avantages de la méthode POST: Les parameters ne sont pas visibles à la fin de l’URL. (Utiliser pour les données sensibles) Peut envoyer plus de 4K de données sur le serveur

Inconvénients de la méthode POST: ne peut pas être mis en signet avec ses données

L’implémentation de la méthode HttpServlet.service () du conteneur de servlets est automatiquement transférée vers doGet () ou doPost () si nécessaire, vous n’avez donc pas besoin de remplacer la méthode de service.

Serait-ce que vous transmettez les données via get, pas post?

 
..

Si vous faites

pour votre formulaire html, les données seront transmises en utilisant ‘Get’ par défaut et vous pourrez donc utiliser cette fonction avec la fonction doGet dans votre code de servlet java. De cette manière, les données seront transmises sous l’en-tête HTML et seront donc visibles dans l’URL lors de la soumission. D’un autre côté, si vous souhaitez transmettre des données dans le corps HTML, utilisez USE Post:

et attrapez ces données dans la fonction doPost. C’était, les données seront transmises sous le corps de HTML et pas l’en-tête de HTML, et vous ne verrez pas les données dans l’URL après avoir soumis le formulaire.

Exemples de mon HTML:

  
..... .....

Exemples de code de servlet java:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = response.getWriter(); Ssortingng surname = request.getParameter("txtSurname"); Ssortingng firstname = request.getParameter("txtForename"); Ssortingng rqNo = request.getParameter("txtRQ6"); Ssortingng nhsNo = request.getParameter("txtNHSNo"); Ssortingng attachment1 = request.getParameter("base64textarea1"); Ssortingng attachment2 = request.getParameter("base64textarea2"); ......... .........