いざとなったらスマートにJSPのスクリプトレットを使う

SAStrutsは、いざとなったらJSPスクリプトレットでゴリゴリやれてしまうのが、1つのメリットだと思う。


ただ、JSPスクリプトレットは、ソースコードのメンテナンス性を悪化させやすいので、極力避けたいところ。


とはいえ、taglibやFunctionで対応するのが困難なケースに遭遇するとそうも言ってられない。いざJSPスクリプトレットを記述する場合は、少しでもスマートな方法で記述したいので、そのやり方を検討してみました。


具体的には、SAStrutsチュートリアルにある EmployeeActionのempItemsプロパティ(List型)に対してtaglibを使わずに Employee#name プロパティの一覧を表示する場合は以下のようなコードになります。

<%
for (Employee e : getComponent(EmployeeAction.class).empItems) {
    out.println(e.name);
}
%>


getComponentメソッドを使って、S2コンテナにある任意のコンポーネントを取り出せるようにしています。


ちなみに、このJSP内で<%@page import="tutorial.entity.*"%> のようなインポートの宣言はしていません。getComponentメソッドの宣言も同様です。


インポート宣言やgetComponentメソッドの宣言は、common.jsp にて共通処理として行われています。実際に、common.jsp に以下の内容を追加しました。


common.jsp

<%@page import="java.util.*"%>
<%@page import="tutorial.entity.*"%>
<%@page import="tutorial.action.*"%>
<%@page import="org.seasar.framework.container.SingletonS2Container"%>

<%!
public static <T> T getComponent(final Class<T> componentClass) {
    return (T) SingletonS2Container.getComponent(componentClass);
}
%>


ちなみに、common.jspは web.xml にてインクルードの設定がなされています。

    <jsp-config>
    	<jsp-property-group>
    		<url-pattern>*.jsp</url-pattern>
    		<el-ignored>false</el-ignored>
    		<page-encoding>UTF-8</page-encoding>
    		<scripting-invalid>false</scripting-invalid>
    		<include-prelude>/common/common.jsp</include-prelude>
    	</jsp-property-group>
    </jsp-config>


ちょっとした工夫をしただけなのに、
自分が昔に書いていたJSPとは全然違った印象を受けます。