連載
» 2001年06月16日 00時00分 公開

快速MySQLでデータベースアプリ!(9):Servlet/JSP+MySQLでアプリケーションサーバ その2 (2/3)

[鶴長鎮一,MySQLユーザ会]

ServletによるDBプログラミング

最もシンプルなServlet例

 まずは最もシンプルなServletの例を見てみましょう。

 リスト5は、Webブラウザに「HTML」と表示するシンプルなServletです。Javaアプリケーションの例では、何も継承せずにそれぞれのクラスを定義していましたが、Servletを実現するにはHttpServletを継承させます(4行目)。

public class Sample extends HttpServlet

 それに伴い、インポートすべきものも増えています(1〜3行目)。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

 doGet()メソッドをオーバーライドし(6〜17行目)、

public void doGet (HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException
{
    PrintWriter out;
    response.setContentType("text/html");
    out = response.getWriter();
    out.println("<HTML>");
    out.println("<BODY bgcolor=\"#FFFFFF\">");
    out.println("<H1>HTML</H1>");
    out.println("</BODY></HTML>");
    out.close();
}

目的の処理(この場合はHTMLテキストの表示)を行います。HTMLテキストを表示するだけであればservice()メソッドのオーバーライドだけでも十分なので、HttpServletを継承せずにGenericServletのサブクラスを生成してもいいでしょう。ですが、HTMLフォームからデータを受け取りたい場合やCookieを利用したい場合を考え、これ以降は上記を例題のひな形にしています。

 ソースが準備できたところでコンパイルです。前半では実行の際にclasspathを指定する必要がありましたが、今回はコンパイル時に$TOMCAT_HOME/lib/servlet.jarをclasspathに追加する必要があります。

$ $JAVA_HOME/bin/javac -classpath $TOMCAT_HOME/lib/servlet.jar Sample.java

 できたSample.classを$WEBAPP/classesにコピーします。

$ mv Sample.class $WEBAPP/WEB-INF/classes

注:$WEBAPPは各自の環境で置き換えてください。


 では実行してみましょう。Webブラウザを立ち上げ、

http://Webサーバ/$WEBAPP_NAME/servlet/Sample

注:Webサーバは、Apacheが動作しているサーバのホスト名あるいはIPアドレスを指定してください。


を指定します。「HTTML」と表示されれば成功です。

Servletからのレコード挿入

 では次に、ServletからMySQLサーバにアクセスしてみましょう。第8回のJavaアプリケーションの例で使用したSample3リスト3)とSample4リスト4)をServletに作り直してみます。

 リスト6では、リスト3がmain()メソッドで行っていた処理をdoGet()に置き換え、HTMLテキストとして表示するために20行目で出力形式を指定し、21行目で出力先を取得しています。

response.setContentType("text/html; charset=EUC_JP");
out = response.getWriter();

 出力先を取得した後は、system.out.println()をout.println()に置き換えます(22行目と36行目)。

out.println("<HTML><HEAD><TITLE>servletからの接続1</TITLE></HEAD><BODY>");
out.println("漢字を含んだレコードの挿入成功です!");

 Javaで漢字などのマルチバイト文字を扱う際には注意が必要で、JDBCでコネクションを開く際のオプション指定もその1つでした。Webブラウザ上に日本語を表示させるには出力形式を指定する際にcharsetも指定してください(20行目)。

 ではコンパイルと実行です。

$ $JAVA_HOME/bin/javac -classpath $TOMCAT_HOME/lib/servlet.jar ServletExample1.java
$ mv ServletExample1.class $WEBAPP/WEB-INF/classes/

 実行してみましょう。Webブラウザで前回と同じようにアドレスを入力します。

http://Webサーバ/atmarkit/servlet//ServletExample1"

 「漢字を含んだレコードの挿入成功です!」と表示されれば成功です。

FORMによるデータ挿入

 せっかくのWebアプリケーションなのに、ユーザーからの入力に応じられないのは寂しいでしょう。ServletExample1リスト6)をHTML FORMの入力に応じられるように少し手を加えてみましょう。まずはHTML FORMの用意です。

<html>
  <head>
    <title>Form1</title>
  </head>
<body>
  <form action='servlet/ServletExample2' method=post>
  name:<input name='name' type=text><br>
  memo:<input name='memo' type=text><br>
  <input type=submit value='登録'>
  </form>
