javax.servlet.ServletException: bean [nom] introuvable dans la portée
Question
Je reçois cette erreur:
javax.servlet.ServletException: bean not found within scope
sur une page avec cela en haut.
<jsp:useBean id="bean" type="com.example.Bean" scope="request" />
La classe existe dans le classpath, cela a fonctionné ce matin et je ne comprends pas ce que l'on ne trouve pas dans le champ d'application.
Comment cela est-il causé et comment puis-je le résoudre?
La solution
Vous avez besoin de l'attribut class
au lieu de l'attribut type
.
Les éléments suivants:
<jsp:useBean id="bean" type="com.example.Bean" scope="request" />
fait essentiellement ce qui suit dans les coulisses:
Bean bean = (Bean) pageContext.getAttribute("bean", PageContext.REQUEST_SCOPE);
if (bean == null) {
throw new ServletException("bean not found within scope");
}
// Use bean ...
Alors que ce qui suit:
<jsp:useBean id="bean" class="com.example.Bean" scope="request" />
fait essentiellement ce qui suit dans les coulisses:
Bean bean = (Bean) pageContext.getAttribute("bean", PageContext.REQUEST_SCOPE);
if (bean == null) {
bean = new Bean();
pageContext.setAttribute("bean", bean, PageContext.REQUEST_SCOPE);
}
// Use bean ...
Si cela a fonctionné auparavant et que cela n'a pas fonctionné "tout à coup", cela signifie que quelque chose qui est responsable de l'insertion du bean dans le périmètre a cessé de fonctionner. Par exemple, un servlet qui fait ce qui suit dans le doGet ()
:
request.setAttribute("bean", new Bean());
request.getRequestDispatcher("page.jsp").forward(request, response);
Peut-être avez-vous appelé la page JSP directement par URL au lieu d'appeler le servlet par URL. Si vous souhaitez désactiver l'accès direct aux pages JSP, insérez-les dans / WEB-INF
et transférez-les à la place.
Autres conseils
Vous devez ajouter
<jsp:useBean id="givingFormBean" type="some.packg.GivingForm" scope="request" />
Parce que par défaut, le bean est consulté sur le page étendue