JSTL (and EL)
Custom EL functions
The first official documentation available on the topic is The Java EE 5 tutorial. The JSTL specification allows to define custom functions. This is done easily with simple static methods specified in a Tag Library Definition (tld) file. For example, a file located at /WEB-INF/tags/my-functions.tld:
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>2.0</tlib-version>
<uri>/WEB-INF/tags/my-functions.tld</uri>
<function>
<name>myMethod</name>
<function-class>my.package.MyFunctions</function-class>
<function-signature>java.lang.String myMethodSignature( java.lang.String )</function-signature>
</function>
</taglib>
Can be loaded by the JSP that way (the URI can be improved);
<%@ taglib prefix="mine" uri="/WEB-INF/tags/my-functions.tld" %>>
Then the static method is called with a simple expression using the specified prefix:
${mine:myMethod('my string value')}
"fn" (functions)
There is a problem in testing the content of an HTTP request URL: the HttpServletRequest method returns a StringBuffer. The fn:contains(.., ..) function accepts only strings. Using the getRequestURL() result as an argument works fine. But this is not static-type conform. Here the Eclipse IDE Web page validation complains.
In order to code in a static-type way, the solution is to set the StringBuffer in a variable to transform it into a string. Then the function can be used properly without any validation problem:
<c:set var="requestUrl" value="${pageContext.request.requestURL}" />
<c:if test="${fn:contains(requestUrl, '...')}">
</c:if>
"fmt" (messages)
Using a message tag (fmt) with param children, I had to escape quotes unless the message would not include the parameters.