jstl - el - прочитать элемент с карты

Обновление: теперь код находится в github вместе с инструкциями по воспроизведению ошибки (в README.md > Инструкции по воспроизведению jstl — el — чтение элемента с карты). См. мой другой вопрос для формата мои jsp-файлы. я до сих пор не понял этого

Это работает :

<%
    HttpSession ses = (HttpSession)  request.getSession(false);
    if(ses != null) {
        HashMap<String, String> m = (HashMap<String, String>) ses.getAttribute("messages");
        if(m != null) { %>
            <%=m.get(request.getParameter("r")) %>
    <%}
    }
%>

Это не:

<c:set var="key" value="${param.r}"/>
<c:out value="${key}" /> <!-- does print what I expect -->
<%-- ${sessionScope.messages} prints nothing --%>
sess scope : ${sessionScope} <%-- prints sess scope : {}  --%>
<c:out value="${sessionScope.messages[key]}" /> <!-- nothing !? -->

Зачем ?

jstl-1.2.1 — пробовал также с 1.2

соответствующий jsp ( error_begin.jsp — дополнен error_end .jsp, содержащий только закрывающий }) :

<%@ page language="java" pageEncoding="UTF-8"%><!-- noway to include this ONCE -->
<%@page import="java.util.HashMap"%>
<% if(request.getAttribute("ErrorString") != null){ %>
Υπήρξε λάθος : ${requestScope.ErrorString}
<%} else { %>
<c:if test="${param.r != null}">
    <div class="success" align="center">
        <%
        HttpSession ses = (HttpSession)  request.getSession(false);
        if(ses != null){
            HashMap<String, String> m = (HashMap<String, String>) ses.getAttribute("messages");
            if(m != null){ %>
        <%=m.get(request.getParameter("r")) %>
        <%}
        }
     %><c:set var="key" value="${param.r}"></c:set>
<%--        <c:out value="${key}" /> --%>
<%--        ${sessionScope.messages[key]} --%>
<%--        ${sessionScope.messages} prints nothing --%>
        sess scope : ${sessionScope} <%-- prints {} --%>
<%--        <c:out value="${sessionScope.messages[key]}" /> --%>
<%--        <c:out value=" ${messages[param.r]}" /> --%>
    </div>
</c:if>
<c:forEach items="${messages}" var="entry">
    Key = ${entry.key}, value = ${entry.value}<br>
</c:forEach>

Соответствующая часть Web.xml:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

WEB-INF/lib:

javax.servlet.jsp.jstl-1.2.1.jar
javax.servlet.jsp.jstl-api-1.2.1.jar
joda-time-2.1-javadoc.jar
joda-time-2.1.jar
logback-classic-1.0.7.jar
logback-core-1.0.7.jar
mail.jar
mysql-connector-java-5.1.22-bin.jar
slf4j-api-1.7.2-javadoc.jar
slf4j-api-1.7.2-sources.jar
slf4j-api-1.7.2.jar

person Mr_and_Mrs_D    schedule 13.10.2012    source источник
comment
Вы пытались использовать ${messages[param.r]} ?   -  person rickz    schedule 13.10.2012
comment
@rickz: Да, именно поэтому я установил новый var. Может ли это быть ошибкой?   -  person Mr_and_Mrs_D    schedule 13.10.2012
comment
Хотите объяснить, почему отрицательный голос? На самом деле это очень конкретный и точный вопрос - в чем дело?   -  person Mr_and_Mrs_D    schedule 14.10.2012
comment
Что говорит ${sessionScope}? А ${sessionScope.messages}? Обратите внимание, что вам не обязательно использовать для этого <c:out>, просто EL в тексте шаблона работает так же хорошо (если бы это было не так, у вас были бы серьезные проблемы с окружающей средой).   -  person BalusC    schedule 23.10.2012
comment
@BalusC: отредактировал вопрос :)   -  person Mr_and_Mrs_D    schedule 26.10.2012
comment
Ну, видимо, в области сеанса ничего не хранится.   -  person BalusC    schedule 26.10.2012
comment
@BalusC: Но когда я получаю доступ к области сеанса из скриптлета, я получаю карту в порядке!?   -  person Mr_and_Mrs_D    schedule 26.10.2012
comment
Наблюдается ли это на той же странице по тому же запросу?   -  person BalusC    schedule 26.10.2012
comment
@BalusC: Да! Вывод Η εργασία διεγράφη ! sess scope : {} - где греки - <%=m.get(request.getParameter("r")) %>. Может ли это быть из-за того, что я опускаю } (добавлено в error_end.jsp)   -  person Mr_and_Mrs_D    schedule 26.10.2012
comment
Это странно. Томкэт 7, говоришь? Как выглядит корневая декларация веб-приложения web.xml? Соответствует ли он Servlet 3.0? И у вас нет контейнерных библиотек в /WEB-INF/lib?   -  person BalusC    schedule 26.10.2012
comment
@BalusC: снова отредактировал вопрос - я начинаю видеть :)   -  person Mr_and_Mrs_D    schedule 26.10.2012
comment
@BalusC: изменение xmlns:web="http://java.sun.com/xml/ns/javaee/web-appxmlns:web="http://java.sun.com/xml/ns/javaee/web-appxmlns:web="http://java.sun.com/xml/ns/javaee"0.xsd"5.xsd" на xmlns:web="http://java.sun.com/xml/ns/javaee/web-appxmlns:web="http://java.sun.com/xml/ns/javaee"0.xsd" или xmlns:web="http://java.sun.com/xml/ns/javaee" не помогло - см. также: ошибки .eclipse.org/bugs/show_bug.cgi?id=333259   -  person Mr_and_Mrs_D    schedule 26.10.2012
comment
Что, если вы включите директиву ‹%@ page session=true %› на свою jsp-страницу?   -  person Maria Ioannidou    schedule 14.04.2013
comment
@MariaIoannidou: я даже не могу войти в систему :D - весь сайт построен с ложным сеансом страницы - чтобы не создавать ненужные сеансы - постараюсь преодолеть это и опубликовать обратно, но сеанс в порядке - РЕДАКТИРОВАТЬ ты прав! Пожалуйста, опубликуйте объяснение - почему JSTL нужен сеанс jsp - в то время как скриптлеты получают сеанс в порядке ?? Не стесняйтесь добавлять столько деталей и (желательно официальных) ссылок, сколько хотите, и я обязательно приму ваш ответ :) - проверьте filters для получения подробной информации о логике сеанса.   -  person Mr_and_Mrs_D    schedule 14.04.2013


