Webアプリケーションでは、ユーザからの入力があると、その入力に応じたページを「動的に」作成しなければいけません。
Javaを使ったWebアプリケーションでは、Webブラウザからのリクエストを処理して動的なページを作成するため、ServletとJSPを使います。ServletとJSPは、「Webコンテナ」と呼ばれる環境の中で動作します。
JavaServer Pages (JSP)は、HTMLのソースに、特殊なタグとJavaプログラムを埋め込んだものです。JSPは、Webコンテナの内部でServlet (Javaプログラム)に変換されます。
リスト6.1.1[loop.jsp]がJSPのサンプルです。先頭に<%@と%>というタグがあります。また、<%と%>のタグに囲まれた部分と、<%=と%>に囲まれた部分にJavaのコードが埋め込まれています。
<%@ page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %> <html> <head> <title>JSP: for 文を使ったサンプル</title> </head> <body> <% for (int i = 1; i <= 5; i++) { %> <p>サンプル<%= i %></p> <% } %> </body> </html>
<%と%>の間に、for文の一部が挟まれています。そして、for文のコードは途中で途切れ、HTMLタグが書かれています。もっとも、よく見ると<%= i %>のようにJavaプログラムの断片が埋め込まれています。その後に、<% } %>という部分があります。これは、先のfor文の始まりとなる中括弧"{"に対応した、閉じの中括弧"}"なのです。この例では、for文の条件に従って、
<p>サンプル<%= i %></p>
の部分を繰り返し出力することになります。
<%= Javaの式%>の形は、式の取る値にtoString()メソッドを適用して得られる文字列に置き換わります。ここでの<%= i %>では、for文の変数iが1から5までの値になるので、それぞれ"1", "2", "3", "4", "5"という文字列に置き換わります。
このJSPページをloop.jspという名前で保存し、TomcatなどのWebコンテナに置いておきます。WebブラウザからこのJSPページにアクセスがあると、WebコンテナはJSPページに埋め込まれたコードを処理して、HTMLを生成します。この例では、次のようなHTMLが生成されます。
<html> <head> <title>JSP: for 文を使ったサンプル</title> </head> <body> <p>サンプル1</p> <p>サンプル2</p> <p>サンプル3</p> <p>サンプル4</p> <p>サンプル5</p> </body> </html>
ブラウザでは、次のように表示されます。
出力例: サンプル1 サンプル2 サンプル3 サンプル4 サンプル5
JSPで使われる要素について説明しましょう。
JSPページ全体に関わることについて定義します。
構文: <%@ ディレクティブ名 属性とその値 %> 例: <%@ page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %> <%@ page import="java.util.Date" %> <%@ page import="java.text.DateFormat" %>
この例の1行目で、JSPページそのもののエンコーディングを指定しています。この例では、Shift_JISにしています。2行目で、生成されるページがHTMLであり、文字コードがShift_JISであることを指定しています。さらに、3行目と4行目で、java.util.Dateとjava.text.DateFormatの2つのクラスをインポートしています。
変数を宣言します。変換された後のServletでは、クラス中のフィールドとなります。
構文: <%! 宣言 %> 例: <%! int i = 0; %> <%! int a, b, c; %> <%! Circle c = new Circle(2.0); %>
最後のセミコロンを忘れないようにしましょう。
式を記述します。<%= Javaの式%>の形は、式が返す値にtoString()メソッドを適用して得られる文字列に置き換わります。セミコロンは付けません。
構文: <%= Javaの式 %> 例: いまは <br /> <%= df.format(d) %> <br />です。
プログラムを記述します。
構文: <% プログラム %> 例: <% String name = null; if (request.getParameter("name") == null) { %> <p>not found!</p> <% } else { foo.setName(request.getParameter("name")); } %>
現在の日時を表示する例です。
<%@ page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %> <%@ page import="java.util.Date" %> <%@ page import="java.text.DateFormat" %> <html> <head> <title>JSP: 現在の日時を示すサンプル</title> </head> <body> <% Date d = new Date(); DateFormat df = DateFormat.getDateTimeInstance(); %> <p> いまは <br /> <%= df.format(d) %> <br />です。 </p> </body> </html>
スクリプトレットの中でDateFormat型のdfというインスタンスを作っています。次の部分で、df.format()メソッドを実行することによって、現在の日時を表示しています。
<%= df.format(d) %>
JSPやServletを動かすには「Webコンテナ」が必要になります。
Tomcatは、Jakarta Project (http://jakarta.apache.org/)が開発しているWebコンテナです。Javaで書かれています。Jakarta Projectは、オープンソースのJavaプログラムをたくさん開発している団体です。そのため、Tomcatもオープンソースになっており、活発に開発が続けられています。
TomcatはApacheなどの既存のWebサーバに組み込んで使えるほか、Tomcat単独でもWebサーバとして使えます。
TomcatはJavaで動いているので、まずJ2SEがインストールされている必要があります。環境変数JAVA_HOMEがセットされているかどうかチェックしてください。もしセットされていなければ、J2SEがインストールされているフォルダを指定します。
次に、Tomcatをインストールします。
インストールが終わったら、CATALINA_HOMEという環境変数を設定します。この環境変数の値は、Tomcatをインストールしたフォルダの絶対パス名になります。
ServletやJSPなどは、Webコンテナの内部で動きます。そのため、Tomcatの内部にServletやJSPを置く必要があります。
JSPページをTomcat上で動かすには、次のようにします。
まず、%CATALINA_HOME%/webappsフォルダの中に新たなフォルダを作成します。このフォルダの中にServletやJSPなどで構成されるWebアプリケーションが置かれます。ここでは、testという名前のフォルダを作成します。
JSPページは、testフォルダの中に配置します。
testフォルダ以下は、.warという拡張子を持つファイルにまとめることもできます。このファイルを「warファイル」と言います。warファイルは、jarファイルと同じフォーマットのファイルです。
testフォルダにloop.jspを追加したときのファイル構成は、次のようになります。
%CATALINA_HOME% -- webapps/ -- test/ | |-- loop.jsp
さらに、testフォルダの中に、WEB-INFというフォルダを作ります。
WEB-INF/classesフォルダには、Webアプリケーションが直接利用するファイルが入ります。コンパイルしたServletのクラスファイルはこのフォルダに格納します。
WEB-INF/libフォルダには、Webアプリケーションが利用するライブラリが入ります。
WEB-INF/web.xmlファイルは、Webアプリケーションの設定を記述するDeployment Descriptor (DD)ファイルです。XMLで記述されています。Servletを使うときには、このファイルにServletの情報を記述する必要があります。JSPの場合は、情報を記述する必要はありませんが、このファイルそのものが無ければ動作しません。
<?xml version="1.0" encoding="ISO-8859-1"?> <!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>JSP_Samples</display-name> <description> JSP Samples </description> </web-app>
最終的なファイル構成は次のようになります。これで、JSPを動かす準備が整いました。
%CATALINA_HOME% -- webapps/ -- test/ | |-- WEB-INF/ --- web.xml | |- classes/ | |- lib/ |-- loop.jsp
まず、Tomcatを起動します。
Tomcatがlocalhost上の8080番ポートで動いているとします。
loop.jspには次のURLでアクセスします。
http://localhost:8080/test/loop.jsp