1 © Marty Hall, http://www.coreservlets.com
Java
サーバサイド
サーバサイド
サーバサイド
サーバサイド
特別技術セミナー
特別技術セミナー
特別技術セミナー
特別技術セミナー
【
【
【
【
JSP
】
】
】
】
Marty Hall
coreservlets.com, Inc.
CasaReal, Inc.
http://www.casareal.co.jp
Agenda
•
なぜ
なぜ
なぜ
なぜ
JSP
が必要なのか
が必要なのか
が必要なのか
が必要なのか
•
JSP
が動く仕組み
が動く仕組み
が動く仕組み
が動く仕組み
•
JSP
の利点
の利点
の利点
の利点
•
JSP
からの
からの
からの
からの
Java
コードの呼び出し
コードの呼び出し
コードの呼び出し
コードの呼び出し
•
JSP
から生成されるサーブレットの管理
から生成されるサーブレットの管理
から生成されるサーブレットの管理
から生成されるサーブレットの管理
•
ファイルのインクルード
ファイルのインクルード
ファイルのインクルード
ファイルのインクルード
•
JavaBeans
の使用
の使用
の使用
の使用
JSP 特別講座
3 www.coreservlets.com
なぜ
なぜ
なぜ
なぜ
JSP
が必要か
が必要か
が必要か
が必要か
The Need for JSP•
サーブレットを使用すると以下の事が簡単
サーブレットを使用すると以下の事が簡単
サーブレットを使用すると以下の事が簡単
サーブレットを使用すると以下の事が簡単
–
Form
データの読み込み
–
HTTP
リクエストヘッダの読み込み
–
HTTP
ステータスコードとレスポンスヘッダの設定
–
クッキーとセッション管理の使用
–
サーブレット間でのデータ共有
–
リクエスト間のデータの記憶
•
しかし、以下のことは非常に面倒
しかし、以下のことは非常に面倒
しかし、以下のことは非常に面倒
しかし、以下のことは非常に面倒
–
HTML
を生成における
println
の使用
–
HTML
の保守
www.coreservlets.com
JSP
フレームワーク
フレームワーク
フレームワーク
フレームワーク
The JSP Framework
•
アイデア
アイデア
アイデア
アイデア
:
–
ページのほとんどで普通の
HTML
を使用
–
サーブレット・コードのみ特別タグで記述
–
JSP
ページ全体が
1
度だけサーブレットに変換され、
実際にリクエスト毎に実行されるのはそのサーブレ
ット
•
例
例
例
例
:
–
JSP
•
Thanks for ordering
<I><%= request.getParameter("title") %></I>
–
URL
•
http://host/OrderConfirmation.jsp
?title=Core+Web+Programming
–
結果
JSP 特別講座
5 www.coreservlets.com
JSP
の利点
の利点
の利点
の利点
Benefits of JSP
•
技術的に
技術的に
技術的に
技術的に
JSP
は、サーブレットができないこ
は、サーブレットができないこ
は、サーブレットができないこ
は、サーブレットができないこ
とはできない。しかし、
とはできない。しかし、
とはできない。しかし、
とはできない。しかし、
JSP
は以下のことを簡
は以下のことを簡
は以下のことを簡
は以下のことを簡
単にする。
単にする。
単にする。
単にする。
:
–
HTML
の記述
–
HTML
の読み込み、保守
•
JSP
は次のことを可能にする
は次のことを可能にする
は次のことを可能にする
は次のことを可能にする
:
–
Allaire HomeSite
、
Macromedia DreamWeaver
、
Adobe
GoLive
などの標準的な
HTML
ツールの使用
.
–
HTML
のレイアウトとプログラミングの分担
•
JSP
は以下のことを推奨する:
は以下のことを推奨する:
は以下のことを推奨する:
は以下のことを推奨する:
–
内容を作るコード(
Java
)と見せるコード(
HTML
)の分離
競合テクノロジーに対する
競合テクノロジーに対する
競合テクノロジーに対する
競合テクノロジーに対する
JSP の優位性
の優位性
の優位性
の優位性
Advantages of JSP Over Competing Technologies
•
ASP
または
または
または
または
ColdFusion
と比べて
と比べて
と比べて
と比べて
–
動的部分の言語が優れている
–
様々なサーバ、オペレーティング・システムに対し
て
可搬性がある
•
PHP
と比べて
と比べて
と比べて
と比べて
–
動的部分の言語が優れている
–
ツールのサポートが優れている
•
サーブレット単体利用と比べて
サーブレット単体利用と比べて
サーブレット単体利用と比べて
サーブレット単体利用と比べて
–
HTML
の生成が簡単
JSP 特別講座
7 www.coreservlets.com
JSP
の優位性(続き)
の優位性(続き)
の優位性(続き)
の優位性(続き)
Advantages of JSP (Continued)
•
Velocity
や、
や、
や、
や、
WebMacro
と比べて
と比べて
と比べて
と比べて
–
標準技術
•
ブラウザ内のクライアントサイド
ブラウザ内のクライアントサイド
ブラウザ内のクライアントサイド
ブラウザ内のクライアントサイド
JavaScript
と比べて
と比べて
と比べて
と比べて
–
JSP
の能力とほとんど重複しないが、
• クライアントではなく、サーバを管理する
• 豊富な言語
•
サーバサイド
サーバサイド
サーバサイド
サーバサイド
JavaScript
と比べて
と比べて
と比べて
と比べて
(
例
例
例
例
LiveWire
、
、
、
、
BroadVision
、
、
、
、
JRun)
–
豊富な言語
•
静的
静的
静的
静的
HTML
に対して
に対して
に対して
に対して
–
動的機能
–
動的な表現は“全部か全くなし”だけではなくなった。(静
的部分を残してほんの一部を動的に表現する事が可能となっ
た)
www.coreservlets.com
環境の設定
環境の設定
環境の設定
環境の設定
Setting Up Your Environment
以下設定は不要
以下設定は不要
以下設定は不要
以下設定は不要
•
CLASSPATH
の設定
の設定
の設定
の設定
•
コードのコンパイル
コードのコンパイル
コードのコンパイル
コードのコンパイル
•
名称の衝突を避けるためのパッケージ名の使用
名称の衝突を避けるためのパッケージ名の使用
名称の衝突を避けるためのパッケージ名の使用
名称の衝突を避けるためのパッケージ名の使用
•
特別なディレクトリへの
特別なディレクトリへの
特別なディレクトリへの
特別なディレクトリへの
JSP
ページの配置
ページの配置
ページの配置
ページの配置
–
install_dir
\webapps\ROOT\ (HTML
and
JSP -- Tomcat)
install_dir
\servers\default\default-app (JRun)
–
サーバによっては
JSP
ページ用の
Web
階層を用意しているも
のもある。ただし、
Tomcat
3、スタンドアロンの
Jrun
には
ない。
•
JSP
ページを動かすための特別な
ページを動かすための特別な
ページを動かすための特別な
ページを動かすための特別な
URL
の使用
の使用
の使用
の使用
•
注意
注意
注意
注意
–
JSP
ページによって使用される通常の
Java
クラスでは、
CLASSPATH
、インストール・ディレクトリ等の規則は当て
JSP 特別講座
9 www.coreservlets.com
例
例
例
例
Example<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML>
<HEAD>
<TITLE>JSP Expressions</TITLE>
<META NAME="author" CONTENT="Marty Hall"> <META NAME="keywords"
CONTENT="JSP,expressions,JavaServer,Pages,servlets"> <META NAME="description"
CONTENT="A quick example of JSP expressions."> <LINK REL=STYLESHEET
HREF="JSP-Styles.css" TYPE="text/css">
</HEAD>
例(続き)
例(続き)
例(続き)
例(続き)
Example (Continued)<BODY>
<H2>JSP Expressions</H2>
<UL>
<LI>Current time: <%= new java.util.Date() %>
<LI>Your hostname: <%= request.getRemoteHost() %>
<LI>Your session ID: <%= session.getId() %>
<LI>The <CODE>testParam</CODE> form parameter:
<%= request.getParameter("testParam") %>
</UL>
JSP 特別講座
11 www.coreservlets.com
例(結果)
例(結果)
例(結果)
例(結果)
Example Result•
配置場所が以下である場合
配置場所が以下である場合
配置場所が以下である場合
配置場所が以下である場合
–
C:\jakarta-tomcat-4.0\webapps\ROOT\Expressions.jsp
または
–
C:\Program Files\Allaire\JRun\servers\default\
default-app\Expressions.jsp
•
URL
は以下のようになる
は以下のようになる
は以下のようになる
は以下のようになる
–
http://localhost/Expressions.jsp
www.coreservlets.com
一番多い勘違い:
一番多い勘違い:
一番多い勘違い:
一番多い勘違い:
JSP
がサーバサイド技術であることを忘れ
がサーバサイド技術であることを忘れ
がサーバサイド技術であることを忘れ
がサーバサイド技術であることを忘れ
る
る
る
る
Most Common Misunderstanding::::Forgetting JSP is Server-Side Technology
•
良くある質問
良くある質問
良くある質問
良くある質問
–
HTML
でコレコレができないが、
JSP
ならできる?
•
なぜこの質問は意味がないのか?
なぜこの質問は意味がないのか?
なぜこの質問は意味がないのか?
なぜこの質問は意味がないのか?
–
JSP
は完全にサーバ上で動作する
–
クライアント
(
ブラウザ
)
で扱えるコンテンツを返るわけでは
ない
•
同じような質問
同じような質問
同じような質問
同じような質問
–
どうやって通常のアプレットを
JSP
ページに入れるのか?
答え
:
クライントに
<APPLET…>
タグを送信する
–
どうやって
JSP
ページに画像を入れるのか?
答え
:
クライアントに
<IMG …>
タグを送信する
–
JavaScript
、
Acrobat
、
Shockwave
などをどうやって使うか?
JSP 特別講座
13 www.coreservlets.com
2
番目に多い勘違い:
番目に多い勘違い:
番目に多い勘違い:
番目に多い勘違い:
サーブレットへの変換
サーブレットへの変換
サーブレットへの変換
サーブレットへの変換
/
リクエスト時の混同
リクエスト時の混同
リクエスト時の混同
リクエスト時の混同
2nd Most Common Misunderstanding::::Translation/Request Time Confusion
•
JSP
ページからサーブレットへの変換時にページは
ページからサーブレットへの変換時にページは
ページからサーブレットへの変換時にページは
ページからサーブレットへの変換時にページは
どうなっているのか?
どうなっているのか?
どうなっているのか?
どうなっているのか?
–
JSP
構造はサーブレットコードに変換される
•
リクエスト時に何が起こるのか?
リクエスト時に何が起こるのか?
リクエスト時に何が起こるのか?
リクエスト時に何が起こるのか?
–
サーブレットコードが実行される。リクエスト時に
JSP
の変
換は行われない。リクエスト時にオリジナルの
JSP
ページは
完全に無視される。つまり、変換結果のサーブレットのみが
使用される。
•
JSP
ページからサーブレットへの変換は
ページからサーブレットへの変換は
ページからサーブレットへの変換は
ページからサーブレットへの変換は
いつ行われるか?
いつ行われるか?
いつ行われるか?
いつ行われるか?
–
典型的には、変更後に
JSP
ページが初めてアクセスされた時
。実際にはインストール時にデベロッパーが全ての
JSP
ペー
ジをテストしているので、実ユーザからのアクセス時に変換
されることがあってはならない。
–
ページ変換はリクエスト毎には行われない。
JSP
のライフサイクル
のライフサイクル
のライフサイクル
のライフサイクル
The JSP LifecycleYes Yes Yes Yes Yes Yes
doGet ((((またはまたはまたはまたは 同等の
同等の同等の
同等の) 呼び出し呼び出し呼び出し呼び出し
No Yes No Yes No Yes
init (または同等または同等または同等または同等 の
のの
の) 呼び出し呼び出し呼び出し呼び出し
No Yes No Yes No Yes
サーブレット サーブレットサーブレット サーブレット のののの インスタンス化 インスタンス化インスタンス化 インスタンス化 およびサーバの およびサーバのおよびサーバの およびサーバの メモリへのロー メモリへのローメモリへのロー メモリへのロー ド
ドド ド
No Yes No No No Yes
サーブレットの サーブレットのサーブレットの サーブレットの コンパイル終了 コンパイル終了コンパイル終了 コンパイル終了
No Yes No No No Yes
JSP ページがページがページがページが サーブレットに サーブレットにサーブレットに サーブレットに 変換
変換変換 変換
Request #6 Request
#5
ペ
ー
ジ
の
変
更
ペ
ー
ジ
の
変
更
ペ
ー
ジ
の
変
更
ペ
ー
ジ
の
変
更
Request #4 Request
#3
サ
ー
バ
再
起
動
サ
ー
バ
再
起
動
サ
ー
バ
再
起
動
サ
ー
バ
再
起
動
Request #2 Request
#1
ペ
ー
ジ
を
始
め
て
記
述
ペ
ー
ジ
を
始
め
て
記
述
ペ
ー
ジ
を
始
め
て
記
述
ペ
ー
ジ
を
始
め
て
記
JSP 特別講座
15 www.coreservlets.com
JSP/
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
JSP/Servlets in the Real World•
ofoto.com:
デジタル写真と
デジタル写真と
デジタル写真と
デジタル写真と
フィルム写真の
フィルム写真の
フィルム写真の
フィルム写真の
印刷と管理
印刷と管理
印刷と管理
印刷と管理
www.coreservlets.com
JSP/
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
JSP/Servlets in the Real World•
First USA Bank:
世界最大のクレジットカード発行元
世界最大のクレジットカード発行元
世界最大のクレジットカード発行元
世界最大のクレジットカード発行元
JSP 特別講座
17 www.coreservlets.com
JSP/
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
JSP/Servlets in the Real World•
デルタ航空
デルタ航空
デルタ航空
デルタ航空
: Web
サイト全体(リアルタイムなスケジ
サイト全体(リアルタイムなスケジ
サイト全体(リアルタイムなスケジ
サイト全体(リアルタイムなスケジ
ュール情報も含む)
ュール情報も含む)
ュール情報も含む)
ュール情報も含む)
JSP/
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
JSP/Servlets in the Real World•
American Century Investments: 200
万人の投資家を
万人の投資家を
万人の投資家を
万人の投資家を
持ち、
持ち、
持ち、
持ち、
900
億ドルの管理する
億ドルの管理する70
億ドルの管理する
億ドルの管理する
70
70
70以上のミューチュア
以上のミューチュア
以上のミューチュア
以上のミューチュア
JSP 特別講座
19 www.coreservlets.com
JSP/
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
サーブレットの実際の使用例
JSP/Servlets in the Real World•
Excite:
インターネット・ポータルのトップ5の一つ
インターネット・ポータルのトップ5の一つ
インターネット・ポータルのトップ5の一つ
インターネット・ポータルのトップ5の一つ
(インターネットで最も混雑しているサイトのトップ
(インターネットで最も混雑しているサイトのトップ
(インターネットで最も混雑しているサイトのトップ
(インターネットで最も混雑しているサイトのトップ
10に入る)
10に入る)
10に入る)
10に入る)
© Marty Hall, http://www.coreservlets.com
JSP
スクリプト要素
スクリプト要素
スクリプト要素
スクリプト要素
JSP 特別講座
21 www.coreservlets.com
JSP
構成の使い方
構成の使い方
構成の使い方
構成の使い方
Uses of JSP Constructs
•
スクリプト要素が直接サーブレットコー
スクリプト要素が直接サーブレットコー
スクリプト要素が直接サーブレットコー
スクリプト要素が直接サーブレットコー
ドを
ドを
ドを
ドを
呼ぶ
呼ぶ
呼ぶ
呼ぶ
•
スクリプト要素がサーブレットコードを
スクリプト要素がサーブレットコードを
スクリプト要素がサーブレットコードを
スクリプト要素がサーブレットコードを
間接的に呼ぶ
間接的に呼ぶ
間接的に呼ぶ
間接的に呼ぶ
(ユーティリティークラスを通して)
(ユーティリティークラスを通して)
(ユーティリティークラスを通して)
(ユーティリティークラスを通して)
•
Beans
•
カスタムタグ
カスタムタグ
カスタムタグ
カスタムタグ
•
Bean
もしくはカスタムタグを含む
もしくはカスタムタグを含む
もしくはカスタムタグを含む
もしくはカスタムタグを含む
サーブレット
サーブレット
サーブレット
サーブレット
/JSP
の組み合わせ
の組み合わせ
の組み合わせ
の組み合わせ
(MVC)
単純な 単純な 単純な 単純な アプリケーション アプリケーション アプリケーション アプリケーション
複雑な 複雑な複雑な 複雑な アプリケーション アプリケーション アプリケーション アプリケーション
設計のストラテジー:
設計のストラテジー:
設計のストラテジー:
設計のストラテジー:
JSP
ページ内の
ページ内の
ページ内の
ページ内の
Java
コードを制限す
コードを制限す
コードを制限す
コードを制限す
る
る
る
る
Design Strategy: Limit Java Code in JSP Pages
•
2
2
2
2つのオプション
つのオプション
つのオプション
つのオプション
–
JSP
ページに直接
25
行の
Java
コードを記述する
–
25
行の
Java
コードを別の
Java
クラスに記述し、
JSP
ページに
はそのクラスを起動する
1
行を記述する
•
なぜ
なぜ
なぜ
なぜ
2
番目のオプションの方が良いのか?
番目のオプションの方が良いのか?
番目のオプションの方が良いのか?
番目のオプションの方が良いのか?
–
開発:
開発:
開発:
開発:
HTML
環境ではなく、
Java
環境 (エディタや
IDE
)で
別のクラスを記述する
–
デバッグ:
デバッグ: 構文が間違っていれば、コンパイル時に判明する
デバッグ:
デバッグ:
。
簡単な
文で確認可能
–
テスト:
テスト:
テスト:
テスト:
1
万回のテストをするループのテストルーチンを記
述し、
JSP 特別講座
23 www.coreservlets.com
JSP
式
式
式
式
JSP Expressions
•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%=
Java Expression
%>
•
結果
結果
結果
結果
–
式が評価され、文字列に変換され、
JSP
ページ内で発生した
場所で
HTML
ページに配置される
–
つまり、
out.print
内の
_jspService
に配置された式
•
例
例
例
例
–
現在時間
: <%= new java.util.Date() %>
–
ホスト名
: <%= request.getRemoteHost() %>
•
XML-
対応の構文
対応の構文
対応の構文
対応の構文
–
<jsp:expression>
Java Expression
</jsp:expression>
–
Tomcat
3 では
XML
バージョンはサポートされていない。
JSP 1.2
サーバ以前では、サーバはサポートする必要がなかっ
た。
一つのページに異なるバージョンを混用することはできない
。
JSP 特別講座
24 www.coreservlets.com
JSP
と
と サーブレットの対応
と
と
サーブレットの対応
サーブレットの対応
サーブレットの対応
JSP/Servlet Correspondence
•
オリジナル
オリジナル
オリジナル
オリジナル
JSP
<H1>A Random Number</H1>
<%= Math.random() %>
•
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
例
例
例
例
public void _jspService(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession(true); JspWriter out = response.getWriter();
out.println("<H1>A Random Number</H1>");
out.println(Math.random());
...
JSP 特別講座
25 www.coreservlets.com
JSP
式の使用例
式の使用例
式の使用例
式の使用例
Example Using JSP Expressions
<BODY>
<H2>JSP Expressions</H2> <UL>
<LI>Current time: <%= new java.util.Date() %> <LI>Your hostname: <%= request.getRemoteHost() %> <LI>Your session ID: <%= session.getId() %>
<LI>The <CODE>testParam</CODE> form parameter: <%= request.getParameter("testParam") %> </UL>
</BODY>
定義済み定数
定義済み定数
定義済み定数
定義済み定数
Predefined Variables•
request
–
リクエストを表す
HttpServletRequest (service/doGet
の第
1
引数
)
•
response
–
レスポンスを表す
HttpServletResponse (service/doGet
の第
2
引
数
)
•
out
–
出力をクライアントに送る
Writer
(
JspWriter
タイプのバッファバージョン)
•
session
–
リクエストに関連付けられている
HttpSession
(ただし、ペー
JSP 特別講座
27 www.coreservlets.com
JSP
スクリプレット
スクリプレット
スクリプレット
スクリプレット
JSP Scriptlets
•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%
Java Code
%>
•
結果
結果
結果
結果
–
Java
コード がサーブレットの
_jspService
に挿入され
る
•
例
例
例
例
–
<%
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData);
%>
–
<% response.setContentType("text/plain"); %>
•
XML
対応の構文
対応の構文
対応の構文
対応の構文
–
<jsp:scriptlet>
Java Code
</jsp:scriptlet>
JSP 特別講座
28 www.coreservlets.com
JSP
とサーブレットの対応
とサーブレットの対応
とサーブレットの対応
とサーブレットの対応
JSP/Servlet Correspondence
•
オリジナル
オリジナル
オリジナル
オリジナル
JSP
<%= foo() %>
<% bar(); %>
•
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
例
例
例
例
public void _jspService(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession(true); JspWriter out = response.getWriter();
out.println(foo());
bar();
...
JSP 特別講座
29 www.coreservlets.com
JSP
スクリプレットの使用例
スクリプレットの使用例
スクリプレットの使用例
スクリプレットの使用例
Example Using JSP Scriptlets
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML>
<HEAD>
<TITLE>Color Testing</TITLE>
</HEAD>
<%
String bgColor = request.getParameter("bgColor"); boolean hasExplicitColor;
if (bgColor != null) { hasExplicitColor = true; } else {
hasExplicitColor = false; bgColor = "WHITE";
} %>
JSP
スクリプレットの使用例(続
スクリプレットの使用例(続
スクリプレットの使用例(続
スクリプレットの使用例(続
き)
き)
き)
き)
Example Using JSP Scriptlets (Continued) <BODY BGCOLOR="<%= bgColor %>">
<H2 ALIGN="CENTER">Color Testing</H2>
<%
if (hasExplicitColor) { …
} else { …
} %>
</BODY>
JSP 特別講座
31 www.coreservlets.com
JSP
スクリプレット:結果
スクリプレット:結果
スクリプレット:結果
スクリプレット:結果
JSP Scriptlets: Results
JSP 特別講座
32 www.coreservlets.com
スクリプレットを使用して、
スクリプレットを使用して、
スクリプレットを使用して、
スクリプレットを使用して、
JSP
ファイルの一部を条件つきにする
ファイルの一部を条件つきにする
ファイルの一部を条件つきにする
ファイルの一部を条件つきにする
Using Scriptlets to Make Parts of the JSP File Conditional•
ポイント
ポイント
ポイント
ポイント
–
スクリプレットは、記述のとおりサーブレットに
挿入される
–
完全な
Java
の表現である必要はない
–
ただし、完全な表現であれば、判りやすく、保守が
楽
•
例
例
例
例
– <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day! <% } %>
•
変換された結果
変換された結果
変換された結果
変換された結果
– if (Math.random() < 0.5) {
out.println("Have a <B>nice</B> day!");
} else {
out.println("Have a <B>lousy</B> day!");
JSP 特別講座
33 www.coreservlets.com
JSP
宣言
宣言
宣言
宣言
JSP Declarations
•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%!
Java Code
%>
•
結果
結果
結果
結果
–
サーブレットのクラス定義にコードが書き込まれる。
既存のメソッド外。
•
例
例
例
例
–
<%! private int someField = 5; %>
–
<%! private void someMethod(...) {...} %>
•
設計の考慮
設計の考慮
設計の考慮
設計の考慮
–
フィールドは明らかに便利。メソッドは通常別の
Java
クラス
の中で定義する方が良い。
•
XML-
対応の構文
対応の構文
対応の構文
対応の構文
–
<jsp:declaration>
Java Code
</jsp:declaration>
JSP
とサーブレットの対応
とサーブレットの対応
とサーブレットの対応
とサーブレットの対応
JSP/Servlet Correspondence•
オリジナル
オリジナル
オリジナル
オリジナル
JSP
<H1>Some Heading</H1>
<%!
private String randomHeading() {
return(
"
<H2>
"
+ Math.random() +
"
</H2>
"
);
}
%>
JSP 特別講座
35 www.coreservlets.com
JSP
とサーブレットの対応
とサーブレットの対応
とサーブレットの対応
とサーブレットの対応
JSP/Servlet Correspondence
•
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
結果として生成されるサーブレットコードの一
例
例
例
例
public class xxxx implements HttpJspPage {
private String randomHeading() {
return("<H2>" + Math.random() + "</H2>"); }
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession(true); JspWriter out = response.getWriter();
out.println("<H1>Some Heading</H1>");
out.println(randomHeading());
... } ... }
www.coreservlets.com
JSP
宣言の使用例
宣言の使用例
宣言の使用例
宣言の使用例
Example Using JSP Declarations<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>JSP Declarations</TITLE>
<LINK REL=STYLESHEET
HREF="JSP-Styles.css" TYPE="text/css">
</HEAD>
<BODY>
<H1>JSP Declarations</H1>
<%! private int accessCount = 0; %>
<H2>Accesses to page since server reboot:
<%= ++accessCount %></H2>
JSP 特別講座
37 www.coreservlets.com
JSP
宣言:結果
宣言:結果
宣言:結果
宣言:結果
JSP Declarations: Result
•
任意の異なるクライアントが計
任意の異なるクライアントが計
任意の異なるクライアントが計
任意の異なるクライアントが計
15
回訪問した後
回訪問した後
回訪問した後
回訪問した後
JSP page
ディレクティブ:
ディレクティブ:
ディレクティブ:
ディレクティブ:
生成されるサーブレットの
生成されるサーブレットの
生成されるサーブレットの
生成されるサーブレットの
構造を指定する
構造を指定する
構造を指定する
構造を指定する
JSP 特別講座
39 www.coreservlets.com
インポート属性
インポート属性
インポート属性
インポート属性
The import Attribute•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%@ page import="package.class" %>
–
<%@ page import="package.class1,...,package.classN" %>
•
目的
目的
目的
目的
–
サーブレット定義の先頭にインポート文を生成する
•
注意
注意
注意
注意
–
JSP
ページはサーバのどこにでも配置できるが、
JSP
ページが使用するクラスは通常のサーブレットのデ
ィレクトリに配置する必要がある。
–
Tomcat
の場合、如何に配置する:
install_dir\webapps\ROOT\WEB-INF\classes or
...\ROOT\WEB-INF\classes\directoryMatchingPackage
• JSP が使用するユーティリティなどは、パッケージにいれる!
www.coreservlets.com
インポート属性の例
インポート属性の例
インポート属性の例
インポート属性の例
Example of import Attribute...
<BODY>
<H2>The import Attribute</H2> <%-- JSP page directive --%>
<%@ page import="java.util.*,coreservlets.*" %>
<%-- JSP Declaration --%> <%!
private String randomID() {
int num = (int)(Math.random()*10000000.0); return("id" + num);
}
JSP 特別講座
41 www.coreservlets.com
インポート属性の例(続き)
インポート属性の例(続き)
インポート属性の例(続き)
インポート属性の例(続き)
Example of import Attribute (cont)<%-- JSP Scriptlet --%> <%
Cookie[] cookies = request.getCookies(); String oldID =
ServletUtilities.getCookieValue(cookies, "userID", NO_VALUE); String newID;
if (oldID.equals(NO_VALUE)) { newID = randomID();
} else {
newID = oldID; }
LongLivedCookie cookie = new LongLivedCookie("userID", newID); response.addCookie(cookie);
%>
<%-- JSP Expressions --%>
This page was accessed at <%= new Date() %> with a userID cookie of <%= oldID %>.
</BODY></HTML>
インポート属性の例:結果
インポート属性の例:結果
インポート属性の例:結果
インポート属性の例:結果
Example of import Attribute: Result•
最初のアクセス
最初のアクセス
最初のアクセス
最初のアクセス
JSP 特別講座
43 www.coreservlets.com
contentType
属性
属性
属性
属性
The contentType Attribute
•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%@ page contentType="MIME-Type" %>
–
<%@ page contentType="MIME-Type;
charset=Character-Set" %>
•
目的
目的
目的
目的
–
JSP
ページの結果のサーブレットから生成されるペ
ージの
MIME
タイプを指定する
•
注意
注意
注意
注意
–
属性値をリクエスト時に処理できない
–
レスポンスヘッダ セクションの
「良く使われる
MIME
タイプの表」を参照
www.coreservlets.com
contentType
を使用してテキスト・
を使用してテキスト・
を使用してテキスト・
を使用してテキスト・
ドキュメントを生成する
ドキュメントを生成する
ドキュメントを生成する
ドキュメントを生成する
Using contentType to Generate Plain Text Documents
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML> <HEAD>
<TITLE>The contentType Attribute</TITLE>
</HEAD> <BODY>
<H2>The contentType Attribute</H2>
<%@ page contentType="text/plain" %>
This should be rendered as plain text, <B>not</B> as HTML.
</BODY>
JSP 特別講座
45 www.coreservlets.com
ネットスケープ内のテキスト・ドキ
ネットスケープ内のテキスト・ドキ
ネットスケープ内のテキスト・ドキ
ネットスケープ内のテキスト・ドキ
ュメント
ュメント
ュメント
ュメント
Plain Text Documents in Netscape
Excel
スプレッドシートを生成す
スプレッドシートを生成す
スプレッドシートを生成す
スプレッドシートを生成す
る
る
る
る
Generating Excel Spreadsheets<%@ page contentType="application/vnd.ms-excel" %>
<%-- Note that there are tabs,
not spaces, between columns. --%>
1997 1998 1999 2000 2001 (Anticipated)
JSP 特別講座
47 www.coreservlets.com
条件付きで
条件付きで
条件付きで
条件付きで
Excel
スプレッドシート
スプレッドシート
スプレッドシート
スプレッドシート
を生成する
を生成する
を生成する
を生成する
Generating Excel Spreadsheets Conditionally
•
Excel
は
は
は
は
HTML
の表を解釈できる
の表を解釈できる
の表を解釈できる
の表を解釈できる
–
リクエストパラメータに基づいて
MIME
タイプを変
更
•
page
ディレクティブは使用不可
ディレクティブは使用不可
ディレクティブは使用不可
ディレクティブは使用不可
–
リクエスト時の値を使用しない
•
ソリューション
ソリューション
ソリューション
ソリューション
–
定義済みのリクエスト変数を使用し、
setContentType
を呼ぶ
<%
if (someCondition) {
response.setContentType("type1");
} else {
response.setContentType("type2");
}
%>
www.coreservlets.com
条件付きで
条件付きで
条件付きで
条件付きで
Excel
スプレッドシー
スプレッドシー
スプレッドシー
スプレッドシー
トを生成する
トを生成する
トを生成する
トを生成する
Generating Excel Spreadsheets Conditionally
<%
String format = request.getParameter("format");
if ((format != null) && (format.equals("excel"))) { response.setContentType("application/vnd.ms-excel"); }
%>
<!DOCTYPE ...> <HTML><HEAD>
<TITLE>Comparing Apples and Oranges</TITLE> <LINK REL=STYLESHEET
HREF="JSP-Styles.css"
TYPE="text/css"> </HEAD>
<BODY> <CENTER>
JSP 特別講座
49 www.coreservlets.com
条件付きで
条件付きで
条件付きで
条件付きで
Excel
スプレッドシー
スプレッドシー
スプレッドシー
スプレッドシー
トを生成する(続き)
トを生成する(続き)
トを生成する(続き)
トを生成する(続き)
Generating Excel Spreadsheets Conditionally (Continued)
<TABLE BORDER=1>
<TR><TH></TH><TH>Apples<TH>Oranges
<TR><TH>First Quarter<TD>2307<TD>4706 <TR><TH>Second Quarter<TD>2982<TD>5104
<TR><TH>Third Quarter<TD>3011<TD>5220 <TR><TH>Fourth Quarter<TD>3055<TD>5287
</TABLE>
</CENTER>
</BODY> </HTML>
Apples
と
と
と
と
Orages
:
:
:
:デフォルト
デフォルト
デフォルト
デフォルト
結果
結果
結果
結果
JSP 特別講座
51 www.coreservlets.com
Apples
と
と
と
と
Orages
:
:
:
:
フォーマット
フォーマット
フォーマット
フォーマット
= Excel
の結果
の結果
の結果
の結果
Apples and Oranges: Result with format=excel
www.coreservlets.com
isThreadSafe
属性
属性
属性
属性
The isThreadSafe Attribute•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%@ page isThreadSafe="true" %> <%-- Default --%>
–
<%@ page isThreadSafe="false" %>
•
目的
目的
目的
目的
–
コードがスレッドセーフでないことをシステムに伝え、同時
アクセスを防ぐ
•
注意
注意
注意
注意
–
デフォルトは
true
:システムはフィールドと他の共有データ
に対する処理の同期が取れていることを前提とする
–
値を
false
にすると、パフォーマンスが低下する場合がある
–
シリアルにサーブレットクラスが呼ばれている限り、システ
ムは複数のインスタンスを作ることができる。
JSP 特別講座
53 www.coreservlets.com
スレッドセーフではないコードの例
スレッドセーフではないコードの例
スレッドセーフではないコードの例
スレッドセーフではないコードの例
(
(
(
(
ID
はユニークである必要がある)
はユニークである必要がある)
はユニークである必要がある)
はユニークである必要がある)
Example of Non-Threadsafe Code (IDs Must Be Unique)
•
このコードのどこがいけないのか
このコードのどこがいけないのか
このコードのどこがいけないのか
このコードのどこがいけないのか
?
<%! private int idNum = 0; %>
<%
String userID = "userID" + idNum;
out.println("Your ID is " + userID + ".");
idNum = idNum + 1;
%>
この場合、
この場合、
この場合、
この場合、
isThreadSafe
は必要
は必要
は必要
は必要
?
?
?
?
Is isThreadSafe Needed Here?•
No
<%! private int idNum = 0; %>
<%
synchronized(this) {
String userID = "userID" + idNum;
out.println("Your ID is " + userID + ".");
idNum = idNum + 1;
}
%>
•
高トラフィック環境で完全に安全でパフォーマ
高トラフィック環境で完全に安全でパフォーマ
高トラフィック環境で完全に安全でパフォーマ
高トラフィック環境で完全に安全でパフォーマ
55 © Marty Hall, http://www.coreservlets.com
JSP
ドキュメントにファ
ドキュメントにファ
ドキュメントにファ
ドキュメントにファ
イルをインクルードする
イルをインクルードする
イルをインクルードする
イルをインクルードする
Including Files in JSP Documents
www.coreservlets.com
リクエスト時にファイルをインクルー
リクエスト時にファイルをインクルー
リクエスト時にファイルをインクルー
リクエスト時にファイルをインクルー
ドする
ドする
ドする
ドする
Including Files at Request Time
•
フォーマット
フォーマット
フォーマット
フォーマット
–
<jsp:include page="Relative URL" flush="true" />
•
目的
目的
目的
目的
–
JSP
、
HTML
、テキストのコンテンツの再利用
–
JSP
のコンテンツはメインページに影響がない:
インクルードされた
JSP
ページの出力だけが使用さ
れる
–
メインの
JSP
ページを変更することなく、インクル
ードされたコンテンツのアップデートを可能にする
•
注意
注意
注意
注意
–
JSP 1.1
以前では、
flush
属性を
false
にする事はでき
ない
JSP 特別講座
57 www.coreservlets.com
ファイルのインクルード:コード
ファイルのインクルード:コード
ファイルのインクルード:コード
ファイルのインクルード:コード
例
例
例
例
Including Files: Example Code
... <BODY> <CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
What's New at JspNews.com</TABLE> </CENTER>
<P>
Here is a summary of our four most recent news stories: <OL>
<LI><jsp:include page="news/Item1.html" flush="true" />
<LI><jsp:include page="news/Item2.html" flush="true" />
<LI><jsp:include page="news/Item3.html" flush="true" />
<LI><jsp:include page="news/Item4.html" flush="true" />
</OL>
</BODY></HTML>
ファイルのインクルード:例の結果
ファイルのインクルード:例の結果
ファイルのインクルード:例の結果
ファイルのインクルード:例の結果
JSP 特別講座
59 www.coreservlets.com
ページ変換時にファイルをインクルードす
ページ変換時にファイルをインクルードす
ページ変換時にファイルをインクルードす
ページ変換時にファイルをインクルードす
る
る
る
る
Including Files at Page Translation Time
•
フォーマット
フォーマット
フォーマット
フォーマット
–
<%@ include file="Relative URL" %>
•
目的
目的
目的
目的
–
JSP
コンテンツを複数のページで再利用する(
JSP
コンテンツがメインページに影響を与える時)
•
注意
注意
注意
注意
–
仕様上サーバはインクルードされたファイルの変更
を検知する必要がなく、実際にもされていない。
–
よって、インクルードされたファイルが変更された
場合、
JSP
ファイルも更新する必要がある。
–
Unix
の“
touch
”コマンドや、以下のような
OS
特有
の仕組みを使用することもできる。
•
<%-- Navbar.jsp modified 3/1/00 --%>
<%@ include file="Navbar.jsp" %>
JSP 特別講座
60 www.coreservlets.com
jsp:include
と
と
と
と
@include
の違い
の違い
の違い
の違い
Differences Between jsp:include and @include
•
jsp:include
では、指定したページの出力を含
では、指定したページの出力を含
では、指定したページの出力を含
では、指定したページの出力を含
む
む
む
む
–
@include
では実際のコードが含まれる
•
jsp:include
はリクエスト時に実行される
はリクエスト時に実行される
はリクエスト時に実行される
はリクエスト時に実行される
–
@include
はページ変換時に実行される
•
jsp:include
では、メインページとインクルー
では、メインページとインクルー
では、メインページとインクルー
では、メインページとインクルー
ドされたページは二つの異なるサーブレットに
ドされたページは二つの異なるサーブレットに
ドされたページは二つの異なるサーブレットに
ドされたページは二つの異なるサーブレットに
なる
なる
なる
なる
–
@include
では、一つのサーブレットの一部となる
•
jsp:include
では、インクルードされたファイ
では、インクルードされたファイ
では、インクルードされたファイ
では、インクルードされたファイ
ルの変更を自動的に処理する
ルの変更を自動的に処理する
ルの変更を自動的に処理する
ルの変更を自動的に処理する
–
@include
では自動ではない場合があり、大きな保守
JSP 特別講座
61 www.coreservlets.com
再利用できる
再利用できる
再利用できる
再利用できる
JSP
コンテンツ:
コンテンツ:
コンテンツ:
コンテンツ:
ContactSection.jsp
Reusable JSP Content: ContactSection.jsp
<%@ page import="java.util.Date" %>
<%-- The following become fields in each servlet that
results from a JSP page that includes this file. --%> <%!
private int accessCount = 0;
private Date accessDate = new Date();
private String accessHost = "<I>No previous access</I>"; %>
<P> <HR>
This page © 2000
<A HREF="http//www.my-company.com/">my-company.com</A>. This page has been accessed <%= ++accessCount %>
times since server reboot. It was last accessed from <%= accessHost %> at <%= accessDate %>.
<% accessHost = request.getRemoteHost(); %> <% accessDate = new Date(); %>
JSP
コンテンツの使用
コンテンツの使用
コンテンツの使用
コンテンツの使用
Using the JSP Content...
<BODY>
<TABLE BORDER=5 ALIGN="CENTER"> <TR><TH CLASS="TITLE">
Some Random Page</TABLE> <P>
Information about our products and services. <P>
Blah, blah, blah. <P>
Yadda, yadda, yadda.
JSP 特別講座
63 www.coreservlets.com
JSP
コンテンツの使用:結果
コンテンツの使用:結果
コンテンツの使用:結果
コンテンツの使用:結果
Using the JSP Content: Result
© Marty Hall, http://www.coreservlets.com