今回は、前回作成したServletをJSPに書き直してみよう。しかし、HTML+JSPだけでは十分な柔軟性が得られない。JavaBeansを組み合わせれば、コンテンツの変更や運用にも柔軟に対応できるシステムになる。
Javaコードがそのまま使えて豊富なAPI群を利用でき、CGIよりも高速で動作するServletは確かに利点も多く、大規模なサイトにも適用可能です。しかし、その一方でコンパイルの手間を考慮しなくてはいけません。また、Servletが出力するHTMLはServletの中に埋め込まれています。そのため、少々の変更でもコンパイルし直す必要があります。
第5、6回で取り上げたPHPやPerlを使ったCGIならコンパイルの手間も要らず、Webデザイナーの意図も反映しやすいという柔軟性がありました。JavaでもJSPを使えば同じようにスクリプティングによる記述が可能です。さらに、JSPならPHPやPerlと違い、プログラムの中にHTMLを埋め込むのではなく、HTMLの中にJavaコードを記述することができます。従って、WebデザイナーはJavaScriptを使う要領でJavaコードを埋め込むことができます。つまり、デザイナーにもある程度アプリケーション部分を含めたサイト管理が可能となるのです。
JSPの簡単なサンプルは、前回も紹介した「JSPプログラミング」に掲載されています。まずはこのサンプルの動作を確認してみましょう。前回Webアプリケーションを置いた$WEBAPP/ディレクトリにtest.jspファイルを作成し、下記の内容で保存します。
<html> <head><title>Hello World!</title></head> <body> <h1>Hello World!</h1> <p> <% String hello = "Hello World!"; out.println(hello); %> </p> </body> </html>
ファイルを作成したらWebブラウザで動作を確認します。
http://Webサーバ/atmarkit/test.jsp
「Hello World!」と表示されれば成功です。JSPの動作の仕組みについては「JSPプログラミング」を参照していただくとして、<%〜%>タグの中にJavaコードを記述するということを覚えておいてください。
では、前回のServletの例で使用したServletExample1.java(リスト6)をJSPでExample1.jsp(リスト9)に書き直してみましょう。
1、2行目で指令タグ(<%@ 〜 %>)を使用し、Servletでのimport文を実現しています。その際、java.io.*、javax.servlet.*、javax.servlet.http.*の呼び出しはJSPを使用するうえでは不要です。またWebページのcontentTypeをここで指定しています。
<%@ page import="java.net.*,java.sql.*" contentType="text/html; charset=EUC_JP" %>
10行目以降のスクリプトレットタグ(<% 〜 %>タグ)中には、ServletExample1.java(リスト6)のdoGet()メソッドに記述していたものをほぼそのまま記入します。違いはresponseやoutの明示的な呼び出しを行っていないという点です。
JSPでは下記のインスタンスが宣言なしに使えます。逆に変数名として使えないという制限もあります。
config | javax.servlet.ServletConfigのインスタンス |
---|---|
application | javax.servlet.ServletContextのインスタンス |
session | javax.servlet.http.HttpSessionのインスタンス |
pageContext | javax.servlet.jsp.PageContextのインスタンス |
out | javax.jsp.JspWriterのインスタンス |
response | javax.servlet.HttpServletResponseのインスタンス |
request | javax.servlet.HttpServletRequestのインスタンス |
exception | java.lang.Throwableのインスタンス |
page | そのページ自身を表す |
JSPファイルの中では、「漢字を含んだレコードの挿入成功です!」などの出力処理がスクリプトレットの外に書かれていますが、実際にはスクリプトレット内のJavaコードの制御を受けます。Example1.jsp(リスト9)の場合、try節に書かれていること(18〜29行目)
try{ //ドライバーのロード Class.forName("org.gjt.mm.mysql.Driver"); //MySQLサーバーへの接続 con = DriverManager.getConnection(url,user,pass); //Statementオブジェクトの生成 Statement stmt = con.createStatement(); //漢字を含んだSQL文 String sql_str = "INSERT INTO list (name,memo) VALUES ('5番目','JSPからのテスト')"; stmt.executeUpdate(sql_str);
が成功しなければ「漢字を含んだ...」は出力されません。同様に、「接続失敗です〜」もSQLExceptionが起きない限り出力されません。
では、実行してみましょう。
http://Webサーバ/atmarkit/Example1.jsp
にWebブラウザで接続します。「漢字を含んだレコードの挿入成功です!」と表示されれば成功です。
Copyright © ITmedia, Inc. All Rights Reserved.