2002年6月 CRESC Corporation セミナー資料 サーブレット・JSPコース 第1版 2002年6月 光岡輝義 (株)クレス © Cresc Corporation, June, 2002 1 2002年6月 CRESC Corporation このセミナーの目的 • サーブレットのコンセプトを正確に把握 • 原点であるHTTPをネットワーク・アプリケーションの観点から理解する • 要求と応答のオブジェクト、コンテナが管理するセッションやコンテキス トのオブジェクトなどの理解 • 幾つかのサーブレットによる実習や簡単なサーブレットの作成 • アプリケーションのサーバへの配置実習 • JSPの基礎、サーブレットとの関係の把握 • JSPの作成と実行の実習 2 2002年6月 CRESC Corporation 予定 1.サーブレットのコンセプト 4.スレッド対応 1)コンセプト 1)サーブレット・エンジンの構造 2)仕様書 2)スレッド・セーフなプログラム 3)ネットワークとHTTPの基礎 2.要求と応答のオブジェクト 1)要求オブジェクトを簡単なサーブレットを 使って知る 2)URLエンコードと日本語処理 5.サーブレット・コンテキスト 1)サーブレット・コンテキストとは 2)サンプル・サーブレットによる実習 3)アプリケーションの配備とデスクリプタ 6.JSP 3)Telnetを使った応答の確認 1)JSPのコンセプト 4)ステータス応答 2)サーブレットとJSPの連携 3.セッション 3)簡単なJSPの作成と実行の実習 1)セッション維持のメカニズム 2)セッションのオブジェクト 実習機材等:Windows 2000, JDK, Tomcat 4.X 3)サーブレットを使ったセッション管理の実習 3 2002年6月 CRESC Corporation サーブレットとは 現在のビジネス・ソリューションの基本手段 典型的な3層クライアントサーバ構造(Three-tier Architecture) の例 クライアントが一般的なブラウザそのものである場合は、このような 系はクライアントに変更をかけることなく、サーバサイドでビジネスロジック の変更ができ、また各種ブラウザがクライアントとして使える 4 2002年6月 CRESC Corporation サーブレットとは 基本コンセプト 資源 サーブレット間通信 データベース にアクセスす るサーブレット サービスAの サーブレット サーブレット間通信 サービスXのサ ーブレット サーブレットAPI チェックの サーブレット Webサーバ サーブレット連鎖 ネットワーク ブラウザ データベース クライアント クライアント 5 2002年6月 CRESC Corporation WWWサーバの構成 Servletコンテナ JSPやサーブ レットなどのエン ティティ Servletエンジン(Tomcatなど) データベース Webサーバ (Apacheなど) ソケット・インターフェイス TCP 静的ドキュメント ドキュメントには静的(スタ ティック)なものと動的(ダイ ナミック)なものがある。ダイ ナミックなドキュメントはソフ トウエアがそのドキュメント を作成する。動的ドキュメン トはサーブレット、JSP、CGI スクリプト、ASPなどの技術 が使われる。ビジネスの世 界ではJavaベースのサーブ レットやJSPがよく使用され る。 IP プロトコル・スタック 6 2002年6月 CRESC Corporation サーブレットの特徴 従来のCGIに比べて以下の点で勝っている クライアントの要求毎に新たなプロセスを必要としない サーブレットは、サーバ上でひとつの常駐スレッドとして動作する。従って最初にインスタンス化すると き以外はCGIよりは高速で動作する マルチスレッドで動作する 複数のクライアントから同じ要求(例えばGETやPOST)が到来した場合、その要求に対応したメソッド は最初のクライアントに対する処理が終了しなくても新たなクライアント用として、別のスレッドに要求 を割り当てる サーバ上に常駐する 例えば3層モデル(例えばブラウザからなるクライアント、サーバ上のサービスプロセス群、そして データベースといった構成)では、データベースなどその先のコネクションを張ったまま常駐するので、 処理が早くなる セキュリティ・モデルがある すべてのJava環境はSecurity Managerを有する。またサーブレットをJARファイルからアップロードす るときもSecurity Managerが関与し、システムに危害を及ぼす恐れのある処理を実行しない 7 2002年6月 CRESC Corporation 通信プロトコルとHTTP HTTPはTCP/IPのアプリケーションのひとつ ネットワークを使ったアプリ アプリケーション TCP層 IP層 データリンク層 物理層 インターネットの世界のプロトコル階層 身近なアプリケーション: • インターネット・メール(SMTP) • WWW(HTTP、HTML)、 • インターネット電話(VoIP) • ファイルのダウンロード(FTP) • ドメイン名の仕掛け • Windowsのファイルやプリンタ共有 • ・・・ SMTP: Simple Mail Transfer Protocol, WWW: World Wide Web, HTML: Hyper Text Markup Language VoIP: Voice over IP, FTP: File Transfer Protocol, TCP: Transmission Control Protocol, IP: Internet Protocol 8 2002年6月 CRESC Corporation TCPの概念 開設要求 IPアドレスで接続 するピア間で 開設応答 受付ポート 応答 1. ポートを使った「接続」の概念を導入 2. 高信頼のデータ転送の確立 1. 誤りの検出と再送 2. 順序制御 3. フロー制御 データ交信 開放はどちら 側から開始し ても良い 開放要求 開放応答 応答 クライアント サーバ 9 2002年6月 CRESC Corporation HTTPとWWWサーバ TCP #XX TCP #80 TCP接続の確立 HTTP Request HTTPは相手のサーバ とのポート番号80による 接続を行い、要求と応 答を繰り返す極めて単 純なプロトコル。 インターネット HTTP Response TCP接続の開放 HTTP 1.0の手順 ブラウザ (IEや Netscape Navigator) HTTPにはHTTP/1.0とHTTP/1.1のふ たつがある。HTTP/1.1はTCP接続の 維持やチャンク転送など高速化が図 られているが、まだ対応していない サーバが多い 欲しいリソース分だ けこれを繰り返す WWWサーバ (HTTP サーバ) HTTP: Hyper Text Transfer Protocol, HTML: Hyper Text Markup Labguage, WWW: World Wide Web 10 2002年6月 CRESC Corporation URLとは URL(URI)によるインターネット上の資源へのアクセス URL: Uniform Resource Locator URI: Uniform Resource Indicator 皆さんのブラウザはwww.cresc.co.jpといれ るだけで㈱クレスのホームページが開く URIはもう少し広い概念だが気にしなくて良い http://www.cresc.co.jp:80/tech/Java/Servlet_Tutorial/index.htm これをドメイン名ともいう ホスト名(ドメイン名、あるいは完 全修飾ドメイン名FQDN) ”//”は ネットワーク上にあることを示す そのリソースへのパス(そのホス トのディレクトリ構造とは必ずしも 対応しない) リソースへの名前 (指定しないとデ フォルトのファイル index.htmlが開か れる) ポート番号(そのス キームの標準のポー HTTP, FTP, Telnet… ト以外が使われると き) HTTP: Hyper Text Transfer Protocol, FTP: File Transfer Protocol, FQDN: Fully Qualified Domain Name スキーム(手段) 11 2002年6月 CRESC Corporation URLとは ドキュメントのアドレス 隣の人と互いに相手のサーブレットやJSPが呼び出せることを確認しよう Webサーバ/ サーブレッ ト・コンテナ (Apache/Tomca tなど) ブラウザ (IE, Netscapeな ど) http://localhost:8080/・・・・(ループバッ ク) http://192.168.0.51:8080/・・・(他のホス ブラウザ ト) (IE, Netscapeなど) TCP/IP層 http://localhost:8080/・・・・ データリンク層 物理層 TCP/IP層 データリンク層 インターネット 物理層 12 ループバックのIPアドレスは127.0.0.1、これも使える http://192.168.51:8080/・・・・ 2002年6月 CRESC Corporation 実習環境の構築 J2SDKのダウンロード(1) J2SDKにはTomcatに必要なJava実行環境(JRE)が含まれている 13 2002年6月 CRESC Corporation 実習環境の構築 J2SDKのダウンロード(2) http://java.sun.com/j2se/1.4/download.htmlからWindows (all languages, including English)のSDKをダウンロードする。 J2sdk-1_4_0_01-windows-i586.exeファイル は自己解凍ファイル、このように展開される ことを確認、トップのフォルダの名前を “j2sdk140b1”と変更して覚えやすくする E:\>cd j2sdk140b1\bin 動作確認 E:\j2sdk1.4.0_01\bin>java -version java version "1.4.0_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b03) Java HotSpot(TM) Client VM (build 1.4.0_01-b03, mixed mode) E:\j2sdk140b1\bin> 14 2002年6月 CRESC Corporation 実習環境の構築 簡易ツールのダウンロードとインストール(1) zipとjarの解凍ソフト:Lhasa(ラサ)0.17版 http://www.digitalpad.co.jp/~takechin/download.htm l#lhasa lhasa017.exeという自己解凍のファイルをダウン ロードして実行する フォルダ:C:\Program Files\Lhasa コンソール上のアイコ ンを開いて出力先と関 連付けを指定のこと 15 2002年6月 CRESC Corporation 実習環境の構築 簡易ツールのダウンロードとインストール(2) 簡易エディタのソフト: “秀丸" http://hidemaru.xaxon.co.jp/software/hidemaru.html Hm315.exeという自己解凍ファイルを実行してインストールする。 フォルダ:C:\Program Files\Hidemaru telnetソフト: "Tera Term" http://hp.vector.co.jp/authors/VA002416/ ttermp23.zipというZIP圧縮ファイルを前記のLhasaで解凍し、setup.exeを実行して インストールする。 フォルダ:C:\Program Files\TTERMPRO 16 2002年6月 CRESC Corporation 実習環境の構築 Tomcatのダウンロード 1. 2. 3. 4. バイナリファイルのダウンロード: http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.4b3/bin/ を開いてjakarta-tomcat-4.0.4-b3.zip という最新のバイナリファイルをダウンロードする 圧縮ファイルの展開: ダウンロードしたTomcatの圧縮ファイルをc:\などに展開する。jakarta-tomcat4.0.4といった名称のディレクトリができる。必要があればtomcat404b3などにリネームしておく。 環境変数の設定: 付属ドキュメントに従って環境変数を設定する。設定する内容は下表の通り。 なお、環境変数の設定は「コントロール パネル」→「システム」→「詳細」→「環境変数」から行う。 テスト: ここまでの手順がうまくいっているか確認してみる。 つぎのスライドによる 環境変数 TOMCAT_HOME CATALINA_BASE CATALINA_HOME JAVA_HOME 設定値 Tomcatを展開したディレクトリ名(例: c:\tomcat404b3) Javaがインストールされているディレクト リ名(例:C:\j2sdk140b1) 17 2002年6月 CRESC Corporation コマンドプロンプト で%TOMCAT_HOME%\bin\ startup.batを実行するか、こ のように TOMCAT_HOME\binから startupを実行する 実習環境の構築 Tomcatの開始と終了 C:\tomcat404b3\bin>startup Using CATALINA_BASE: "C:\tomcat404b3" Using CATALINA_HOME: "C:\tomcat404b3" Using JAVA_HOME: "C:\j2sdk140b1" C:\tomcat404b3\bin>shutdown Using CATALINA_BASE: "C:\tomcat404b3" Using CATALINA_HOME: "C:\tomcat404b3" Using JAVA_HOME: "C:\j2sdk140b1" C:\tomcat404b3\bin> ここまで表示され たらHTTP要求の 受付が可能 サービス Tomcat-Standalone を起動します Apache Tomcat/4.0.4-b3 サービス Tomcat-Apache を起動します Apache Tomcat/4.0.4-b3 このウインドウが閉じ るまで次のコマンドを 入れてはいけない 18 2002年6月 CRESC Corporation 実習環境の構築 Tomcatのディレクトリ構造 TOMCAT_HOME\ bin\ server.xml Tomcatのグローバルな設定ファイル conf\ web.xml デフォルトのアプリケーション設定ファイル tomcat-users.xml lib\ logs\ ユーザ認証用登録ファイル アプリケーション毎のルート・ディレクトリ jasper.log このアプリケーションの デスクリプタ web.xml servlet.log src\ admin\ webapps\ アプリケーションごとにこ の構造が構成される application_home\ (examples) classes\ META-INF\ jsp\ staticDocuments lib\ サーブレットの置き場 (.javaと.classとも) JSPファイルの置き場 ROOT\ 各アプリケーションのwarファイルの置き場 WEB-INF\ 静的ドキュメントはここに置く 19 2002年6月 CRESC Corporation まずはしらせて体験する HelloWorldサーブレット(1) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; 秀丸をつかってこのテキスト をHelloWorld.Javaという名前 で TOMCAT_HOME\webapps\e xamples\WEB-INF\classes\に 置く public class HelloWorld extends javax.servlet.http.HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>Hello World</TITLE></HEAD>"); out.println("<BODY>"); out.println("<BIG>Hello World from 小泉純一郎</BIG>"); //自分のファーストネームを入れ自分のプログラムであることを識別する out.println("</BODY></HTML>"); out.flush(); out.close(); } } 秀丸のダウンロード:http://hidemaru.xaxon.co.jp/software/hidemaru.html 20 2002年6月 CRESC Corporation まずはしらせて体験する HelloWorldサーブレット(2) HelloWorld.javaをコンパイルしてHelloWorld.classを得る 1. カレント・ディレクトリをコンパイルしたいファイルのディレクトリに移動させる 例えばcd c:\tomcat404b3\webapps\examples\web-inf\classesのようにコマンドを 入力(またはこのディレクトリへのPathを設定する) 2. コンパイラにサーブレットのライブラリの場所を探すためのクラスパスを教える set classpath=c:\tomcat302\lib\servlet.jar (バージョン3.xの場合) set classpath=c:\tomcat404b3\common\lib\servlet.jar (バージョン4.xの場合) 3.j2sdkのツールへのパスを指定する set path=%PATH%;%JAVA_HOME%\bin 4. javacを使って目的のサーブレットをコンパイルする javac HelloWorld.java (たとえば..) Javac *.java (このディレクトリのソースを一括) 21 2002年6月 CRESC Corporation まずはしらせて体験する HelloWorldサーブレット(3) DOSプロンプトでカレント・ ディレクトリを %TOMCAT_HOME%\bin http://localhost:8080/examples/servlet/HelloWorld または に置いてTomcatを開始させ http://127.0.0.1/examples/servlet/HelloWorld ているか? で皆さんのサーブレットが呼び出せることを確認 22 また近くの人と互いのサーブレットが呼び出せることも確認する 2002年6月 CRESC Corporation まずはしらせて体験する StaticJspExample(1) <HTML> 秀丸をつかってこのテキスト をStaticJspExample.JSPという 名前で TOMCAT_HOME\webapps\e xamples\jsp\に置く <HEAD><TITLE>Static JSP Sample</TITLE> <META HTTP-EQUIV="cache-control" CONTENT="no-cache"> <META HTTP-EQUIV="content-type" CONTENT="SHIFT_JIS"></HEAD> <BODY><H1>静的JSPのサンプル</H1> Hello from 鈴木宗男 </BODY></HTML> 23 2002年6月 CRESC Corporation まずはしらせて体験する StaticJspExample.jsp(2) TomcatはJSPページの要 求を受理したら、この ファイルの構文解析、 javaコードの生成、それ をコンパイルしたclass ファイルの作成、実行の 一連の作業を行 う http://localhost:8080/examples/jsp/StaticJspExample.jsp または ipconfig /allを使って http://127.0.0.1:8080/examples/jsp/StaticJspExample.jsp IPアドレスを知る で皆さんのJSPが呼び出せることを確認 また近くの人と互いのJSPが呼び出せることも確認する 24 2002年6月 CRESC Corporation まずはしらせて体験する StaticJspExample.jsp(3) TomcatがエンコーディングをISO-8859(イ ンターネットの標準)としてHTTPパケット のヘッダを作ってしまうため 。後で説明する pageディレクティブを最初に追加する。 <%@ page contentType="text/html; charset=Shift_JIS" %> <HTML><HEAD><TITLE>Static JSP Sample</TITLE> <META HTTP-EQUIV="cache-control" CONTENT="no-cache"> 文字化け! IEでは表示>エンコー ドをShift_JISにすると なおるが、Netscapeで は駄目! <META HTTP-EQUIV="content-type" CONTENT="SHIFT_JIS"> </HEAD><BODY><H1>静的JSPのサンプル</H1>Hello from CRESC</BODY></HTML> 追加実験 1. TOMCAT_HOME¥webapps\examples\のディレクトリにこのファイルを置いたらどのよ うに呼び出せばよいか? 2. Tomcatが生成したサーブレットやclassファイルは何処に存在するか? 25 2002年6月 CRESC Corporation サーブレットのAPI http://www.cresc.co.jp/tech/Java/ServletSpecification V2.2/index.htm •JavaTM Servlet 仕様書 v2.2 邦訳版(v2.3は別のグループが 翻訳) • これがサーブレットの問題解決の原点 • 次がSunのAPIのJavaDoc(「API参照」と呼ぶ) http://java.sun.com/products/servlet/2.2/javadoc/index.html • 次にSunのチュートリアルを参照のこと http://java.sun.com/products/servlet/technical.html 26 2002年6月 CRESC Corporation サーブレットのAPI サーブレットAPIの構成 Object Servlet Throwable GenericServlet Exception ServletConfig Serializable ServletContext HttpServlet ServletException ServletRequest HttpServletRequest UnavailableException ServletResponse HttpServletResponse EventObject RequestDispatcher EventListener SingleThreadModel HttpSessionBindingListner InputStream HttpSession ServletInputStream OutputStream ServletOutputStream HttpUtils HttpSessionBindingEvent サーブレットのAPIの中心と なるのが抽象インターフェ イスであるServletである。 アプリケーションは、これを 実装したGenericServletを サブクラス化するか、HTTP ベースのサーブレットであ ればHttpServletをサブクラ ス化させて各サービスに対 応したクラスを作成する Cloneable Cookie 楕円がインターフェイス、矩形がクラスである。矢印は拡張またはイン ターフェイスの実装を意味する。小さな楕円と矩形は外部のパッケー ジに属する。水色がJavax.servletパッケージに、黄色が javax.servlet.httpパッケージに属する。 27 2002年6月 CRESC Corporation 教材のダウンロード MaterialsForApacheTomcatTE.jar 例えばdownloadedというディレクトリを作ってダウンロードしたjarファイルを収容、 SDKのツールでこれを解凍する。 C:\tomcat404b3\webapps\downloaded>jar xf MaterialsForApacheTomcatTE.jar C:\tomcat404b3\webapps\downloaded> Jarコマンドが見つからないときは以下を確認 set path=%PATH%;%JAVA_HOME%\bin JARコマンドの使い方 解凍されたjavaソースコードとclassバイ ナリ・ファイルはあとで以下のフォルダ に移して実習材料につかう webapps\exapples\WEB-INF\classes\ jar [ options ] [manifest] destination input-file [input-files] <option> [c] 新規に書庫ファイル(アーカイブファイル)を作成する。 [u] 既存の書庫ファイル(アーカイブファイル)を更新 する。 [t] 書庫ファイルに格納されているファイル名の一覧を表示。 [f] 書庫ファイルのファイル名を指定する。 [v] コン ソール(標準出力)上に処理の履歴を表示。 [x] 書庫ファイルから格納されているファイルを取り出す。 [m] マニフェストの 28 内容を記述したファイル名を指定する。 2002年6月 CRESC Corporation telnetのソフトウエア(Tera Term) TCP/IP setupの画面で Auto Windows Closeの クリックを外すことも忘れ ないこと フリーウエアの"Tera Term"をダウンロードするhttp://hp.vector.co.jp/authors/VA002416/など この図のように設定したらこの設定を保存する 29 2002年6月 CRESC Corporation telnetによるWWWサーバのアクセス HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Content-Location: http://61.120.33.178/index.html Date: Sat, 01 Jun 2002 05:39:28 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Tue, 30 Apr 2002 08:53:18 GMT ETag: "013d87824f0c11:5477" Content-Length: 10857 ボディ部分 ヘッダ部分 要求 GET / HTTP/1.0 応答 例えばどこかのwwwサーバにアクセ スしてその応答を調べる <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <META NAME="GENERATOR" Content="Visual Page 1.0J for Windows"> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis"> <TITLE>株式会社クレス Cresc Corporation </TITLE> </HEAD> 30 2002年6月 CRESC Corporation HTTPのパケット ヘッダ行 Request(要求)、Response(応答)ともにメッセージ形式は前 述のようにSMTPのMIMEメール形式に類似している。 1. 初期行(Initial Line) 2. ゼロまたはそれ以上のヘッダ行(HeaderLine) 3. 空白行(Blank Line) 4. オプショナルな本文(Message Body) テキスト、ファイル、バイナリデータなど 各行は復帰改行(CRLF)で終端される。 メッセージは7ビットのASCIIがベース、2バイトの文字セットや危険な文字はURLエンコードされる。またボ ディ部はマルチメディアや多国語対応の為MIME(Multipurpose Internet Mail Extensions)が使用される。 31 2002年6月 CRESC Corporation GET:そのリソースが欲しい(パラメ タはクエリ文字列でこの行に含まれ る) POST:GETと同じだがパラメタはボ ディ部分に含まれる) その他HEADなどのメソッドがある HTTPのパケット HTTP要求パケット HTTPのバージョン: HTTP/1.0:一般的に利用されている HTTP/1.1:改善されたバージョン ブラウザはどちらを使うか選択できる がサーバは1.1に対応しないものが多 い GET /path/to/resource/index.html HTTP/1.0 Header1: some-long-value-1a, some-long-value-1b Header1: some-long-value-1a, some-long-value-1b ・・・・・・・ 空白行 オプショナルなボディ 32 2002年6月 CRESC Corporation HTTPのパケット 要求パラメタの取得 教材にある HttpRequestDump を理解しよう ひとつの変数値 String myValue = req.getParameter(“name”); String myValue = req.getParameterValues(“name”)[0]; 複数の変数の値 String[] myValues = req.getParameterValues(“keyword”); 総ての変数の名前 Enumerartion enum = req.getParameterNames(); 33 2002年6月 CRESC Corporation HTTPのパケット HTTP応答パケット HTTP/1.0 200 OK Header1: some-long-value-1a, some-long-value-1b Header1: some-long-value-1a, 初期応答行はHTTPバージョン、 ステータス・コード、応答理 由句からなる。 1xx は単なる情報の為 2xx はある種の成功を意味 する 3xx は他のURLへのリダイ レクトであることを通知 4xx はクライアント側のエ ラー 5xx はサーバ側のエラー some-long-value-1b ・・・・・・・ 空白行 オプショナルなボディ よく使われるヘッダ: Host: From: User-Agent: Content-Type: Content-Length: ・・・・・ 34 2002年6月 CRESC Corporation HTTPのパケット 二つのバージョン バージョン HTTP/1.0 HTTP/1.1 特徴 広く普及 TCP接続の維持とチャ ンクド送信で高速 Servlet/JSP 仕様 2.2/1.1 2.3/1.2 対応するTomcatのバージョン 3.X 4.X (Catalinaプロジェクト) 注意 Host:ヘッダ必須 TCP接続維持 35 2002年6月 CRESC Corporation HTTPのパケット チャンクド・エンコーディング • ボディ部は複数のチャンクからなり、最後のチャンクは長さゼロ(“0”)とする。 その後にオプショナルなフッタがつき、最後に空白行(\r\nのみ)がボディ部の 終わりを示す。 • 各チャンクは長さを示す行とデータからなる。 • 長さは16進表示である。この行には長さの後にセミコロンに続くパラメタを付 すこともできるが、これの用途は特に規定されていない。この行の終わりに 復帰改行(\r\n)がつく。 • データ部はデータ自身でそれに復帰改行(\r\n)がつく。 36 2002年6月 CRESC Corporation telnetによるHelloWorldのテスト Tomcatを走らせそのHTTP応答を見る GET /examples/servlet/HelloWorld HTTP/1.1 host: localhost HTTP/1.1 200 OK Content-Type: text/html; charset=EUC-JP Date: Sat, 08 Jun 2002 13:13:21 GMT Transfer-Encoding: chunked Server: Apache Tomcat/4.0.4-b2 (HTTP/1.1 Connector) 6 <HTML> 2 27 <HEAD><TITLE>Hello World</TITLE></HEAD> 2 ・・・・・ HTTP/1.1ではhost:行が必要なこ とと、応答がチャンクド形式になっ ていることに注意しよう GET /examples/servlet/HelloWorld HTTP/1.0 HTTP/1.1 200 OK Content-Type: text/html; charset=EUC-JP Date: Sat, 08 Jun 2002 13:15:33 GMT Server: Apache Tomcat/4.0.4-b2 (HTTP/1.1 Connector) Connection: close <HTML> <HEAD><TITLE>Hello World</TITLE></HEAD> <BODY> <BIG>Hello World from。 </BIG> </BODY></HTML> 37 2002年6月 CRESC Corporation Tomcat 4.xでの注意点 4.x-bnはベータ版なので、業務用は使わないこと 1. サーブレットAPIライブラリの場所が違っている TOMCAT_HOME\common\lib\servlet.jar 2. 要求にはhost:行が必要なのでtelnetによるテストで は注意 3. getSession()は何かHTMLテキストを書きだす前に 行わないとエラーになる(クッキー設定ヘッダ行を 書く前にヘッダとボディ部がチャンクド出力される、 つまりコミットされてしまっているから) 38 2002年6月 CRESC Corporation サーブレットの記述 以下の習慣をお勧めする 1. res.setContentType("text/html; charset=EUC-JP"); あるいは、 res.setContentType("text/html; charset=Shift_JIS"); など必ず文字コードを指定する。そうしないとコンテナによって異なる出力結果をもたらす可能性がある。 2. getServletInfo() なるメソッドで以下のようにこのサーブレットの記述をしておく。版、作者、著作権な ども記述すると良い。これはこのサーブレットの立ち上げや初期化に際して呼ばれるメソッドで、アプリ ケーションで問題が発生したときの解決に有用だからである。 public String getServletInfo() {return "Hello World, Ver. 1.0"; //他のサーブレットと区別できる文字列} 3. service()(あるいはこれが呼び出すdoGet()やdoPost()など)の要求処理終了時には以下のように出力の吐 き出しとクローズを明示的に行う。要求処理の終了時にはこれらは自動的に行われるが、たとえ暗示的に行 われてもきちんとプログラムに明示的に書くことが良い習慣である。 out.flush(); // 明示的なフラッシュ out.close(); // 明示的なクローズ 4. サーブレットに限らないが、プログラムコードにはなるべくアノテーション(コメント)を記入する。こ れは将来他人がこれを利用したりデバッグしたりするときに有用である。また形態管理の情報(日付、作者、 版数、状態など)の記入も重要である。 39 2002年6月 CRESC Corporation サーブレット・コンテナ 概念図 サーブレット・コンテナ コンテキスト コンテキスト (アプリケーション) (アプリケーション) Tomcatなど クラス・ローダ サーブレットやJSP のインスタンス 要求・応答・セッション・コンテキスト・文字変換・セキュリ ティ・HTTPパケットの組立てなど... Webサーバ(Tomcatはスタンド・アロンでも動作できる) HTTP ソケット・インターフェイス TCP/IP層 40 2002年6月 CRESC Corporation サーブレット・コンテナ SingleThreadModel SinglThreadModelを実装したサーブレット コンテナ コンテナ サーブレッ ト サーブレッ ト サーブレッ サーブレッ ト ト サーブレッ ト スレッド スレッド スレッド スレッド HTTP要求 HTTP要求 HTTP要求 クライア ント クライア ント クライア ント サーブレッ ト スレッド HTTP要求 HTTP要求 クライア ント クライア ント SingleThreadModelを 実装したサーブレットは スレッド・セーフでなくて よい。換わりにコンテナ が複数のインスタンスを 用意する スレッド HTTP要求 クライア ント 41 2002年6月 CRESC Corporation サーブレット・コンテナ コンテナが渡す要求のオブジェクト HTTP要求パケット getMeathodなど 所期要求行 ヘッダ行(複数) getHeadersなど getParameterなど ボディ InputStream ま た は Reader この要求に関する情報 readLineなど getPathTranslatedなど 42 2002年6月 CRESC Corporation サーブレット・コンテナ コンテナが用意する応答のオブジェクト HTTP応答パケット setStatusなど 所期応答行 ヘッダ行(複数) ボディ OutputStream または Writer この応答への制御等 setHeaderなど writeなど setLocale,flushBufferなど 43 2002年6月 CRESC Corporation 日本語処理 HTTP要求からのパラメタ読み出し ブラウザは現在設定されたエンコーディン グを使ってHTTP要求を作成する String someValue = req.getParameterValue("someParameterName"); String correctSomeValue = new String(someValue.getBytes("8859_1"), "Shift_JIS"); TomcatコンテナはURLエンコードされた要求パラメタ(名前 も含む)を、ISO 8859_1とみなしてUnicodeに変換する。 所定の文字セットに変換するためには、いったんバイト列 に戻して所定の文字セットでStringを生成する 44 2002年6月 CRESC Corporation 日本語処理 HTTP要求ボディからのパラメタ読み出し ServletInputStream sis = request.getInputStream(); //バイト入力用ストリームを取得 byte[] bytes = new byte[1024]; //バイトの配列を用意する int len = (sis.readLine(bytes,0,1024)); //一行読み出し(URLには改行符号は入らない) String is=""; for (int i = 0; i < len; i++) { //これを文字列に変換(上8ビットはゼロ) is =is +(char)bytes[i]; } System.out.println("URL encoded byte string: " + is); URLDecoderは、SJIS の漢字をUnicodeにま で変換してくれる! String os = URLDecoder.decode(is); //String os = URLDecoder.decode(is, "Shift_JIS"); 2SDKのv1.4からはこち らを使用すること System.out.println("URL decoded body string: " + os ); 45 2002年6月 CRESC Corporation 日本語処理 URLエンコーディング URLエンコーディング は日頃皆さんが眼に している • 日本語のように2バイトの文字は1バイト毎にとりだしてASCII文字とみなして 以下の変換を行う。 • 名前と値にある「安全でない」文字は"%xx"に変換する。"xx"はその文字の ASCII値を16進表示したものである。「安全でない」文字には=, &, %, +やプ リントできない文字を含む。 • 全てのASCIIのスペース文字を+に変換する。 • 名前と値を=と&でつないでひとつの文字列にする。例えば name1=value1&name2=value2&name3=value3 46 2002年6月 CRESC Corporation 日本語処理 HTTP応答ヘッダとエンコーディング 出力したい 文字セット res.setContentType("text/html; charset=EUC-JP") res.setContentType("text/html; charset=Shift_JIS") res.setContentType("text/html; charset=ISO-2022-JP") コンテナにHTTP応答ヘッダにContent-Type:行を追加させ ることを指示すると共に、 JavaのUnicodeを所定の文字セットに変換した後、HTTPの エンコード(URLやMIME)に変換することの指示を行う 47 2002年6月 CRESC Corporation 日本語処理 HTMLにおける明示的指定 出力したい 文字セット <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS"> HTMLドキュメントのヘッダ部分で文字セットをブラウザに 明示的に指示することは良い習慣である ブラウザは指定された文字セットで表示し、且つHTTP応答 パケットを生成する 48 2002年6月 CRESC Corporation 日本語処理 JSPにおける文字コード指定法 出力したい 文字セット <%@ page contentType="text/html; charset=Shift_JIS" %> pageディレクティブでres.setContentType()と等価な機能を 宣言する(事実Tomcatはこのメソッドを使ったJava コードの行を追加する)。 前処理のサーブレットが既に文字コードを設定していれば この必要はない。 49 2002年6月 CRESC Corporation サーブレット・コンテナ コンテナ セッション管理 SingleThreadModel実装の複数のサーブレッ ト・インスタンスでもOK サーブレット バインドされたオブ ジェクト サーブレット HttpRequest HttpResponse イベント HttpResponse イベント サーブレット・エンジン HttpRequest HttpSessionのデータベース sessionsession session session session session session SessionIdつき要求 SessionId HashCode CreationTime LastAccessedTime MaxInactiveInterval UserName …. Attributes …… SessionIdつき応答• Cookie(エンジン) • URL(サーブレット) クライアント クライアント 50 2002年6月 CRESC Corporation サーブレット・コンテナ セッション管理 セッションはユーザとの対応をとる オブジェクトはセッションのデータとしてストアできる セッションはコンテナが管理する セッションの維持はcookieかURL再書き込みによる セッションの生成と取得 HTTPSession session = request.getSession(true); セッションへのオブジェクトの貼り付け Session.putValue(“MyName”, new SomeObject(…)); someObject myObject = (SomeObject)session.getValue(“MyName”); 51 2002年6月 CRESC Corporation スレッド安全 サーブレットには複数のスレッドが走る • 共有資源をアクセスすると競合が起きる • インスタンス変数は注意 • 同期メソッドによる排他処理 public synchronized String getResult(){…..} • 同期ブロックによる排他処理 synchronized (this){…….} PocketMoney で試してみよう • オブジェクトのロックによる排他処理 • セマフォによる排他処理 BusyFlag • デッドロックはJavaの範囲外 高度なアプリケーションではウオッチドッグなどの異常対策が必要 52 2002年6月 CRESC Corporation スレッド安全 オブジェクトのロックのメカニズム 同期化されたメソッドには複数のスレッドのアクセスが直列化されるが、その中 でwaitやsleepなどでスレッドが待機状態になったときは、次のスレッドはそこまで の進行が許される 同じオブジェクトの二つの同期化されたメソッド各々を、各々別のスレッドがアク セスしようとすると、二つのスレッド同士は同期化される 同じオブジェクトのひとつの同期化されたメソッドと同期化されていないメソッドを 各々別のスレッドがアクセスするときは、二つのスレッドは平行して進行する。 二つのスレッドが各々別のオブジェクトの同期化されたメソッドを呼ぶときは、二 つのスレッドは平行して進行する ただしスタテックなメソッド(クラス・メソッド)はオブジェクトではなくクラスとして上 記ルールが適用される。つまり上記ルールのオブジェクトをクラスと置き換える 53 2002年6月 CRESC Corporation サーブレット・コンテナ サーブレット・コンテキスト Servlet サーブレット・コン テキストはアプリ ケーションの環境 ServletConfig(構成) および ServletContext (コンテキスト) init(初期化) service(要求処理) destroy(終了) および getInitParameter(初期化パラメタ 取得) getServletContext(環境取得) ServletInfo(情報) 54 2002年6月 CRESC Corporation サーブレット・コンテナ サーブレット・コンテキスト URL URI http://www.cresc.co.jp:8080/catalog/lawn/index.html ContextPath server.xmlにて設定 ServletPath PathInfo web.xmlにて設定 55 2002年6月 CRESC Corporation サーブレット・コンテキスト Webアプリケーション アプリケーションはServletContextに1対1で対応 アプリケーション単位のWAR(Web Archive)ファイルはTomcat が起動時に展開してくれる web.xmlで設定が指定される Webアプリケーションの要素 ResturantCresc.war サーブレット JSP で試してみよう ユーティリティ・クラス 静的ドキュメント クライアント側に置かれるapplet、bean、class類 56 2002年6月 CRESC Corporation サーブレット・コンテキスト warファイルの自動展開 webappsの下に置いた RestaurantCresc.warは、 Tomcatが立ち上がるとき に展開してくれる 57 2002年6月 CRESC Corporation サーブレット・コンテキスト 到来要求とサーブレットとの対応付け マップのセットの例に適用される到来パス マップのセットの例 パス・パタン サーブレット /foo/bar/* servlet1 /baz/* servlet2 /catalog servlet3 *.bop servlet4 詳細は仕様書参照のこと 到来パス 要求を処理するサーブレット /foo/bar/index.html servlet1 /foo/bar/index.pop servlet1 /baz servlet2 /baz/index.html servlet2 /catalog servlet3 /catalog/index.html "default"のサーブレット /catalog/racecar.bop servlet4 /index.bop servlet4 58 2002年6月 CRESC Corporation サーブレット・コンテキスト RequestDispatcher 制御を他のサーブレット/JSPに移す、または他のサーブレット からの出力をインクルードする 他のサーブレットへのディスパッチャを取得する RequestDispatcher rd = getServletContext().getRequestDispatcher(“/servlet/MyServ”); 制御を他のサーブレットに移す rd.forward(request, response); (サーブレットはPrintWriterを未だ使っていないこと) 他のサーブレットからの出力をインクルードする PrintWriter out = response.getWriter(); out println(“……”); …..; out.flush(); rd.include(request, response); out println(“…..”); 59 2002年6月 CRESC Corporation サーブレットやJSP間の情報共有 エンジンが用意するオブジェクトを共有する サーブレット・コンテナが管理するオブジェクトのサーブレット間共有 public interface ServletRequest request.setAttribute(“name”, sharedObject); public interface HttpSession SharedObject sharedObject = (SharedObject)request.getAttribute(“name”); HttpSession session = request.getSession(true); session.setAttribute(“name”, sharedObject); public interface ServletContext SharedObject sharedObject = (SharedObject)session.getAttribute(“name”); ServletContext context = getServletContext(); context.setAttribute(“name”, sharedObject); SharedObject sharedObject = (SharedObject)context.getAttribute(“name”); 注:beanについてはJSPの項で説明 60 2002年6月 CRESC Corporation JSPのコンセプト ダイナミックなコンテント提供タスクの機能分離 bean JSP コンテント生成 コンテント表示 到来要求に基づく処理 ルック・アンド・フィール サーブレット HTTP プロトコル処理 HTTP要求 HTTP応答に 乗せたHTML 61 2002年6月 CRESC Corporation JSPのコンセプト JSPの呼び出し URLとして呼び出される http://www.cresc.co.jp/MyApplication/SomePage.jsp サーブレットが呼び出す getServletContxt().getRequestDispatcher(“/SomePage.jsp”).forward( request, response); HTMLページからの呼び出し <A HREF=“/SomePage.jsp”>リンク呼び出し</A> <FORM ACTION=“/SomePage.jsp” METHOD=“POST” ENCTYPE=“text /plain”>…..</FORM> 62 2002年6月 CRESC Corporation JSPの処理 JSPが呼び出されるとコンテナはサーブレットに 変換する 初めてそのJSPが呼ばれたと 他のサーブレットやJSP きはサーブレットに変換してこ れを実行する HTMLページ JSP呼出し get/post要求 JSPソース MyJsp.jsp 構文解析 MyJsp.java コンパイル MyJsp.class 次のページ インスタンス化 HTMLページ ブラウザ 実行 new MyJsp() サーブレット・コンテナ 63 2002年6月 CRESC Corporation JSPのインプリシットのオブジェクト コンテナが用意するオブジェクト オブジェクト request 内容 HttpServletRequest(HTTP要求のオブジェクト) request.getParameter("name") response HttpServletResponse(HTTP応答のオブジェクト) response.setContentType(".....") out javax.servlet.jsp.JspWriter (出力用PrintWriter) out.println("....html....") session HttpSession (指示しなければコンテナが作成してしまう) session.putValue("name", object) application ServletContext(情報共有などに使う) application.setAttribute("name", object) config pageContext page ServletConfig(初期設定などに使う) javax.servlet.jsp.PageContext(情報共有などに使う) this(使うことはない) 64 2002年6月 CRESC Corporation JSPのインプリシットのオブジェクト JspWriter GET /examples/jsp/StaticJspExample.jsp HTTP/1.1 host: localhost • JSP から jsp:include アクション (flush = “true”)によって別の JSP を 呼び出した • バッファが満杯になった。バッファが 満杯になると自動的にバッファをフ ラッシュする HTTP/1.1 200 OK Content-Type: text/html; charset=Shift_JIS Date: Wed, 03 Jul 2002 00:46:14 GMT • out オブジェクトの flush メソッドを呼 Transfer-Encoding: chunked び出した Server: Apache Tomcat/4.0.4-b3 (HTTP/1.1 Connector) Set-Cookie: JSESSIONID=7A6C675530A95AD517A46A8D978F2571;Path=/examples ea <HTML> <HEAD><TITLE>Static JSP Sample</TITLE> JspWriterはバッ <META HTTP-EQUIV="cache-control" CONTENT="no-cache"> ファで、flushしな <META HTTP-EQUIV="content-type" CONTENT="Shift_JIS"></HEAD> いかぎりチャンク <BODY><H1>静的JSPのサンプル</H1> がネットワークに Hello from 鈴木宗雄</BODY></HTML> 出て行かない 0 65 2002年6月 CRESC Corporation JSPの構文要素 JSPに書ける構文の4タイプ • 静的HTML(Static documents) • JSPのスクリプト要素(Scripting elements) • スクリプトレット、式、宣言 • JSPのディレクティブ(Directives、制御文) • ディレクティブ、制御文 • JSPのアクション(Actions) • include, forward, plugin, useBean, setPriority.... 66 2002年6月 CRESC Corporation JSPのタグ スクリプトレット、式 スクリプトレット(Scriptlets) <%.....%> ・javaコードのフラグメント <% if (count == 0) { %> <h3> いらっしゃいませ </h3> <% } else { %> <h3> お戻りですか </h3> <% } %> 式(Expressions) <%=.....%> ・Stringを返すjavaコードのフラグメント ・JavaBeanのプロパティ値 ・メソッド呼出しの結果 <%= count %> <%= getInfo() %> <%= myBean.getName() %> 67 2002年6月 CRESC Corporation JSPのタグ ディレクティブ、コメント、宣言 ディレクティブ(Directives) <%@.....%> (他のタグよりも前に置く) ・Pageディレクティブ <%@ page contentType="text/html; charset=Shift_JIS" %> ・includeディレクティブ <%@ include file="copyright.html" %> コメント(Comments) <%--.....%> <%-- このコメントはHTMLとしてブラウザに渡されない --%> <!--このコメントはHTMLのコメントだが<%= expression %>など含めても可 --> 宣言(Declarations) <%!.....%> ・あとでJSP内で使う変数やメソッドを宣言する <%! private int count = 0; private String getInfo(){ return "これは竹中プロジェクトのJSPです"; } 68 2002年6月 CRESC Corporation JSPのタグ アクション インクルード(Include) (このページが要求されたときに含めるべきファイル) <jsp:include page=“relative URL” flush=“true” /> 転送(Forward) (この要求を転送する) <jsp:include page=“relative URL” /> Beanの使用(useBean) (baenの使用を宣言) <jsp:useBean att=val* /> または <jsp:useBean att=val* /> ・・・・ </jsp:useBean> プロパティのセット/ゲット(setProperty/getProperty) <jsp:setProperty att=val* /> <jsp:getProperty name=“propertyName” value=“val” /> プラグイン(Plugin) (ブラウザでのアプレット) <jsp:plugin attribute="value"*> ...</jsp:plugin> 69 2002年6月 CRESC Corporation サーブレットとJSPの連携 サーブレット間と同じく相互呼出しができる URLによるJSP呼出し http://hostname/path..or..webapp/someFile.jsp JSPからサーブレットの呼出し <FORM method=post action="/servlet/pkg.SomeServlet"> <jsp: include page="/servlet/pkg.SomeServlet" /> <jsp: forward page="/servlet/pkg.SomeServlet" /> JSPからJSPの呼出し(サーブレット呼出しと同じ) <jsp: forward page="/servlet/pkg.SomeServlet" /> サーブレットからJSPの呼出し(よく使う、2通りあり) response.sendRedirect("/path/someFile.jsp"); getServletContext().getRequestDispatcher("/path/someFile.jsp").forward(request, response); 70 2002年6月 CRESC Corporation サーブレットとJSPの連携 Beanによる情報の共有 getServletContext().setAttribute(“Mybean”, Bean1 bean1); Request.getSession().setAttribute(“MyBean”, Bean1 bean1); FORM要求 Servlet Beanの用意 呼び出し Beanへのアクセス HTMLページ bean JSP <jsp: useBean id=“MyBean” class=“Bean1” scope=“application or session or..”> <jsp: getProperty name=“book1” property=“title” /> <%= book1.getTitle() %> 71 2002年6月 CRESC Corporation JSPを使った簡単なモデル ショッピング・バスケット 在庫.jsp 倉庫 ショッピング・ バスケットの ビーン 購入.jsp レシート.jsp レシートの ビーン HTTP応答 顧客対応のサーブレット サーブレット・コンテナ HTTP要求 72 2002年6月 CRESC Corporation JSPを使った簡単なモデル モデル図 制御を渡す 制御 ユーザ入力 状態の更新 モデル グラフィカル表示 ビュー 状態の取得 73 2002年6月 CRESC Corporation JSPの実習 RestaurantCrescの構成 TOMCAT_HOME conf server.xml tomcat-users.xml webapps common RestaurantCresc.war lib RestaurantCresc servlet.jar JSP Web-inf web.xml GetOrderPage.jsp ConfirmPage.jsp servlets RestaurantMaster.java CheckPage.jsp .... restaurant RestaurantChef.java RestaurantWaitress.java .... 74 2002年6月 CRESC Corporation JSPの実習 RestaurantCrescの構成 メニューはストックをコピーして作る RestaurantStock ストックの ビーン RestaurantMenu メニュー メニュー のビーン のビーン メニュー のビーン 今日の献立とストックを用意 オーダー受付 GetOrderPage.jsp 料理 ServePage.jsp メニュー のビーン 支払 CheckPage.jsp ストックから料理を取り出す 顧客ごとにメニューを用意 ・・・・・ 今日の献立の値段を設定 シェフ マスター RestaurantChef RestaurantMaster ウェイトレス ウェイトレス ウェイトレス RestaurantWaitress 顧客対応をする 75 2002年6月 CRESC Corporation JSPの実習 サーブレットのマッピング サーブレット名 クラス URLパタン Chef restaurant.RestaurantChef /Chef Master restaurant.RestaurantMaster /Master Waitress restaurant.RestaurantWaitress /Dinner ウェイトレス が窓口 web.xmlにはマスターの 認証もできるようになって いるので試されたい http://xxx.xxx.xxx.xxx:8080/RestaurantCresc/Master http://localhost:8080/RestaurantCresc/Master http://127.0.0.1:8080/RestaurantCresc/Master http://localhost:8080/RestaurantCresc/servlet/Master http://localhost:8080/RestaurantCresc/ ・・・・・・・ 76 2002年6月 CRESC Corporation JSPの実習 このアプリケーションをいじってみる 1. RestaurantCresc.warをTOMCAT_HOME\webappsのディ レクトリに置く 2. TOMCAT_HOME\binからstartupコマンドをかけTomcatを 開始させる 3. ブラウザをコンソール上に3つ並べ、シェフ・マスター・ ウェイトレスを順番に呼び出してその動作を確認する 4. JSPページを変更して、その結果をウェイトレスを使って 確認する 77 2002年6月 CRESC Corporation JSPの実習 秀丸による編集 JSPページの変更 ブラウザにウェイトレスを出しておくと修正 結果の確認に便利 78 2002年6月 CRESC Corporation JSPの実習 JSPに変更を加えたら http://localhost:8080/RestaurantCresc/jsp/xx xx.jspで呼び出す • ブラウザから直接変更を加え たこのファイルを呼び出す • もしコンパイルエラーがなけれ ば、必要なオブジェクトが用意 できていないので左のような エラー画面を出す • エラーがあれば、その情報 (ソースコードの場所と理由) をブラウザに返してくれる • jspの変更はTomcatのリスター トを必要としないが、javaソー スを変更した場合はコンパイ ルとリスタートが必要 79 2002年6月 CRESC Corporation JSPの実習 Javaソースコードに変更を加えたら 1. TOMCAT_HOME\binからshutdownコマンドでTomcatを終了させ る 2. TOMCAT_HOME\webapps\RestaurantCresc\Webinf\classes\restaurantにカレントディレクトリを移す 3. javac *.java で中のjavaファイルを一度にコンパイルする クラスパスの確認 (set classpath=c:\tomcat404b3\common\lib\server.jar) 4. またTOMCAT_HOME\binに移ってstartupコマンドでTomcatを開 始させ、変更の結果を確認する server.xml, web.xmlを変更したとき(tomcat-users.xmlはその 必要ない )もTomcatの再起動が必要 80 2002年6月 CRESC Corporation JSPの実習 GetOrderPage.jsp(1) <%-- ブラウザとコンテナに使う文字セットを指定 --%> <%@ page contentType="text/html; charset=Shift_JIS" %> <%-- sessionは使う --%> <%@ page session = "true" %> <%-- コンテナが持っていないライブラリはここで宣言 --%> <%@ page import = "java.util.*, restaurant.*" %> <%-- 次のような式はデバッグの時に便利 <% System.out.println("Point #1 passed"); %> --%> <%-- HTMLの最初に通常入れておくもの --%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional // EN"> <HTML> <HEAD><TITLE>Restaurant Waitress</TITLE> <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="-1"> </HEAD> 81 2002年6月 CRESC Corporation JSPの実習 GetOrderPage.jsp(2) sessionをベースにして、 menuという名前の RestaurantMenu型の オブジェクトを共有す ることの宣言 <%-- sessionを使ってRestaurantMenuのオブジェクトをmenuという名前で共有する --%> <jsp:useBean id="menu" scope="session" class="restaurant.RestaurantMenu" /> <% RestaurantStock menuList = menu.getMenuList(); actionのURLはrequest String[] numberString = request.getParameterValues("Number"); を介して渡されている %> <BR>メニューをどうぞ<BR> <FORM ACTION=" <%= (String)request.getAttribute("returnURL") %>" METHOD="POST"> <TABLE><TR><TH>本日のセレクション</TH><TH>値段</TH><TH>ご注文数</TH></TR> <% String[] keyArray = MenuList.getSortedKeys(); RestaurantMenuItem item; item for (int i=0; i < keyArray.length; i++){ item = MenuList.getItem(keyArray[i]); ・・・・・・・ item, stock, menuともにbeanになれる stockのコピーから menuList menu 82 2002年6月 CRESC Corporation JSPの実習 <security-constraint> マスターの認証 <web-resource-collection> <web-resource-name>Master Only Accessible Pages</webresource-name> <tomcat-users> <user name="tomcat" password="tomcat" roles="tomcat" /> <!-<url-pattern>/Master</url-pattern> --> <user password="tomcat" roles="role1" /> <!-- If you list http methods, only those methodsname="role1" are protected --> <user name="both" password="tomcat" roles="tomcat,role1" /> <http-method>GET</http-method> <user name="masajyuurou" password="iyashikei" <http-method>POST</http-method> roles="RestaurantOwners" /> </web-resource-collection> <auth-constraint> </tomcat-users> <!-- Define the context-relative URL(s) to be protected -- > <!-- Anyone with one of the listed roles may access this area --> <role-name>RestaurantOwners</role-name> TOMCAT_HOME\conf\tomcat-users.xml </auth-constraint> </security-constraint> <!-- Default login configuration uses BASIC authentication --> <!-<login-config> <auth-method>BASIC</auth-method> 注:エラーとログインのページは RestaurantCresc\HTMLs\security に含まれる <realm-name>Example Basic Authentication Area</realm-name> </login-config> webapps\RestaurantCresc\WEB-INF\web.xml --> 83 2002年6月 CRESC Corporation サーブレットのライフサイクル コンテナへのロードから削除まで メモリーへ のロード init() service( ) destroy() インスタン ス化と初 期化 サービス 運用 メモリから の削除 変更 自動再ロード 自動再ロードを有効にするか無効 とするかはserver.xmlで指定する 84 2002年6月 CRESC Corporation サーブレットのライフサイクル サーブレットの初期化 Public class MyServlet extends HttpServlet{ 初期化でなされるべきこと: スタティックな変数の設定 設定ファイルから初期化パ ラメタを取得 データベース接続の取得 protected String myDriver; …….. Public void init(ServletConfig config) throwsServletException{ super.init(config); myDriver = config.getInitParameter(“driver”); myURL = config.getInitParameter(“URL”); myUserName = .... config.getInitParameter(“userID”); } ….. 85
© Copyright 2025 ExpyDoc