должно работать. Ваша проблема лежит где-то еще. Либо вы не запускаете код, которым вы себя считаете, либо изменили исходный код «слишком сильно» для публикации этого вопроса, и он стал правильным по совпадению.
[Редактировать] Как ответ на ваш комментарий здесь: это, безусловно, работает. Я даже создал для вас SSCCE quick-n-dirty (quick-n-dirty как в: использование скриптлетов, в то время как вы не должны делать это в реальном коде -java, принадлежащем классу java):
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%
// NOTE: this code belongs (in)directly in a Servlet class.
Map<String, Object> map = new HashMap<String, Object>();
map.put("foo.bar", "fubar");
map.put("beh.moo", 1234567);
request.setAttribute("map", map);
%>
<html>
<head><title>test</title></head>
<body>
<p>Access map values by key: ${map['foo.bar']} ${map['beh.moo']}</p>
<p>Iterate over map values:
<c:forEach items="${map}" var="entry">
<br>${entry.key} = ${entry.value}
</c:forEach>
</p>
</body>
</html>
Работает без нареканий.