JSPのELでいけてないところ

今更って感じですが、JSPのELでメソッドの呼び出しができないのが惜しい。
OGNLと同じスペックがあればねー。

${bean.contains(id)}

JSP2.0からのFunctionの機能を使えば、一応「tldに定義したstaticメソッド」は、
利用することができます。ただ、この方法でビューヘルパーを作成すると大量にfunctionを定義しないといけないし、インスタンスメソッドの呼び出しにくらべてあまり直感的ではない気がします。

cubby-function.tld
    
        cubby function
        contains
        org.seasar.cubby.util.CubbyFunctions
        java.lang.Boolean contains( java.lang.Object, java.lang.Object)
    
${f:contains(bean.list, id)}

画面上のデータは、全てコントローラで集めて整形して、「JSPでは表示のみ」というのが基本だとは思いますが、ちょっとしたメソッド呼び出しができれば楽なのになーって思っちゃいます。(ビューヘルパー専用クラスも、Functionもできれば作りたくないのです)
何か良い方法あったらぜひ教えてください。

#ビューヘルパーのいい記事が、以下にありました。
http://www.nulab.co.jp/designPatterns/designPatterns3/designPatterns3-3.html

JSPディレクティブを省略する方法

意外と知られていないようなので、紹介します。JSPの先頭にはお決まりのようにJSPディレクティブを記述しますが、これが省略できたら便利だと思いませんか?

hoge.jsp(省略前)

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


...

実はできるんです。
(たぶん)ServletAPI2.4の仕様だと思いますが、web.xmlに以下の設定をして、インクルードするファイルを指定することで、JSP先頭の宣言を省略することができます。

web.xml


  ...
  
    ...
    
       *.jsp
       false
       UTF-8
       false

/header.jsp

header.jsp

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

hoge.jsp(省略後)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


...

implements ExpressionEvaluator

で、ぐぐって見ると、Tapestryが引っかかった。中でOGNLが使われていました。
Mayaaも、TapestryもHTMLファイルを対象にレンダリングをしていると思うんだけど、JSPの実行時そのもののExpressionEvaluatorを、置き換えるのってできるんだろうか?jasper2のソースも見てみようかと思います。
http://tapestry.apache.org/tapestry4/tapestry/apidocs/src-html/org/apache/tapestry/services/impl/ExpressionEvaluatorImpl.html

jasper2のソース

ExpressionEvaluatorImplを生成している場所は「org.apache.jasper.compiler.JspUtil」の中でした。
別実装への交換はどうも難しそうですねー。

package org.apache.jasper.compiler;
...
import org.apache.commons.el.ExpressionEvaluatorImpl;
...
public class JspUtil {
...
    private static ExpressionEvaluatorImpl expressionEvaluator
	= new ExpressionEvaluatorImpl();
...
}