</body>
</html>
リスト form1.html

 上記のファイルを$WEBAPP/form1.htmlとして保存します。いたって普通のHTML FORMです。<form>タグのactionで、CGIプログラムを指定する代わりにServletを指定しています。相対パスを使用している点に注意しましょう。

 次はServletです。リスト6をHTML FORM対応にしたものがServletExample2.javaリスト7)です。

 リスト6からリスト7への修正で大きく変わったのは、ServletExample1リスト6)でdoGet()メソッドをオーバーライドした処理を記述していた部分がdoPost()に置き換わっているところです。これは、先のHTML FORMの<form>タグ中でmethodにpostを指定したためです。form1.htmlを、

<form action='/servlet/ServletExample2' method=get>

と書き換えればdoGet()メソッドを使うことができますが、HTML FORMからの入力項目が多くなった場合を考え、method=postを使うことにします。

注:methodにgetを指定した場合、渡せるデータの長さが制限されます。Webサーバによって大きさは異なりますが、Apacheの場合は8000bytesになります。


 doPost()以外では、新たに24、25行目を追加しました。

String name = new String(request.getParameter("name").getBytes("8859_1"),
"JISAutoDetect");
String memo = new String(request.getParameter("memo").getBytes("8859_1"),
"JISAutoDetect");

 この2行でHTML FORMの値を取得しています。HTML FORMの値を取得するだけなのにずいぶんややこしいことをしていますが、日本語を正しく扱うにはこのように指定してください。

 また、HTML FORMの値をSQL文に当てはめるため、39行目のようにSQL文を変更しています。

String sql_str = "INSERT INTO list (name,memo) VALUES ('"+name+"','"+memo+"')";

 ではコンパイルと実行です。

$ $JAVA_HOME/bin/javac -classpath $TOMCAT_HOME/lib/servlet.jar ServletExample2.java
$ mv ServletExample2.class $WEBAPP/WEB-INF/classes/

 実行はいつものとおり、Webブラウザで、

http://Webサーバ/atmarkit/form1.html

にアクセスします。登録内容を入力後[登録]ボタンをクリックします。「フォームからのレコードの挿入成功です!」と表示されれば成功です。実際に挿入されているかはmysqlコマンドで確認しましょう。

FORMの条件による動的なデータ抽出

 先ほどは、HTML FORMの値をMySQLサーバに挿入しました。今回はHTML FORMで示された条件に沿ったデータをMySQLサーバから抽出できるようにしてみましょう。

 条件を指定するため、HTML FORMを次のように変更します。

<html>
  <head>
    <title>Form2</title>
  </head>
<body>
  <form action='servlet/ServletExample3' method=post>
  nameに<input name='name' type=text>を含むもの<br>
  memoに<input name='memo' type=text>を含むもの<br>
  <input type=submit value='検索開始'>
  </form>
</body>
リスト form2.html

 <form>タグでServletExample3リスト8)を指定し、method=postとしています(form1.htmlと同様、Servletの指定は相対パスです)。

 ではServletの方を見てみましょう。

 form2.htmlでmetod=postを指定しているので、ここでもdoPost()メソッドを使用しています(8行目)。

public void doPost (HttpServletRequest request,HttpServletResponse response)

 また、SQL文のwhere節を、

where カラム名1 like "%値%" and カラム名2 like "%値%"

となるように加工します(27〜30行目、36行目)。

if( !name.equals("") )
    where_query = where_query + " and name like '%"+name+"%'";
if( !memo.equals("") )
    where_query = where_query + " and memo like '%"+memo+"%'";
    where_query = " WHERE"
+where_query.substring(4,where_query.length());

 where節が用意できたところでSQL文を作成します(49行目)。

String sql_str = "SELECT * FROM list" + where_query;

 では、コンパイルと実行です。

$ $JAVA_HOME/bin/javac -classpath $TOMCAT_HOME/lib/servlet.jar ServletExample3.java
$ mv ServletExample3.class $WEBAPP/WEB-INF/classes/

 実行はWebブラウザで、

http://Webサーバ/atmarkit/form2.html

とします。条件を入力して[検索開始]ボタンをクリックします。条件に合ったものが表示されれば成功です。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。