JSPのELでいけてないところ
今更って感じですが、JSPのELでメソッドの呼び出しができないのが惜しい。
OGNLと同じスペックがあればねー。
${bean.contains(id)}
JSP2.0からのFunctionの機能を使えば、一応「tldに定義したstaticメソッド」は、
利用することができます。ただ、この方法でビューヘルパーを作成すると大量にfunctionを定義しないといけないし、インスタンスメソッドの呼び出しにくらべてあまり直感的ではない気がします。
cubby-function.tldcubby 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ディレクティブを記述しますが、これが省略できたら便利だと思いませんか?
<%@ 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" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...
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(); ... }