Re: problem upgrading to JSTL 1.2
On Dec 30, 6:26 pm, Lew <l...@lewscanon.com> wrote:
yishayj...@hotmail.com wrote:
The following jsp (I named it 'master.jsp') is as simple as I've
gotten it.
=====
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.apache.struts.action.ActionMessage"%>
<%@ page import="org.apache.struts.action.ActionMessages"%>
<%! public class MyActionMessages extends ActionMessages {
public java.util.Map getMessages() {
return messages;
}
}
%>
<%
MyActionMessages actionMessages = new MyActionMessages();
actionMessages.add("prop1", new ActionMessage("on=
e"));
session.setAttribute("my_action_message_item",
actionMessages.getMessages().get("prop1"));
%>
<html>
<body>
<span>this is a test: ${my_action_message_item.list}</span><br>
</body>
</html>
====
The message I get is:
org.apache.jasper.JasperException: An exception occurred processing
JSP page /views/profiler/master.jsp at line 20
...
root cause
javax.el.PropertyNotFoundException: Property 'list' not readable on
type java.util.List
javax.el.BeanELResolver$BeanProperty.read(BeanELResolver.java:259=
)
javax.el.BeanELResolver$BeanProperty.access$000(BeanELResolver.ja=
va:
209)
javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53=
)
org.apache.el.parser.AstValue.getValue(AstValue.java:97)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.ja=
va:
186)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContex=
tIm=ADpl.java:
923)
org.apache.jsp.views.profiler.master_jsp._jspService(master_jsp.j=
ava:
77)
==========
This is after the upgrade (see my opening post). Before upgrade the
list is evaluated in the normal toString fasion. I get:
====
this is a test: [one[]]
The object retrieved via 'my_action_message_item' is the one from the call=
to
actionMessages.getMessages().get("prop1")
'actionMessages.getMessages()' is a Map, 'messages'. A raw Map.
'messages.get("prop1")' returns an Object. 'Object' does not have a met=
hod
'getList()'. Boom. But that's not the error. Somehow the system f=
igured out
what the underlying Map types are. Let's follow that chain.
The retrieval from getMessages() is the protected 'messages' element of th=
e
superclass, a HashMap that maps String to an ArrayList. So the result o=
f
get("prop1") is an ArrayList<ActionMessage>.
You then call getList() on that ArrayList. But ArrayList doesn't have s=
uch a
method. Now boom.
The exception is correct behavior.
--
Lew- Hide quoted text -
- Show quoted text -
Is the result of get("prop1") an ArrayList? API docs support this
http://struts.apache.org/1.2.4/api/org/apache/struts/action/ActionMessages.h=
tml#messages
But if you run the following jsp (you're welcome to try it; it's self
contained):
-----------
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.apache.struts.action.ActionMessage"%>
<%@ page import="org.apache.struts.action.ActionMessages"%>
<%! public class MyActionMessages extends ActionMessages {
public java.util.Map getMessages() {
return messages;
}
}
%>
<%
MyActionMessages actionMessages = new MyActionMessages();
actionMessages.add("prop1", new ActionMessage("one"));
Object myObject = actionMessages.getMessages().get("prop1");
session.setAttribute("is_list", new Boolean (myObject
instanceof java.util.List));
session.setAttribute("my_action_message_item", myObject);
%>
<html>
<body>
<span>is list? ${is_list}</span><br>
<span>class name: ${my_action_message_item.class.name}</span><br>
</body>
</html>
---------
You'll get:
---------
is list? false
class name: org.apache.struts.action.ActionMessages$ActionMessageItem
---------