Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur à l'instantiation de la classe servlet

État HTTP 500

Sujet résolu
    30 avril 2022 à 15:08:18

    Bonjour,

    Je voudrais créer une application web où on peut ajouter et supprimer des produits dans un panier.

    Cependant quand j'essaye de lancer la requête post pour ajouter un produit, j'obtiens cette erreur :


    message Erreur à l'instantiation de la classe servlet [panier.AjouterPanier]
    description Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.
    exception
    jakarta.servlet.ServletException: Erreur à l'instantiation de la classe servlet [panier.AjouterPanier]
    	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356)
    	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
    	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:866)
    	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1716)
    	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	java.base/java.lang.Thread.run(Thread.java:831)
    cause mère
    java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
    	java.base/java.lang.ClassLoader.defineClass1(Native Method)
    	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
    	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
    	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2522)
    	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:872)
    	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1408)
    	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1252)
    	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356)
    	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
    	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:866)
    	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1716)
    	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	java.base/java.lang.Thread.run(Thread.java:831)

    Voici ma servlet qui me permet d'enregistrer les produits :

    package panier;
    
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    
    
    
    /**
     * Servlet implementation class AjouterPanier
     */
    
    @WebServlet("/ajouterProduit")
    public class AjouterPanier extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
        /**
         * Default constructor. 
         */
        public AjouterPanier() {
        	super();
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		RequestDispatcher dispatcher  = request.getRequestDispatcher("panier.jsp");
    		dispatcher.forward(request, response);
    		
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String nom = request.getParameter("nom");
    		double prix = Double.parseDouble(request.getParameter("prix"));
    		String ref = request.getParameter("ref");
    		
    		Produit p = new Produit();
    		
    		p.setNom(nom);
    		p.setPrix(prix);
    		p.setRef(ref);
    		
    		List<Produit> produits = new ArrayList<Produit>();
    		
    		produits.add(p);
    		
    		HttpSession session = request.getSession();
    		
    		session.setAttribute("produits", produits);
    		
    		RequestDispatcher dispatcher  = request.getRequestDispatcher("panier.jsp");
    		dispatcher.forward(request, response);
    		
    		System.out.println(Arrays.toString(produits.toArray()));
    		
    		
    		
    		
    		
    	}
    
    }
    


    Voici la page JSP qui permet de rentrer les données et réaliser la requête :

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
        
    
    
    <!DOCTYPE html>
    <html>
    <head>
    	<meta name="viewport" content="width=device-width,initial-scale=1">
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    	<meta charset="ISO-8859-1">
    <title>Ajouter un produit</title>
    </head>
    <body>
    	
    
    </head>
    <body>
    	<div>
    		<h2>Ajouter un produit</h2>
    		
    		<form action="<%=request.getContextPath() %>/AjouterPanier" method="post">
    			<label for="ref">Nom du produit :</label><br>
    			<input type="text" name="nom" required><br>
    			
    			<label for="ref">Prix du produit :</label><br>
    			<input type="number" name="prix" required><br>
    			
    			<label for="ref">Référence :</label><br>
    			<input type="text" name="ref" required><br><br>
    			
    			<input type="submit" value="Ajouter le produit">
    		</form>
    	</div>
    
    	
    </body>
    </html>


    Toutes les informations devront être ensuite affiché sur autre page JSP (c'est a dire le panier)

    Voici son code :


    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta name="viewport" content="width=device-width,initial-scale=1">
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    	<meta charset="ISO-8859-1">
    <title>Panier</title>
    </head>
    
    <style>
    
    </style>
    
    
    <body>
    	
    
    </head>
    <body>
    	<h3>PANIER</h3>
    	<div>
    		
    		<form method="GET" action="ajouterProduit.jsp">
        		<input type="submit" value="Ajouter un produit" />
    		</form>
    		
    		<br>
    		
    		<div class="produit">
    			<c:forEach items="${produits}" var="produits">
    				<tr>
      					<td><c:out value="${produits.nom}" /></td>
     					<td><c:out value="${produits.prix}" /></td>
     					<td><c:out value="${produits.ref}" /></td>
    				 </tr>
    			</c:forEach>
    		
    		</div>
    		
    	</div>
    
    	
    </body>
    </html>


    Au départ je pensais que mon erreur venait d'un problème au niveau du package mais quand je check mon web.xml :


    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee" id="WebApp_ID" version="2.4">
      <display-name>Panier</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <servlet-name>AjouterPanier</servlet-name>
        <servlet-class>panier.AjouterPanier</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>AjouterPanier</servlet-name>
        <url-pattern>/AjouterPanier</url-pattern>
      </servlet-mapping>
    </web-app>

    Je ne trouve rien de bizarre.


    Pourriez-vous s'il vous plaît m'indiquer si possible ce qu'est le problème afin que je puisse faire fonctionner la requête.

    Je vous remercie d'avance.





    • Partager sur Facebook
    • Partager sur Twitter
      30 avril 2022 à 15:28:50

      Bonjour,

      Tomcat 10 ne supporte pas les API de JAVA EE mais il ne supporte que les API JAKARTA EE 9.

      Tu as 2 choix:

      - soit tu travailles avec JAVA EE 8 et dans ce cas utilise tomcat 9 (ou version inférieure) à la place tomcat 10

      - Soit tu travailles avec JAKARTA EE 9 et dans ce cas tu changes tous les API javax en jakarta, par exemple:

      //AjouterPanier.java
      
      import jakarta.servlet.*;
      import jakarta.servlet.annotation.WebServlet;
      



      -
      Edité par armel.mc 30 avril 2022 à 15:29:41

      • Partager sur Facebook
      • Partager sur Twitter

      Erreur à l'instantiation de la classe servlet

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown