| Java Folder | ひよこサーブレット |
upDate: 10/25/2002
サーブレットはおおよそ下記の様な構造で記述します。
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class foo extends HttpServlet{
| init() | 初期化処理 サーブレット起動時に実行されるが、必要なければ省略してもOKです。 |
| service() doGet() doPost() ...... | ロジック サーブレットで行う処理の主要部であり、クライアントの要求に応じて お仕事をして結果をリプライする入出力を記述します。メソッドには、doGet、doPost、doPut、doDelete、doOptions、doTrace などがあり、目的に応じて使い分けます。 |
| getServletInfo() | 情報 サーブレットの説明文等を記述します。要求あった場合に Stringで返します。省略してもOKです。 |
| destroy() | 消滅処理 サーブレットが破棄される直前に呼び出されます。必要無ければ省略してもOK です。 |
|
では、サーブレットを更新する場合はどうするのでしょうか。普通に考えたら稼働しているサーブレットを安全に停止・削除後、新しいサーブレット を格納・起動する手順の気がしますが・・・指定のフォルダ(例:"/WEB-INF/classes/")にクラス・ファイルを格納 すればサーバーがクラス・ファイル更新を識別して、次回リクエスト時に自動的にリロードしてくれます。 良く出来ていますね。(^^)
API動向についてはこちらに記事があります。
◎Java覚え書き:http://www.dmz.hitachi-sk.co.jp/Java/Tech/servlet/
【クラス図】
|
【構成】
| パッケージ名 | 説明 |
| dengon | 制御サーブレット群 |
| dengon.model | 処理クラス群 |
| dengon.model.data | 投稿データ入出力クラス群 |
| dengon.model.users | ユーザー管理クラス群 |
| dengon.view | プレゼン層クラス群 |
【配置】
【クラス図】
|
◎Tips
http://www.myjavaserver.com/~uzblend/example/chat/
SimpleChat.zip_new: 10/25/1999
●APIドキュメントを見る
◎リクエスト・ディスパッチを利用する例
http://bobcat.webappcabaret.net/uzy/servlet/test.dispatch.DispatchToServlet
DispatchToServlet.zip upDate: 9/24/2001
◎リダイレクトを利用する例
http://bobcat.webappcabaret.net/uzy/servlet/test.redirect.RedirectToServlet
RedirectToServlet.zip upDate: 9/24/2001
では簡単なサンプルで動作を確認してみましょう。
サンプルでは適当に文字を入力して頂き、これをクライアント情報として保持・蓄積していきます。
なお、セッションのタイムアウトはデフォルト=30分(妥当なところと思います)で設定していますので適当に時間を置いて試してみて下さい。
http://bobcat.webappcabaret.net/uzy/servlet/test.session.SessionDataRegister
SessionDataRegister.java
SessionDataInvalidate.java
New: 11/11/2001
![]() |
![]() |
![]() |
|
■DataSource APIの紹介 この項で紹介している接続プーリングのサンプルではDataSource API経由でDB接続させています。 DataSourceはJ2EEで導入されたAPIで、これに対応したサーブレット・コンテナの場合にのみ利用できます。 簡単に特徴・概要を紹介しておきましょう。
・JNDI経由でのDB接続
・APサーバー機能を利用するための単一のインターフェース
尚、DataSourceのAPI仕様はJ2EEを構成するAPI群のうち
JDBC2.0 Optional Packageを参照ください。また、このJ2EEのDB回りの事情については下記書籍に判りやすい解説があります。
|
では、これらの接続手法のパフォーマンス比較を行ってみましょう。
マルチスレッドで動作する簡単なベンチマーク用プログラムを用意しました。
LoadTest.java new: 11/2/2000
java LoadTest http://hostname/servlet/servletname で実行すると5つのスレッドが並行して指定アドレスへ5回のアクセスを行い、 応答時間の平均値を算出し、更にこのテストを4セット反復します。つまり合計100回の負荷を与えるんです。 以下は当プログラムを使用したベンチマーク結果です。なおテストは接続プーリングをサポートするサーブレット・コンテナ 「Caucho Resin」上で実施しました。
単位:ms
| リクエスト毎の接続 | 接続の使いまわし | 接続プーリング | |
| 1回目 | 1013 | 154 | 302 |
| 2回目 | 968 | 73 | 73 |
| 3回目 | 943 | 76 | 58 |
| 4回目 | 946 | 63 | 62 |
うーん、面白い結果です。
まず、「リクエスト毎の接続」は文句なしに遅いですね。意外なのは「接続の使いまわし」が「接続プーリング」
と同等のスコアを叩き出している点です。これはシングルCPUのPC上でテストした結果なので、つまるところ「接続プーリング」は
マルチCPUな並列処理環境で初めて本領を発揮するのではないかと思われます。
また、初回の応答が遅いのは「接続」が無い状態からスタートして必要な接続の確保に
時間がかかったことを意味します。「接続プーリング」の場合も、2回目以降が真の性能を示すものと解釈します。尚、これは今回のテストに使用した
サーブレット・エンジン(コンテナ)の仕様に因る部分があるので、簡単にCaucho Resinのプーリング仕様を紹介しておきます。
◎Caucho Resinのプーリング仕様
1.コンテナ起動時には「接続プーリング」は確保されていない
2.接続要求を受けた時点で初めて「接続」のプーリングが始まる
3.「接続」はプールの中に5秒(デフォルト)しかいない。それ以降は消滅する
つまり負荷の大きさに応じてプールのサイズが動的に変化するんです。これはこれでよく出来ています。
| #startDocument() | 文書の開始を検出 |
| #endDocument() | 文書の終了を検出 |
| #startElement() | 要素の開始を検出 |
| #endElemet() | 要素の終了を検出 |
| #characters() | 文字データを検出 |
では簡単なサンプルを動作させて各APIの動きを確認しましょう。
ターゲットURLのXML文書を読み込んでパースさせるサーブレットを用意しました。オリジナルのXML文書とパース結果を注意深く比較すると
処理進行の様子が見えてきます。
http://bobcat.webappcabaret.net/uzy/servlet/xml.SimpleSaxTest
SimpleSaxTest.java
SimpleSaxParser.java
upDate: 9/24/2001
【Xerces-J利用】
では次に、もう少し使えそうな(笑)アプリを作ります。
んーとその前に、WEB上に公開されている面白いXML文書は無いものか、と探していたら・・・ありました。RSS(RDF Site Summary)です。RSSは
一言でいふとWEBページの要約を記述した文書で、WEBページのデータとデータ構造をシンプルなフォーマットで定義できるのが特徴です。RSS News Feedとも
呼ばれます。もともとはNetScapeがポータル・サイト参加ページの登録・維持管理の基礎技術として提唱
したものなのですが、現在はW3C管理下となり、RDF(サーバー間でやりとりするメタデータ仕様)
準拠となっています。シンプルな仕様故に再利用しやすく、今後も利用拡大するものと予想されます。
※RSS v1.0:http://www.w3.org/RDF/#link-rss10
※RSS v0.9:http://my.netscape.com/publish/help/mnn20/quickstart.html
※読み物:http://www-6.ibm.com/jp/developerworks/web/010323/j_w-rss.html
で、前置きが長くなりましたが、このRSSを読み込んで一覧表示するサーブレットです。
http://bobcat.webappcabaret.net/uzy/servlet/xml.SimpleRSSReader
SimpleRSSReader.java
SimpleSaxParser4RSS.java
ItemObject4RSS.java
upDate: 9/24/2001
【Xerces-J利用】
◎動作についての簡単な説明
RSSの論理構造はバージョンにより差がありますが、ここで紹介するサンプルでは<item>タグ以下の要素のみに着目しているので
問題にはなりません。で、まずSimpleSaxParser4RSSクラスがRSS文書をパースし、item要素に対応するItemObject4RSSオブジェクト
群を配列に順次格納していきます。サーブレット・クラス(SimpleRSSReader.java)では、この配列を取得・展開してWEBページを
生成する、と言った流れとなっています。
![]() |
なお、サンプルではリモート・オブジェクトのネーミング・サーバー登録を確認してからデモするスタイルとなっています。
#クラス・ファイルの配置例
| JVM A (提供側) | JVM B (利用側) | |
| CurrentTimeServer.class | CurrentTimeServer.class | インターフェース |
| CurrentTimeServerImpl.class | - | オブジェクト |
| CurrentTimeServerImpl_Stub,class | CurrentTimeServer_Stub,class | スタブ |
| SimpleRMITest.class | SimpleRMIClient.class | テスト・ツール |
#クラス・ファイルの配置例
| JVM A (提供側) | JVM B (利用側) | |
| UserAgentServer.class | UserAgentServer.class | インターフェース |
| UserAgentServerImpl.class | - | オブジェクト |
| UserAgentServerImpl_Stub,class | UserAgentServer_Stub,class | スタブ |
| SimpleRMITest.class | SimpleRMIClient.class | テスト・ツール |
|
■読み物 以下のリンクにRMIの詳しい解説があります。 ※RMI入門:http://www.wakhok.ac.jp/~tatsuo/JavaWorld/12th/index.html ※Java覚え書き:http://www.dmz.hitachi-sk.co.jp/Java/Tech/rmi/rmi.html ※ガイド:http://java.sun.com/j2se/1.3/ja/docs/ja/guide/rmi/getstart.doc.html
■RMIの動作をイメージする
|
■SOAPの世界ではリモートのメソッド(或いはアプリケーション)を"サービス"と呼ぶ
■サービスに直接アクセスするのではなく仲介役のSOAPサーバーを経由して利用する
■クライアントとSOAPサーバーはXMLでシンプルに構造化された引数、返り値で通信する
■クライアントはHTTP POSTリクエストでSOAPサーバーに要求する
■HTTPヘッダーを利用して通信するためファイヤ・ウォールも通過できる
■JavaだけではなくXMLを理解する全てのプラットフォーム間で利用可能
■トランスファー・プロトコルとしてSMTPも利用可能
■RPC(Remote Procedure Call)機能だけでは無くMessaging機能もある

SOAPの仕様は以下のURLで公開されています。
この記事を書いた時点の最新版はSOAP 1.1でした。
Simple Object Access Protocol (SOAP) 1.1 日本語訳
Simple Object Access Protocol (SOAP) 1.1
なお、SOAPはPOSTリクエストに応答しますのでブラウザからGETリクエストした場合にはその旨表示されます。システム がダウンしているわけではありませんので安心(?)下さい。
| サンプルのコンパイル・実行にはApache SOAP、XML Parser、JavaMail、JavaBeansTM Activation Frameworkの各APIをCLASSPATHに追加する 必要がありますが、ひよこサブレでは他のJava動作環境へ影響を回避する為にバッチファイルを利用する方法を推奨しています。 なお、ライブラリ入手先及びバッチファイル例は後述の「Apache SOAPって何だ」を参照下さい。 |


送信メッセージを観察すると、ターゲットとするサービスID(urn:flowerservice)やメソッド名(getLanguageOfFlower) 並びにメソッドに渡す引数の型(String)と値(ガーベラ)が、また応答メッセージには返り値の型(String)と値(神秘)が 構造化されて埋め込まれているのが読み取れます。 そう、SOAPサーバーは受け取ったXMLメッセージから情報を抽出してサービスを実行し、サービスの実行結果を再度 XML表現に変換して応答しているのですね。ナルホド。
| 送信メッセージ |
|
POST /soap/servlet/rpcrouter HTTP/1.0 Host: www.hoge.com Content-Type: text/xml; charset=utf-8 Content-Length: 475 SOAPAction: ""
<?xml version='1.0' encoding='UTF-8'?> |
| 応答メッセージ |
|
HTTP/1.0 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: 498 Set-Cookie2: JSESSIONID=wtaaz4n8r1;Version=1;Discard;Path="/soap" Set-Cookie: JSESSIONID=wtaaz4n8r1;Path=/soap Servlet-Engine: Tomcat Web Server/3.2 beta 8 (JSP 1.1; Servlet 2.2; Java 1.3.0; Windows 2000 5.0 x86; java.vendor=Sun Microsystems Inc.)
<?xml version='1.0' encoding='UTF-8'?> |
■Javaで書かれたライブラリである(soap.jar)
■サーブレット・コンテナ上で動作する
■アプリケーション・サーバーをSOAPサーバーに拡張する
■SOAPによる通信のインターフェースを提供する
■プログラマはSOAPの通信内容を意識する必要が無くロジックに専念できる
■サービスの配置、削除等の管理ツールを提供する
■通信内容を監視するデバックツールを提供する
■UTF-8エンコード(Default)で日本語が通る
■Xerces,JavaMail,JavaBeans(tm)ActivationFrameworkのライブラリも別途必要
■Xercesは他パーサーとの競合を避ける為CLASSPATH先頭で読み込むところがキモ

また、以下のライブラリも別途入手します。
【必要ライブラリ・リスト】
| ライブラリ名称 | ダウンロード例 | サイズ |
| xerces.jar | Xerces-J-1.2.3.bin | 2.61MB |
| mail.jar | javamail-1_2.zip | 2.02MB |
| activation.jar | jaf1_0_1.zip | 338KB |
CLASSPATH設定
Apache SOAPはCLASSPATH設定にナーバスです。ML等を見ていても設定のトラブルの9割はCLASSPATHに
起因するものです。ここでは以下の手順を踏みます。
管理ツールの確認
http://127.0.0.1:8080/soap/で表示されるWelcomeページから「Run Admin」のリンクで管理ページにたどり
着きます。[List][Deploy][Undeploy]のメニューはそれぞれサービスのリスト取得、配置、削除を
行う管理ツールにリンクします。
サービスの配置
ではサービスを配置してみましょう。
ここでは先に紹介した「ロケール時間応答サービス」(CurrentTimeService.java)を利用します。
このサンプルはサーバーの現在時間を応答するだけの単純なサービスです。

| Property | Value |
| ID | urn:timeservice |
| Scope | Request |
| Method | getCurrentTime |
| Provider Type | Java |
| Provider Class | soap.CurrentTimeService |
| Static? | No |
【バッチファイル例】
|
クライアントの動作環境はその他への影響を避ける為バッチファイルで環境設定されることをお勧めします。
例えばこんな感じ;
@echo off |

ではTCPトンネルモニタをPORT:7070で開けて、Tomcat上のSOAPサーバー(PORT:8080)に接続してみましょう。
以下のように起動します。空のTextFieldを持つJavaアプリケーションが立ち上がります。
java org.apache.soap.util.net.TcpTunnelGui 7070 localhost 8080
次に、先のクライアント・プログラム(GetCurrentTimeApp.java)の接続先をTCPトンネルモニタのPORTに書き換えます。 ここでは、http://127.0.0.1:7070/soap/servlet/rpcrouterですね。このクライアント・プログラムを実行すると TCPトンネルモニタにSOAPのメッセージのやり取りが表示されます。
| BookDataクラスのデータ構造 |
| +String name(書籍名) +String author(著者名) +String publisher(出版社) |
| Property | Value |
| ID | urn:bookservice |
| Scope | Application |
| Method | getBookData |
| Provider Type | Java |
| Provider Class | soap.BookService |
| Static? | No |
| Number of mappings | 1 |
| Encoding Style | SOAP |
| Namespace URI | urn:object_demo |
| Local Part | bookdata |
| Java Type | soap.BookData |
| Java to XML Serializer | org.apache.soap.encoding.soapenc.BeanSerializer |
| XML to Java Deserializer | org.apache.soap.encoding.soapenc.BeanSerializer |
|
●サービス公開中! ここで紹介している「書籍検索サービス」は先のサンプルと同様に公開配置しています。貴方のPCから接続してみて下さい。接続先はコチラね; http://bobcat.webappcabaret.net/uzy/servlet/rpcrouter
なお、現在データベースに格納されている情報一覧はこちらを参照下さい。 |
なるほど、Javaオブジェクトが単純に直列化されて書き出されるのではなく、オブジェクトの構造とデータ型からXML表現に 翻訳されるかたちで直列化(シリアライズ)されてSOAPメッセージ内に格納されるのですね。更に クライアント側はこのXML構文をデシリアライズしてオブジェクトを復元するのです。うーん、よく出来ています。
勿論これらの作業は自動的に行われるので、プログラマは通信のからくりについて意識することなくロジックに専念出来ること に変わりありません。
| 送信メッセージ |
|
Content-Type: text/xml; charset=utf-8 Content-Length: 453 SOAPAction: "" <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:getBookData xmlns:ns1="urn:bookservice" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <num1 xsi:type="xsd:string">Javaの格言</num1> </ns1:getBookData> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
| 応答メッセージ |
|
HTTP/1.0 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: 647 Set-Cookie2: JSESSIONID=5r6sol6kv1;Version=1;Discard;Path="/soap" Set-Cookie: JSESSIONID=5r6sol6kv1;Path=/soap Servlet-Engine: Tomcat Web Server/3.2 beta 8 (JSP 1.1; Servlet 2.2; Java 1.3.0; Windows 2000 5.0 x86; java.vendor=Sun Microsystems Inc.) <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:getBookDataResponse xmlns:ns1="urn:bookservice" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <return xmlns:ns2="urn:object_demo" xsi:type="ns2:bookdata"> <name xsi:type="xsd:string">Javaの格言</name> <author xsi:type="xsd:string">安藤慶一(訳)</author> <publisher xsi:type="xsd:string">ピアソンエデュケーション</publisher> </return> </ns1:getBookDataResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
でも何でWSDLが必要なのでしょうか......
「将来、アブリケーションはネットワーク上に配置された複数のサービスの集合体として提供されるようになる」
と言った発想があります。「WEBサービス」と呼ばれる概念です。このような利用形態となってくると、サービスの
インタフェースをクライアントに提示するのは勿論のことインターフェースが変更された場合にでも混乱無く利用者に告知・対応できる
柔軟なしくみが重要になってきます。そう、WSDLはこの様なWEBサービスのニーズのためにあるんです。
WSDLの仕様は以下のURLで公開されています。
この記事を書いた時点の最新版はWSDL1.1でした。
Web サービス記述言語 (WSDL) 1.1
Web Services Description Language (WSDL) 1.1
で、各要素の記述内容概要を以下にまとめました。
| 要素 | 要約 | 解説 |
| <message> | データの定義 | 通信でやり取りする個々のデータ・フォーマットを定義します。 言い換えると、要求メッセージの構造並びに応答メッセージの構造を記述します。 |
| <portType> | 入出力の定義 | SOAPの入出力シーケンスを整理してmessageと関連付けします。 |
| <binding> | 起動方法の定義 | portTypeで指定した入出力論理構造と実際どのように通信するのかと 言った具体的手段とを結び付けます。 |
| <service> | 配置の定義 | 当サービスを配置した物理的な位置を定義します。 |
ページが表示されない場合は、ブラウザでRELOADするかトップページから「PLAY」のリンクをたどってClient Demo ページまで移動下さい


暫くするとSOAPサーバーから「花言葉」の応答があり、処理がクローズします。
この例の様に、サービスの利用にはWSDLさえ あればよく、静的なクライアント・プログラムは必須ではありません。 つまり、WSDLから動的にSOAPクライアントを生成することが出来るんです。素晴らしいしくみです。
■JAVAアプレットとの相違点
■JAVAアプリケーションとの相違点
■WEBアプリケーションのプレゼン層に使う意味
こちらの記事も参照ください

booktable.jnlp
BookTableServlet.java
BookTableApp.java
BookTableModel.java
BookData.java
_New: 10/27/2001
アップロードされたデータを16進数表現に変換して応答するサンプルも用意しました。
http://www.myjavaserver.com/servlet/uzblend.example.upload.SimpleUploadBinary
SimpleUploadBinary.java upDate: 09/24/2001
◎動作について簡単な説明
では実際にどのようにしてファイルが送られるのか見てみましょう。
下記はブラウザからWEBサーバーに送られる情報の例です。取り出したい情報がContent-Dispositionブロック内にあり、
boundary文字列で区切られているのが判りますね。さらに、SERVLET APIのgetInputStream()でこの要求を取得すると、
ポスト内容(boundary文字列以降の情報)が取得できますので、あとはコレからどのようにしてコンテンツを抽出するロジックを組むか?
と言う問題となります。
【IE5.0の(なま)リクエスト例】
|
POST /servlet/SimpleUpload HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */* Accept-Language: ja Content-Type: multipart/form-data; boundary=---------------------------7d01730700d2 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: 127.0.0.1 Content-Length: 123 Connection: Keep-Alive -----------------------------7d01730700d2 Content-Disposition: form-data; name="user" uz -----------------------------7d01730700d2 Content-Disposition: form-data; name="upload"; filename="C:\hoge\test.gif" Content-Type: image/gif [contents] -----------------------------7d01730700d2-- |
【上記要求をgetInputStream()を介して取得した例】
|
-----------------------------7d01730700d2 Content-Disposition: form-data; name="user" uz -----------------------------7d01730700d2 Content-Disposition: form-data; name="upload"; filename="C:\hoge\test.gif" Content-Type: image/gif [contents] -----------------------------7d01730700d2-- |
|
◎サーバー・リソースの考察
Noted!:2003.8.17 当ファイル・アップロードのサンプルはByteArrayOutputStream()を利用していますが、 このAPIはサーバーのメモリ上に全てのバイナリ・イメージを展開・保持してから次の動作に移る点に 注意が必要です。 つまりファイル・サイズが大きい場合にはサーバーのメモリ資源を食いつぶす恐れがあり、 危険なのです。なお、ディスクに書き出すことが目的の場合は、 ByteArrayOutputStream()を使用しないでバッファ単位で入出力を行うFileOutputStream() を利用することでこの問題を回避できます。 http://www.atmarkit.co.jp/fjava/rensai2/webopt13/webopt13.html
また、アップロードのサイズに制限をかけるのも有効な手段ですね。検討ください。 |
つぎに、利用するデータベースのJDBCドライバの情報(DatabaseMetaData)を取得してWEBページに出力するサーブレットを紹介します。
JDBCドライバはベンダー毎に実装が異なる上に、内容の解説がほとんどなく情報が乏しいのが現状です。簡単なツールをつくってドライバを調べてみましょう。
GetJdbcDriverInfo.java new: 9/3/2000
| ColdFusionはAllaire が開発したWebアプリケーションサーバです。なんと言っても強力なカスタム・タグは、ユーザーが拡張できるのは勿論のこと、 あらかじめ約70のタグに約200の関数が用意されているそうです。国内ではシリウスが代理店をつとめています。 |
まずは、タグ・ライブラリの利用手順を見ていきましょう。大まかに以下の4ステップを踏みます。
1) カスタムタグの宣言:(hello.jsp)
カスタムタグの名前を<prefix : name>で、また制御元となるtld(tag library descriptor)のURIを宣言します。
|
<%@ taglib prefix="uz" uri="WEB-INF/tld/hello.tld" %> Message: <uz:hello/> |
2) コントローラの定義:(hello.tld)
カスタムタグ名とロジック部であるクラス名の対応を定義します。
|
<taglib> <tag> <name>hello</name> <tagclass>HelloLogic</tagclass> </tag> </taglib> |
3) ロジックの作成:(HelloLogic.java)
カスタムタグの動作内容をクラスファイルに書きます。
|
import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class HelloLogic extends TagSupport{ .......... |
4) ファイルの配置
クラス・ファイルをWEB-INF/classes以下(例えば/WEB-INF/classes/HelloLogic.class)に、tldファイルをWEB-INF以下(例えば
WEB-INF/tld/hello.tld)に配置し、hello.jspを起動します。
では早速、シンプルなサンプルで動作を確認してみましょう。
■PoolMan経由でDB接続するだけで接続プーリングが利用可能
■DB接続設定をプロパティ・ファイル(poolman.props)で管理
■複数種類のDB接続設定を登録可能(Multi-DB対応)
■JDBC API標準、DataSource経由、PoolMan独自拡張の3つのDB接続方法を提供
■書籍「Professional JSP」で紹介されたり、ISPで導入されたりと広く認知
■GNU LESSER GENERAL PUBLIC LICENSEのライセンス形態を持つ
PoolManにJDBC2.0 Optional PackageのBinaryが含まれていることを確認します。
もし無い場合は以下のサイトからjdbc2_0-stdext.jar(6.56KB)を入手して下さい。
http://java.sun.com/products/jdbc/download.html#binary
先のパッケージを解凍するとlibフォルダに[PoolMan.jar]、[jdbc2_0-stdext.jar]並びに[poolman.props]の3つのファイルがありました。 これらをTomcatから見える位置に配置します。まず、[PoolMan.jar]と[jdbc2_0-stdext.jar]をTOMCAT_HOME/libフォルダに、 次に、[poolman.props]をTOMCAT_HOME/classesフォルダに配置します。(classesフォルダがデフォルトで無い場合は作ってくださいネ)
これは以下に示すTomcat(v3.*)のデフォルト仕様を利用しているんです。
1) TOMCAT_HOME/lib以下に配置したJARファイルは自動的にCLASSPATHに取り込まれる
2) TOMCAT_HOME/classesにはCLASSPATHが通っている

| パラメータ | 解説 | 初期値・設定例 |
| db_name.n | DB接続の呼び名 | 例:db2 |
| db_driver.n | Driverの名称 | 例:COM.ibm.db2.jdbc.app.DB2Driver |
| db_url.n | DBのURL | 例:jdbc:db2:sample |
| db_username.n | ユーザー名 | 例:uz |
| db_password.n | パスワード | 例nazonazo |
| initial.Connections | 起動時の接続数 | 初期値:1 |
| maximumsize.n | 最大接続数 | 初期値:java.lang.Integer.MAX_VALUE |
| connection_timeout.n | 接続の生存時間 | 初期値:600000(10分) |
| checkfrequency.n | 接続状態チェック間隔 | 初期値:300000(5分) |
簡単なサンプルを紹介しておきましょう。
poolman.props

なお、このPoolMan.jspは日本語に対応していませんので確実に文字化けします(苦笑)最低、日本語表示可能なJSPとしての修正が必要です。
|
<%@ page contentType="text/html; charset=iso-2022-jp" %> <html>....... |
■CIDフォントのCJKパッケージ対応(日本語対応)
■PDF出力のライブラリはいろいろあるがiTextはPureJavaな点でお手軽感あり
■PDF1.2仕様準拠
■手軽に利用できる反面、凝った表現は難しい
■GNU LIBRARY GENERAL PUBLIC LICENSEのライセンス形態を持つ
PDFの仕様については以下のサイトから入手できます。
1)WhitePaper: http://partners.adobe.com/asn/developer/acrosdk/docs.html
2)Ref.Manual: http://partners.adobe.com/asn/developer/acrosdk/DOCS/pdfspec.pdf
| ◎メモ[4/7/2001] 取敢えずは日本語表示が可能となりましたが、関連APIの整備は現在進行中と言った状況です。例えば、com.lowagie.text#Font() APIで 日本語フォントを指定出来ると何かと便利なのですが、v0.39では未対応なんです。MLを覗いてみると精力的に作業が行わ れている様なので次期バージョンでは使い勝手も大幅に改善されだろうと期待しています。 |
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter.getInstance(document,baos); ............. document.close(); //ここからServlet出力ロジック res.setContentType("application/pdf"); res.setContentLength(baos.size()); ServletOutputStream out = res.getOutputStream(); baos.writeTo(out); out.flush(); |
■CIDフォントのCJKパッケージ対応(日本語対応)
■PDF1.2仕様準拠、部分的にAcrobat4の機能をFEATUREする
■Cで書かれた関数をJNI経由でアクセス
■JavaだけでなくPerl、Python、PHPと多種の言語から利用できる
■親切なマニュアルが付属
■高機能で完成度高い
■作者は書籍を執筆しており邦訳もある
■商用ライセンスと非営利目的のAladdin Free Public Licenseの2つのライセンス形態を持つ
PDFの仕様については以下のサイトから入手できます。
1)WhitePaper: http://partners.adobe.com/asn/developer/acrosdk/docs.html
2)Ref.Manual: http://partners.adobe.com/asn/developer/acrosdk/DOCS/pdfspec.pdf
1)PDFlib/java/pdflib_java.dllをOSのシステム・ディレクリ(c:/WINNT/system32)に配置
2)PDFlib/java/pdflib.jarをCLASSPATHの通った位置に配置
(CLASSPATH設定の一般的な話はこちらに記事があります
PDFlib添付のサンプルソースをコンパイル、実行するとPDFファイルが生成されますので、Acrobat Readerで表示できれば 成功です。ヤッターv(^^
■HTTP/1.1(RFC2616):
http://www.w3.org/Protocols/rfc2616/rfc2616.txt
■HTTP/1.1(RFC2068):*1999年にRFC2616に更新された
http://www.w3.org/Protocols/rfc2068/rfc2068.txt
■HTTP/1.0(RFC1945):
http://www.w3.org/Protocols/rfc1945/rfc1945.txt
下記は典型的なHTTPセッションのモデルで、1行目がクライアントからの要求、残りがWEBサーバーからの応答です。 この様に、WEBサーバーは単純にデータを配信するのではなく、「リソースの情報」を「応答ヘッダー」と呼ばれる領域に書き込んでから、 応答します。今まで気にならなかったのは、「ブラウザに表示されるのは、<html>タグで囲まれた部分のみ」だからですよね。
応答ヘッダーの内容は、下記の例以外にもクッキー情報やアクセス制御情報など沢山の種類がありますが、 これらの機能が必要無ければ"Content-Type"さえあれば良いと言われています。なお、サーブレットは"setContentType"や"setHeader" メソッド等を利用して,簡単に応答ヘッダーを生成することが出来ます。・・・Javaで書いた応答ヘッダー解析用ツールをこちらに 用意していますので、興味あれば、いろんなサイト或いは自作サーブレットの応答ヘッダー解析にご利用下さい。
【HTTPセッションの典型】
|
GET /index.html HTTP/1.0
HTTP/1.0 200 Document follows
<html> |
例:http://server-name/hoge.html?key=value
この点「POST」だと、パラメータ情報はURL末尾に記述されること無く、クライアントからサーバーへの 「要求ヘッダー」内に埋め込まれる為、クライアント側にキャッシュされることなく、安全なのですね。
サーブレットは、勿論GET/POSTの両方を取り扱うことができ、クライアントの要求が「GET」の場合は「doGetメソッド」へ、 「POST」の場合は「doPostメソッド」へ処理が自動的に移ります。プログラマはセキュリティを考慮して、コレを使い分ければいいのです。 例えば拙作の掲示板サーブレット(SimpleDengon.java)などは、表示時には「doGet」が、投稿時 には「doPost」がお仕事します。・・・Javaで書いた要求ヘッダー解析ツール(ダミー・サーバー)を こちらで紹介していますので、興味あれば、POSTメソッドの解析等にご利用下さい。
#tagFilter(String)
|
private String tagFilter(String s){ //タグ及がなければそのまま返す if((s.indexOf('<') == -1)&&(s.indexOf('>') == -1)){ return s; } //タグの要素を変換してから返す StringBuffer sb = new StringBuffer(); for(int i=0; i<s.length() ;i++){ char c = s.charAt(i); if(c == '<'){sb.append("<");} else if(c == '>'){sb.append(">");} else {sb.append(c);} } return sb.toString(); } |
セキュリティの側面から考えると、「Refererリクエストヘッダーを監視することでユーザーのナビゲーションが想定したシナリオどおりか
否か判定できる」といふ発想があり、パラメータをハンドリングする様なサイトでは古くから利用されているようです。
例えばユーザーが個人情報を打ち込む「入力フォーム」の処理では、リクエストが指定されたURLから発信されているか否かが判定できるので、
前述のクロスサイトスクリプティングの様な第3者サイトに構築したニセ入力フォーム・トラップ越しの攻撃などには
有効な対策となります。
以下のサンプルでは、リンク元のホスト名を監視して同一ホストからの実行のみを許容しています。
■失敗する例:http://bobcat.webappcabaret.net/uzy/servlet/test.SimpleGate
■成功する例:http://bobcat.webappcabaret.net/uzy/SimpleGate.html
SimpleGate.java new: 9/30/2001
まず、1)WEBサーバーが認証を要求すると、2)ブラウザはログインのダイアログを表示し、3)ユーザーがIDとPASSWORD を入力送信して、4)WEBサーバーがアクセスの可否を判断する、と言った流れで処理されます。 なおこれらのやりとりはプロトコル・ベースで、全てHTTPヘッダー内に格納されたメッセージでやりとりされます。
【サーバーの応答】
【IEの認証GUI】
ここでは認証の基本動作を確認する目的で簡単なサンプルを用意しました。 なお、これに示すとおりユーザーのIDとPASSWORDは平文のままネットを通過しますのでセキュリティ的には 好ましくありませんね。必要に応じて SSL(Secure Sockets Layer)などと組み合わせるのが無難と思われます。
http://bobcat.webappcabaret.net/uzy/servlet/security.SimpleBasicAuthTest
https://bobcat.webappcabaret.net/uzy/servlet/security.SimpleBasicAuthTest
SimpleBasicAuthTest.java new: 12/16/2001
|
<security-constraint> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <!-- 保護をかけるURLを定義する --> <url-pattern>/security/protected/*</url-pattern> </web-resource-collection> <auth-constraint> <!-- ロールを指定する -->   <role-name>role1</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>Example Form-Based Authentication Area</realm-name> <form-login-config> <!-- ログイン並びにエラーページを指定する --> <form-login-page>/security/login/login.html</form-login-page> <form-error-page>/security/login/error.jsp</form-error-page> </form-login-config> </login-config> |
【security-constraintの主な要素】
| web-resource-name | 保護する領域の名前 |
| url-pattern | 保護する領域のURLパターン。WEBアプリのルート・ディレクトリからみた相対パスで指定 |
| role-name | アクセスを許容する複数ユーザーの抽象的な論理グループ |
【login-configの主な要素】
| auth-method | 認証の方式 |
| realm-name | 保護空間を識別するための名前 |
| form-login-config | ログイン並びにエラー時に返すURL。WEBアプリのルート・ディレクトリからみた相対パスで指定 |
| Action URL | j_security_check |
| ユーザー名 | j_username |
| パスワード | j_password |
|
<tomcat-users> <user name="hiyoko" password="hiyoko" roles="role1" /> </tomcat-users> |
| サーブレット・コンテナによる認証の管理は、クッキーを用いたセッション管理 にて行われます。即ちクッキーを無効にしているとログインすらできません。なお、WEBアプリケーションでセッション管理する場合には、 認証が完了した時点でセッションは既に張られている点に注意下さい。 |
◎INDUSTRY MOMENTUM:http://java.sun.com/products/servlet/industry.html
http://<host>:<port>/servlet/<class_name>
HOST名があれば良いですけど・・・スタンドアロンな環境でテストする場合は一般にループ・バック・アドレスを利用してIPアドレスを解決します。例えば、以下のとおりです。
http://127.0.0.1:8080/servlet/hogehoge
http://localhost:8080/servlet/hogehoge
お手軽ですね(^^)
また多少設定がややこしいですが、以下の手順を踏むことで自由にアドレス、ホスト名を付けることも出来ます。
難しい内容ではないのですが、現状のネットワーク設定は失われますので、メモをとるなり復旧はご自分の責で行って下さいネ。
◎まずはIPアドレスの確認
「名前を指定して実行」で"winipcfg"を起動し、IPアドレス項が[0.0.0.0]であることを確認します。 何がしか設定されている場合には、"hosts"ファイルが既に生成されている可能性があります。 上書きして設定を失う事の無いよう注意して下さい。◎hostsファイル作成
"hosts.sam"と言う名称のファイルを検索し、エディタで開きます。"\windows"フォルダにあると思います。これはサンプル・ファイルですので、 説明に従って、最後の行に好きなIPアドレスとホスト名を追加し、"hosts"にリネームして再び"\windows"フォルダに保存します。 以下は記入例です。なお、行末は必ず改行入れます。そう、以下の例はIPアドレスを"192.168.1.1"に、ホスト名を"uz"に 設定しているんです。"#"はコメントアウトの記号ですね。# Copyright (c) 1994 Microsoft Corp.
# This is a sample HOSTS file used by Microsoft TCP/IP for Chicago
(...中略)
192.168.1.1 uz
◎コントロール・パネルの設定
コンパネ>ネットワーク>TCP/IPのプロパティを開けます。IPアドレス設定項を"hosts"ファイルと同様に、また サブネット・アドレスを"255.255.255.0"とします。その他の設定については「WINSの解決はしない」 「DHCPは使わない(CHKしない)」「DNSは使わない」とします。要は・・・"hosts"ファイルだけで名前の解決をする作戦です。 最後に、"winipcfg"で設定が有効にになっているか確認して下さい。【ネットワーク用語の基礎】
略称 名 称 これを実行するサーバーの目的 WINS Windows Internet Name Service Microsoft方式のネットワークのコンピュータ名を、IP番号に変換する DNS Domain Name System インターネットのコンピュータ名を、対応するIP番号に変換する DHCP Dynamic Host Configuration Protocol IP番号を管理する
| JavaWebServer 1.1 | JServ 1.1 | JRun 2.3 | JRun 3.0 | Tomcat 3.1 | Resin 1.2 | |
| API 2.0 | ||||||
| API 2.1 | ||||||
| API 2.2 |
【srunを-vオプションで実行】
※フォルダ:jsdk\servletsフォルダに移動する(JSDK1.*の場合は必須)
※パス:JDKとJSDKそれぞれのbinにパスを通します。
|
cd\java\jsdk\servlets @echo off set PATH=c:\java\bin;c:\java\jsdk\bin;%PATH% srun -v
|

http://localhost:8080/servlet/SnoopServlet
http://uz:8080/servlet/SnoopServlet
| サーバーを開けません | IPアドレスの問題が解決していない様です |
| Servlet not found (404) | URL指定が間違っています。JSDK1.*の場合は"\servlets"フォルダに、 またJSDK2.*の場合は、"\examples"フォルダにクラス・ファイルを読みに行きます。ここに目的のファイル(例えば、SnoopServlet.class)が存在しますか? |
| ClassFormatError | URL指定があっているが、ソース中のpackage文が格納先フォルダ階層と一致していない可能性があります。 |
■直ぐに使えて設定がやさしいWebサーバー
■ドキュメント上では、32MB以上の実装メモリを推奨
■同封されるJRE上で動作するのでJDKが無くても問題ない
■30日期限付きのトライアル版が無償公開されている

【バッチ・ファイルの例】
|
d: cd \JavaWebServer\bin httpd |
【JavaWebServer1.1.3の起動画面】


■Apacheはめちゃ軽量なのに高速・高機能=メモリ消費はせいぜい4MB程度
■JRunは常駐時に8MB程度のメモリを消費=ドキュメント上では32MB以上の実装メモリを推奨
■JRunは単なるサーバー拡張モジュールではない=サーバー機能・データベース機能も付属
■スタンドアロンなWindows95にインストールしても動く(動作確認用としての利用)
■Apacheの拡張の為に再コンパイルする必要はない=お手軽に利用できる
■必要最低限の機能だけで動作させるなら難しい設定は無い、高度な設定は後のお楽しみ?
Apache for Win32の最新版は下記のサイトで入手できます。この記事を書いた時点での最新版は、apache_1_3_6_win32.exe(2.91MB)でした。
http://www.apache.org/

【httpd.confの設定内容抜粋】
| 項目 | 値 | 意味 |
| ServerRoot | "C:/Apache" | サーバーをインストールしたパス |
| Port | 80 | デフォルトのポート |
| ServerName | 127.0.0.1 | サーバーのIPアドレス |
| DocumentRoot | "C:/Apache/htdocs" | [http://127.0.0.1/]で表現されるホーム・ディレクトリ |
| UserDir | "C:/Apache/users/" | [http://127.0.0.1/~hoge/]で表現されるユーザ・ディレクトリを置くパス |
【バッチ・ファイルの例】
|
cd c:\Apache apache |
【apache1.3.6の起動画面】

またサーバーの停止はCTRL+Cのキー操作がお手軽ですが "httpd.pid"ファイルが残ります。"Clean ShutDown"する場合には別のDOS窓をたちあげて"apache_root>apache.exe -k shutdown" と打ち込むか、或いはスタート・メニューに登録されたShutDownアイコンを実行しましょう。
まずは以下のサイトでファイルを入手します。登録が必要です。この記事を書いた時点での最新版は
jrun23setup.exe(4.72MB)でした。 また、Readmeファイルなどで不可解な略語が多く使用されていますので、
目立つところを解説しておきます。
http://www.livesoftware.com/products/jrun/
【JRunの解説に出てくる謎の略語】
| 略語 | 意味 | 概要 |
| jse | JRun Servlet Engine for JCP | 外部サーバー拡張用のサーブレット・コンテナ(エンジン) |
| jcp | JRun Connector Proxy | 外部サーバーとJRunを接続する窓口サーバー |
| jseweb | JRun Servlet Engine for JWS | JRun自身のWebサーバー用コンテナ(エンジン) |
| jws | JRun Web Server | JRun自身のWebサーバー |
| JSM | JRun Server(Service) Manager | JRunの提供する全機能の管理部 |
| DSO | Dynamic Shared Object | Apacheを拡張する場合に、再コンパイルすることなく、 実行時に拡張モジュールを組み込むしくみ。(Apache1.3以降〜) |
| JSP | JavaServer PagesTM | WWWページをサーバーサイドで動的に生成するEnterprise Application。 独自タグをHTMLに埋め込み、プログラミングを知らなくてもJava部品を利用出来る等の機能を持つ。マイクロソフト「ASP」の対抗Java版。(但し、ここでは利用しない) |
【設定例】
| 項目 | 値 | ウィザード |
| JSM directory | C:\Jrun\jsm-default | JVM |
| JRun root | C:\JRun | Connector |
| Select Connector to install | Apache 1.2/1.3 | Connector |
| Proxy Host | 127.0.0.1 | Connector |
| Proxy Port | 8081 | Connector |
| Apache conf directory | C:\Apache\conf | Connector |
| DSO support options | USE 1.3.6 DSO | Connector |
インストールが終了すると以下のフォルダにファイルが展開されました。"\JRun\servlets"フォルダに サンプル・サーブレットが格納されています。後で動作させてみましょう。また"\JRun\jsm-default"がJRunの 本体にあたるJRun Service Managerの格納フォルダですね。

【JRunの起動画面】

| Restart | :JRunの再起動 |
| Stop | :JRunの停止 |
| Administrator | :Adminツールの起動 |
| Hide | :JRunをタスク・トレイに隠す(常駐) |
◎次にApacheを起動します。
Apacheの起動方法は先と全く同じです。ただし、起動画面を見るとJRun Connectorが起動しているのが判りますね。
【拡張後のApache起動画面】

■クラス・ファイルは何処に置くの?
Adminツールで追加・変更出来ますが、デフォルトでは"JRun\servlets"と、"JRun\jsm-default\serveices\jse\servlets"
のフォルダにクラスパスが通っています。
■サーバー上のファイルを読み書きする場合のファイル・パスは?
■標準出力は拾えるの?
System.out.println(hoge)と言ったデバック文の標準出力は"C:\JRun\jsm-default\logs\stdout.log"
に書き込まれます。
■SSIは使えるの?
デフォルトで設定されているのでスグに利用できると思います。拡張子"shtml"のファイルが呼び出されると、
SSIのハンドラが"com.livesoftware.jrun.plugins.ssi.SSIFilter"といった内部サーブレットを
起動して処理するんです。(※ただしこの"sthml"文書はShiftJISでファイルすると文字化けするのでJISで利用
すると良いです>何でだろう?)なお、Apache側のコンフィギュレーションについては変更必要ありません。・・・以下が手順例です。
■JRun自身の持つWEBサーバー機能って?
ポート"8000"で接続すると、JRun自身のWebサーバー"JRun Web Server"を
利用できます。この場合、Apache等の外部サーバーは必要なくなります。手順としては・・・ブラウザから、"http://127.0.0.1:8000/"
を呼び出せばOKです。このページには、サンプル・サーブレットのリンクが貼ってあるので
試してみるのも面白いです。
なお、このJWS(JRun Web Server)を利用しない場合は先のAdminツールのメニューで[jseweb]や[jws]のCHKを外せば起動しなくなります。
【レジストリの階層】

■Apacheはめちゃ軽量なのに高速・高機能=メモリ消費はせいぜい4MB程度
■Apache JServもめちゃ軽量=GUIの設定を持たないので軽い
■スタンドアロンなWindows95にインストールしても動く(動作確認用としての利用)
■Apacheの拡張の為に再コンパイルする必要はない=お手軽に利用できる
■必要最低限の機能だけで動作させるなら難しい設定は無い、高度な設定は後のお楽しみ?
インストールが終了すると下図の様なフォルダにファイルが展開されました。Apacheとよく似たシンプルな構造ですね。

因みに、JServとApacheの連携の為の設定情報はApacheの"httpd.conf"ではなくJServの"mod_jserv.conf"に記述されています。 ただし"mod_jserv.conf"は"httpd.conf"にincludeされてますから、親子関係みたいなもので、どちらに記述されても結果は 変わらないでしょう。その他、設定項目とその概要は下表のとおりです。
| Apache | httpd.conf | mod_jserv.confを読む |
| JServ | mod_jserv.conf | Apacheと連携するための設定情報を記述 |
| JServ | jserv.properties | Java,Servletの動作環境パス、クラスパス、ログのパス等のJServ設定情報を記述 |
| JServ | zone.properties | Servlet管理情報を記述 |

もし、照会に失敗してアクセス拒否された場合(forbidden)には以下の対策で解決するかもしれません。
また、"zone.properties"でRepositoriesを追加します。
repositories=c:\JServ\servlets,c:\JServ\ApacheJSSI.jar
以上でSSI機能は追加されました。なお、SSIのハンドラを呼び出すにはHTML文書の拡張子を".jhtml"とします。
| JSP_0.9.1 | :http://www.burridge.net/jsp/Spec91/jsp_spec.html |
| JSP_0.9.2 | :zzzz....φ(_ _ ) |
| JSP_Current | :http://java.sun.com/products/jsp/index.html |
|
追記(1/7/2000): 99年のJavaOneで発表されたとおり、JSP、Servlet、EJB(Enterprise Java Beans)のAPIが 「Java2 EE(Enterprise Edition)」に統合されました。 更に嬉しい事に、ServletAPIとJSPのリファレンス・インプリメンテーションのソース・ライセンスがApache Groupへ 供与され、実装はJakarta Projectが担当しています。 |
◎Jakarta Projectって何?(読み物)
http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/engines/jakarta.html

※[beans]並びに[jsp]フォルダは別途追加したものです(後述)
◎alph.properties
デフォルトのzone.propertiesをリネームしてGNUJSP動作の専用ZONE
(例えば、alph.properties)を作ります。
◎jserv.propertiesに上記ZONEの呼び出しを追加
zones=root,alph
alph.properties=c:\JServ\conf\alph.properties
◎GNUJSPのクラス・ライブラリ(gnujsp10.jar)とコンパイルに必要な"javax..."クラスライブラリ
のパスを指定します
repositories=c:\JServ\gnujsp-1.0.0\lib\gnujsp10.jar
repositories=c:\JServ\gnujsp-1.0.0\lib\servlet-2.0.jar
◎オートリロードを有効にします
autoreload.classes=true
◎Aliasを指定します
servlet.gnujsp.code=org.gjt.jsp.JspServlet
◎コンパイル条件式等を設定します
コンパイル条件式は基本どおりクラスパス、出力フォルダ、エンコード方式等を指定します。
なお、パス・セパレータはWindows環境では";"を、UNIX環境では":"を使用して下さい。
(なお、エンコード指定は必要ない場合もあります。)
=基本型=
builtin-javac -classpath %classpath%;%scratchdir% -d %scrachdir% -deprecation
-encoding %encoding% %source%
=設定例=
servlet.gnujsp.initArgs=checkclass=true,pagebase=c:\Apache\htdocs,
scratchdir=c:\JServ\gnujsp-1.0.0\jsp,debug=true,compiler=builtin-javac
-classpath %classpath%;%scratchdir%;c:\JServ\gnujsp-1.0.0\lib\gnujsp10.jar;
c:\JServ\gnujsp-1.0.0\lib\servlet-2.0-plus.jar
-d %scratchdir% -deprecation -encoding %encoding% %source%
=簡単な用語解説=
%classpath%:システムの持つクラスパス
%scrachdir%:ソース・コード並びにコンパイル・コードの出力先フォルダ
%encoding%:システムの持つエンコード方式
%source%:コンパイルする対象ソース・ファイル
pagebase:WEBサーバーのDocumentRoot
ApJServAction .jsp /alph/gnujsp
ApJServMount /alph /alph
wrapper.classpath=C:\JServ\beans
(Java2 SEでご利用の場合にはtools.jarにもパスを指定下さい)
で、先に設定したGNUJSP用のお仕事フォルダを覗くと、snoop.jspの実行時に生成されたソースと、コンパイル後の クラス・ファイルを見る事が出来ます。生成されたソース中には、HTML出力ロジックがズララッと書いてあります。 覗くのも面白いですよ。
Apache JServは、アプレットやアプリケーション等の様に簡単にデバッグ情報を標準出力[System.out]へ 書き出すと言った事ができないので、以下の様にデバッグ情報を入手します。
■クラス・ファイルは何処に置くの?
デフォルト設定では、"JServ_root\servlets"がサーブレットを置くルートとなります。
■サーバー上のファイルを読み書きする場合のファイル・パスは?
読み書きするファイルは、httpd.confで言うところの"ServerRoot"から見た相対パスで指定すればOKです。"DocumentRoot"ではありません。
■Resinはサクサク高速。Tomcatの3倍速いベンチマークが公開されている。
■Servlet並びにBEANをソースのまま配置できる。(JSP同様に実行時にコンパイルする)
■Apache,IIS,Netscape等の主要WEBサーバーにアドオン可能
■シンプルなセットアップツールが付属
■ServletAPI2.2+JSP1.1サポート
■DB接続プーリングをサポート
■XMLサポート
■Caucho Developer Source Licenseのライセンス形態を持つ
■商用ベースなのでライセンスの解釈に注意

【バッチ・ファイルの例】
|
cd \ApacheGroup\resin-1.2.b1\bin set PATH=c:\java\jdk1.2.0\bin;%PATH% httpd |

【起動オプション】
※必要に応じて起動オプションを設定して下さい。( httpd -option )
| -h | help |
| -verbose | information on launching java |
| -java_home <dir> | sets the JAVA_HOME |
| -resin_home <dir> | home of Resin |
| -classpath <dir> | java classpath |
| -install | install as NT service |
| -remove | remove as NT service |
#サンプルの間違い!?
サンプルのサーブレットの一部にエラーで動かないもの(爆)があります。ソースを下記に従って修正すると良いですよ。
resin1.1.3世代から修正されていないのでこれは意図的?因みにServletContextからInitParameter取得するAPIはServlet API2.2
で追加されたものです。
【Env.javaの修正】
|
262: ServletContext app = getServletContext(); 263: (正解)Enumeration e = app.getInitParameterNames(); 263: (誤記)Enumeration e = app.getInitParameter(); |
Resinはsrunと呼ばれるサーバー(ポート:6802)を用いて、Apacheと高速プロトコルで通信・連携します。例によってApacheの設定ファイル (hpptd.conf)を修正しましょう。なお、/resin_root/bin/に便利なセットアップ・ツール(setup.exe)がありますのでこれを利用します。これを起動すると 下記のインターフェースが現れますのでパスを記述して実行します。

その結果Apacheのhpptd.confに以下の記述が追加されました。
|
LoadModule caucho_module "C:/ApacheGroup/resin1.2.b1/srun/win32-1.3.6/mod_caucho.dll" AddModule mod_caucho.c
<IfModule mod_caucho.c> |
では、サンプルを動かしてみましょう・・・これは/resin_root/doc/WEB-INF/classes/Env.javaの実行例です。
#http:/server_name/servlet/Env

なお、設定ファイルの記述方法はヘルプが整備されていますので利用可能なSYNTAXを確認下さい。 また各種設定例が/resin_root/conf/sample/フォルダにあるので参考になります。 最小セットアップ例を以下に紹介します。
#最小セットアップ例:MinResinSetup.conf
#文字セットをISO-2022-JPで指定した例;
<%@ page contentType="text/html ; charset=iso-2022-jp" %>
では、Resinは具体的にどのように文字列のエンコードを解釈するのでしょうか?
そこで、JSPが生成するソースコードについてスクラッチ・ディレクトリを探索して一寸調べてみました。
結果、文字列は以下のようにUNICODE変換されることが判りました。
| なおXTPの利用目的は、XMLのそれと同じで、データフォーマットを[構造][中身][表示方法]に分割して 開発・維持することであり、生産性の向上が期待できる点が魅力なのですね。しかもややこしい設定なしに即利用 できる点が美味しいです。 |
クライアントからリクエストを受けたXTP(XML)文書は、この内部サーブレットによってパースされます。 更にXSLに記述されたルールでJSP表現に翻訳されて、その結果がJSPファイルとしてスクラッチ・ディレクトリに書き出されます。 次にこのJSPは通常のソレと同様にサーブレット・コンテナ内で実行されて、コンテンツが動的に生成されます。 つまり、下図のように(XML+XSL)→JSP→Servlet Source→Compile→Servlet→HTMLといふ処理が動的に行われるんです。
|
詳細な仕様は以下の添付ドキュメントで知ることが出来ます。
| *XTPについて | app_root/ref/xtp.xtp |
| *XSLについて | app_root/ref/xsl.xtp |
| *XPathについて | app_root/ref/xpath.xtp |
XSLはXTPを配置したフォルダと同じフォルダ、または/WEB-INF/xsl/フォルダ、或いは/WEB-INF/classes/フォルダに配置します。では、 早速動かしてみましょう。使い方は工夫次第で広がります。以下では、簡単なサンプルを、共通のヘッダー、フッターを定義した テンプレート上に表示させてみました。
|
<xsl:output media-type='text/html' encoding='iso-2022-jp'/> <xsl:output disable-output-escaping='true'/> ..........以下本文 |
では、Resinの内部でどんなコードが生成されているかスクラッチ・フォルダを探検して検証してみると・・・
ナルホド、<xsl:output>タグでencoding指定した場合(例えばiso-2022-jpを指定した場合)には、以下のJSPコードが生成され
ていました。
|
<%@ page contentType="text/html; charset=iso-2022-jp" %> <html> <body.............以下省略 |
ほほう、ResinはJSPコードの生成時に日本語を解釈するための属性を付加するのですね。と言ふことは・・・[XSL]の<xsl:output>タグ でencoding指定した場合は、(先のJSP項で示したとおり)、[XTP]は指定したエンコードで保存しないと文字化けすると言ふことで す。ご注意を。
| <a href="http://server_name/servlet/HelloServlet">hogehoge</a> |
ページ中の一部にサーブレット・オブジェクトを貼り付けたい場合に使用します。拡張子が".shtml"のHTML文書を作成し、
その中で<servlet>タグを貼り付けます。アプレットと同じ様な起動方法ですね。
以下がクラス名で起動する例です。
| <servlet code=HelloServlet></servlet> |
◎サーブレット専門のフォーラムです。世界中の開発者が集まっています。UZもお世話になりました。(^^ゞ
◎サーブレットとJSP関連のFAQはこちらへ
◎サーブレット/JSPを扱う書籍
◎ひよこには必ず役に立つ書籍
◎Javaの真髄を知る書籍
◎サーブレットのことなら・・・
◎JSPのことなら・・・
◎サーバーサイドJAVA全般のことなら・・・
◎サーブレットをサポートするISPです。