いざとなったらスマートにJSPのスクリプトレットを使う
SAStrutsは、いざとなったらJSPのスクリプトレットでゴリゴリやれてしまうのが、1つのメリットだと思う。
ただ、JSPのスクリプトレットは、ソースコードのメンテナンス性を悪化させやすいので、極力避けたいところ。
とはいえ、taglibやFunctionで対応するのが困難なケースに遭遇するとそうも言ってられない。いざJSPのスクリプトレットを記述する場合は、少しでもスマートな方法で記述したいので、そのやり方を検討してみました。
具体的には、SAStrutsのチュートリアルにある EmployeeActionのempItemsプロパティ(List
<% 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とは全然違った印象を受けます。