JSFでは、タグライブラリを利用してJSPページを作成します。基本的には、タグライブラリ中のカスタムタグがUIコンポーネントに対応することになります。
それでは、JSPの記述方法について見てみましょう。
まず、単純な構造を持つ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ブラウザで表示すると、図7.1[JSPの画面表示]のようになります。
まず、タグライブラリの利用を宣言します。
次の部分は、JSFのHTML tagの利用を宣言しています。このタグライブラリは、HTMLの出力に関係するタグを集めたものです。
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
次に、Core tagの宣言です。Core tagは、HTML出力とは関係しないタグを集めたものです。
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
JSPにはf:viewというタグが出てきます。
JSFのタグは、すべてf:viewタグの中に記述します。f:viewタグは、言わばJSFのタグの「コンテナ」としての働きをするのです。
<f:view> <h:form> …… </h:form> </f:view>
f:view要素の中に、h:form要素が出てきます。これは、フォームを表すUIコンポーネントです。HTMLではformタグとなります。
<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>
前節で示したJSPをTomcat上で動かすには、%CATALINA_HOME%\webappsディレクトリの下に、次のような構成でファイルを配置します。ここでは、Webアプリケーションの名前をjsf-test01としています。
jsf-test01 --- test.jsp |- WEB-INF/ ---- web.xml |-- faces-config.xml |-- lib/ |- commons-beanutils.jar |- commons-collections.jar |- commons-digester.jar |- commons-logging.jar |- jsf-api.jar |- jsf-impl.jar |- jstl.jar |- standard.jar
まずJSFのlibフォルダ中にあるjarファイルを、WEB-INF\libにコピーします。
そして、JSTLのlibフォルダ中にあるjarファイルもコピーします。
次に、faces-config.xmlを作成します。
<?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: jsp sample </display-name> <description> JSF: jsp sample </description> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/jsp/*</url-pattern> </servlet-mapping> </web-app>
servlet要素では、Controllerで使うServletとしてjavax.faces.webapp.FacesServletを指定します。また、load-on-startup要素は、この(JSFを使った) Webアプリケーションの起動時に、1つのServletが動作することを示します。
JSFでは、Webブラウザからの要求は、すべてFacesServletが処理をします。JSPの表示も例外ではありません。
<url-pattern>/jsp/*</url-pattern>
JSPを表示するときは、この/jspを含めた名前でアクセスする必要があります。
ファイルの配置が終わったら、Tomcatを起動します。
このとき、次のURLにアクセスします。
(正しいURL) http://localhost:8080/jsf-test01/jsp/test.jsp
jsf-test01の直下にあるからといって、
(間違ったURL) http://localhost:8080/jsf-test01/test.jsp
にアクセスしてもエラーになります。なぜなら、JSPの表示もすべてFacesServletを経由する必要があるからです。