1

更新:代码现在与重现错误的说明一起在github中(在README.md>重现 jstl - el - 从 map 中读取元素的说明中)。有关我的 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/库

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
4

1 回答 1

0

您应该<%@ page session="true" %>在 JSP 页面中包含指令。

JSP 中页面指令的会话属性默认为 true,但在站点的全局位置可能已设置为 false。

如果 session 属性的值为 true,那么 session 对象指的是当前或新的 session,因为客户端必须在 HTTP session 中才能在服务器上运行 JSP 页面。如果您将会话对象的值设置为 false,那么您将无法在 JSP 页面中使用范围为“会话”的会话对象或元素。

看:

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

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

为什么要设置 JSP 页面 session="false" 指令?

使用 Spring MVC 的 JSP EL 中的会话属性问题

更新:

并且来自 JSP 2.2 规范:

页面指​​令 - 会话属性:

指示页面需要参与 (HTTP) 会话。

如果为 true,则名为 session 的 javax.servlet.http.HttpSession 类型的隐式脚本语言变量将引用页面的当前/新会话。

如果为 false,则页面不参与会话;session 隐式变量不可用,在 JSP 页面正文中对其的任何引用都是非法的,将导致致命的翻译错误。

默认为真。

于 2013-04-14T16:56:33.553 回答