EL Nested Functions
I get EL throwing exceptions when doing this in my JSP:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@page import="my.InternalConstants"%> [...] <c:set var="MYPREFIX"><%=InternalConstants.MYPREFIX%></c:set> [...] <c:forEach var="name" items="${data.names}" varStatus="status"> <c:set var="reducedName" value="${fn:substring(name, fn:length(MYPREFIX), fn:length(name))}"/> <-- here is where the exception occurs What am I doing wrong?
Thanks.
Update:
This is an exception:
view.jsp(86,94) --> JSPG0122E: Unable to parse EL function ${fn:substring(name, fn:length(MYPREFIX), fn:length(name)}). at com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateElFunction(ELValidator.java:500) at com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateELExpression(ELValidator.java:122) at com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateELExpression(ELValidator.java:149) at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttribute(ValidateVisitor.java:1752) at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttributeValues(ValidateVisitor.java:1400) at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.visitCustomTagStart(ValidateVisitor.java:294) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:366) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:234) at com.ibm.ws.jsp.translator.visitor.JspVisitor.visit(JspVisitor.java:216) at com.ibm.ws.jsp.translator.JspTranslator.processVisitors(JspTranslator.java:127) Aaahh, it Websphere ... I used this for a long time for the latter, and I do not have anyone working here, therefore, it is filmed in the dark:
Try reorganizing the nested functions into a separate <c:set> and then referring to them in the expression:
<c:set var="begin" value="${fn:length(MYPREFIX)}" /> <c:forEach var="name" items="${data.names}" varStatus="status"> <c:set var="end" valur="${fn:length(name)}" /> <c:set var="reducedName" value="${fn:substring(name, begin, end)}"/> ... </c:forEach> Please note that the source code works fine for me in Tomcat 7.0.12. Therefore, if there is room, consider upgrading Websphere to a newer version. Perhaps this has been fixed in future releases.
I used your code as follows. Works fine.
JSP file <%@page import="com.Utils"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <c:set var="MYPREFIX"><%=Utils.MYPREFIX%></c:set> <c:forEach var="name" items="${names}" varStatus="status"> <c:set var="reducedName" value="${fn:substring(name, fn:length(MYPREFIX), fn:length(name))}" /> ${reducedName} </c:forEach> Controller File @WebServlet("/HomeController") public class HomeController extends HttpServlet { private static final long serialVersionUID = 1L; public HomeController() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); List<String> list = new ArrayList<>(); list.add("Ahasdasdadas"); list.add("Ah1213232"); request.setAttribute("names", list); RequestDispatcher rd = request.getRequestDispatcher("one.jsp"); rd.forward(request, response); } } Utils package com; public class Utils { public static String MYPREFIX = "AH"; } If you used WebSphere 8, it looks like your problem is related to the question: 17744158