JSP 2.1の変更点

JSP 2.1の大きなテーマとしてはJSFとのシームレスな統合が挙げられる。この分野ではもともとサーバサイド技術としてServletがあり、インタフェース記述のための技術としてJSPが作られた。そしてこれらをより手軽に利用するためのフレームワークとしてJSFが考案された。しかしJSPとJSFは同じインタフェース層を扱うための技術ながら細部が大きく異なり、開発者を混乱させる原因になっていることが指摘されていた。

JSP 2.1ではJSFで培われた技術をフィードバックし、両者の違いをできる限り吸収するような変更が加えられている。具体的には次のような点を挙げることができる。

  • 式言語としてUnified ELが導入された
  • アノテーションによるリソースインジェクションが可能になった
  • JSFのタグとの整合が図られた
  • 生成されるHTMLソースで無駄な空白行を無くすためのtrimWhiteSpacesディレクティブが追加された

これらの変更によってJSPとJSFの相性問題が大幅に改善されたと言える。ここでは、JSP 2.1の新機能を利用したWebアプリケーションをTomcat 6.0.10で動作させてみようと思う。

アノテーションによるリソース・インジェクション

JSP 2.1仕様はServlet 2.5に基づいているため、ここでもServlet 2.5と同様にアノテーションによるリソースのインジェクションを行うことができる。

試しにJSPを使ったリスト16のようなページを作ってみよう。

リスト16 JSPを使ったサンプルプログラム(itemlist.jsp)

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
 
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP 2.1のテスト</title>
    </head>
    <body>
 
        <h1>Resource Injection</h1>
    
        <%@page import="java.sql.*,javax.sql.*,javax.naming.*"%>
        <%@page import="javax.annotation.Resource"%>
        <%@page import="java.util.*"%>

        <jsp:declaration>
            @Resource(name="sampledatabase") 
            javax.sql.DataSource datasource;
        </jsp:declaration>
 
        <jsp:scriptlet>
            List list = new ArrayList();
            Connection con = datasource.getConnection();
            Statement stat = con.createStatement();
            String sql = "select * from item";
            ResultSet resultSet = stat.executeQuery(sql);
            while(resultSet.next()) {
                Map map = new HashMap();
                map.put("id", resultSet.getInt("id"));
                map.put("name", resultSet.getString("name"));
                list.add(map);
            }
            con.close();
            request.setAttribute("list",list);
        </jsp:scriptlet>
 
        <table border=\"1\">
            <thead><tr><th>ID</th><th>Item</th></tr></thead>
            <tbody>
                <c:forEach var="item" items="${list}">
                    <tr><td>${item.id}</td><td>${item.name}</td></tr>
                </c:forEach>
            </tbody>
        </table>
 
    </body>
</html>

このサンプルでは、jsp:declarationタグの宣言の中で、@Resourceアノテーションを使ってDataSourceをインジェクションしている。そしてjsp:scriptletタグによるスクリプトレットでDataSourceからデータベース接続を取得し、データを取り出している。結果の表示はJSTLのc:forEachタグを利用して行う。

context.xmlなど、他の設定ファイルの内容はServlet 2.5のときと同じ内容でよい。したがってデプロイするファイルの構成は図24のようになる。これをTomcatにデプロイし、Webブラウザから「http://localhost/Tomcat6Sample/itemlist.jsp」にアクセスすれば、図25のように表示される。

図24 ファイルの構成

図25 サンプルプログラムの実行結果