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のように表示される。