Ответы (1)


Вы должны включить директиву <%@ page session="true" %> на свою страницу JSP.

Атрибут сеанса директивы страницы в JSP по умолчанию имеет значение true, но может быть установлено значение false в глобальном расположении сайта.

Если значение атрибута сеанса равно true, то объект сеанса ссылается на текущий или новый сеанс, поскольку клиент должен находиться в сеансе HTTP для запуска страницы JSP на сервере. Если вы установите значение объекта сеанса false, вы не сможете использовать объект или элемент сеанса с областью видимости = "session" на странице JSP.

Видеть:

http://www.roseindia.net/jsp/SessionAttribute.shtml

http://www.tutorialspoint.com/jsp/page_directive.htm

Зачем устанавливать директиву JSP page session = false?

Проблема с атрибутами сеанса в JSP EL с использованием Весенний MVC

ОБНОВЛЕНИЕ:

И из спецификации JSP 2.2:

директива страницы — атрибут сеанса:

Указывает, что страница требует участия в сеансе (HTTP).

Если true, то неявная переменная языка сценария с именем session типа javax.servlet.http.HttpSession ссылается на текущий/новый сеанс для страницы.

Если false, то страница не участвует в сеансе; неявная переменная сеанса недоступна, и любая ссылка на нее в теле страницы JSP недопустима и приведет к фатальной ошибке перевода.

Значение по умолчанию верно.

person Maria Ioannidou    schedule 14.04.2013
comment
Вы редактировали, пока я комментировал :D ---› можете ли вы объяснить, почему сессия доступна в коде scriptlet ? Если я поставлю session="true" на все страницы, которые должны быть истинными, и время сеанса пользователя истекло - у меня есть фильтры на этих страницах, проверяющие, если request.getSession(false) == null - будут ли jsps создавать сеанс до запуска фильтров (так что request.getSession не будет нулевым) ? (в сторону - не читайте roseindia - заблокируйте - очень плохой код) - person Mr_and_Mrs_D; 14.04.2013
comment
Для первой части вашего комментария: как указано в спецификации, если установлено значение false, неявная переменная языка сценария с именем session недоступна. Это не означает, что вы не можете получить доступ к сеансу, используя request.getSession() в ваших скриптлетах. Итак, если атрибут сеанса неверен: ${messages} \\Returns null ${sessionScope.messages} \\Returns null ‹%=session.getAttribute(messages)%› \\Выдает исключение: невозможно найти переменную session ‹%=request. getSession().getAttribute(messages)%› \\Прекрасно работает - возвращает атрибут сеанса - person Maria Ioannidou; 14.04.2013
comment
Спасибо - проблема с session="true" заключается в том, что он создает сеанс, когда его нет - вы знаете, делается ли это до или после запуска фильтров (по сути, это мой второй вопрос)? - person Mr_and_Mrs_D; 14.04.2013
comment
Что касается второй части, я не знаю порядка выполнения директив-фильтров, но думаю, что использование метода request.getSession() все равно создаст сессию, если ее еще нет. - person Maria Ioannidou; 14.04.2013
comment
А что касается ссылки на roseindia, я не использую ее обычно, но она дает довольно простой для понимания пример для случая атрибута сеанса, даже с плохим кодом;) - person Maria Ioannidou; 14.04.2013
comment
да, конечно, но я использую request.getSession(false), поэтому сеанс не будет создан. Я провожу несколько тестов, чтобы понять, запускаются ли фильтры первыми - я думаю, это нормально - если бы вы могли предоставить некоторую информацию о логике сеанса, созданного jsp, вы действительно сделаете это для хорошего ответа - person Mr_and_Mrs_D; 14.04.2013
comment
Фильтры запускаются первыми - перед проклятым созданием сеанса jsp - слава богу - не стесняйтесь добавлять информацию об этом (и взглянуть на мой другой вопрос) - person Mr_and_Mrs_D; 15.04.2013
comment
Интересно, спасибо, что поделились. Я на самом деле никогда не пробовал такое сочетание. Я также смотрю на ваш другой вопрос. Большое спасибо за щедрость тоже. - person Maria Ioannidou; 15.04.2013
comment
И, может быть, нам следует изменить заголовок этого вопроса на что-то более подходящее для проблемы, связанной с атрибутом сеанса? - person Maria Ioannidou; 15.04.2013