Атрибут Сеанс доступа на jstl - PullRequest
16 голосов
/ 03 февраля 2011

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


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>

Боб QuestionBook содержит две приватные переменные questionPaperID и question Я запускаю приложение на 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)
            ....

Ответы [ 2 ]

35 голосов
/ 03 февраля 2011

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

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

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

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

метод в вашем бобе.

Если у вас есть это, вы можете отобразить значение этого свойства, используя этот код:

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

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

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

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

15 голосов
/ 03 февраля 2011

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

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

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

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


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

session.setAttribute("questions", questions);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...