Being able to create new EL functions for access in JSP EL is pretty useful. With the new JSTL tags and the EL it's often more fitting to provide functionality as an EL function than as a custom tag. As an example, someone on the Stripes list asked for an easy way to determine if a field has errors (they wanted to add some style to a container around the field, not just the field itself). You can do this already using EL, but it's a bit on the noisy side:
<div class="input ${empty(actionBean.context.validationErrors['someField']) ? '' : 'error'}">
  <stripes:label for="someField"/>
  <stripes:text name="someField" id="someField"/>
</div>
Yikes! Of course if you tend to have this fragment frequently you could wrap it up in a tagfile or a layout component, but you still end up having the big ugly EL expression in there. So I started thinking, wouldn't it be nicer to be able to write:
<div class="input ${stripes:hasErrors('someField') ? '' : 'error'}">
  <stripes:label for="someField"/>
  <stripes:text name="someField" id="someField"/>
</div>
With a function like that you could use it in EL ternaries like above, in c:if/c:when tags etc. The only problem is that EL functions have to be public static functions, and don't have any built in way to access any useful state information, like the PageContext, Request, Response etc. This seems like quite an oversight to me, because it means that as an EL Function author I either have to require the PageContext or Request to be passed in, e.g.
${stripes:hasErrors(pageContext, 'someField')}
and that that just feels plain awkward, or provide myself with access in some other way. Since my functions will ship as part of Stripes, a web framework, I have the opportunity to grab the request/response and put them somewhere functions can access them later, but that won't work for everyone. This seems like a fairly obvious omission to me. I've looked at the spec, hoping beyond hope, to find a paragraphs that says something like "if a parameter is of type 'javax.servlet.jsp.PageContext', 'javax.servlet.ServletRequest' or 'javax.servlet.ServletResponse' it should not be exposed to the JSP author, but will be supplied by the container at invocation". No such luck. An even better approach (IMHO) would have been to provide an interface like:
public interface ELFunctor {
    void init() throws JspException;
    void release() throws JspException;
    void setPageContext() throws JspException;
}
Doing something like this would have allowed the use of non-static methods, on objects that could cache expensive objects, and given the objects a well defined lifecycle and access to the page and request information. Oh well.