Reputation:
I'm starting with "jstl" but i'm already kind of struck on some basic stuff like <c:set>, so i'd like to understand if i'm missing some basic concept or else.
I've read the spec
Thus i made the following .jsp
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html><body>
<%
Map<String,Integer> mymap = new HashMap<String,Integer>();
mymap.put("name",new Integer(1));
out.println(mymap.get("name"));
%>
<c:set value="new Integer(3)" target="mymap" property="name"/>
<%
out.println(mymap.get("name"));
%>
</body></html>
i expect this output
1
3
instead i get an Exception
HTTP Status 500 – Internal Server Error
Type Exception Report
Message An exception occurred processing [/page1.jsp] at line [12]
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.apache.jasper.JasperException: An exception occurred processing [/page1.jsp] at line [12]
9: %>
10:
11: <c:set value="new Integer(3)" target="mymap" property="name"/>
12:
13: <%
14: out.println(mymap.get("name"));
15: %>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:593)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Invalid property in <set>: "name"
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:667)
org.apache.jsp.page1_jsp._jspService(page1_jsp.java:161)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause
javax.servlet.jsp.JspTagException: Invalid property in <set>: "name"
org.apache.taglibs.standard.tag.common.core.SetSupport.exportToBeanProperty(SetSupport.java:244)
org.apache.taglibs.standard.tag.common.core.SetSupport.doEndTag(SetSupport.java:96)
org.apache.jsp.page1_jsp._jspx_meth_c_005fset_005f0(page1_jsp.java:186)
org.apache.jsp.page1_jsp._jspService(page1_jsp.java:139)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note The full stack trace of the root cause is available in the server logs.
Apache Tomcat/9.0.7
what am i doing wrong? the map exists, i target it's reference variable, and it has a key/value pair with key "name"... why it says Invalid property in <set>: "name"?
Upvotes: 1
Views: 4806
Reputation: 100
There few points to observe.
First, as shown at this another question, scriplet (the java code between <% ... %>
) don't share context with expression language (EL, the code that should be between ${ .. }
in the arguments of the JSTL tags), so you'll need to keep the variable shared in request, page or another coerent context.
Also, the interpolation is made with strings literals then, to work efficiently with numbers, I'd suggest to use formatNumber tag.
Have in mind that mixing those approaches is a bad practice and the solution below is a bare closest to minimal changes to make the code "works". To keep learning I'd teel you to port the Java logic into business layers within the servlet with you want to keep this architecture.
<%@ page import="java.util.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
<%
Map<String, Integer> mymap = new HashMap<String, Integer>();
mymap.put("name", new Integer(1));
out.println(mymap.get("name"));
pageContext.setAttribute("mymap", mymap);
%>
<c:set value="3" target="${mymap}" property="name" />
<%
out.println(mymap.get("name"));
%>
</body>
</html>
Upvotes: 1