JSPでは、ユーザが自分でJSP内のタグを定義できます。こうしたタグのことを、「カスタム・タグ」と言います。
カスタム・タグによって、これまでスクリプトレットとして書いていたプログラムを、JSPの要素に閉じ込めることができ、HTMLが見やすくなります。
関連する複数のカスタム・タグは、1つの「タグライブラリ」にまとめられます。タグライブラリは、タグの処理を記述するJavaのプログラム(通常はjarファイルにまとめられる)と、タグに関する情報を持つTag Library Descriptor (TLD)というXMLファイルによって構成されています。
ここからは自分でJSPを書いてみましょう。今回は簡単なサンプルを紹介します。
JSFでは、タグライブラリを利用してJSPページを作成します。基本的には、タグライブラリ中のカスタムタグがUIコンポーネントに対応することになります。
それでは、JSPの記述方法について見てみましょう。
<%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <head> <link href="style.css" type="text/css" rel="stylesheet" /> <title>JSF: 簡単なJSPのテスト</title> </head> <body> <h1>JSF: 簡単なJSPのテスト</h1> <f:view> <h:form id="searchForm"> <p>何か入力してね !</p> <h:inputText id="word" /> </h:form> </f:view> </body> </html>
このJSPをWebブラウザで表示すると、図5.1[JSPの画面表示]のようになります。
まず、タグライブラリの利用を宣言します。
次の部分は、JSFの"HTML tag"の利用を宣言しています。このタグライブラリは、HTMLの出力に関係するタグを集めたものです。それぞれのタグは"h:"という接頭辞からはじまり、それぞれがUIコンポーネントとして動作します。
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
次に、JSFの"Core tag"の宣言です。Core tagは、HTML出力とは関係しないタグを集めたものです。それぞれのタグは"f:"という接頭辞からはじまります。
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
このJSPには登場していませんが、MyFacesを利用している場合は、MyFaces独自のタグを利用することもできます。MyFaces独自のタグは、"Tomahawk"というライブラリにまとめられています。Tomahawk中のそれぞれのタグは"t:"という接頭辞からはじまります。
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t" %>
JSPにはf:viewというタグが出てきます。
JSFのタグは、すべてf:viewタグの中に記述します。f:viewタグは、言わばJSFのタグの「コンテナ」としての働きをするのです。"f:"という接頭辞ではじまることから、このタグはCore Tagに属していることがわかります。
<f:view> <h:form> …… </h:form> </f:view>
f:view要素の中に、h:form要素が出てきます。これは、HTMLのフォームを表すUIコンポーネントです。HTMLのformタグに対応します。"h:"という接頭辞ではじまることから、このタグはHTML Tagに属していることがわかります。
<f:view> <h:form> …… </h:form> </f:view>
h:inputタグは、テキスト入力用のUIコンポーネントです。HTMLの<input type="text">に対応します。
<h:form> <h:inputText id="word" /> </h:form>
UIコンポーネントには、id属性を付けることができます。idはf:view要素の中でそれぞれ違っている必要があります。また、idは省略することもできます。その場合はJSFにより自動的にidが付けられます。
<h:form id="searchForm"> <p>何か入力してね !</p> <h:inputText id="word" /> </h:form>
このJSPをWebブラウザ上に表示させると、次のようなHTMLが生成されることがわかります。
<form id="searchForm" method="post" action="/jsf-test01/jsp/test.jsp; jsessionid=0DF696E1084D276D5841AF0EE3DA9D66" enctype="application/x-www-form-urlencoded"> <p>何か入力してね !</p> <input id="searchForm:word" type="text" name="searchForm:word" /> <input type="hidden" name="searchForm" value="searchForm" /> </form>
ここでは、J2SE 5とTomcat 5.5.xの環境下でJSFを動かします。
まず、MyFacesのページ (http://myfaces.apache.org/)より、次のファイルをダウンロードします。
myfaces-1.1.1.zipは、MyFacesの実行環境とドキュメントが含まれているパッケージです。myfaces-1.1.1-examples.zipは、MyFacesのサンプルプログラムです。
次の手順で、必要なjarファイルを抽出します。
前項で抽出したjarファイルのうち、myfaces*.jarという名前「ではない」ファイルを、作成したいWebアプリケーションのWEB-INF/libディレクトリにコピーします。
続いて、myfaces-1.1.1.zipを展開し、展開先のディレクトリにあるmyfaces-all.jarをWEB-INF/libにコピーします。
次に、faces-config.xmlというファイルを作成します。このfaces-config.xmlに、JSFで作るWebアプリケーションのさまざまな情報を記述します。
<?xml version="1.0"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> </faces-config>
このファイルでは、faces-config要素がルート要素になります。今回はまだ空のままです。
次に、web.xmlです。
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>JSF: 最初のサンプル</display-name> <description> JSF: 最初のサンプル </description> (中略) <!-- Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <!-- Welcome files --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
servlet要素では、Controllerで使うServletとしてjavax.faces.webapp.FacesServletを指定します。また、load-on-startup要素は、この(JSFを使った) Webアプリケーションの起動時に、1つのServletが動作することを示します。
JSFでは、Webブラウザからの要求は、すべてFacesServletが処理をします。JSPの表示も例外ではありません。
<url-pattern>*.jsf</url-pattern>
JSPを表示するときは、この".jsf"という拡張子をもった名前でアクセスする必要があります。
最終的なファイル構成は次のようになります。ここでは、Webアプリケーションの名前をjsf-test01としています。
jsf-test01 --- test.jsp |- WEB-INF/ ---- web.xml |-- faces-config.xml |-- lib/ |- commons-beanutils.jar |- commons-codec.jar |- commons-collections.jar |- commons-digester.jar |- commons-el.jar |- commons-fileupload.jar |- commons-lang.jar |- commons-logging.jar |- commons-validator.jar |- jakarta-oro.jar |- myfaces-all.jar |- portlet-api.jar |- struts.jar
ファイルの配置が終わったら、Tomcatを起動します。
このとき、次のURLにアクセスします。
(正しいURL) http://localhost:8080/jsf-test01/test.jsf
jsf-test01の直下にあるからといって、
(間違ったURL) http://localhost:8080/jsf-test01/test.jsp
にアクセスしてもエラーになります。なぜなら、JSPの表示もすべてFacesServletを経由する必要があるからです。