web-dev-qa-db-fra.com

Attribut Session d'accès sur jstl

J'essaie d'accéder à un attribut de session à partir d'une page jsp définie et envoyée par un servlet, mais j'obtiens le message d'erreur "jsp: l'attribut doit être le sous-élément d'une action standard ou personnalisée". Quel pourrait être le problème, y ai-je un accès incorrect? Voici l'extrait de code.


Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    HttpSession session = request.getSession(); 
    session.setAttribute("Questions", getQuestion());
    System.out.println(session.getAttribute("Questions"));
    RequestDispatcher req = request.getRequestDispatcher("DisplayQuestions.jsp");
    req.forward(request, response);
}

private QuestionBookDAO getQuestion(){
    QuestionBookDAO q = new QuestionBookDAO();
    q.setQuestion("First Question");
    q.setQuestionPaperID(100210);
    q.setSubTopic("Java");
    q.setTopic("Threads");
    return q;
}

Je peux définir l'attribut de session avec succès. Mais lorsque j'essaie d'accéder au même dans mon fichier jsp (ci-dessous), je reçois une erreur d'exécution

    <jsp:useBean id="Questions" type="com.cet.evaluation.QuestionBook" scope="session">
    <jsp:getProperty property="Questions" name="questionPaperID"/>
    <jsp:getProperty property="Questions" name="question"/>
    </jsp:useBean>

Le bean QuestionBook contient deux variables privées questionPaperID et question J'exécute l'application sur Tomcat et ci-dessous est l'erreur levée.

type Exception report

message 

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception 

    org.Apache.jasper.JasperException: /DisplayQuestions.jsp(15,11) jsp:attribute must be the subelement of a standard or custom action
        org.Apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.Java:40)
        org.Apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.Java:407)
        org.Apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.Java:88)
        org.Apache.jasper.compiler.Parser.parseStandardAction(Parser.Java:1160)
        org.Apache.jasper.compiler.Parser.parseElements(Parser.Java:1461)
        org.Apache.jasper.compiler.Parser.parseBody(Parser.Java:1670)
        org.Apache.jasper.compiler.Parser.parseOptionalBody(Parser.Java:1020)
            ....
16
Vijay Selvaraj

Vous devez absolument éviter d'utiliser <jsp:...> Mots clés. Ce sont des reliques du passé et doivent toujours être évitées maintenant.

Utilisez le JSTL.

Maintenant, que vous utilisiez le JSTL ou toute autre bibliothèque de balises, l'accès à un bean propriété a besoin de votre bean pour avoir cette propriété. Une propriété n'est pas une variable d'instance privée. Il s'agit d'une information accessible via un getter public (et setter, si la propriété est accessible en écriture). Pour accéder à la propriété questionPaperID, vous devez donc avoir un

public SomeType getQuestionPaperID() {
    //...
}

méthode dans votre bean.

Une fois que vous avez cela, vous pouvez afficher la valeur de cette propriété en utilisant ce code:

<c:out value="${Questions.questionPaperID}" />

ou, pour cibler spécifiquement les attributs de portée de session (en cas de conflits entre les étendues):

<c:out value="${sessionScope.Questions.questionPaperID}" />

Enfin, je vous encourage à nommer les attributs de portée comme Java variables: en commençant par une lettre minuscule.

35
JB Nizet

Vous n'avez pas besoin du jsp:useBean pour définir le modèle si vous avez déjà un contrôleur qui a préparé le modèle.

Accédez-y simplement par EL:

<p>${Questions.questionPaperID}</p>
<p>${Questions.question}</p>

ou par JSTL <c:out> tag si vous souhaitez échapper les valeurs HTML ou lorsque vous travaillez toujours sur des conteneurs Servlet 2.3 hérités ou plus anciens lorsque EL n'était pas encore pris en charge dans le texte du modèle:

<p><c:out value="${Questions.questionPaperID}" /></p>
<p><c:out value="${Questions.question}" /></p>

Voir également:


Sans rapport avec le problème, la pratique normale consiste en fait à démarrer le nom d'attribut avec des minuscules, comme vous le faites avec les noms de variables normaux.

session.setAttribute("questions", questions);

et modifiez EL en conséquence pour utiliser ${questions}.

Notez également que vous n'avez pas de balise JSTL dans votre code. C'est tout simplement JSP.

15
BalusC