I'm trying to use the c:set tag to append a series of directories together, and I'm finding that the '/' character in EL is being forced to a binary op and won't get treated as a String. You can see what I mean by doing the following: <c:set var="foo" value="${'/' + '/'}" />. I get the following exception: javax.servlet.jsp.JspException: An error occurred while evaluating custom action attribute "value" with value "${'/' + '/'}": An exception occured trying to convert String "/" to type "java.lang.Long" at org.apache.taglibs.standard.lang.jstl.Evaluator.evaluate(Evaluator.java:140) at org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager.evaluate(ExpressionEvaluatorManager.java:109) at org.apache.taglibs.standard.tag.el.core.ExpressionUtil.evalNotNull(ExpressionUtil.java:85) at org.apache.taglibs.standard.tag.el.core.SetTag.evaluateExpressions(SetTag.java:147) at org.apache.taglibs.standard.tag.el.core.SetTag.doStartTag(SetTag.java:95) I don't see any way to escape this character in the spec, but this seems like the implementation is aggressively trying to convert back to a binaryOp. Not sure how you would resolve this.
This is not a bug; the behavior is as specified. The JSTL expression language does not support "+" as a string-concatenation operator. Instead, use something like this: attName="/${foo}/${bar}" That is, an attribute value can contain multiple expressions, so we intentionally did not provide a string-concatenation operator -- and thus avoided many of the confusions surrounding it that plague ECMAScript.