Атрибут Access Session для jstl

Я пытаюсь получить доступ к атрибуту сеанса с jsp-страницы, которая установлена ​​и отправлена ​​сервлетом, но я получаю сообщение об ошибке "jsp: attribute должен быть подэлементом стандартного или настраиваемого действия". Что может быть неправильно, я обращаюсь к нему неправильно? Ниже приведен фрагмент кода.


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;
}

Я могу установить атрибут сеанса успешно. Но когда я пытаюсь получить доступ к тому же в моем jsp файле (ниже), я получаю ошибку времени выполнения

    <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>

Вопросник bean содержит две частные переменные questionPaperID и вопрос Я запускаю приложение на Tomcat, а ниже выдается ошибка.

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)
            ....

Ответы

Ответ 1

Вам следует избегать использования тегов <jsp:...>. Они - реликвии прошлого, и их всегда следует избегать.

Используйте JSTL.

Теперь, если вы используете JSTL или любую другую библиотеку тегов, для доступа к свойству bean требуется ваше bean для этого свойства. Свойство не является частной переменной экземпляра. Это информация, доступная через публичный getter (и setter, если свойство доступно для записи). Чтобы получить доступ к свойству questionPaperID, вам необходимо иметь

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

в bean.

После этого вы можете отобразить значение этого свойства с помощью этого кода:

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

или, в частности, для целевых атрибутов сеанса (в случае конфликтов между областями):

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

Наконец, я рекомендую вам называть атрибуты областей как переменные Java: начиная с строчной буквы.

Ответ 2

Вам не нужно jsp:useBean, чтобы установить модель, если у вас уже есть контроллер, который подготовил модель.

Просто получить доступ к нему с помощью EL:

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

или тегом JSTL <c:out>, если вы хотите, чтобы HTML-escape-значения или когда вы все еще работаете с устаревшими контейнерами Servlet 2.3 или старше, когда EL еще не поддерживался в тексте шаблона:

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

См. также:


Не связанная с проблемой нормальная практика - это, кстати, начало имени атрибута с строчным строком, например, с обычными именами переменных.

session.setAttribute("questions", questions);

и измените EL, чтобы использовать ${questions}.

Также обратите внимание, что в вашем коде нет JSTL. Все это просто JSP.