Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
1 © Marty Hall, http://www.coreservlets.com
Java サーバサイドサーバサイドサーバサイドサーバサイド特別技術セミナー特別技術セミナー特別技術セミナー特別技術セミナー
【【【【JSP】】】】Marty Hall
coreservlets.com, Inc.
CasaReal, Inc.http://www.casareal.co.jp
JSP 特別講座2 www.coreservlets.com
Agenda
• なぜなぜなぜなぜ JSP が必要なのかが必要なのかが必要なのかが必要なのか
• JSP が動く仕組みが動く仕組みが動く仕組みが動く仕組み
• JSP の利点の利点の利点の利点
• JSP からのからのからのからの Java コードの呼び出しコードの呼び出しコードの呼び出しコードの呼び出し
• JSP から生成されるサーブレットの管理から生成されるサーブレットの管理から生成されるサーブレットの管理から生成されるサーブレットの管理
• ファイルのインクルードファイルのインクルードファイルのインクルードファイルのインクルード
• JavaBeans の使用の使用の使用の使用
• カスタムタグカスタムタグカスタムタグカスタムタグ
• MVC 構造構造構造構造
• JSTL およびおよびおよびおよび JSP 2.0 Expression Language
JSP 特別講座3 www.coreservlets.com
なぜなぜなぜなぜ JSP が必要かが必要かが必要かが必要かThe Need for JSP
• サーブレットを使用すると以下の事が簡単サーブレットを使用すると以下の事が簡単サーブレットを使用すると以下の事が簡単サーブレットを使用すると以下の事が簡単– Form データの読み込み– HTTP リクエストヘッダの読み込み– HTTP ステータスコードとレスポンスヘッダの設定– クッキーとセッション管理の使用– サーブレット間でのデータ共有– リクエスト間のデータの記憶
• しかし、以下のことは非常に面倒しかし、以下のことは非常に面倒しかし、以下のことは非常に面倒しかし、以下のことは非常に面倒– HTML を生成における println の使用– HTML の保守
JSP 特別講座4 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– 結果
• Thanks for ordering 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 特別講座6 www.coreservlets.com
競合テクノロジーに対する競合テクノロジーに対する競合テクノロジーに対する競合テクノロジーに対する JSP の優位性の優位性の優位性の優位性Advantages of JSP Over Competing Technologies
• ASP またはまたはまたはまたは ColdFusion と比べてと比べてと比べてと比べて– 動的部分の言語が優れている
– 様々なサーバ、オペレーティング・システムに対して可搬性がある
• PHPと比べてと比べてと比べてと比べて– 動的部分の言語が優れている– ツールのサポートが優れている
• サーブレット単体利用と比べてサーブレット単体利用と比べてサーブレット単体利用と比べてサーブレット単体利用と比べて– HTML の生成が簡単– HomeSite などの標準ツールが使用可能– 分割と統合– ただし、JSP デベロッパはサーブレットのプログラミングを知 ている必要がある
JSP 特別講座7 www.coreservlets.com
JSP の優位性(続き)の優位性(続き)の優位性(続き)の優位性(続き)Advantages of JSP (Continued)
• Velocity や、や、や、や、 WebMacroと比べてと比べてと比べてと比べて– 標準技術
• ブラウザ内のクライアントサイドブラウザ内のクライアントサイドブラウザ内のクライアントサイドブラウザ内のクライアントサイド JavaScriptと比べてと比べてと比べてと比べて– JSP の能力とほとんど重複しないが、
• クライアントではなく、サーバを管理する
• 豊富な言語
• サーバサイドサーバサイドサーバサイドサーバサイド JavaScriptと比べてと比べてと比べてと比べて(例例例例 LiveWire、、、、 BroadVision、、、、 JRun)– 豊富な言語
• 静的静的静的静的 HTML に対してに対してに対してに対して– 動的機能
– 動的な表現は“全部か全くなし”だけではなくなった。(静的部分を残してほんの一部を動的に表現する事が可能となった)
JSP 特別講座8 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>
JSP 特別講座10 www.coreservlets.com
例(続き)例(続き)例(続き)例(続き)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></BODY></HTML>
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
JSP 特別講座12 www.coreservlets.com
一番多い勘違い:一番多い勘違い:一番多い勘違い:一番多い勘違い:JSP がサーバサイド技術であることを忘れがサーバサイド技術であることを忘れがサーバサイド技術であることを忘れがサーバサイド技術であることを忘れるるるるMost Common Misunderstanding:::: Forgetting JSP is Server-Side Technology
• 良くある質問良くある質問良くある質問良くある質問– HTML でコレコレができないが、JSP ならできる?
• なぜこの質問は意味がないのか?なぜこの質問は意味がないのか?なぜこの質問は意味がないのか?なぜこの質問は意味がないのか?– JSP は完全にサーバ上で動作する– クライアント(ブラウザ)で扱えるコンテンツを返るわけでは
ない
• 同じような質問同じような質問同じような質問同じような質問– どうやって通常のアプレットを JSP ページに入れるのか?
答え:クライントに <APPLET…> タグを送信する– どうやって JSP ページに画像を入れるのか?
答え: クライアントに<IMG …> タグを送信する– JavaScript、Acrobat、Shockwaveなどをどうやって使うか?
答え: 適当な HTML タグを送信する
JSP 特別講座13 www.coreservlets.com
2番目に多い勘違い:番目に多い勘違い:番目に多い勘違い:番目に多い勘違い:サーブレットへの変換サーブレットへの変換サーブレットへの変換サーブレットへの変換/リクエスト時の混同リクエスト時の混同リクエスト時の混同リクエスト時の混同2nd Most Common Misunderstanding::::Translation/Request Time Confusion
• JSP ページからサーブレットへの変換時にページはページからサーブレットへの変換時にページはページからサーブレットへの変換時にページはページからサーブレットへの変換時にページはどうなっているのか?どうなっているのか?どうなっているのか?どうなっているのか?– JSP 構造はサーブレットコードに変換される
• リクエスト時に何が起こるのか?リクエスト時に何が起こるのか?リクエスト時に何が起こるのか?リクエスト時に何が起こるのか?– サーブレットコードが実行される。リクエスト時にJSP の変
換は行われない。リクエスト時にオリジナルの JSP ページは完全に無視される。つまり、変換結果のサーブレットのみが使用される。
• JSP ページからサーブレットへの変換はページからサーブレットへの変換はページからサーブレットへの変換はページからサーブレットへの変換はいつ行われるか?いつ行われるか?いつ行われるか?いつ行われるか?– 典型的には、変更後に JSP ページが初めてアクセスされた時
。実際にはインストール時にデベロッパーが全ての JSP ページをテストしているので、実ユーザからのアクセス時に変換されることがあってはならない。
– ページ変換はリクエスト毎には行われない。
JSP 特別講座14 www.coreservlets.com
JSP のライフサイクルのライフサイクルのライフサイクルのライフサイクルThe JSP Lifecycle
YesYesYesYesYesYesdoGet ((((またはまたはまたはまたは同等の同等の同等の同等の) 呼び出し呼び出し呼び出し呼び出し
NoYesNoYesNoYesinit (または同等または同等または同等または同等のののの) 呼び出し呼び出し呼び出し呼び出し
NoYesNoYesNoYesサーブレットサーブレットサーブレットサーブレット ののののインスタンス化インスタンス化インスタンス化インスタンス化およびサーバのおよびサーバのおよびサーバのおよびサーバのメモリへのローメモリへのローメモリへのローメモリへのロードドドド
NoYesNoNoNoYesサーブレットのサーブレットのサーブレットのサーブレットのコンパイル終了コンパイル終了コンパイル終了コンパイル終了
NoYesNoNoNoYesJSP ページがページがページがページが
サーブレットにサーブレットにサーブレットにサーブレットに変換変換変換変換
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: デジタル写真とデジタル写真とデジタル写真とデジタル写真とフィルム写真のフィルム写真のフィルム写真のフィルム写真の印刷と管理印刷と管理印刷と管理印刷と管理
JSP 特別講座16 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 特別講座18 www.coreservlets.com
JSP/サーブレットの実際の使用例サーブレットの実際の使用例サーブレットの実際の使用例サーブレットの実際の使用例JSP/Servlets in the Real World
• American Century Investments: 200万人の投資家を万人の投資家を万人の投資家を万人の投資家を持ち、持ち、持ち、持ち、 900億ドルの管理する億ドルの管理する億ドルの管理する億ドルの管理する70707070以上のミューチュア以上のミューチュア以上のミューチュア以上のミューチュアル・ファンドル・ファンドル・ファンドル・ファンド
JSP 特別講座19 www.coreservlets.com
JSP/サーブレットの実際の使用例サーブレットの実際の使用例サーブレットの実際の使用例サーブレットの実際の使用例JSP/Servlets in the Real World
• Excite: インターネット・ポータルのトップ5の一つインターネット・ポータルのトップ5の一つインターネット・ポータルのトップ5の一つインターネット・ポータルのトップ5の一つ(インターネットで も混雑しているサイトのトップ(インターネットで も混雑しているサイトのトップ(インターネットで も混雑しているサイトのトップ(インターネットで も混雑しているサイトのトップ10に入る)10に入る)10に入る)10に入る)
20 © Marty Hall, http://www.coreservlets.com
JSP スクリプト要素スクリプト要素スクリプト要素スクリプト要素JSP Scripting Elements
JSP 特別講座21 www.coreservlets.com
JSP 構成の使い方構成の使い方構成の使い方構成の使い方Uses of JSP Constructs
• スクリプト要素が直接サーブレットコースクリプト要素が直接サーブレットコースクリプト要素が直接サーブレットコースクリプト要素が直接サーブレットコードをドをドをドを呼ぶ呼ぶ呼ぶ呼ぶ
• スクリプト要素がサーブレットコードをスクリプト要素がサーブレットコードをスクリプト要素がサーブレットコードをスクリプト要素がサーブレットコードを間接的に呼ぶ間接的に呼ぶ間接的に呼ぶ間接的に呼ぶ(ユーティリティークラスを通して)(ユーティリティークラスを通して)(ユーティリティークラスを通して)(ユーティリティークラスを通して)
• Beans• カスタムタグカスタムタグカスタムタグカスタムタグ• Bean もしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含む
サーブレットサーブレットサーブレットサーブレット/JSP の組み合わせの組み合わせの組み合わせの組み合わせ(MVC)
単純な単純な単純な単純なアプリケーションアプリケーションアプリケーションアプリケーション
複雑な複雑な複雑な複雑なアプリケーションアプリケーションアプリケーションアプリケーション
JSP 特別講座22 www.coreservlets.com
設計のストラテジー:設計のストラテジー:設計のストラテジー:設計のストラテジー:JSP ページ内のページ内のページ内のページ内の Java コードを制限すコードを制限すコードを制限すコードを制限するるるるDesign Strategy: Limit Java Code in JSP Pages
• 2222つのオプションつのオプションつのオプションつのオプション– JSP ページに直接25行の Java コードを記述する– 25行の Java コードを別の Java クラスに記述し、JSP ページに
はそのクラスを起動する1行を記述する
• なぜなぜなぜなぜ2番目のオプションの方が良いのか?番目のオプションの方が良いのか?番目のオプションの方が良いのか?番目のオプションの方が良いのか?– 開発:開発:開発:開発: HTML 環境ではなく、Java 環境(エディタやIDE)で
別のクラスを記述する– デバッグ:デバッグ:デバッグ:デバッグ: 構文が間違っていれば、コンパイル時に判明する
。簡単な print 文で確認可能
– テスト:テスト:テスト:テスト: 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>
JSP 特別講座26 www.coreservlets.com
定義済み定数定義済み定数定義済み定数定義済み定数Predefined Variables
• request– リクエストを表す HttpServletRequest (service/doGet の第1引数)
• response– レスポンスを表す HttpServletResponse (service/doGet の第2引
数)
• out– 出力をクライアントに送る Writer
(JspWriter タイプのバッファバージョン)• session
– リクエストに関連付けられている HttpSession(ただし、ページディレクティブのセッション属性によって使用不可にしていない場合に限る)
• application– getServletContext() から取得された ServletContext (共有デー
タを扱うために使用)
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 特別講座30 www.coreservlets.com
JSP スクリプレットの使用例(続スクリプレットの使用例(続スクリプレットの使用例(続スクリプレットの使用例(続き)き)き)き)Example Using JSP Scriptlets (Continued)
<BODY BGCOLOR="<%= bgColor %>"><H2 ALIGN="CENTER">Color Testing</H2><%if (hasExplicitColor) {
…} else {
…}%>
</BODY></HTML>
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 特別講座34 www.coreservlets.com
JSP とサーブレットの対応とサーブレットの対応とサーブレットの対応とサーブレットの対応JSP/Servlet Correspondence
• オリジナルオリジナルオリジナルオリジナル JSP
<H1>Some Heading</H1><%!private String randomHeading() {return("<H2>" + Math.random() + "</H2>");
}%><%= randomHeading() %>
• (別の方法別の方法別の方法別の方法: 別の別の別の別の Java クラスでクラスでクラスでクラスでrandomHeading を静的なメソッドにする)を静的なメソッドにする)を静的なメソッドにする)を静的なメソッドにする)
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());...
} ...}
JSP 特別講座36 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>
</BODY></HTML>
JSP 特別講座37 www.coreservlets.com
JSP 宣言:結果宣言:結果宣言:結果宣言:結果JSP Declarations: Result
• 任意の異なるクライアントが計任意の異なるクライアントが計任意の異なるクライアントが計任意の異なるクライアントが計15回訪問した後回訪問した後回訪問した後回訪問した後
38 © Marty Hall, http://www.coreservlets.com
JSP page ディレクティブ:ディレクティブ:ディレクティブ:ディレクティブ:生成されるサーブレットの生成されるサーブレットの生成されるサーブレットの生成されるサーブレットの
構造を指定する構造を指定する構造を指定する構造を指定するThe JSP page Directive: Structuring Generated Servlets
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 が使用するユーティリティなどは、パッケージにいれる!
JSP 特別講座40 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);
}
private final String NO_VALUE = "<I>No Value</I>";%>
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 userIDcookie of <%= oldID %>.</BODY></HTML>
JSP 特別講座42 www.coreservlets.com
インポート属性の例:結果インポート属性の例:結果インポート属性の例:結果インポート属性の例:結果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 タイプの表」を参照
JSP 特別講座44 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></HTML>
JSP 特別講座45 www.coreservlets.com
ネットスケープ内のテキスト・ドキネットスケープ内のテキスト・ドキネットスケープ内のテキスト・ドキネットスケープ内のテキスト・ドキュメントュメントュメントュメントPlain Text Documents in Netscape
JSP 特別講座46 www.coreservlets.com
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)12.3 13.4 14.5 15.6 16.7
JSP 特別講座47 www.coreservlets.com
条件付きで条件付きで条件付きで条件付きで Excel スプレッドシートスプレッドシートスプレッドシートスプレッドシートを生成するを生成するを生成するを生成するGenerating Excel Spreadsheets Conditionally
• Excel はははは HTML の表を解釈できるの表を解釈できるの表を解釈できるの表を解釈できる– リクエストパラメータに基づいて MIME タイプを変更
• page ディレクティブは使用不可ディレクティブは使用不可ディレクティブは使用不可ディレクティブは使用不可– リクエスト時の値を使用しない
• ソリューションソリューションソリューションソリューション– 定義済みのリクエスト変数を使用し、
setContentType を呼ぶ<%if (someCondition) {response.setContentType("type1");
} else {response.setContentType("type2");
}%>
JSP 特別講座48 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><H2>Comparing Apples and Oranges</H2>
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>
JSP 特別講座50 www.coreservlets.com
Apples とととと Orages::::デフォルトデフォルトデフォルトデフォルト結果結果結果結果Apples and Oranges: Default Result
JSP 特別講座51 www.coreservlets.com
Apples とととと Orages ::::フォーマットフォーマットフォーマットフォーマット = Excel の結果の結果の結果の結果Apples and Oranges: Result with format=excel
JSP 特別講座52 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; %>
JSP 特別講座54 www.coreservlets.com
この場合、この場合、この場合、この場合、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
JSP 特別講座56 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 特別講座58 www.coreservlets.com
ファイルのインクルード:例の結果ファイルのインクルード:例の結果ファイルのインクルード:例の結果ファイルのインクルード:例の結果Including Files: Example Result
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.jspReusable 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 特別講座62 www.coreservlets.com
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.
<%@ include file="ContactSection.jsp" %>
</BODY></HTML>
JSP 特別講座63 www.coreservlets.com
JSP コンテンツの使用:結果コンテンツの使用:結果コンテンツの使用:結果コンテンツの使用:結果Using the JSP Content: Result
64 © Marty Hall, http://www.coreservlets.com
JSP 上での上での上での上でのJavaBeans の利用の利用の利用の利用
Using JavaBeanswith JSP
JSP 特別講座65 www.coreservlets.com
Agenda
• Java におけるにおけるにおけるにおける Bean の概要の概要の概要の概要
• JSP 内での内での内での内でのBean の基本的な使用の基本的な使用の基本的な使用の基本的な使用
• Bean の作成とアクセスの作成とアクセスの作成とアクセスの作成とアクセス
• 明示的な明示的な明示的な明示的な Bean プロパティの設定プロパティの設定プロパティの設定プロパティの設定
• 個々の個々の個々の個々の Bean プロパティとリクエストパラメープロパティとリクエストパラメープロパティとリクエストパラメープロパティとリクエストパラメータの関連付けタの関連付けタの関連付けタの関連付け
• 全ての全ての全ての全ての Bean プロパティとリクエストパラメープロパティとリクエストパラメープロパティとリクエストパラメープロパティとリクエストパラメータの関連付けタの関連付けタの関連付けタの関連付け
• 条件による条件による条件による条件による Bean のオペレーションのオペレーションのオペレーションのオペレーション
• 複数の複数の複数の複数の JSP ページとサーブレットによるページとサーブレットによるページとサーブレットによるページとサーブレットによる Bean の共有の共有の共有の共有
JSP 特別講座66 www.coreservlets.com
JSP 構成の使い方構成の使い方構成の使い方構成の使い方Uses of JSP Constructs
• スクリプト要素が直接サーブレットスクリプト要素が直接サーブレットスクリプト要素が直接サーブレットスクリプト要素が直接サーブレットコードを呼ぶコードを呼ぶコードを呼ぶコードを呼ぶ
• スクリプト要素がサーブレットコースクリプト要素がサーブレットコースクリプト要素がサーブレットコースクリプト要素がサーブレットコードを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティークラスを通して)ークラスを通して)ークラスを通して)ークラスを通して)
• Beans• カスタムタグカスタムタグカスタムタグカスタムタグ
• Bean もしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むサーブレットサーブレットサーブレットサーブレット/JSP の組み合わせの組み合わせの組み合わせの組み合わせ(MVC)
簡単な簡単な簡単な簡単なアプリケーションアプリケーションアプリケーションアプリケーション
複雑な複雑な複雑な複雑なアプリケーションアプリケーションアプリケーションアプリケーション
JSP 特別講座67 www.coreservlets.com
背景:背景:背景:背景:Bean とは?とは?とは?とは?Background: What Are Beans?
• ある一定の法則に従うある一定の法則に従うある一定の法則に従うある一定の法則に従う Java クラスクラスクラスクラス– 引数なしの空のコンストラクタを持つ
• この必要条件は明示的にそのようなコンストラクタを定義するか、コンストラクタ全てを省くことで満たせる。
– パブリックなインスタンス変数(フィールド)を持ってはならない
• フィールドに直接アクセスするのではなく、空く切磋メソッドを使用する習慣をつける
– パーシスタントな値は、getXxx や setXxx メソッドを呼び出してアクセスする
• クラスが文字列を返す getTitle メソッドであれば、クラスは title という名前の文字プロパティをもつと言う。
• Boolean プロパティでは、getXxx の代わりに isXxx を使用する
– Bean に関する詳細は以下を参照http://java.sun.com/beans/docs/
JSP 特別講座68 www.coreservlets.com
なぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなく、、、、アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?Why You Should Use Accessors, Not Public Fields
• Bean であるためには、パブリックフィールドであるためには、パブリックフィールドであるためには、パブリックフィールドであるためには、パブリックフィールドががががあってはならないあってはならないあってはならないあってはならない
• よって以下をよって以下をよって以下をよって以下をpublic double speed;
• 以下のように置き換える必要がある以下のように置き換える必要がある以下のように置き換える必要がある以下のように置き換える必要があるprivate double speed;
public double getSpeed() { return(speed);
}public void setSpeed(double newSpeed) {
speed = newSpeed; }
• 全ての全ての全ての全ての Java コードを置き換える必要があるコードを置き換える必要があるコードを置き換える必要があるコードを置き換える必要がある
JSP 特別講座69 www.coreservlets.com
なぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなく、、、、アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?Why You Should Use Accessors, Not Public Fields
1) 値を制限することが可能値を制限することが可能値を制限することが可能値を制限することが可能
public void setSpeed(double newSpeed) {if (newSpeed < 0) {
sendErrorMessage(...);newSpeed = Math.abs(newSpeed);
}speed = newSpeed;
}
– クラスを使用するユーザがフィールドに直接アクセスした場合、それぞれが責任を持ち、制限を調べる必要がある
JSP 特別講座70 www.coreservlets.com
なぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなく、、、、アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?Why You Should Use Accessors, Not Public Fields
2) インタフェースを変更することなく、内部のインタフェースを変更することなく、内部のインタフェースを変更することなく、内部のインタフェースを変更することなく、内部の表現を変更できる表現を変更できる表現を変更できる表現を変更できる
// Now using metric units (kph, not mph)
public void setSpeed(double newSpeed) {setSpeedInKPH = convert(newSpeed);
}
public void setSpeedInKPH(double newSpeed) {speedInKPH = newSpeed;
}
JSP 特別講座71 www.coreservlets.com
なぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなくなぜパブリックフィールドではなく、、、、アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?アクセッサを使う必要があるのか?Why You Should Use Accessors, Not Public Fields
3) 任意のサイドエフェクトを実行することが可任意のサイドエフェクトを実行することが可任意のサイドエフェクトを実行することが可任意のサイドエフェクトを実行することが可能能能能
public double setSpeed(double newSpeed) {speed = newSpeed;updateSpeedometerDisplay();
}
– クラスを利用するユーザがフィールドに直接アクセスした場合、それぞれの責任でサイドエフェクトを実行する必要がある。手間がかかる上、実際の値と整合性がとれない危険性が高い。
JSP 特別講座72 www.coreservlets.com
JSP 内での内での内での内でのBean の基本的な使用の基本的な使用の基本的な使用の基本的な使用Basic Bean Use in JSP
• フォーマットフォーマットフォーマットフォーマット– <jsp:useBean id="name" class="package.Class" />
• 目的目的目的目的– 明示的な Java のプログラミングなしで、クラスのインスタンス化を可能にする(XML対応の構文)
• 注意注意注意注意– 簡単な解釈: この JSP アクション
<jsp:useBean id="book1" class="coreservlets.Book" />は以下のスクリプレットと等価<% coreservlets.Book book1 = new coreservlets.Book(); %>
– しかし、useBean には二つの付加機能がある:• リクエストパラメータからオブジェクト値を得るのが簡単
• ページ、またはサーブレット間でオブジェクトの共有を簡単にする
JSP 特別講座73 www.coreservlets.com
Bean プロパティにアクセスするプロパティにアクセスするプロパティにアクセスするプロパティにアクセスするAccessing Bean Properties
• フォーマットフォーマットフォーマットフォーマット– <jsp:getProperty name="name" property="property" />
• 目的目的目的目的– 明示的な Java プログラミングなしで Bean プロパティ(例えば getXxx メソッドの呼び出し)へのアクセスを可能にする
• 注意注意注意注意– <jsp:getProperty name="book1" property="title" />は以下の JSP 式と等価である
<%= book1.getTitle() %>
JSP 特別講座74 www.coreservlets.com
Bean プロパティの設定:簡単なケープロパティの設定:簡単なケープロパティの設定:簡単なケープロパティの設定:簡単なケーススススSetting Bean Properties: Simple Case
• フォーマットフォーマットフォーマットフォーマット– <jsp:setProperty name="name"
property="property"value="value" />
• 目的目的目的目的– Bean プロパティの設定(例えば setXxx メソッドの呼び出し
)を明示的な Java プログラミングなしで設定可能にする
• 注意注意注意注意– <jsp:setProperty name="book1"
property="title" value="Core Servlets and JavaServer Pages" />
は以下のスクリプレットと等価<% book1.setTitle("Core Servlets and JavaServer Pages"); %>
JSP 特別講座75 www.coreservlets.com
例:例:例:例:StringBeanExample: StringBean
package coreservlets;
public class StringBean {private String message = "No message specified";
public String getMessage() {return(message);
}
public void setMessage(String message) {this.message = message;
}}
• 通常のサーブレットディレクトリにインストー通常のサーブレットディレクトリにインストー通常のサーブレットディレクトリにインストー通常のサーブレットディレクトリにインストールルルル– Tomcat_install_dir\webapps\ROOT\WEB-INF\classes\coreservlets– JRun_install_dir\servers\default\default-app\WEB-INF\classes\coreservlets
• Bean ((((およびユーティリティおよびユーティリティおよびユーティリティおよびユーティリティ)クラスはクラスはクラスはクラスは常に常に常に常にパパパパッケージ内にある必要がある!ッケージ内にある必要がある!ッケージ内にある必要がある!ッケージ内にある必要がある!
JSP 特別講座76 www.coreservlets.com
StringBean を使うを使うを使うを使う JSP ページページページページJSP Page That Uses StringBean
<jsp:useBean id="stringBean" class="coreservlets.StringBean" />
<OL><LI>Initial value (getProperty):
<I><jsp:getProperty name="stringBean" property="message" /></I>
<LI>Initial value (JSP expression):<I><%= stringBean.getMessage() %></I>
<LI><jsp:setProperty name="stringBean" property="message" value="Best string bean: Fortex" />
Value after setting property with setProperty:<I><jsp:getProperty name="stringBean"
property="message" /></I><LI><%stringBean.setMessage("My favorite: Kentucky Wonder");%>
Value after setting property with scriptlet:<I><%= stringBean.getMessage() %></I>
</OL>
JSP 特別講座77 www.coreservlets.com
StringBean を使うを使うを使うを使う JSP ページページページページJSP Page That Uses StringBean
JSP 特別講座78 www.coreservlets.com
Bean プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1::::明示的変換&指示明示的変換&指示明示的変換&指示明示的変換&指示Setting Bean Properties Case 1:Explicit Conversion & Assignment<!DOCTYPE ...>
...<jsp:useBean id="entry"
class="coreservlets.SaleEntry" />
<%-- getItemID expects a String --%><jsp:setProperty
name="entry" property="itemID"value='<%= request.getParameter("itemID") %>' />
JSP 特別講座79 www.coreservlets.com
Bean プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1::::明示的変換&指示明示的変換&指示明示的変換&指示明示的変換&指示Setting Bean Properties Case 1:Explicit Conversion & Assignment<%
int numItemsOrdered = 1;try {
numItemsOrdered =Integer.parseInt(request.getParameter("numItems"));
} catch(NumberFormatException nfe) {}%><%-- getNumItems expects an int --%><jsp:setProperty
name="entry" property="numItems"value="<%= numItemsOrdered %>" />
JSP 特別講座80 www.coreservlets.com
Bean プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1::::明示的変換&指示明示的変換&指示明示的変換&指示明示的変換&指示Setting Bean Properties Case 1:Explicit Conversion & Assignment<%
double discountCode = 1.0;try {
String discountString = request.getParameter("discountCode");
discountCode = Double.valueOf(discountString).doubleValue();
} catch(NumberFormatException nfe) {}%><%-- getDiscountCode expects a double --%><jsp:setProperty
name="entry" property="discountCode"value="<%= discountCode %>" />
JSP 特別講座81 www.coreservlets.com
Bean プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1プロパティの設定ケース1::::明示的変換&指示明示的変換&指示明示的変換&指示明示的変換&指示Setting Bean Properties Case 1:Explicit Conversion & Assignment
JSP 特別講座82 www.coreservlets.com
ケースケースケースケース2:入力パラメータと個々の:入力パラメータと個々の:入力パラメータと個々の:入力パラメータと個々のプロパティの関連付けプロパティの関連付けプロパティの関連付けプロパティの関連付けCase 2: Associating Individual Properties with Input Parameters
• jsp:setProperty のののの pram 属性を使用する属性を使用する属性を使用する属性を使用する– 値は指定したリクエストパラメータから受け取る
– スタンダードタイプの値を必要とするプロパティに対しては、簡単な自動タイプ変換を実行する必要がある
• boolean, Boolean, byte, Byte, char, Character, double, Double, int, Integer, float, Float, long, または Long.
JSP 特別講座83 www.coreservlets.com
ケースケースケースケース2:入力パラメータと個々の:入力パラメータと個々の:入力パラメータと個々の:入力パラメータと個々のプロパティの関連付けプロパティの関連付けプロパティの関連付けプロパティの関連付けCase 2: Associating Individual Properties with Input Parameters
<jsp:useBean id="entry" class="coreservlets.SaleEntry" />
<jsp:setProperty name="entry"property="itemID"param="itemID" />
<jsp:setProperty name="entry"property="numItems"param="numItems" />
<jsp:setProperty name="entry"property="discountCode"param="discountCode" />
JSP 特別講座84 www.coreservlets.com
ケースケースケースケース3:入力パラメータと全ての:入力パラメータと全ての:入力パラメータと全ての:入力パラメータと全てのプロパティを関連付けするプロパティを関連付けするプロパティを関連付けするプロパティを関連付けするCase 3: Associating All Properties with Input Parameters
• jsp:setProperty のプロパティ属性の値にのプロパティ属性の値にのプロパティ属性の値にのプロパティ属性の値に“*”をををを使用する使用する使用する使用する– 値はプロパティー名と一致するリクエストパラメータから受け取る
– 簡単な自動タイプ変換が実行される必要がある
JSP 特別講座85 www.coreservlets.com
ケースケースケースケース3:入力パラメータと全ての:入力パラメータと全ての:入力パラメータと全ての:入力パラメータと全てのプロパティを関連付けするプロパティを関連付けするプロパティを関連付けするプロパティを関連付けするCase 3: Associating All Properties with Input Parameters
<jsp:useBean id="entry" class="coreservlets.SaleEntry" />
<jsp:setProperty name="entry" property="*" />
• プロパティがフォーム送信で満たされるオブジプロパティがフォーム送信で満たされるオブジプロパティがフォーム送信で満たされるオブジプロパティがフォーム送信で満たされるオブジェクトのェクトのェクトのェクトの““““form Bean””””を作るのに非常に便利を作るのに非常に便利を作るのに非常に便利を作るのに非常に便利– プロセスを複数のフォームに分離し、それぞれのフォームの送信によってオブジェクトの一部を満たすことも可能。
JSP 特別講座86 www.coreservlets.com
Bean の共有の共有の共有の共有Sharing Beans
• スコープ属性を使用することで、スコープ属性を使用することで、スコープ属性を使用することで、スコープ属性を使用することで、Bean をどこをどこをどこをどこに格納するかの指定が可能に格納するかの指定が可能に格納するかの指定が可能に格納するかの指定が可能– _jspService のローカル変数に制限される– <jsp:useBean id="…" class="…"
scope="…" />
• 複数のサーブレットまたは複数のサーブレットまたは複数のサーブレットまたは複数のサーブレットまたは JSP ページでデーページでデーページでデーページでデータの共有を可能にするタの共有を可能にするタの共有を可能にするタの共有を可能にする
• 条件的に条件的に条件的に条件的に Bean の作成を許可するの作成を許可するの作成を許可するの作成を許可する– 既存のオブジェクトが見つからない場合のみ、新しいオブジェクトが作成される
JSP 特別講座87 www.coreservlets.com
Scope 属性の値属性の値属性の値属性の値Values of the scope Attribute
• page (<jsp:useBean … scope="page"/> or<jsp:useBean…>)
– デフォルト値。Bean オブジェクトは現在のリクエスト期間内では、PageContext オブジェクト内に配置される必要がある。同じサーブレット内のメソッドから Bean にアクセスを可能にする。
• application (<jsp:useBean … scope="application"/>)– Bean は ServletContext に格納される。(アプリケーション変数、または getServletContext() メソッドの呼び出しからアクセスが可能)。ServletContext は一つの Web アプリケーション内の全てのサーブレットで共有される。(特定の Web アプリケーションが定義されていない場合はサーバ上の全てのサーブレット)
JSP 特別講座88 www.coreservlets.com
Scope 属性の値属性の値属性の値属性の値Values of the scope Attribute
• session(<jsp:useBean … scope="session"/>)– Bean は現在のリクエストと関連付いた HttpSession オブジェクトに格納される。通常のセッションオブジェクトと同様に、getAttribute と setAttribute で普通のサーブレットコードからアクセスが可能。
• request(<jsp:useBean … scope="request"/>)– Bean オブジェクトは現在のリクエスト期間中は
ServletRequest オブジェクト内に配置され、getAttribute によってアクセスが可能。
89 © Marty Hall, http://www.coreservlets.com
カスタムカスタムカスタムカスタム JSP タグライブラリの作成タグライブラリの作成タグライブラリの作成タグライブラリの作成
Creating Custom JSP Tag Libraries
JSP 特別講座90 www.coreservlets.com
JSP 構成の使い方構成の使い方構成の使い方構成の使い方Uses of JSP Constructs
• スクリプト要素が直接サーブレットスクリプト要素が直接サーブレットスクリプト要素が直接サーブレットスクリプト要素が直接サーブレットコードを呼ぶコードを呼ぶコードを呼ぶコードを呼ぶ
• スクリプト要素がサーブレットコースクリプト要素がサーブレットコースクリプト要素がサーブレットコースクリプト要素がサーブレットコードを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティークラスを通して)ークラスを通して)ークラスを通して)ークラスを通して)
• Beans• カスタムタグカスタムタグカスタムタグカスタムタグ
• Bean もしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むサーブレットサーブレットサーブレットサーブレット/JSP の組み合わせの組み合わせの組み合わせの組み合わせ(MVC)
単純な単純な単純な単純なアプリケーションアプリケーションアプリケーションアプリケーション
複雑な複雑な複雑な複雑なアプリケーションアプリケーションアプリケーションアプリケーション
JSP 特別講座91 www.coreservlets.com
タグライブラリを構成するコンポタグライブラリを構成するコンポタグライブラリを構成するコンポタグライブラリを構成するコンポーネントーネントーネントーネントComponents That Make Up a Tag Library
• タグ・ハンドラ・クラス(タグ・ハンドラ・クラス(タグ・ハンドラ・クラス(タグ・ハンドラ・クラス(Tag Handler Class))))– 実際にタグをコードに変換する方法をあらわす Java コード– javax.servlet.jsp.Tag インタフェースを実装する必要がある– 通常 TagSupport または BodyTagSupport を継承– サーブレットクラスファイルや Bean と同じディレクトリに
配置
• タグ・ライブラリ・デスクリプタ・ファイルタグ・ライブラリ・デスクリプタ・ファイルタグ・ライブラリ・デスクリプタ・ファイルタグ・ライブラリ・デスクリプタ・ファイル– タグ名、属性、実装するタグ・ハンドラ・クラスを示す XML
ファイル– JSP ファイルまたは任意の URL と一緒
• JSP ファイルファイルファイルファイル– タグライブラリ(デスクリプタ・ファイルを参照)をインポ
ートする– タグの prefix を定義– タグを使用
JSP 特別講座92 www.coreservlets.com
簡単なタグ・ハンドラ・クラスの簡単なタグ・ハンドラ・クラスの簡単なタグ・ハンドラ・クラスの簡単なタグ・ハンドラ・クラスの定義:例定義:例定義:例定義:例Defining a Simple Tag Handler Class: Example
package coreservlets.tags;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;import java.math.*;import coreservlets.*;
public class SimplePrimeTag extends TagSupport {protected int len = 50;
public int doStartTag() {try {
JspWriter out = pageContext.getOut();BigInteger prime = Primes.nextPrime(Primes.random(len));out.print(prime); // Primes class defined in Section 7.3
} catch(IOException ioe) {System.out.println("Error generating prime: " + ioe);
}return(SKIP_BODY);
}}
JSP 特別講座93 www.coreservlets.com
SimplePrimeTag 向け向け向け向け TLD ファイルファイルファイルファイルTLD File for SimplePrimeTag
<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN""http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>... // A few standard items -- just copy these
<tag><name>simplePrime</name><tagclass>coreservlets.tags.SimplePrimeTag</tagclass><info>Outputs a random 50-digit prime.</info>
</tag></taglib>
• XML ヘッダとヘッダとヘッダとヘッダと DOCTYPE を覚える必要はないを覚える必要はないを覚える必要はないを覚える必要はない;;;;coreservlets.com にあるバージョンを変更にあるバージョンを変更にあるバージョンを変更にあるバージョンを変更すればよいすればよいすればよいすればよい
JSP 特別講座94 www.coreservlets.com
JSP ファイルからカスタムタグにアクセファイルからカスタムタグにアクセファイルからカスタムタグにアクセファイルからカスタムタグにアクセスするスするスするスするAccessing Custom Tags From JSP Files
• タグ・ライブラリのインポートタグ・ライブラリのインポートタグ・ライブラリのインポートタグ・ライブラリのインポート– TLD ファイルの場所を指定する
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %>– タグの prefix (名前空間) を定義
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %>
• タグの使用タグの使用タグの使用タグの使用– <prefix:tagName />
• タグ名は TLD ファイルから取得
• Prefix は taglib ディレクティブから取得
– 例 <csajsp:simplePrime />
JSP 特別講座95 www.coreservlets.com
simplePrime タグの使用タグの使用タグの使用タグの使用Using simplePrime Tag
...<BODY><H1>Some 50-Digit Primes</H1>
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %>
<UL><LI><csajsp:simplePrime /><LI><csajsp:simplePrime /><LI><csajsp:simplePrime /><LI><csajsp:simplePrime />
</UL>
</BODY></HTML>
JSP 特別講座96 www.coreservlets.com
simplePrime タグの使用:結果タグの使用:結果タグの使用:結果タグの使用:結果Using simplePrime Tag: Result
JSP 特別講座97 www.coreservlets.com
タグに属性を与えるタグに属性を与えるタグに属性を与えるタグに属性を与えるAssigning Attributes to Tags
• 以下のようなタグを可能にする以下のようなタグを可能にする以下のようなタグを可能にする以下のようなタグを可能にする– <prefix:name
attribute1="value1" attribute2="value2" ... attributeN="valueN"
/>
• タグはスタンドアロンのままタグはスタンドアロンのままタグはスタンドアロンのままタグはスタンドアロンのまま– タグの開始と終了の間にボディは存在しない
JSP 特別講座98 www.coreservlets.com
属性:タグ・ハンドラ・クラス属性:タグ・ハンドラ・クラス属性:タグ・ハンドラ・クラス属性:タグ・ハンドラ・クラスAttributes: The Tag Handler Class
• attribute1 という属性を使用すると、という属性を使用すると、という属性を使用すると、という属性を使用すると、setAttribute1 というメソッドが呼ばれるというメソッドが呼ばれるというメソッドが呼ばれるというメソッドが呼ばれる– 属性値はメソッドに String として渡される
• 例例例例– 以下をサポートするには
<prefix:tagName attribute1="Test" />
タグ・ハンドラ・クラスに以下を追加する:
public void setAttribute1(String value1) {doSomethingWith(value1);
}
JSP 特別講座99 www.coreservlets.com
属性:属性:属性:属性:PrimeTag.javaAttributes: PrimeTag.java
package coreservlets.tags;
public class PrimeTag extends SimplePrimeTag {public void setLength(String length) {
try {// len used by parent classlen = Integer.parseInt(length);
} catch(NumberFormatException nfe) {len = 50;
}}
JSP 特別講座100 www.coreservlets.com
PrimeTag((((続き)続き)続き)続き)PrimeTag (Continued)
public void release() {len = 50;
}}
• なぜなぜなぜなぜ release? – サーバはタグ・インスタンスの再利用が許可されている
• タグプロセシングが完全に終了してから再利用されるので、同期の問題はない。
– タグを再利用するサーバは今のところ少ないが、先手を打っておくべき
属性がある場合は必要ない(なぜ?)
JSP 特別講座101 www.coreservlets.com
PrimeTag 向け向け向け向け TLD ファイルファイルファイルファイルTLD File for PrimeTag
...<taglib>
<tag><name>prime</name><tagclass>coreservlets.tags.PrimeTag</tagclass><info>Outputs a random N-digit prime.</info><attribute>
<name>length</name><required>false</required>
</attribute></tag>
</taglib>
JSP 特別講座102 www.coreservlets.com
prime Tag の使用の使用の使用の使用Using prime Tag
...<BODY><H1>Some N-Digit Primes</H1>
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %>
<UL><LI>20-digit: <csajsp:prime length="20" /><LI>40-digit: <csajsp:prime length="40" /><LI>80-digit: <csajsp:prime length="80" /><LI>Default (50-digit): <csajsp:prime />
</UL>
</BODY></HTML>
JSP 特別講座103 www.coreservlets.com
prime Tag の使用:結果の使用:結果の使用:結果の使用:結果Using prime Tag: Result
JSP 特別講座104 www.coreservlets.com
Tag Body のインクルードのインクルードのインクルードのインクルードIncluding the Tag Body
• も単純なタグも単純なタグも単純なタグも単純なタグ– <prefix:tagName />
• 属性を持つタグ属性を持つタグ属性を持つタグ属性を持つタグ– <prefix:tagName att1="val1" ... />
• 今回のタグ今回のタグ今回のタグ今回のタグ– <prefix:tagName>
JSP コンテンツ</prefix:tagName>
– <prefix:tagName att1="val1" ... >JSP コンテンツ</prefix:tagName>
JSP 特別講座105 www.coreservlets.com
Tag Body の使用:タグ・ハンドの使用:タグ・ハンドの使用:タグ・ハンドの使用:タグ・ハンドラ・クラスラ・クラスラ・クラスラ・クラスUsing Tag Body:The Tag Handler Class
• doStartTag– 通常 SKIP_BODY の代わりに
EVAL_BODY_INCLUDE を返す
• doEndTag– ボディの処理が終了した後でアクションを行ないたい場合はこのメソッドを定義する
– EVAL_PAGE を返す
JSP 特別講座106 www.coreservlets.com
HTML でヘッダーを作成するでヘッダーを作成するでヘッダーを作成するでヘッダーを作成するMaking headings in HTML
JSP 特別講座107 www.coreservlets.com
Tag Body の使用:の使用:の使用:の使用:HeadingTag.javaUsing Tag Body:HeadingTag.java
package coreservlets.tags;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;
public class HeadingTag extends TagSupport {private String bgColor; // The one required attributeprivate String color = null;...
public void setBgColor(String bgColor) {this.bgColor = bgColor;
}
public void setColor(String color) {this.color = color;
}...
JSP 特別講座108 www.coreservlets.com
Tag Body の使用:の使用:の使用:の使用:HeadingTag.java((((続き)続き)続き)続き)Using Tag Body:HeadingTag.java (Continued)public int doStartTag() {try {JspWriter out = pageContext.getOut();out.print("<TABLE BORDER=" + border +
" BGCOLOR=\"" + bgColor + "\"" +" ALIGN=\"" + align + "\"");
if (width != null) {out.print(" WIDTH=\"" + width + "\"");
}...
} catch(IOException ioe) {System.out.println("Error in HeadingTag: " + ioe);
}return(EVAL_BODY_INCLUDE); // Include tag body
}
JSP 特別講座109 www.coreservlets.com
Tag Body の使用:の使用:の使用:の使用:HeadingTag.java((((続き)続き)続き)続き)Using Tag Body:HeadingTag.java (Continued)public int doEndTag() {try {JspWriter out = pageContext.getOut();out.print("</SPAN></TABLE>");
} catch(IOException ioe) {System.out.println("Error in HeadingTag: " + ioe);
}return(EVAL_PAGE); // Continue with rest of JSP page
}
JSP 特別講座110 www.coreservlets.com
HeadingTag 向け向け向け向け TLD ファイルファイルファイルファイルTLD File for HeadingTag
...<taglib><tag><name>heading</name><tagclass>coreservlets.tags.HeadingTag</tagclass><info>Outputs a 1-cell table used as a heading.</info><attribute><name>bgColor</name><required>true</required> <!-- bgColor is required -->
</attribute><attribute><name>color</name><required>false</required>
</attribute>...
</tag></taglib>
JSP 特別講座111 www.coreservlets.com
heading Tag の使用の使用の使用の使用Using heading Tag
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %><csajsp:heading bgColor="#C0C0C0">Default Heading</csajsp:heading><P><csajsp:heading bgColor="BLACK" color="WHITE">White on Black Heading</csajsp:heading><P><csajsp:heading bgColor="#EF8429" fontSize="60" border="5">Large Bordered Heading</csajsp:heading><P><csajsp:heading bgColor="CYAN" width="100%">Heading with Full-Width Background</csajsp:heading>...
JSP 特別講座112 www.coreservlets.com
heading Tag の使用:結果の使用:結果の使用:結果の使用:結果Using heading Tag:Result
JSP 特別講座113 www.coreservlets.com
上級カスタムタグ上級カスタムタグ上級カスタムタグ上級カスタムタグAdvanced Custom Tags
• タグ・ボディのオプションタグ・ボディのオプションタグ・ボディのオプションタグ・ボディのオプション– リクエスト時に doStartTag から何を返すかを判断する
• タグ・ボディの操作タグ・ボディの操作タグ・ボディの操作タグ・ボディの操作– タグの開始と終了タグ間の読み込み、変更、出力には doAfterBody を使用する
• ボディを複数回操作するボディを複数回操作するボディを複数回操作するボディを複数回操作する– 後の繰り返しになるまで doAfterBody から
EVAL_BODY_TAG を返す– TLD ファイルを使用して、JSP 表現を属性値として許可することを指定する
• タグのネストタグのネストタグのネストタグのネスト– 入れ子の内側にあるタグのハンドラは
findAncestorWithClass を使用して、外側のタグハンドラを参照する
JSP 特別講座114 www.coreservlets.com
タグ・ボディのオプション:タグ・ボディのオプション:タグ・ボディのオプション:タグ・ボディのオプション:debug タグタグタグタグOptional Tag Bodies: the debug Tag
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %>Top of regular page. Blah, blah, blah. Yadda, yadda, yadda.<P><csajsp:debug><B>Debug:</B><UL>
<LI>Current time: <%= new java.util.Date() %><LI>Requesting hostname: <%= request.getRemoteHost()%><LI>Session ID: <%= session.getId() %>
</UL></csajsp:debug><P>Bottom of regular page. Blah, blah, blah. Yadda, yadda, yadda.
JSP 特別講座115 www.coreservlets.com
debug タグの使用:結果タグの使用:結果タグの使用:結果タグの使用:結果Using debug Tag: Results
JSP 特別講座116 www.coreservlets.com
タグ・ボディの操作:タグ・ボディの操作:タグ・ボディの操作:タグ・ボディの操作:filter タグタグタグタグManipulating Tag Body: the filter Tag
...<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %><TABLE BORDER=1 ALIGN="CENTER"><TR CLASS="COLORED"><TH>Example<TH>Result<TR><TD><PRE><csajsp:filter><EM>Some emphasized text.</EM><BR><STRONG>Some strongly emphasized text.</STRONG><BR><CODE>Some code.</CODE><BR>...</csajsp:filter></PRE>
<TD><EM>Some emphasized text.</EM><BR><STRONG>Some strongly emphasized text.</STRONG><BR><CODE>Some code.</CODE><BR>...</TABLE>
JSP 特別講座117 www.coreservlets.com
filter タグの使用:結果タグの使用:結果タグの使用:結果タグの使用:結果Using the filter Tag:Results
JSP 特別講座118 www.coreservlets.com
ボディの複数回操作:ボディの複数回操作:ボディの複数回操作:ボディの複数回操作:repeat TagManipulating the Body Multiple Times: the repeat Tag
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %>
<OL><!-- Repeats N times. A null reps value
means repeat once. --><csajsp:repeat
reps='<%= request.getParameter("repeats") %>'><LI><csajsp:prime length="40" />
</csajsp:repeat></OL>
JSP 特別講座119 www.coreservlets.com
repeat タグの使用:結果タグの使用:結果タグの使用:結果タグの使用:結果Using the repeat Tag: Results
JSP 特別講座120 www.coreservlets.com
ネスとしたタグ:ネスとしたタグ:ネスとしたタグ:ネスとしたタグ:if タグタグタグタグNested Tags: the if Tag
<%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %><csajsp:if><csajsp:condition>true</csajsp:condition><csajsp:then>Condition was true</csajsp:then><csajsp:else>Condition was false</csajsp:else>
</csajsp:if>...Some coin tosses:<BR><csajsp:repeat reps="20"><csajsp:if><csajsp:condition><%= Math.random() > 0.5 %>
</csajsp:condition><csajsp:then><B>Heads</B><BR></csajsp:then><csajsp:else><B>Tails</B><BR></csajsp:else>
</csajsp:if></csajsp:repeat>
JSP 特別講座121 www.coreservlets.com
if タグの使用:結果タグの使用:結果タグの使用:結果タグの使用:結果Using the if Tag: Results
JSP 特別講座122 www.coreservlets.com
オープンソース・タグ・ライブラリオープンソース・タグ・ライブラリオープンソース・タグ・ライブラリオープンソース・タグ・ライブラリhttp://jakarta.apache.org/taglibs/Open Source Tag Libraries
• JSP Standard Tag Library (JSTL)– 参照 http://courses.coreservlets.com/Course-
Materials/11-JSTL.pdf• 国際化国際化国際化国際化 (I18N)• データベース・アクセスデータベース・アクセスデータベース・アクセスデータベース・アクセス• Email 送信送信送信送信• JNDI• Date/time• フォームフィールドの設定とチェックフォームフィールドの設定とチェックフォームフィールドの設定とチェックフォームフィールドの設定とチェック• パールの正規表現パールの正規表現パールの正規表現パールの正規表現• 他の他の他の他の Web ページからのデータ抽出ページからのデータ抽出ページからのデータ抽出ページからのデータ抽出• XSL 変換など変換など変換など変換など
123 © Marty Hall, http://www.coreservlets.com
サーブレットとサーブレットとサーブレットとサーブレットと JSP の統の統の統の統合:合:合:合:MVC アーキテクチャアーキテクチャアーキテクチャアーキテクチャ
Integrating Servletsand JSP: The MVC Architecture
JSP 特別講座124 www.coreservlets.com
JSP 構成の使い方構成の使い方構成の使い方構成の使い方Uses of JSP Constructs
• スクリプト要素が直接サーブレットスクリプト要素が直接サーブレットスクリプト要素が直接サーブレットスクリプト要素が直接サーブレットコードを呼ぶコードを呼ぶコードを呼ぶコードを呼ぶ
• スクリプト要素がサーブレットコースクリプト要素がサーブレットコースクリプト要素がサーブレットコースクリプト要素がサーブレットコードを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティドを間接的に呼ぶ(ユーティリティークラスを通して)ークラスを通して)ークラスを通して)ークラスを通して)
• Beans• カスタムタグカスタムタグカスタムタグカスタムタグ
• Bean もしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むもしくはカスタムタグを含むサーブレットサーブレットサーブレットサーブレット/JSP の組み合わせの組み合わせの組み合わせの組み合わせ(MVC)
単純な単純な単純な単純なアプリケーションアプリケーションアプリケーションアプリケーション
複雑な複雑な複雑な複雑なアプリケーションアプリケーションアプリケーションアプリケーション
JSP 特別講座125 www.coreservlets.com
なぜサーブレットとなぜサーブレットとなぜサーブレットとなぜサーブレットと JSP を組みを組みを組みを組み合わせるのか?合わせるのか?合わせるのか?合わせるのか?Why Combine Servlets & JSP?
• 典型的な使い方典型的な使い方典型的な使い方典型的な使い方:HTML の開発と保守を楽にすの開発と保守を楽にすの開発と保守を楽にすの開発と保守を楽にするためにるためにるためにるために JSP を使用する。を使用する。を使用する。を使用する。– 簡単な動的なコードでは、スクリプトレットを呼ぶ
– もう少し複雑なアプリケーションでは、スクリプトレットから呼ばれたカスタムクラスを使用する
– より複雑なアプリケーションでは、Bean およびカスタムタグを使用する
• しかし、それだけでは十分ではないしかし、それだけでは十分ではないしかし、それだけでは十分ではないしかし、それだけでは十分ではない– 複雑な処理を JSP ではじめるのは不可解。– 本当のコードをクラス、Bean、およびカスタムタグに分離するのが簡単だが、JSP は、一つのページに付き、一つという基本がある。
JSP 特別講座126 www.coreservlets.com
一つのリクエストを処理する場合一つのリクエストを処理する場合一つのリクエストを処理する場合一つのリクエストを処理する場合Possibilities for Handling a Single Request
• サーブレットのみサーブレットのみサーブレットのみサーブレットのみ– 出力はバイナリタイプ:画像など– 出力なし:検索エンジンの例と同じように、フォワード、またはリディレクションを行う
– ページのフォーマット/レイアウトは多様:ポータルなど
• JSP のみのみのみのみ– 出力の大半は文字データ:HTML など– ページのフォーマット/レイアウトはほとんど固定
• 組み合わせ組み合わせ組み合わせ組み合わせ– 一つのリクエストは、複数の全く異なる結果となる– 複雑なデータ処理、しかし割と固定されたレイアウト
• これら一つのリクエストに適用されるこれら一つのリクエストに適用されるこれら一つのリクエストに適用されるこれら一つのリクエストに適用される– 全体のアプリケーションの中では サーブレットと
JSP 特別講座127 www.coreservlets.com
アプローチアプローチアプローチアプローチApproach
• サーブレットサーブレットサーブレットサーブレット/JSP 統合プロセス統合プロセス統合プロセス統合プロセス:– オリジナルのリクエストはサーブレットが答える
– サーブレットがリクエストデータのプロセス、データベースのルックアップをし、ビジネスロジックなどを処理する。
– 結果は Bean に配置される– 結果を JSP ページにフォワードし、フォーマットする– 異なる JSP ページでは、異なるタイプの表示の処理が可能
• これはこれはこれはこれは MVC (Model View Controller)、または、または、または、または JSP ののののモデルモデルモデルモデル 2 アプローチと呼ばれるアプローチと呼ばれるアプローチと呼ばれるアプローチと呼ばれる
• Apache Struts Framework ではこのアプローチを基ではこのアプローチを基ではこのアプローチを基ではこのアプローチを基本としている本としている本としている本としている– http://jakarta.apache.org/struts/
JSP 特別講座128 www.coreservlets.com
MVC の実装の実装の実装の実装Implementing MVC
• 重要なのはアイデア重要なのはアイデア重要なのはアイデア重要なのはアイデア– 構文は難しくない
• すでに学んだことすでに学んだことすでに学んだことすでに学んだこと– JSP ページ内に以前格納されたデータの抽出方法
• scope 属性の jsp:useBean を使用する
• まだ学んでいない二つの構文まだ学んでいない二つの構文まだ学んでいない二つの構文まだ学んでいない二つの構文– サーブレットから JSP ページの起動
– サーブレットが以下の方法で取得したデータの格納方法
• scope=“request” を持つ jsp:useBean• scope=“session” を持つ jsp:useBean• scope=“application” をもつ jsp:useBean
JSP 特別講座129 www.coreservlets.com
サーブレットからサーブレットからサーブレットからサーブレットから JSP ページにページにページにページにリクエストをディスパッチするリクエストをディスパッチするリクエストをディスパッチするリクエストをディスパッチするDispatching Requests from Servlets to JSP Pages
• 初に初に初に初に ServletContext ののののgetRequestDispatcher メソッドを呼び出すメソッドを呼び出すメソッドを呼び出すメソッドを呼び出す– サーバまたは Web アプリケーションのルートの相対 URL を提供する
– 例
• String url = "/presentations/presentation1.jsp";RequestDispatcher dispatcher =getServletContext().getRequestDispatcher(url);
• 次に行うこと次に行うこと次に行うこと次に行うこと– コントロールを完全に出力先ページに転送させるために forward を呼ぶ(response.sendRedirect の用に、クライアント間のコミュニケーションはない)。MVC アーキテクチャでは普通の手法。
JSP 特別講座130 www.coreservlets.com
リクエストのフォワード:サンプルリクエストのフォワード:サンプルリクエストのフォワード:サンプルリクエストのフォワード:サンプルコードコードコードコードForwarding Requests: Example Code
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {String operation = request.getParameter("operation");if (operation == null) {operation = "unknown";
}if (operation.equals("operation1")) {gotoPage("/operations/presentation1.jsp",
request, response);} else if (operation.equals("operation2")) {gotoPage("/operations/presentation2.jsp",
request, response);} else {gotoPage("/operations/unknownRequestHandler.jsp",
request, response);}
}
JSP 特別講座131 www.coreservlets.com
リクエストのフォワード:サンプルリクエストのフォワード:サンプルリクエストのフォワード:サンプルリクエストのフォワード:サンプルコードコードコードコードForwarding Requests: Example Code (Continued)
private void gotoPage(String address,HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(address);dispatcher.forward(request, response);
}
JSP 特別講座132 www.coreservlets.com
ノート:ノート:ノート:ノート:JSP useBean スコープの代スコープの代スコープの代スコープの代替替替替Reminder: JSP useBean Scope Alternatives
• request– <jsp:useBean id="..." class="..." scope="request" />
• session– <jsp:useBean id="..." class="..." scope="session" />
• application– <jsp:useBean id="..." class="..." scope="application" />
• page– <jsp:useBean id="…" class="…" scope=“page” /> または<jsp:useBean id="..." class="..." />
– このスコープは MVC (Model 2) アーキテクチャでは使用しない
JSP 特別講座133 www.coreservlets.com
後でデータを使用するためにデー後でデータを使用するためにデー後でデータを使用するためにデー後でデータを使用するためにデータを格納する:サーブレット・リタを格納する:サーブレット・リタを格納する:サーブレット・リタを格納する:サーブレット・リクエストクエストクエストクエストStoring Data for Later Use:The Servlet Request• 目的目的目的目的
– サーブレットがルックアップし、格納したデータを、JSP ページがそのデータがリクエストされた時だけ使用する
• データを格納するサーブレット構文データを格納するサーブレット構文データを格納するサーブレット構文データを格納するサーブレット構文SomeClass value = new SomeClass(…);request.setAttribute("key", value);// JSP へのフォワードにはへのフォワードにはへのフォワードにはへのフォワードには RequestDispatcher を使用を使用を使用を使用
• データを取得するデータを取得するデータを取得するデータを取得する JSP 構文構文構文構文<jsp:useBean
id="key" class="somepackage.SomeClass"scope="request" />
JSP 特別講座134 www.coreservlets.com
後でデータを使用するためにデー後でデータを使用するためにデー後でデータを使用するためにデー後でデータを使用するためにデータを格納する:タを格納する:タを格納する:タを格納する: セッションオブセッションオブセッションオブセッションオブジェクトジェクトジェクトジェクトStoring Data for Later Use:The Session Object• 目的目的目的目的
– サーブレットがルックアップした格納データを、今のリクエスト時、および同じクライアントからの後からのリクエストに使用する
• データを格納するサーブレット構文データを格納するサーブレット構文データを格納するサーブレット構文データを格納するサーブレット構文SomeClass value = new SomeClass(…);HttpSession session =
request.getSession(true);session.setAttribute("key", value);// JSP をフォワードするのに、をフォワードするのに、をフォワードするのに、をフォワードするのに、RequestDispatcher を使用するを使用するを使用するを使用する
• データを取得するデータを取得するデータを取得するデータを取得する JSP 構文構文構文構文<jsp:useBean
id="key" class="somepackage.SomeClass"scope="session" />
JSP 特別講座135 www.coreservlets.com
後でデータを使用するためにデータ後でデータを使用するためにデータ後でデータを使用するためにデータ後でデータを使用するためにデータを格納する:を格納する:を格納する:を格納する: サーブレットコンテキサーブレットコンテキサーブレットコンテキサーブレットコンテキストストストストStoring Data for Later Use:The Servlet Context
• 目的目的目的目的– サーブレットがルックアップした格納データを、今のリクエ
スト、および任意のクライアントからの後からのリクエストに使用する
• データを格納するサーブレット構文データを格納するサーブレット構文データを格納するサーブレット構文データを格納するサーブレット構文synchronized(this) {
SomeClass value = new SomeClass(…);getServletContext().setAttribute("key",
value);// RequestDispatcher がががが JSP にフォワードするにフォワードするにフォワードするにフォワードする
}
• データを取得するデータを取得するデータを取得するデータを取得する JSP 構文構文構文構文<jsp:useBean
id="key" class="somepackage.SomeClass"scope="application" />
JSP 特別講座136 www.coreservlets.com
MVC 例1:例1:例1:例1:オンライン・トラベル・エージェオンライン・トラベル・エージェオンライン・トラベル・エージェオンライン・トラベル・エージェントントントントMVC Example 1:An On-Line Travel Agent
JSP 特別講座137 www.coreservlets.com
MVC 例1:例1:例1:例1:オンライン・トラベル・エージェオンライン・トラベル・エージェオンライン・トラベル・エージェオンライン・トラベル・エージェントントントントMVC Example 1: An On-Line Travel Agent• 全てのリクエストには以下が含まれる全てのリクエストには以下が含まれる全てのリクエストには以下が含まれる全てのリクエストには以下が含まれる
– Email アドレス、パスワード、出発点、目的地、開始日付、終了日付
• オリジナルリクエストはサーブレットが答えるオリジナルリクエストはサーブレットが答えるオリジナルリクエストはサーブレットが答えるオリジナルリクエストはサーブレットが答える– Email アドレス、およびパスワードをキーとして、本当の名
前、アドレス、クレジットカード情報、マイレッジデータなどをルックアップする。データはセッションオブジェクトに格納される
• ユーザがどのボタンを押すかによって、フォワード先ユーザがどのボタンを押すかによって、フォワード先ユーザがどのボタンを押すかによって、フォワード先ユーザがどのボタンを押すかによって、フォワード先が異なる:が異なる:が異なる:が異なる:– フライト、時刻、費用を表示するページ– ホテル、施設、価格を表示するページ– レンタカー、ユーザ情報の編集、エラー処理
JSP 特別講座138 www.coreservlets.com
オンライントラベルエージェントオンライントラベルエージェントオンライントラベルエージェントオンライントラベルエージェント::::サーブレットコードサーブレットコードサーブレットコードサーブレットコードAn On-Line Travel Agent:Servlet Codepublic void doPost(HttpServletRequest request,
HttpServletResponse response)...// Store data in TravelCustomer bean called "customer"HttpSession session = request.getSession(true);session.setAttribute("customer", customer);if (request.getParameter("flights") != null) {gotoPage("/travel/BookFlights.jsp",
request, response);} else if ...
}private void gotoPage(String address,
HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {RequestDispatcher dispatcher =getServletContext().getRequestDispatcher(address);
dispatcher.forward(request, response);}
JSP 特別講座139 www.coreservlets.com
オンライントラベルエージェントオンライントラベルエージェントオンライントラベルエージェントオンライントラベルエージェント::::JSP コードコードコードコード (フライトのページフライトのページフライトのページフライトのページ)An On-Line Travel Agent:JSP Code (Flight Page)<BODY>
<H1>Best Available Flights</H1><CENTER><jsp:useBean id="customer"
class="coreservlets.TravelCustomer" scope="session" />
Finding flights for<jsp:getProperty name="customer"
property="fullName" /><P><jsp:getProperty name="customer" property="flights" />...
JSP 特別講座140 www.coreservlets.com
MVC 例例例例2:オンライン・ボート・オンライン・ボート・オンライン・ボート・オンライン・ボート・ストアストアストアストアMVC Example 2: An Online Boat Store
JSP 特別講座141 www.coreservlets.com
MVC 例例例例2:オンライン・ボート・オンライン・ボート・オンライン・ボート・オンライン・ボート・ストアストアストアストアMVC Example 2: An Online Boat Store
JSP 特別講座142 www.coreservlets.com
MVC 例例例例2:オンライン・ボート・オンライン・ボート・オンライン・ボート・オンライン・ボート・ストアストアストアストアMVC Example 2: An Online Boat Store
JSP 特別講座143 www.coreservlets.com
MVC 例例例例 2:オンラインオンラインオンラインオンライン・・・・ボートボートボートボート・・・・ストアストアストアストアMVC Example 2: An Online Boat Store
JSP 特別講座144 www.coreservlets.com
MVC 例例例例 2:オンラインオンラインオンラインオンライン・・・・ボートボートボートボート・・・・ストアストアストアストアMVC Example 2: An Online Boat Store
JSP 特別講座145 www.coreservlets.com
MVC 例例例例 2:サーブレットコードサーブレットコードサーブレットコードサーブレットコードMVC Example 2: Servlet Code
public class ShowItem extends HttpServlet {public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {
String itemNum = request.getParameter("itemNum");String destination;if (itemNum == null) {destination = "/MissingItem.jsp";
} else {destination = "/ShowItem.jsp";ItemTable shipTable = ShipTable.getShipTable();SimpleItem item = shipTable.getItem(itemNum);request.setAttribute("item", item);
}RequestDispatcher dispatcher =getServletContext().getRequestDispatcher(destination);
dispatcher.forward(request, response);}
}
JSP 特別講座146 www.coreservlets.com
MVC 例例例例 2:オンライン・ボート・オンライン・ボート・オンライン・ボート・オンライン・ボート・ストアストアストアストアMVC Example 2: An Online Boat Store
隠れたフィールド
JSP 特別講座147 www.coreservlets.com
MVC 例例例例2: JSP コードコードコードコード(ShowItem.jsp)
MVC Example 2: JSP Code<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">…<jsp:useBean id="item"
class="moreservlets.SimpleItem" scope="request" />
<TITLE><jsp:getProperty name="item" property="itemNum" /></TITLE>…<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE"><jsp:getProperty name="item" property="itemNum" /></TABLE>
<P><IMG SRC="<jsp:getProperty name='item' property='imageURL' />"
ALIGN="RIGHT">
<H3>Item Number</H2><jsp:getProperty name="item" property="itemNum" /><H3>Description</H2><jsp:getProperty name="item" property="description" />
JSP 特別講座148 www.coreservlets.com
MVC 例例例例2: JSP コードコードコードコード(ShowItem.jsp 続き続き続き続き)
MVC Example 2: JSP Code<H3>Cost</H2><jsp:getProperty name="item" property="costString" />.A real bargain!
<H3>Ordering</H2><FORM ACTION="DisplayPurchases">
<INPUT TYPE="HIDDEN" NAME="itemNum" VALUE="<jsp:getProperty name='item'
property='itemNum' />"><INPUT TYPE="SUBMIT" VALUE="Submit Order">
</FORM>
<%@ taglib uri="/WEB-INF/tlds/count-taglib.tld" prefix="boats" %>
<boats:count /></BODY></HTML>
JSP 特別講座149 www.coreservlets.com
MVC 例例例例 2:Bean コードコードコードコード(SimpleItem.java) MVC Example 2: Bean Code
public class SimpleItem {private String itemNum = "Missing item number";private String description = "Missing description";private String imageURL = "Missing image URL";private double cost;private NumberFormat formatter =NumberFormat.getCurrencyInstance();
public SimpleItem(String itemNum,String description,String imageURL,double cost) {
setItemNum(itemNum);setDescription(description);setImageURL(imageURL);setCost(cost);
}
public SimpleItem() {}…}
150 © Marty Hall, http://www.coreservlets.com
JSP 2.0 Expression Language およびおよびおよびおよびJSP Standard Tag
Library (JSTL)
JSP 特別講座151 www.coreservlets.com
JSTL 概要概要概要概要JSTL Overview
• JSTL はははは JSP1.2 またはまたはまたはまたは 2.0 スペックの一部ではないスペックの一部ではないスペックの一部ではないスペックの一部ではない– 別のダウンロードを必要とする、異なる仕様– サーブレット 2.3 および JSP 1.2 をサポートするサーバでのみ仕様可能。JSP 1.1 での対応は不可。
• The JSTL expression language will be part of JSP 2.0
• The JSTL 使用は使用は使用は使用は PDF で入手可能で入手可能で入手可能で入手可能– http://jcp.org/aboutJava/communityprocess/final/jsr052/
• JSTL の書籍の書籍の書籍の書籍– 新版はすでに古い(ベータ版仕様)– David Geary の Core JSTL を推薦
JSP 特別講座152 www.coreservlets.com
JSTL 1.0 のインストールのインストールのインストールのインストールInstalling JSTL 1.0
• サーバによってはサーバによってはサーバによってはサーバによっては JSTL がプリインストールされていがプリインストールされていがプリインストールされていがプリインストールされているるるる– 例:Caucho Resin
• 公式実装レファレンス公式実装レファレンス公式実装レファレンス公式実装レファレンス– http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/
• Tomcat 4.0.4 以上が 適• JSTL は(は(は(は(JSP と同様)仕様であり、実装ではないと同様)仕様であり、実装ではないと同様)仕様であり、実装ではないと同様)仕様であり、実装ではない
– コードは可搬性があるが、バージョンによって異なる
• スピード、ツール、および開発環境は異なる• インストールに必要なことインストールに必要なことインストールに必要なことインストールに必要なこと:
– Zip ファイルのダウンロード– 適当なディレクトリ内で Unzip (例 C:\jakarta-taglibs).– install_dir/standard-1.0.1/lib/jstl.jar と install_dir/standard-
1.0.1/lib/standard.jarを Web アプリケーションの WEB-INF/lib のディレクトリにコピーする
JSP 特別講座153 www.coreservlets.com
The JSTL Expression Language
• ${expression}を通してアクセスを通してアクセスを通してアクセスを通してアクセス– JSTL ベータ版の $expressionからの変更に注意
• JavaScript およびおよびおよびおよび XPath に似ているに似ているに似ているに似ている
• 以下にアクセスする際のショートカットを提供以下にアクセスする際のショートカットを提供以下にアクセスする際のショートカットを提供以下にアクセスする際のショートカットを提供:– スタンダード・サーブレット・オブジェクトの属性– Bean プロパティ– マップ、リストおよび配列要素
• JSP 2.0 の標準の一部の標準の一部の標準の一部の標準の一部– JSTL 内では、EL は JSTL タグの属性としてだけ使用が可能– JSP 2.0 ではどこでも EL が使用可能
• 旧バージョンとの互換性のため、web.xml 要素およびページディレクティブ属性によって EL をオフにできる
– JSP 2.0 は 2003年第2四半期辺りに予定
JSP 特別講座154 www.coreservlets.com
Backdrop: The MVC Architecture
• サーブレット:プログラミングを行うサーブレット:プログラミングを行うサーブレット:プログラミングを行うサーブレット:プログラミングを行う– データプロセス、ビジネスロジックの実行、結果を
Bean に格納MyData data = new MyData(…);request.setAttribute("key", data);String address
= "/someDir/PresentationPage.jsp";RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(address);dispatcher.forward(request, response);
• JSP: データ表示のみデータ表示のみデータ表示のみデータ表示のみ<jsp:useBean
id="key" class="somepackage.MyData"scope="request" />
JSP 特別講座155 www.coreservlets.com
JSTL EL: 変数へのアクセス変数へのアクセス変数へのアクセス変数へのアクセスThe JSTL EL: Accessing Variables
• ${name} の意味の意味の意味の意味– PageContext, HttpServletRequest, HttpSession, および
ServletContext (順番に)の nameという名称の属性を探す
– 文字列の場合、toString メソッドを通して文字列に変換
– リクエスト、セッションおよびサーブレットコンテキスト属性に格納されたデータにアクセスするのは、 MVC アーキテクチャで使用される方法。JSTL および MVC は一心同体。
• ${name1}text${name2}text 連結連結連結連結– 以下の二つは等価
• ${foo}blah• pageContext.findAttribute("foo").toString() + "blah"
• 以下の例に注意以下の例に注意以下の例に注意以下の例に注意– <c:out …> は値の出力に使用
JSP 特別講座156 www.coreservlets.com
例:例:例:例:JSTL 変数へのアクセス変数へのアクセス変数へのアクセス変数へのアクセス (サーブレサーブレサーブレサーブレットットットット)
Example: Accessing JSTL Variables (Servlet)public class SimpleMVCServlet extends HttpServlet {public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {
request.setAttribute("attribute1", "First Attribute");
HttpSession session = request.getSession(true);session.setAttribute("attribute2",
"Second Attribute");ServletContext application = getServletContext();application.setAttribute("attribute3",
new java.util.Date());request.setAttribute("repeated",
"HttpServletRequest");session.setAttribute("repeated", "HttpSession");application.setAttribute("repeated",
"ServletContext");gotoPage("/el/vars.jsp", request, response);
}
JSP 特別講座157 www.coreservlets.com
例:例:例:例:JSTL 変数へのアクセス変数へのアクセス変数へのアクセス変数へのアクセス (サーブレサーブレサーブレサーブレット続きット続きット続きット続き)Example: Accessing JSTL Variables (Servlet Continued)
private void gotoPage(String address,HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(address);dispatcher.forward(request, response);
}
JSP 特別講座158 www.coreservlets.com
例:例:例:例:JSTL 変数へのアクセス変数へのアクセス変数へのアクセス変数へのアクセス(JSP)Example: Accessing JSTL Variables (JSP)
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<UL><LI><B>attribute1:</B> <c:out value="${attribute1}"/><LI><B>attribute2:</B> <c:out value="${attribute2}"/><LI><B>attribute3:</B> <c:out value="${attribute3}"/><LI><B>Source of "repeated" attribute:</B>
<c:out value="${repeated}"/></UL>
JSP 特別講座159 www.coreservlets.com
例:例:例:例:JSTL 変数へのアクセス(結変数へのアクセス(結変数へのアクセス(結変数へのアクセス(結果)果)果)果)Example: Accessing JSTL Variables (Results)
JSP 特別講座160 www.coreservlets.com
JSTL EL: “.” およびおよびおよびおよび “[]” によるによるによるによるBean プロパティへのアクセスプロパティへのアクセスプロパティへのアクセスプロパティへのアクセスThe JSTL EL: Accessing Bean Properties with "." and "[]"
• 簡単な例簡単な例簡単な例簡単な例: オブジェクトが単純なオブジェクトが単純なオブジェクトが単純なオブジェクトが単純な Bean– var.getPropName() を意味する var.propName を使用– var.propName は var[“propName”] と等価
• 初期バージョンは短い。バージョン 2 では、ランタイムの値をプロパティ名として使用できる
• バージョン 2 では、外側にシングルクオートを使用することに注意!
– ドット、または配列の表現はつなげられる• a.b.c.d と a.getB().getC().getD() は等価
• 上級の例上級の例上級の例上級の例: オブジェクトが配列、オブジェクトが配列、オブジェクトが配列、オブジェクトが配列、List またはまたはまたはまたは Map– 配列: var[i] または var.i は theObject[i] と等価
• theObject は var という名前の属性のタイプキャスト
– List: var[i] または var.i は theObject.get(i) と等価– Map: var.key または var["key"] は theObject.get("key") と等価
JSP 特別講座161 www.coreservlets.com
例例例例:簡単な簡単な簡単な簡単な Bean プロパティへのアクプロパティへのアクプロパティへのアクプロパティへのアクセスセスセスセスExample: Simple Bean Property Access
package beans;
public class Employee {private Name name;private Company company;
public Employee(Name name, Company company) {setName(name);setCompany(company);
}
public Name getName() { return(name); }
public void setName(Name newName) {name = newName;
}public Company getCompany() { return(company); }
public void setCompany(Company newCompany) {company = newCompany;
}}
JSP 特別講座162 www.coreservlets.com
例:簡単な例:簡単な例:簡単な例:簡単な Bean プロパティへのアクプロパティへのアクプロパティへのアクプロパティへのアクセスセスセスセス (続き)(続き)(続き)(続き)Example: Simple Bean Property Access (Continued)package beans;
public class Name {private String firstName;private String lastName;
public Name(String firstName, String lastName) {setFirstName(firstName);setLastName(lastName);
}
public String getFirstName() { return(firstName); }
public void setFirstName(String newFirstName) {firstName = newFirstName;
}public String getLastName() { return(lastName); }
public void setLastName(String newLastName) {lastName = newLastName;
}}
JSP 特別講座163 www.coreservlets.com
例:簡単な例:簡単な例:簡単な例:簡単な Bean プロパティへのアクプロパティへのアクプロパティへのアクプロパティへのアクセスセスセスセス(続き)(続き)(続き)(続き)Example: Simple Bean Property Access (Continued)package beans;
public class Company {private String companyName;private String business;
public Company(String companyName, String business) {setCompanyName(companyName);setBusiness(business);
}
public String getCompanyName() { return(companyName); }
public void setCompanyName(String newCompanyName) {companyName = newCompanyName;
}public String getBusiness() { return(business); }
public void setBusiness(String newBusiness) {business = newBusiness;
}}
JSP 特別講座164 www.coreservlets.com
例:簡単な例:簡単な例:簡単な例:簡単な Bean プロパティへのアクプロパティへのアクプロパティへのアクプロパティへのアクセスセスセスセス (続き)(続き)(続き)(続き)Example: Simple Bean Property Access (Continued)<% Name name1 = new Name("Marty", "Hall");Company company1 = new Company("coreservlets.com",
"J2EE Training and Consulting");Employee employee1 = new Employee(name1, company1);pageContext.setAttribute("employee", employee1);%> …<%@ taglib prefix="c"
uri="http://java.sun.com/jstl/core" %><UL><LI><B>First Name:</B>
<c:out value="${employee.name.firstName}"/><LI><B>Last Name:</B>
<c:out value="${employee.name.lastName}"/><LI><B>Company Name:</B>
<c:out value="${employee.company.companyName}"/><LI><B>Company Business:</B>
<c:out value="${employee.company.business}"/></UL>…
JSP 特別講座165 www.coreservlets.com
例:簡単な例:簡単な例:簡単な例:簡単な Bean プロパティへのプロパティへのプロパティへのプロパティへのアクセスアクセスアクセスアクセス(結果)(結果)(結果)(結果)Example: Simple Bean Property Access (Result)
JSP 特別講座166 www.coreservlets.com
Bean プロパティへのアクセス:プロパティへのアクセス:プロパティへのアクセス:プロパティへのアクセス:利点利点利点利点Accessing Bean Properties: Benefit
• 前例では前例では前例では前例では:<LI><B>First Name:</B>
<c:out value="${employee.name.firstName}"/>
• JSTL がない場合はがない場合はがない場合はがない場合は:<LI><B>First Name:</B> <% Employee employee =
(Employee)pageContext.findAttribute("employee"); %><%= employee.getName().getFirstName() %>
JSP 特別講座167 www.coreservlets.com
例例例例:複雑なアクセス複雑なアクセス複雑なアクセス複雑なアクセスExample: Complex Access
<% String[] firstNames = { "Bill", "Scott", "Larry" };ArrayList lastNames = new ArrayList();lastNames.add("Ellison");lastNames.add("Gates");lastNames.add("McNealy");HashMap companyNames = new HashMap();companyNames.put("Ellison", "Sun");companyNames.put("Gates", "Oracle");companyNames.put("McNealy", "Microsoft");pageContext.setAttribute("first", firstNames); pageContext.setAttribute("last", lastNames);pageContext.setAttribute("company", companyNames);%>
JSP 特別講座168 www.coreservlets.com
例例例例: 複雑なアクセス(続き)複雑なアクセス(続き)複雑なアクセス(続き)複雑なアクセス(続き)Example: Complex Access (Continued)
<H1>Accessing Collections in JSTL</H1><%@ taglib prefix="c"
uri="http://java.sun.com/jstl/core" %><UL><LI><c:out value=
'${first[0]} ${last[0]} (${company["Ellison"]})'/><LI><c:out value=
'${first[1]} ${last[1]} (${company["Gates"]})'/><LI><c:out value=
'${first[2]} ${last[2]} (${company["McNealy"]})'/> </UL>
JSP 特別講座169 www.coreservlets.com
例例例例: 複雑なアクセス(続き)複雑なアクセス(続き)複雑なアクセス(続き)複雑なアクセス(続き)Example: Complex Access (Continued)
JSP 特別講座170 www.coreservlets.com
JSP Expression Language:演算子演算子演算子演算子The JSP Expression Language: Operators
• 算術演算子算術演算子算術演算子算術演算子– +, -, *, /, div, %, mod
• 関係演算子関係演算子関係演算子関係演算子– ==, eq, !=, ne, <, lt, >, gt, <=, le, >=, ge
• 論理演算子論理演算子論理演算子論理演算子– &&, and, ||, or, !, not
• 空 検査空 検査空 検査空 検査– 空 (null チェック, 中身のない String, array, List, Map)
• 演算子の目的演算子の目的演算子の目的演算子の目的– 条件式を簡潔にする– 条件評価タグの後で例を説明
JSP 特別講座171 www.coreservlets.com
反復タグ反復タグ反復タグ反復タグ:まとめまとめまとめまとめLooping Tags: Summary
• 明示的な数値によるループ明示的な数値によるループ明示的な数値によるループ明示的な数値によるループ<c:forEach var="name" begin="x" end="y" step="z">
Blah, blah <c:out value="$name"/></c:forEach>
• データ構造によるループデータ構造によるループデータ構造によるループデータ構造によるループ– 配列、文字列、コレクション、マップ内をループできる
<c:forEach var="name" items="array-or-collection">
Blah, blah <c:out value="$name"/></c:forEach>
• 区切られた文字列を次々に処理する区切られた文字列を次々に処理する区切られた文字列を次々に処理する区切られた文字列を次々に処理する–forTokens
JSP 特別講座172 www.coreservlets.com
反復タグ反復タグ反復タグ反復タグ: 利用する理由利用する理由利用する理由利用する理由Looping Tags: Motivation
• JSTL 無しの無しの無しの無しの JSP<UL><% for(int i=0; i<messages.length; i++) {
String message = messages[i];%><LI><%= message %><% } %></UL>
• JSTL 有りの有りの有りの有りの JSP<UL><c:forEach var="message" items="${messages}">
<LI><c:out value="${message}"/></c:forEach></UL>
JSP 特別講座173 www.coreservlets.com
単純な数値の反復単純な数値の反復単純な数値の反復単純な数値の反復Looping with Simple Numeric Values
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<UL><c:forEach var="i" begin="1" end="10">
<LI><c:out value="${i}"/></c:forEach></UL>
JSP 特別講座174 www.coreservlets.com
指定した繰り返し回数での反復指定した繰り返し回数での反復指定した繰り返し回数での反復指定した繰り返し回数での反復Looping with a Designated Step Size
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<UL><c:forEach
var="seconds" begin="0" end="${pageContext.session.maxInactiveInterval}"step="100">
<LI><c:out value="${seconds}"/> seconds.</c:forEach>
<LI>Timeout exceeded.</UL>
JSP 特別講座175 www.coreservlets.com
指定した繰り返し回数での反復指定した繰り返し回数での反復指定した繰り返し回数での反復指定した繰り返し回数での反復(結果結果結果結果)Looping with a Designated Step Size (Results)
JSP 特別講座176 www.coreservlets.com
配列を次々に処理する配列を次々に処理する配列を次々に処理する配列を次々に処理するLooping Down Arrays
<% String[] words = { "foo", "bar", "baz"};pageContext.setAttribute("words", words); %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<H2>Key Words:</H2><UL><c:forEach var="word"
items="${words}"><LI><c:out value="${word}"/>
</c:forEach></UL><H2>Values of the test Parameter:</H2><UL><c:forEach var="val"
items="${paramValues.test}"><LI><c:out value="${val}"/>
</c:forEach></UL>
JSP 特別講座177 www.coreservlets.com
配列を次々に処理する配列を次々に処理する配列を次々に処理する配列を次々に処理する (結果結果結果結果)Looping Down Arrays (Results)
JSP 特別講座178 www.coreservlets.com
カンマ区切り文字列を次々に処理すカンマ区切り文字列を次々に処理すカンマ区切り文字列を次々に処理すカンマ区切り文字列を次々に処理するるるるLooping Down Comma-Delimited Strings
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<UL><c:forEach
var="country" items="Australia,Canada,Japan,Philippines,USA"><LI><c:out value="${country}"/>
</c:forEach></UL>
JSP 特別講座179 www.coreservlets.com
カンマ区切り文字列を次々に処理すカンマ区切り文字列を次々に処理すカンマ区切り文字列を次々に処理すカンマ区切り文字列を次々に処理するるるる(結果結果結果結果)Looping Down Comma-Delimited Strings (Results)
JSP 特別講座180 www.coreservlets.com
条件評価タグ条件評価タグ条件評価タグ条件評価タグConditional Evaluation Tags
• 選択肢は一つだけ選択肢は一つだけ選択肢は一つだけ選択肢は一つだけ: if<c:if test="${someTest}">
Content</c:if>
• 多数の選択肢多数の選択肢多数の選択肢多数の選択肢: choose<c:choose>
<c:when test="test1">Content1</c:when><c:when test="test2">Content2</c:when>...<c:when test="testN">ContentN</c:when><c:otherwise>Default Content</c:otherwise>
</c:choose>
• 注意注意注意注意:ビジネスロジックの使用は抑える!ビジネスロジックの使用は抑える!ビジネスロジックの使用は抑える!ビジネスロジックの使用は抑える!
JSP 特別講座181 www.coreservlets.com
”if” タグタグタグタグThe "if" Tag
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<UL><c:forEach var="i" begin="1" end="10">
<LI><c:out value="${i}"/><c:if test="${i > 7}">(greater than 7)</c:if>
</c:forEach></UL>
JSP 特別講座182 www.coreservlets.com
”if” タグタグタグタグ(結果結果結果結果)The "if" Tag (Results)
JSP 特別講座183 www.coreservlets.com
”choose” タグタグタグタグThe "choose" Tag
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<UL><c:forEach var="i" begin="1" end="10">
<LI><c:out value="${i}"/><c:choose>
<c:when test="${i < 4}">(small)
</c:when><c:when test="${i < 8}">
(medium)</c:when><c:otherwise>
(large)</c:otherwise>
</c:choose></c:forEach></UL>
JSP 特別講座184 www.coreservlets.com
”choose” タグ(結果)タグ(結果)タグ(結果)タグ(結果)The "choose" Tag (Results)
JSP 特別講座185 www.coreservlets.com
データベースにアクセスするタグデータベースにアクセスするタグデータベースにアクセスするタグデータベースにアクセスするタグDatabase Access Tags
• <sql:setDataSource>– データソースの指定 (config セッティングを設定することでも
可能)
• <sql:query>– データベースのクエリし、ResultSet 内に変数で格納する– 注意:この使い方は、プレゼンテーション層にビジネスロジッ
クを一緒にしないというルールを守っていません。代わりの方法として、サーブレットからデータベースにアクセスし、MVC を通して結果を JSP に渡す。
• <sql:update>• <sql:param>• <sql:dateParam>• <sql:transaction>
– 囲まれた <sql:query> および <sql:update> を一つのトランザクションとして実行
JSP 特別講座186 www.coreservlets.com
補足:マイクロソフト補足:マイクロソフト補足:マイクロソフト補足:マイクロソフト アクセスアクセスアクセスアクセスNorthwind データベースデータベースデータベースデータベースAside: The Microsoft Access Northwind Database
• Microsoft Office にプリインストールされていにプリインストールされていにプリインストールされていにプリインストールされているデータベースるデータベースるデータベースるデータベース
JSP 特別講座187 www.coreservlets.com
sql:setDataSource
• コンフィギュレーション設定、またはアプリケコンフィギュレーション設定、またはアプリケコンフィギュレーション設定、またはアプリケコンフィギュレーション設定、またはアプリケーションスコープの変数を利用して、データソーションスコープの変数を利用して、データソーションスコープの変数を利用して、データソーションスコープの変数を利用して、データソースをグローバルに設定できるースをグローバルに設定できるースをグローバルに設定できるースをグローバルに設定できる– 実際のアプリケーションで推奨される方法
• または、特定のページを設定することも可能または、特定のページを設定することも可能または、特定のページを設定することも可能または、特定のページを設定することも可能<%@ taglib prefix="sql"
uri="http://java.sun.com/jstl/sql" %><sql:setDataSource
driver="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:Northwind"user=""password=""/>
JSP 特別講座188 www.coreservlets.com
sql:query
• 方法方法方法方法 1: sql 属性を使用する属性を使用する属性を使用する属性を使用する<sql:query var="results" sql="SELECT * FROM …"/>
• 方法方法方法方法 2: クエリをタグの本体に入れるクエリをタグの本体に入れるクエリをタグの本体に入れるクエリをタグの本体に入れる<sql:query var="results">SELECT * FROM …
</sql:query>
• オプションオプションオプションオプション– dataSource– maxRows– startRow
• 注意注意注意注意– 直接 SQL 文を JSP ページに埋め込むと、保守が困難になる
JSP 特別講座189 www.coreservlets.com
簡単な例簡単な例簡単な例簡単な例Simple Example
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<sql:setDataSourcedriver="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:Northwind"user=""password=""/>
JSP 特別講座190 www.coreservlets.com
簡単な例(続き)簡単な例(続き)簡単な例(続き)簡単な例(続き)Simple Example (Continued)
<sql:query var="employees">SELECT * FROM employees
</sql:query>
<UL><c:forEach var="row" items="${employees.rows}">
<LI><c:out value="${row.firstname}"/><c:out value="${row.lastname}"/>
</c:forEach></UL>
JSP 特別講座191 www.coreservlets.com
簡単な例簡単な例簡単な例簡単な例:結果結果結果結果Simple Example: Results
JSP 特別講座192 www.coreservlets.com
URL 処理のタグ処理のタグ処理のタグ処理のタグURL-Handling Tags
• <c:import>– 任意の URL のコンテンツを読み込む
• ページに挿入
• 変数に格納
• または reader を利用してアクセス可能
– <jsp:include> とは異なり、自システムに制約されない
• <c:redirect>– 特定の URL のリディレクトに応答する
• <c:param>– リクエストパラメータをエンコードし、URLに追加する
– <c:import> または <c:redirect> のボディ内での使用も可能
JSP 特別講座193 www.coreservlets.com
書式タグ書式タグ書式タグ書式タグFormatting Tags
• <fmt:formatNumber>– 数、貨幣値、または割合をローカルに特定な方法で書式する
• <fmt:parseNumber>– 文字で表される数、貨幣値、または割合を読み込む
• <fmt:formatDate>• <fmt:parseDate>• <fmt:timeZone>• <fmt:setTimeZone>
JSP 特別講座194 www.coreservlets.com
国際化タグ国際化タグ国際化タグ国際化タグInternationalization (I18N) Tags
• <fmt:setLocale>– ロケールの設定
• <fmt:setBundle>• <fmt:bundle>• <fmt:message>
– リソースバンドルからローカライズメッセージを取得する
• <fmt:param>
JSP 特別講座195 www.coreservlets.com
XML 操作タグ操作タグ操作タグ操作タグXML Manipulation Tags
• Core– <x:parse>
• XPath– <x:if>– <x:choose>– <x:when>– <x:otherwise>– <x:forEach>
• XSLT– <x:transform>– <x:param>
JSP 特別講座196 www.coreservlets.com
更なる情報更なる情報更なる情報更なる情報More Information
• Java のトレーニングとコンサルのトレーニングとコンサルのトレーニングとコンサルのトレーニングとコンサル– http://www.casareal.co.jp/
• 例題のソースコード例題のソースコード例題のソースコード例題のソースコード– http://www.moreservlets.com/
• More Servlets & JSP – http://www.moreservlets.com– Available in Japanese and English
• Core Servlets & JSP– http://www.coreservlets.com/– Available in Japanese and English
• Servlet home page– http://java.sun.com/products/servlet/
• JavaServer Pages home page– http://java.sun.com/products/jsp/
JSP 特別講座197 www.coreservlets.com
カサレアルカサレアルカサレアルカサレアル Server Side Java 実践講座実践講座実践講座実践講座
EJB、、、、Struts コース紹介コース紹介コース紹介コース紹介
現実的なカリキュラム、実践で即役立つ演習現実的なカリキュラム、実践で即役立つ演習現実的なカリキュラム、実践で即役立つ演習現実的なカリキュラム、実践で即役立つ演習詳細は詳細は詳細は詳細は www.casareal.co.jp !!!!
Struts コースコースコースコース•Strutsフレームワークのアーキテクチャー、動作原理、開発方フレームワークのアーキテクチャー、動作原理、開発方フレームワークのアーキテクチャー、動作原理、開発方フレームワークのアーキテクチャー、動作原理、開発方法についての解説。法についての解説。法についての解説。法についての解説。
•商用サイトでも多く利用されているオープンソースの商用サイトでも多く利用されているオープンソースの商用サイトでも多く利用されているオープンソースの商用サイトでも多く利用されているオープンソースのStruts、、、、Tomcat、、、、PostgreSQLを使用!を使用!を使用!を使用!
EJB コースコースコースコース•EJB を利用するを利用するを利用するを利用する Web サイト開発時に、サーブレット、サイト開発時に、サーブレット、サイト開発時に、サーブレット、サイト開発時に、サーブレット、JSP、、、、EJBを 適に活用するを 適に活用するを 適に活用するを 適に活用するWebサイトシステムの設計を解説。サイトシステムの設計を解説。サイトシステムの設計を解説。サイトシステムの設計を解説。
•実開発で必須のアプリケーションサーバ、実開発で必須のアプリケーションサーバ、実開発で必須のアプリケーションサーバ、実開発で必須のアプリケーションサーバ、DBを利用する演習を利用する演習を利用する演習を利用する演習!!!!
198 © Marty Hall, http://www.coreservlets.com
Questions?