サーブレット・JSPコース

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