,,, ,,,, ,,, ,,,, ,,, ,,,, ,,,, ,,,, ,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,, ,, ,,, ,, ,,,,, ,,,,, ,,,,, ,,,,, , ,,,, ,,,,, , ,, ,,,,, ,,,,, ,,,,, ,,,,, , ,, ,, ,, ,, ,,,, ,,,, ,, ,,,,,, InterBase 5 for Linux Chapter 4 第4章 Servlet環境の構築 4.1 Servlet について ダイナミックな HTML ドキュメントを生成する方法として SSI や CGI などがあります。ただ し、SSI はセキュリティの確保に不安がある、CGI は複数アクセスが発生した場合パフォーマン スの劣化が起こりやすいなどの問題があります。CGI のパフォーマンスの問題は、クライアント の要求ごとに新規のプロセスが作成され、CGI プログラムの実行が起こるために発生します。こ れらの問題を解決する手段として、ISAPI/NSAPI などを利用したダイナミックリンクなどの使 用や Apache のモジュールの使用などがあります。CGI プログラムは Perl などのスクリプト言語 を使用しないかぎり、プラットフォームに依存します。 これらの解決する選択の 1 つとして Java Servlet があります。Java Servlet は、プラットフォー ムに依存しない、サーバーサイドプログラムで、Java プラットフォームの一部である Java Servlet API を使用して作成されます。Java を使用するため、Java の持つ“Write Once, Run Anywhere” の恩恵により小規模からスーパーコンピュータを使用した大規模までのスケーラビリティを持つ、 CGI や SSI のようにダイナミックな HTML ドキュメントの生成も可能となっています。 Servlet は CGI と違い、Servlet は一度クライアントからのリクエストにより Java VM( Virtual Machine )にロードされると、Servlet が変更されないかぎり 2 度とロードされることがなくクラ イアントからのリクエストを処理します。クライアントからのリクエストがないときは待機状態 としてメモリ上におかれています。メモリ上におかれているためきわめて高速に動作し、静的な 情報( 永続的な情報)は Servlet を実行する複数回のリクエストにわたって共用できるため、複数 のユーザー間で情報を共有することができるようになっています。開発者の立場から考えた場合、 113 第4章 Servlet 環境の構築 Servlet は Web サーバーの内部については一切考える必要がなく、フォームデータ、サーバーヘッ ダー、Cookie などはすべて Servlet API が提供する基盤クラスによって処理されるようになって います。 Servlet は単にダイナミックな HTML ドキュメントを生成できるだけでなく、Servlet の連鎖 や Servlet 間通信という機能が提供されています。 Servlet の連鎖機能とは、ある Servlet の出力を他の Servlet の入力にパイプ処理する機能で、 これらを複数の Servlet に対して継続するものです。この単純ながら強力な概念により、さまざ まな Servlet を連鎖してシームレスに動作させることができるようになります。 Servlet 間通信機能とは、ある Servlet から別 Servlet への要求、Java Applet と Servlet との 通信、Servlet と Java アプリケーションとの通信など、Servlet と別の Java プログラムとの通信 機能です。通信手段としては、Java で使用できる RMI だけでなく、CORBA の使用も可能なの で非常に複雑なシステムの Web フロントエンドとしての役目を Servlet に持たせることが可能に なっています。 Servlet は非常に奥が深いテクノロジーで、なかなかイメージがつかみにくいですが、これから Web を利用してシステムの構築を考慮した場合には拡張性と将来性のあるものです。 この章では、Linux 上で Servlet を動作させる環境の構築方法について説明していきます。 4.2 Linux JDK について 1999 年 12 月に Sun Microsystems 社より、Linux 版の JDK 1.2.2 の RC1 が発表されました。 Linux 版の JDK というと blackdown によりポーティングされてきました。JDK 1.2 より Linux も正式プラットフォームの 1 つとして、Sun Microsystems よりリリースされます。本書の執筆 段階では、JDK 1.2.2 RC2 がリリースされたばかりなので、こちらの JDK を使用していきます。 Linux 版の JDK は Sun Microsystems 社のサイトからダウンロードできます。本書が書店に 並ぶころには正式版がリリースされていることと思います。 http://www.java.sun.com/ 4.3 Servlet Engine について Servlet を構築するには Servlet API が必要となります。また、作成した Servlet を動作させる には Servlet Engine が必要です。Servlet engine には表 4-1 のようなものがあり、アドオン型 のもの、Web サーバーとの一体型のもの、組み込み型のものの 3 タイプがあります。 114 4.4 JSDK について 表 4-1 Servlet Engine の種類 製品名 (ベンダー) タイプ サポートしている Web サーバー Apache JServ The Java-Apache Project アドオン Apache ( UNIX 、Windows 95/98/NT ) JRun Live Software アドオン Apache 、IIS 、 Netscape FastTrack/Enterprise Java Web Server Sun Microsystems 一体型 ---------------------------- StarNine's WebSTAR 組み込み型 ---------------------------- Apache JServ 以外は有料の製品となっており、Servlet Engine によってサポートしている Servlet API のバージョンと JDK のバージョンが異なります。本書では、Apache といちばん親 和性の高い Apache JServ を使用します。 4.4 JSDK について Java は API( Application Programming Interface )という形式でさまざまな機能が提供され ています。オブジェクト指向に基づいて設計されている Java の API もオブジェクト指向に基づ いて設計されています。 Servlet API は 1996 年 8 月に Jeeves Alpha 1.0 とともに登場しました。初めは、現在の Java Web Server の前進である Jeeves の一部の機能として用意されており、明確に Servlet API として バージョンが定義されたのは 1998 年 6 月にリリースされた JSDK 2.0 ( Java Servlet Development Kit 2.0 )からとなります。1998 年 10 月に JSDK 2.1 の使用が公開され、すでに JSDK 2.1 がリリー スされています。 Servlet API には 2 つのパッケージがあります。 ● javax.servlet パッケージ javax.servletServlet インターフェイスが Servlet のライフサイクルを定義しているほか、 Servlet への入出力など一般的なネットワークサービスを定義している。 ● javax.servlet.http パッケージ ネットワークサービスの中で特に HTTP( HyperText Tranfer Protocol )に依存した通信を 定義している。HTTP ヘッダーの取り扱い、HTTP Cookie やセッション管理のためのクラ スが用意されている。 Linux 用の JSDK はありませんが、Solaris 版のものを流用することで Linux 上でも Servlet API を使用できます。 115 第4章 Servlet 環境の構築 JSDK は以下のサイトからダウンロードできます。 ● Servlet Development Kit のサイト http://java.sun.com/products/servlet/index.html 4.5 Apache JServ について Apache JServ は The Java-Apache Project Team によって開発・保守されている Apache で 使用可能な 100% Pure Java の Servlet Engine です。現在の最新バージョンである Apache JServ 1.0 は JSDK 2.0 に準拠しています。また、ディストリビューションパッケージには簡単に Apache に組み込むことができる DSO タイプの mod_jserv モジュールのバイナリが納められいるものが あります。Apache JServ は Apache と同じようにソースコードが公開されており、 ( Java VM が稼働すれば)Apache の稼働するプラットフォームすべてで稼働するという大きなメリットがあ ります。 4.6 Apache JServのセットアップ それでは、本書で使用する Apache JServ の環境を構築してみたいと思います。第 3 章で Apache のソースコードからの構築を説明しましたが、Apache JServ の環境を構築するためには Apache のソースコードも必要となります。DSO 対応のモジュールにすることも、Apache と静的にリン クすることもできるようになっており、ここでは静的にリンクする方法で環境を構築します。 環境を構築するにあたり、以下のソフトウェアが必要となります。Apache と Apache JServ は本書付属の CD-ROM に納められていますが、JDK 、JSDK は Web サイトからダウンロードす る必要があります。 ● Apache JServ の環境を作成するのに必要なソフトウェア JDK jdk1_2_2rc2-linux-i386.tar.gz ( 約22MB ) JSDK jsdk20-solaris2-sparc.tar.Z ( 約300KB ) Apache apache_1_3_9_tar.gz ( 約1.4MB ) JServ Apache-JServ-1_0_tar.gz ( 約360KB ) ここでは/tmp ディレクトリに Apache と Apache JServ のソースコードを解凍し、JSDK と JDK は/usr/local 以下にそれぞれ解凍することとします。Apache JServ の configure コマンド のオプションに以下のものがあります。 116 4.6 Apache JServ のセットアップ ● Apache JServ の configure コマンドのオプション --with-apache-src --with-jdk-home --with-enable-apache-conf --prefix --with-jsdk …apache のソースが入っているパス。ここでは/tmp/apache_1.3.9 …JDK のパス。ここでは/usr/local/jdk1.2.2 …apache のコンフィグレーションを行うかどうか …JServ のインストール先 …JSDK のパス。ここでは CLASSPATH に指定してあるので必要なし Apache JServ を Apache と静的にリンクするためには Apache のソースコードが必要だと前述 しましたが、静的にリンクする場合、Apache JServ の configure コマンドの“--with-apache-src” オプションで Apache のソースの位置を指定します。また、Apache JServ は Apache のヘッダー ファイルを使用するので、一度 Apache 側の configure コマンドを実行しておき、環境に合った ヘッダーファイルを生成しておく必要があります。それでは、Apache JServ の環境を作成して いきたいと思います。 1 Apache の configure コマンドを実行し、Apache JServ の configure コマンドに必要なヘッ ダーを生成する [root@linuxpc /tmp]# cd apache_1.3.9 [root@linuxpc apache_1.3.9]# ./configure Configuring for Apache, Version 1.3.9 + Warning: Configuring Apache with default settings. + This is probably not what you really want. + Please read the README.configure and INSTALL files + first or at least run ’./configure --help’ for + a compact summary of available options. + using installation path layout: Apache (config.layout) Creating Makefile Creating Configuration.apaci in src Creating Makefile in src + configured for Linux platform + setting C compiler to gcc + setting C pre-processor to gcc -E + checking for system header files + adding selected modules + doing sanity check on compiler and options Creating Makefile in src/support Creating Makefile in src/main Creating Makefile in src/ap Creating Makefile in src/regex Creating Makefile in src/os/unix Creating Makefile in src/modules/standard 2 JDK と JSDK のクラスパスを設定する [root@linuxpc apache_1.3.9]# cd ../ApacheJServ-1.0 [root@linuxpc ApacheJServ-1.0]# export CLASSPATH=/usr/local/jdk1.2.2/jre/lib/ \ rt.jar:/usr/local/JSDK2.0/lib/jsdk.jar 117 第4章 Servlet 環境の構築 3 Apache JServ の configure コマンドの実行 [root@linuxpc ApacheJServ-1.0]# ./configure --prefix=/usr/local/jserv \ --with-apache-src=/tmp/apache_1.3.9 --with-java-home=/usr/local/jdk1.2.2 \ --enable-apacheconf loading cache ./config.cache Configuring ApacheJServ/1.0 checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets ${MAKE}... yes checking for working aclocal... found checking for working autoconf... found checking for working automake... found checking for working autoheader... found checking for working makeinfo... found checking host system type... i586-pc-linux-gnu checking for ranlib... ranlib checking for gcc... gcc ……中略…… You might consider putting frequently used options into ./configure-options For further information please read the documentation in the docs directory. Many frequently asked questions are answered in the FAQ-O-Matic: http://java.apache.org/faq/ 4 Apache JServ の make の実行 [root@linuxpc ApacheJServ-1.0]# make Making all in src make[1]: Entering directory ‘/tmp/ApacheJServ-1.0/src’ Making all in c make[2]: Entering directory ‘/tmp/ApacheJServ-1.0/src/c’ make[2]: Nothing to be done for ‘all’. make[2]: Leaving directory ‘/tmp/ApacheJServ-1.0/src/c’ Making all in java ……中略…… make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0/example’ Making all in conf make[1]: Entering directory ‘/tmp/ApacheJServ-1.0/conf’ make[1]: Nothing to be done for ‘all’. make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0/conf’ make[1]: Entering directory ‘/tmp/ApacheJServ-1.0’ make[1]: Nothing to be done for ‘all-am’. make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0’ 118 4.6 Apache JServ のセットアップ 5 Apache JServ の/usr/local/jserv へのインストール [root@linuxpc ApacheJServ-1.0]# make install Making install in src make[1]: Entering directory ‘/tmp/ApacheJServ-1.0/src’ Making install in c make[2]: Entering directory ‘/tmp/ApacheJServ-1.0/src/c’ make[3]: Entering directory ‘/tmp/ApacheJServ-1.0/src/c’ ……中略…… Making install in docs make[1]: Entering directory ‘/tmp/ApacheJServ-1.0/docs’ make[2]: Entering directory ‘/tmp/ApacheJServ-1.0/docs’ make[2]: Nothing to be done for ‘install-exec-am’. make[2]: Nothing to be done for ‘install-data-am’. make[2]: Leaving directory ‘/tmp/ApacheJServ-1.0/docs’ /bin/sh ../src/scripts/build/unix/mkinstalldirs /usr/local/jserv/docs /usr/ \ local/jserv/docs/api /usr/local/jserv/docs/images /usr/local/jserv/docs/ \ install /usr/ local/jserv/docs/protocol /usr/local/jserv/docs/future mkdir /usr/local/jserv/docs mkdir /usr/local/jserv/docs/api mkdir /usr/local/jserv/docs/images mkdir /usr/local/jserv/docs/install mkdir /usr/local/jserv/docs/protocol mkdir /usr/local/jserv/docs/future make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0/docs’ Making install in example make[1]: Entering directory ‘/tmp/ApacheJServ-1.0/example’ make[2]: Entering directory ‘/tmp/ApacheJServ-1.0/example’ make[2]: Nothing to be done for ‘install-exec-am’. make[2]: Nothing to be done for ‘install-data-am’. make[2]: Leaving directory ‘/tmp/ApacheJServ-1.0/example’ make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0/example’ Making install in conf make[1]: Entering directory ‘/tmp/ApacheJServ-1.0/conf’ make[2]: Entering directory ‘/tmp/ApacheJServ-1.0/conf’ make[2]: Nothing to be done for ‘install-exec-am’. make[2]: Nothing to be done for ‘install-data-am’. make[2]: Leaving directory ‘/tmp/ApacheJServ-1.0/conf’ make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0/conf’ make[1]: Entering directory ‘/tmp/ApacheJServ-1.0’ make[2]: Entering directory ‘/tmp/ApacheJServ-1.0’ make[2]: Nothing to be done for ‘install-exec-am’. make[2]: Nothing to be done for ‘install-data-am’. make[2]: Leaving directory ‘/tmp/ApacheJServ-1.0’ make[1]: Leaving directory ‘/tmp/ApacheJServ-1.0’ 119 第4章 Servlet 環境の構築 6 Apache の configure コマンドの実行。作成した Apache JServ のモジュールの追加を指定 [root@linuxpc ApacheJServ-1.0]# cd ../apache_1.3.9 [root@linuxpc apache_1.3.9]# ./configure --prefix=/usr/local/apache \ --activate-module=src/modules/jserv/mod_jserv Configuring for Apache, Version 1.3.9 + using installation path layout: Apache (config.layout) + activated jserv module (modules/jserv/mod_jserv) Creating Makefile ……中略…… make[2]: Leaving directory ‘/tmp/apache_1.3.9/src/support’ <=== src/support make[1]: Leaving directory ‘/tmp/apache_1.3.9’ <=== src 7 Apache の/usr/local/apache へのインストール [root@linuxpc apache_1.3.9]# make install make[1]: Entering directory ‘/tmp/apache_1.3.9’ ===> [mktree: Creating Apache installation tree] ./src/helpers/mkdir.sh /usr/local/apache/bin ……中略…… make[1]: Leaving directory ‘/tmp/apache_1.3.9’ +--------------------------------------------------------+ | You now have successfully built and installed the | | Apache 1.3 HTTP server. To verify that Apache actually | | | works correctly you now should first check the | | (initially created or preserved) configuration files | | /usr/local/apache/conf/httpd.conf | | | | | and then you should be able to immediately fire up | | Apache the first time by running: | | /usr/local/apache/bin/apachectl start | | | The Apache Group | | Thanks for using Apache. http://www.apache.org/ | | +--------------------------------------------------------+ 以上で、Apache JServ の環境が構築されましたが、この状態で Apache を起動すると以下の ようなエラーメッセージが表示されます。 [root@linuxpc apache_1.3.9]# /usr/local/apache/bin/apachectl start You must specify a secret key, or disable this feature. To disable, add "ApJServSecretKey DISABLED" to your Apache configuration file. To use, add "ApJServSecretKey {filename}" where filename is document with more or less random contents, and perhaps a few kb in length. The Apache JServ documentation explains this in more detail. /usr/local/apache/bin/apachectl start: httpd could not be started 120 4.6 Apache JServ のセットアップ これは、Apache JServ の環境設定が httpd.conf に指定されていないために起こるものです。 jserv.conf を httpd.conf と同一ディレクトリにコピーしてから、 [root@linuxpc apache_1.3.9]# cp /tmp/ApacheJServ-1.0/example/jserv.conf /usr/ \ local/apache/conf /usr/local/apache/conf/httpd.conf を開き、末尾に以下の行を追加してから実行してみてくださ い。今度は問題なく動作するはずです。 #for Apache JServ Include /usr/local/apache/conf/jserv.conf 続いて、Apache JServ に付属するサンプルを使用して Servlet が正しく動作するかを確認し ます。Apache JServ のサンプルはインストールされていないので、手動でコピーします。 [root@linuxpc apache_1.3.9]# cp -r /tmp/ApacheJServ-1.0/example /usr/loccal/ \ apache サンプルを実行する前に、Apache JServ の環境設定を行います。Apache JServ は jserv.conf という環境設定ファイルにて Apache JServ の環境の定義を行い、servlet を動作させるための定 義は ApJServProperties に設定された環境設定ファイル jserv.properties で行います。一般的に 使用する設定命令は表 4-2 のとおりです。 表 4-2 jserv.conf の設定命令 設定命令 ApJServManual 説明 Apache が Java VM を起動するかどうか。On=手動|Off=自動 デフォルトは “ off ” ApJServProperties Apache JServ を起動するための設定ファイル。ApJServMaual が Off の場合 のみ有効 ApJServLogFile ログファイルの格納場所 ApJServDefaultProtocol Apache JServ がホストと接続するためのプロトコル。デフォルトは “ ajpv11 ” ApJServDefaultPort Apache JServ が監視するポート番号。デフォルトは ajpv11 の “ 8007 ” ApJServSecretKey Apache JServ を使用するためのセキュリティキー。認証を行い、そのユーザー またはグループだけ servlet の使用を許可できる。デフォルトは “ DISABLE ” ApJServMount ApJServMount [url] [jserv-url] と指定する。JServ 用のエリアスの設定が可 能 それでは、先ほど/usr/local/apache/conf にコピーした jserv.conf を次のように修正して、環 境を整えましょう。 ApJServProperties /usr/local/apache/example/jserv.properties ApJServLogFile /usr/local/apache/example/jserv.log ApJServMount /servlets /example 121 第4章 Servlet 環境の構築 続いて、servlet を動かすための環境設定が書かれている jserv.properties を修正します。この 環境設定ファイルには JDK の場所、JSDK の場所などが書かれており、servlet を動作させるた めの環境設定が書かれています。このファイルは example ディレクトリに納められています。一 般的に使用する設定命令は表 4-3 のとおりです。 表 4-3 jserv.properties の設定命令 設定命令 説明 wrapper.bin Java VM のパス。デフォルトは/usr/bin/java wrapper.classpath Java の classpath。一 般 的 に 次 の 3 つ に は パ ス を 通 す。classes.zip 、 Apache-JServ.jar、jsdk.jar port JServ が監視するポート番号 zones servlet のエリアス。Zone <zone list>.properties servlet の環境設定ファイルのパス Apache JServ の configure を起動したときに自動的に作成しており、example の zone がすで に作成されています。example を/tmp 以下のパスで動かすのであれば何も変更することはあり ませんが、ここでは、/usr/local/apache/example に含まれているサンプルを起動するように修 正します( リスト 4-1 ) 。 リスト 4-1 jserv.properties の修正箇所 ( 旧)wrapper.classpath=/tmp/ApacheJServ-1.0/src/java/Apache-JServ.jar ↓ ( 新)wrapper.classpath=/usr/local/jserv/lib/ApacheJServ.jar ( 旧)example.properties=/tmp/ApacheJServ/example/example.properties ↓ ( 新)example.properties=/usr/local/apache/example/example.properties それではサンプルの Hello.java を使って sevlet が正しく動くかどうかを確認してみましょう。す でに、jserv.properties に example.properties の位置を設定しました。最後に example.properties の設定をコピー先に合うように修正します( リスト 4-2 ) 。 リスト 4-2 example.properties の修正箇所 ( 旧)repositories=/tmp/ApacheJServ-1.0/example ↓ ( 新)repositories=/usr/local/apache/example Apache を次のように再起動して、ブラウザから Hello.java を呼び出してみましょう。 122 第6章 Delphi を使用した Web アプリケーション ● TDataSetTableProducer コンポーネント 複数のレコードを HTML テーブルに変換し ます。 ● TDataSetPageProducer コンポーネント HTML 透過タグをカレントレコードの値で置 換します。 6.6 WebBroker によるプログラミング 6.6.1 コンテンツプロデューサにHTMLテンプレートファイルを指定する方法 WebBroker では、コンテンツプロデューサによりプログラムと HTML を分離できます。さら に、コンテンツプロデューサに設定する HTML テンプレートをファイルから読み込むことによ り、次のメリットが発生します。 ● プログラムを変更せずに HTML だけを変更できる ● HTML を専用の HTML エディタで編集できる ● プログラムを開発する担当者と HTML を作成する担当者を別々にできる コンテンツプロデューサに、HTML テンプレートファイルを指定するのは、HTMLFile プロパ ティで行います。しかし、HTMLFile プロパティには、HTML テンプレートファイルへの絶対パ スを設定するため、後でパスを変更するとき、プログラムを修正する必要があります。特に、テ スト環境と本番環境ではディレクトリが異なることが多くあります。せっかく、テスト環境でテ ストを完了したプログラムを、本番環境で稼動させる前に、パスを変更するためにプログラムを 修正するということは、あまり好ましいことではありません。 一般的に HTML テンプレートファイルは、Web サーバーアプリケーションと同じディレクト リか、そのサブディレクトリに格納されます。そこで、DBLinux 受注管理システムでは、次のよ うにして、Web サーバーアプリケーションのディレクトリが設定されるようにしています。 1 HTMLFile プロパティに、Web サーバーアプリケーションのディレクトリを表す文字列 ( <SelfDir>)を埋め込む。 pgpMenu.HTMLFile := ’<SelfDir>Y menu.htmt’; pgpStockList.HTMLFile := ’<SelfDir>Y stocklist.htmt’; 2 Web サーバーアプリケーション起動時に、その文字列( <SelfDir>)を Web サーバーアプ リケーションのディレクトリに置換( リスト 6-1 ) リスト 6-1 Web サーバーアプリケーションのディレクトリを設定 // Web モジュールの OnCreate イベントハンドラ procedure TwmMain.wmMainCreate(Sender: TObject); 274 6.6 WebBroker によるプログラミング var I: Integer; SelfPath: string; FileName: array[0..MAX_PATH- 1] of Char; begin // Web サーバーアプリケーションのパスを取得 // この方法は、ISAPI DLL の場合です。CGI の場合、ParamStr(0) で取得します。 GetModuleFileName( hInstance, FileName, SizeOf(FileName) ); SelfPath := ExtractFileDir( FileName ); // Web モジュールに配置された TPageProducer コンポーネントを探す for I:=0 to ComponentCount-1 do begin if Components[I] is TPageProducer then begin with TPageProducer(Components[I]) do begin // '<SelfDir>' を Web サーバーアプリケーションのパスに置換 HTMLFile := StringReplace( HTMLFile, ’<SelfDir>’, SelfPath, [rfIgnoreCase] ); end; end; end; end; これで、テスト環境と本番環境で Web サーバーアプリケーションのディレクトリが異なって いてもプログラムを修正する必要がありません。 6.6.2 TPageProducerコンポーネントのHTML透過タグを置換する方法 TPageProducer コンポーネントは 、Content プロパティにアクセスされると 、指定された HTML テンプレートの HTML 透過タグを任意の文字列に置換して、HTML を作成します。 たとえば、在庫一覧画面では、HTMLFile プロパティに指定された stocklist.htmt ファイル(リ スト 6-2 )を読み込んで、<#LIST>などの HTML 透過タグを在庫一覧の HTML テーブルなど に置換して、在庫一覧画面の HTML を作成しています。*9 リスト 6-2 在庫一覧画面の HTML テンプレート∗9 <HTML> <HEAD> <TITLE>DBLinux 受 注 管 理 シ ス テ ム 在 庫 一 覧 </TITLE> </HEAD> <BODY> <FORM action="/cgi-bin/dblinux/dblinuxweb.dll/stocklist"> 検 索 条 件 <BR> *9 解説の関係から、実際の stocklist.htmt ファイルとは若干異なります。 275 第6章 Delphi を使用した Web アプリケーション 商 品 コ ー ド <INPUT size="10" type="text" name="gc" maxlength="10" value="<#GC>"> 商 品 名 <INPUT size="40" type="text" name="gn" maxlength="40" value="<#GN>"><BR> ソ ー ト 順 :<INPUT type="radio" name="sr" value="gc" <#SR_GC>> 商 品 コ ー ド <INPUT type="radio" name="sr" value="gn" <#SR_GN>> 商 品 名 <BR> <INPUT type="submit" value=" 検 索 "> <INPUT type="reset" value=" 条 件 ク リ ア "> </FORM> <#RESULT> <P> <#LIST> <P> <P> <#PREV> <#NEXT> <P><A href="/dblinux/menu.html"><IMG src="/dblinux/images/menu.gif" width="150" height="40" border="0" alt=" メ ニ ュ ー へ "></A></P> </BODY> </HTML> TPageProducer コンポーネントが HTML 透過タグを見つけると、OnHTMLTag イベントが 発生します。HTML 透過タグの置換は、OnHTMLTag イベントハンドラで行います(図 6-40 ) 。 HTML 透過タグを置換するときに、HTML 作成を要求したメソッドが持つデータが必要にな る場合があります。 たとえば、在庫一覧画面では、 [ 検索]ボタンが押されたときの商品コードなどの検索条件を、 新しく作成する在庫一覧画面にも表示します。そのため、在庫一覧画面の HTML 透過タグを置 換するときに、フォームデータから取り出した検索条件が必要になります。この場合、次のよう にして、OnHTMLTag イベントハンドラにデータを受け渡します( 図 6-43 ) 。 1 Web モジュールのクラス宣言に、受け渡すデータのフィールド( 変数)を宣言。 TwmMain = class(TWebModule) private FGoodsCode: string; // 商品コードのフィールド FGoodsName: string; // 商品名のフィールド public end; 2 アクション項目イベントハンドラで、Content プロパティにアクセスする前に、フィール ドに値を設定 // ブラウザから送られたフォームデータをフィールドに設定する FGoodsCode := UpperCase( Request.QueryFields.Values[ ’gc’ ] ); FGoodsName := Request.QueryFields.Values[ ’gn’ ]; // HTML テンプレートから HTML を作成 Response.Content := PageProducer1.Content; 276 6.6 WebBroker によるプログラミング 3 HTML 透過タグが見つかると、OnHTMLTag イベントハンドラが呼び出される 4 OnHTMLTag イベントハンドラで、フィールドを参照して、HTML 透過タグを置換 procedure TwmMain.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); begin if CompareText( TagString, ’GC’ ) = 0 then begin // 条件 商品コードの値を設定 ReplaceText := FGoodsCode; end else if CompareText( TagString, ’GN’ ) = 0 then begin // 条件 商品名の値を設定 ReplaceText := FGoodsName; end; end; アクション項目 イベントハンドラ ②Contentプロパティ にアクセス ①値の設定 フィールド (変数) TPageProducer コンポーネント ③OnHTMLTag イベント ④値の取得 OnHTMLTag イベントハンドラ 図 6-43 フィールドでデータを受け渡す OnHTMLTagイベントハンドラでのタグ名の比較 TPageProducer コンポーネントが HTML 透過タグを見つけると、OnHTMLTag イベントが発生します。 そのとき、TPageProducer コンポーネントは、OnHTMLTag イベントハンドラの TagString パラメータ に、HTML 透過タグのタグ名を設定します。OnHTMLTag イベントハンドラでは、このタグ名を比較して、 タグ名ごとに処理を振り分けます。 このタグ名の比較には、注意が必要です。Object Pascal の文字列比較は、拡張 ASCII 文字セットの文字 順に比較されます。よって、大文字小文字は別物として扱われます。タグ名は厳密に比較する必要はないの で、大文字小文字を同一視したほうが扱いやすくなります。そのため、タグ名の比較には、大文字小文字を同 一視で比較する CompareText 関数を使います。 procedure TwmMain.pgpStockListHTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); begin 277 第6章 Delphi を使用した Web アプリケーション if CompareText( TagString, ’username’ ) = 0 then begin // username タグの置換処理 end else if CompareText( TagString, ’password’ ) = 0 then begin // password タグの置換処理 end; end; // username タグ // password タグ CompareText 関数は、パラメータに渡された 2 つの文字列を、大文字小文字同一視で比較して、等しけ れば「 0 」を返します。 あらかじめ URLエンコードしておくこと URL の Query 部に設定する値は、 HTML の中に URL を埋め込むことは、しばしばあります。たとえば、A エレメントや IMG エレメント です。 <A HREF="/cgi-bin/dblinux/dblinuxweb.dll/stocklist?ln=11"> 次 の 10 件 へ </A> <IMG src="/cgi-bin/dblinux/dblinuxweb.dll/goodsimage?gc=BOR0001" border="0"> このとき注意しなければならないのが、URL の QueryField 部の値です。このリストの A エレメントであ れば、 「 ln=11 」の「 = 」の後ろの「 11 」です。 本来、Web ブラウザでは、入力されたフォームデータを URL エンコードして、Web サーバーに送りま す。しかし、A エレメントや IMG エレメントなどで指定された URL の QueryField 部のデータは、URL エ ンコードされません。そのため、Web サーバーアプリケーションで URL デコードすると、間違ったデータ になります。 A エレメントや IMG エレメントなどで URL を指定する場合は、QueryField 部の値を URL エンコードし たものを設定してください。 WebBroker では、URL エンコードする HTTPEncode 関数が用意されているので、これを利用します。 HTTPEncode 関数を使って IMG タグを設定する例は、次のとおりです。 ReplaceText := ’<A HREF="/cgi-bin/dblinux/dblinuxweb.dll/stocklist?’ + ’ln=’ + HTTPEncode(’11’) + ’"> 次 の 10 件 へ </A>’; 6.6.3 セッション管理 DBLinux 受注管理システムでは、画面ごとに利用できる社員を制限しています。たとえば、入 荷予定一覧画面は、入荷担当部署の社員しか見ることができません。DBLinux 受注管理システム では、始めのログイン画面で、ユーザー名とパスワードを入力してから、アプリケーションにロ グインします。その後、画面を表示するときに、その画面を利用できる社員かチェックして、利 用できる場合のみ画面を表示します。 278 ,,, ,,,, ,,, ,,,, ,,, ,,,, ,,,, ,,,, ,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,, ,, ,,, ,, ,,,,, ,,,,, ,,,,, ,,,,, , ,,,, ,,,,, , ,, ,,,,, ,,,,, ,,,,, ,,,,, , ,, ,, ,, ,, ,,,, ,,,, ,, ,,,,,, InterBase 5 for Linux Chapter 7 第7章 Servlet によるデータアクセス 7.1 Servletの利用 第 6 章で Delphi を使用した CGI の作成方法を説明しました。Delphi を使用することで柔軟 な Web ベースのシステムを構築できますが、Delphi が Windows プラットフォーム( Windows 95/98/NT )でしか動作しないため、Linux をデータベースサーバーとしてしか利用できません。 システムをすべて Linux で構築したいのであれば、Perl 、PHP3 、Phython 、Java などを使用す るとよいでしょう。Java は Perl 、PHP3 などのスクリプト言語と違って、非常に柔軟性に富んで おり、クライアント側、サーバー側の両方を構築することができます。また、RMI や CORBA を 利用することにより、分散環境を実現することもできます。ここでは、Java を利用して Web ベー スのアプリケーションを構築してみたいと思います。構築する内容は、第 6 章で Delphi で構築し たものと同じものです。同じアプリケーションを別の言語を使用して構築するのでそれぞれの言 語の特性がより明確になるでしょう。 Java で動的な HTML ドキュメントを生成するには次の 3 通りの方法があります。 ● Servlet を利用 ● SSI( Server Side Include )を利用 ● JSP( Java Server Page )を利用 通常、Servlet を利用するのが一般的ですが、JSP は新しい技術なので、これから先使用する 人も増えてくると思います。Servlet と JSP の違いは、Servlet は Java ですべての HTML ドキュ メントを生成するのに対し、JSP では HTML の中に埋め込まれている Java のスクリプトから 283 第7章 Servlet によるデータアクセス Java のプログラムが呼び出されます。JSP はよく ASP( Active Server Page )と似ているともい われます。確かに、JSP と ASP は HTML の中の特殊なタグによってサーバーサイドのプログラ ムが呼び出されるという共通点がありますが、拡張性、可用性を考えると JSP のほうが優れてい ると筆者は思います。JSP はマルチプラットフォームですが、ASP は基本的に Windows プラッ トフォームに限定されたものだからです。 Apache などでは Java で SSI を利用するための mod_java などのモジュールがありますが、あ まり一般的ではありません。また、JSP を使用するには JDK 1.2 と JSDK 2.1 が必要になります。 1999 年 12 月現在、Linux 版の JDK 1.2 はまだ RC2 の段階です。JDK 1.2 の正式版がリリースさ れることで、Linux 上で JSP を使用する人も増えていくでしょう。 Servlet を利用するためには JSDK( Java Servlet Development Kit )と Servlet を動作させる Servlet エンジンが必要となります。JSDK には、HTTP を使用するための API が用意されてお り、これらの API は Servlet クラスや httpServlet クラスなどのクラスでカプセル化されており、 必要なクラスを使用していくことで Servlet を作成できます。これは Delphi の VCL コンポーネ ントが受け持つ役割と似ています。JSDK の詳細については JSDK に付属するドキュメントを参 照してください。クラス構造、API などの説明が書かれています。 第 4 章で Servlet の環境の構築について説明しましたが、Linux 版の JSDK はないので Solaris 版の JSDK を流用します。Sun Microsystems 社のサイトからダウンロードできます。JSDK には 2.0 、2.1 、2.2 というようにバージョンがあります。使用したいエンジンがどのバージョンの JSDK をサポートしているかを確認する必要があります。本書で使用している Apache JServ 1.0 の場合 では JSDK 2.0 を使用します。一部の Servlet エンジンや JBuilder などの開発ツールには JSDK の jar ファイルが含まれており、JSDK をダウンロードする必要はありませんが、ドキュメント が付属していない場合もあるので別にダウンロードしておくことをお勧めします。 Servlet 環境をまだ構築していない方は第 4 章に戻って、お使いの Linux 上に Servlet 環境を 構築してください。 7.2 Servlet API について Servlet の API の詳細については JSDK に付属するドキュメントを参照していただくことにし て、ここでは Servlet の API の概要と API がどのように動いているかについて説明します。 7.2.1 Servlet APIの概要 1998 年 10 月に Servlet API version 2.1 の仕様が公開されたため、Windows および Solaris の プラットフォームでは JSDK 2.1 が主流になりつつありますが、Apache JServ の正式バージョンが まだ 1.0 のため、Linux の世界では JSDK 2.0 が主流になっています。JSDK 2.1 および JSDK 2.2 に対応した JServ の開発プロジェクトである jakarta のビルドが公開されていくにつれて、Linux でも JSDK 2.1/2.2 が浸透していくでしょう。 284 7.2 Servlet API について 通常、Java の API は java.net……、java.io……と java で始まりますが、Servlet API は javax. servlet 、javax.servlet.http と extention を意味する“x”がパッケージ名に付けられており、JSDK 2.0 は次の 2 つのパッケージから構成されています。 ● javax.servlet パッケージ javax.servlet.Servlet や javax.servlet.ServletResponse などの Servlet のライフサイクルを 定義している 6 つのインターフェイス、javax.servlet.GenericServlet などの Servlet からの出 力と一般的なネットワークサービス上の通信を定義している 3 つの抽象クラス、javax.servlet. ServletException などの 2 つの例外などが定義されています。 ● javax.servlet.http パッケージ ネットワークサービスの中で特に HTTP に依存した通信を定義している、具体的なレベ ルでのクラス群。HTTP のヘッダーの処理を行う javax.servlet.http.HttpServletRequest、 HTTP の response を処理するための javax.servlet.http.HttpServletResponse などの 5 つ のインターフェイス、HTTP Cookie を使用するための javax.servlet.http.Cookie や HTTP の Post 、Get 、Put 、Delete を処理する javax.servlet.http.HttpServlet クラスなど 4 つのク ラスが定義されています。 JSDK 2.0 では HTTP にしか対応していませんが、将来的には FTP( File Transfer Protocol ) や IIOP( Inter-Internet ORB Protocol )などについてもサポートされる予定となっており、さま ざまなネットワークサービスに対応するようになります。 7.2.2 Servletのライフサイクル Servlet のライフサイクルは図 7-1 に示すようになります。ライフサイクルを定義しているの は javax.servlet.Servlet インターフェイスで定義されているメソッドです。 クラスファイル 生成 ロード 初期化 (init()) 再ロード 消滅 アンロード (destroy()) 動作 要求/応答 (service()) 図 7-1 Servlet のライフサイクル 図 7-1 のライフサイクルは次のように動作します。 1. クラスファイルが Servlet Engine( Java VM )上にロードされ、インスタンスが生成される 2. ロードされたクラスファイルの init() メソッドが起動され、初期化が行われる 285 第7章 Servlet によるデータアクセス 3. 初期化された後の動作状態でクライアントからの要求が発生すると、service() メソッドで 定義されている処理が実行され、応答がクライアントに返される。通常はこの状態で存在 し、service() メソッドが繰り返し実行される 4. 管理ツールなどで明示的にアンロードされたときやクラスファイルが更新されたことを Servlet Engine が見つけた場合、destroy() メソッドが起動され、servlet がメモリ上から 消滅する 5. クラスファイルが更新されて destroy() メソッドが起動された場合は更新後のクラスファイ ルがロードされ、インスタンスが生成される 7.2.3 Servletの開発効率 Java は言語自体で、オブジェクト指向、マルチスレッド処理、ガベージコレクション、マルチ プラットフォームなどの特長を持っています。java 言語を使って記述される Servlet に対しても これらの特長が有効です。Java 言語は既存のプログラミング言語の長所/短所を分析した結果、 簡素な仕様でしかも、C 、C++言語と同等の記述能力を持っています。GUI を作成した場合、既 存のコンパイラ言語と比較してパフォーマンスの問題が発生する場合もありますが、早い進化を 続けている Java 言語が他の言語と同等のパフォーマンスを持つ日もそれほど遠くはないでしょ う。そういった短所よりも、Java の持つマルチプラットフォームの特長により、アクセスに応じて Servlet Engine の動作するプラットフォームを変更することや、新しい JSDK や Servlet Engine を使用することで機能拡張を簡単に実現したりすることができるという点が重要です。 開発面で考えた場合、すでに数多くのビジュアル開発ツールがリリースされており、近いうち に Linux プラットフォーム上でも使用できるようになります。こういったビジュアル開発ツール を使用した場合、JDK をコマンドラインで使用するのに比べ、生産性が数十倍高くなるだけでな く、初めて Java を書く場合の敷居が低くなります。本書には、JBuilder のトライアル版が付属 しているので、Java を知らない方もトライアル版をインストールして Java の世界を味わってみ るとよいと思います。きっと、C/C++言語に挫折した人もポインタ操作のない Java ならもう一 度プログラミングの世界に戻ることができると思います。 拡張性を考えた場合、ブラウザベースの検索は Servlet 、更新系は Applet またはアプリケー ションと分けて共通のビジネスロジックが書かれたパッケージを共有できます。また、小さいプ ログラムを組み合わせ、ある程度のシステムを作り上げることもそれほど難しくはありません。 Java は RMI や CORBA を使用することでメンテナンス性と拡張性に優れた分散システムを作成 できますし、JNI を利用することで他の言語で書かれた DLL などを利用することも可能です。こ のように、Java の持つ拡張性をうまく活用することで小さいシステムを大規模なシステムへと拡 張していくことも可能になります。 286 7.3 JBuilder について 7.3 JBuilder について エディタでプログラムを書き、JDK のコマンドラインコンパイラを使用して Java のプログラ ムを作成することもできますが、開発ツールを使用したほうが生産性が高くなるだけでなく、初 心者にとっては入りやすいでしょう。この章で作成する Servlet を構築する開発ツールとしてイ ンプライズ社の JBuilder を使用します。本書に JBuilder 3 Enterprise Trial Edition が付属して います。JBuilder はビジュアルに設計した画面がすべて Java のソースに反映される、またその 反対にコードに書いたことがビジュアルな設計画面に反映されるという Two-Way 機能を持って います。生成されるコードはすべて Pure Java です。JBuilder は複数の JDK を使用できる機能 があり、JDK 1.2 が付属する JBuilder 3 に JDK 1.1.8 をインストールすることで JDK 1.1 ベース のプログラム開発を行うことができます。 図 7-2 は JBuilder の統合開発環境の画面で、設計画面をアクティブにしています。メニューの 下には JBuilder に付属しているさまざまなコンポーネント( JavaBeans )があり、これらのコン ポーネントを使用することで生産性を高めることができます。また、JBuilder には Servlet ウィ ザード、Applet ウィザード、配布ウィザードなどのさまざまなウィザード機能があり、これらの 機能を使用することで簡単に作成したいプログラムのひな形を作ることができます。 図 7-2 JBuilder の統合開発環境 287 ,,, ,,,, ,,, ,,,, ,,, ,,,, ,,,, ,,,, ,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,, ,, ,,, ,, ,,,,, ,,,,, ,,,,, ,,,,, , ,,,, ,,,,, , ,, ,,,,, ,,,,, ,,,,, ,,,,, , ,, ,, ,, ,, ,,,, ,,,, ,, ,,,,,, InterBase 5 for Linux Chapter 8 第8章 携帯電話からのアクセス 8.1 携帯電話で表示可能なHTML について NTT ドコモの i モード、IDO/セルラー/ツ−カーの EZ アクセスなど携帯電話にブラウザ機能 が装備された携帯電話が販売されています。これらのブラウザ機能を使ってみましょう。まず、そ れぞれの携帯電話がサポートする HTML ドキュメントについて説明していきます。 8.1.1 iモード対応HTML i モード対応の HTML は HTML 3.2 のサブセット版である CompactHTML を NTT ドコモが 独自に改良したものです。HTML ベースなので、タグの違いさえ理解してしまえば非常に簡単 に対応ページを作成することができます。現在、i モード対応の HTML ドキュメントには 2 つの バージョンがあります。Version 2.0 はカラー対応( 502i のみ)となっています。表 8-1 は i モー ドで使用できるタグの一覧です。ご覧のとおり、ほとんど通常の HTML と同じです。 327 第8章 携帯電話からのアクセス 表 8-1 i モードで使用できるタグ一覧 タグ 書式 内容 Version 1.0 ( 全機種で対応可能) <!-- --> コメント。画面には表示されない情報を記載 する <A> name="マーカ名" href="URL#マーカ名" accesskey="char" マーカーへリンクする リンク先の URL およびマーカーを指定する 指定されたキーをアクセスキーとして使用す る <BASE> href="URL" HTML ファイル内で扱う基準にするパスを 指定する <BLOCKQUOTE> <BLOCKQUOTE>∼ </BOLOCKQUOTE> 文章をブロック化し、インデントする <BODY> <BODY>∼</BODY> ページとして表示される内容を記載する <BR> clear="left | right | all" 改行を指定する。Clear オプションが指定さ れているときは、BR 以降の文字列の回り込 みを解除する <CENTER> <CENTER>∼</CENTER> 文字列やイメージを中央揃えにする <DIR> <DIR>∼ <LI>∼ </DIR> リストを作成する <DD> <DL> <DT>見出し <DD>内容 </DL> 定義型リストを作成する <DIV> align="left|center|right" タグで囲まれた部分を、指定した表示位置に 揃える <FORM> Action="url" Method="post|get" CGI にデータを渡すためのフォームを指定す る <HEAD> <HEAD>∼</HEAD> ページタイトルやサーバー等が利用する情報 を指定する <H> align="left|center|right" 見出し (ヘッダー) を指定する。携帯電話の機 種で指定されているものがないかぎり、Hn の n にどの数字を指定しても H4 扱いとなる <HR> align="left | center | right" size="ピクセル数" width="ピクセル数 | %" 水平線 (区切り記号) を指定する <HTM> <HTML> ... </HTML> HTML ドキュメントであることを明示する <IMG> src="ファイル名" align="top | middle | bottom | left | right" width="ピクセル数 | %" height="ピクセル数 | %" hspace="ピクセル数" vspace="ピクセル数" alt="文字列" イメージデータを表示する 328 8.1 携帯電話で表示可能な HTML について タグ 書式 内容 Version 1.0 ( 全機種で対応可能) <INPUT> type="text | password | checkbox | radio | hidden | submit | reset" name="フィールド名" value="データ" size="文字数" maxlength="最大文字数" checked accesskey="char" データを入力するテキストボックスやチェッ クボックス、ラジオボタン、送信ボタン、リ セットボタンなどを表示する <MENU> <MENU>∼ <LI>∼ </MENU> リストを作成する <OL> <OL>∼ <LI>∼ </OL> 番号付きリストを作成する <P> align="left | center | right" 段落を作成する <PLANTEXT> <PLANTEXT>∼ </PLANTEXT> プレーンテキストとして、すべてそのまま表 示する <PRE> <PRE>∼</PRE> 改行や空白を含めて、そのまま表示する <SELECT> <SELECT name="リスト名" size=リスト行数> <OPTION>∼ </SELECT> 選択リストを作成する <TEXTAREA> name="フィールド名" rows="行数" cols="桁数" 複数行の文字列を入力するためのボックス フィールドを作成する <TITLE> <TITLE>∼</TITLE> ページタイトルを指定する。Bookmark や画 面メモの一覧表に表示されるタイトルとなる <UL> <UL>∼ <LI>∼ </UL> 行頭文字のあるリストを作成する Version 2.0 ( 502i のみ対応) <BLINK> istyle <BLINK>∼<BLINK> istyle="入力モード" ( 属性値で指定) BLINK タグで挟まれた文字列を、一定間隔 で点滅させる 入力項目の文字の入力モードを指定する。 ( かな入力モード時) 1=全角かな 2=全角カナ 3=英字 4=数字 ( ポケットベル入力時) 1=全角文字 2=半角文字 3=半角文字 (小文字推奨) 4=半角文字 (数字推奨) 329 第8章 携帯電話からのアクセス タグ 書式 内容 Version 2.0 ( 502i のみ対応) <MARQUEE> direction="left | right" behavior="scroll | slide | alter nate" loop=回数 MARQUEE タグで挟まれた文字列が画面上 を流す。タグで囲まれた文字列は 64 バイト まで <META> Charset="Shift_JIS" 明示的に文字セットを指定する <SELECT> 自動的にオプション値の折り返しが可能 <OL>、<LI> type="1 | a | A" start="開始番号" 番号付きリストで OL タグに挟まれた部分全 体のラベル形式を任意に変更する。 1:算用数字 a:小文字アルファベット A:大文字アルファベット <BODY> bgcolor="16 進数による色指定|色 の名前" text="16 進数による色指定|色の 名前" link="16 進数による色指定|色の名 前" 16 進数による色指定以外に標準の 16 色につ いては色の名前による指定もできる。 色指定 の際は必ず背景色も指定する <FONT> color=" 16 進数による色指定|色の 名前" 16 進数による色指定以外に標準の 16 色につ いては色の名前による指定もできる HTML を作成する場合の考慮点は次のようになります。 ● ● 文字について ● SHIFT-JIS のみ対応 ● 半角カナの使用が可能 ● 約 200 種類の絵文字の利用が可能 ブラウザについて ● 一切の禁則処理は行わない ● 縦スクロール機能のみ ● 横スクロールはしないため、長文は自動折り返しされる( PRE タグば LAINTEXT タグ使 用時も含む) ● BR タグ、P タグの改行処理はそのまま ● 改段落処理を行うタグ( FORM 、PRE 、PLAINTEXT、BLOCKQUOTE、MENU 、OL 、 UL 、DL 、DIR 、Hn )に関して、上下の空行はなくなる ● 330 URL について ● タグリストで指定している“ URL ”については、基本的に HTML に準拠 ● 相対パスと絶対パスの指定については両方とも対応 8.1 携帯電話で表示可能な HTML について ● 1 2 3 ● URL に指定可能なプロトコル http:// mailto: tel: HTTP( Web サーバー) 電子メール 電話( A タグのみ) ブックマークのタイトルは TITLE タグの記載が反映されるので、ブックマークの可能性 のある画面に関しては記述する ● HTTP ヘッダー ● ● ● CGI 作成時に「 Content-Type」、 「 Content-Length」は必須項目 制限値 ● URL エンコード後の文字長は最大 200 バイト ● 直接入力可能な URL 長はそれぞれ最大 100 バイト ● ブックマークに登録可能な URL 長は最大 100 バイト ● 登録可能なブックマークのタイトル長は 24 バイト イメージ( Version 1.0 の仕様) ● モノクロ 2 階調の GIF ファイルのみをサポート ● GIF ファイルは GIF87/87a/89a 形式の通常画像のみ ● GIF ファイルの大きさは最大 94×72 ドットまで ● Version 2.0 ではノンインターレース GIF 、アニメーション GIF 、透過 GIF(カラー対応機 のみ)をサポート また、表示可能な HTML ファイルの大きさは端末によって異なりますが、2KB 以下を目安と します。i モード対応の HTML を作成できる HTML エディタにはデービーソフト社の「 i. ホタル 2001 」などがあります。i. ホタル 2001 を使用することで i モードに対応した HTML ファイルを確 認できます( 図 8-1 )。しかし、社内の Web サーバーに接続して確認する機能を持つ PC 上のブ ラウザはまだありません。Netscape などのブラウザでテストを行ったあとは、インターネットに 接続された Web サーバーで最終確認を行う必要があります。 簡単な i モードのページを見てみましょう。 小さい画面でより多くの情報量を出すために、カタカナはすべて半角にしています。ここでは リンクにアクセスキーを使用しており、 1 を押すと指定されたリンク先にジャンプすることが できます。 “ 驪 ”は絵文字で、図 8-2 を見てわかるように、アクセスキーの 1 を示してい ます。 331 第8章 携帯電話からのアクセス 図 8-1 i. ホタル 2001 で i モード対応ページを表示したところ リスト 8-1 i モード対応のページ <HTML> <HEAD> …カタカナはすべて半角にする <TITLE>i モードサンプルページ</TITLE> </HEAD> <BODY> <CENTER> ◆ よ う こ そ ◆ <BR></CENTER> <BLOCKQUOTE> 絵 文 字 と か 、アクセスキー と か を う ま く 使 用 し て ページ を 作 成 し て み て く だ さ い </BLOCKQUOTE> <A HREF="dummy1.htm" ACCESSKEY="1">驪 次 の リンク</BODY> </HTML> 図 8-2 携帯電話で見たイメージ 332 8.1 携帯電話で表示可能な HTML について 8.1.2 EZ アクセス EZ アクセスは、IDO 、セルラー、ツーカーが使用している携帯電話でのインターネットサービ スです。EZ アクセスは WAP( Wireless Application Protocol )という携帯電話、PDA などと無 線で通信を行う携帯小型端末上でのインターネット利用を実現するための通信プロトコルを使用 しているのが特長です。WAP は WAP Forum によって、通信プロトコルの標準化が進められて おり、モトローラ、ノキア、エリクソン、アットモーションドットコム社など WAP Forum には 主要な通信関連企業が参加しています。非常にオープンな国際規格です。 HDML を使用するためには、Web サーバーに mime の追加設定が必要となります。Apache の 場合では、mime.types ファイルに以下の 3 行を追加します。NCSA 系の Web サーバーの場合、 この 3 行を.htsccess ファイルに書いて、HDML ファイルと同一ディレクトリに置いてもかまい ません。筆者の属している ISP で試してみたところ、正常にアクセスできました。charset の指 定は日本語を使用するためには絶対に必要です。この指定がないと日本語はすべて化けてしまい ます。 addtype text/x-hdml;charset=Shift_JIS hdml addtype text/vnd.wap.wml wml addtype image/bmp bmp WAP は HDML という HTML ドキュメントに似た言語を使用しています。HDML には、小 さなディスプレイに効率よく情報を提供するために HTML にはないデッキとカードという概念 があります( 図 8-3 ) 。ディスプレイに一度に表示できる範囲がカードであり、カードの集合体が デッキとなります。表示するカードには、テキストなどを表示させるための DISPLAY カード、 選択肢を表示させるための CHOICE カード、文字列を入力させる ENTRY カード、ローカル変 数などを初期化させるための NODISPLAY カードの 4 種類があります。よく使われるタグは表 8-2 のようになります。 <HDML> デッキ <DISPLAY NAME="#1"> カード </DISPLAY> </HDML> 図 8-3 デッキとカードの概念 333 第8章 携帯電話からのアクセス 表 8-2 HDML で使用されるタグ デッキ <HDML>∼</HDML> ドキュメントが HDML で書かれていることを宣言する VERSION="<number>" HDML のバージョンを指定する。通常は 3.0。 例:<HDML VERSION="3.0"> TTL="<秒>" デッキのキャッシュ有効時間の設定。デフォルトは 30 日。 例:<HDML VERSION="3.0" TTL="600"> 10 分間で設定 する場合 TTL="秒" MARKABLE="TRUE/FALSE" デフォルトでは FALSE。TRUE に設定すると、ブックマー クを許可する PUBLIC="TRUE/FALSE" デフォルトでは FALSE。TRUE に設定すると、どこからで も参照可能、ブックマークを許可する ACCESSDOMAIN="URL" MARKABLE、PUBLIC が FALSE のときアクセスを許可 するドメインの指定ができる ACCESSPATH="PATH" MARKABLE、PUBLIC が FALSE のときアクセスを許可 するパス ( URL の) の指定ができる カード <DISPLAY>∼</DISPLAY> テキストなどの情報を表示するカードを宣言する <CHOICE>∼</CHOICE> 選択肢をリスト化して表示するカードを宣言する <ENTRY>∼</ENTRY> 文字列を入力させるためのフォームカードを宣言する <NODISPLAY>∼</NODISPLAY> ローカルの変数を初期化するカードを宣言する NAME="<name>" カードの名前を指定する TITLE="<title>" ブックマーク時のタイトル BOOKMARK="<URL>" このカードがブックマークされたときに別のページを指定し たい場合、直接 URL を指定する KEY="<variable>" 変数の指定を行う。変数名が入る METHOD="NUMBER/ALPHA" 選択肢の左側に通し番号を表示させたい場合は NUMBER 、 させない場合は ALPHA を指定する。デフォルトでは NUM BER DEFAULT="<value>" デフォルトで KEY 変数に入る値を指定する IKEY="<variable>" CHOICE カードの選択肢のインデックスナンバーを格納す る変数名を指定する IDEFULT="<value>" インデックスナンバーのデフォルトの値を、変数で指定する テキストの整形 <CENTER>∼</CENTER> 行の中央揃えができる <RIGHT>∼</RIGHT> 行の右揃えができる <TAB> 行のインデントを揃える <WRAP> 英単語を単語レベルで改行する <LINE> 改行を禁止する <BR> 行末を指定し改行させる 334 8.1 携帯電話で表示可能な HTML について ナビゲーション <ACTION> ソフトキーの作業を定義する TYPE="<name>" 使用するソフトキーの名前を指定する TASK="<" ソフトキーの行う作業を指定する。GO 、PREV 、RETURN 、 CANCEL などが指定可能 LABEL="<value>" ラベルの内容を記述する DEST="<URL|Address|TEL>" リンク先を指定する DEST="#CARDNAME" カード名を指定 DEST="#deck.html#CARDNAME" デッキ名を指定 DEST="http://www.ido.co.jp/index. hdml" URL を指定 DEST="?" カレントデッキを再度読み込み DEST="device:UP.Link のサービス" UP.Link サーバーの機能を利用するとき。 例: DEST="device:home/goto?svc=Email&SUB=sendMsg" VARS="[email protected]" REL=NEXT DEST で指定されたデッキをユーザーがアクションを起こす 前にダウンロードする VARS="<valiable>" 変数名が入る。変数を設定する RECEIVE="<valiable>" GOSUB タスクからの戻り値を格納する変数名を、セミコロ ンで区切り指定する NEXT="<URL>" 飛び先 、URL が入る。ネストされたアクティビティから TASK=RETURN したあとにアクセスする URL を指定す る CANCEL="<URL>" 飛 び 先 、URL が 入 る 。次 に 行 く ア ク ティビ ティか ら TASK=CANCEL されたときにアクセス URL を指定する CLEAR="<TRUE/FALSE>" TRUE または FALSE が入る。ネストされたアクティビティ から戻るときに、呼び出すアクティビティの変数を消去する 場合は TRUE を指定する FRIEND="<TRUE/FALSE>" TRUE または FALSE が入る。GOSUB タスクで指定された アクティビティがフレンドリーであるかどうかを指定する SENDREFERER="<TRUE/FDALSE>" UP ブラウザが、DEST や NEXT に指定されたサーバーに 対して、現在のデッキの URL を Referer ヘッダーとして送 るかどうかを指定する RETVALS="<value>" 呼び出し元に TASK=RETURN で戻るときに返す値を、セ ミコロンで区切り指定する POSTMETHOD="POST/GET" GET または POST が入る。DEST で指定した URL にアク セスする方法を指定する 335 第8章 携帯電話からのアクセス ナビゲーション POSTDATA="<valiable=value>" POST メソッドで POST するデータを指定する ACCEPT-CHARSET="<value>" UP ブラウザがデータを返すときに使うべきキャラクタセッ ト ( 文字の種類) を指定する NUMBER="<TEL number>" タスクで CALL を指定したときに、そのあとに続けて電話 番号を指定する SRC="<value>" ソフトキーラベルの位置に表示する画像の名前を指定する ICON="<value>" Up.Link や端末に搭載されている画像の名前を指定する <A>∼</A> リンクを指定する ACCESSKEY="<value>" 0∼9 の数字が入る。テンキーに対応して設定された動作を 行う NUMBER="<TEL Number>" 電話番号を指定する。TASK=CALL のときに使用する 図 8-4 UP.Simulator EZ アクセス対応の携帯のほとんどは、@Motion Inc 社( 現 Phone.com )社の UP.Browser を 利用しています。Phone.com 社の Web サイト*1 に UP.SDK という開発者キットがあり、この中 *1 http://www.phone.com/ http://www.phone.com/japan/home.html( 日本語) 336
© Copyright 2024 ExpyDoc