Bonjour à tous,
je débute dans le monde J2EE, j'ai donc commencé par suivre un tutoriel dont le but est de créer un formulaire tout simple (nom et age à renseigner) et de rediriger sur l'une des pages suivantes suivant les cas: reponse.jsp, erreurs.jsp ou formulaire.jsp (cas d'un redéploiement de la page)
Si les champs sont correctement remplis tout se passe bien et l'on est bien redirigé vers reponse.jsp. Par contre si l'un au moins des champs est vide ou mal saisi j'obtiens une erreur d'exception du type IndexOutOfBoundsException comme si j'avais un dépassement d'indice dans un tableau alors que je devrais obtenir un message d'erreur prévu par la servlet...

Voici le code de la servlet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package yaflt.servlets.djTallCulture;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@SuppressWarnings("serial")
public class ServletDjTallCulture extends HttpServlet {
 
	//paramètres d'instance
	private String urlErreurs = null;
	private ArrayList erreursInitialisation = new ArrayList<String>();
	private String[] paramètres={"urlFormulaire","urlReponse"};
	private Map params=new HashMap<String,String>();
 
	//init
	@SuppressWarnings("unchecked")
	public void init() throws ServletException{
	//on récupère les paramètres d'initialisation de la servlet
	ServletConfig config = getServletConfig();
	//on traite les autres paramètres d'initialisation
	String valeur=null;
		for(int i=0;i<paramètres.length;i++){
			//valeur du paramètre
			valeur = config.getInitParameter(paramètres[i]);
			//paramètre présent?
			if(valeur == null){
				//on note l'erreur
				erreursInitialisation.add("Le paramètre ["+paramètres[i]+"] n'a pas été initialisé");
			}else{
				//on mémorise la valeur du paramètre
				params.put(paramètres[i], valeur);
			}
			//l'url de la vue [erreurs]a un traitement particulier
			urlErreurs = config.getInitParameter("urlErreurs");
			if (urlErreurs == null)
				throw new ServletException("Le paramètre [urlErreurs] n'a pas été initialisé");
		}
		
	}
	
	@SuppressWarnings("unchecked")
	public void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws IOException, ServletException {
		
		// on vérifie comment s'est passé l'initialisation de la servlet
		if(erreursInitialisation.size()!=0){
			//on passe la main à la page d'erreurs
			request.setAttribute("erreurs", erreursInitialisation);
			getServletContext().getRequestDispatcher(urlErreurs).forward(request, response);
			//fin
			return;
		}
 
		//on récupère la méthode d'envoi de la requête
		String méthode = request.getMethod().toLowerCase();
		//on récupère l'action à exécuter
		String action = request.getParameter("action");
		//action?
		if(action==null){
			action="init";
		}
		//exécution action
		if(méthode.equals("get") && action.equals("init")){
			//démarrage application
			doInit(request,response);
			return;			
		}
		if(méthode.equals("post") && action.equals("validationFormulaire")){
			//validation du formulaire de saisie
			doValidationFormulaire(request,response);
			return;			
		}
		// autres cas
		doInit(request,response);
 
	}
 
	//affichage vue initiale
	void doInit(HttpServletRequest request, HttpServletResponse response)
	throws IOException, ServletException {
		//on envoie le formulaire vide
		request.setAttribute("nom", "");
		request.setAttribute("age", "");
		getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(request, response);
		return;	
	}
 
	//validation du formulaire
	void  doValidationFormulaire(HttpServletRequest request, HttpServletResponse response)
	throws IOException, ServletException {
		//on récupère les paramètres
		String nom = request.getParameter("txtNom");
		String age = request.getParameter("txtAge");
		//vérification des paramètres
		ArrayList<String> erreursAppel = new ArrayList<String>();
		//le nom doit être non vide
		nom = nom.trim();
		if (nom.equals(""))
			erreursAppel.add("Le champ [nom] n'a pas été rempli");
		//l'age doit être un entier >=0
		if (!age.matches("^\\s*\\d+\\s*$"))
			erreursAppel.add("Le champ [age] est erroné");
		//des erreurs dans les paramètres?
		if(erreursAppel.size()!=0){
			//on envoie la page d'erreurs
			request.setAttribute("erreurs", erreursAppel);
			getServletContext().getRequestDispatcher(urlErreurs).forward(request,response);
			return;			
		}
		// les paramètres sont corrects - on envoie la page réponse
		request.setAttribute("nom", nom);
		request.setAttribute("age", age);
		getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,response);
		return;
	}
 
	//post
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws IOException, ServletException {
		//on passe la main au GET
		doGet(request, response);
	}
 
}
voici le code de la page erreurs.jsp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page import="java.util.ArrayList" %>
 
<%
        // on récupère les données du modèle
        ArrayList erreurs = (ArrayList)request.getAttribute("erreurs");
%>
<html>
	<head>
		<title>DjTallCulture</title>
	</head>
	<body>
		<h2>Les erreurs suivantes se sont produites</h2>
		<ul>
 
			<%
                         for(int i=0;i<=erreurs.size();i++){
                                 out.println("<li>"+(String) erreurs.get(i)+"<li>\n");
                         }//for
                        %>
		</ul>
	</body>
</html>
et enfin le message d'erreur de tomcat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type Rapport d'exception
 
message
 
description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
 
exception
 
org.apache.jasper.JasperException: Index: 2, Size: 2
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	yaflt.servlets.djTallCulture.ServletDjTallCulture.doValidationFormulaire(ServletDjTallCulture.java:115)
	yaflt.servlets.djTallCulture.ServletDjTallCulture.doGet(ServletDjTallCulture.java:78)
	yaflt.servlets.djTallCulture.ServletDjTallCulture.doPost(ServletDjTallCulture.java:129)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 
cause mère
 
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
	java.util.ArrayList.RangeCheck(Unknown Source)
	java.util.ArrayList.get(Unknown Source)
	org.apache.jsp.WEB_002dINF.vues.erreurs_jsp._jspService(erreurs_jsp.java:63)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	yaflt.servlets.djTallCulture.ServletDjTallCulture.doValidationFormulaire(ServletDjTallCulture.java:115)
	yaflt.servlets.djTallCulture.ServletDjTallCulture.doGet(ServletDjTallCulture.java:78)
	yaflt.servlets.djTallCulture.ServletDjTallCulture.doPost(ServletDjTallCulture.java:129)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
J'ai pourtant repris à la lettre le code du tutoriel mais là je suis à cours d'idée...