...

印刷版 ( 3.5 MB) - ソフトウェア

by user

on
Category: Documents
249

views

Report

Comments

Transcript

印刷版 ( 3.5 MB) - ソフトウェア
Apcoordinator
ユーザーズガイド
Windows/Solaris/Linux
J2X1-1190-19Z0(00)
2009年8月
まえがき
本書は、Apcoordinatorの概要や、Apcoordinatorを利用してWebアプリケーション、EJBアプリケーション、および電子フォームアプリケー
ションを開発するために必要な情報を記載しています。
本書の目的
本書の目的は、以下のとおりです。
・ Apcoordinatorの機能を理解できること
・ Apcoordinatorを利用してWebアプリケーション、EJBアプリケーション、および電子フォームアプリケーションを開発できること
・ トラブルが発生した場合に問題を解決できること
本書の読者
本書は、以下の読者を対象としています。
・ Apcoordinatorを利用してWebアプリケーション、EJBアプリケーション、および電子フォームアプリケーションを開発する人
・ Apcoordinatorを利用してWebシステムを構築する人
前提知識
本書を読むにあたっては、以下の知識が必要です。
・ HTML/XHTML/JavaScript/Java/CSS/EJBに関する基本的な知識
・ Webアプリケーションに関する基本的な知識
本書の構成
本書の構成は以下のとおりです。
第1部 Apcoordinatorが提供するフレームワーク
第1章 製品の概要
Apcoordinatorの概要と特長について説明しています。
第2章 Apcoordinatorが提供するフレームワークの概要
Apcoordinatorが提供するフレームワークの概要について説明しています。
第2部 Apcoordinatorコアの機能
第3章 Apcoordinatorアプリケーションの主な構成要素
Apcoordinatorアプリケーションで使用される構成要素について説明しています。
第4章 APIを使ったプログラミング
ApcoordinatorのAPIを使用したプログラミングについて説明しています。
第5章 アプリケーションログ
Apcoordinatorのアプリケーションログ機能について説明しています。
第6章 XMLデータの利用
ApcoordinatorアプリケーションでXMLデータを利用する方法について説明しています。
第7章 リモート共通インタフェース
Apcoordinatorアプリケーションからリモート共通インタフェースを利用してEJBを呼び出す方法について説明しています。
第8章 EJBの呼び出し
ApcoordinatorアプリケーションからEJBを呼び出す方法について説明しています。
-i-
第9章 アプリケーション連携実行基盤との連携
アプリケーション連携実行基盤を利用したアプリケーションについて説明しています。
第10章 コマンドスクリプティング
コマンドスクリプティングの概要と利用方法について説明しています。
第11章 XMLデータ仕様記述
XMLデータ仕様記述の概要と利用方法について説明しています。
第12章 バックエンドとの連携
バックエンド連携サービスライブラリの概要と利用方法について説明しています。
第13章 実行環境の設定
Apcoordinatorアプリケーションの実行環境の設定方法について説明しています。
第3部 Webアプリケーションの開発
第14章 概要
Webcoordinatorの概要と特長について説明しています。
第15章 Webcoordinatorアプリケーションの骨格
Webcoordinatorアプリケーションの設計方法と作成するファイルについて説明しています。
第16章 UJIタグを使ったプログラミング
UJIタグを使用したプログラミングについて説明しています。
第17章 APIを使ったプログラミング
WebcoordinatorのAPIを使用したプログラミングについて説明しています。
第18章 データベースとの連携
データベース連携の概要とデータベース連携アプリケーションの作成方法について説明しています。
第19章 アプレットとの連携
アプレット連携の概要とアプレット連携アプリケーションの作成方法について説明しています。
第20章 Flashとの連携
Flash連携の概要とFlash連携アプリケーションの作成方法について説明しています。
第21章 アプリケーション設計時の注意事項
Webcoordinatorアプリケーションを設計する際の注意事項について説明しています。
第22章 Webアプリケーションの実行環境の設定
Webcoordinatorアプリケーションの実行環境の設定方法について説明しています。
第23章 Interstage Studioを使ったWebアプリケーションの開発
Interstage Studioを使ったWebアプリケーションの開発方法について説明しています。
第4部 EJBアプリケーションの開発
第24章 概要
Apcoordinatorが提供するEJBアプリケーションフレームワークの概要について説明しています。
第25章 セションBeanの開発
セションBeanの開発方法について説明しています。
第26章 セションBeanの実行環境の設定
セションBeanの実行環境の設定方法について説明しています。
第27章 Interstage Studioを使ったセションBeanの開発
Interstage Studioを使ったセションBeanの開発方法について説明しています。
- ii -
第5部 電子フォームアプリケーションの開発
第28章 概要
電子フォームアプリケーションの概要について説明しています。
第29章 電子フォームアプリケーションの作成方法
電子フォームアプリケーションの作成方法について説明しています。
第30章 COBOLとの連携
電子フォームとCOBOLで作成したアプリケーションを連携させる方法について説明しています。
第31章 電子フォームアプリケーションの実行環境の設定
電子フォームアプリケーションの実行環境の設定方法について説明しています。
第32章 Interstage Studioを使った電子フォームアプリケーションの開発
Interstage Studioを使った電子フォームアプリケーションの開発方法について説明しています。
付録A サンプルアプリケーション
Apcoordinatorの基本的な機能を使用した2つのサンプルアプリケーションについて説明しています。
付録B Apcoordinatorの動作概要
Apcoordinatorの内部動作の概要について説明しています。
付録C 旧バージョンとの互換情報
旧バージョンのフレームワークとの互換情報について説明しています。
付録D JIS X 0213:2004(通称JIS2004)規格について
JIS X 0213:2004で規格された補助文字の利用に関する注意事項について説明しています。
付録E Strutsとの連携
StrutsアプリケーションとApcoordinatorアプリケーションの連携方法について説明しています。
付録F Tips
Apcoordinatorで開発する際の役立つ情報について説明しています。
付録G トラブルシューティング
トラブルが発生したときの対処方法について説明しています。
付録H 各エディションで提供される機能
各製品・エディションで提供されるApcoordinatorの機能について説明しています。
用語集
機能および製品の呼び名について
本書では、特に断りのない限り、本製品および関連製品が提供する機能を以下に示す名称で表記している場合があります。
機能
以下の製品が提供するフレームワーク
名称
Apcoordinator
・ Interstage Business Application Server
・ Interstage Application Server
・ Interstage Studio
・ Interstage Interaction Manager
以下の製品が提供するアプリケーションサーバ
Interstage Application Server
・ Interstage Business Application Server
または
・ Interstage Application Server
Interstage
- iii -
機能
名称
・ Interstage Studio
また、本書では、Solaris(TM) オペレーティングシステム を Solaris と略記しています。
商標
Microsoft、Active Directory、ActiveX、Excel、Internet Explorer、MS-DOS、MSDN、Visual Basic、Visual C++、Visual Studio、
Windows、Windows NT、Windows Server、Win32は、米国およびその他の国における米国Microsoft Corporationの商標または登録
商標です。
Sun、Sun Microsystems、Sunロゴ、SolarisおよびすべてのSolarisに関連する商標及びロゴは、米国およびその他の国における米国Sun
Microsystems, Inc.の商標または登録商標です。
その他の記載されている商標および登録商標については、一般に各社の商標または登録商標です。
輸出許可
当社ドキュメントには、外国為替および外国貿易管理法に基づく特定技術が含まれていることがあります。特定技術が含まれている場
合は、当該ドキュメントを輸出または非居住者に提供するとき、同法に基づく許可が必要となります。
発行年月
2009年 8月
お願い
本書を無断で他に転載しないようお願いします。
本書は予告なしに変更されることがあります。
著作権
Copyright FUJITSU LIMITED 2000-2009
- iv -
目 次
第1部 Apcoordinatorが提供するフレームワーク.........................................................................................................................1
第1章 製品の概要.....................................................................................................................................................................2
1.1 Apcoordinatorとは...............................................................................................................................................................................2
1.2 Apcoordinatorの特長..........................................................................................................................................................................4
1.3 本マニュアルの読み方........................................................................................................................................................................5
第2章 Apcoordinatorが提供するフレームワークの概要..............................................................................................................8
2.1 Apcoordinatorコア...............................................................................................................................................................................8
2.2 Webcoordinator...................................................................................................................................................................................9
2.2.1 Webアプリケーション....................................................................................................................................................................9
2.3 Bccoordinator.....................................................................................................................................................................................13
2.3.1 EJB..............................................................................................................................................................................................13
2.4 Formcoordinator................................................................................................................................................................................14
2.5 Apcoordinatorで作成したアプリケーションの連携...........................................................................................................................15
第2部 Apcoordinatorコアの機能..............................................................................................................................................16
第3章 Apcoordinatorアプリケーションの主な構成要素..............................................................................................................17
3.1 ビジネスクラス....................................................................................................................................................................................17
3.2 データBean........................................................................................................................................................................................19
3.3 セションクラス.....................................................................................................................................................................................20
3.4 アプリケーションクラス.......................................................................................................................................................................20
3.5 ファクトリクラス....................................................................................................................................................................................20
3.6 設定ファイル......................................................................................................................................................................................21
3.6.1 コマンドマップ.............................................................................................................................................................................22
3.6.2 設定ファイルフォルダ.................................................................................................................................................................23
第4章 APIを使ったプログラミング.............................................................................................................................................24
4.1 共通処理...........................................................................................................................................................................................24
4.2 エラー処理.........................................................................................................................................................................................24
4.3 ユーザ定義イベントの利用...............................................................................................................................................................25
4.4 ビジネスクラス呼び出しのフック........................................................................................................................................................27
4.5 リソースファイル.................................................................................................................................................................................28
4.5.1 リソースファイルの作成...............................................................................................................................................................29
4.5.2 Javaプログラムからの文字列の参照..........................................................................................................................................31
4.5.3 JSPからの文字列の参照............................................................................................................................................................35
4.6 ビジネスクラスの再試行....................................................................................................................................................................35
4.6.1 ビジネスクラス再試行機能の概要.............................................................................................................................................35
4.6.2 ビジネスクラスの作成.................................................................................................................................................................36
4.6.3 ビジネスクラス再試行機能使用時の注意事項.........................................................................................................................38
4.7 トランザクションの管理......................................................................................................................................................................40
4.7.1 トランザクション管理機能が提供する機能................................................................................................................................40
4.7.2 ビジネスクラスの作成.................................................................................................................................................................41
4.7.3 トランザクション管理機能とビジネスクラス再試行機能の併用.................................................................................................44
4.7.4 JDBCのトランザクションの制御..................................................................................................................................................46
4.7.5 トランザクション管理機能を使用する場合の注意事項.............................................................................................................48
第5章 アプリケーションログ...................................................................................................................................................... 49
5.1 基本機能...........................................................................................................................................................................................49
5.1.1 ユーザ定義のログ出力クラスの作成.........................................................................................................................................51
5.2 ログのキューイング............................................................................................................................................................................53
5.3 ログ拡張機能.....................................................................................................................................................................................54
5.4 コンテキストIDの出力........................................................................................................................................................................56
5.5 定義ファイルを用いたログ出力.........................................................................................................................................................57
5.5.1 ログのフォーマットの設定...........................................................................................................................................................61
-v-
5.5.2 目的別ログの利用......................................................................................................................................................................62
5.6 高信頼性ログ.....................................................................................................................................................................................65
5.6.1 ログ定義ファイルを用いたログ出力...........................................................................................................................................70
5.6.2 ビジネスクラスでの利用..............................................................................................................................................................71
5.6.3 ユーザ定義のログ出力クラスの作成.........................................................................................................................................73
5.6.4 システム構成によるコネクションの利用.....................................................................................................................................74
5.6.5 ユーザログテーブルの定義.......................................................................................................................................................75
5.6.6 データベースリソース定義.........................................................................................................................................................78
第6章 XMLデータの利用.........................................................................................................................................................79
6.1 XML連携機能の概要.......................................................................................................................................................................79
6.2 XMLデータBean...............................................................................................................................................................................79
6.3 XPathの概略......................................................................................................................................................................................82
6.4 名前空間について............................................................................................................................................................................83
第7章 リモート共通インタフェース.............................................................................................................................................85
7.1 概要...................................................................................................................................................................................................85
7.2 リモートマップ....................................................................................................................................................................................86
7.3 CallFactoryインタフェースとCallインタフェースによる呼び出し.......................................................................................................87
第8章 EJBの呼び出し..............................................................................................................................................................89
8.1 Apcoordinatorで作成したセションBeanの呼び出し.........................................................................................................................89
8.1.1 リモート共通インタフェースを使った呼び出し...........................................................................................................................89
8.1.2 EJBCallFactoryを使った呼び出し.............................................................................................................................................89
8.2 一般的なEJBの呼び出し..................................................................................................................................................................90
8.2.1 EJBCallFactoryクラスからリモートインタフェースを取得する方法............................................................................................91
8.2.2 EJBCallFactoryクラスからホームインタフェースを取得する方法..............................................................................................91
8.3 ホームインタフェースのキャッシュ.....................................................................................................................................................91
8.4 セションBeanオブジェクトの自動削除...............................................................................................................................................92
8.5 EJB複数指定機能.............................................................................................................................................................................92
8.6 EJBの再試行.....................................................................................................................................................................................95
8.6.1 EJB再試行機能の概要..............................................................................................................................................................95
8.6.2 EJB再試行機能を使ったEJBの呼び出し..................................................................................................................................96
8.6.3 セションBean作成時の注意事項...............................................................................................................................................99
第9章 アプリケーション連携実行基盤との連携........................................................................................................................100
第10章 コマンドスクリプティング..............................................................................................................................................101
10.1 コマンドスクリプティングの概要.....................................................................................................................................................101
10.2 コマンドスクリプティングの利用方法.............................................................................................................................................102
10.3 利用者定義タグの追加.................................................................................................................................................................104
第11章 XMLデータ仕様記述..................................................................................................................................................105
11.1 概要...............................................................................................................................................................................................105
11.2 XMLデータ仕様記述の作成........................................................................................................................................................107
11.2.1 項目仕様の記述.....................................................................................................................................................................107
11.2.2 項目間にまたがる仕様の記述...............................................................................................................................................111
11.2.3 制御の記述.............................................................................................................................................................................112
11.3 XMLデータ仕様記述の実行........................................................................................................................................................114
11.3.1 インタプリタ形式での実行......................................................................................................................................................114
11.3.2 コンパイル形式での実行.......................................................................................................................................................115
11.3.3 エラー処理..............................................................................................................................................................................117
第12章 バックエンドとの連携..................................................................................................................................................120
12.1 概要...............................................................................................................................................................................................120
12.1.1 構成........................................................................................................................................................................................121
12.1.2 アプリケーションの呼び出し...................................................................................................................................................122
12.2 サービスの利用.............................................................................................................................................................................123
12.2.1 プログラミング..........................................................................................................................................................................123
- vi -
12.2.2 定義ファイル...........................................................................................................................................................................125
12.3 利用可能なサービスアダプタ.......................................................................................................................................................126
12.3.1 CORBAサービスアダプタ......................................................................................................................................................126
12.3.2 メッセージ送信サービスアダプタ...........................................................................................................................................129
12.3.3 コマンド実行サービスアダプタ...............................................................................................................................................130
12.3.4 利用者作成サービスアダプタ................................................................................................................................................131
12.4 バックエンド連携の実行環境の設定............................................................................................................................................133
12.4.1 サービスアダプタ利用環境....................................................................................................................................................133
12.4.2 イベントサービス環境.............................................................................................................................................................133
12.4.3 イベント処理Bean利用環境...................................................................................................................................................134
第13章 実行環境の設定........................................................................................................................................................ 135
13.1 アプリケーションに必要なApcoordinatorのファイル.....................................................................................................................135
13.2 実行時に必要なソフトウェア.........................................................................................................................................................136
13.3 初期化パラメタ...............................................................................................................................................................................138
第3部 Webアプリケーションの開発.........................................................................................................................................145
第14章 概要.......................................................................................................................................................................... 146
14.1 Webcoordinatorとは.......................................................................................................................................................................146
14.2 Webcoordinatorの特長..................................................................................................................................................................147
第15章 Webcoordinatorアプリケーションの骨格.....................................................................................................................149
15.1 Webcoordinatorの動作..................................................................................................................................................................149
15.2 Webcoordinatorアプリケーションの設計.......................................................................................................................................150
15.3 Webcoordinatorアプリケーションのファイル.................................................................................................................................152
15.3.1 表示の処理の流れ.................................................................................................................................................................152
15.3.2 入力の処理の流れ.................................................................................................................................................................153
15.3.3 includeのネスト........................................................................................................................................................................154
第16章 UJIタグを使ったプログラミング................................................................................................................................... 155
16.1 UJIタグの概要...............................................................................................................................................................................155
16.2 画面部品タグ.................................................................................................................................................................................155
16.2.1 画面部品タグの概要..............................................................................................................................................................155
16.2.2 各種の画面部品タグ..............................................................................................................................................................157
16.2.3 画面部品タグのネスト.............................................................................................................................................................160
16.3 クライアントスクリプト......................................................................................................................................................................160
16.3.1 クライアントスクリプトの概要...................................................................................................................................................160
16.3.2 クライアントスクリプトの使用方法...........................................................................................................................................161
16.3.3 ユーザ定義のチェック............................................................................................................................................................163
16.4 コンポーネントタグを使ったプログラミング....................................................................................................................................164
16.4.1 コンポーネントタグの概要......................................................................................................................................................164
16.4.2 フィールドタグの利用.............................................................................................................................................................166
16.4.3 コレクションタグの利用...........................................................................................................................................................168
16.4.4 レイアウトタグの利用..............................................................................................................................................................176
16.4.5 外字入力タグの利用..............................................................................................................................................................178
16.4.6 外付け属性の利用.................................................................................................................................................................179
16.5 タグによるXMLデータの利用.......................................................................................................................................................182
16.5.1 基本的な使用方法.................................................................................................................................................................182
16.5.2 XML用の項目クラス..............................................................................................................................................................188
16.5.3 通常のデータBeanからXMLデータBeanへの移行..............................................................................................................192
16.6 ウィンドウの制御............................................................................................................................................................................192
16.7 フレームの制御.............................................................................................................................................................................197
16.8 エスケープ機能.............................................................................................................................................................................202
16.8.1 UJIタグのエスケープ処理......................................................................................................................................................202
16.8.2 アトリビュート値のエスケープ処理.........................................................................................................................................202
第17章 APIを使ったプログラミング......................................................................................................................................... 204
17.1 セション管理..................................................................................................................................................................................204
- vii -
17.1.1 Webcoordinatorのセション管理.............................................................................................................................................204
17.1.2 オブジェクトのライフサイクル..................................................................................................................................................206
17.1.3 排他制御................................................................................................................................................................................207
17.1.4 セション切断の検出...............................................................................................................................................................208
17.1.5 高度なセション管理................................................................................................................................................................209
17.1.6 セションIDの更新...................................................................................................................................................................212
17.1.7 セションの明示的な開始と破棄.............................................................................................................................................213
17.1.8 リクエストの検証......................................................................................................................................................................216
17.2 バイナリファイルの送受信.............................................................................................................................................................219
17.2.1 ファイルをアップロードする....................................................................................................................................................219
17.2.2 ファイルをダウンロードする....................................................................................................................................................220
17.3 Webアプリケーションのエラー処理...............................................................................................................................................222
17.3.1 JSPエラーページ....................................................................................................................................................................222
17.3.2 データBeanのエラー処理......................................................................................................................................................223
第18章 データベースとの連携................................................................................................................................................224
18.1 データベース連携の概要.............................................................................................................................................................224
18.2 データベース連携のアプリケーション..........................................................................................................................................224
第19章 アプレットとの連携.....................................................................................................................................................228
19.1 アプレット連携の概要....................................................................................................................................................................228
19.2 アプレット連携のアプリケーション.................................................................................................................................................228
19.2.1 サーバアプリケーションの作成..............................................................................................................................................229
19.2.2 クライアントアプレットの作成..................................................................................................................................................230
19.3 セション管理について...................................................................................................................................................................231
19.3.1 クッキーポリシーについて......................................................................................................................................................231
19.3.2 JBKプラグイン使用時のセション管理...................................................................................................................................231
19.4 実行環境の設定............................................................................................................................................................................232
第20章 Flashとの連携...........................................................................................................................................................234
20.1 Flash連携の概要...........................................................................................................................................................................234
20.2 Flash連携のアプリケーション........................................................................................................................................................234
20.2.1 Flashの作成............................................................................................................................................................................234
20.2.2 サーバアプリケーションの作成..............................................................................................................................................239
第21章 アプリケーション設計時の注意事項............................................................................................................................242
21.1 データBeanの指定について.........................................................................................................................................................242
21.2 送信データの文字エンコーディングについて.............................................................................................................................243
第22章 Webアプリケーションの実行環境の設定.....................................................................................................................244
22.1 実行時に必要なファイル...............................................................................................................................................................244
22.2 実行時のファイル配置..................................................................................................................................................................245
22.3 複数の関係定義ファイルの使用..................................................................................................................................................246
第23章 Interstage Studioを使ったWebアプリケーションの開発...............................................................................................247
23.1 Interstage Studioの場合................................................................................................................................................................247
23.1.1 Interstage Studioが提供する機能..........................................................................................................................................247
23.1.2 ウィザードで生成したファイルの編集....................................................................................................................................249
第4部 EJBアプリケーションの開発.........................................................................................................................................252
第24章 概要..........................................................................................................................................................................253
第25章 セションBeanの開発..................................................................................................................................................257
25.1 セションBeanの作成方法..............................................................................................................................................................257
25.1.1 Javaソースファイルと関係定義ファイルの作成......................................................................................................................257
25.1.2 セションBeanの初期化パラメタの設定...................................................................................................................................259
25.1.3 デプロイメント記述 (ejb-jar.xml).............................................................................................................................................259
25.1.4 ejb-jarファイル.........................................................................................................................................................................260
- viii -
25.2 セションBean特有のプログラミング...............................................................................................................................................261
25.2.1 例外処理................................................................................................................................................................................261
25.2.2 エンタープライズBean環境の参照.........................................................................................................................................262
25.2.3 SessionContextの取得............................................................................................................................................................262
25.2.4 オブジェクトのライフサイクル..................................................................................................................................................262
25.2.5 ユーザ定義ビジネスメソッドの利用........................................................................................................................................263
25.3 セションBeanとクライアントとの連携..............................................................................................................................................264
25.3.1 セション情報の同期...............................................................................................................................................................264
25.3.2 ローカル呼び出し...................................................................................................................................................................265
25.3.3 データBean変換.....................................................................................................................................................................266
25.3.4 HashMapによるデータの入力................................................................................................................................................271
25.3.5 Apcoordinator以外のEJBクライアントとの連携......................................................................................................................271
25.3.6 EJBの引数や返却値として使用可能なオブジェクト.............................................................................................................273
第26章 セションBeanの実行環境の設定................................................................................................................................274
26.1 配備...............................................................................................................................................................................................274
26.2 実行時のクラスパスの設定...........................................................................................................................................................274
26.3 Interstage使用時のセションBeanの環境設定...............................................................................................................................274
26.4 ワークユニット起動時実行クラスの設定.......................................................................................................................................275
第27章 Interstage Studioを使ったセションBeanの開発..........................................................................................................277
27.1 Interstage Studioの場合................................................................................................................................................................277
第5部 電子フォームアプリケーションの開発............................................................................................................................279
第28章 概要..........................................................................................................................................................................280
第29章 電子フォームアプリケーションの作成方法...................................................................................................................283
29.1 電子フォームの作成......................................................................................................................................................................283
29.2 電子フォームの表示......................................................................................................................................................................283
29.3 電子フォームからの入力...............................................................................................................................................................286
29.4 添付ファイルの取得......................................................................................................................................................................288
29.5 項目制御情報の操作....................................................................................................................................................................288
29.6 電子フォームと通常のJSP画面の混在利用.................................................................................................................................289
29.7 電子署名の利用............................................................................................................................................................................290
29.8 セション管理..................................................................................................................................................................................290
第30章 COBOLとの連携.......................................................................................................................................................291
第31章 電子フォームアプリケーションの実行環境の設定........................................................................................................294
第32章 Interstage Studioを使った電子フォームアプリケーションの開発..................................................................................296
32.1 Interstage Studioの場合................................................................................................................................................................296
付録A サンプルアプリケーション.............................................................................................................................................308
A.1 簡単なサンプル..............................................................................................................................................................................308
A.2 画面部品のサンプル......................................................................................................................................................................312
付録B Apcoordinatorの動作概要...........................................................................................................................................321
付録C 旧バージョンとの互換情報...........................................................................................................................................324
C.1 アプリケーション種別共通..............................................................................................................................................................326
C.2 Webアプリケーション......................................................................................................................................................................327
C.3 SOAPサーバアプリケーション........................................................................................................................................................336
C.4 Interstage Studioでのウィザードの利用..........................................................................................................................................336
付録D JIS X 0213:2004(通称JIS2004)規格について.............................................................................................................338
付録E Strutsとの連携............................................................................................................................................................339
E.1 概要.................................................................................................................................................................................................339
E.2 UJIタグを使ったプログラミング.......................................................................................................................................................339
- ix -
E.2.1 データBeanの設定...................................................................................................................................................................340
E.2.2 JSPの編集................................................................................................................................................................................341
E.2.3 データBeanの取得...................................................................................................................................................................343
E.2.4 利用可能なタグの一覧............................................................................................................................................................344
E.3 リモート共通インタフェースの利用.................................................................................................................................................345
E.4 Apcoordinatorアプリケーションとの共存........................................................................................................................................347
付録F Tips............................................................................................................................................................................349
F.1 Webアプリケーションの画面...........................................................................................................................................................349
F.1.1 UJIタグを使用したい................................................................................................................................................................349
F.1.2 フォームを作成したい..............................................................................................................................................................350
F.1.3 入力項目を作成したい............................................................................................................................................................353
F.1.4 表を表示したい........................................................................................................................................................................356
F.1.5 画面をヘッダ部とボディ部などに分けて作成したい..............................................................................................................365
F.1.6 選択項目を作成したい............................................................................................................................................................367
F.1.7 ラジオボタンを作成したい........................................................................................................................................................370
F.1.8 チェックボックスを作成したい..................................................................................................................................................376
F.1.9 入力項目やボタンの色、サイズ、フォントを指定したい..........................................................................................................378
F.1.10 直接HTMLに記述すると誤動作を招く文字 <, >, &, " を安全に表示させたい..................................................................380
F.1.11 サブウィンドウを表示したい...................................................................................................................................................380
F.1.12 Apcoordinatorインストールフォルダにあるタグライブラリディスクリプタをコピーせずに直接使用したい...........................384
F.1.13 コンポーネントタグが作成した入力項目をJavaScriptで参照したい.....................................................................................384
F.1.14 1個のデータBeanを複数の画面で使用したい......................................................................................................................386
F.1.15 JSPのサイズの制限について知りたい...................................................................................................................................387
F.1.16 uji:compositeタグを使用したい..............................................................................................................................................388
F.1.17 繰り返しの項目を簡単に作成したい.....................................................................................................................................388
F.1.18 画面部品タグを使いたい.......................................................................................................................................................388
F.1.19 テーブルの行ごとに色を変更したい.....................................................................................................................................389
F.1.20 画面部品タグで使用するクラスを簡単に作成したい............................................................................................................389
F.1.21 テーブル幅を画面と同じ幅に指定したい.............................................................................................................................389
F.1.22 複数画面でデータBeanを共有したい...................................................................................................................................389
F.1.23 フレームおよびサブウィンドウを表示したい..........................................................................................................................390
F.1.24 例外発生時にエラー画面を表示したい................................................................................................................................390
F.1.25 画面を表示したい..................................................................................................................................................................390
F.2 Webアプリケーションの入力チェック..............................................................................................................................................390
F.2.1 入力項目に入力されたデータが適切かどうかチェックしたい................................................................................................390
F.2.2 入力項目に入力できる字数を制限したい..............................................................................................................................394
F.3 Webアプリケーションの画面遷移...................................................................................................................................................395
F.3.1 ブラウザの「戻る」ボタンを無効にしたい.................................................................................................................................395
F.3.2 ブラウザの「更新」ボタンを無効にしたい................................................................................................................................395
F.3.3 予期しない画面からのフォームの送信を検出したい.............................................................................................................395
F.3.4 1つ前の画面に戻る処理を実現したい...................................................................................................................................397
F.3.5 HTMLのAタグを利用して画面遷移を行いたい.....................................................................................................................399
F.4 Webアプリケーションのセション管理..............................................................................................................................................399
F.4.1 セション管理の基本的な方法を知りたい................................................................................................................................399
F.4.2 タイムアウトを検出したい.........................................................................................................................................................402
F.4.3 タイムアウト発生時点で特定の処理を実行したい..................................................................................................................403
F.4.4 ボタンの多重押下による二重処理を防止したい....................................................................................................................404
F.4.5 明示的にセションを終了させたい...........................................................................................................................................405
F.4.6 URLリライティングを使用したい..............................................................................................................................................406
F.4.7 高度なセション管理について知りたい....................................................................................................................................407
F.4.8 セション切断時に開放される資源を知りたい..........................................................................................................................407
F.4.9 セションタイムアウトを考慮した開発について知りたい...........................................................................................................407
F.5 Webアプリケーションのその他........................................................................................................................................................408
F.5.1 文字エンコーディングを制御したい........................................................................................................................................408
F.5.2 エンコーディングの詳細について知りたい.............................................................................................................................409
F.5.3 文字化けを調査したい.............................................................................................................................................................410
-x-
F.5.4 クライアントのファイルをサーバへアップロードしたい.............................................................................................................412
F.5.5 サーバのファイルをクライアントへダウンロードしたい.............................................................................................................416
F.5.6 電子フォームの添付ファイル項目に入力されたファイルを順番に取得したい.....................................................................418
F.6 EJBアプリケーション........................................................................................................................................................................419
F.6.1 指定時刻にビジネスクラスを呼び出したい.............................................................................................................................419
F.7 Apcoordinatorアプリケーション共通...............................................................................................................................................421
F.7.1 アプリケーションで必要なApcoordinatorのJARファイルを知りたい.......................................................................................421
F.7.2 ログに情報を出力したい..........................................................................................................................................................422
F.7.3 デバッグ時と本稼動時で出力するログの種類を切り替えたい...............................................................................................424
F.7.4 ビジネスクラスのメソッドで発生した例外をまとめて処理したい..............................................................................................426
F.7.5 ビジネスロジックに共通な前処理、後処理をまとめて記述したい..........................................................................................427
F.7.6 コンテナの起動時にアプリケーションを動作させたい............................................................................................................428
F.7.7 ビジネスロジックをJavaではなくXMLで記述したい................................................................................................................430
F.7.8 Apcoordinatorの定義ファイルを分割して作成したい.............................................................................................................433
F.7.9 例外発生時に処理を再試行したい........................................................................................................................................435
F.7.10 JavaScriptと連携したい..........................................................................................................................................................439
F.7.11 XML連携機能とデータBeanとの性能差について知りたい.................................................................................................439
F.7.12 データBean生成ウィザードを使用せずに、入出力ページ生成ウィザードを使用したい....................................................439
F.7.13 データBean生成ウィザードで選択肢にない型のプロパティを追加したい..........................................................................439
F.7.14 ログの出力レベルの使い分けについて知りたい..................................................................................................................439
F.7.15 ApcoordinatorからのEJBの呼出し方法を知りたい...............................................................................................................440
F.7.16 Apcoordinatorアプリケーションの設計手順を知りたい.........................................................................................................440
F.7.17 入出力ページのボタンから呼び出されるメソッドを知りたい.................................................................................................440
F.7.18 負荷分散装置を利用するときの注意事項を知りたい..........................................................................................................441
F.7.19 性能・負荷テストツールを使用する場合の注意事項を知りたい..........................................................................................441
付録G トラブルシューティング.................................................................................................................................................442
G.1 例外発生時の対処.........................................................................................................................................................................442
G.1.1 例外発生時の原因調査方法..................................................................................................................................................442
G.1.2 java.lang.NoClassDefFoundError: org/xml/sax/ContentHandler............................................................................................443
G.1.3 UJI505: method not supported.................................................................................................................................................443
G.1.4 IndexOutOfBoundsException..................................................................................................................................................443
G.1.5 java.io.IOException: パイプが切断されました........................................................................................................................443
G.1.6 java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet............................................................................444
G.2 異常時の対処.................................................................................................................................................................................444
G.2.1 enableCharsアトリビュートで“¥”記号を有効にできない.........................................................................................................444
G.2.2 「戻る」ボタンの擬似的な防止が正常に動作しない...............................................................................................................444
G.2.3 データBeanに対するメソッドの実行に時間が掛かる.............................................................................................................444
G.2.4 クライアントの日付を未来日にすると動作しない....................................................................................................................444
G.2.5 Interstage Application Serverのセションリカバリ機能が正常に働かない..............................................................................445
G.2.6 EJBアプリケーションのログから呼出し元のWebアプリケーションログを参照する................................................................445
G.2.7 問題発生時にログを取得する.................................................................................................................................................445
G.2.8 問題発生時に関連するログを検索する.................................................................................................................................445
G.2.9 コマンドマップおよびページマップの書換えが反映されない...............................................................................................445
G.2.10 Flash連携機能で予期しない動作をする..............................................................................................................................446
付録H 各エディションで提供される機能..................................................................................................................................447
用語集...................................................................................................................................................................................449
- xi -
第1部 Apcoordinatorが提供するフレームワーク
第1章 製品の概要.............................................................................................................................................2
第2章 Apcoordinatorが提供するフレームワークの概要......................................................................................8
-1-
第1章 製品の概要
1.1 Apcoordinatorとは
Apcoordinator(エー・ピー・コーディネーター)は、Java(TM) 2 Platform, Enterprise Edition(J2EE)に従ったアプリケーションの構築を支
援するアプリケーションフレームワーク製品です。本製品では、Apcoordinatorのフレームワークに従って作成されたアプリケーションの
実行機能を提供します。
アプリケーションフレームワーク
ビジネスアプリケーションを作成する場合、まずアプリケーションの骨組みを決めてから、その骨組みに肉付けするようにアプリケーショ
ンを作成します。この骨組みのことをアプリケーションフレームワーク、または単にフレームワークといいます。
フレームワークを使ったアプリケーション開発では、ロジックや画面などのアプリケーション要素を規定に従った形で作成し、フレーム
ワークにはめ込むことでアプリケーションを作成します。フレームワークの規定によって自由度が制限されますが、アプリケーションの骨
格が明確となり、自然に保守や再利用の容易なアプリケーションを作成することになります。
Apcoordinatorのフレームワーク
Apcoordinatorのアプリケーションフレームワークは、J2EEアプリケーションの支援を目的に設計されています。フレームワークに従って
アプリケーションを作成することで、次のようなメリットがあります。
・ アプリケーションの構造を統一し、ソースプログラムの可読性を高めます。
・ ロジックや画面などのアプリケーション要素を独立して作成し、保守性を高めます。
・ アプリケーションの部品化を容易にし、再利用性を高めます。
・ 通信などの部分をフレームワークで隠蔽し、自動処理します。
図1.1 Webアプリケーションへのフレームワークの適用
Apcoordinatorの支援するアプリケーション
Apcoordinatorは以下のアプリケーションの開発を支援します。
・ Webアプリケーション
- JSP(JavaServer Pages)またはサーブレットを利用したWebアプリケーションのフレームワークを提供しています。画面とロジック
の分離、構造化を支援します。
-2-
- アプレットとの通信機能を提供しています。
・ EJB(Enterprise JavaBeans)
- EJBとWebフロントの親和性を高めるフレームワークを提供しています。
・ 電子フォームアプリケーション
- 紙の帳票と同じイメージの画面を使ったWebアプリケーションを容易に開発することができます。
図1.2 Apcoordinatorの支援するアプリケーション
製品の構成
Apcoordinatorは以下のコンポーネントから構成されています。
・ Apcoordinatorコア
アプリケーションの構造を規定するフレームワークで、以下の機能があります。
- 実行制御機能
- XML操作
- EJB呼び出し機能
- コマンドスクリプティング
- XMLデータ仕様記述
- アプリケーションログのサポート
・ Webcoordinator
Webフロントに特化した機能を提供します。
- UJI(Unified JSP Interface)タグによる画面作成
- セション管理
- バイナリファイルの送受信
- データベースとの連携
- アプレットとの連携
・ Bccoordinator
EJB業務サービス層を構築するための機能を提供します。
- EJBセションBeanの作成支援
-3-
・ Formcoordinator
電子フォームによるWeb画面の運用機能を提供します。
署名オプションで、電子フォームでの電子署名が可能です。
図1.3 製品の構成
1.2 Apcoordinatorの特長
Apcoordinatorのフレームワークを適用することで、均一で拡張性に優れたアプリケーションを作成することができます。
J2EE準拠
Apcoordinatorのフレームワークは、以下の仕様に準拠しています。
・ Servlet 2.3、Servlet 2.4
・ JSP1.2、Servlet 2.3
・ EJB1.1、EJB2.0、EJB2.1
これらのJ2EE機能を提供する任意のアプリケーションサーバ上でフレームワークを利用した3階層アプリケーションを構築できます。
アプリケーションの構造を統一
フレームワークを適用することで、開発者によるアプリケーション構造の差異を無くします。
アプリケーション構造の見通しがよくなり、保守や部品の切り出しが容易になります。
特にWebフロントでは、画面とロジックを分離して作成するため、開発・保守が容易になります。
拡張性の高いフレームワーク
Apcoordinatorのフレームワークでは、アプリケーションの入り口を集約し、機能追加が容易な構造となっています。
外付けの定義ファイルによって処理や画面の差し替えが可能で、アプリケーションの拡張性を高めています。
生産性を向上する機能群
UJIタグを利用することで、表形式やコンボボックスなどの画面を簡単なタグ記述のみで実現できます。
また、XMLデータ仕様記述を使うことで、処理の論理をJavaによるコーディングなしで実現することができます。
実帳票イメージの入出力
電子フォームを使用することにより、紙の帳票と同じイメージをWebブラウザに表示し、帳票に入力されたデータをWebアプリケーション
で処理することができます。また、署名オプションを使用することで、クライアントでの署名機能を実現します。
-4-
1.3 本マニュアルの読み方
本製品を利用してアプリケーションを開発する場合、以下の表に示すマニュアルを読んでください。
・ 機能からマニュアルを探す
- 共通機能
- Webフロント関連機能
- EJB関連機能
- 電子フォーム関連機能
・ コンポーネントからマニュアルを探す
機能からマニュアルを探す
機能
マニュアル
サンプル
共通
フレームワークの概要を理解する
第2章 Apcoordinatorが提供するフレー
ムワークの概要
処理の流れをXML化する
第10章 コマンドスクリプティング
定義ファイルリファレンス
commandMap
データ仕様をXML化する
第11章 XMLデータ仕様記述
定義ファイルリファレンス
eSpecCalc, carrent,
eSpecSheet
XMLファイルの読み込み、保存や、XMLデー
タの操作を行う
第6章 XMLデータの利用
アプリケーションで使用する文字列データを
XMLファイルで定義する
4.5 リソースファイル
Apcoordinatorの業務サービスを呼び出す
第7章 リモート共通インタフェース
ejbOffice
バックシステムのアプリケーションを呼び出す
第12章 バックエンドとの連携
async
アプリケーションログを出力する
第5章 アプリケーションログ
logTest
データベースと同等の堅牢な書込みが保証さ
れたログ機能を使用する
5.6 高信頼性ログ
高信頼性ログ運用ガイド (*1)
高信頼性ログコマンドリファレンス (*1)
Interstage Business Application Server
運用ガイド(高信頼性ログ編) (*2)
Interstage Business Application Server
リファレンス (*2)
ビジネスクラスが例外で終了した場合に再度ビ
ジネスクラスを呼び出す
4.6 ビジネスクラスの再試行
ビジネスクラスの呼び出しを制御する
4.4 ビジネスクラス呼び出しのフック
イベントを利用する
4.3 ユーザ定義イベントの利用
XMLデータ仕様記述からJavaソースを生成す
る
第11章 XMLデータ仕様記述
トランザクションを管理する
4.7 トランザクションの管理
meetingroom, errmsg
eSpecCalcc, carrentc
Webフロント
Apcoordinatorの画面の制御を理解する
第15章 Webcoordinatorアプリケーショ
ンの骨格
-5-
simpleForm, sample
機能
マニュアル
サンプル
UJIタグを使う
第16章 UJIタグを使ったプログラミング
UJIタグリファレンス
board, catalog, address, script,
model, include, button, tree,
parts, parts2
外字を使用する
16.4.5 外字入力タグの利用
ブラウザのサブウィンドウを利用する
16.6 ウィンドウの制御
subwin
画面をフレームに分割する
16.7 フレームの制御
frame
セションごとにデータを管理する
17.1.1 Webcoordinatorのセション管理
バイナリファイルを送受信する
17.2 バイナリファイルの送受信
updown, browse
XMLのデータを表示する
16.5 タグによるXMLデータの利用
UJIタグリファレンス
xmlAddress
データベースのデータを表示する
第18章 データベースとの連携
office
アプレットと連携する
第19章 アプレットとの連携
applet
画面にコンボボックスを作成する
16.4.3 コレクションタグの利用
UJIタグリファレンス
board, comboBox
画面に表を作成する
16.4.3 コレクションタグの利用
UJIタグリファレンス
address, scrollTable, model,
scrollList
セションの切断を検出する
17.1.4 セション切断の検出
timeout
二重処理を防止する
17.1.5 高度なセション管理
click
想定外の画面からのリクエストを防ぐ
17.1.8 リクエストの検証
sessionControl、security
Flashと連携する
第20章 Flashとの連携
flash
EJBの構成を理解する
第24章 概要
EJBセションBeanを作成する
第25章 セションBeanの開発
ejbOffice, roomresv
ApcoordinatorのEJBを呼び出す
8.1 Apcoordinatorで作成したセション
Beanの呼び出し
ejbOffice, roomresv
一般のEJBを呼び出す
8.2 一般的なEJBの呼び出し
EJBサーバがダウンした場合に他のEJBサーバ
を呼び出す
8.5 EJB複数指定機能
EJBの簡易的な負荷分散を行う
8.5 EJB複数指定機能
EJBが例外で終了した場合に再度EJBを呼び
出す
8.6 EJBの再試行
EJB
電子フォーム
電子フォームを利用する
第5部 電子フォームアプリケーションの
開発
Formcoordinatorユーザーズガイド
COBOLアプリケーションと連携する
NetCOBOL XMLオプション 解説書 for
Windows (NetCOBOL XMLオプション
for Windows に添付)
(*1) Interstage Business Application Server Standard Edition で提供されます。
(*2) Interstage Business Application Server Enterprise Edition で提供されます。
-6-
formc, formc2
コンポーネントからマニュアルを探す
コンポーネント
マニュアル
サンプル
Apcoordinatorコア
フレームワーク共通の機能
第2部 Apcoordinatorコアの機能
commandMap, eSpecCalc,
logTestなど(*1)
第3部 Webアプリケーションの開発
simpleForm, sample, board な
ど(*1)
第4部 EJBアプリケーションの開発
ejbOffice, roomresv
第5部 電子フォームアプリケーションの
開発
Formcoordinator ユーザーズガイド
formc, formc2
Webcoordinator
Webアプリケーション
Bccoordinator
EJBセションBean
Formcoordinator
電子フォームアプリケーション
(*1) サンプルはこれ以外にも多数あります。他のサンプルについては、“機能からマニュアルを探す”または、“入門ガイド”の“サンプ
ル集”を参照してください。
-7-
第2章 Apcoordinatorが提供するフレームワークの概要
ApcoordinatorはWebアプリケーションフレームワークであるWebcoordinator、EJBのフレームワークであるBccoordinator、そして電子
フォームアプリケーションを実現するためのFormcoordinatorの3つの要素で構成されています。また、それぞれのフレームワークには
Apcoordinatorで共通のフレームワークであるApcoordinatorコアが含まれています。
この章では、Apcoordinatorコアと、Webcoordinator、Bccoordinator、Formcoordinator、そしてそれぞれのフレームワークの連携につい
て説明します。
2.1 Apcoordinatorコア
Apcoordinatorコアとは、Apcoordinatorアプリケーションで共通に使用されるフレームワークです。以下の図に示すように、Apcoordinator
で作成するアプリケーションは、いずれもApcoordinatorコアが既定する構成要素を使用します。
Apcoordinatorコアの主な構成要素は以下のとおりです。
・ ビジネスクラス
アプリケーションで行う処理を実行するJavaのクラスです。
・ データBean
クライアントから入力されたデータや、クライアントへ出力するデータを記憶するJavaのクラスです。
・ コマンドマップ
クライアントからの入力データの種類と、アプリケーションで実行する処理の対応を定義するファイルです。
これらの構成要素の関係は次の図のようになっています。
-8-
次節以降では、Webアプリケーション、EJBが、Apcoordinatorコアを中心にしてどのように構成されるかを説明します。
2.2 Webcoordinator
2.2.1 Webアプリケーション
Apcoordinatorで作成するWebアプリケーションが、どのようなプログラムやファイルで構成されるのかを説明します。次のようなユーザ
登録を行うWebアプリケーションを例に説明します。
このアプリケーションでは、ユーザ情報を入力する画面で氏名と住所を入力して登録ボタンを押すと、入力された情報がWebサーバに
送られます。Webサーバ上のプログラムはユーザ登録の処理を実行し、新しいユーザIDを作成します。そのあと、登録完了画面が表
示され、そこにユーザIDが表示されます。
入出力ページ、ビジネスクラス、データBean
ApcoordinatorではWebアプリケーションを主に次の要素で構成します。
-9-
入出力ページ
画面を実現するJSPファイルです。例では、ユーザ情報入力画面と登録完了画面をそれぞれ入出力ページとして作成します。入出
力ページは主にHTMLタグとUJIタグを使って記述します。UJIタグはApcoordinatorが提供するタグであり、プログラムが出力した
データを表示したり、HTMLでは手間のかかる画面を簡単に作成したりするために使用します。
ビジネスクラス
Webサーバ上で行う処理を実行するJavaのクラスです。例では、新しいユーザを登録しユーザIDを作成する処理をビジネスクラス
に記述します。
データBean
画面から入力されたデータや、ビジネスクラスから出力されて画面に表示させるデータを記憶するJavaのクラスです。例では、ユー
ザの氏名と住所、ユーザIDを記憶するデータBeanを作成します。
以上の3種類の要素は次のように連携して動作します。
・ 画面にユーザが入力したデータは、データBeanに記憶されます。
・ そのデータBeanが、ビジネスクラスに入力として与えられます。
・ ビジネスクラスはユーザが入力したデータをデータBeanから取得し、必要な処理を行います。また、画面に表示させたいデータをデータ
Beanにセットして出力します。
・ ビジネスクラスが出力したデータBeanは入出力ページに与えられます。入出力ページに記述されたUJIタグがデータBeanからデー
タを取得して画面に表示します。HTMLタグはそのまま画面に表示されます。
コマンドマップ
前述の例では、データを入力する画面が1個しかありませんでした。一般には入力画面が複数あり、サーバ上で実行する処理はそれ
ぞれの入力画面ごとに異なります。例として、前述の例にユーザ登録を削除する機能を追加するため、ユーザIDを入力する入出力
ページを追加し、ビジネスクラスにはユーザ登録を削除する処理を追加します。
- 10 -
この場合、登録処理と削除処理を呼びわける必要があります。このような呼び分けは「コマンドマップ」と呼ぶファイルで指定します。呼
び分けの方法は次のようになります。
・ 各入力画面ごとに、別々のデータBeanのクラスを作成します。
・ 入力されたデータをどのクラスのデータBeanに記憶させるのかを、入出力ページ内に記述します。
・ コマンドマップには、各データBeanのクラスに対し、呼び出されるビジネスクラスのメソッド名を記述します。
例では次のようになります。
・ 2つのデータBeanのクラスUserInfo, RemoveInfoをそれぞれユーザ情報入力画面、削除ID入力画面に作成します。
・ ユーザ情報入力用の入出力ページではUserInfoクラスを、削除ID入力用の入出力ページではRemoveInfoを使うように記述しま
す。
・ ビジネスクラスに2つのメソッドaddUserとremoveUserを作成し、それぞれ登録、削除に必要な処理を記述します。
・ コマンドマップには以下の対応を記述します。
- UserInfoクラス → addUserメソッド
- RemoveInfoクラス → removeUserメソッド
コマンド
1つの画面の中にボタンが複数あって、押されたボタンによって処理を切り替えたい場合があります。例えば、前述の例でユーザ情報
を入力する画面に「登録」「検索」の2つのボタンがあって、押されたボタンに応じてそれぞれ別の処理を行うとします。
このような切り替えには次のように「コマンド」を使用します。
- 11 -
・ 各ボタンに「コマンド名」を付けます。コマンド名は、ボタンが押された時に実行したい処理の名前です。例では、登録ボタンに
「add」、検索ボタンに「search」というコマンド名を付けます。
・ コマンドマップには、データBeanのクラスとコマンド名との組に対し、呼び出されるビジネスクラスのメソッド名を記述します。例では
次の対応を記述します。
- UserInfoクラス, addコマンド → addUserメソッド
- UserInfoクラス, searchコマンド → searchUserメソッド
Webアプリケーションのまとめ
Webアプリケーションの構成要素のうち、ここまでで説明したものをまとめます。
入出力ページ
画面を実現するJSPファイルです。
ビジネスクラス
Webサーバ上で行う処理を実行するJavaのクラスです。
データBean
画面から入力されたデータや、ビジネスクラスから出力されて画面に表示されるデータを記憶するJavaのクラスです。
コマンドマップ
データBeanクラスとコマンド名の組と、呼び出されるビジネスクラスのメソッド名の対応を記述したファイルです。コマンド名とは、実
行したい処理の名前であり、画面上のボタンに付けます。
Webアプリケーションには以下の構成要素も必要ですが、詳しくは“第3部 Webアプリケーションの開発”で説明します。
制御ページ
ブラウザからのリクエストを受け取り、サーバ上での処理の開始を指示するJSPページです。
ページマップ
ビジネスクラスが出力したデータBeanと、表示に使用する入出力ページの対応を記述したファイルです。
以上の構成要素の連携を図に示します。
- 12 -
ここでは、簡単なWebアプリケーションを例にApcoordinatorの提供する最も基本的な機能を説明しました。Apcoordinatorでは、Webア
プリケーションの作成を支援する以下の機能も提供します。
UJIタグ
画面の作成にUJIタグが使用できます。プログラムが出力したデータを表示したり、HTMLでは手間のかかる画面を簡単に作成し
たりするために使用できます。
セション管理
同一のクライアントからのリクエストを1つのセションとして扱うことができます。また、セションごとに情報を管理することが容易に実現
できます。
画面領域の分割
画面を複数の領域に分け、各領域で異なるデータBeanと入出力ページを使用できます。
2.3 Bccoordinator
2.3.1 EJB
Apcoordinatorは、EJBのセションBeanを作成するフレームワークを提供します。 Apcoordinatorでは、セションBeanを主に以下の要素
で構成します。
ビジネスクラス
セションBeanで行う処理を実行するJavaのクラスです。
データBean
クライアントからセションBeanへ入力されるデータとして、または、セションBeanからクライアントへ返されるデータとして使用されるJava
のクラスです。
コマンドマップ
データBeanクラスとコマンド名の組と、呼び出されるビジネスクラスのメソッド名の対応を記述したファイルです。
- 13 -
上記の構成要素の役割は、Webアプリケーションの場合とほぼ同じです。異なるのは、データBeanとコマンドがどのようにビジネスクラ
スに与えられ、出力したデータBeanがどのように利用されるかです。EJBの場合、データBeanとコマンドはクライアントから送信されま
す。ビジネスクラスが出力したデータBeanはクライアントが受信して使用します。ビジネスクラス、データBean、コマンドマップがどのよう
に連携して動作するのかを次の図に示します。
ApcoordinatorによるセションBeanの作成の詳細については、“第4部 EJBアプリケーションの開発”を参照してください。
2.4 Formcoordinator
Formcoordinatorを利用することで容易に電子フォームアプリケーションを構築することが可能です。電子フォームアプリケーションは、
電子フォームを利用して申請処理や伝票処理をWeb上で実現します。電子フォームを使用することにより、紙の帳票と同じイメージをWeb
ブラウザに表示し、帳票に入力されたデータをアプリケーションで処理することができます。
電子フォームアプリケーションの構成は、Webアプリケーションの場合とほぼ同じです。異なるのは、画面を構成するために電子フォー
ムを使用する点です。電子フォームアプリケーションの構成要素を次の図に示します。
- 14 -
電子フォームアプリケーションの詳細は、“第5部 電子フォームアプリケーションの開発”を参照してください。
2.5 Apcoordinatorで作成したアプリケーションの連携
Apcoordinatorで作成したアプリケーションは、以下の図のように連携して動作することができます。
- 15 -
第2部 Apcoordinatorコアの機能
第3章 Apcoordinatorアプリケーションの主な構成要素......................................................................................17
第4章 APIを使ったプログラミング.....................................................................................................................24
第5章 アプリケーションログ..............................................................................................................................49
第6章 XMLデータの利用.................................................................................................................................79
第7章 リモート共通インタフェース.....................................................................................................................85
第8章 EJBの呼び出し......................................................................................................................................89
第9章 アプリケーション連携実行基盤との連携................................................................................................100
第10章 コマンドスクリプティング......................................................................................................................101
第11章 XMLデータ仕様記述..........................................................................................................................105
第12章 バックエンドとの連携..........................................................................................................................120
第13章 実行環境の設定................................................................................................................................135
- 16 -
第3章 Apcoordinatorアプリケーションの主な構成要素
この章では、Apcoordinatorアプリケーションで共通に使用される以下の主要な構成要素について説明します。
ビジネスクラス
クライアントから入力されたデータの処理を実行するJavaのクラスです。
データBean
Apcoordinatorアプリケーションがクライアントとの間で入出力するデータを格納するクラスです。
セションクラス
セション単位で管理されるデータを保持するためのクラスです。
アプリケーションクラス
すべてのセションで共有されるデータを格納するクラスです。
ファクトリクラス
アプリケーションクラスやセションクラスのインスタンスを作成するクラスです。
設定ファイル
Apcoordinatorアプリケーションの動作や設定を記述するファイルです。
Apcoordinatorの内部動作の概要については、“付録B Apcoordinatorの動作概要”で説明します。Apcoordinatorアプリケーションのデ
バッグ時や、フレームワークをより深く理解したい場合に参照してください。
3.1 ビジネスクラス
ビジネスクラスには、クライアントから入力したデータを処理するメソッドを作成します。ビジネスクラスを複数作成することも可能です。
ビジネスクラスの例を示します。
package calc;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
public class CalcHandler extends GenericHandler
{
public boolean init() {
return true;
}
public void add(DispatchContext context, BodyBean dataBean) {
double result = dataBean.getVal1() + dataBean.getVal2();
dataBean.setMessage("加算を実行しました。");
dataBean.setResult(result);
dataBean.setVerb("resmode");
context.setResponseBean("body", dataBean);
}
public void sub(DispatchContext context, BodyBean dataBean) {
double result = dataBean.getVal1() - dataBean.getVal2();
dataBean.setMessage("減算を実行しました。");
dataBean.setResult(result);
dataBean.setVerb("resmode");
context.setResponseBean("body", dataBean);
}
public void next(DispatchContext context, BodyBean dataBean) {
dataBean.setVerb("reqmode");
context.setResponseBean("body", dataBean);
- 17 -
}
public void startup(DispatchContext context) {
BodyBean dataBean = new BodyBean();
dataBean.setVerb("reqmode");
context.setResponseBean("body", dataBean);
}
}
ビジネスクラスはcom.fujitsu.uji.Handler インタフェースを実装して作成してください。簡単に作成するにはcom.fujitsu.uji.GenericHandler
クラスを継承して作成することもできます。GenericHandlerクラスはHandlerインタフェースの簡単な実装を提供します。
入力データを処理するメソッドの引数は、次のようにします。
public void someMethod(com.fujitsu.uji.DispatchContext context, [入力データのクラス名] data);
ただし、入力データがnullの場合に呼び出されるメソッドは、次のようにDispatchContextクラスのみを引数とします。
public void someMethod(com.fujitsu.uji.DispatchContext context);
クライアントから入力するデータには次の4種類があり、アプリケーション種別ごとに使用する種類が異なります。
種類
説明
使用できるアプリケーション種別
(*)
Web
EJB
電子
フォーム
データBean
データをJavaBeans形式のプロパティで保持す
るクラスです。詳細は“3.2 データBean”を参照
してください。
○
○
○
XMLデータBean
(com.fujitsu.uji.xml.XmlDataBeanクラス)
データをXMLで保持するクラスです。詳細
は“第6章 XMLデータの利用”を参照してくだ
さい。
○
○
○
FormデータBean
(com.fujitsu.uji.formc.FormDataBeanクラス)
電子フォームアプリケーションにおいて、電子
フォームのデータを保持するクラスです。詳細
は“第5部 電子フォームアプリケーションの開
発”を参照してください。
-
-
○
HashMap(java.util.HashMapクラス)
EJBセションBeanで使用します。詳細は“25.3.4
HashMapによるデータの入力”を参照してくだ
さい。
-
○
-
(*)アプリケーション種別を以下のように省略して表記しています。
・Webアプリケーション → Web
・EJBセションBean → EJB
・電子フォームアプリケーション → 電子フォーム
欄内の記号は以下を表します。
○: その種類の入力データが使用できます。
- : その種類の入力データは使用できません。
メソッドの返り値の型は、アプリケーションの種別やメソッドの用途によって異なります。以下を参照してください。
・ Webアプリケーション: 15.3 Webcoordinatorアプリケーションのファイル
・ EJBセションBean: 第25章 セションBeanの開発
・ 電子フォームアプリケーション: 29.2 電子フォームの表示
Handlerインタフェースのinitメソッドをオーバライドし返り値を変更することによって、ビジネスクラスのライフサイクルを以下から選択で
きます。
・ initメソッドがtrueを返す場合: 最初にビジネスクラスが呼び出されたときにインスタンスが作成され、以降セションが終了するまで同
じインスタンスが使用されます。この場合、セションが終了するときにビジネスクラスのdestroyメソッドが呼び出されます。
- 18 -
・ initメソッドがfalseを返す場合: クライアントからのリクエストのたびにインスタンスが作成されます。
ビジネスクラスの作成方法に関する各アプリケーション種別に固有の解説については、以下を参照してください。
・ Webアプリケーション: 15.3 Webcoordinatorアプリケーションのファイル
・ EJBセションBean: 第25章 セションBeanの開発
・ 電子フォームアプリケーション: 29.2 電子フォームの表示
注意
ビジネスクラスの引数として渡されるDispatchContextオブジェクトはApcoordinatorがリクエストごとに1つだけ生成するオブジェクトで、そ
のリクエストに関する情報を保持しています。例えばセションスコープに保存するなど、リクエストをまたいでDispatchContextを使用する
とアプリケーションが正しく動かないので注意してください。
3.2 データBean
データBeanはApcoordinatorアプリケーションがクライアントとの間で入出力するデータを格納するクラスです。com.fujitsu.uji.DataBean
クラスを継承して作成し、JavaBeans形式でプロパティを作成します。
データBeanの作成例を示します。データBeanにStringクラスのプロパティmessageを作成するには、次のようにmessage変数、setMessage
メソッド、getMessageメソッドを作成します.
public class BodyBean extends DataBean {
protected String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
注意
getメソッドとsetメソッドの両方を定義する場合、 setメソッドの引数の型とgetメソッドの返却値の型を一致させてください。一致していない
場合、プロパティの取得や設定が行えず、実行時に例外が発生する場合があります。
データBeanのプロパティ名は、以下のように設定します。
・ 英小文字を中心に単語の区切りを大文字にすることを推奨します。
today、orderDate、shoninBi
・ アンダーバー"_"、数字は使用可能
my_value0
・ 大文字のみの並びは可能
URL
注意
以下のプロパティ名は実行時にエラーになります。
・ 大文字で始まる小文字交じりの名前
Today
・ 2文字目が大文字の名前
aSample
- 19 -
・ 大文字1文字の名前
X
この他、Javaの予約語など、Javaの変数名として許されない名前は構築時にエラーになります。
3.3 セションクラス
セションクラスはセション単位で管理されるデータを保持するためのクラスです。一つのセションに対して、セションクラスのインスタンス
が一つ作成され、セションが終了するまで同じインスタンスが使用されます。com.fujitsu.uji.SessionProfileのサブクラスがセションクラス
として使用されます。
アプリケーション独自の情報をセションクラスに格納したい場合は、ユーザ定義のセションクラスを次のように作成してください。
・ Webアプリケーションの場合
com.fujitsu.uji.http.HttpSessionProfile ク ラ ス を 継 承 し ま す 。 高 度 な セ シ ョ ン 管 理 を 行 う 場 合 は
com.fujitsu.uji.http.HttpControlStateProfileを継承します。Webアプリケーションの高度なセション管理については“17.1.5 高度なセ
ション管理”を参照してください。
・ EJBセションBeanの場合
com.fujitsu.uji.ejb.bean.EJBSessionProfileクラスを継承します。
ユーザ定義のセションクラスを作成した場合、ファクトリクラスを作成して、ユーザ定義のセションクラスが使用されるようにしてください。
この方法については“3.5 ファクトリクラス”を参照してください。
ユーザ定義のセションクラスを作成しない場合、以下のクラスがセションクラスとして使用されます。
アプリケーション種別
使用されるセションクラス
Webアプリケーション
com.fujitsu.uji.http.HttpSessionProfile
EJBセションBean
com.fujitsu.uji.ejb.bean.EJBSessionProfile
3.4 アプリケーションクラス
アプリケーションはすべてのセションで共有されるデータを格納するクラスです。1つのアプリケーションにつき、アプリケーションクラス
のインスタンスが1つ作成されます。com.fujitsu.uji.ApplicationProfileクラスまたはサブクラスがアプリケーションクラスとして使用されま
す。
アプリケーション独自の情報をアプリケーションクラスに格納したい場合は、以下の作業が必要です。
・ ApplicationProfileクラスを継承してユーザ定義のアプリケーションクラスを作成してください。
・ ファクトリクラスを作成して、ユーザ定義のアプリケーションクラスが使用されるようにします。この方法については“3.5 ファクトリクラ
ス”を参照してください。
アプリケーションクラスをユーザ定義しない場合、com.fujitsu.uji.ApplicationProfileが使用されます。
3.5 ファクトリクラス
ファクトリクラスはアプリケーションクラスやセションクラスのインスタンスを作成するクラスです。ユーザ定義のアプリケーションクラスやセ
ションクラスを使用する場合は、ユーザ定義のファクトリクラスが必要です。
ユーザ定義のファクトリクラスは次のように作成します。
・ 以下のクラスを継承します。
アプリケーション種別
継承するクラス
Webアプリケーション
com.fujitsu.uji.http.HttpFactory
EJBセションBean
com.fujitsu.uji.ejb.bean.EJBFactory
・ ユーザ定義のアプリケーションクラスを使用する場合は、newApplicationProfileメソッドをオーバーライドし、アプリケーションクラス
の新しいインスタンスが返るようにします。
- 20 -
・ ユーザ定義のセションクラスを使用する場合は、newSessionProfileメソッドをオーバーライドし、セションクラスの新しいインスタンス
が返るようにします。
・ ファクトリクラスのクラス名を初期化パラメタで指定します。指定方法は以下を参照してださい。
- Webアプリケーション: 第22章 Webアプリケーションの実行環境の設定
- EJBセションBean: 25.1.2 セションBeanの初期化パラメタの設定
ファクトリクラスの記述例を示します。
import com.fujitsu.uji.SessionProfile;
import com.fujitsu.uji.ApplicationProfile;
public class SampleFactory extends com.fujitsu.uji.http.HttpFactory
{
public SessionProfile newSessionProfile() {
return new SampleSessionProfile();
}
public ApplicationProfile newApplicationProfile() {
return new SampleApplicationProfile();
}
}
3.6 設定ファイル
Apcoordinatorには以下の設定ファイルがあります。コマンドマップはApcoordinatorアプリケーションに必須のファイルです。その他の
ファイルは使用する機能に応じて必要になります。
設定ファイル
機能
詳細解説
コマンドマップ
クライアントから入力したデータに応じ
て、どのビジネスクラスのどのメソッドを呼
び出すのかを記述したファイルです。
3.6.1 コマンドマップ
ページマップ
ページマップは、ビジネスクラスの処理
結果であるデータBeanと、データBeanの
持つ表示モードを、入出力ページに関
連付けます。Webアプリケーションで使
用します。
15.3 Webcoordinatorアプリケーションの
ファイル
リソースファイル
アプリケーションで使用する文字列デー
タを定義するファイルです。
4.5 リソースファイル
リモートマップ
リモート共通インタフェースを使って呼び
出すアプリケーションの名前を定義する
ファイルです。
7.2 リモートマップ
コマンドスクリプティングのXMLファイル
コマンドスクリプティングにおいて、処理
のフローを記述します。
第10章 コマンドスクリプティング
XMLデータ仕様記述のXMLファイル
XMLデータ仕様記述において、データ
Beanのプロパティのチェックや、項目間
の転記の仕様を記述します。
第11章 XMLデータ仕様記述
ビジネスクラス設定ファイル
ビジネスクラス再試行機能とトランザクショ
ン管理機能において、ビジネスクラスの
設定を記述するファイルです。
4.6 ビジネスクラスの再試行
4.7 トランザクションの管理
asyncマップ
バックエンド連携サービスライブラリにお
いて、利用するサービスアダプタやイベ
ントサービス、サービスの呼び出し方法
を定義します。
第12章 バックエンドとの連携
- 21 -
設定ファイル
データBean変換マップ
機能
EJB呼び出し時に使用するデータBean
変換機能においてデータBeanの変換方
法を指定するファイルです。
詳細解説
25.3.3 データBean変換
設定ファイルは設定ファイルフォルダに配置します。
この節では、コマンドマップと、設定ファイルフォルダについて説明します。コマンドマップ以外の設定ファイルについては、その設定
ファイルを使用する各機能の解説を参照してください。
3.6.1 コマンドマップ
コマンドマップには、クライアントから入力したデータに応じて、どのビジネスクラスのどのメソッドを呼び出すのかを記述します。
コマンドマップの各行が、入力したデータと呼び出すメソッドとの対応を表します。行の記述形式は受信するデータの種類によって異
なります。
・ データBeanの場合
[入力のデータBeanのクラス名];[コマンド]=[ビジネスクラス名].[メソッド名]
・ XMLデータBean(com.fujitsu.uji.xml.XmlDataBeanクラス)の場合
/[入力のXMLデータBeanのルート要素の要素名];[コマンド]=[ビジネスクラス名].[メソッド名]
XMLデータBeanはデータをXMLで保持するクラスです。詳細は“第6章 XMLデータの利用”を参照してください。
また、ルート要素名が名前空間修飾されている場合は、接頭辞を含めずにローカル名のみ指定してください。
・ FormデータBean(com.fujitsu.uji.formc.FormDataBeanクラス)の場合
/[電子フォーム名];[ボタン名]=[ビジネスクラス名].[メソッド名]
FormデータBeanは電子フォームアプリケーションにおいて、電子フォームのデータを保持するクラスです。詳細は“第5部 電子
フォームアプリケーションの開発”を参照してください。
・ HashMap(java.util.HashMapクラス)の場合
$[入力のHashMapのデータタイプ];[コマンド]=[ビジネスクラス名].[メソッド名]
HashMapによるデータ入力はEJBセションBeanで使用します。詳細は“25.3.4 HashMapによるデータの入力”を参照してください。
・ 受信したデータがnullでコマンドが指定された場合
;[コマンド]=[ビジネスクラス名].[メソッド名]
・ 受信したデータとコマンドが両方ともnullの場合
;=[ビジネスクラス名].[メソッド名]
この形式の行は1行だけ書くことができます。Webアプリケーションでは、ユーザから最初にアクセスされた時に呼び出されるメソッ
ドをこの形式で指定します。
"#"で始まる行はコメントになります。
"+"に続けてファイル名を書くと、そのファイルをインクルードできます。ファイル名はコマンドマップのあるフォルダからの相対パスで記
述します。パス区切り文字は"/"です。インクルードするファイルの拡張子が.xmlの場合は、コマンドスクリプティングとして扱われます。
# このファイルと同じフォルダにあるsub.mapをインクルード
+sub.map
# サブフォルダxscriptにあるコマンドスクリプティングcomscr.xmlをインクルード
+xscript/comscr.xml
以下はコマンドマップの記述例です。
- 22 -
・ データBeanを使用する例
# commands.map
calc.BodyBean;add=calc.CalcHandler.add
calc.BodyBean;sub=calc.CalcHandler.sub
calc.BodyBean;next=calc.CalcHandler.next
;=calc.CalcHandler.startup
・ XMLデータBeanを使用する例
# commands.map
/catalog;update=sample.CatalogHandler.update
/catalog;search=sample.CatalogHandler.search
/userinfo;update=sample.UserHandler.update
sample.BodyBean;maintain=sample.CatalogHandler.maintain
;=sample.CatalogHandler.startup
上記例では、5行目で通常のデータBeanも混在して使用しています。
・ HashMapを使用する例
# commands.map
$catalog;update=sample.CatalogHandler.update
$catalog;search=sample.CatalogHandler.search
$userinfo;update=sample.UserHandler.update
;=sample.CatalogHandler.startup
3.6.2 設定ファイルフォルダ
Apcoordinatorの設定ファイルは設定ファイルフォルダに配置します。デフォルトの設定ファイルフォルダは以下のとおりです。
アプリケーション種別
設定ファイルフォルダ
Webアプリケーション
電子フォームアプリケーション
/WEB-INF
EJBセションBean
セションBeanクラス名から次のように決まります。
/[パッケージ階層]/[クラス名]_inf
ここで、[パッケージ階層]はセションBeanクラスのパッケージに
沿ったフォルダ階層、[クラス名]はセションBeanクラスのクラス
名です。
EJBセションBeanの場合は、初期化パラメタuji.infoPathによって設定ファイルフォルダを変更することが可能です。 初期化パラメタにつ
いては“13.3 初期化パラメタ”を参照してください。
- 23 -
第4章 APIを使ったプログラミング
4.1 共通処理
ひとつのビジネスクラス、または全てのビジネスクラスに共通な処理は、まとめて作成することができます。
プリプロセス
Preprocessorを実装すると、ビジネスクラスの実行前にpreprocessメソッドが呼び出されます。 Preprocessorはビジネスクラス、セションク
ラス、アプリケーションクラスで実装可能です。ビジネスクラスで実装した場合はそのクラスのメソッドが実行される前に、セションクラスま
たはアプリケーションクラスで実装した場合は全てのビジネスクラスのメソッドが実行される前に、preprocessメソッドが呼ばれます。ビジ
ネスクラスで使用するGenericHandlerはPreprocessorを実装しています。preprocessメソッドをオーバライドして処理を追加できます。
public class SampleHandler extends GenericHandler
{
public int preprocess(DispatchContext context) {
return Preprocessor.EVAL;
}
}
例えば、ログインされていない場合にのみログイン画面を表示するような場合に、セションのpreprocessメソッドが利用可能です。
ポストプロセス
Postprocessorを実装すると、ビジネスクラスの実行後にpostprocessメソッドが呼び出されます。 PostprocessorはPreprocessorと同様に、
ビジネスクラス、セションクラス、アプリケーションクラスで実装可能です。ビジネスクラスで実装した場合はそのクラスのメソッドが実行さ
れたあとに、セションクラスまたはアプリケーションクラスで実装した場合は全てのビジネスクラスのメソッドが実行されたあとに、postprocess
メソッドが呼ばれます。共通な画面の設定などの場合にはpostprocessメソッドが利用可能です。インタフェースではObjectを返却する必
要がありますが、後述のファイルダウンロードアプリケーション以外ではnullを返却します。
public class SampleHandler extends GenericHandler
{
....
public Object postprocess(DispatchContext context, Object result) {
....
context.setResponseBean("head", headBean);
return result;
}
}
Postprocessorを利用する場合は、GenericHandlerから派生したクラスでなければ、handleExceptionメソッドも実装する必要があります。
handleExceptionメソッドの詳細は“4.2 エラー処理”で説明します。
4.2 エラー処理
ビジネスクラスで発生する例外に対して細かく制御を行うためにはtry-catchブロックを使用します。
public void startup(DispatchContext context) {
dm = new DataManager();
try {
dm.prepareData();
} catch(DataManagerException e) {
// 例外に応じた画面を表示するためのsetResponseBean
....
} catch(IOException e) {
// 例外に応じた画面を表示するためのsetResponseBean
....
}
....
}
- 24 -
Apcoordinatorでは、Postprocessorインタフェースを使って、あまり発生しないような例外をまとめて処理することができます。ビジネスク
ラス、セションクラス、アプリケーションクラスでPostprocessorインタフェースを実装すると、処理中に例外が発生した場合にhandleException
メソッドが呼ばれます。その例外に対応可能ならば対応して正常終了、対応不可能ならば再度その例外をスローします。 handleException
メソッドは、ビジネスクラスの外で発生した例外も受け取る可能性があります。そのため、例外に対応可能かどうか判定し、対応不可能
な例外は再度スローする必要があります。
public class SampleHandler extends GenericHandler
implements com.fujitsu.uji.Postprocessor
{
public Object handleException(DispatchContext context, Throwable th) {
if(th instanceof MyException) {
// 例外に応じた画面を表示するsetResponseBean
....
} else {
// 不明な例外
throw th;
}
return null;
}
}
注意
ダウンロードサーブレットを使用するWebアプリケーションの場合、handleExceptionメソッドの復帰値に、エラー等を表示するための画面の
JSPファイル名(String)を返す必要があります。詳細は“17.2 バイナリファイルの送受信”を参照してください。
例外は発生時の形のままではなく、NestedExceptionに変換されて通知されることがあります。 NestedException形式の例外は
getRootCauseメソッドにより、原因の例外を知ることができます。
import com.fujitsu.uji.log.NestedException;
....
public Object handleException(DispatchContext context, Throwable th) {
while(th instanceof NestedException) {
th = ((NestedException)th).getRootCause();
}
// thは原因の例外
....
}
....
ポイント
Webアプリケーションの場合、handleExceptionメソッドに引数として渡されるDispatchContextオブジェクトのsetResponseBeanメソッドを使
用することで、例外に応じた画面に遷移することが可能です。
4.3 ユーザ定義イベントの利用
DispatchContextクラスによって、次のようにユーザ定義イベントが利用できます。
・ イベントリスナの登録: イベントリスナとなるオブジェクトを必要なだけDispatchContextに登録します。
・ ユーザ定義イベントの発生: DispatchContextにイベントの発生を指示することにより、登録されている全てのイベントリスナが呼び
出されます。
例えば、以下のようにエラー発生時にリソースを開放する処理に利用できます。
・ ファイルやネットワークコネクションなどのリソースを確保したときに、そのリソースを開放するためのイベントリスナを登録します。
・ エラーが発生したときに、イベントの発生をDispatchContextに指示します。
- 25 -
・ イベントリスナが呼び出されリソースが開放されます。
このようにユーザ定義イベントを利用することにより、エラーを検出した処理は、開放すべきリソースがどれであるのかを把握する必要
がなくなります。 ユーザ定義イベントは以下の手順で使用します。
・ DispatchContextクラスのaddUjiEventListenerメソッドでイベントリスナのオブジェクトをDispatchContextに登録します。
・ DispatchContextクラスのfireUjiEventメソッドで、イベントの発生を指示します。このとき、ユーザ定義イベントのオブジェクトを
fireUjiEventの引数に渡します。これにより、登録されている全てのイベントリスナが呼び出されます。
ユーザ定義イベントを表すクラスはcom.fujitsu.uji.event.UjiEventクラスを継承して次のように作成します。
public class MyEvent extends com.fujitsu.uji.event.UjiEvent {
static public final int TYPE0=0;
static public final int TYPE1=1;
protected int type;
// typeはイベントの種類を、sourceはイベントの発生源となったオブジェクトを
// 表します。
public MyEvent(int type, Object source) {
// 以下に初期化する手続きを記述してください。
super(source);
this.type=type;
}
public int getType() {return type;}
}
コンストラクタは必ずObjectの引数が必要です。これは、イベントの発生源となったオブジェクトを表します。nullは指定できません。
イベントリスナはcom.fujitsu.uji.event.UjiEventListenerインタフェースを実装して次のように作成します。
import com.fujitsu.uji.event.UjiEvent;
import com.fujitsu.uji.event.UjiEventListener;
public class MyListener implements UjiEventListener {
java.io.File file;
public MyListener(java.io.File file) {
this.file=file;
}
// このメソッドは、イベントが発生したときに呼び出されます。
public void eventRaised(UjiEvent evt) {
if (evt instanceof MyEvent &&
((MyEvent)evt).getType()==MyEvent.TYPE1) {
file.delete();
}
}
}
ビジネスクラスでは、イベントリスナとイベントを次のように使用します。
public void startup(DispatchContext context) {
context.addUjiEventListener(new MyListener(new File("foo"));
....
}
public Object postprocess(DispatchContext context,Object result) {
....
if (failed) {
context.fireUjiEvent(new MyEvent(MyEvent.TYPE1,this));
}
}
- 26 -
イベントリスナをDispatchContextから削除するには、removeUjiEventListenerメソッドを使用します。
登録されたイベントリスナはリクエストの処理が終了するまで有効です。リクエストの処理とは、Webアプリケーションの場合は<uji:dispatch/>
の実行、EJBセションBeanの場合はビジネスメソッドの呼び出しです。
4.4 ビジネスクラス呼び出しのフック
ビジネスクラスが呼び出される前にユーザ定義のクラスを呼び出し、そのクラスからビジネスクラスの呼び出しを制御することができま
す。例えば、ビジネスクラス実行前後でのログの取得や、ビジネスクラスでエラーが発生した場合のリトライ制御に利用できます。
通常はアプリケーションクラス、セションクラス、ビジネスクラスのメソッドが次の順番で呼び出されます。
1. アプリケーションクラスのpreprocess
2. セションクラスのpreprocess
3. ビジネスクラスのpreprocess
4. ビジネスクラスのメソッド(コマンドマップで指定されたもの)
5. ビジネスクラスのpostprocessまたはhandleException
6. セションクラスのpostprocessまたはhandleException
7. アプリケーションクラスのpostprocessまたはhandleException
ただし、preprocessが呼ばれるのはPreprocessorインタフェースを実装している場合であり、postprocessとhandleExceptionが呼ばれるのは
Postprocessorインタフェースを実装している場合です。
ビジネスクラスのフック機能を使うと、上記3,4,5でユーザ定義のクラスを呼び出せます。このユーザ定義のクラスをフッククラスと呼びま
す。フッククラスを使って次のような呼び出し順にできます。
1. アプリケーションクラスのpreprocess
2. セションクラスのpreprocess
3. フッククラスのpreprocess
4. フッククラスのdispatch
5. ビジネスクラスのpreprocess
6. ビジネスクラスのメソッド(コマンドマップで指定されたもの)
7. ビジネスクラスのpostprocessまたはhandleException
8. フッククラスのpostprocessまたはhandleException
9. セションクラスのpostprocessまたはhandleException
10. アプリケーションクラスのpostprocessまたはhandleException
フッククラスがPreprocessorインタフェースを実装している場合には、そのpreprocessが呼ばれます。また、Postprocessorインタフェースを
実装していればpostprocessとhandleExceptionが呼ばれます。Preprocessor, Postprocessorインタフェースについては“4.1 共通処理”を
参照してください。
フッククラスのdispatchメソッドでは、上記の呼び出し順で示したように、ビジネスクラスのpreprocess、コマンドマップ指定のメソッド、ビジ
ネスクラスのpostprocessまたはhandleExceptionをこの順に呼び出すことができます。フッククラスはHandlerHookクラスを継承して作成
します。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.ThreadSafeDispatchHandler;
import com.fujitsu.uji.DispatchException;
public class MyHook extends com.fujitsu.uji.HandlerHook {
public MyHook() {
// 以下に初期化する手続きを記述してください。
}
- 27 -
public Object dispatch(DispatchContext ctx,
ThreadSafeDispatchHandler dispatchHandler)
throws DispatchException {
System.out.println("MyHook: dispatch()");
// 2回リトライします。
DispatchException lastEx=null;
for (int i=0; i<3; i++) {
System.out.println("MyHook: try "+i);
try {
return dispatchHandler.dispatchSafely(ctx);
}
catch (DispatchException e) {
e.printStackTrace();
lastEx=e;
}
}
throw new DispatchException("Failed 3 times",lastEx);
}
dispatchメソッドにはThreadSafeDispathHandlerが渡されます。このクラスのdispatchSafelyメソッドを呼び出すと、ビジネスクラスのpreprocess
メソッド, コマンドマップで指定したメソッド, postprocessメソッドが呼び出されます。dispatchSafelyメソッドの引数にはdispatchメソッドの引
数として渡されたDispatchContextを与えてください。
作成したフッククラスを有効にするには、ファクトリクラスのnewHandlerHookメソッドをオーバーライドし、フッククラスのオブジェクトを新
規作成して返すようにします。以下は、Webアプリケーションのファクトリクラスを使用した例です。
import com.fujitsu.uji.http.HttpFactory;
import com.fujitsu.uji.HandlerHook;
public class HookFactory extends HttpFactory {
// 作成したフッククラスをnewして返すようにします。
public HandlerHook newHandlerHook() {
return new MyHook();
}
}
なお、ユーザ定義のファクトリクラスを作成した場合は、初期化パラメタの設定が必要です。ファクトリクラスの使用方法の詳細について
は、“3.5 ファクトリクラス”を参照してください。
4.5 リソースファイル
リソースファイルは、アプリケーションで使用する文字列データを定義するXMLファイルです。以下のような文字列データを定義するの
に使用できます。
・ 画面やログに出力するメッセージ
・ コンボボックス等選択項目の初期値
リソースファイルを使用すると文字列を外付けのファイルに定義できるため、プログラムを再コンパイルすることなく文字列を変更するこ
とができます。また、リソースファイルはロケールごとに作成できるため、多言語化の実現が容易になります。
リソースファイルで定義した文字列を使って以下のような処理を行うためのAPIやUJIタグを提供しています。
・ リソースファイルで定義した文字列を取得します。
・ リソースファイルに定義した文字列に従って、コンボボックス、リストボックス、ボタンリストに選択肢を設定します。
・ リソースファイルに定義したメッセージテンプレートからメッセージを作成します。
・ リソースファイルに定義した文字列をUJIタグで画面に出力します。
- 28 -
4.5.1 リソースファイルの作成
以下は、リソースファイルの記述例です。
<?xml version="1.0" encoding="Shift_JIS"?>
<ujiResource
xmlns=http://interstage.fujitsu.com/schemas/uji/ujiResource
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/ujiResource
http://interstage.fujitsu.com/schemas/uji/ujiresource.xsd">
<config>
<version>5.1</version>
</config>
<text id="target">XXビル会議室</text>
<text id="RESVOK">{0}件予約しました。</text>
<text id="RESVPT">{0}件中{1}件を予約しました。内容を確認してください。</text>
<array id="prior">
<elem>192.168.96</elem>
<elem>192.168.97</elem>
</array>
<map id="rooms">
<elem key="room101">101会議室</elem>
<elem key="room102">102会議室</elem>
</map>
</ujiResource>
リソースファイルには以下のデータを定義します。
・ 単一文字列
・ 文字列配列
・ キー付き文字列配列
キー付き文字列配列は配列の要素それぞれにキーを付けたデータです。コンボボックスに選択肢を設定する場合などに使用します。
リソースファイルの記述形式
リソースファイルの記述形式は以下のとおりです。
<?xml version="1.0" encoding="Shift_JIS"?>
<ujiResource
xmlns=http://interstage.fujitsu.com/schemas/uji/ujiResource
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/ujiResource
http://interstage.fujitsu.com/schemas/uji/ujiresource.xsd">
<config>
<version>5.1</version>
</config>
<!-- ここに文字列を定義するタグ (text, array, mapタグ) を任意の順番で記述します。-->
</ujiResource>
versionタグのコンテントにはリソースファイルの文法バージョンを記述します。指定可能なバージョンは5.1です。
文字列は以下のタグで定義します。いずれの場合もタグのidアトリビュートでIDを指定します。IDは、JavaプログラムやUJIタグで文字
列を参照する際に使用します。IDはリソースファイルの中で一意になるようにしてください。
・ textタグ
単一文字列を定義します。textタグのコンテントに文字列を記述します。
<text id="target">XXビル会議室</text>
- 29 -
・ arrayタグ
文字列配列を定義します。arrayタグのコンテントには、elemタグを記述し、elemタグのコンテントに配列の要素となる文字列を記述
します。
<array id="priorIPs">
<elem>192.168.96</elem>
<elem>192.168.97</elem>
</array>
・ mapタグ
キー付き文字列配列を定義します。mapタグのコンテントには、elemタグを記述し、elemタグのコンテントに配列の要素となる文字
列を記述します。 elemタグのkeyアトリビュートにキーを記述します。
<map id="rooms">
<elem key="room101">101会議室</elem>
<elem key="room102">102会議室</elem>
</map>
定義する文字列に<, >, ", & を含めたい場合は、それぞれ &lt;, &gt;, &quot;, &amp; に置き換えて記述してください。例えば、単一文字列
「R&Dセンタ」を定義する場合は、以下のように記述します。
<text id="office12">R&amp;Dセンタ</text>
リソースファイルの名前と分割方法
リソースファイル名は、デフォルトでは ujiresource.xml です。これは、初期化パラメタuji.resourceで変更できます。初期化パラメタにつ
いては、“13.3 初期化パラメタ”を参照してください。
また、複数作成されたリソースファイルを初期化パラメタで指定した名前のフォルダに配置することにより、1つのリソースファイルのよう
に扱うことが可能です。この機能により各リソースファイルの結合の手間を省くことができます。
リソースファイルのファイル名として指定されたファイルの種類により、以下のように扱います。
初期化パラメタ
uji.resourceの指定
なし
使用するリソースファイル名
使用するリソースファイ
ルの種類
ujiresource.xml
あり
初期化パラメタで指定した名前
リソースファイルの扱い
ファイル
ujiresource.xmlファイルをリソースファ
イルとして扱います。
フォルダ
ujiresource.xmlフォルダの下に置かれ
たすべてのファイルをリソースファイル
として扱います。
ファイル
初期化パラメタで指定した名前のファ
イルをリソースファイルとして扱いま
す。
フォルダ
初期化パラメタで指定した名前のフォ
ルダの下に置かれたすべてのファイ
ルをリソースファイルとして扱います。
ポイント
フォルダ内に配置するリソースファイルのファイル名は任意に付けることができます。
注意
リソースファイルを分割する場合の注意事項は以下のとおりです。
・ 分割されたリソースファイルはそれぞれ単体でリソースファイルとして利用できる必要があります。すなわち、リソースファイルの一部
を切り出して別ファイルとすることはできません。
・ idアトリビュートで指定するIDは、分割されたリソースファイルが配置されてあるフォルダ内で一意でなければなりません。
- 30 -
・ 分割されたリソースファイルを配置するフォルダ内にリソースファイル以外のファイル、サブフォルダを配置することはできません。
・ デフォルトもしくは初期化パラメタで指定したリソースファイルはアプリケーション起動時に読み込まれます。ロケールごとに作成し
たリソースファイルは初回利用時に読み込まれます。アプリケーション動作中の動的変更はできません。
・ EJBセションBeanでは、リソースファイルを分割することはできません。
・ リソースファイルの分割個数に制限はありませんが、分割した場合、リソースファイルの読み込み時間がリソースファイルの個数に
正比例して増加することになるため、リソースファイル使用時の性能に影響します。リソースファイル使用時の性能が著しく遅くなる
場合には、業務やアプリケーションの単位でリソースファイルの構成を見直してください。
ロケールごとに作成する方法
リソースファイルはロケールごとに作成することもできます。この場合、リソースファイル名は ujiresource_[ロケール].xml となります。ま
た、ロケールごとにリソースファイルを分割する場合は、ujiresource_[ロケール].xmlフォルダを作成し、フォルダ内にリソースファイルを
配置します。このとき、フォルダ内に配置するリソースファイル名は任意に付けることができます。ロケールは以下のいずれかの形式で
表現されます。
・ [言語コード]_[国コード]
・ [言語コード]
言語コードと国コードはjava.util.Localeクラスで使用されるものと同じです。例えば、ロケールja_JPに対応するリソースファイルは、
ujiresource_ja_JP.xmlとなります。
リソースファイルの配置
リソースファイルは設定ファイルフォルダに配置します。 標準の設定ファイルフォルダは以下のとおりです。
アプリケーション種別
設定ファイルフォルダ
/WEB-INF
Webアプリケーション
電子フォームアプリケーション
4.5.2 Javaプログラムからの文字列の参照
リソースファイルで定義した文字列をJavaプログラムから参照するには、アプリケーションクラスか、UjiResourceクラスを使用して文字列
を取得します。
アプリケーションクラスからの取得
アプリケーションクラス(com.fujitsu.uji.ApplicationProfileクラス)には以下のメソッドがあり、リソースファイルで定義した単一文字列、文
字列配列、キー付き文字列を取得できます。
・ getResourceTextメソッド: 単一文字列を取得します
・ getResourceArrayメソッド: 文字列配列を取得します
・ getResourceMapメソッド: キー付き文字列配列を取得します
これらのメソッドの引数には取得する文字列のIDを指定します。以下は記述例です。
import com.fujitsu.uji.ApplicationProfile;
import com.fujitsu.uji.DispatchContext;
import java.util.Map;
...
public void startup(DispatchContext context) {
ApplicationProfile ap = context.getApplicationProfile();
// 単一文字列の取得
String targetStr = ap.getResourceText("target");
// 文字列配列の取得
String[] priorStr = ap.getResourceArray("prior");
- 31 -
// キー付き文字列配列の取得
Map.Entry[] roomsStr = ap.getResourceMap("rooms");
...
}
第2引数にロケール ( java.util.Localeクラス) を指定すると、そのロケールに対応するリソースファイルが検索されて使用されます。例え
ば、ロケールja_JPに対しては、ファイルが以下の順序で検索され、最初に見つかったものが使用されます。
・ ujiresource_ja_JP.xml
・ ujiresource_ja.xml
・ ujiresource.xml
UjiResourceクラスからの取得
com.fujitsu.uji.util.UjiResourceクラスの以下のstaticメソッドを使用して文字列を取得できます。引数にはDispatchContextクラスと文字列の
IDを指定します。
・ getResourceTextメソッド: 単一文字列を取得します
・ getResourceArrayメソッド: 文字列配列を取得します
・ getResourceMapメソッド: キー付き文字列配列を取得します
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.util.UjiResource;
import java.util.Map;
...
public void startup(DispatchContext context) {
// 単一文字列の取得
String targetStr = UjiResource.getResourceText(context, "target");
// 文字列配列の取得
String[] priorStr = UjiResource.getResourceArray(context, "prior");
// キー付き文字列配列の取得
Map.Entry[] roomsStr = UjiResource.getResourceMap(context, "rooms");
....
}
Webアプリケーション、電子フォームアプリケーションでは、HTTPリクエストからロケールが取得されます。HTTPのリクエストヘッダに
Accept-Languageヘッダが存在する場合、Accept-Languageヘッダで指定されたロケールに対応するリソースファイルが使用されます。
以下はAccept-Languageヘッダの例です。
Accept-Language: ja,en-us;q=0.5
この例の場合、以下の順序でリソースファイルが検索されます。
・ ujiresource_ja.xml
・ ujiresource_en_US.xml
・ ujiresource_en.xml
・ ujiresource.xml
Accept-LanguageヘッダのQ値は使用されません。
UjiResourceクラスは文字列を取得するメソッド以外にも以下の機能を提供します。
・ コンボボックス、リストボックス、ボタンリストの項目クラスの初期化
UjiResourceクラスのinitObjectメソッドはコンボボックス、リストボックス、ボタンリストの項目クラスの選択肢情報として、リソースファイ
ルに定義したキー付き文字列配列を設定します。キーが選択肢の値として、文字列が選択肢の表示文字列として使用されます。
以下は、ボタンリストの項目クラスに文字列配列を設定する例です。
・データBeanの記述例
- 32 -
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.ButtonList;
public class MyDataBean extends DataBean {
protected ButtonList blRoom = new ButtonList();
....
public ButtonList getBlRoom() {
return blRoom;
}
....
}
ここでは、ButtonList型のプロパティblRoomをデータBeanに作成しています。
・リソースファイルの記述例
<?xml version="1.0" encoding="Shift_JIS"?>
<ujiResource
xmlns=http://interstage.fujitsu.com/schemas/uji/ujiResource
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/ujiResource
http://interstage.fujitsu.com/schemas/uji/ujiresource.xsd">
<config>
<version>5.1</version>
</config>
<map id="rooms">
<elem key="room101">101会議室</elem>
<elem key="room102">102会議室</elem>
</map>
</ujiResource>
ボタンリストに設定する選択肢を2個定義しています。選択肢のラベルは「101会議室」「102会議室」、選択肢の値はそれぞ
れ"room101"、"room102"です。
・ビジネスクラスの記述例
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.compo.ButtonList;
import com.fujitsu.uji.util.UjiResource;
...
public void startup(DispatchContext context) {
MyDataBean bean = new MyDataBean();
...
ButtonList blRoom = bean.getBlRoom();
UjiResource.initObject(context, "rooms", blRoom);
...
}
データBeanからボタンリストの項目クラスを取り出し、initObjectメソッドで選択肢を設定します。"rooms"は、リソースファイルで定義
した文字列配列のIDです。
・JSPの記述例
<uji:buttonList bean="body" property="blRoom"
multipleMode="true" columns="3" />
uji:buttonListタグはボタンリストを表示するUJIタグです。propertyアトリビュートで指定するのは、ボタンリストの項目クラスを型とす
るプロパティです。項目クラスに設定された選択肢「101会議室」「102会議室」が表示されます。
ユ ー ザ 定 義 の ク ラ ス に 対 し て initObject メ ソ ッ ド を 使 用 す る こ と も で き ま す 。 こ の 場 合 、 ユ ー ザ 定 義 の ク ラ ス に
com.fujitsu.uji.util.KeyValueListインタフェースを実装してください。
- 33 -
・ メッセージテンプレートからのメッセージの作成
UjiResourceクラスのgetMessageメソッドは、文字列のID、補足情報、リソースファイルに定義したメッセージテンプレートからメッセー
ジの文字列を作成します。メッセージの一部に動的に情報を埋め込みたい場合に使用します。
メッセージテンプレートはリソースファイルに単一文字列として定義します。
<text id="RESVPT">{0}件中{1}件を予約しました。内容を確認してください。</text>
メッセージテンプレートはjava.text.MessageFormatで使用するフォーマットで記述します。getMessageメソッドはメッセージテンプレー
ト内の{0},{1}などをそれぞれ対応する補足情報に置き換えてメッセージを作成します。
{0}から{9}まで利用することができます。
com.fujitsu.uji.util.MessageInformationインタフェースを実装しメッセージの情報を格納するクラスを作成します。このクラスの
getMessageIdメソッドでメッセージテンプレートのIDを、getMessageParamsメソッドで補足情報の配列を返却します。
import com.fujitsu.uji.util.MessageInformation;
class Message implements MessageInformation {
String id;
Object[] params;
public Message(String id, Object[] params) {
this.id = id;
this.params = params;
}
public String getMessageId() {
return id;
}
public Object[] getMessageParams() {
return params;
}
}
DispatchContextとMessageInformation実装クラスを引数にして、getMessageを実行します。getMessageの返却値として、作成され
たメッセージの文字列が得られます。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.util.UjiResource;
...
public void startup(DispatchContext context) {
Message msg = new Message("RESVPT", new String[]{"3","2"});
String msgStr = UjiResource.getMessage(context, msg);
...
}
以上の例では、getMessageメソッドによって以下の文字列が生成され、返却されます。
3件中2件を予約しました。内容を確認してください。
ポイント
- Webアプリケーションにおいて、getMessageで生成された文字列を画面に表示する場合は、生成された文字列をデータBean
のプロパティに格納し、JSPに記述したUJIタグで表示させます。Webアプリケーションで画面表示を行う方法の詳細は、“15.3.1
表示の処理の流れ”を参照してください。
- 34 -
- XMLデータ仕様記述で使用する例外クラスESpecResultExceptionはMessageInformationインタフェースを実装しており、
getMessageを使用してデータのチェック結果のメッセージを作成できます。XMLデータ仕様記述についての詳細は“第11章 XML
データ仕様記述”を参照してください。
4.5.3 JSPからの文字列の参照
Webアプリケーションにおいて、リソースファイルで定義した単一文字列を画面に表示するには、JSPでuji:resourceTextタグを以下のよ
うに使用します。
<uji:resourceText id="target"/>
idアトリビュートには、リソースファイルで定義した単一文字列のIDを指定します。文字列がHTMLの特殊文字 <, >, ", & を含んでいる
場合は、それぞれ&lt;, &gt;, &quot;, &amp; に変換されて出力されます。変換が不要な場合はuji:resourceTextタグのescapeアトリビュー
トにfalseを指定してください。以下は例です。
・ 文字列「R&Dセンタ」を定義して画面に表示させる例
リソースファイルで「R&Dセンタ」という単一文字列を定義します。 XMLの規約により、定義する文字列に<, >, ", & を含めたい場
合は、それぞれ &lt;, &gt;, &quot;, &amp; に置き換えて記述します。
<text id="office12">R&amp;Dセンタ</text>
uji:resourceTextタグのescapeアトリビュートは省略します。HTMLには次のように出力されます。
R&amp;Dセンタ
画面には「R&Dセンタ」と表示されます。
・ HTMLタグが混在した文字列「<B>注意</B>」を定義して画面に表示させる例
リソースファイルで「<B>注意</B>」という単一文字列を定義します。 XMLの規約により、定義する文字列に<, >, ", & を含めたい
場合は、それぞれ &lt;, &gt;, &quot;, &amp; に置き換えて記述します。
<text id="caution">&lt;B&gt;注意&lt;/B&gt;</text>
uji:resourceTextタグにescape="false"を指定します。HTMLには次のように出力されます。
<B>注意</B>
HTMLのBタグの効果により、画面には太字で「注意」と表示されます。
HTTPのリクエストヘッダにAccept-Languageヘッダが存在する場合、UjiResourceクラスを使用した場合と同様にAccept-Languageヘッ
ダで指定されたロケールに対応するリソースファイルが使用されます。詳細は“UjiResourceクラスからの取得”を参照してください。
4.6 ビジネスクラスの再試行
4.6.1 ビジネスクラス再試行機能の概要
ビジネスクラス再試行機能は、ビジネスクラスが例外を発生した場合に、ビジネスクラスを再度実行する機能です。 ロック中のデータ
ベースにアクセスできなかったなどの原因で、ビジネスクラスを再度実行すれば正常終了する可能性があるエラーが発生した場合に、
その処理を再実行してエラーを回避するために本機能を使用します。
- 35 -
ビジネスクラス再試行機能を使用すると、以下の条件でビジネスクラスが再試行されます。
・ ビジネスクラスのうちコマンドマップで指定されたもの(以降、ビジネスメソッドと呼びます)が、例外としてjava.lang.Exceptionまたはそ
のサブクラスを発生した場合。ただしjava.lang.RuntimeExceptionとそのサブクラスは除きます。以降、再試行を起こす例外を再試
行例外と呼びます。
・ com.fujitsu.uji.DispatchContextクラスのsetRetryメソッドが呼び出された場合。この場合、メソッドが再試行例外を発生しなくても、メ
ソッドの終了後に再試行されます。例外を発生させずに再試行させたい場合にこのメソッドを使用します。
再試行の回数には上限があります。上記の条件に該当しても再試行の回数が上限を超える場合には、再試行されません。
ビジネスクラス実行中にエラー(java.lang.Errorとそのサブクラス)が発生した場合、すでに再試行が予定されていた場合でも再試行が
取り消されます。
トランザクション管理機能と併用した場合の動作については、“4.7.3 トランザクション管理機能とビジネスクラス再試行機能の併用”を参
照してください。
4.6.2 ビジネスクラスの作成
ビジネスクラス再試行機能を使用するには、com.fujitsu.uji.RetriableHandler インタフェースを実装してビジネスクラスを作成します。 簡
単 に 作 成 す る に は com.fujitsu.uji.GenericRetriableHandler ク ラ ス を 継 承 し て 作 成 し ま す 。 GenericRetriableHandler ク ラ ス は
RetriableHandlerインタフェースの簡単な実装を提供します。
デフォルトでは再試行に関する設定は以下のとおりになります。
・ RetriableHandlerを実装したビジネスクラスのビジネスメソッド全てで再試行が有効
・ 再試行間隔は100ミリ秒
・ 再試行最大回数は2回 (初回の実行を合わせると最大で合計3回実行します)
コマンドマップで指定したメソッドの終了後に再試行の有無を決定する
コマンドマップで指定したメソッドの終了後に、ビジネスクラスやセションクラスの持つデータを参照して再試行の有無を決定したい場
合は、ビジネスクラスの beforeMethodCompletionメソッドにその処理を記述します。 beforeMethodCompletionメソッドは、コマンドマップ
で指定したメソッドの終了後に呼び出されます。
beforeMethodCompletionメソッドで再試行を指示するには、com.fujitsu.uji.DispatchContextクラスのsetRetryメソッドを呼び出します。引
数にはtrueを指定します。すでに予定されている再試行を取り消すには、引数にfalseを指定してsetRetryメソッドを呼び出します。
再試行が予定されているかどうかは、DispatchContextクラスのgetRetryメソッドで取得できます。例外の発生などにより再試行の条件が
満たされている場合は、再試行が予定されています。この場合、getRetryメソッドがtrueを返します。
- 36 -
ビジネスメソッドごとに再試行の動作を設定する
再試行の有無、再試行間隔、再試行最大回数をビジネスメソッドごとに指定するには、設定ファイルフォルダにビジネスクラス設定ファイル
(handlerconfig.xml)を作成して設定を記述します。
以下は、ビジネスクラス設定ファイル(handlerconfig.xml)の記述例です。
<?xml version="1.0" encoding="Shift_JIS"?>
<handlerConfig
xmlns=http://interstage.fujitsu.com/schemas/uji/handlerConfig
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/handlerConfig
http://interstage.fujitsu.com/schemas/uji/handlerconfig.xsd">
<config>
<version>6.0</version>
</config>
<handler name="sample.SampleHandler"> <!-- (1) -->
<method name="doUpdate">
<!-- (2) -->
<retry enabled="true" retryInterval="200" retryCount="1" />
</method>
<method name="*">
<!-- (4) -->
<retry enabled="false"/>
<!-- (5) -->
</method>
</handler>
<!-- (3) -->
</handlerConfig>
・ (1) handlerタグでビジネスクラス1個についての設定を記述します。nameアトリビュートにビジネスクラスのクラス名をパッケージ名付
きで記述します。
・ (2) (1)のビジネスクラスの各ビジネスメソッドの設定をmethodタグで記述します。nameアトリビュートにメソッド名を記述します。method
タグはhandlerタグのコンテントに必要なだけ繰り返して記述します。
・ (3) (2)のビジネスメソッドの設定をretryタグで記述します。retryタグはmethodタグのコンテントに1個だけ記述します。retryタグには
以下のアトリビュートを指定します。
- enabled
再試行を有効にするかどうかを指定します。trueを指定すると(2)のビジネスメソッドでビジネスクラス再試行機能が有効に、false
を指定すると無効になります。このアトリビュートを省略した場合はtrueです。
- retryInterval
再試行間隔をミリ秒単位で指定します。このアトリビュートを省略した場合、再試行間隔は100ミリ秒です。
- retryCount
再試行最大回数を指定します。例えば、2を指定すると、初回の実行と合わせて最大で合計3回メソッドを実行します。このアト
リビュートを省略した場合、再試行最大回数は2です。
・ (4),(5) methodタグにname="*"を指定すると、デフォルトの設定を定義できます。このデフォルトの設定は、対応するmethodタグが
ないビジネスメソッドや、methodタグは存在してもretryタグが省略されている場合に適用されます。
上記の記述例では、sample.SampleHandlerクラスのdoUpdateメソッドではビジネスクラス再試行機能が有効で、その他のビジネスメソッ
ドでは無効になります。
注意
再試行間隔の精度はご使用になるシステムに依存します。 10ミリ秒より高い精度による指定はシステムによっては有効にならない場合
があります。
メソッドの実行順序
ビジネスクラス再試行機能を使用した場合、ビジネスクラスのメソッドは以下の順序で呼び出されます。
- 37 -
ビジネスクラスがcom.fujitsu.uji.Postprocessorインタフェースを実装している場合は、postprocessメソッドとhandleExceptionメソッドのどち
らか一方が呼び出されます。handleExceptionが呼ばれるのは以下の場合です。それ以外はpostprocessが呼び出されます。
・ ビジネスメソッドが例外を発生したが、再試行は行われなかった場合。以下の場合が該当します。
- 発生した例外が再試行例外でない場合。
- 例外発生後、beforeMethodCompletionメソッドでsetRetry(false)が実行された場合。
- 再試行最大回数を超える場合。
・ ビジネスメソッドは正常終了し、かつ、setRetry(true)が実行され、かつ、再試行最大回数を超えるため再試行できない場合。この場
合、com.fujitsu.uji.RetryCountExpiredExceptionがhandleExceptionに通知されます。
beforeMethodCompletionで発生した例外は、handleExceptionには通知されません。
注意
ビジネスクラスがRetriableHandlerインタフェースを実装していても、ビジネスクラス設定ファイルでビジネスクラス再試行機能が無効に
設定されている場合は、beforeMethodCompletionメソッドは呼び出されません。
4.6.3 ビジネスクラス再試行機能使用時の注意事項
ビジネスクラスが再試行される場合でも、再試行前にビジネスクラスが実行した処理は取り消されません。このため、ビジネスクラス再試
行機能を使用する場合は、以下の点に注意してビジネスクラスを作成してください。
ビジネスメソッドでEJBを呼び出す場合の注意事項
ビジネスメソッドでEJBセションBeanのオブジェクトを作成している場合、再試行前にEJBセションBeanのオブジェクトを削除するようにプ
ログラムしてください。 com.fujitsu.uji.ext.CallFactoryインタフェースのcreateCallメソッド、または、com.fujitsu.uji.ejb.EJBCallFactoryクラ
スのcreateUjiSessionCallメソッドを使ってEJBセションBeanのオブジェクトを作成した場合は、 com.fujitsu.uji.ejb.UjiSessionCallインタ
フェースのremoveメソッドによりEJBセションBeanのオブジェクトが削除されます。createCallによって取得したCallインタフェースの場合
は、UjiSessionCallにキャストしてremoveを実行してください。
ビジネスメソッドでEJBセションBeanのオブジェクトを作成し、再試行前に削除しなかった場合、そのオブジェクトが再試行後も残存しま
す。
ビジネスメソッドの引数に与えられたデータBeanに関する注意事項
ビジネスメソッドの引数に与えられたデータBeanに変更を加える場合は、再試行例外が発生する処理が完了したあとでデータBeanに
変更を加えてください。また、setRetry(true)を実行する場合は、データBeanに変更を加えないでください。データBeanに変更が加えら
れたあとで再試行した場合、再試行によってビジネスメソッドが呼び出された時点で、変更後のデータBeanがビジネスメソッドの引数に
与えられます。
- 38 -
ビジネスクラス、セションクラス、アプリケーションクラスのデータを変更する場合の注意事項
以下のクラスのオブジェクトは、ビジネスクラスの呼び出しが終了したあとも生存しています。これらのオブジェクトが持つデータを変更
したあとで再試行した場合、再試行によってビジネスメソッドが呼び出された時点で、オブジェクトが持つデータは変更後の状態のまま
になっています。
・ ビジネスクラス (initメソッドがtrueを返す場合)
・ セションクラス
・ アプリケーションクラス
再試行前のデータ変更が再試行後に残っていることが問題となる場合は、再試行例外が発生する処理が完了したあとでビジネスクラ
ス、セションクラス、アプリケーションクラスのデータを変更してください。また、setRetry(true)を実行した場合はビジネスクラス、セション
クラス、アプリケーションクラスのデータを変更しないでください。
以下に、再試行例外が発生する処理が完了したあとでビジネスクラス、セションクラス、アプリケーションクラスのデータを変更するプロ
グラムの概略を示します。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericRetriableHandler;
...
public class SomeHandler extends GenericRetriableHandler {
public boolean init() {
return true;
}
public Object doSomething(DispatchContext context, SomeBean dataBean) throws MyException {
// 以下のtryからcatchまでの処理で例外が発生した場合は、
// 再試行例外MyExceptionを発生させるようにプログラムしています。
// この範囲では、ビジネスクラス、セションクラス、アプリケーション
// クラスのデータを変更しないようにします。
try {
...
} catch (Exception e) {
throw new MyException(e.getMessage(),e);
}
// これ以降は再試行例外が発生しません。
// ビジネスクラス、セションクラス、アプリケーションクラスのデータの
// 変更や、ビジネスメソッドの引数のデータBeanの変更はこの段階で行い
// ます。
...
return dataBean;
}
...
}
setResponseBeanメソッド使用時の注意事項
com.fujitsu.uji.DispatchContextクラスのsetResponseBeanメソッドを実行したあとでは、再試行例外を発生させないでください。また、
setRetry(true)を実行した場合はsetResponseBeanを実行しないでください。 setResponseBeanを実行後に再試行した場合、再試行前の
setResponseBeanの処理は取り消されません。
- 39 -
4.7 トランザクションの管理
4.7.1 トランザクション管理機能が提供する機能
トランザクション管理機能は、Apcoordinatorがトランザクションの開始、コミット、ロールバックを制御する機能です。アプリケーションでト
ランザクションの開始、終了をプログラムする必要がなく、トランザクションの制御が容易になります。
トランザクション管理機能を使用すると、Apcoordinatorは次のようにトランザクションを制御します。
・ ビジネスクラスのメソッドのうちコマンドマップで指定されたもの(以降、ビジネスメソッドと呼びます)を呼び出す直前にトランザクショ
ンを開始します。
・ 呼び出したビジネスメソッドが正常に終了した場合には、トランザクションをコミットします。
・ 以下の場合にはトランザクションをロールバックします。
- ビジネスメソッドがロールバック例外を発生した場合。デフォルトでは、以下がロールバック例外として使用されます。設定によ
りロールバック例外を追加することが可能です。
- java.lang.RuntimeExceptionとそのサブクラス
- java.lang.Errorとそのサブクラス
- com.fujitsu.uji.DispatchContextクラスのsetRollbackOnlyメソッドが呼び出された場合。この場合、ビジネスメソッドがロールバッ
ク例外を発生しなくても、ビジネスメソッドの終了後にトランザクションをロールバックします。例外を発生させずにロールバック
させたい場合にこのsetRollbackOnlyを使用します。
- ビジネスクラス再試行機能を使用しており、ビジネスクラスが再試行される場合。
Apcoordinatorで管理できるのは、以下のインタフェースによって制御できるトランザクションです。
・ javax.transaction.UserTransactionインタフェース
UserTransactionはトランザクション制御用のインタフェースであり、JTA(Java Transaction API)仕様によって定義されています。 一
般に、EJB, JMS, JDBCのトランザクションを制御する場合に使用します。
・ java.sql.Connectionインタフェース
データベースとの接続を表すインタフェースであり、JDBC仕様で定義されています。アプリケーションサーバに依存せずに直接
データベースにアクセスする場合に使用します。
上記以外のインタフェースについては、アダプタを作成することによってApcoordinatorで管理できる場合があります。アダプタの作成
方法は“4.7.4 JDBCのトランザクションの制御”で説明します。
デフォルトでは、UserTransactionインタフェースによってトランザクションを制御します。java.sql.Connectionインタフェースによる制御を
利用する方法は“4.7.4 JDBCのトランザクションの制御”で説明します。
- 40 -
UserTransactionインタフェースによるトランザクション制御を選択し、アプリケーションサーバとしてInterstageを使用する場合、トランザク
ションを連携させることのできるアプリケーションの種別と、トランザクションで制御できるリソースは以下のようになります。
・ トランザクションを連携させることのできるアプリケーションの種別: 以下の組み合わせの場合は、呼び出し元が開始したトランザク
ション上で呼び出し先のアプリケーションを実行させることができます。
呼び出し元のアプリケーション
呼び出し先のアプリケーション
分散トランザクションを使用しない場合 分散トランザクションを使用する場合
Webアプリケーション
電子フォームアプリケーション
呼び出し元と同じIJServer上のEJB
(*1)(*2)
(分散トランザクションは使用できませ
ん)
EJBセションBean
呼び出し元と同じIJServer上のEJB
(*1)
同一マシン内のIJServer上で動作する
EJB (*1)(*3)
(*1) 呼び出されるEJBが、呼び出し元のトランザクション上で動作するように設定されている必要があります。そのため、呼び出される
EJBのトランザクション管理種別はContainerに設定し、トランザクション属性はMandatory, Required, Supportsのいずれかに設定し
ます。
(*2) IJServerのタイプとして「WebアプリケーションとEJBアプリケーションを同一JavaVMで運用」を使用します。
(*3) 呼び出し元と呼び出し先のIJServerは以下のどちらかのタイプである必要があります。また、両方で分散トランザクションを使
用するように設定が必要です。
- EJBアプリケーションのみ運用
- WebアプリケーションとEJBアプリケーションを別JavaVMで運用
・ トランザクションで制御できるリソース: トランザクションを開始してから終了するまでの間に使用できるリソースは以下のとおりです。
使用したリソースは、トランザクションによる制御の対象となります。
分散トランザクションの使用有無
トランザクションで制御できるリソース
使用しない
・ JDBCデータソース (*1)(*2)
使用する
・ JDBCデータソース (*3)
・ JMSコネクションファクトリ (*3)
・ connectorコネクションファクトリ (*3)
(*1)トランザクションを開始してから終了するまでの間に使用できるデータソースは1個のみです。また、そのデータソースを2回以
上使用する場合は、同一のユーザIDとパスワードを使用する必要があります。
(*2)InterstageにJDBCデータソースを登録する必要があります。登録にはInterstage管理コンソールを使用します。
(*3)Interstageにリソースを登録する必要があります。また、そのリソースは分散トランザクション連携が可能である必要があります。
リソースの登録にはInterstage管理コンソールを使用します。
ポイント
トランザクションに参加できるリソースは、アプリケーションサーバなどの実行環境に依存します。
4.7.2 ビジネスクラスの作成
トランザクション管理機能を使用するには、com.fujitsu.uji.transaction.TransactionHandlerインタフェースを実装してビジネスクラスを作
成 し ま す 。 簡 単 に 作 成 し た い 場 合 は 、 com.fujitsu.uji.transaction.GenericTransactionHandler ク ラ ス を 継 承 し て 作 成 し ま す 。
GenericTransactionHandlerクラスはTransactionHandlerインタフェースの簡単な実装を提供します。
デフォルトでは、Apcoordinatorによって以下のようにトランザクションが制御されます。
・ TransactionHandlerを実装したビジネスクラスの全てのビジネスメソッドでトランザクション管理機能が有効です。
・ javax.transaction.UserTransactionインタフェースを使ってトランザクションを制御します。
- 41 -
トランザクション開始直前に特定の処理を実行する
トランザクションの開始直前に特定の処理を実行したい場合には、ビジネスクラスのbeforeTransactionBeginメソッドにその処理を記述
します。このメソッドは、トランザクション開始前に呼び出されます。
トランザクション終了直前に特定の処理を実行する
トランザクションのコミットまたはロールバックの直前に特定の処理を実行したい場合は、ビジネスクラスのbeforeTransactionCompletion
メソッドにその処理を記述します。 beforeTransactionCompletionは、ビジネスメソッドの実行終了後でトランザクションをコミットまたはロー
ルバックする直前に呼び出されます。現在のトランザクションの状況を取得するには、com.fujitsu.uji.DispatchContextクラスの
getRollbackOnlyメソッドを使用します。例外の発生やsetRollbackOnlyの実行によってロールバックすることが決定している場合、
getRollbackOnlyはtrueを返します。
beforeTransactionCompletionで以下の処理を行った場合は、トランザクションはロールバックされます。
・ ロールバック例外を発生した場合。
・ DispatchContextクラスのsetRollbackOnlyメソッドを呼び出した場合。
トランザクション終了後に特定の処理を実行する
トランザクションのコミット後またはロールバック後に特定の処理を実行したい場合は、ビジネスクラスのafterTransactionCompletionメソッ
ドにその処理を記述します。 afterTransactionCompletionは、トランザクションをコミットまたはロールバックした直後に呼び出されます。
ビジネスメソッドごとにトランザクション管理機能の動作を設定する
ビジネスメソッドごとにトランザクション管理機能の有無や追加のロールバック例外を指定するには、設定ファイルフォルダにビジネスク
ラス設定ファイル(handlerconfig.xml)を作成して設定を記述します。
以下は、ビジネスクラス設定ファイル(handlerconfig.xml)の記述例です。
<?xml version="1.0" encoding="Shift_JIS"?>
<handlerConfig
xmlns=http://interstage.fujitsu.com/schemas/uji/handlerConfig
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/handlerConfig
http://interstage.fujitsu.com/schemas/uji/handlerconfig.xsd">
<config>
<version>6.0</version>
</config>
<handler name="sample.SampleHandler"> <!-- (1) -->
<method name="doUpdate">
<!-- (2) -->
<transaction enabled="true">
<!-- (3) -->
<rollbackException class="some.pkg.MyException">
</transaction>
</method>
<method name="*">
<!-- (5) -->
<transaction enabled="false"/>
<!-- (6) -->
</method>
</handler>
<!-- (4) -->
</handlerConfig>
・ (1) handlerタグでビジネスクラス1個についての設定を記述します。nameアトリビュートにビジネスクラスのクラス名をパッケージ名付
きで記述します。
・ (2) (1)のビジネスクラスの各ビジネスメソッドの設定をmethodタグで記述します。nameアトリビュートにメソッド名を記述します。method
タグはhandlerタグのコンテントに必要なだけ繰り返して記述します。
- 42 -
・ (3) (2)のビジネスメソッドの設定をtransactionタグで記述します。transactionタグはmethodタグのコンテントに1個だけ記述します。
transactionタグには以下のアトリビュートを指定します。
- enabled
トランザクション管理機能を有効にするかどうかを指定します。trueを指定すると(2)のビジネスメソッドでトランザクション管理機
能が有効に、falseを指定すると無効になります。このアトリビュートを省略した場合はtrueです。
・ (4) 必要に応じてtransactionタグのコンテントにrollbackExceptionタグを記述してロールバック例外を追加します。classアトリビュー
トに例外クラスをパッケージ名付きで記述します。指定されたクラスとそのサブクラスがロールバック例外に追加されます。以下のク
ラスは既定でロールバック例外として使用されるため、classアトリビュートに指定できません。
- java.lang.RuntimeException とそのサブクラス
- java.lang.Errorとそのサブクラス
・ (5),(6) methodタグにname="*"を指定すると、デフォルトの設定を定義できます。このデフォルトの設定は、methodタグが記述され
ていないメソッドや、methodタグは存在してもtransactionタグが省略されているメソッドに適用されます。
上記の記述例では、sample.SampleHandlerクラスのdoUpdateメソッドではトランザクション管理機能が有効で、その他のメソッドでは無
効になります。doUpdateでは、RuntimeException、Error、それらのサブクラスに加えて、some.pkg.MyExceptionをロールバック例外とし
て使用します。
メソッドの実行順序
トランザクション管理機能を使用した場合、ビジネスクラスのメソッドは以下の順序で呼び出されます。
ビジネスクラスがcom.fujitsu.uji.Postprocessorインタフェースを実装している場合は、postprocessメソッドとhandleExceptionメソッドのどち
らか一方が呼び出されます。handleExceptionが呼ばれるのは以下の処理で例外が発生した場合です。それ以外はpostprocessが呼び
出されます。
・ beforeTransactionBegin
・ トランザクション開始
・ ビジネスメソッド
preprocess、beforeTransactionBegin、トランザクション開始処理で例外が発生した場合、後続の処理の一部はスキップされます。例外
の発生個所とスキップされる処理の関係を以下の表に示します。
- 43 -
例外を発生する処理
後続の処理の実行有無
before
Transaction
Begin
トランザク ビジネスメ
ション開始
ソッド
before
Transaction
Completion
トランザク
ション終了
after
Transaction
Completion
handle
Exception
(*1)
preprocess
×
×
×
×
×
×
×(*2)
beforeTransactionBegin
-
×
×
×
×
×
○
トランザクション開始
-
-
○
○
○
○: 実行されます。
×: 実行されません。
-: 後続の処理に該当しません。
(*1) ビジネスクラスがPostprocessorインタフェースを実装している場合に呼び出されます。
(*2) handleException, postprocessのどちらも呼び出されません。
注意
ビジネスクラスがTransactionHandlerインタフェースを実装していても、ビジネスクラス設定ファイルでトランザクション管理機能が無効に
設定されている場合は、beforeTransactionBegin, beforeTransactionCompletion, afterTransactionCompletionメソッドは呼び出されませ
ん。
4.7.3 トランザクション管理機能とビジネスクラス再試行機能の併用
トランザクション管理機能とビジネスクラス再試行機能の両方を使用するには、com.fujitsu.uji.transaction.TransactionHandlerインタフェー
ス と com.fujitsu.uji.RetriableHandler イ ン タ フ ェ ー ス を 実 装 し て ビ ジ ネ ス ク ラ ス を 作 成 し ま す 。 簡 単 に 作 成 し た い 場 合 は 、
com.fujitsu.uji.transaction.RetriableTransactionHandler ク ラ ス を 継 承 し て 作 成 し ま す 。 RetriableTransactionHandler ク ラ ス は
TransactionHandlerインタフェースとRetriableHandlerインタフェースの簡単な実装を提供します。
ビジネスクラス設定ファイル(handlerconfig.xml)には、以下の例のように、トランザクション管理機能とビジネスクラス再試行機能の両方
に関する設定を記述できます。
<?xml version="1.0" encoding="Shift_JIS"?>
<handlerConfig
xmlns=http://interstage.fujitsu.com/schemas/uji/handlerConfig
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/handlerConfig
http://interstage.fujitsu.com/schemas/uji/handlerconfig.xsd">
<config>
<version>6.0</version>
</config>
<handler name="sample.SampleHandler">
<method name="doUpdate">
<transaction enabled="true"/>
<!-- (1) -->
<retry enabled="true" retryInterval="200" retryCount="1" />
</method>
<method name="search">
<retry enabled="true" retryInterval="200" retryCount="1" />
</method>
<method name="*">
<transaction enabled="false"/>
<!-- (4) -->
<retry enabled="false"/>
<!-- (5) -->
</method>
</handler>
</handlerConfig>
この記述例による設定内容は以下のとおりです。
- 44 -
<!-- (2) -->
<!-- (3) -->
・ sample.SampleHandlerクラスのdoUpdateメソッドでは、(1), (2)の指定により、トランザクション管理機能とビジネスクラス再試行機能
の両方が有効です。
・ sample.SampleHandlerクラスのsearchメソッドでは、(3)の指定により、ビジネスクラス再試行機能は有効です。トランザクション管理
機能についての指定はないため、(4)で指定されたデフォルトの定義に従い、トランザクション管理機能は無効になります。
・ sample.SampleHandlerクラスのその他のメソッドでは、(4), (5)の指定によりトランザクション管理機能、ビジネスクラス再試行機能の
両方とも無効です。
トランザクション管理機能とビジネスクラス再試行機能を併用した場合、ビジネスクラス再試行機能とトランザクション管理機能が連動し
て動作します。再試行が行われる場合は、再試行直前にトランザクションがロールバックされ、再度トランザクションが開始されます。
また、ビジネスクラスのメソッドは以下の順序で呼び出されます。再試行される場合は、afterTransactionCompletionまで実行されたあと
に再試行され、beforeTransactionBeginから再度実行されます。
ビジネスクラスがcom.fujitsu.uji.Postprocessorインタフェースを実装している場合は、postprocessメソッドとhandleExceptionメソッドのどち
らか一方が呼び出されます。handleExceptionが呼ばれるのは以下の場合です。それ以外はpostprocessが呼び出されます。
・ beforeTransactionBeginまたはトランザクション開始処理で例外が発生した場合。
・ ビジネスメソッドが例外を発生したが、再試行は行われなかった場合。以下の場合が該当します。
- 発生した例外が再試行例外でない場合。
- 例外発生後、beforeMethodCompletionでsetRetry(false)が実行された場合。
- 再試行最大回数を超える場合。
・ ビジネスメソッドは正常終了し、かつ、setRetry(true)が実行され、かつ、再試行最大回数を超えるため再試行できない場合。この場
合、com.fujitsu.uji.RetryCountExpiredExceptionがhandleExceptionに通知されます。
preprocess、beforeTransactionBegin、トランザクション開始処理で発生した例外は、handleExceptionに通知されません。
preprocess、beforeTransactionBegin、トランザクション開始処理で例外が発生した場合、後続の処理の一部はスキップされます。例外
の発生個所とスキップされる処理の関係を以下の表に示します。
- 45 -
例外を発生する処理
後続の処理の実行有無
before
Transaction
Begin
トラン ビジネ
ザク
スメ
ション ソッド
開始
before
Transaction
Completion
before
Method
Completion
トラン
ザク
ション
終了
after
Transaction
Completion
handle
Exception
(*1)
preprocess
×
×
×
×
×
×
×
×(*2)
beforeTransactionBegin
-
×
×
×
×
×
×
○
トランザクション開始
-
-
×
○
×
×
○
○
○: 実行されます。
×: 実行されません。
-: 後続の処理に該当しません。
(*1) ビジネスクラスがPostprocessorインタフェースを実装している場合に呼び出されます。
(*2) handleException, postprocessのどちらも呼び出されません。
4.7.4 JDBCのトランザクションの制御
JDBCを使ったデータベース接続のトランザクションをApcoordinatorに制御させるには、ビジネスクラスのpreprocessメソッドまたは
beforeTransactionBeginメソッドで以下の処理を実行します。
1. com.fujitsu.uji.DispatchContextクラスのgetUjiTransactionメソッドを使ってcom.fujitsu.uji.transaction.UjiTransactionオブジェクトを
取得します。UjiTransactionはトランザクション管理機能においてトランザクションを管理するクラスです。
2. UjiTransactionのsetSQLConnectionメソッドを使い、UjiTransactionにjava.sql.Connectionオブジェクトを登録します。
UjiTransactionにjava.sql.Connectionオブジェクトを登録した場合、Apcoordinatorはjava.sql.Connectionインタフェースを使ってトランザ
クションを制御します。UserTransactionインタフェースを使ったトランザクション管理は無効になります。
以下はビジネスクラスの記述例です。
import
import
import
import
import
import
import
import
import
import
import
java.util.Hashtable;
java.sql.Connection;
javax.sql.DataSource;
java.sql.SQLException;
javax.naming.InitialContext;
javax.naming.Context;
javax.naming.NamingException;
com.fujitsu.uji.transaction.GenericTransactionHandler;
com.fujitsu.uji.transaction.UjiTransaction;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.Preprocessor;
public class SampleHandler extends GenericTransactionHandler
{
Connection connection = null;
public int preprocess(DispatchContext context) {
try {
Hashtable hashtable = new Hashtable();
hashtable.put(Context.INITIAL_CONTEXT_FACTORY,
"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
hashtable.put(Context.PROVIDER_URL, "SYM://SYMFOSV");
InitialContext ctx = new InitialContext(hashtable);
DataSource source = (DataSource)ctx.lookup("jdbc/sampledb");
connection = source.getConnection("userName", "password"); // (1)
UjiTransaction ujiTransaction = context.getUjiTransaction();
ujiTransaction.setSQLConnection(connection);
// (2)
// connection.setAutoCommit(false)はUjiTransactionによって実行される
- 46 -
// ため、アプリケーションプログラムで実行する必要はありません。
} catch (SQLException e) {
...
} catch (NamingException e) {
...
}
return Preprocessor.EVAL;
}
...
public Object postprocess(DispatchContext context, Object result) {
closeConnection();
return result;
}
public Object handleException(DispatchContext context, Throwable th) {
closeConnection();
return null;
}
private void closeConnection() {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
...
}
}
}
}
preprocessメソッド内の(1)でデータベース接続を確立し、(2)でUjiTransactionオブジェクトに登録しています。これにより、(1)で作成
したデータベース接続のトランザクションがApcoordinatorによって管理されます。データベース接続の切断はアプリケーションで処
理する必要があります。この記述例では、postprocessメソッド、handleExceptionメソッドでデータベース接続を切断しています。
ポイント
上記の記述例の処理をビジネスクラス再試行機能と併用した場合、再試行時はデータベース接続が新規に作成されず、既存のデー
タベース接続が再利用されます。preprocess, postprocess, handleExceptionメソッドは再試行の範囲に含まれないためです。 再試行の
たびにデータベース接続の作成と切断を実行したい場合は、beforeTransactionBeginメソッドでデータベース接続の確立とUjiTransaction
オブジェクトへの登録を、afterTransactionCompletionメソッドで切断を実行します。
JDBC以外のインタフェースでも、アダプタを作成することによって、Apcoordinatorにトランザクションを制御させることができます。この
場合、以下のようにプログラムを作成します。
・ Apcoordinatorがトランザクションを制御できるようにするためのアダプタを作成します。アダプタは、com.fujitsu.uji.transaction.Resource
インタフェースを実装します。Resourceインタフェースのbegin, commit, rollbackメソッドが呼び出されたときに、トランザクションの開
始、コミット、ロールバックが実行されるようにアダプタを作成します。
・ ビジネスクラスのbeforeTransactionBeginメソッドで、トランザクションを制御する対象をアダプタでラップし、UjiTransactionクラスの
setResourceメソッドによりアダプタをUjiTransactionに登録します。
UjiTransactionのsetResourceメソッドを使用した場合、Apcoordinatorは登録されたアダプタを使用してトランザクションを制御します。
UserTransactionインタフェースを使ったトランザクション管理は無効になります。
- 47 -
4.7.5 トランザクション管理機能を使用する場合の注意事項
トランザクション管理機能を使用する場合は以下の注意事項があります。
・ デフォルトの設定では、Apcoordinatorはjavax.transaction.UserTransactionインタフェースを使用してトランザクションを制御します。
この場合、UserTransactionインタフェースを直接使用してトランザクションを制御しないでください。ApcoordinatorがUserTransaction
を使用しているため、トランザクションの制御が正常に行えなくなります。
・ セションBeanでトランザクション管理機能を使用する場合は、そのセションBeanでBean管理のトランザクション区切りを使用してくだ
さい。コンテナ管理のトランザクション区切りを使用した場合、トランザクション管理機能が使用できず、ビジネスクラスが呼び出され
ずに例外が発生します。
- 48 -
第5章 アプリケーションログ
Apcoordinatorでは、アプリケーションログを採取する機能を持っています。アプリケーションログ機能には、以下の機能があります。
・ アプリケーションに記述を行わなくても、Apcoordinatorが動作を表すログを出力します。
・ 出力レベルを設定することで、出力対象のログを絞り込むことができます。
・ ログキャッシュに対応しており、アプリケーションの実行に影響を与えずにログを出力することができます。
・ 出力先ファイルの自動分割が可能です。また、syslog、Windowsイベントログが利用できます。
・ WebアプリケーションとEJBアプリケーションがそれぞれ出力するログを対応づけるコンテキストIDを出力します。
・ 出力先やフォーマットなどの情報は、ログ定義ファイルを記述することで容易に設定することも可能です。
・ データベースにログを出力する高信頼性ログ機能を利用することで、堅牢なログ管理が可能です。
各ログ機能と製品の関係は次のとおりです。
機能
エディション
(1)
(2)
(3)
基本機能
○
○
○
ログのキューイング
○
○
○
○
○
○
○
ログ拡張機能
コンテキストIDの出力
○
格納LogComposerクラスの利用
○
定義ファイルを用いたログ出力
○
高信頼性ログ
○
○
表中の番号に対応する製品とエディションは以下のとおりです。
番号
製品名とエディション
(1)
Interstage Application Server Standard-J Edition
Interstage Application Server Enterprise Edition
Interstage Studio Standard-J Edition
Interstage Interaction Manager
(2)
Interstage Studio Enterprise Edition
(3)
Interstage Business Application Server Standard Edition
Interstage Business Application Server Enterprise Edition
5.1 基本機能
ログ出力の基本操作
ログを出力するためには、LogComposerオブジェクトを使用します。これはアプリケーションクラスまたはDispatchContextから参照可能
です。
import com.fujitsu.uji.log.*;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
....
- 49 -
LogComposer lc = context.getApplicationProfile().getLogComposer();
lc.println("処理を開始");
}
}
ログのレベル
Apcoordinatorのログには重要度のレベルを設定することができます。ログのレベルは0を最重要とし、数が大きくなるほど重要度が下
がります。レベルは任意に設定できます。
以下は、Apcoordinatorで使用しているレベルです。
レベル
3:
出力するログ
説明
Apcoordinatorのエラーログのレベル
UJIで始まるエラーコードとメッセージを出力
10:
Apcoordinatorのインフォメーションログのレベル
内部の実行状況を表すログを出力
20:
Apcoordinatorのトレースログのレベル
データBeanのダンプや詳細な実行状況を表すログを出
力
注意
Apcoordinatorが出力するログは、機能の追加や改善などにより、将来、変更される場合があります。
以下は、デフォルトで定義するログのレベルです。
レベル
出力するログ
説明
0:
最重要のログ
ユーザアプリケーションが出力するログで最重要のレベ
ルとして利用
5:
ログレベル未指定メッセージのデフォルトレベルの初期
値
デフォルトの出力レベル
ログのレベルは、表示時に指定します。
LogComposer lc = context.getApplicationProfile().getLogComposer();
lc.println(7, "処理を開始");
レベルを指定しないとデフォルトのレベルが使用されます。デフォルトレベルの初期値は5ですが、setDefaultLevelメソッドで設定を変
更できます。
lc.setDefaultLevel(7);
lc.println("処理を開始");
ログの出力レベルを設定することによって、不要なログ出力を抑制することができます。デフォルトでは9(レベル9以下のログのみ出
力)となっています。
lc.setLogLevel(5);
// レベル5以下のログを出力
ログ出力レベルは初期化パラメタ、および、ログ定義ファイルでも設定することができます。ただし、setLogLevelメソッドでログ出力レベ
ルが設定されている場合は、そちらが優先されます。初期化パラメタについては“13.3 初期化パラメタ”を参照してください。ログ定義
ファイルについては定義ファイルを用いたログ出力を参照してください。以下はWebアプリケーションでweb.xmlファイルにログ出力レ
ベルを定義する例です。
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<context-param>
<param-name>logLevel</param-name>
- 50 -
<param-value>5</param-value>
</context-param>
</web-app>
ログ出力のために文字列化の処理を行う場合、予めログレベルを判断することによって不要な処理を除外することができます。
int level = 5;
if(lc.isLogged(level)) {
String message = "文字列の" + a + "演算は" + b + "ハイコスト";
lc.println(level, message);
}
フォーマットの設定
LineLogFormatオブジェクトは、ログ出力のフォーマットを設定します。LogComposerオブジェクト作成時に任意のフォーマットを指定す
ることができます。
lc = LogComposer.getFileOutputInstance("c:¥¥myapp¥¥mylog.txt", true,
new LineLogFormat("%d %m"));
以下の指定により、システム情報を表示することができます。なお、コンテキストIDは、DispatchContextクラスから参照したLogComposer
オブジェクトを使用した場合に出力されます。
%m
メッセージ本文
%i
コンテキストID
%d
時刻
%t
スレッド名
%s
メソッド名
%l
ログレベル
%%
%記号を表示する
例として"%d %m"の指定では以下のようなログが出力されます。
2001/01/05 16:47:49 uji:no entry in commands.map for TestUseBean.dataBean1;submit
5.1.1 ユーザ定義のログ出力クラスの作成
LogComposer派生クラスを作成することで、ログ本文の編集を行う処理を記述することが可能です。
ログ出力機能のカスタマイズ
LogComposerオブジェクトは、アプリケーションクラスで任意に設定することができます。 ApplicationProfileクラスのnewLogComposerを
オーバーライドし、LogComposerオブジェクトを返すことで、ログのフォーマットや出力先を変えることができます。デフォルトでは、キュー
有効で、標準出力に日付付きメッセージを出力します。
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
public LogComposer newLogComposer() {
LogComposer lc;
try {
lc = LogComposer.getFileOutputInstance("c:¥¥myapp¥¥mylog.txt", true, new LineLogFormat("%d %m"));
} catch(IOException e) {
return null; // デフォルトを使用
}
lc.setQueueSize(1000);
lc.enableQueue();
lc.setLogLevel(9);
return lc;
- 51 -
}
}
ログ出力を無効にする場合は、空のLogComposerオブジェクトを返します。
public LogComposer newLogComposer() {
return new LogComposer();
}
派生クラスでは、ログ本文の編集を行ったあとに、LogComposerクラスのprintlnメソッドを呼び出し、ログ出力を行います。
派生クラスの作成
メッセージの編集を行うようprintlnメソッドをオーバーライドし、ログを出力するLogComposer派生クラスの作成例を以下に示します。
/**
* メッセージの編集を行う派生クラスの作成例です。
* この例では、基底クラスに LogComposerを用いています。
* 再定義するメソッドは、利用するアプリケーションの要件により異なります。
*/
package my.sample;
import com.fujitsu.uji.log.LogComposer;
public class MyLogComposer extends LogComposer {
public MyLogComposer() {
}
public void println(int level, Object obj, int back) {
// 指定のログレベルがログ出力対象になっているかを判断します。
if( isLogged(level) ) {
// メッセージの編集を行います。
StringBuffer buf = new StringBuffer();
buf.append(" PREFIX TEXT ");
buf.append( String.valueOf(obj) );
// 編集後に、基底クラスのメソッドを呼び出します。
output(level, buf.toString(), back);
}
}
}
ユーザ独自のメソッドを定義し、メッセージの編集を行ってprintlnメソッドを呼び出し、ログを出力するLogComposer派生クラスの作成例
を以下に示します。
/**
* メッセージの編集を行う派生クラスの作成例です。
* この例では、基底クラスに LogComposerを用いています。
*/
package my.sample;
import com.fujitsu.uji.log.LogComposer;
public class MyLogComposer2 extends LogComposer {
public MyLogComposer2() {
}
public void myPrintln(int level, Object obj1, Object obj2, int back) {
// 指定のログレベルがログ出力対象になっているかを判断します。
if( isLogged(level) ) {
// メッセージの編集を行います。
StringBuffer buf = new StringBuffer();
buf.append( String.valueOf(obj1) );
buf.append( "," );
buf.append( String.valueOf(obj2) );
// 編集後に、基底クラスのメソッドを呼び出します。
println(level, buf.toString(), back);
}
- 52 -
}
}
注意
LogComposer派生クラスを作成する場合は、デフォルトコンストラクタを定義してください。
5.2 ログのキューイング
アプリケーションログを出力する場合、ログの出力を行っている間にアプリケーションの処理が中断します。ログのキューイングを行うこ
とで、アプリケーション処理の完了後適当なタイミングでログを出力することができます。この機能を使うことで、アプリケーションのレス
ポンスに影響なくログの出力を行うことができます。 Apcoordinatorのログ機構では、デフォルトでログのキューイングを有効にしていま
す。
キューの有効・無効
メッセージの順序をアプリケーション内で限定したい場合は、一時的にキューを無効にします。メッセージがキューに溜まっている場合
は、出力を待つことになります。
LogComposer lc = context.getApplicationProfile().getLogComposer();
synchronized(lc) {
lc.disableQueue(true);
lc.println(3, "重要なメッセージ");
lc.enableQueue();
}
あらかじめアプリケーションログで利用するキューを無効にすることが可能です。初期化パラメタ"uji.log.enablecache"へfalseを指定す
るとキャッシュを無効にします。初期化パラメタは、ApplicationProfileクラス、または、DispatchContextクラスのgetLogComposer()メソッド
で参照するLogComposerオブジェクトに有効です。 キューイングの有効・無効は初期化パラメタ、および、ログ定義ファイルでも設定す
ることができます。ただし、disableQueueメソッドで設定されている場合は、そちらが優先されます。初期化パラメタについては“13.3 初
期化パラメタ”を参照してください。ログ定義ファイルについては定義ファイルを用いたログ出力を参照してください。以下はWebアプリ
ケーションでweb.xmlファイルにログのキュー利用を無効とする定義の例です。
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<context-param>
<param-name>uji.log.enablecache</param-name>
<param-value>false</param-value>
</context-param>
</web-app>
注意
ログのキューイングを有効にした場合、LogComposerインスタンスごとにキューが生成されます。これに伴って、次の2点に注意してくだ
さい。
・ 複数のインスタンスから同一の出力先へ出力する場合、各キューが出力するタイミングによって、ログ中に別のログが割り込んで出
力される場合があります。この現象をログの混在といいます。
また、標準出力や標準エラー出力へ出力する場合、コンテナが出力するログやSystem.out.printlnメソッドなどのログ出力クラス以
外からの出力を行なった場合にログの混在が発生する場合があります。
複数のLogComposerインスタンスから同一の出力先へ出力する場合は、ログの混在を回避するために、それぞれのLogComposer
インスタンスに同一のLogSinkインスタンスを設定してください。
コンテナが出力するログとのログの混在を防ぐためには、出力先を標準出力ではなく個別のファイルなどを指定して、ログ出力クラ
スを使用して出力するようにしてください。
- 53 -
・ LogComposerのインスタンス1つにつき、スレッドが1つ生成されます。LogComposerのインスタンスを大量に生成するとJVMのスレッ
ド数の制限を超える場合がありますので注意してください。
キューサイズの設定
キューのサイズ(メッセージを蓄積できる数)を設定しておくことによって、ログメッセージによってメモリが枯渇することを防ぎます。この
上限を超えてメッセージを出力しようとした場合、出力の実行により空きができるまで待たされます。デフォルトのキューサイズは1000で
す。
lc.setQueueSize(1000);
カスタマイズしたログ機構でのキュー設定
カスタマイズしたログ機構を使用する場合、ログ機構を取得した直後はキューが抑制されています。キューの開始を実行する必要があ
ります。
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
LogComposer newLogComposer() {
LogComposer lc;
lc = LogComposer.getFileOutputInstance("c:¥¥myapp¥¥mylog.txt", true,
new LineLogFormat("%d %m"));
lc.setQueueSize(1000);
lc.enableQueue();
lc.setLogLevel(9);
return lc;
}
}
5.3 ログ拡張機能
ログ拡張機能を使用することで、不要なアプリケーションログの出力を制御するためのフィルタ機能や、syslogへの出力機能を利用す
ることが可能です。ログ拡張機能を使用する場合は、[Apcoordinatorのインストールフォルダ]¥lib¥ujief.jarをクラスパスに設定してくだ
さい。
ログフィルタ機能
特定の文字列を含むアプリケーションログのみを選択して出力することができます。文字列は正規表現パターンで指定します。
ログフィルタ機能を使用する場合は、com.fujitsu.uji.log.writer.FilterWriterクラスを使用します。
下記の例では、日付と時刻のあとに"Warning"という文字列を含むものだけを出力します。
import com.fujitsu.uji.*;
import com.fujitsu.uji.log.*;
import com.fujitsu.uji.log.writer.FilterWriter;
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
public LogComposer newLogComposer() {
LogComposer lc;
try {
String pattern = "[0-9][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] Warning.*$";
FilterWriter writer = new FilterWriter(pattern);
lc = new LogComposer(new PrintLogSink(writer, new LineLogFormat("%d %m")));
} catch(IllegalArgumentException e) {
return null; // デフォルトを使用
}
lc.setQueueSize(1000);
lc.enableQueue();
lc.setLogLevel(9);
return lc;
- 54 -
}
}
ポイント
ログの出力フォーマット設定を併用することで、処理対象のメソッド名や、時刻によってログの出力先を変更することが可能です。
注意
FilterWriterクラスには補助文字の使用に関して以下の注意事項があります。
・ 正規表現パターンに補助文字を含めることはできません。
・ ログに出力する文字列を正規表現パターンとマッチさせる際、文字列中に補助文字が含まれている場合は、その補助文字は1文
字としては扱われず2文字として扱われます。
syslogへの出力機能
アプリケーションログをsyslogへ出力する方法は以下の2つがあります。
・ ログ定義ファイルを使用したsyslog出力
・ SyslogWriterクラスを使用したsyslog出力
ログ定義ファイルを使用したsyslog出力
ログ定義ファイルにアプリケーションログの出力先としてsyslogを設定することにより、アプリケーションログをsyslogに出力することが
できます。
ログ定義ファイルでは、syslogサーバのホスト名や、ログの機能(Facility値)、ログの重大度(Severity値)を設定することが可能で
す。
下記では、localhostのsyslogサーバに、機能を"ユーザ"(デフォルト)、重大度を"エラー"として設定しています。
<logComposer name="system">
<output name="sysLogOut" type="syslog"/>
<param name="hostname" value="localhost"/>
<param name="facility" value="user"/>
<param name="severity" value="err"/>
</output>
</logComposer>
ログ定義ファイルの詳細は“5.5 定義ファイルを用いたログ出力”を参照してください。
SyslogWriterクラスを使用したsyslog出力
com.fujitsu.uji.log.writer.SyslogWriterクラスを使用します。
SyslogWriterクラスでは、syslogサーバのホスト名や、ログの機能(Facility値)、ログの重大度(Severity値)を設定することが可能で
す。
下記では、localhostのsyslogサーバに、機能を"ユーザ"(デフォルト)、重大度を"エラー"として送信しています。
import com.fujitsu.uji.*;
import com.fujitsu.uji.log.*;
import com.fujitsu.uji.log.writer.SyslogWriter;
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
public LogComposer newLogComposer() {
LogComposer lc;
try {
SyslogWriter writer = new SyslogWriter("localhost");
writer.setSeverity(SyslogWriter.SEVERITY_ERR);
lc = new LogComposer(new PrintLogSink(writer, new LineLogFormat("%d %m")));
} catch(IllegalArgumentException e) {
- 55 -
return null; // デフォルトを使用
}
lc.setQueueSize(1000);
lc.enableQueue();
lc.setLogLevel(9);
return lc;
}
}
syslogの出力方法について
Solaris環境およびLinux環境においてlocalhostのsyslogにメッセージを出力する場合、以下の2つの方法を選択することができます。
・ UDP
・ syslog関数
UDPでlocalhostにメッセージを出力する場合、syslogdが出力元のアドレスを元に名前解決を行うため、syslogのメッセージに出力され
るホスト名が、設定によって実ホストとならない場合があります。Systemwalkerなどでsyslogのメッセージに出力されるホスト名を元にメッ
セージの監視を行っている場合は、syslog関数を選択してください。
注意
syslogサーバの設定方法は、ご使用になるsyslogサーバのマニュアルを参照してください。
syslog関数を使用してログを出力する場合、ログ定義ファイルを使用してログの出力を行ってください。
5.4 コンテキストIDの出力
Webアプリケーションがリクエストを受け付けるごとにコンテキストIDを生成します。 WebアプリケーションからEJBアプリケーションを呼
び出した場合に、WebアプリケーションとEJBアプリケーションで同一のコンテキストIDがログに出力されます。コンテキストIDにより、Web
アプリケーションからEJBアプリケーションを呼び出す両者のログを対応づけて参照することが可能となります。
コンテキストIDの生成
コンテキストIDはセションIDを組み込んで生成されます。初期化パラメタuji.log.contextidModeの指定によってコンテキストIDの長さが
異なります。
・ trueを指定した場合は、セションIDの全体がコンテキストIDに組み込まれます。
・ falseを指定した場合は、セションIDの末尾54文字がコンテキストIDに組み込まれます。54文字に満たない場合は、セションIDの全
体がコンテキストIDに組み込まれます。
省略時はtrueです。
以下はweb.xmlで初期化パラメタuji.log.contextidModeを指定する例です。
<context-param>
<param-name>uji.log.contextidMode</param-name>
<param-value>true</param-value>
</context-param>
ログ出力の操作
コンテキストID付きのログを出力するには、DispatchContextクラスから取得したLogComposerを使用します。
import com.fujitsu.uji.log.*;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
- 56 -
....
LogComposer lc = context.getLogComposer();
lc.println("処理を開始");
}
}
デフォルトのフォーマット「%d %i%m」で出力した場合、以下のように出力されます。
2008/01/31 20:40:07 [0140-1U758OIN0N39RFV1A9NLFPVOERUUNJ3NEBBI169TNLLBG963Q8C9QCD5PSBG200008000000.IJServer_001-001]処理
を開始
アプリケーションクラスから取得したLogComposerを使用するとコンテキストIDは出力されません。
import com.fujitsu.uji.log.*;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
....
LogComposer lc = context.getApplicationProfile().getLogComposer();
lc.println("処理を開始");
}
}
デフォルトのフォーマット「%d %i%m」で出力した場合、以下のように出力されます。
2004/08/19 9:48:17 処理を開始
5.5 定義ファイルを用いたログ出力
ログ定義ファイルを利用することにより、Apcoordinatorが標準で利用するログ(標準ログ)とユーザアプリケーションで利用するログを分
けることが可能です。標準で利用するログは、アプリケーションに記述を行わなくてもApcoordinatorがログを出力します。
ログ定義ファイルの格納先は“3.6.2 設定ファイルフォルダ”を参照してください。
Apcoordinatorで出力するログは以下のように分類されています。
分類
標準ログ
ユーザログ
高信頼性ログ
管理名
用途
system
Apcoordinatorの稼働状況を出力します。
上記以外の任意の名称
データベース更新やアプリケーションの呼び出しで指定する
パラメタなど、データ操作の運用履歴を取得します。
アプリケーションでユーザが定義して使用できます。
汎用ログ
実行時に発生したエラーや、動作の過程を表すインフォメー
ション、開発過程や障害調査などで用いるデバッグ情報を
取得します。
アプリケーションでユーザが定義して使用できます。
注意
・ 管理名として以下を利用することはできません。
- journal
- performance
- systemClient
- journalClient
- 57 -
- performanceClient
・ ログ定義ファイルを利用する場合、ApplicationProfileクラスのnewLogComposerが返すLogComposerオブジェクトは利用されませ
ん。
ログ出力の記述
ビジネスメソッドでは、以下の記述でログを出力します。ログ出力クラス(LogComposer)は、DispatchContextクラスのgetLogComposerの
引数に、ログ管理名を指定することで取得します。 LogComposerの各メソッドを利用してログを出力します。
import com.fujitsu.uji.log.*;
....
public Object someMethod(DispatchContext context, DataBean bean) {
....
LogComposer myLogger = context.getLogComposer("mylog");
myLogger.println("someMethod start");
....
}
ログ定義ファイルの記述
管理名systemは、標準エラー出力へ、管理名mylogは、標準出力へログを出力する定義ファイルの例です。
《logConf.xml》
<?xml version="1.0" encoding="UTF-8" ?>
<logConfig
xmlns=http://interstage.fujitsu.com/schemas/uji/logConf
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/logConf
http://interstage.fujitsu.com/schemas/uji/logconf.xsd">
<config>
<version>7.0</version>
</config>
<logComposer name="system">
<output name="systemOutput" type="stderr"/>
</logComposer>
<logComposer name="mylog">
<output name="mylogOutput" type="stdout"/>
</logComposer>
</logConfig>
・ versionタグ
ログ定義ファイルの文法バージョンを指定します。指定するバージョンの詳細は“定義ファイルリファレンス”を参照してください。
・ logComposerタグ
ログ種別を指定します。nameには、管理名を指定します。
・ outputタグ
ログの出力先を指定します。詳細は後述します。
ログの出力先を設定する
outputタグは、ログの出力先を指定します。複数の出力先にログを出力する場合は、outputタグを複数記述します。
<logComposer name="system">
<output name="sysStdOut" type="stderr"/>
<output name="sysFileOut" type="file">
<param name="path" value="/var/log"/>
<param name="prefix" value="myapp"/>
<param name="extension" value=".log"/>
- 58 -
</output>
</logComposer>
name属性には、outputタグを識別する名前を指定します。 type属性は、以下のいずれかを記述します。パラメタが必要な場合は、param
タグで指定します。
指定名
意味
パラメタ
stdout
標準出力
なし
stderr
標準エラー出力
なし
file
ファイル
出力フォルダ(path)、ファイル名
(prefix)、拡張子(extension)
出力フォルダは"/var/log"(Solaris、
Linuxの場合)や、"C:¥log"(Windowsの
場合)のように設定します。
syslog
Syslog
ホスト名(hostname)、機能(facility)、重
大度(severity)、文字エンコーディング
(encoding)
event
Windowsイベントログ
ログ種別(type)
logComposer
他のログ定義の利用
logComposerタグの名前(target)
注意
Windowsイベントログへログを出力する場合は、次のファイルが環境変数PATHに設定されていることを確認してください。
- ujieventlog.dll
ファイルへ出力する場合には、プロセスごとに異なるファイルへ出力してください。また、異なる定義名から同一のファイルへ出力す
る場合には、次のように定義してください。
<logComposer name="system">
<output name="sysFileOut" type="file">
<param name="path" value="/var/log"/>
<param name="prefix" value="myapp"/>
<param name="extension" value=".log"/>
</output>
</logComposer>
<logComposer name="mylog01">
<output name="myLogOut" type="logComposer">
<!-- 定義名"system"のoutputタグの出力先へ出力 -->
<param name="target" value="system"/>
</output>
</logComposer>
注意
プロセス多重でログを出力する場合、type属性に“file”を指定しないでください。
type属性に“file”を指定し、ファイルが満杯となった場合、プロセス間で切り替えファイル名が重なり、それ以降のログが出力されま
せん。
プロセス多重でログを出力する場合、ファイル以外の出力先を指定してください。
ログ出力クラスを指定する
logComposerタグのclass属性で、ログ出力クラスを変更することができます。
<logConfig>
<!-- 作成した派生クラスを指定 -->
- 59 -
<logComposer name="Log1" class="my.sample.MyLogComposer">
<output name="myStdOut1" type="stdout"/>
</logComposer>
<logComposer name="Log2" class="my.sample.MyLogComposer2">
<output name="myLogOut" type="logComposer">
<param name="target" value="Log1"/>
</output>
</logComposer>
....
</logConfig>
ログレベルを指定する
ログの出力レベルは、levelタグで指定します。
<logComposer name="mylog">
<level>20</level>
<output name="mylogOut" type="stdout"/>
</logComposer>
標準ログの出力レベルは初期化パラメタのlogLevelで指定することもできます。
初期化パラメタとlevelタグの両方で指定した場合、初期化パラメタの指定が優先されます。
キューを指定する
logComposerタグのqueue属性で、ログが利用するキャッシュを指定することができます。-1を指定するとキャッシュは無効となりま
す。
<logComposer name="mylog" queue="100">
<output name="mylogOut" type="stdout"/>
</logComposer>
標準ログのキャッシュ無効の設定は初期化パラメタのuji.log.enablecacheで指定することもできます。
初期化パラメタでキャッシュ無効の指定をし、logComposerタグのqueue属性を指定した場合、初期化パラメタの指定が優先されま
す。
注意
複数の管理名で同一の出力先へ出力する場合は、ログの混在を回避するために、ログ定義ファイルのoutputタグのtype属性
に"logComposer"を指定して他の管理名の出力先へ出力するようにしてください。次に例を示します。
<logComposer name="system">
<output name="sysStdOut" type="stdout">
</output>
</logComposer>
<logComposer name="mylog01">
<output name="myLogOut" type="logComposer">
<!-- 定義名"system"のoutputタグの出力先へ出力 -->
<param name="target" value="system"/>
</output>
</logComposer>
ログ出力ファイルを自動分割する
出力先にfileを指定した場合は、出力ファイルの自動分割が可能です。
下記の例では最大ファイル数(number)と、ファイル当たりのバイト数(byte)を指定しています。
その他日付形式(dateFormat)、分割時間(timeOffset)を指定した、日付による分割も指定できます。
詳細は“定義ファイルリファレンス”を参照してください。
<logComposer name="system">
<output name="sysFileOut" type="file">
<param name="path" value="/var/log"/>
<param name="prefix" value="myapp"/>
- 60 -
<param name="extension" value=".log"/>
<param name="number" value="10"/>
<param name="byte" value="60000"/>
</output>
</logComposer>
ログ定義ファイルの随時更新を可能にする
commonタグのパラメタにwatchPeriodを指定することで、指定の時間間隔でログ出力クラスの再設定を行います。
例では、10分間隔でログ定義ファイルを参照します。
<?xml version="1.0" encoding="UTF-8" ?>
<logConfig
xmlns=http://interstage.fujitsu.com/schemas/uji/logConf
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/logConf
http://interstage.fujitsu.com/schemas/uji/logconf.xsd">
<config>
<version>7.0</version>
</config>
<common>
<param name="watchPeriod" value="10"/>
</common>
<logComposer name="system">
<output name="systemOutput" type="stderr"/>
</logComposer>
....
</logConfig>
注意
- LogComposerのメソッドにより、直接設定の変更を行った場合、ログ定義ファイルの随時更新までの間、メソッドで設定された状
態が有効となります。
- ログの再設定は、定義ファイルの更新時刻が前回の参照時刻から更新された場合に行います。
5.5.1 ログのフォーマットの設定
ログは、以下のフォーマットで構成されています。
標準のフォーマット指定方法
logFormatタグでログのフォーマットを指定する例です。
<logComposer name="system">
<output name="sysErrOut" type="stderr">
<logFormat>%d %m</logFormat>
- 61 -
</output>
</logComposer>
以下のように指定すると、システム情報を表示できます。
%m
メッセージ本文
%i
コンテキストID
%d
時刻
%t
スレッド名
%s
メソッド名
%l
ログレベル
%%
%記号を表示する
上記の例のように“%d %m”を指定した場合は、以下のようなログが出力されます。
2001/01/05 16:47:49 uji:no entry in commands.map for TestUseBean.dataBean1;submit
高度なフォーマット指定方法
定義済みのフォーマットパターンを指定してフォーマットを変更することが可能です。
時刻、コンテキストIDおよびメッセージ本文を半角カンマで区切って出力するにはmsgFormatタグでフォーマットパターン「2」、区切り
文字パターン「3」を指定します。
<output name="sysStdOut" type="stdout">
<msgFormat patternNo="2" patternSeparator="3"/>
</output>
msgFormatタグでフォーマットを詳細に指定する例を以下に示します。
<logComposer name="system" class="com.fujitsu.uji.log.ext.ExtMessageComposer">
<output name="sysErrOut" type="stderr">
<msgFormat>
<msgBasic>
<!-- 時刻のフォーマットを"yyyy/MM/dd hh:mm:ss.SSS"に指定 -->
<item name="%d" format="yyyy/MM/dd hh:mm:ss.SSS" > </item>
<item name="%m"/>
</msgBasic>
<msgBody>
<!-- メッセージIDの長さを10に指定 -->
<item name="messageID" length="10" > </item>
<item name="message"/>
</msgBody>
</msgFormat>
</output>
</logComposer>
・ msgFormat
ログ全体のフォーマットを指定します。例では、日付のitemタグとメッセージ本文のitemタグを指定しています。itemタグのコンテント
(例では空白1文字)はログ中に埋め込む文字列を表します。
・ msgBody
メッセージ本文のフォーマットを指定します。例では、メッセージIDと、メッセージを指定しています。
その他メッセージのフォーマットやセション情報のフォーマットを指定できます。詳細は“定義ファイルリファレンス”を参照してください。
5.5.2 目的別ログの利用
ログ定義ファイルでは、LogComposerクラスを拡張した以下のクラスを利用することができます。
- 62 -
・ com.fujitsu.uji.log.ext.ExtMessageComposer
フォーマット付きメッセージログを出力するクラスです。出力例を以下に示します。
2001/01/05 16:47:49 sys mainsystem compo1 INFO 12346 情報:更新しました。
・ com.fujitsu.uji.log.ext.ExtTimeComposer
区間時間の情報を出力するのに適したクラスです。出力例を以下に示します。
FSP INTS-APC
PFMAP
92002 server2
system1 2003/12/25 20:45:15:000 2003/12/25 20:45:15:013 13
・ com.fujitsu.uji.log.ext.ExtDataComposer
データBeanの情報を出力するのに適したクラスです、出力例を以下に示します。
FSP INTS-APC
JNLAtoW
91005 server1
user=(user01)password=(****)ok=(ログイン)
system1 200312250845530 123.123.45.67
43
ログメッセージファイルを用いたログ出力
フォーマット付きメッセージログ用のクラスExtMessageComposerによりログを出力する場合は、ログメッセージファイルに定義したメッセー
ジを出力できます。ログメッセージファイルはフォーマット付きメッセージログ専用のリソースファイルです。ファイル名のデフォルトは
logresource.xmlで、初期化パラメタuji.logresourceで変更することができます。初期化パラメタについては、“13.3 初期化パラメタ”を参
照してください。
ログメッセージファイルの記述
ログメッセージファイルは、アプリケーションで使用する文字列データをログ出力用にカスタマイズして、メッセージの一部に動的な情
報を埋め込んで定義するXMLファイルです。
以下にログメッセージファイルの記述例を示します。
《logresource.xml》
<?xml version="1.0" encoding="UTF-8"?>
<ujiResource>
<config>
<version>5.1</version>
</config>
<map id="12345">
<elem key="label.code">sys</elem>
<elem key="label.name">mainsystem</elem>
<elem key="label.subname">compo1</elem>
<elem key="errorType">ERROR</elem>
<elem key="level">1</elem>
<elem key="message">エラー:{0}-{1}</elem>
</map>
<map id="12346">
<elem key="label.code">sys</elem>
<elem key="label.name">mainsystem</elem>
<elem key="label.subname">compo1</elem>
<elem key="errorType">INFO</elem>
<elem key="level">5</elem>
<elem key="message">情報:{0}</elem>
</map>
</ujiResource>
ログメッセージファイルには、以下に示すApcoordinatorのリソースファイルのタグを指定します。
[ujiResource]
ログメッセージファイルのルートの要素です。
- アトリビュート
ujiResourceタグのアトリビュートは指定できません。
- 63 -
- コンテント
コンテントには以下をこの順番で記述します。
- configタグ(必ず1個記述します。)
- mapタグ(0個以上記述します。)
[config]
ログメッセージファイル全体に共通の設定を記述します。
- アトリビュート
configタグのアトリビュートは指定できません。
- コンテント
コンテントには以下を記述します。
- versionタグ(必ず1個記述します。)
[version]
ログメッセージファイルの文法バージョンを記述します。
- アトリビュート
versionタグのアトリビュートは指定できません。
- コンテント
コンテントには文法バージョンを記述します。指定可能なバージョンは 5.1 です。
[map]
ログメッセージの定義を記述します。
- アトリビュート
mapタグでは以下のアトリビュートを指定します。
アトリビュート名
id
省略
不可
意味
メッセージIDを指定します。
省略時の動作
省略できません。
- コンテント
コンテントには以下を記述します。
- elemタグ(0個以上記述します。)
[elem]
ログメッセージの情報を記述します。
- アトリビュート
elemタグでは以下のアトリビュートを指定します。
アトリビュート名
key
省略
不可
意味
各情報を表わすキーを指定しま
す。各メッセージに対して、以下の
キーをもつelemタグを指定してくだ
さい。
・ label.code
・ label.name
・ label.subname
・ errorType
・ level
・ message
- 64 -
省略時の動作
省略できません。
- コンテント
コンテントにはキーの値により以下の内容を記述します。
キー
省略
コンテントへ指定する値
省略時の動作
label.code
不可
英数字最大3桁の管理コード
省略できません。
label.name
不可
英数字最大12桁の識別名(業務名
など)
省略できません。
label.subname
不可
英数字最大9桁の識別名(モジュー
ル名など)
省略できません。
errorType
不可
以下のログの種別
省略できません。
・ HALT:停止
・ ERROR:エラー
・ WARNING:警告
・ INFO:情報
level
不可
出力するログのレベル
省略できません。
message
不可
メッセージ本体
java.text.MessageFormatで使用す
るフォーマットで記述
記述メッセージ本文内の{0}、{1}
などを、パラメタとして渡される補足
情報に置き換えて出力。{0}から
{9}まで利用可能
省略できません。
ログの出力のマスク
ExtDataComposerのマスク機能を利用して、通信ログで出力される項目の中で、ユーザのパスワードなど、ログに残すと問題がある項
目を隠すことができます。マスクされた項目はアスタリスク4文字(****)で表示されます。
journalタグで、ExtDataComposerの出力対象にしない項目をマスクします。maskDataタグで、マスク対象の項目名を列挙します。
項目名“password”をマスクする場合の定義例を以下に示します。
<logComposer name="journal">
<output name="jnlStdOut" type="stdout"/>
<journal>
<maskData>password</maskData>
</journal>
</logComposer>
出力例を以下に示します。
FSP INTS-APC
ン)
FSP INTS-APC
JNLAtoW
91005 server1
system1 200312250845530 123.123.45.67
43 user=(user01)password=(****)ok=(ログイ
JNLAtoW
91005 server1
system1 200312250846006 123.123.45.67
17 logoff=(ログオフ)
5.6 高信頼性ログ
高信頼性ログ機能は、ログをデータベースに格納する機能です。ここでは、高信頼性ログの機能と運用パターンについて説明します。
機能
高信頼性ログ機能には、以下の特長があります。
・ エンドレスなファイル管理
・ ユーザログのトランザクションの一貫性の保証
- 65 -
・ データベースと同等の堅牢な書込み保証
・ ユーザログの書込み順番の保証
エンドレスなファイル管理
サイクリックな格納構造によって、エンドレスにファイル管理ができます。この格納構造には、以下の特長があります。
- 高速挿入、循環使用に特化した格納構造
- 容量満杯や障害発生の場合はエントリを自動切替え
- エントリごとにI/O分散・危険分散が可能
ユーザログのトランザクションの一貫性の保証
高信頼性ログ機能は、以下の機能によって、トランザクションに一貫性のあるログ取得を実現します。
- ユーザログの取得
ユーザログは、ロールバックした場合を含めてすべて取得します。これによってすべての業務処理結果の分析が可能になりま
す。
- ユーザログの書込み確定
ユーザログは、トランザクションのコミット、ロールバックなどのトランザクション終了時、またはSyncメソッドの使用によって書込み
が確定します。
- トランザクション結果の自動出力
トランザクション結果を示す制御ログを自動出力します。これによってトランザクション結果の分析が可能になります。
なお、システム構成(接続方法)によって、業務処理の結果情報を示すユーザログの取得方法には、以下の違いがあります。
ユーザログの取得
パターン1
トランザクション結果の自動出力
○
○
コミットまたはロールバックが完了したタ
イミング
○
○
○
Syncメソッドなどを利用してログを確定し
たタイミング
×
パターン2
パターン3
ユーザログの書込み確定
上記のパターン1~3は、“運用操作のパターン”で説明しているパターン1~3を示しています。
- 66 -
[業務データベース処理があるデータベースサーバでのユーザログ取得]
データベースサーバでのユーザログの取得は、パターン1およびパターン2の形態です。
パターン1では、業務データベースのトランザクション処理結果に連動して、トランザクションの結果ログをシステムが自動的に出力
します。
パターン2では、情報レコードログの自動出力は行いません。
なお、ユーザログは業務トランザクションの結果に関わらず出力は保証されます。
パターン2の場合、XA制御を利用して、業務結果ログの自動取得やログの自動保証を行います。なお、本バージョンでは、業務
データベースがOracleの場合、XA制御を利用した整合性保証機能はサポートしていません。
[業務データベース処理がないアプリケーションサーバでのユーザログ取得]
業務データベースがない場合は、本製品に含まれている高信頼性ログServer機能を利用してログを取得することができます。
高信頼性ログServer機能でのユーザログの取得は、パターン3の形態です。
この形態では、アプリケーションのログをユーザログとして採取していくもので、ログ確定によって採取したユーザログを保証してい
くものです。
- 67 -
データベースと同等の堅牢な書き込み保証
高信頼性ログの書込みは、データベース更新で培われた高い信頼性をベースとした技術で実装されています。
以下の場合も、トランザクションの完了またはログの書込み確定が行われたユーザログの書込みは保証されます。
- システムダウン、コネクション切断時は、テンポラリログより自動リカバリ
- メディア障害時は、アーカイブログよりrdbrcvコマンドによってリカバリ
ユーザログの書込み順番の保証
ユーザログテーブルの論理定義で格納順番号を指定することによって、格納順番号をユーザログレコードに自動付加します。これ
をもとにソート処理を行うことで、書込み順にログを参照することが可能となります。ソート処理はユーザが行ってください。
運用操作のパターン
高信頼性ログ機能の運用には、システム構成によって、以下の3つのパターンが考えられます。
・ パターン1:業務データベースがSymfoware Serverのデータベースサーバでのユーザログの取得
・ パターン2:業務データベースが他社データベースのデータベースサーバでのユーザログの取得(Oracleのデータベースサーバな
ど)
・ パターン3:業務データベース処理がないアプリケーションサーバでのユーザログの取得(HUBサーバ(注)など)
注) HUBサーバとは、業務システムの統合や拡張性・柔軟性・高可用性を実現するために、送信送受信業務代行、複数HUB
連携、各種フォーマット変換などを行うためのサーバです。本章ではデータベースを配置しないサーバで、ユーザログの取得
要件が高い代表的なサーバという位置付けで例として記述しています。
以下に、それぞれの運用パターンのシステム構成図を示します。
[パターン1:業務データベースがSymfoware Serverのデータベースサーバでのユーザログ取得]
- 68 -
業務データベースがSymfoware Serverの場合は、Symfoware Serverの機能を利用して信頼性の高い高信頼性ログ機能の運用を行う
ことができます。
[パターン2:業務データベースが他社データベースのデータベースサーバでのユーザログ取得]
なお、本バージョンでは、業務データベースがOracleの場合、XA制御を利用した整合性保証機能はサポートしていません。
[パターン3:業務データベース処理がないHUBサーバなどでのユーザログ取得]
- 69 -
5.6.1 ログ定義ファイルを用いたログ出力
高信頼性ログは、データベースを利用して、出力するログをユーザログテーブルに格納します。ログ定義ファイルを利用して、出力先
のユーザログテーブルを設定できます。
管理名を使用してログ定義ファイルにログを出力する先(スキーマ名、表名)の定義を記述し、アプリケーションのAPIでは定義した管
理名を利用することで、ログ定義ファイルで指定したユーザログテーブルへログを出力します。
ログ定義ファイルの記述
ログ定義ファイルは、汎用ログと同じログ定義ファイルに定義します。ログ定義ファイルへは、ユーザログテーブルのスキーマ名、表名
を指定します。ログ定義ファイルの記述例を以下に示します。高信頼性ログを利用する場合、ログ定義ファイルのversionタグには 7.1
を指定してください。
《logConf.xml》
<?xml version="1.0" encoding="UTF-8"?>
<logConfig>
<config>
<version>7.1</version>
</config>
<logComposer name="Log1">
....
</logComposer>
<ulog name="ULog1" class="my.sample.MyULogComposer">
<param name="schema" value="MYSCHEMA"/>
<!-- スキーマ名 -->
<param name="table" value="ULOG01"/>
<!-- 表名 -->
</ulog>
<ulog name="ULog2" class="my.sample.MyULogComposer2">
<param name="schema" value="MYSCHEMA"/>
<!-- スキーマ名 -->
<param name="table" value="ULOG02"/>
<!-- 表名 -->
</ulog>
</logConfig>
・ ulogタグ
高信頼性ログを定義します。
name属性には、APIで指定する管理名を指定します。
- 70 -
class属性には、高信頼性ログで利用するクラス名を指定します。ULogComposer、または、ULogComposerの派生クラスを指定す
ることができます。なお、class属性はJavaのクラス名を指定します。
注意
ulogタグに、同名の管理名が複数、定義された場合には、最後に定義されたものが有効になります。
・ スキーマ名
paramタグを用いて、高信頼性ログを出力するユーザログテーブルのスキーマ名を指定します。
name属性には、"schema"を指定します。
value属性には、高信頼性ログを格納するユーザログテーブルのスキーマ名を指定します。
・ 表名
paramタグを用いて、高信頼性ログを出力するユーザログテーブルの表名を指定します。
name属性には、"table"を指定します。
value属性には、高信頼性ログを格納するユーザログテーブルの表名を指定します。
ログ定義ファイルの詳細は“定義ファイルリファレンス”を参照してください。
5.6.2 ビジネスクラスでの利用
ログ出力の基本操作
高信頼性ログを出力するためには、ULogComposerオブジェクトを使用します。これはULogFactoryクラスを用いて参照します。
ポイント
・ ULogComposerを使用してログ書き込みを行った場合、printlnメソッドで指定したログ(ユーザログレコード)以外に、トランザクショ
ン情報レコードが書き込まれます。トランザクション情報レコードは、そのトランザクションでユーザログレコードの出力を行ったあと
に、トランザクションが完了した場合に出力されます。
トランザクションは、コミットまたはロールバックといった完了操作が行われた場合、または、コネクションが切断された場合に完了し
ます。トランザクションの完了操作により、業務データベースの操作をトランザクション情報レコードに記録することが可能です。業
務データベースと同じコネクションを用いた場合は、業務データベースのトランザクションに連動した情報が出力できます。
なお、トランザクションの完了をせずにコネクションが切断された場合には暗黙のロールバックが発行されたものと見なしロールバッ
ク完了のトランザクション情報レコードが出力されます。
トランザクション情報レコードの構造やその具体的な利用方法については、以下のマニュアルを参照してください。
- Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”の“ユーザログテーブルの運用”
- Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“運用ガイド(高信頼性ログ編)”の“ユーザログテーブルの運用”
・ ユーザログレコードは以下のいずれかのタイミングで確定されます。
- ULogComposerオブジェクトのsyncメソッドまたはcloseメソッドが呼び出されたとき。
- ULogComposerオブジェクトの取得に使用したConnectionオブジェクトのcommitメソッド、rollbackメソッドまたはcloseメソッドが
呼び出されたとき。
- トランザクションが完了せずにコネクションが切断されたとき。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8"?>
<logConfig>
<config> <version>7.1</version> </config>
<ulog name="ULog1" class="my.sample.MyULogComposer">
<param name="schema" value="MYSCHEMA"/>
<!-- スキーマ名 -->
<param name="table" value="ULOG01"/>
<!-- 表名 -->
- 71 -
</ulog>
</logConfig>
《ビジネスクラスの記述例》
import
import
import
import
import
import
import
import
import
java.sql.Connection;
java.util.Hashtable;
javax.naming.Context;
javax.naming.InitialContext;
javax.sql.DataSource;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.GenericHandler;
com.fujitsu.uji.ulog.ULogComposer;
com.fujitsu.uji.ulog.ULogFactory;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
// 任意のコネクションで出力します。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
env.put(Context.PROVIDER_URL, "SYM:// ・・・ ");
InitialContext ctx = null;
DataSource ds = null;
Connection connection = null;
try {
// 高信頼性ログを出力するコネクションを取得します。
ctx = new InitialContext(env);
ds = (DataSource)ctx.lookup("jdbc/ ・・・ ");
connection = ds.getConnection();
// 高信頼性ログ出力クラスを取得します。
// getULogComposerの第2引数にはログの管理名を指定します。
// 管理名はログ定義ファイルのulogタグのname属性で指定した名前です。
ULogComposer myLogger = ULogFactory.getULogComposer(context, "ULog1", connection);
if(myLogger != null){
// 指定のコネクションを利用してデータベースへ出力します
myLogger.println(null, null, "someMethod start");
}
else{
// 高信頼性ログ出力クラスのオブジェクトがnullのため、
// ログの出力ができません
・・・
}
// 高信頼性ログの出力を終了する場合に、クローズをします
myLogger.close();
// コネクションをクローズします。
connection.close()
} catch(Exception exp) {
// 例外の処理を行います。
・・・
}
}
}
ポイント
コネクションは、業務処理で用いるデータベースのコネクションと同じものを用いることも可能です。
- 72 -
5.6.3 ユーザ定義のログ出力クラスの作成
ULogComposer派生クラスを作成することで、ログ本文の編集を行う処理を記述することが可能です。
派生クラスでは、ログ本文の編集を行ったあとに、ULogComposerクラスのprintlnメソッドを呼び出し、ログ出力を行います。
派生クラスの作成
ログ本文の編集を行うようprintlnメソッドをオーバーライドし、ログを出力するULogComposer派生クラスの作成例を以下に示します。
/**
* ログ本文の編集を行う派生クラスの作成例です。
* この例では、基底クラスに ULogComposerを用いています。
*/
package my.sample;
import com.fujitsu.uji.ulog.ULogComposer;
import com.fujitsu.uji.ulog.ULogException;
public class MyULogComposer extends ULogComposer {
public MyULogComposer() {
}
public void println(Object[] div, Object[] exp, Object msg) throws ULogException {
// ログ本文の編集を行います。
StringBuffer buf = new StringBuffer();
buf.append(" PREFIX TEXT ");
buf.append( String.valueOf(msg) );
// 編集後に、基底クラスのメソッドを呼び出します。
super.println(div, exp, buf.toString());
}
}
ユーザ独自のメソッドを定義し、ログ本文の編集を行ってprintlnメソッドを呼び出し、ログを出力するULogComposer派生クラスの作成
例を以下に示します。
/**
* ログ本文の編集を行う派生クラスの作成例です。
* この例では、基底クラスに ULogComposerを用いています。
*/
package my.sample;
import com.fujitsu.uji.ulog.ULogComposer;
import com.fujitsu.uji.ulog.ULogException;
public class MyULogComposer2 extends ULogComposer {
public MyULogComposer2() {
}
public void myPrintln(Object[] div, Object[] exp, Object msg1, Object msg2) throws ULogException {
// ログ本文の編集を行います。
StringBuffer buf = new StringBuffer();
buf.append( String.valueOf(msg1) );
buf.append( "," );
buf.append( String.valueOf(msg2) );
// 編集後に、基底クラスのメソッドを呼び出します。
println(div, exp, buf.toString());
}
}
注意
ULogComposer派生クラスを作成する場合は、デフォルトコンストラクタを定義してください。
作成した派生クラスをログ定義ファイルに指定する定義例を以下に示します。
- 73 -
<logConfig>
....
<!-- 作成した派生クラスを指定 -->
<ulog name="ULog1" class="my.sample.MyULogComposer">
<param name="schema" value="MYSCHEMA"/>
<param name="table" value="ULOG01"/>
</ulog>
<ulog name="ULog2" class="my.sample.MyULogComposer2">
<param name="schema" value="MYSCHEMA"/>
<param name="table" value="ULOG02"/>
</ulog>
....
</logConfig>
5.6.4 システム構成によるコネクションの利用
高信頼性ログは、データベースにログを書き込むことで堅牢な書き込み保証を実現します。アプリケーションで利用するトランザクショ
ンの終了タイミングでの保証、またはログ確定のタイミングで書き込みを保証します。
また、トランザクション結果を示す制御ログを自動出力します。これによってトランザクション結果の分析が可能になります。
高信頼性ログの利用には、システム構成によって、APIへ指定するコネクションが異なります。ここでは、システム構成によるコネクショ
ンの利用について説明します。
業務データベースがSymfoware Serverのデータベースサーバでの高信頼性ログ取得
業務データベースと同じコネクションを用いて、高信頼性ログの出力を行います。業務データベースと同じコネクションを用いることで、
業務データベースのトランザクションに連動したログの情報を出力できます。
業務データベースが他社データベースのデータベースサーバでの高信頼性ログ取
業務データベースと異なるコネクションを用いて、高信頼性ログの出力を行います。業務データベースのトランザクションに連動した出
力はできません。
- 74 -
業務用データベース処理がないアプリケーションサーバでの高信頼性ログ取得
高信頼性ログを出力するコネクションを生成してログを出力します。
5.6.5 ユーザログテーブルの定義
ユーザログテーブルの定義の詳細は、以下のマニュアルを参照してください。
・ Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”の“ユーザログテーブルの作成”
・ Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“運用ガイド(高信頼性ログ編)”の“ユーザログテーブルの作成”
ユーザログテーブルの構造
高信頼性ログを出力するユーザログテーブルは以下の構造です。
項目名
型
長さ
説明
LOG_TYPE
CHAR
1
SEQUENCE_NO
CHAR
TRANSACTION_ID
データ設定
APIから出力するログはつねに“U”
Symfoware/RDBが自動設定
30
格納順番号を格納
Symfoware/RDBが自動設定
CHAR
20
トランザクション識別子を格納
Symfoware/RDBが自動設定
SYSTEM_NAME
CHAR
8
定義されたRDBシステム名を格納
Symfoware/RDBが自動設定
CONTEXT_ID
VARCHAR
Apcoordinatorが生成するコンテキスト
ID
Apcoordinatorによって設定
1024
- 75 -
項目名
型
長さ
説明
データ設定
分割キー(注)
任意
任意
ログの格納先をDSI単位に振り分けた
い場合に、出力するDSI名を格納
ユーザアプリケーションによって
設定
任意列(注)
任意
任意
データベースを使用してログを分析す
るための任意の情報を格納
ユーザアプリケーションによって
設定
ユーザログ本文
BLOB/
VARCHAR
不定
ログ本文
ユーザまたはApcoordinatorに
よって設定
注) 分割キー、および任意列の指定は任意です。分割キー、および任意列については、以下のマニュアルを参照してください。
・ Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”の“表定義”
・ Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“運用ガイド(高信頼性ログ編)”の“表定義”
ユーザログ本文は、BLOB:1キロバイト~10メガバイト、VARCHAR:1バイト~32キロバイトの範囲です。
ユーザログテーブルのレコード形式
ユーザログテーブルの生成は、以下のレコード形式で指定します。
CREATE TABLE スキーマ名.表名 (LOG_TYPE
SEQUENCE_NO
TRANSACTION_ID
SYSTEM_NAME
CONTEXT_ID
分割キー
任意列1
任意列2
ユーザログ本文
)
CHAR(1)
DEFAULT LOG_TYPE,
CHAR(30) DEFAULT ULOG_SEQUENCE,
CHAR(20) DEFAULT TRANSACTION_ID,
CHAR(8)
DEFAULT SYSTEM_NAME,
VARCHAR(1024),
CHAR(10) NOT NULL,
DECIMAL(4,0),
VARCHAR(5),
BLOB または VARCHAR
ユーザログテーブルの作成
高信頼性ログを格納するユーザログテーブルは、論理構造、格納構造、物理構造から構成します。
ユーザログテーブルの作成には、rdbddlexコマンドを使用します。
定義の詳細については、以下のマニュアルを参照してください。
・ Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”
・ Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“運用ガイド(高信頼性ログ編)”
論理構造の作成
論理構造を作成する場合の定義例を以下に示します。
定義する列は、高信頼性ログへ格納する情報に応じ定義してください。ユーザログ本文を除き、以下のとおり、指定する必要があり
ます。
CREATE TABLE スキーマ名.表名 (LOG_TYPE
SEQUENCE_NO
TRANSACTION_ID
SYSTEM_NAME
CONTEXT_ID
分割キー
任意列1
任意列2
ユーザログ本文
)
CHAR(1)
DEFAULT
CHAR(30)
DEFAULT
CHAR(20)
DEFAULT
CHAR(8)
DEFAULT
VARCHAR(1024),
CHAR(10) NOT NULL,
DECIMAL(4,0),
VARCHAR(5),
VARCHAR(512)
- 76 -
LOG_TYPE,
ULOG_SEQUENCE,
TRANSACTION_ID,
SYSTEM_NAME,
LOG_TYPE、SEQUENCE_NO、TRANSACTION_ID、SYSTEM_NAME、CONTEXT_IDは、固定です。以下に利用者が決め、
指定する必要のある項目を示します。
- スキーマ名.表名
作成する論理構造のスキーマ名と表名を指定します。
- 分割キー(任意)
DSI分割を行う場合のキー値を格納する列の、列名と列のデータ型、長さを指定します。
- 任意列(任意)
利用者が検索などの任意の目的で使用する列の、列名と列のデータ型、長さを指定します。
- ユーザログ本文
ログ本文の型、長さを指定します。
格納構造の作成
以下は、格納構造を作成する場合の定義例です。格納構造の定義では、DSOとDSIをそれぞれ定義します。DSOとDSIの詳細は
Symfoware Serverのマニュアルを参照してください。
CREATE DSO MY_DSO FROM ULOG.業務ログ表 TYPE CYCLIC(PAGESIZE(32),CYCLIC_MODE(0));
CREATE DSI MY_DSI DSO MY_DSO ALLOCATE DATA ON (DBSP1,DBSP2,DBSP3,DBSP4) ENTRYSIZE 10M;
DSOの定義
DSOとは、表(実表)に対してその格納構造を表現するものです。DSO定義では、DSO名、スキーマ名.表名を指定します。
CREATE DSO DSO名 FROM スキーマ名.表名 TYPE CYCLIC(PAGESIZE(32),CYCLIC_MODE(0));
- DSO名
任意のDSO名を指定します。
- スキーマ名.表名
論理構造で指定するスキーマ名、表名を指定します。
DSIの定義
DSIでは、DSOで表現する情報に加えてデータベーススペースとの対応関係も表現します。DSI定義では、DSI名、DSO名、デー
タベーススペース、エントリの容量を指定します。
CREATE DSI DSI名 DSO DSO名 ALLOCATE DATA ON (データベーススペース) ENTRYSIZE 10M;
- DSI名
任意のDSI名を指定します。
- DSO名
DSOの定義で指定するDSO名を指定します。
- データベーススペース
エントリを作成するデータベーススペースを指定します。
- 1つのデータベーススペースに複数のエントリを作成
データベーススペース“DBSP1”に、3つのエントリを作成する場合の例です。
CREATE DSI MY_DSI DSO MY_DSO ALLOCATE DATA ON (DBSP1,DBSP1,DBSP1) ENTRYSIZE 10M;
- 複数のデータベーススペースに複数のエントリを作成
データベーススペース“DBSP1”に2つのエントリ、“DBSP2”に2つのエントリを作成する場合の例です。
CREATE DSI MY_DSI DSO MY_DSO ALLOCATE DATA ON (DBSP1,DBSP1,DBSP2,DBSP2) ENTRYSIZE 10M;
- エントリの容量
データベーススペースに作成するエントリの容量を指定します。10メガバイトのエントリを3つ作成する例を以下に示します。
CREATE DSI MY_DSI DSO MY_DSO ALLOCATE DATA ON (DBSP1,DBSP1,DBSP1) ENTRYSIZE 10M;
- 77 -
物理構造の作成
ユーザログテーブルを格納する物理構造を指定します。以下は、データベーススペースをローデバイスへ作成する例です。
- Solarisの場合
データベーススペース“DBSP1”をローデバイス“/dev/rdsk/c1t0d1s1”へ作成する例です。
CREATE DBSPACE DBSP1 ALLOCATE RAWDEVICE /dev/rdsk/c1t0d1s1;
- Linuxの場合
データベーススペース“DBSP1”をローデバイス“/dev/raw/raw10”へ作成する例です。
CREATE DBSPACE DBSP1 ALLOCATE RAWDEVICE /dev/raw/raw10;
- Windowsの場合
データベーススペース“DBSP1”をローデバイス“¥¥.¥RDB_DBS1”へ作成する例です。
CREATE DBSPACE DBSP1 ALLOCATE RAWDEVICE ¥¥.¥RDB_DBS1;
ユーザログの退避
ユーザログテーブルに格納されたデータは、ユーザログ取得機能を使用して一般ファイルに退避できます。
ユーザログの退避の詳細は、以下のマニュアルを参照してください。
・ Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”の“ユーザログテーブルからユーザログのエクスポート”
・ Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“運用ガイド(高信頼性ログ編)”の“ユーザログテーブルからユーザログのエクスポート”
5.6.6 データベースリソース定義
データベースリソース定義
データベースリソースはJNDIと組み合わせて使用することにより、アプリケーションの自由度を高めています。
SymfowareのJDBCドライバでは、データベースリソースのためのネーミングサービスとJNDIサービスプロバイダ、およびデータベース
リソース登録ツールを提供しています。
ネーミングサービスはデータベースリソースを登録および管理します。
ネーミングサービスを起動し、データベースリソース登録ツールを使用して、データベースリソースをネーミングサービスに登録しま
す。
JDBCアプリケーションでは、ネーミングサービスに登録されたデータベースリソースを、JNDIを使用して取得し、利用します。
詳細は以下のマニュアルを参照してください。
・ Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”の“SymfowareのJDBC環境の設定”
・ Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“セットアップガイド”の“SymfowareのJDBC環境の設定”
IJServerの定義
IJServerの環境設定でJDBCの環境設定を行う必要があります。IJServerの環境設定は、Interstage管理コンソールで行います。
詳細は以下のマニュアルを参照してください。
・ Interstage Business Application Server Standard Editionの場合
“高信頼性ログ運用ガイド”の“SymfowareのJDBC環境の設定”
・ Interstage Business Application Server Enterprise Editionの場合
基幹システム向けフレームワークの“セットアップガイド”の“SymfowareのJDBC環境の設定”
- 78 -
第6章 XMLデータの利用
6.1 XML連携機能の概要
XML連携機能により、データ形式としてXMLを使用するアプリケーションの作成が容易になります。XML連携機能では、XMLデータ
をデータBeanとして扱います。これをXMLデータBeanと呼びます。これを使って、画面部品タグやコンポーネントタグでXML内のデー
タを表示したり、入力されたデータでXMLを更新したりすることが可能です。また、XPathで指定したXML内データの参照、更新、追
加および削除が可能です。
実行時に使用するXMLプロセッサについては、“13.2 実行時に必要なソフトウェア”を参照してください。
上の図に沿ってXML連携機能の概要を説明します。
(1) XMLデータの読み込みと保存
ファイルやInputStreamからのXMLの読み込みと、ファイルやOutputStreamへの保存が可能です。
(2) XMLデータの操作
XMLデータBeanのメソッドを使ってXML内のデータの参照、更新、追加および削除が可能です。XML内のどのデータにアクセスするかは
XPathを使って指定します。
(3) タグを使った表示と入力
画面部品タグやコンポーネントタグでは、XMLデータBeanを使用してXMLデータを表示したり、入力データでXMLを更新したりする
ことが可能です。XML内のどのデータをタグで使用するかは、XPathを使って指定します。
この章では、上記1,2について説明します。3については、“16.5 タグによるXMLデータの利用”を参照してください
6.2 XMLデータBean
XMLデータBeanはXMLデータを扱うためのデータBeanです。XMLデータBeanのクラスとしてcom.fujitsu.uji.xml.XmlDataBeanクラス
を使います。XMLデータBean内部では、XMLデータをオブジェクトのツリー(木)として保持しています。このツリーをXMLツリーと呼び
ます。XMLツリーの各ノードはXMLの要素に対応し、XMLツリーのルートはXMLのルート要素に対応します。
- 79 -
XMLデータBeanが保持するXMLツリーのルートに対応する要素を、XMLデータBeanのルート要素と呼びます。上の図では、catalog
要素がXMLデータBeanのルート要素です。
XMLデータBeanの作成
XmlDataBeanクラスのコンストラクタによって空のXMLデータを持つXMLデータBeanが作成されます。これにXMLデータを与えるに
は、ファイルなどからXMLデータを読み込みます。
XMLデータの読み込みと保存
XMLデータを読み込むには、XmlDataBeanクラスのloadFromメソッドを使用します。読み込み元の指定には、ファイル、InputStream、
URI、org.xml.sax.InputSourceのいずれかを指定します。
XMLデータBean内のXMLデータを保存するにはXmlDataBeanのsaveToメソッドを使用します。保存先としてファイルやOutputStream
を指定できます。文字符号化方式の指定も可能です。
public void startup(DispatchContext context) {
try {
// ロードするファイルを表すFileオブジェクトを作成
ServletContext sc = ((HttpDispatchContext)context).getServletContext();
String root = sc.getRealPath("/");
File file = new File(root, "/WEB-INF/user.xml");
// XMLデータBeanを作成
XmlDataBean xmlBean = new XmlDataBean();
// XMLデータを読み込み
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
xmlBean.loadFrom(in);
// XMLデータを保存
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
xmlBean.saveTo(out,"Shift_JIS");
context.setResponseBean("body",xmlBean);
} catch (Exception e) {
e.printStackTrace();
}
}
保存時に文書型宣言を指定するには、setDoctypeメソッドを使用してください。また、改行コードの種類、空白記号の追加、省略された
属性の追加の有無を指定するにはsetWriteOptionメソッドを使用してください。
XMLデータの操作
XMLデータBeanのメソッドを使ってデータの参照、更新、追加および削除が可能です。
XMLデータを操作する際は操作対象となるデータをXPathで指定します。XPathは、XMLデータ内のある要素を基点とし目的の要素
までの経路を記述することによってデータを指定する方法です。
ポイント
XPathの記述例は“6.3 XPathの概略”を参照してください。
XMLデータの参照には、文字列として参照する方法と、XMLデータBeanとして参照する方法があります。
・ 文字列として参照
getTextメソッドを使います。 XPathは、XMLデータBeanのルート要素からの相対パスで指定します。
String text = xmlBean.getText("item/name");
- 80 -
・ XMLデータの一部をXMLデータBeanとして参照
getSubBeanメソッドを使います。得られるXMLデータBeanは、XPathで指定した要素から始まるサブツリーを持ちます。
XmlDataBean subBean = xmlBean.getSubBean("item");
getSubBeanで取得したXMLデータBeanは、元のXMLツリーをコピーせずに共有します。したがって、getSubBeanで得られたXML
データBean内のデータを更新すると、元のXMLデータBeanも更新されます。
XPathで指定されるデータには、単純要素、複合要素、混合要素、属性、それらのデータの集合があります。XPathで指定したデータ
の種類とgetText、getSubBeanの返値の関係は以下のようになります。
単純要素
複合要素
混合要素
属性
集合
getText
要素の内容
null
null
属性値
先頭の要素または属性のみを参照
して左記の条件に従う
getSubBean
null
その要素をルート要素とする
XMLデータBean
null
null
先頭の要素のみを参照して左記の
条件に従う
(上記表の「null」は、メソッドがnullを返すことを意味します。)
ポイント
XMLデータ中の要素は、その内容として子要素やテキストを持つかどうかによって、単純要素、複合要素、混合要素に分類されます。
・ 単純要素: 子要素を持ちません。テキストは持つことができます。
・ 複合要素: 複数の子要素を持ちます。空白、改行以外のテキストは持つことができません。
・ 混合要素: 複数の子要素と、テキストを持ちます。
以下のXMLデータで、titleは単純要素、headerは複合要素、bodyは混合要素です。
<doc>
<header>
<title>XML連携機能マニュアル</title>
<author>富士通太郎</author>
</header>
<body>
本マニュアルでは、
<bold>Apcoordinator</bold>
の
<bold>XML連携機能</bold>
について解説します。
</body>
</doc>
単純要素の内容を指定した文字列で更新するには、setTextメソッドを使います。
xmlBean.setText("item/name", "白ワイン");
- 81 -
XPathで属性を指定した場合は、属性値が更新されます。集合の場合はその先頭のデータが更新の対象になります。複合要素、混合
要素には使用できません。
XPathで指定された要素が存在しない場合、指定された要素がXMLに追加されます。ただしXPathが以下の条件のいずれかを満たす
場合に限ります。
1. 述語(“[式]”の形式)を使用していない(例: item/name)
2. 述語を使用している場合、それが“[整数]”か“[position()=整数]”のいずれかの形式である。
(例: item[3]/note[position()=5])
上記2の場合、既存の要素の数が述語で指定した整数に満たない場合、不足分が追加されます。例えば、item要素が1個しかないXML
に対し、setText("item[4]","foo") を実行すると、item要素が3個追加されて合計4個になり、その4番目のitem要素の内容が"foo"になり
ます。
子要素(単純要素)を追加するには、appendメソッドを使います。
xmlBean.append("item", "name", "白ワイン");
item要素の子要素としてname要素が末尾に追加されます。name要素の内容は“白ワイン”となります。
子要素(単純要素)を挿入するには、insertメソッドを使います。
xmlBean.insert("item", "author", "title", "XML連携機能マニュアル");
item要素の子要素としてtitle要素がauthor要素の直前に挿入されます。title要素の内容は“XML連携機能マニュアル”となります。
要素を削除するには、removeメソッドを使います。
xmlBean.remove("item/name");
XPathで指定した要素が削除されます。
XMLデータBeanを複製するには、cloneメソッドを使用します。複製されたXMLデータBeanに対する更新処理は、複製元のデータに
は反映されません。
6.3 XPathの概略
XPathは、XMLデータ内の特定の要素や属性を指定するための記述方法です。XMLデータのある要素を起点として目的の要素また
は属性に到達するまでの経路を記述することによって、XML内のデータを指定します。例えば、以下のXMLデータのname要素は"/
book/publisher/name"というXPathで指定されます。
<?xml version="1.0" encoding="Shift_JIS" ?>
<book>
<title>Apcoordinator入門</title>
<date>2001/4/1</date>
<publisher lang="ja">
<name>富士通タッチコミュニケーションズ</name>
<address>
<zip>222-0033</zip>
<prefecture>神奈川県</prefecture>
<city>横浜市</city>
</address>
<phone>000-111-2222</phone>
<phone>000-333-4444</phone>
<phone type="tollfree">0120-2222**</phone>
<fax type="g4">000-555-6666</fax>
</publisher>
</book>
XPathの記述には絶対パスと相対パスがあります。絶対パスはXMLデータのルート要素を起点にします。前述の例は絶対パスです。
相対パスは、あらかじめ定めた要素を起点として、目的の要素を指定します。上記のXMLでpublisher要素を起点とした相対パスの例
をいくつか示します。
- 82 -
指定されるデータ
XPath
address
publisherの子要素のaddress要素
address/zip
publisherの子要素のaddressのさらに子要素のzip要素
phone[2]
publisherの子要素のphone要素のうち2番目の要素(先頭の要素を「1番目」と数える)
phone[@type="tollfree"]
publisherの子要素のphone要素のうち、type属性の値が"tollfree"である要素
.
publisher要素自身
@lang
publisherのlang属性
fax/@type
publisherの子要素のfax要素の属性type
6.4 名前空間について
XMLデータでは、URI参照によって特定される名前空間情報で、要素名や属性名を修飾することが可能です。
あらかじめ名前空間を利用してXMLデータを設計することで、XMLデータが流通した場合の同一要素名による値の衝突を防ぐことが
可能です。
<?xml version="1.0" encoding="Shift_JIS" ?>
<book xmlns:fj="urn:fj-touch-communications">
<title>Apcoordinator入門</title>
<date>2001/4/1</date>
<fj:publisher lang="ja">
<fj:name>富士通タッチコミュニケーションズ</fj:name>
<fj:address>
<zip>222-0033</zip>
<prefecture>神奈川県</prefecture>
<city>横浜市</city>
</fj:address>
<fj:phone>000-111-2222</fj:phone>
<fj:phone>000-333-4444</fj:phone>
<fj:phone type="tollfree">0120-2222**</fj:phone>
<fj:fax type="g4">000-555-6666</fj:fax>
</fj:publisher>
</book>
名前空間付きXMLデータをXMLデータBeanで操作する方法は次のとおりです。
・ 名前空間情報の登録
XMLデータBeanで名前空間付きXMLデータを操作するためには、あらかじめ名前空間情報を登録する必要があります。
下記の例では、"fj"という名前空間接頭辞に、"urn:fj-touch-communications"という名前空間URIを登録しています。
名前空間の登録に関するAPIの詳細は“APIリファレンス”を参照してください。
XmlDataBean xmlBean = new XmlDataBean();
...
xmlBean.addNamespaceDeclaration("fj","urn:fj-touch-communications");
・ 値の参照
参照したい値をXPathで指定してください。このとき名前空間接頭辞も指定する必要があります。
String text = xmlBean.getText("fj:publisher/fj:name");
ポイント
XMLデータBeanのルート要素から上位の要素で宣言されている名前空間宣言は、XMLデータBeanが自動的に検索します。
- 83 -
名前空間宣言の自動検索は、次のメソッドに対して有効です。
- getText(String xpath)
- getElement(String xpath)
- getNodeSet(String xpath)
- getSubBean(String xpath)
注意
XMLデータBeanに名前空間情報が登録されている場合は、登録された情報からのみ名前空間接頭辞を解決し、名前空間宣言
の自動検索は行いません。
名前空間宣言の自動検索を行う場合は、XMLデータBeanに名前空間情報を登録しないでください。
・ 値の更新
XPathで指定された値を更新することができます。XPathの指定には、登録済みの名前空間接頭辞を使用してください。
xmlBean.addNamespaceDeclaration("fj","urn:fj-touch-communications")
xmlBean.setText("fj:publisher/fj:address/city","川崎市");
・ 名前空間宣言の追加
XMLデータBeanのルート要素に登録されている名前空間情報を、名前空間宣言として追加することができます。
詳細は“APIリファレンス”を参照してください。
元のXMLデータ
<?xml version="1.0" encoding="Shift_JIS" ?>
<book>
<title>Apcoordinator入門</title>
</book>
名前空間宣言の追加
xmlBean.addNamespaceDeclaration("fj","urn:fj-touch-communications")
xmlBean.addNamespacesToNode()
名前空間宣言追加後のXMLデータ
<?xml version="1.0" encoding="Shift_JIS" ?>
<book xmlns:fj="urn:fj-touch-communications">
<title>Apcoordinator入門</title>
</book>
- 84 -
第7章 リモート共通インタフェース
この章では、Apcoordinatorアプリケーションからリモート共通インタフェースを利用してEJBを呼ぶ方法について説明します。
リモート共通インタフェースとはApcoordinatorで作成したEJBセションBeanを呼び出すためのAPIです。
上記以外の一般的なEJBの呼び出し方法は“8.2 一般的なEJBの呼び出し”を参照してください。
なお、EJBを呼び出すApcoordinatorアプリケーションを運用する際は、ご使用になるアプリケーションサーバの説明書に従って、アプリ
ケーションの実行環境でEJBを呼び出すのに必要な設定を行ってください。
7.1 概要
リモート共通インタフェースの概要を次に示します。
リモート共通インタフェースは以下の手順で使用します。
1. 呼び出すセションBeanに名前を付ける。
2. リモートマップを作成し、名前と呼び出されるセションBeanとの対応を記述する。
3. 名前を指定してCallFactoryインタフェースからCallインタフェースを取得する。
4. Callインタフェースを使い、データBeanとコマンド名を引数としてセションBeanを呼び出す。
ビジネスクラスからリモート共通インタフェースを使ってセションBeanを呼び出す例を示します。
public Object doSomething(DispatchContext context, DataBean dataBean){
CallFactory factory = context.getCallFactory();
Call call = factory.createCall("MySessionBean");
// 呼び出すアプリケーションを指定
ResponseBean response = (ResponseBean)call.invoke(dataBean,"update");
// 送信するデータとコマンド名を指定して呼び出し
...
}
以降の節で、リモートマップの記述方法、CallFactoryインタフェースとCallインタフェースの使用方法を説明します。
- 85 -
7.2 リモートマップ
リモートマップは、リモート共通インタフェースで呼び出すセションBeanにエイリアスを定義します。次のようにXMLで記述します。
<?xml version="1.0" encoding="Shift_JIS"?>
<remoteMap
xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap
http://interstage.fujitsu.com/schemas/uji/remotemap.xsd">
<config>
<version>5.0</version>
</config>
<!-- セションBeanの呼び出しを定義します。-->
<ejb name="MySessionBean" application="java:comp/env/ejb/MySessionBean"/>
<!-- セションBeanのローカル呼び出しを定義します。-->
<local name="MyLocalSessionBean" class="mypackage.MySessionBean">
<env-entry>
<env-entry-name>guestUser</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>guest</env-entry-value>
</env-entry>
</local>
</remoteMap>
リモートマップの記述形式
リモートマップのルートはremoteMapです。remoteMapの内側には最初にconfigタグを記述し、以下の情報を指定します。
・ リモートマップの文法のバージョン: versionタグで記述し、常に5.0を指定します。
configタグのあとに、呼び出し対象のアプリケーションに対応したタグで名前を定義します。いずれもname属性で呼び出すアプリケー
ションの名前を指定します。
・ ejbタグ
セションBeanの名前を定義します。application属性に、JNDIで検索するセションBeanの名前を指定します。
・ localタグ
セションBeanをローカル呼び出しする場合の名前を定義します。class属性に、セションBean実装クラスのクラス名を指定します。コ
ンテントにはセションBeanで使用するエンタープライズBean環境を記述します。セションBeanのローカル呼び出しについては“25.3.2
ローカル呼び出し”を参照してください。
・ ejbExtタグ
EJB複数指定機能またはEJB再試行機能を使用してセションBeanを呼び出す場合に使用します。詳細は“8.5 EJB複数指定機能”
および“8.6 EJBの再試行”を参照してください。
これらのタグの詳細は“定義ファイルリファレンス”を参照してください。
リモートマップの名前と分割方法
リモートマップ名は、デフォルトではremote.xmlです。これは、初期化パラメタuji.remoteMapで変更できます。初期化パラメタについて
は、“13.3 初期化パラメタ”を参照してください。
また、複数作成されたリモートマップを初期化パラメタで指定した名前のフォルダに配置することにより、1つのリモートマップのように扱
うことが可能です。この機能により各リモートマップの結合の手間を省くことができます。
リモートマップのファイル名として指定されたファイルの種類により、以下のように扱います。
- 86 -
初期化パラメタ
uji.remoteMapの指定
なし
使用するリモートマップ名 使用するリモートマッ
プの種類
remote.xml
あり
初期化パラメタで指定し
た名前
リモートマップの扱い
ファイル
remote.xmlファイルをリモートマップとして扱いま
す。
フォルダ
remote.xmlフォルダの下に置かれたすべてのファ
イルをリモートマップとして扱います。
ファイル
初期化パラメタで指定した名前のファイルをリモー
トマップとして扱います。
フォルダ
初期化パラメタで指定した名前のフォルダの下
に置かれたすべてのファイルをリモートマップと
して扱います。
ポイント
フォルダ内に配置するリモートマップのファイル名は任意です。
注意
リモートマップを分割する場合の注意事項は以下のとおりです。
・ 割されたリモートマップはそれぞれ単体でリモートマップとして利用できる必要があります。すなわち、リモートマップの一部を切り
出して別ファイルとすることはできません。
・ nameアトリビュートで指定する名前は、分割されたリモートマップが配置されてあるフォルダ内で一意でなければなりません。
・ 分割されたリモートマップを配置するフォルダ内にリモートマップ以外のファイル、サブフォルダを配置することはできません。
・ リモートマップは初回利用時に読み込まれます。アプリケーション動作中の動的変更はできません。
・ EJBセションBeanでは、リモートマップを分割することはできません。
・ リモートマップの分割個数に制限はありませんが、分割した場合、リモートマップの読み込み時間がリモートマップの個数に正比例
して増加することになるため、リモートマップ使用時の性能に影響します。リモートマップ使用時の性能が著しく遅くなる場合には、
業務やアプリケーションの単位でリモートマップの構成を見直してください。
リモートマップの配置
リモートマップは設定ファイルフォルダに配置します。 標準の設定ファイルフォルダは以下のとおりです。
アプリケーション種別
Webアプリケーション
電子フォームアプリケーション
設定ファイルフォルダ
/WEB-INF
7.3 CallFactoryインタフェースとCallインタフェースによる呼び出し
import
import
import
import
import
com.fujitsu.uji.ext.Call;
com.fujitsu.uji.ext.CallFactory;
com.fujitsu.uji.ext.UjiRemoteException;
com.fujitsu.uji.ext.UjiTargetException;
com.fujitsu.uji.ext.UjiCreateException;
public Object doSomething(DispatchContext context, DataBean dataBean){
CallFactory factory = context.getCallFactory();
try {
Call call = factory.createCall("MySessionBean");
// 名前を指定する
ResponseBean response = (ResponseBean)call.invoke(dataBean,"update");
- 87 -
// 送信するデータとコマンド名を指定して呼び出す
...
} catch (UjiCreateException e) {
// createCallメソッドで発生した例外
...
} catch (UjiRemoteException e) {
// 通信中の例外
// invokeメソッドで発生する。
...
} catch (UjiTargetException e) {
// 呼び出したセションBeanで発生した例外
// invokeメソッドで発生する。
...
}
}
処理の手順は以下のようになります。
1. DispatchContextクラスのgetCallFactoryメソッドでCallFactoryインタフェースを取得します。
2. リモートマップに定義した名前を指定してCallFactoryのcreateCallメソッドを呼び出し、Callインタフェースを取得します。
3. Callインタフェースのinvokeメソッドで、セションBeanを呼び出します。invokeメソッドの引数に与えたデータとコマンド名が、呼び
出されたセションBeanに送信されます。
4. セションBeanが返したデータは、invokeメソッドの返り値として取得できます。
上記の手順3でデータを送信せずコマンドのみを指定したい場合は、データとしてnullを指定してください。この場合、呼び出されたセション
Beanでは、入力データを指定しない形式の行がコマンドマップから検索され、指定したコマンドに対応するメソッドが呼び出されます。
CallFactoryのcreateCallメソッドは、Callインタフェースの作成に失敗するとUjiCreateExceptionを発生します。UjiCreateExceptionの
getRootCauseメソッドで、失敗の原因となった例外が取得できます。
Callインタフェースのinvokeメソッドは以下の2種類の例外を発生します。
・ UjiRemoteException
呼び出し先との通信に失敗した場合に発生する例外です。UjiRemoteExceptionのgetRootCauseメソッドで失敗の原因となった例
外が取得できます。
・ UjiTargetException
呼び出したセションBean実行中に例外が発生したことを表す例外です。実際にはUjiTargetExceptionそのものではなく、そのサブ
クラスであるEJBApplicationExceptionが例外として使用されます。原因となった例外の取得方法詳細は“APIリファレンス”を参照し
てください。
セションBeanの動作については、“第8章 EJBの呼び出し”を参照してください。
- 88 -
第8章 EJBの呼び出し
ApcoordinatorアプリケーションからEJBを呼び出す方法について説明します。この方法は、Apcoordinatorで作成したセションBeanを呼
び出す場合と、一般的なEJBを呼び出す場合とで異なります。
8.1 Apcoordinatorで作成したセションBeanの呼び出し
Apcoordinatorで作成したセションBeanは以下の2通りの方法で呼び出せます。
・ リモート共通インタフェースを使う: 以下の特徴があります。
- セションBeanのローカル呼び出しが可能
- セションBeanごとにデータBean変換マップが指定可能
・ EJBCallFactoryクラスを使う: 以下の特徴があります。
- EJB専用の呼び出し方法である
- リモートマップは不要
Apcoordinatorで作成したセションBeanを呼び出す場合は、以下の機能が利用できます。詳しくは“25.3 セションBeanとクライアントとの
連携”を参照してください。
・ セション情報の同期
・ データBean変換
・ ローカル呼び出し
8.1.1 リモート共通インタフェースを使った呼び出し
リモート共通インタフェースの基本的な使用方法は“第7章 リモート共通インタフェース”を参照してください。この節ではセションBean
の呼び出しの場合に固有の動作について説明します。
項目
セションBeanに固有の動作
CallFactoryインタフェースのcreateCallメソッドの呼び出し
このメソッドが呼び出されたとき、セションBeanのリモートインタ
フェースのcreateメソッドが呼び出され、セションBeanのオブジェ
クトが作成されます。このセションBeanオブジェクトは、ビジネ
スクラスを呼び出した処理が終了するときに自動的に削除され
ます。詳細は“8.4 セションBeanオブジェクトの自動削除”を参
照してください。
Callインタフェースのinvokeメソッドの呼び出し
データBean変換機能を使用している場合、第1引数に指定さ
れたデータは変換されてからセションBeanに送信されます。ま
た、セションBeanが返したデータで上書きが行われた結果が
invokeメソッドから返ります。データBean変換機能と上書き機
能については“25.3 セションBeanとクライアントとの連携”を参
照してください。
Callインタフェースのinvokeメソッドが発生させる
UjiTargetException
セションBeanの実行中に例外が発生し、その例外がクライアン
トに通知される種類の例外である場合、invokeメソッドは
UjiTargetExceptionのサブクラスである
EJBApplicationExceptionを発生します。
EJBApplicationExceptionのgetRootCauseメソッドにより、セショ
ンBeanで発生した例外を取得できます。クライアントに通知さ
れる例外については“25.2.1 例外処理”を参照してください。
8.1.2 EJBCallFactoryを使った呼び出し
EJBCallFactoryを使った呼び出しは、以下の手順で行います。
- 89 -
1. DispatchContextクラスからEJBCallFactoryクラスのオブジェクトを取得します。
2. EJBCallFactoryクラスのcreateUjiSessionCallメソッドを呼び出し、セションBeanの名前を指定してUjiSessionCallクラスのオブジェ
クトを取得します。指定する名前はJNDIで検索する名前です。この操作で取得されるUjiSessionCallは、セションBeanにアクセス
するためのクラスです。このクラスのオブジェクトが作成されると同時に、EJBコンテナ上にセションBeanのオブジェクトが作成され
ます。
3. UjiSessionCallクラスのinvokeメソッドでセションBeanを呼び出します。このとき、引数としてデータBeanとコマンド名を指定します。
記述例は以下のようになります。
import com.fujitsu.uji.ejb.EJBCallFactory;
import com.fujitsu.uji.ext.CallFactory;
public void someMethod(DispatchContext context, MyDataBean dataBean) {
...
EJBCallFactory callFactory=(EJBCallFactory)context.getCallFactory(CallFactory.EJB);
UjiSessionCall call=callFactory.createUjiSessionCall("java:comp/env/ejb/someSessionBean");
ResponseBean response=(ResponseBean)call.invoke(dataBean,verb);
...
}
UjiSessionCallクラスのinvokeメソッドによってセションBeanのビジネスクラスが呼び出されます。ビジネスクラスのメソッドの第2引数に与
えられるオブジェクトは次のとおりです。
・ データBean変換機能を使用していない場合は、invokeの引数に指定したデータBeanです。
・ データBean変換機能を使用している場合は、invokeの引数に指定したデータBeanを変換して得られるHashMapです。
また、invokeメソッドの返り値は次のとおりです。
・ データBean変換機能を使用していない場合、セションBeanのビジネスクラスが返却したオブジェクトです。
・ データBean変換機能を使用している場合は、セションBeanのビジネスクラスが返却したオブジェクトを逆変換した結果です。上書
き機能が有効な場合は、invokeで指定したデータBeanそのものが返ります。このとき、返却されたデータBeanはセションBeanが返
したデータで上書きされています。
データBean変換機能と上書き機能については“25.3 セションBeanとクライアントとの連携”を参照してください。
セ シ ョ ン Bean の 実 行 中 に 例 外 が 発 生 し 、 そ れ が 呼 び 出 し 側 に 通 知 さ れ る 例 外 の 場 合 、 invoke メ ソ ッ ド は
com.fujitsu.uji.ejb.EJBApplicationException例外を発生します。この例外のgetRootCauseメソッドによって、セションBeanで発生した例
外を取得できます。 セションBeanからクライアントへの例外の通知については、“25.2.1 例外処理”を参照してください。
EJBCallFactoryのcreateUjiSessionCallメソッドで作成されたセションBeanオブジェクトは、ビジネスクラスを呼び出した処理が終了する
ときに自動的に削除されます。詳細は“8.4 セションBeanオブジェクトの自動削除”を参照してください。
8.2 一般的なEJBの呼び出し
一般的なEJBを呼び出すには、次の方法を使います。
・ 引数なしのcreateメソッドを持つセションBeanを呼び出す場合
1. EJBCallFactoryクラスのcreateメソッドを使用してリモートインタフェースを取得します。
2. リモートインタフェースの目的のメソッドを呼び出します。
手順1の詳細は“8.2.1 EJBCallFactoryクラスからリモートインタフェースを取得する方法”を参照してください。
・ 以下のEJBを呼び出す場合
- エンティティBean
- createメソッドに引数が必要なセションBean
- createメソッドの名称がcreateXxx形式のセションBean
次の手順で呼び出します。
1. EJBCallFactoryクラスのgetHomeメソッドを使用して、ホームインタフェースを取得します。
- 90 -
2. ホームインタフェースのcreateメソッドまたはファインダメソッドを使用してリモートインタフェースを取得します。
3. リモートインタフェースの目的のメソッドを呼び出します。
手順1の詳細は“8.2.2 EJBCallFactoryクラスからホームインタフェースを取得する方法”を参照してください。
なお、CMRフィールド(container-managed relationship field)を持つエンティティBeanを使用する場合など、LocalインタフェースとLocal
ホームインタフェースを使ってEJBを呼び出す場合は、EJBCallFactoryクラスを使用せず、EJBの仕様に従ってjavax.naming.InitialContext
クラスを使用してLocalホームインタフェースを取得します。
8.2.1 EJBCallFactoryクラスからリモートインタフェースを取得する方法
以下のように記述します。
import com.fujitsu.uji.ejb.EJBCallFactory;
import com.fujitsu.uji.ext.CallFactory;
public void someMethod(DispatchContext context, MyDataBean dataBean) {
EJBCallFactory callFactory=(EJBCallFactory)context.getCallFactory(CallFactory.EJB);
SomeSession remote=(SomeSession)callFactory.create("java:comp/env/ejb/someSessionBean");
remote.someBusinessMethod(....);
...
}
ここで 、SomeSessionはセションBeanのリモートインタフェースです 。EJBCallFactoryのオブジェクトは DispatchContextクラスの
getCallFactoryメソッドで取得します。EJBCallFactoryのcreateメソッドは、指定された名前のEJBのオブジェクトを作成し、そのリモートイ
ンタフェースを返します。ここで、createの引数に与えるのはJNDIで検索する名前です。
この方法を使用する場合、EJBのホームインタフェースには引数なしのcreateメソッドが定義されている必要があります。
EJBCallFactoryのcreateメソッドで作成されたEJBオブジェクトは、ビジネスクラスを呼び出した処理が終了するときに自動的に削除され
ます。詳細は“8.4 セションBeanオブジェクトの自動削除”を参照してください。
8.2.2 EJBCallFactoryクラスからホームインタフェースを取得する方法
以下のように記述します。
import com.fujitsu.uji.ejb.EJBCallFactory;
import com.fujitsu.uji.ext.CallFactory;
public void someMethod(DispatchContext context, MyDataBean dataBean) {
EJBCallFactory callFactory=(EJBCallFactory)context.getCallFactory(CallFactory.EJB);
SomeEntityHome home=(SomeEntityHome)callFactory.getHome("java:comp/env/ejb/someSessionBean");
SomeEntity remote=home.findByPrimaryKey(...);
String data=remote.getData();
...
}
ここで、SomeEntityHomeはエンティティBeanのホームインタフェース、SomeEntityはエンティティBeanのリモートインタフェースです。
EJBCallFactoryのオブジェクトはDispatchContextクラスのgetCallFactoryメソッドで取得します。EJBCallFactoryのgetHomeメソッドは、指
定された名前のEJBのホームインタフェースを返します。getHomeの引数に与えるのはJNDIで検索する名前です。
8.3 ホームインタフェースのキャッシュ
以下のメソッドを実行したときに取得されたホームインタフェースはキャッシュされ、2回目からは再利用されるため高速化されます。
・ EJBCallFactoryクラスのgetHomeメソッド
・ EJBCallFactoryクラスのcreateメソッド
・ EJBCallFactoryクラスのcreateUjiSessionCallメソッド
・ CallFactoryインタフェースのcreateCallメソッド
- 91 -
キャッシュはアプリケーションクラスに保存されます。
8.4 セションBeanオブジェクトの自動削除
以下のメソッドを実行したときには、EJBコンテナ上にセションBeanオブジェクトが作成されます。
・ EJBCallFactoryクラスのcreateメソッド
・ EJBCallFactoryクラスのcreateUjiSessionCallメソッド
・ CallFactoryインタフェースのcreateCallメソッド
以上のメソッドによって作成されたセションBeanオブジェクトについては、以下の図のタイミングでリモートインタフェースのremove()メ
ソッドが呼び出され、セションBeanが削除されます。
8.5 EJB複数指定機能
EJB複数指定機能は、数台のEJBサーバを使用した運用環境を対象として、各サーバで同一のEJBセションBeanを起動しそれらを1つ
のグループとして登録しておくことにより、以下の機能を実現します。
・ EJBサーバがダウンした場合でも他のサーバのセションBeanを呼び出すことにより、業務を継続して実行します。
・ 呼び出すセションBeanを順次切り替えることにより、簡易的な負荷分散を実現します。
- 92 -
EJB複数指定機能で呼び出せるのはApcoordinatorで作成したセションBeanです。
EJBの呼び出しにはリモート共通インタフェースを使用します。EJB複数指定機能を使用しないでセションBeanを呼び出す場合と呼び
出し方法が共通です。
EJBの作成
Apcoordinatorのフレームワークを使用してセションBeanを作成します。作成方法は“第4部 EJBアプリケーションの開発”を参照してく
ださい。
EJB複数指定機能を使用して呼び出されるセションBeanは、作成時に以下の点に注意してください。
・ セションBeanのアプリケーションクラスのインスタンスは各JVMごとに存在します。そのため、アプリケーションクラスにデータを保存
した場合、そのデータは他のEJBサーバにあるセションBeanとは共有されません。 EJB複数指定機能を使用した場合、常に同じEJB
サーバのセションBeanが呼び出されるとは限らないため、前回の呼び出しでアプリケーションクラスに保存したデータが次回の呼
び出しで読み出せるとは仮定できません。
EJBの呼び出し方法
EJB複数指定機能を使用してEJBを呼び出すには、リモート共通インタフェースを使用し、EJBを呼び出すアプリケーションを以下のよ
うに作成します。
1. リモートマップを作成して、セションBeanのグループを定義し名前を付けます。 以下はリモートマップの記述例です。
MySessionBean1, MySessionBean2, MySessionBean3 の3つのセションBeanからなるグループをMySessionBeansという名前で定
義しています。
<?xml version="1.0" encoding="Shift_JIS"?>
<remoteMap
xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap
http://interstage.fujitsu.com/schemas/uji/remotemap.xsd">
<config>
<version>5.0</version>
</config>
<!-- EJB複数指定機能を使用して呼び出すセションBeanのグループを定義します。-->
<ejbExt name="MySessionBeans" type="proxy" recovertime="10" >
<application name="java:comp/env/ejb/MySessionBean1" />
- 93 -
<application name="java:comp/env/ejb/MySessionBean2" />
<application name="java:comp/env/ejb/MySessionBean3" />
</ejbExt>
</remoteMap>
グループはejbExtタグで定義します。ejbExtタグのnameアトリビュートにグループの名前を記述します。ejbExtタグのコンテントに
は、グループのメンバであるセションBeanをapplicationタグで記述します。applicationタグのnameアトリビュートにはJNDIで検索
するセションBeanの名前を指定します。
2. com.fujitsu.uji.ext.CallFactoryとcom.fujitsu.uji.ext.Callの2つのインタフェースを使用してセションBeanを呼び出します。まず、
CallFactoryインタフェースのcreateCallメソッドを実行してCallインタフェースを取得します。createCallの引数にはグループの名前
を指定します。続いて、データBeanとコマンド名を引数としてCallインタフェースのinvokeメソッドを呼び出すことにより、リモート
マップで定義したグループからセションBeanが選択され、呼び出されます。以下はビジネスクラスからセションBeanを呼び出す例
です。
public Object doSomething(DispatchContext context, DataBean dataBean){
CallFactory factory = context.getCallFactory();
// グループを指定してCallオブジェクトを取得します。
Call call = factory.createCall("MySessionBeans");
// 送信するデータとコマンド名を指定してセションBeanを呼び出します。
ResponseBean response = (ResponseBean)call.invoke(dataBean,"update");
...
}
ポイント
リモート共通インタフェースは、呼び出されるアプリケーションの種別に依存せずに、リモートマップでアプリケーションに名前を定義し、
CallFactoryインタフェースでその名前を指定して呼び出すという統一された方法でアプリケーションを呼び出します。 EJB複数指定機
能を使用する場合は、アプリケーションの名前の代わりにセションBeanのグループの名前を使用します。リモートマップのejbExtタグで
定義する名前やCallFactoryインタフェースのcreateCallメソッドの引数に与える名前は、アプリケーションの名前ではなくグループの名
前になります。
EJBの選択方式
Callインタフェースのinvokeメソッドを実行すると、リモートマップで定義したグループからセションBeanが1個選択されて呼び出されま
す。セションBeanを選択する方式には以下の2通りがあり、リモートマップに記述したejbExtタグのtypeアトリビュートで指定します。
・ proxy
グループ内で利用可能なセションBeanのうち、最も優先度が高いものを選んで使用します。 EJBコンテナのダウンによりセションBean
が利用不能になった場合は、グループ内の別のセションBeanを代わりに使用します。すべてのセションBeanが利用不能な場合は
例外が発生します。
セションBeanの優先度はejbExtタグのコンテントに書いた順番で与えられ、最初に書いたセションBeanが最優先となります。 上記
のリモートマップの記述例の場合、通常はMySessionBean1が使用されます。MySessionBean1が利用不能な場合はMySessionBean2
が使用されます。MySessionBean1、MySessionBean2両方とも利用不能な場合はMySessionBean3が使用されます。
・ round
セションBeanを使用するたびに、使用するセションBeanを順番に切り替えます。 EJBコンテナのダウンによりセションBeanが利用不
能になった場合は、次のセションBeanを代わりに使用します。すべてのセションBeanが利用不能な場合は例外が発生します。
セションBeanを切り替えるタイミングは、CallFactoryインタフェースのcreateCallメソッドを呼び新規にCallオブジェクトを作成した時
点です。上記のリモートマップの記述例の場合、createCallメソッド呼び出すごとに、MySessionBean1、MySessionBean2、
MySessionBean3、MySessionBean1、...の順で使用されます。MySessionBean2を使用しようとしてEJBコンテナのダウンが検出され
た場合は、代わりにMySessionBean3が使用されます。
同一のCallオブジェクトを使用している間は、invokeメソッドを繰り返し呼び出しても同一のセションBeanが使用されます。ただし、後述する
createOnInvokeアトリビュートにtrueが指定されている場合で、EJBコンテナのダウンが検出された場合は、別のセションBeanを代わりに
使用します。
- 94 -
EJBコンテナがダウンしているかどうかの判定はセションBeanオブジェクトの作成時 (ホームインタフェースのcreateメソッド呼び出し時)
に行われます。セションBeanオブジェクト作成時に以下の現象が発生するとEJBコンテナがダウンしていると判断します。
・ JNDIによる検索でホームインタフェースを取得する際に例外が発生した
・ ホームインタフェースのcreateメソッドを実行してリモートインタフェースを取得する際に例外が発生した
・ ホームインタフェース、リモートインタフェースは取得できたが、Apcoordinatorで作成したセションBeanではない
EJBコンテナがダウンしたと判定された場合、そのセションBeanはその後一定期間は使用されません。この使用されない期間はejbExt
タグのrecovertimeアトリビュートに指定します。単位は分です。デフォルトは10分です。
セションBeanオブジェクトを新規に作成するタイミングは以下の2通りから選択でき、ejbExtタグのcreateOnInvokeアトリビュートで指定し
ます。
・ Callオブジェクト1個に付き、1回だけセションBeanオブジェクトを作成します。一度作成したセションBeanオブジェクトは、Callオブ
ジェクトを破棄するまで使用されます。EJBコンテナのダウン判定はCallオブジェクト作成後最初のinvoke実行時に行われ、それ以
降は行われません。一度作成したセションBeanオブジェクトをそのまま使用し続けるため、厳密なダウン判定より性能を優先する場
合は、このタイミングを選択します。デフォルトではこのタイミングです。
・ Callオブジェクトのinvokeメソッドを呼び出すたびに、新しくセションBeanオブジェクトを作成します。この場合、EJBコンテナのダウ
ン判定がinvokeメソッド実行時に毎回実施されるため、ダウン判定をより厳密に行いたい場合はこのタイミングを選択します。 この
タイミングを選択するには、ejbExtタグのcreateOnInvokeアトリビュートにtrueを指定します。 なお、invokeメソッドを実行するたびに
実際に呼び出されるセションBeanオブジェクトが替わるため、このタイミングを使用してステートフルセションBeanを呼び出すと、EJB
複数指定機能を使用せずに呼び出した場合と実行結果が異なる場合があります。そのため、ステートフルセションBeanの呼び出
しにはこのタイミングを使用できません。
実行環境設定時の留意事項
EJB複数指定機能を使用する場合、実行環境の設定に関して以下の留意事項があります。
・ EJB複数指定機能を使用する場合、EJBクライアントから複数のEJBサーバにアクセスできるようにアプリケーションサーバを設定す
る必要があります。
Interstageを使用する場合は、Interstage管理コンソールまたはInterstage統合コマンドを使ってInterstageを設定することにより、ネー
ミングサービスを1台のサーバ上で運用し、 EJBクライアントを運用するサーバと全てのEJBサーバがそのネーミングサービスを参
照するように設定します。設定方法の詳細は、「Interstage Web Server 運用ガイド(基本編)」または「Interstage Application Server
運用ガイド(基本編)」や、Interstage管理コンソールのヘルプを参照してください。
・ 複数のEJBサーバへ配備されたセションBeanには、それぞれ違う名前(JNDIで検索する名前)を付ける必要があります。
Interstageを使用する場合、セションBeanの名前を指定するには、Interstage管理コンソールを使用し、配備時にEJBアプリケーショ
ン名を変更します。 EJBアプリケーション名をfooとした場合、"java:comp/env/ejb/foo"がJNDIで検索する名前になります。 Interstage
StudioからセションBeanを配備する場合、配備時にEJBアプリケーション名を変更するにはInterstage管理コンソールを使用します。
8.6 EJBの再試行
8.6.1 EJB再試行機能の概要
EJB再試行機能は、セションBeanがアプリケーション例外を発生した場合に、再度自動的にセションBeanを呼び出す機能です。セション
Beanを呼び出すアプリケーションで使用します。 ロック中のデータベースにアクセスできなかったなどの原因で、セションBeanを再度
呼び出すことで正常終了する可能性があるエラーが発生した場合に、その処理を再実行する目的で本機能を使用します。
- 95 -
EJB再試行機能を使って呼び出せるのはApcoordinatorで作成したセションBeanです。 また、EJBの呼び出しにはリモート共通インタ
フェースを使用します。EJB再試行機能を使用しないでセションBeanを呼び出す場合と呼び出し方法が共通です。
Apcoordinatorを使用したセションBeanの作成方法は“第4部 EJBアプリケーションの開発”を参照してください。また、EJB再試行機能
で呼び出すセションBeanを作成する際の注意点については、“8.6.3 セションBean作成時の注意事項”を参照してください。
再試行が実施される契機
アプリケーションがCallインタフェースのinvokeメソッドによってセションBeanを呼び出し、セションBeanがある特定のアプリケーション例
外を発生した場合に、ApcoordinatorがセションBeanの呼び出しを再試行します。再試行を起こすアプリケーション例外を再試行例外
と呼びます。再試行例外として使用する例外クラスはリモートマップで指定します。
セションBeanがシステム例外を発生した場合は、再試行されません。また、セションBeanオブジェクトの作成時は例外が発生しても再
試行されません。
アプリケーション例外とシステム例外については“第4部 EJBアプリケーションの開発”の“25.2.1 例外処理”を参照してください。
8.6.2 EJB再試行機能を使ったEJBの呼び出し
EJB再試行機能を使用してEJBを呼び出すには、リモート共通インタフェースを使用し、EJBを呼び出すアプリケーションを以下のよう
に作成します。
1. リモートマップを作成して、呼び出すセションBeanの名前と再試行のパラメータを定義します。
2. CallFactoryインタフェースとCallインタフェースを使ってセションBeanを呼び出します。
リモートマップの作成
リモートマップを作成して、呼び出すセションBeanの名前と再試行のパラメータを定義します。リモートマップは、リモート共通インタフェース
において、呼び出されるアプリケーションを定義するXMLファイルです。リモートマップの詳細は“7.2 リモートマップ”を参照してくださ
い。ここでは、EJB再試行機能を使用する場合のリモートマップの記述方法を説明します。
以下は、EJB再試行機能を使う場合のリモートマップの記述例です。
<?xml version="1.0" encoding="Shift_JIS"?>
<remoteMap
xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap
http://interstage.fujitsu.com/schemas/uji/remotemap.xsd">
<config>
<version>5.0</version>
</config>
- 96 -
<!-- EJB再試行機能を使って呼び出すセションBeanを定義します。-->
<ejbExt name="MySessionBean" retryCount="3" retryInterval="150" >
<application name="java:comp/env/ejb/MySessionBean" />
<retriableException class="some.pkg.BusyException" />
<retriableException class="some.pkg.NotReadyException" />
</ejbExt>
</remoteMap>
呼び出すセションBeanをejbExtタグを使って記述します。セションBeanに与える名前をejbExtタグのnameアトリビュートに指定します。ejbExt
タグのコンテントにはapplicationタグを書き、applicationタグのnameアトリビュートにはJNDIで検索するセションBeanの名前を指定しま
す。
さらに、ejbExtタグのアトリビュートとコンテントには、再試行に関する以下のパラメータを指定します。
・ 再試行最大回数
ejbExtタグのretryCountアトリビュートに指定します。例えば2を指定すると、初回の呼び出しを含めて最大で合計3回呼び出されま
す。デフォルトは2です。
・ 再試行間隔
再試行するまでの時間をミリ秒単位で指定します。ejbExtタグのretryIntervalアトリビュートに指定します。デフォルトは100ミリ秒で
す。
・ 再試行例外
再試行例外として使用するアプリケーション例外のクラスをretriableExceptionタグで指定します。retriableExceptionタグはejbExtタ
グのコンテントに記述します。retriableExceptionタグのclassアトリビュートに例外クラスを指定します。セションBeanを呼び出した結
果、アプリケーション例外が発生し、その例外のクラスがclassアトリビュートに指定したクラスと同じか、そのサブクラスであった場合
に、再試行します。なお、以下のクラスを再試行例外に指定することはできません。
- java.lang.RuntimeExceptionとそのサブクラス
- java.rmi.RemoteExceptionとそのサブクラス
- java.lang.Exception
- java.lang.Errorとそのサブクラス
注意
再試行間隔の精度はご使用になるシステムに依存します。 10ミリ秒より高い精度による指定はシステムによっては有効にならない場合
があります。
CallFactoryインタフェースとCallインタフェースによるセションBeanの呼び出し
com.fujitsu.uji.ext.CallFactoryとcom.fujitsu.uji.ext.Callの2つのインタフェースを使用してセションBeanを呼び出します。これらのインタ
フェースは、リモート共通インタフェースにおいてアプリケーションを呼び出すためのインタフェースです。詳細は“7.3 CallFactoryイン
タフェースとCallインタフェースによる呼び出し”を参照してください。ここでは、これらのインタフェースの使用方法をEJB再試行機能の
場合について説明します。
CallFactoryインタフェースとCallインタフェースを使った呼び出しの手順は以下のとおりです。
1. com.fujitsu.uji.DispatchContextクラスからCallFactoryインタフェースを取得します。
2. セションBeanの名前(ejbExtタグのnameアトリビュートに指定したもの)を指定してCallFactoryインタフェースからCallインタフェー
スを取得します。この処理によって、セションBeanオブジェクトが作成されます。
3. データBeanとコマンド名を引数としてCallインタフェースのinvokeメソッドを呼び出すと、セションBeanが呼び出されます。セション
Beanが再試行例外を発生した場合は、セションBeanが再度呼び出されます。
以下はビジネスクラスからセションBeanを呼び出す例です。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.ext.CallFactory;
import com.fujitsu.uji.ext.Call;
- 97 -
import com.fujitsu.uji.ext.UjiCreateException;
import com.fujitsu.uji.ext.UjiRemoteException;
import com.fujitsu.uji.ext.UjiTargetException;
...
public Object doSomething(DispatchContext context, SomeBean dataBean) {
// CallFactoryインタフェースを取得します。
CallFactory factory = context.getCallFactory();
try {
// セションBeanの名前を指定してCallインタフェースを取得します。
Call call = factory.createCall("MySessionBean");
// 送信するデータとコマンド名を指定してセションBeanを呼び出します。
ResBean response = (ResBean)call.invoke(dataBean,"update");
} catch (UjiCreateException e) {
...
} catch (UjiRemoteException e) {
...
} catch (UjiTargetException e) {
...
}
...
}
再 試 行 最 大 回 数 だ け 再 試 行 を 繰 り 返 し て も セ シ ョ ン Bean が 例 外 を 発 生 す る 場 合 、 invoke メ ソ ッ ド は
com.fujitsu.uji.ejb.EJBApplicationExceptionを発生します。セションBeanで発生した例外は、EJBApplicationExceptionのgetRootCause
メソッドにより取得できます。
セションBeanがシステム例外を発生した場合は、invokeメソッドがcom.fujitsu.uji.ext.UjiRemoteExceptionを発生します。再試行は行わ
れません。
EJB複数指定機能との併用
EJB再試行機能はEJB複数指定機能と併用できます。
EJB再試行機能とEJB複数指定機能を併用するには、リモートマップにejbExtタグを以下のように記述します。
<?xml version="1.0" encoding="Shift_JIS"?>
<remoteMap
xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap
http://interstage.fujitsu.com/schemas/uji/remotemap.xsd">
<config>
<version>5.0</version>
</config>
<!-- EJB複数指定機能を使用して呼び出すセションBeanのグループを定義します。 -->
<!-- また、再試行例外を定義します。 -->
<ejbExt name="MySessionBeans" type="proxy" >
<application name="java:comp/env/ejb/MySessionBean1" />
<application name="java:comp/env/ejb/MySessionBean2" />
<application name="java:comp/env/ejb/MySessionBean3" />
<retriableException class="some.pkg.BusyException" />
<retriableException class="some.pkg.NotReadyException" />
</ejbExt>
</remoteMap>
EJB複数指定機能を使用して呼び出すセションBeanのグループをejbExtタグで定義します。さらに、ejbExtタグのコンテントに
retriableExceptionタグを記述して再試行例外を定義します。必要に応じて、ejbExtタグにretryCountアトリビュート(再試行最大回
数)やretryIntervalアトリビュート(再試行間隔)を追加します。
EJB再試行機能とEJB複数指定機能を併用した場合、Callインタフェースのinvokeメソッド呼び出し時に、セションBeanオブジェクトの作
成と呼び出しが以下の順に実行されます。
- 98 -
1. Callインタフェース取得後で最初にinvokeが呼び出された場合は、セションBeanオブジェクトを作成します。EJB複数指定機能
はこのタイミングで動作します。EJBコンテナがダウンしていると判定した場合は、別のEJBコンテナを選択して、再度セションBean
オブジェクトの作成を実行します。セションBeanオブジェクトの作成に成功すると、2の処理に進みます。
2. セションBeanオブジェクトを呼び出します。EJB再試行機能はこのタイミングで動作します。セションBeanが再試行例外を発生し
た場合は、同一のセションBeanを再度呼び出します。この段階でEJBコンテナがダウンしていた場合、セションBeanオブジェクト
は再作成せず、例外UjiRemoteExceptionを発生します。
リモートマップでejbExtタグのcreateOnInvokeアトリビュートにtrueを指定した場合は、Callオブジェクトのinvokeメソッドを呼び出すたび
に新しくセションBeanオブジェクトが作成されます。この場合、上記の1の処理はinvokeが呼び出された時に常に実行されます。
8.6.3 セションBean作成時の注意事項
セションBeanが再試行例外を発生して再試行される場合でも、再試行例外を発生する前にセションBeanが実行した処理は取り消され
ません。このため、EJB再試行機能で呼び出されるセションBeanは、以下の点に注意して作成してください。
トランザクションを使用する場合の注意事項
セションBeanの処理でトランザクションを必要とする場合は、再試行例外を発生させる前にトランザクションをロールバックしてください。
セションBeanで開始したトランザクションや、セションBeanから呼び出された処理で開始されたトランザクションがすでにコミットされてい
る場合、その処理は取り消せないため、再試行例外を発生させないでください。
また、上記のようにコミット、ロールバックをセションBeanで実行する場合は、セションBeanの呼び出し元が開始したトランザクションにセション
Beanが参加することはできません。
引数の参照渡しを使用する場合の注意事項
通常は、EJBの呼び出しにおいては引数は値渡しで呼び出されます。このため、Callインタフェースを使ってセションBeanを呼び出す
と、invokeメソッドの引数に与えたデータBeanのコピーがセションBeanに渡されます。
ただし、アプリケーションサーバによっては、クライアントとEJBが同一のJVM上に存在する場合に、 EJB呼び出しの性能を向上させる
目的で、引数の参照渡しを可能にしている場合があります。引数の参照渡しを有効にした場合、Callインタフェースのinvokeに与えたデータ
BeanのインスタンスそのものがセションBeanに渡されます。データBeanはコピーされません。
引数の参照渡しを有効にする場合は、ビジネスクラスの引数に与えられたデータBeanをビジネスクラスの処理で変更しないでくださ
い。データBeanに変更を加えると、再試行によって呼び出された時に、変更後のデータBeanがビジネスクラスの引数に与えられます。
ビジネスクラス、セションクラス、アプリケーションクラスのデータを変更する場合の注意事項
以下のクラスのオブジェクトは、セションBeanの呼び出しが終了したあとも生存しています。これらのオブジェクトが持つデータを変更し
たあとで再試行例外を発生させた場合、再試行によってセションBeanが呼び出された時点で、オブジェクトが持つデータは変更後の
状態のままになっています。
・ ビジネスクラス (initメソッドがtrueを返す場合)
・ セションクラス
・ アプリケーションクラス
再試行前のデータ変更が再試行後に残っていることが問題となる場合は、再試行例外が発生する処理が完了したあとでビジネスクラ
ス、セションクラス、アプリケーションクラスのデータを変更する処理を実行してください。
- 99 -
第9章 アプリケーション連携実行基盤との連携
アプリケーション連携実行基盤とは、非同期処理をベースとした基幹系システムを短期構築するための実行基盤です。
アプリケーション連携実行基盤の詳細は基幹システム向けフレームワークのマニュアルを参照してください。
注意
アプリケーション連携実行基盤および基幹システム向けフレームワークは、Interstage Business Application Server Enterprise Editionで
提供されます。
アプリケーション連携実行基盤を利用して開発したアプリケーションは以下の2つに分けることができます。
・ 業務処理実行アプリケーション
フローを構成するアプリケーションです。複数の業務処理実行アプリケーションがフローに従って連携動作することで、全体で業務
処理を行います。
・ 業務処理開始アプリケーション
フローとして構築された一連のアプリケーション群の処理を開始させる役割を持ったアプリケーションです。
上記のうち、業務処理開始アプリケーションをApcoordinatorで開発することができます。
Apcoordinatorを利用して業務処理開始アプリケーションを開発する方法は基幹システム向けフレームワークの「アプリケーション開発
ガイド」を参照してください。
- 100 -
第10章 コマンドスクリプティング
10.1 コマンドスクリプティングの概要
コマンドスクリプティングを利用することによって、ビジネスクラス全体をJavaで記述する代わりに、処理のフローをXML形式で記述しJava
の記述を必要な部分のみに限定することができます。
以下はコマンドスクリプティングで処理を記述した例です。
<?xml version="1.0" encoding="UTF-8"?>
<commandMap
xmlns=http://interstage.fujitsu.com/schemas/uji/commandMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/commandMap
http://interstage.fujitsu.com/schemas/uji/commandmap.xsd">
<config>
<version>6.0</version>
</config>
<!-- 加算 sample1.BodyBean;add -->
<entry bean="sample1.BodyBean" verb="add">
<specSection>
<term property="val1" op="ADD" operand="val2" target="result"/>
</specSection>
<copyValue bean="#加算を実行しました。" targetProperty="message"/>
<setResponseBean pane="body" verb="resmode"/>
<invoke name="setHead"/>
</entry>
<!-- 初期処理 ; -->
<entry>
<!-- BodyBeanインスタンス生成 -->
<newBean cls="sample1.BodyBean" />
<setResponseBean pane="body" verb="reqmode" />
<invoke name="setHead"/>
</entry>
<!-- サブルーチン setHead -->
<procedure name="setHead">
<copyValue bean="uji.session" property="headBean" targetBean="hbean"/>
<specSection bean="hbean" targetBean="hbean">
<term property="count" op="ADD" operand="#1" target="count"/>
</specSection>
<setResponseBean pane="head" bean="hbean"/>
</procedure>
</commandMap>
コマンドスクリプティングでは、以下のメリットがあります。
・ 処理のフローが明確になる
・ Javaの処理を細分化し、再利用を容易にする
・ 修正時の再構築が不要で、変更が容易にできる
以下のような場合は、Javaで記述する必要があります。
・ 分岐や条件を伴い、一連のフローで表現できない場合
・ 実行性能を追求する場合
コマンドスクリプティングには、以下の機能があります。
・ 入力値の検証
・ EJBの呼びだし
・ 一般のクラスの呼びだし
- 101 -
・ XMLデータ仕様記述の呼びだし
・ データBeanの領域への対応付け
・ ログの出力
・ サブルーチンの定義
・ 例外のキャッチ
10.2 コマンドスクリプティングの利用方法
コマンドマップの定義
コマンドスクリプティングは、XMLファイルで記述します。コマンドマップでは、コマンドスクリプティングのXMLファイルをインクルードす
るように記述します。以下はコマンドマップから、コマンドスクリプティングのXMLファイル"comscript.xml"を取り込む場合の記述例で
す。
#commandMap
+comscript.xml
コマンドスクリプティングのXMLファイル
コマンドスクリプティングのXMLファイルは拡張子".xml"で作成する必要があります。エンコーディングには"UTF-8"、"Shift_JIS"等、Java
でサポートされている各種のエンコーディングが利用できます。
コマンドスクリプティング記述の概要
コマンドスクリプティング記述は、以下の構成となります。
XMLヘッダ
<commandMap>
<config>要素
<entry>要素
...<entry>要素の繰り返し
<procedure>要素
...<procedure>要素の繰り返し
</commandMap>
・ config要素
コマンドスクリプティングの情報を指定します。
・ entry要素
bean属性で入力データBeanのクラス名を、verb属性でコマンドを指定し、入力のデータと呼ばれるコマンドスクリプティングを対応
付けます。
コマンドマップとコマンドスクリプティングを通して、Beanのクラス名とコマンドで一意になる必要があります。
・ procedure要素
コマンドスクリプティングのサブルーチンを表します。
サブルーチンは、ファイル内で有効になります。
entry要素、procedure要素の内側には、処理のタグを記述することができます。処理のタグを以下に示します。詳細は“定義ファイルリ
ファレンス”を参照してください。
タグ名
機能
validate
最大値や型のチェックをします。
specSection
XMLデータ仕様記述をインラインで記述します。
specValidate
外部ファイルのXMLデータ仕様記述に従って、処理を行います。
invoke
サブルーチン、ビジネスクラス、Apcoordinator利用のEJBを呼び出します。
invokeEJB
一般のEJBを呼び出します。
- 102 -
タグ名
機能
invokeObject
一般のクラスオブジェクトを呼び出します。
invokeCobol
COBOLで記述された処理を呼び出します。
setResponseBean
表示領域と対応付けてデータBeanを設定します。
newBean
データBeanオブジェクトを生成します。
copyValue
値をコピーします。
copyResource
リソースファイルで定義した文字列をコピーします。
printLog
ログを出力します。
catch
例外時の動作を記述します。内側に処理のタグを記述します。
コマンドスクリプティングの実行中の例外は、com.fujitsu.uji.xscript.ScriptingExceptionとして通知されます。例外時の処理は、セション
クラスのhandleExceptionメソッドや、コマンドスクリプティングのcatchタグによって記述することができます。
コマンドスクリプティングでは、処理途中や結果のオブジェクトをスクリプトデータとしてDispatchContextに保存します。スクリプトデータは
Javaの記述から、DispatchContextクラスのgetScriptDataおよびsetScriptDataメソッドで参照、設定が可能です。
スクリプトデータの名前として、以下は既定として使用されています。
スクリプトデータ名
意味
uji.current
現在処理中のオブジェクト、初期値はuji.requestと同じ
uji.request
入力のデータBean
uji.verb
コマンド名
uji.session
セションクラス
uji.application
アプリケーションクラス
uji.exception
発生した例外のオブジェクト
この他、"uji."で始まる名前は予約されています。
コマンドスクリプティング実行終了時にuji.currentに設定されているデータが復帰値となります。復帰値はビジネスクラスで復帰値を返
す形態のアプリケーションで有効になります。
動作の概要
以下の記述に従ってコマンドスクリプティングの動作を説明します。
<entry bean="somepackage.EntryBean" verb="ok">
<validate property="value" type="int" minValue="0" maxValue="10"
statusText="valueError" />
<invoke name="someEjb" verb="#doOk"/>
<setResponseBean pane="body" verb="resmode"/>
<catch status="valueError">
<copyValue bean="#値は0以上10以下で入力してください" targetProperty="message" />
<setResponseBean pane="body" verb="retry"/>
</catch>
</entry>
1. 入力のデータBeanがsomepackage.EntryBeanで、コマンド名がokの場合、このentry要素が実行されます。
2. validateタグはuji.currentに保存されている入力データBeanに対して、プロパティvalueのint型チェックと最大最小の判定を行い
ます。
3. 正常の場合はinvokeタグが実行されます。この場合は名前がsomeEjb、コマンド名doOkを指定し、パラメタの省略値としてuji.current
に設定されている入力のデータBeanが使われます。
4. invokeの結果はuji.currentに格納され、それをsetResponseBeanタグで画面body、画面モードresmodeで設定します。
- 103 -
5. validateタグでエラーになった場合、valueErrorというステータス情報を持つ例外が発生します。catch要素はこの例外を受けて実
行され、メッセージ領域に文字列を入れて、画面モードretryで画面を再設定します。
10.3 利用者定義タグの追加
コマンドスクリプティングの処理のタグを利用者定義で追加することができます。
<entry bean="sample1.BodyBean" verb="add">
<myTag param="xxx" />
...
</entry>
処理クラスの作成
タグの処理をするクラスを、XScriptEngineクラスを継承して作成します。
getTagDefsメソッドで、タグ名と処理をするメソッド名の配列を返します。
処理をするメソッドは、DispatchContextと属性をもつMapオブジェクトを引数として作成します。
スクリプトデータを利用して、他のタグとデータの交換ができます。
public class MyTagEngine extends com.fujitsu.uji.xscript.XScriptEngine {
String tagDefs[][] = { { "myTag", "doMyTag" } };
public String[][] getTagDefs() {
return tagDefs;
}
public void doMyTag(DispatchContext context, Map attributes) {
String param = (String)attributes.get("param");
Object val = context.getScriptData("uji.current");
...
context.setScriptData("myTagValue", val);
}
}
処理クラスの組込み
ファクトリクラスで、処理のクラスのインスタンスを返します。
public class SampleFactory extends com.fujitsu.uji.http.HttpFactory
{
...
public XScriptEngine newXScriptEngine() {
return new MyTagEngine();
}
}
- 104 -
第11章 XMLデータ仕様記述
11.1 概要
XMLデータ仕様記述の概要
ビジネスアプリケーションでは、データ項目に対して値の範囲や形式について仕様を決めて、実行時に仕様を満たしているかどうかの
チェックを行います。また、データ項目へのデフォルト値の設定や、データ項目間で値の転記、変換などの処理を行います。このような
データ項目に対する処理は、ビジネスアプリケーションの中でかなりの部分を占めています。
XMLデータ仕様記述は、データ項目の仕様をXML形式で記述して、その記述をそのままの形で実行する機能です。データ項目の処理を
Javaプログラムで記述する代わりに、XMLデータ仕様記述のXMLを作成します。
XMLデータ仕様記述は、データBeanの項目(プロパティ)のチェックや、項目間の転記の仕様として作成します。通常のデータBeanの
他、XMLデータBean(com.fujitsu.uji.xml.XmlDataBean)やHashMap(java.util.HashMap)に対しても利用可能です。
XMLデータ仕様記述を利用することによって、次のような効果があります。
・ データのチェック処理を、プログラムするのではなく、データ仕様を定義するような方法で作成できます。プログラムで記述するの
に比べて明解で、作成時の誤りを軽減し、保守時の見直しを容易にします。
・ XMLデータ仕様記述を外付けのファイルからインタプリタ形式で実行することによって、データ項目の仕様変更が発生した時に、
プログラムを変更することなくXMLデータ仕様記述を入れ替えるだけで対応できます。
・ 利用者定義メソッドを作成することにより、機能のカスタマイズが容易にできます。
・ 記述形式がXMLであるため、ツール等との連携が容易です。例えば、EXCELシートからXMLデータ仕様記述を作成することが
できます。
・ XMLデータ仕様記述をJavaソースに変換するコンパイラを利用できます。
図11.1 XMLデータ仕様記述の概要図
1) XMLデータ仕様記述
各データ項目について、データの範囲、文字列パターンのマッチングなどのデータ仕様をXML形式で記述します。このXMLファイルを
「XMLデータ仕様記述」と呼びます。 XMLデータ仕様記述は、インタープリタ機能を使用してそのまま実行するか、または、コンパ
イラ機能を使用してJavaソースに変換して実行します。
2) XMLデータ仕様記述コンパイラ
XMLデータ仕様記述コンパイラは、XMLデータ仕様記述をJavaのクラスに変換します。XMLデータ仕様記述コンパイラを利用す
- 105 -
ると、アプリケーション実行時にXMLを解析する必要がなくなるため、XMLデータ仕様記述をそのままインタープリタで実行するよ
りも実行性能を向上することができます。
3) XMLデータ仕様記述実行系
作成したXMLデータ仕様記述を実行します。データBeanなどに対して、XMLデータ仕様記述に書かれた項目チェックや項目間
転記の操作を行います。
XMLデータ仕様記述の使用例
以下では、インタプリタを利用した単純な範囲チェックの例を説明します。記述方法の詳細やエラー処理の方法は次節以降で説明し
ます。
XMLデータ仕様記述
<?xml version="1.0" encoding="Shift_JIS" ?>
<eSpec
xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
http://interstage.fujitsu.com/schemas/uji/espec.xsd">
<config>
<version>6.0</version>
</config>
<specification name="sampleCheck" >
<section name="sect1" >
<!-- プロパティsampleNumberが0以上10以下であることをチェックします -->
<verify property="sampleNumber" op="GE" operand="#0" exception="#ERR01" info="#0以上" />
<verify property="sampleNumber" op="LE" operand="#10" exception="#ERR01" info="#10以下" />
</section>
</specification>
</eSpec>
eSpec
このXMLがXMLデータ仕様記述であることを表します。
config
XMLデータ仕様記述の情報を表します。
version
XMLデータ仕様記述のバージョンです。"6.0"と指定します。
specification
一組のデータ仕様を表します。データ仕様はいくつかのセクションで表現されます。ここでは、データ仕様の名前
を"sampleCheck"としています。
section
データ仕様のセクションを表します。セクション内に個々のデータ仕様を記述します。
verify
チェックのデータ仕様です。この例では、データBeanのプロパティsampleNumberが0以上、10以下であることを確認し、範囲外の場
合は例外とします。
ビジネスクラスの記述
import com.fujitsu.uji.xscript.ESpecValidator;
import com.fujitsu.uji.xscript.ESpecResultException;
import com.fujitsu.uji.xscript.ESpecRuntimeException;
...
public void someMethod(DispatchContext context, SomeBean bean) throws java.lang.Exception {
ESpecValidator validator = new ESpecValidator("c:¥¥espec¥¥sampleCheck.xml");
String errMsg = null;
try {
validator.validate("sampleCheck", bean);
} catch(ESpecResultException e) {
errMsg = "チェックエラー:" + e.getInfo();
} catch(Exception e) {
- 106 -
throw e;
}
...
}
import
XMLデータ仕様記述関連のクラスは、com.fujitsu.uji.xscriptパッケージで提供されます。
ESpecValidator
ESpecValidatorは実行機能のクラスです。XMLデータ仕様記述のファイル名を指定して作成します。
validate
ESpecValidatorのvalidateメソッドを呼ぶことで、XMLデータ仕様記述が実行されます。引数はデータ仕様の名前と、チェック対象
のデータBeanです。
ESpecResultException
チェックの結果エラーとなった場合は、ESpecResultExceptionが発生します。
その他のException
プロパティオブジェクトが見つからない等の問題が発生した場合は、ESpecRuntimeExceptionが発生します。また、XMLデータ仕
様記述自体の記述誤りなどの場合は、ESpecExceptionとなります。このような場合は、XMLデータ仕様記述を見直してください。
11.2 XMLデータ仕様記述の作成
11.2.1 項目仕様の記述
本項では、XMLデータ仕様記述での項目仕様の記述方法を説明します。項目仕様は、XMLデータ仕様記述のsectionタグ内に記述
します。
XMLデータ仕様記述の例
<?xml version="1.0" encoding="Shift_JIS" ?>
<eSpec
xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
http://interstage.fujitsu.com/schemas/uji/espec.xsd">
<config>
<version>6.0</version>
</config>
<specification name="sampleCheck" >
<section name="sect1" >
<verify property="sampleNumber" op="GE" operand="#0" exception="#ERR01" info="#0以上" />
<verify property="sampleNumber" op="LE" operand="#10" exception="#ERR01" info="#10以下" />
</section>
</specification>
</eSpec>
上記の例では、sectionタグ内に2つのverifyタグがあり、それぞれがプロパティsampleNumberに対する項目仕様となっています。
項目の値をチェックする
項目の値をチェックするためには、verifyタグを利用します。
<verify property="sampleNumber" op="GE" operand="#0" exception="#ERR01" info="#0以上" />
property
データBeanのプロパティ名を指定します。
op
判定のための関係演算を指定します。GT(より大)、GE(以上)、LT(より小)、LE(以下)、EQ(等しい)、NE(等しくない)を指定します。
operand
演算対象を指定します。定数の場合は、先頭に#を記述します。%nullや%emptyなどの予約オブジェクトを利用することもできます。
- 107 -
exception
エラーコードを記述します。文字列定数の場合は、先頭に#を記述します。exceptionアトリビュートを記述した場合は、エラーを検出
した時点でESpecResultExceptionがスローされます。
info
エラーの補足情報を記述します。文字列定数の場合は、先頭に#を記述します。
・ property(プロパティ)、op(関係演算)、operand(演算対象)は、プロパティと演算対象を比較するという条件式を表します。
・ verifyタグでは、この条件式が正常条件を表すように、項目仕様を記述します。上述の例では、プロパティsampleNumberの値が0
以上が正常条件であり、値が0未満で比較結果が偽となる場合にエラーとして例外を発生します。
・ 演算はプロパティの型によって行われます。例えば演算対象に"#0"と記述した場合、プロパティの型がStringなら文字列の"0"とし
て、プロパティがintなら整数の0として演算が行われます。同様に演算対象に"#true"と記述した場合、boolean型のプロパティと比
較する場合はboolean値のtrueとして演算が行われます。
・ 演算対象に別の項目の値を指定することができます。propertyアトリビュートと同様にoperandアトリビュートにプロパティ名を記述し
ます。同様に、infoやexceptionなどのアトリビュートにもプロパティ名が記述できます。
・ 階層のあるデータBeanを利用する場合には、プロパティ名に"xyz/abc"のような"/"で区切った階層表記ができます。HashMapの場
合も同様に階層表記として処理されます。XMLデータBeanの場合はXPathになります。
・ 文字列定数中、XMLで予約された文字列は、エンティティ記述にする必要があります(例"<"→"&lt;")。また、カンマ(",")は",,"(カンマ
2個)と記述します。
複数項目のエラーを同時にチェックする
errorアトリビュートを利用することで、複数項目のチェックを行うことができます。exceptionアトリビュートを用いた場合は、チェックがエ
ラーになった場合にすぐ例外を発生しますが、errorアトリビュートは継続してチェックを行います。
<verify property="sampleNumber" op="GE" operand="#0" error="#ERR01" info="#0以上" />
error
エラーコードを記述します。文字列定数の場合は、先頭に#を記述します。errorアトリビュートを記述した場合は、エラー情報は蓄
積されるのみで、継続してXMLデータ仕様記述を実行します。
・ exceptionアトリビュートを記述した場合は、チェックの結果がエラーになった時に、すぐにエラー情報をESpecResultExpceptionとし
てスローします。一方、errorアトリビュートを記述した場合は、チェックの結果がエラーになった場合にもその情報を蓄積するのみ
で、XMLデータ仕様記述の処理を継続します。
・ specificationで指定された一組の項目仕様の実行が終了した時点で、errorアトリビュートで蓄積されたエラー情報があれば、
ESpecResultExpceptionがスローされます。発生したエラーの一覧は、ESpecResultExpceptionのgetErrorInfoメソッドにより、
ESpecResultExceptionオブジェクトの集合(java.util.Vector)として取得することができます。
・ exceptionアトリビュートを持つタグのチェックによってESpecResultExpceptionがスローされた場合に、errorアトリビュートで蓄積され
たエラー情報があれば、例外オブジェクトに添付されます。ESpecResultExpceptionのgetErrorInfoメソッドで取得できます。
ビルトインメソッドを利用して項目をチェックする
項目値のチェックを支援するために、文字列長、文字パターンなどをチェックするビルトインメソッドが準備されています。
<verify property="numberString" function="pattern([0-9]+)" op="EQ" operand="#true"
error="#ERR02" info="#数値チェック" />
<verify function="errorcount" op="EQ" operand="#0"
exception="#ERR99" info="#例外あり" />
function
適用するメソッドを指定します。
・ ビルトインメソッドは、関係演算の前にプロパティ値を変換する動作をします。例の1行目では、プロパティnumberStringの値に対し
てメソッド"pattern([0-9]+)"を実行し、その結果を演算対象(operandのtrue)と比較(op="EQ")します。
- 108 -
・ ビルトインメソッドには、以下のものがあります。
形式
動作
int, long, double, boolean, String
指定の型に変換します。
stringLength
文字列長を返します。
enum(n,m,…)
列挙された値n,m,…のいずれかに一致するかどうか判定し
ます。
pattern(re)
正規表現に一致するかどうか判定します。
errorcount
errorアトリビュートによって蓄積されているエラー情報の数を
返します。このメソッドはプロパティ値を無視します(property
アトリビュートを省略可能です)。
ポイント
ビルトインメソッドstringLengthでの補助文字の数え方を初期化パラメタuji.espec.awareOfSupplementaryCharで設定できます。詳細
は“13.3 初期化パラメタ”を参照してください。
注意
ビルトインメソッドpatternについては以下の注意事項があります。
- 正規表現中に補助文字を含めることはできません。
- 文字列を正規表現とマッチさせる際、文字列中に補助文字が含まれている場合は、その補助文字は1文字としては扱われず2
文字として扱われます。
利用者定義メソッドで項目をチェックする
項目値のチェックや変換に、利用者定義メソッドを利用することができます。利用者定義メソッドには、static形式と継承形式がありま
す。
<verify property="prop" function="?mypackage.MyClass.myCheck"
op="EQ" operand="#true" error="#ERR11" info="#myCheck" />
<verify property="prop1,prop2,prop3,#1" function="?localCheck" op="EQ" operand="#0"
error="#ERR12" info="#localCheck" />
function
利用者定義メソッドを指定する場合は、メソッド名の先頭に"?"を付加した文字列を指定します。
・ static形式の利用者定義メソッドを利用する場合は、functionアトリビュートに"?パッケージ名.クラス名.メソッド名"を記述します。メソッ
ドは、任意のクラスのstaticメソッドとして実装します。
・ 継承形式の利用者定義メソッドを利用する場合は、functionアトリビュートに"?メソッド名"を記述します。メソッドは、ESpecValidator
クラスを継承したサブクラス内に実装します。ESpecValidatorクラスの代わりに、作成したサブクラスのインスタンスで、validateメソッ
ドを実行します。
・ propertyアトリビュートで指定したプロパティの値が利用者定義メソッドの引数となります。カンマ(",")で区切ってプロパティを複数
記述することで、複数の値を引数とできます。また、プロパティ値と定数が混在することもできます。引数の数が不定の場合は、Object[]
型の引数とします。
・ 利用者定義メソッドからは、任意の型やオブジェクトを返却できます。
以下は利用者定義メソッドの記述例です。
package mypackage;
public class MyClass {
public static boolean myCheck(String prop) {
....
return true;
- 109 -
}
}
import com.fujitsu.uji.xscript.ESpecValidator;
public class CheckClass extends ESpecValidator {
public CheckClass() {}
public int localCheck(String prop1, int prop2, String prop3, int param) {
// int localCheck(Object[] props) でも可
....
return 0;
}
}
データ項目に値を代入する
データ項目に値を代入する場合は、termタグを利用します。
<!-- sample1を無条件にtargetProp1に代入 -->
<term property="sample1" target="targetProp1" />
<!-- sample2の文字列長が0の場合に文字列"none"をtargetProp2に代入 -->
<term property="sample2" function="stringLength" op="EQ" operand="#0"
value="#none" target="targetProp2" />
<!-- sample3に1を足してtargetProp3に代入 -->
<term property="sample3" op="ADD" operand="#1" target="targetProp3" />
<!-- sample4にmyFormatを適用した結果をtargetProp4に代入 -->
<term property="sample4" valueFunction="?myFormat" target="targetProp4" />
property
データBeanのプロパティ名を指定します。
target
代入先のデータBeanのプロパティ名を指定します。
value
代入する値が演算結果と異なる場合、valueアトリビュートで指定します。
op(関係演算)
opアトリビュートに関係演算を指定した場合は、関係演算の結果が真の場合にのみ代入が実行されます。
op(算術演算)
ADD(加算)、SUB(減算)、MUL(乗算)、DIV(除算)、REM(剰余)をopアトリビュートに指定することで、operandとの演算結果をtarget
に設定します。算術演算の場合はvalueアトリビュートは記述せず、演算結果が代入対象となります。
valueFunction
valueFunctionで指定した利用者定義メソッドで変換などの操作を行った結果をtargetに設定します。利用者定義メソッドの指定方
法は、functionアトリビュートと同じです。
・ ESpecValidatorクラスのvalidateメソッドを呼ぶ時に、データBeanを2つ(bean, targetBean)指定する形式のメソッドを利用した場合は、
targetBeanに指定したデータBeanにデータが書き込まれます。データBeanを1つ指定する形式のメソッドでは、同じデータBeanに
書き戻されます。
validator.validate("spec1", bean);
validator.validate("spec2", bean, targetBean);
// beanの内容に従ってbean自体を更新します
// beanの内容に従ってtargetBeanを更新します
処理の中間結果を一時的に保持する
targetやpropertyで、中間変数を指定することができます。変数名の先頭に"^"を付加して指定します。
<term property="sampleValue" op="ADD" operand="#1" target="^tempValue" />
<term property="^tempValue" op="DIV" operand="#4" target="targetProp" />
・ 中間変数には、"/"で区切った階層表記は利用できません。
- 110 -
11.2.2 項目間にまたがる仕様の記述
条件ブロックを利用する
条件ブロックを利用すると、if文のような制御をすることができます。次の例では、"sampleProp"の値が1の場合に、チェックを行います。
<block property="sampleProp" op="EQ" operand="#1" >
<verify property="sampleNumber" op="GE" operand="#0" exception="#ERR01" info="#0以上" />
<verify property="sampleNumber" op="LE" operand="#10" exception="#ERR01" info="#10以下" />
</block>
条件の記述
前項のタグと同様に、property、function、op、operandの記述で条件を表します。関係演算の結果が真の場合に、ブロック内の処理
が実行されます。
・ blockタグには、elseに相当する機能はありません。逆の条件のblockタグを記述してください。
デシジョンを利用する
XMLデータ仕様記述では、デシジョン表形式の項目関連チェックを記述することができます。
デシジョン表の例
番号
項目名
値
1
便名
101便
2
便名
103便
3
便名
105便
4
便名
107便
5
予約タイプ
一般
6
予約タイプ
スーパーシート
7
予約タイプ
特別割引
エラー条件
デシジョン
×
×
×
×
×
×
×
全席
割引設定
特別割引
設定なし
×
スーパーシート
設定なし
特別割引
設定なし
デシジョン表の見方
表の左半分には、条件が並んでいます。デシジョン部分では、それぞれの列にある"×"でマークした条件が同時に成立する場合
に、最下段に記述したエラーとします。
XMLデータ仕様記述では、以下のように記述します。
<value seq="1" property="flight" op="EQ" operand="#101" />
<value seq="2" property="flight" op="EQ" operand="#103" />
<value seq="3" property="flight" op="EQ" operand="#105" />
<value seq="4" property="flight" op="EQ" operand="#107" />
<value seq="5" property="reservation" op="EQ" operand="#regular" />
<value seq="6" property="reservation" op="EQ" operand="#super" />
<value seq="7" property="reservation" op="EQ" operand="#discount" />
<decision exception="#ERR01" info="#全席割引" >
<status seq="1" require="true" />
<status seq="5" require="true" />
</decision>
<decision exception="#ERR02" info="#特割なし" >
<status seq="2" require="true" />
<status seq="7" require="true" />
</decision>
<decision exception="#ERR03" info="#スーパーなし" >
<status seq="3" require="true" />
<status seq="6" require="true" />
</decision>
- 111 -
<decision exception="#ERR02" info="#特割なし" >
<status seq="4" require="true" />
<status seq="7" require="true" />
</decision>
value
valueタグは、デシジョン表の条件(例では行に相当)を表します。seqアトリビュートで条件の番号を指定します。条件は、property、
function、op、operandで記述します。
decision
decisionタグは、デシジョン表の結果(例ではデシジョンの列)を表します。デシジョンの成立時にエラーにする場合は、exception、
error、infoのアトリビュートで記述します。デシジョンの成立時に項目への代入をする場合は、value、valueFunction、targetで記述し
ます。
status
statusタグは、デシジョンの判定条件を指定します。seqアトリビュートは、valueタグで指定したseqに対応します。requireアトリビュートは
true、falseで、その条件の真偽を指定します。
・ 上記の例では、valueタグを順に評価し、例えばflight(便名)が"101"の場合に、seq"1"の条件が真となります。reservation(予約タイ
プ)が"regular"(一般)の場合に、seq"5"の条件が真となります。
最初のdecisionタグは、statusタグの指定により、seq"1"が真かつseq"5"が真の場合に実行されます。この場合は、exceptionアトリ
ビュートが指定されているため、例外ESpecResultExceptionとなります。
・ statusタグのrequireアトリビュートでは、"true"、"false"をそのまま指定します。operandアトリビュートの定数指定では"#true"と指定し
ますが、statusタグでは"#"を付けないで指定します。
11.2.3 制御の記述
実行する仕様セクションを指定する
データ仕様内のセクションの実行を制御することができます。
<?xml version="1.0" encoding="Shift_JIS" ?>
<eSpec
xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
http://interstage.fujitsu.com/schemas/uji/espec.xsd">
<config>
<version>6.0</version>
</config>
<specification name="sampleCheck" >
<control>
<validate section="sect1" />
<validate section="^nextSection" />
</control>
<section name="sect1" >
...
<term property="#true" value="#sect2" target="^nextSection" />
</section>
<section name="sect2" >
...
</section>
</specification>
</eSpec>
control
実行する仕様セクションを制御する場合は、specificationタグのコンテントの先頭にcontrolタグを記述します。controlタグを記述す
ると、validateタグの指定に従って、仕様セクションが実行されます。controlタグを記述しない場合は、specificationタグのコンテント
の全ての仕様セクションが記述順に実行されます。
validate
validateタグでは、sectionアトリビュートによって実行する仕様セクションを指定します。sectionアトリビュートでは、直接セクション名
- 112 -
を指定する他に、内部変数が利用できます。内部変数は先頭に"^"を付加して指定し、値はtermタグで設定します。この例では、最初の
validateタグでは直接にセクション"sect1"が指定されているため、まず仕様セクション"sect1"を実行します。仕様セクション"sect1"の
中では内部変数"nextSection"に文字列"sect2"を設定していて、2個目のvalidateタグではこれを参照して、次に仕様セクショ
ン"sect2"が実行されます。
section
nameアトリビュートでセクション名を指定します。
・ validateタグのsectionアトリビュートに固定の仕様セクション名を記述する場合は"#"を付けないで記述します。termタグでセクション
名を文字列として指定する場合は、"#"を付けた定数形式で指定します。
データBeanの一部に対して仕様セクションを実行する
データBeanに階層構造がある場合には、下の階層のデータBeanに対して仕様セクションを実行することができます。
<?xml version="1.0" encoding="Shift_JIS" ?>
<eSpec
xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
http://interstage.fujitsu.com/schemas/uji/espec.xsd">
<config>
<version>6.0</version>
</config>
<specification name="sampleCheck" >
<control>
<validate section="sect1" node="subBean" targetNode="subTarget" />
<validate section="sect2" node="*detail" />
</control>
<section name="sect1" >
...
</section>
<section name="sect2" >
...
</section>
</specification>
</eSpec>
validate
validateタグのnodeアトリビュートは、仕様セクションの対象となるデータBeanの階層を指定します。例ではデータBeanのgetSubBean()
で取得できるBeanをチェック対象、代入先データBeanのgetSubTarget()で取得できるBeanを代入先として、仕様セクション"sect1"を
実行します。
nodeアトリビュートの指定の先頭に"*"を付加した場合は、そのオブジェクトの配列の各要素について、仕様セクションを実行しま
す。例では、データBeanのgetDetail()で取得した配列の各要素に対して、仕様セクション"sect2"を実行します。
・ nodeに"*"を記述する場合は、対象となるオブジェクト(例ではgetDetail()で取得されるオブジェクト)が配列かjava.util.Listのいずれ
かである必要があります。
・ nodeに"*"を記述し、実行する仕様セクション中に代入がある場合は、targetNodeも必ず指定する必要があります。
・ node、targetNodeの両方を指定し、かつ配列を利用する場合は、双方に"*"を記述し、双方が配列またはListである必要がありま
す。このとき、配列サイズが異なる場合は、要素数の少ない方の数だけ仕様セクションが実行されます。
XMLデータ仕様記述からの復帰値を設定する
ESpecValidatorのvalidateメソッドの復帰値はresultアトリビュートで設定します。
<term result="#abc" />
result
resultアトリビュートは、validateメソッドの復帰値を設定します。複数記述した場合は、最後に実行されたものが有効になります。例
では、文字列"abc"が復帰値となります。
- 113 -
XMLデータ仕様記述をデバッグする
XMLデータ仕様記述のdebug指定により、実行状況をログに出力することができます。
<?xml version="1.0" encoding="Shift_JIS" ?>
<eSpec
xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
http://interstage.fujitsu.com/schemas/uji/espec.xsd">
<config>
<version>6.0</version>
<debug>trace</debug>
</config>
<specification name="sampleCheck" >
...
</specification>
</eSpec>
debug
debugタグを記述した場合には、XMLデータ仕様記述の動作状況を出力します。"snap"と指定した場合は、1タグで1行のログが出
力されます。"trace"と指定した場合は、プロパティ値や演算の評価状況など詳細なログが出力されます。
・ XMLデータ仕様記述のデバッグログは標準出力に出力されます。実行環境によって実際の出力先は変わります。
・ デバッグログはインタプリタ実行時にのみ出力できます。XMLデータ仕様記述コンパイラを使用してJavaソースに変換する場合
は、debugタグは無視され、ログは出力されません。
11.3 XMLデータ仕様記述の実行
11.3.1 インタプリタ形式での実行
ビジネスクラスからの実行
XMLデータ仕様記述をインタプリタ形式で実行する場合は、標準的には以下のように記述します。
import
import
import
import
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.xscript.ESpecValidator;
com.fujitsu.uji.xscript.ESpecResultException;
com.fujitsu.uji.xscript.ESpecException;
....
public void processOrder(DispatchContext context, OrderBean bean) throws java.lang.Exception {
ESpecValidator validator =
ESpecValidator.getInstance(getClass().getClassLoader());
// (1)
validator.setInfLoader(context.getApplicationProfile().getInfLoader()); // (2)
try {
validator.setXml("checkPrice.xml");
// (3)
validator.validate("checkValue", bean);
// (4)
} catch(ESpecResultException e) {
...
// (5)
} catch(Exception e) {
throw e;
// (6)
}
...
}
(1) ESpecValidatorクラスのインスタンスを作成します。利用者定義メソッド呼び出しのために、ClassLoaderを引数にします。
(2) InfLoaderを指定することで、XMLファイルの読み込み場所を設定ファイルフォルダにします。設定ファイルフォルダは、コマン
ドマップ、リモートマップなどApcoordinatorの定義ファイルを置くフォルダです。例えば、Webアプリケーションの場合はWEB-INF
フォルダです。
- 114 -
(3) setXmlメソッドは、XMLデータ仕様記述のXMLファイルを読み込みます。
(4) validateメソッドによって、XMLデータ仕様記述を実行します。代入先に別のデータBeanを利用する場合には、データBeanを2
個指定する形式のメソッドを利用します。
(5) 項目チェックでエラーになった場合は、ESpecResultExceptionとなります。一般的には、画面にエラー情報を出して再入力の処
理になります。
(6) その他の例外の場合は、XMLデータ仕様の記述や実行環境を確認してください。
・ 継承形式の利用者定義メソッドを利用する場合は、ESpecValidator.getInstance(...)の代わりにESpecValidatorを継承して利用者定
義メソッドを追加したクラスのコンストラクタを利用します。
・ (1)で指定するClassLoaderは、static形式の利用者定義メソッドのクラスをロードする場合に使用します。static形式の利用者定義メ
ソッドを使用しない場合には不要です。また、static形式の利用者定義メソッドを使用しても、実行形態(環境)によっては指定不要
(標準のClassLoaderで動作可能)の場合もありますが、利用者定義メソッドでエラーになる場合には必ず指定してください。
・ XMLファイルをフルパスやInputStreamで指定する場合には、(2)でInfLoaderを指定する必要はありません。この場合は、(3)のsetXml
メソッドの代わりにコンストラクタでXMLファイルを指定することができます。
コマンドスクリプティングからの実行
コマンドスクリプティングからXMLデータ仕様記述を呼び出すことができます。
<?xml version="1.0" encoding="Shift_JIS"?>
<commandMap
xmlns=http://interstage.fujitsu.com/schemas/uji/commandMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/commandMap
http://interstage.fujitsu.com/schemas/uji/commandmap.xsd">
...
<entry bean="sample.OrderBean" verb="process">
<specValidate file="checkPrice.xml" name="checkValue" />
<specSection>
<term property="val1" op="ADD" operand="val2" target="result"/>
</specSection>
...
<catch exception="ESpecResultException">
...
</catch>
</entry>
</commandMap>
・ コマンドスクリプティングのspecValidateタグは、XMLデータ仕様記述を実行します。
・ コマンドスクリプティングのspecSectionタグを利用して、コマンドスクリプティング中に仕様セクションを直接記述することができます。
コマンドスクリプティングの概要については“第10章 コマンドスクリプティング”、詳細については“定義ファイルリファレンス”を参照して
ください。
11.3.2 コンパイル形式での実行
コンパイルの操作
XMLデータ仕様記述コンパイラは、XMLデータ仕様記述のXMLからJavaソースを生成します。XMLデータ仕様記述コンパイラは、
com.fujitsu.uji.xscript.compiler.ESpecCompilerクラスで提供されています。XMLデータ仕様記述コンパイラは、以下のコマンドで実行
します。
java com.fujitsu.uji.xscript.compiler.ESpecCompiler XMLデータ仕様記述ファイル名 生成Javaクラス名
[-p パッケージ名] [-comment:none] [-s 生成Javaクラスの基底クラス名]
[-e 生成Javaソースの文字エンコーディング]
実際の指定例
java com.fujitsu.uji.xscript.compiler.ESpecCompiler carrent.xml Carrentc -p carrent
- 115 -
ESpecCompiler
実行クラスをこのとおり指定します。
XMLデータ仕様記述ファイル名
コンパイル対象のXMLデータ仕様記述のXMLファイルを指定します。
生成Javaクラス名
コンパイル結果のJavaクラス名です。パッケージは含めません。
パッケージ名
コンパイル結果のJavaクラスのパッケージ名です。省略するとパッケージなしになります。
-comment:none
コンパイル結果のJavaソースにコメントを出力したくない場合に指定します。省略するとJavaソースにコメントを出力します。
生成Javaクラスの基底クラス名
継承形式の利用者定義メソッドを利用する場合に、ESpecValidatorクラスを継承して利用者定義メソッドを実装したクラスを指定し
ます。省略すると、ESpecValidatorクラスから直接継承します。
生成Javaソースの文字エンコーディング
生成するJavaソースの文字エンコーディングです。省略するとShift_JISになります。
・ コンパイル実行前に、以下のモジュールをCLASSPATHに設定する必要があります。
- uji.jar(Apcoordinatorインストールフォルダのlib)
- ujiespec.jar(Apcoordinatorインストールフォルダのlib)
- XMLプロセッサの提供するJARファイル(Fujitsu XML プロセッサなどSAX 2.0準拠のもの)
・ コンパイル結果のソースファイルは、カレントフォルダに出力されます。ファイルのインポートを行いプロジェクトにソースファイルを
追加します。
・ XMLデータ仕様記述コンパイラを利用する場合には、以下の制約があります。
- 仕様名、セクション名などの名標は、Javaの命名規約に従う必要があります。
- 仕様名、セクション名などの名標に、補助文字は使用できません。
- Javaのメソッドサイズの制限に注意してください。XMLデータ仕様記述コンパイラは仕様セクション単位で1メソッドとするため、
セクションが大きすぎると、XMLデータ仕様記述コンパイラは正常に終了しても、Javaのコンパイルエラー、実行エラーとなりま
す。1仕様セクション中のタグの数は、100個以内が推奨です。
ポイント
Apcoordinator開発環境をインストールしたフォルダの、binフォルダの中に、ujiespec.batがあります。バッチファイルを作成する場合に
は参考にしてください。
注意
生成したJavaソースをJDK 5.0でコンパイルした場合、以下の警告が表示される場合がありますが、動作には問題ありません。
注:Carrentc.java の操作は、未チェックまたは安全ではありません。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
上記でCarrentc.javaは、生成したJavaソースのファイル名です。
コンパイルしたXMLデータ仕様記述の呼び出し
コンパイルしたXMLデータ仕様記述を利用する場合は、ESpecValidatorのgetInstanceメソッドで、パッケージ名、クラス名を指定しま
す。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.xscript.ESpecValidator;
- 116 -
import com.fujitsu.uji.xscript.ESpecResultException;
import com.fujitsu.uji.xscript.ESpecException;
....
public void processOrder(DispatchContext context, OrderBean bean) throws java.lang.Exception {
ESpecValidator validator =
//ESpecValidator.getInstance(getClass().getClassLoader()); インタプリタ用
ESpecValidator.getInstance(getClass().getClassLoader(), "mypackage.CheckPrice");
validator.setInfLoader(context.getApplicationProfile().getInfLoader());
try {
validator.setXml("checkPrice.xml");
validator.validate("checkValue", bean);
} catch(ESpecResultException e) {
...
} catch(Exception e) {
throw e;
}
...
}
getInstance
引数に、"パッケージ名.クラス名"を指定する文字列を追加します。例ではgetInstanceメソッドの復帰値がmypackage.CheckPriceク
ラスのインスタンスとなります。
・ コンパイル後のクラスでは、setInfLoaderやsetXmlなどのXML関連のメソッドは何も処理をしません。常にコンパイルしたクラスを利
用する場合は、これらのメソッドを呼ぶ必要はありません。
・ コンパイル後のクラスでは、"uji+データ仕様名"のメソッドを生成しています。上記の例で、validator.validate("checkValue", bean)と
いうコードは、((CheckPrice)validator).ujiCheckValue(bean, bean)というコードに書き換えることができます。この場合はデータBeanを
2つ指定(targetBeanを指定)する形式になり、targetBeanがない場合は両方に同じデータBeanを指定する必要があります。
11.3.3 エラー処理
例外クラスからの値の取得
XMLデータ仕様記述で項目のチェックを行いエラーとした場合は、例外ESpecResultExceptionを発生させることでアプリケーションに
通知します。エラーに関連する情報は、XMLデータ仕様記述上に指定し、アプリケーションで例外クラスから情報を取得します。
XMLデータ仕様記述
<verify property="prop1" op="GE" operand="#0" error="#ERR01" info="#prop1" />
<verify property="prop2" op="GE" operand="#0" error="#ERR02" info="#prop2" />
<verify property="prop3" op="LE" operand="#10" error="#ERR03" info="#prop3,#10" />
ビジネスクラスのメソッド
try {
validator.validate("checkValue", bean);
} catch(ESpecResultException e) {
ESpecResultException[] errors = new ESpecResultException[1];
Vector errVec = e.getErrorInfo();
if(errVec == null) {
errors[0] = e;
} else {
errors = (ESpecResultException[])errVec.toArray(errors);
}
for(int i = 0; i < errors.length; i++) {
String status = errors[i].getStatusText();
Object info = errors[i].getInfo();
...
}
...
- 117 -
// (1)
// (2)
// (3)
// (4)
// (5)
} catch(Exception e) {
throw e;
}
(1) 例外クラスのgetErrorInfo()メソッドは、検出したエラーのリストを持っています。データ仕様でerrorアトリビュートを利用しない場
合は必ずnullとなります。例では、処理の共通化のために、ESpecResultExceptionの配列に変換しています。
(2) getErrorInfo()がnullの場合はcatchしたESpecResultExceptionオブジェクト自体がチェック結果のエラーを示します。
(3) getErrorInfo()がnullでない場合は、ESpecResultExceptionの一覧を持つjava.util.Vector形式になっています。例ではtoArrayメ
ソッドで配列に変換しています。
(4) getStatusText()メソッドは、errorまたはexceptionアトリビュートで指定した文字列を返します。この例では"ERR01"が取得できま
す。
(5) getInfo()メソッドは、infoアトリビュートで記述した内容を返します。XMLデータ仕様記述の例の1行目でエラーになった場合に
は、文字列"prop1"が取得できます。3行目では、文字列"prop3"と"10"の配列が取得できます。
リソースファイルを利用したメッセージの編集
リソースファイルの機能と連携することにより、エラーメッセージを編集することができます。
XMLデータ仕様記述
<verify property="prop1" op="GE" operand="#0" error="#ERR01" info="#prop1" />
<verify property="prop2" op="GE" operand="#0" error="#ERR02" info="#prop2" />
<verify property="prop3" op="LE" operand="#10" error="#ERR03" info="#prop3,#10" />
リソースファイル記述
<?xml version="1.0" encoding="Shift_JIS"?>
<ujiResource
xmlns=http://interstage.fujitsu.com/schemas/uji/ujiResource
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/ujiResource
http://interstage.fujitsu.com/schemas/uji/ujiresource.xsd">
<config>
<version>5.1</version>
</config>
<text id="#ERR01">項目'{0}'は0以上に設定してください</text>
<text id="#ERR02">項目'{0}'の指定が誤っています</text>
<text id="#ERR03">項目'{0}'は{1}以下でなければなりません</text>
</ujiResource>
ビジネスクラスのメソッド
try {
validator.validate("checkValue", bean);
} catch(ESpecResultException e) {
ESpecResultException[] errors = new ESpecResultException[1];
Vector errVec = e.getErrorInfo();
if(errVec == null) {
errors[0] = e;
} else {
errors = (ESpecResultException[])errVec.toArray(errors);
}
for(int i = 0; i < errors.length; i++) {
String message = UjiResource.getMessage(context, errors[i]);
...
}
...
} catch(Exception e) {
throw e;
}
- 118 -
getMessage
UjiResourceクラスのgetMessageメソッドで、リソースファイルの文字列とESpecResultExceptionからメッセージを作成します。errorまたは
exceptionの値がリソースのidに、infoはメッセージ編集に利用されます。この例では、"項目'prop1'は0以上に設定してくださ
い"、"項目'prop3'は10以下でなければなりません"というメッセージが生成されます。
- 119 -
第12章 バックエンドとの連携
12.1 概要
バックエンド連携サービスライブラリでは、共通なインタフェースによるバックシステムとの連携を行うライブラリを提供します。Apcoordinator
で作成するビジネスクラスより、バックエンド連携サービスライブラリのインタフェースを呼び出すことで、バックシステムのアプリケーショ
ンを呼び出せます。
バックエンド連携サービスライブラリを使用するには、ご使用になるアプリケーションサーバの説明書に従って、EJB、JMS、および、呼
び出すサービスに必要な設定を行ってください。
また、バックエンド連携サービスライブラリを使用する際に必要なソフトウェアについては、“13.2 実行時に必要なソフトウェア”を参照し
てください。
同期または非同期によるアプリケーションの呼び出し
アプリケーションの呼び出しは、次の呼び出しに分類できます。
・ 同期:アプリケーションが終了するまで、呼び出したプログラムが待ち合わせます。
・ 非同期:呼び出したプログラムと、呼び出されたプログラムが並行して処理を行います。
バックエンド連携サービスライブラリでは、定義を行なうことで、同じアプリケーションを同期、または、非同期により呼び出せます。呼び
出し方法には、次の方法があります。
呼び出し方法
同期
非同期
動作
直接呼び出し
直接呼び出し、処理の終了後に、呼び出しメソッドが復帰します。
同期変換
イベントサービスにより、呼び出しの要求を行い、呼び出した処理の終了を待ち合わせ、呼び出
しメソッドが復帰します。
突き放し
イベントサービスにより、呼び出しの要求を行い、直ちに呼び出しメソッドは復帰します。
突き合せ
イベントサービスにより、呼び出しの要求を行い、直ちに呼び出しメソッドは復帰します。呼び出
した処理結果をあとから参照できます。
共通インタフェースで異なるアプリケーションの呼び出し
バックエンド連携サービスライブラリでは、異なるバックシステムのアプリケーションを同じインタフェースにより呼び出せます。アプリケー
ションの呼び出しには、次のサービスが利用できます。
・ CORBAを呼び出す、CORBAサービスアダプタ
- 120 -
・ メッセージを送信する、メッセージ送信サービスアダプタ
・ コマンドの実行を行う、コマンド実行サービスアダプタ
・ 利用者が作成する、利用者作成サービスアダプタ
12.1.1 構成
バックエンド連携サービスライブラリの構成について説明します。バックエンド連携サービスライブラリが提供するモジュールは、図中で
は、アダプタ、サービスアダプタ、イベント処理Beanです。
アダプタ
CORBA ア プ リ ケ ー シ ョ ン や 、 利 用 者 が 作 成 し た ア プ リ ケ ー シ ョ ン を 呼 び 出 す 連 携 サ ー ビ ス に お け る 共 通 な イ ン タ フ ェ ー ス
(AsyncServiceAdapterインタフェース)です。
Apcoordinatorアプリケーションのビジネスクラスより、このインタフェースを実装した各種サービスアダプタを利用することにより、同一イ
ンタフェースでバックエンド連携サービスライブラリの利用が行えます。
AsyncServiceAdapterインタフェースを実装した各種サービスアダプタは、AsyncServiceFactoryインタフェースにより取得します。
サービスアダプタ
AsyncServiceAdapterインタフェースを実装したサービスを実行するクラスです。サービスアダプタには、CORBAアプリケーションを呼
び出す、CORBAサービスアダプタや、利用者がインタフェースを実装したサービスアダプタなどがあります。
イベント処理 Bean
イベントサービスを利用した同期呼び出し、および、非同期呼び出しを行う場合に、サービスアダプタの呼び出し制御を行うEJB
(AsyncServiceMessageDrivenBeanクラス)です。
Apcoordinatorアプリケーションのビジネスクラスにて、アダプタを利用しアプリケーションの呼び出し要求を行うと、イベントサービスを経
由し、イベント処理Beanへ呼び出し要求が通知されます。イベント処理Beanでは、呼び出し要求に従い処理を行います。
asyncマップ
利用するサービスアダプタやイベントサービス、および、サービスの呼び出し方法といったバックエンド連携サービスライブラリの定義
ファイルです。定義ファイルは、asyncmap.xmlというファイル名で、所定の場所へ格納します。
- 121 -
イベントサービス
バックエンド連携サービスライブラリでは、J2EEで規定されたJMS APIを使用してイベントサービスを利用しています。JMSについての
詳細は、Interstageオンラインマニュアルの J2EE ユーザーズガイド を参照してください。
12.1.2 アプリケーションの呼び出し
アプリケーションの呼び出し方法には、大きく分けて同期呼び出しと非同期呼び出しの2つの方法があります。
同期呼び出し
同期による呼び出しを行う場合の構成を図示します。
同期呼び出しでは、呼び出しの要求、復帰と、呼び出しを行ったアプリケーションの実行、終了が同期します。呼び出しを要求するメ
ソッドが復帰すると、アプリケーション処理も終了しています。結果を返すアプリケーションを呼び出した場合には、結果取得メソッドに
て処理結果を取得できます。
非同期呼び出し
非同期による呼び出しを行う場合の構成を図示します。
- 122 -
非同期呼び出しでは、呼び出しの要求、復帰と、呼び出しを行ったアプリケーションの実行、終了が必ずしも同じにはなりません。呼び
出しの要求を行うと要求メソッドは直ちに復帰します。イベント処理Beanでは、呼び出し要求を受けアプリケーションの実行を行いま
す。
突き放し呼び出しでは、アプリケーションの処理結果や処理の過程で発生する問題をビジネスクラスで受け取ることはできません。ま
た、同期呼び出しと同様に処理結果を取得できます。また、リスナを利用することで結果の通知を受け取ることも可能です。
注意
同期変換による呼び出しを行う場合、同じオブジェクトにより、並行した処理の実行を行うことはできません。
アダプタによる処理結果の取得は、実行したアプリケーションが結果を返す場合にのみ取得することが可能です。
呼び出したアプリケーションの処理結果は、アプリケーションの呼び出し方法により、参照可能となるタイミングが異なります。
12.2 サービスの利用
バックエンド連携サービスライブラリの利用には、次のものを作成します。
・ プログラミング
AsyncServiceFactoryインタフェース、AsyncServiceAdapterインタフェースといったインタフェースを利用し、サービスを利用するプ
ログラムの開発を行います。
・ 定義ファイル
サービスを定義したasyncマップを用意します。
12.2.1 プログラミング
AsyncServiceFactoryインタフェース、AsyncServiceAdapterインタフェースといったインタフェースを利用します。各インタフェースを利
用し、異なるアプリケーションを呼び出すサービスの利用が可能となります。
AsyncServiceFactoryインタフェース、AsyncServiceAdapterインタフェースの利用例を示します。
import
import
import
import
com.fujitsu.uji.async.AsyncServiceFactory;
com.fujitsu.uji.async.AsyncServiceAdapter;
com.fujitsu.uji.async.AsyncServiceID;
com.fujitsu.uji.async.AsyncServiceFactory;
- 123 -
public Object doSomething(DispatchContext context, DataBean dataBean){
try {
// 1)ファクトリを取得する。
AsyncServiceFactory factory
= (AsyncServiceFactory)InitialFactory.createFactory(context, InitialFactory.ASYNCSERVICEFACTORY);
// 2)サービスを提供するアダプタインスタンスを生成する。
AsyncServiceAdapter adapter = factory.createAsyncServiceAdapter("MyCorbaService");
// 3)サービスを開始する。
adapter.begin(null);
// 4)メソッドを呼び出す。
AsyncServiceID id0 = (AsyncServiceID)adapter.execute(null, "getType");
Object [] data = new Object[1];
data[0] = Integer.valueOf(1);
AsyncServiceID id1 = (AsyncServiceID)adapter.execute(data, "getPAddress");
// 5)結果を参照する。
Object result0 = adapter.getResult(id0);
Object result1 = adapter.getResult(id1);
// 結果の処理
if( result0 != null && result0 instanceOf AsyncServiceExecuteResult )
String str = ((AsyncServiceExecuteResult)result0).getValue();
...
}catch(AsyncServiceException ex) {
...
}finally{
try{
// 6)サービスを終了する。
adapter.end();
}catch(Exception ex){
...
}
}
}
処理の手順は以下のようになります。
1. InitialFactoryクラスのcreateFactoryメソッドでAsyncServiceFactoryインタフェースを取得します。
2. AsyncServiceFactoryインタフェースのcreateAsyncServiceAdapterメソッドへasyncマップ(定義ファイル)に記載したサービス名を
指定して、AsyncServiceAdapterインタフェースを取得します。
3. AsyncServiceAdapterインタフェースのbeginメソッドへ必要なパラメタを指定しサービスの初期化を行います。
4. AsyncServiceAdapterインタフェースのexecuteメソッドへ必要なパラメタを指定しサービスを呼び出します。
5. AsyncServiceAdapterインタフェースのgetResultメソッドへexecuteメソッドの戻り値をパラメタに指定しサービスの処理結果を取得
します。処理結果は、利用するサービスにより、返却されるオブジェクトが異なります。
6. AsyncServiceAdapterインタフェースのendメソッドの呼び出しサービスを終了します。
上記の手順3、および、手順4で指定するパラメタは、利用するサービスアダプタにより、異なります。詳しくは、利用可能なアダプタの
説明を参照してください。
ポイント
同期・非同期といった、アプリケーションの呼び出し方法をプログラムで指定することはありません。
アプリケーションの呼び出し方法は、asyncマップの定義により決まります。
注意
アプリケーションの呼び出し方法により、サービス要求(executeメソッド)の復帰タイミング、結果が返却されるタイミングが異なります。
AsyncServiceAdapter#getResultメソッドがnullを返却しても、AsyncServiceAdapter#hasResultメソッドがtrueを返す場合があります。これ
は、結果が返却されない、または、結果nullが返却された場合などに発生します。
- 124 -
結果を削除するには、次の方法があります。
・ removeResultメソッドの呼び出し
・ removeAllResultsメソッドの呼び出し
・ endメソッドの呼び出し
・ 通知されたAsyncServiceEventのconsumeメソッドの呼び出し
結果を削除したあとでは、getResultメソッドなどにより、結果を取得することはできません。
処理中を示すAsyncServiceUnreceivedResultを削除したあとに、呼び出した処理の結果を受け取ることはできません。また、処理中を示す
AsyncServiceUnreceivedResultを削除しても要求した処理を取り消すことにはなりません。
12.2.2 定義ファイル
AsyncServiceFactoryインタフェースで生成するサービスの情報、および、サービスの動作環境をasyncマップへ定義します。
asyncマップの定義例を示します。
<?xml version="1.0" encoding="Shift_JIS"?>
<asyncMap
xmlns=http://interstage.fujitsu.com/schemas/uji/asyncMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/asyncMap
http://interstage.fujitsu.com/schemas/uji/asyncmap.xsd">
<config>
<version>5.1</version>
</config>
<!-- CORBAアプリケーションを呼び出すサービス定義 -->
<corba name="MyCorbaService" jndi="MyCorbaJndi" helper="mypkg.MyCorbaServiceHelper">
<method name="getPAddress" methodName="getPrivateAddress">
<type>int</type>
</method>
<method name="getType" methodName="getType"/>
<method name="getName" methodName="getName">
<!-- 呼び出すメソッドの引数を順番に定義 -->
<type>java.lang.String</type>
<type>int</type>
<type>boolean</type>
</method>
</corba>
<!-- 利用者が作成したサービスアダプタを呼び出すサービス定義 -->
<!-- 上から、直接呼び出し、突き合せの各呼び出し方法を定義 -->
<user name="MyAppcService" class="test.MyAppService"/>
<user name="MyASynService" class="test.MyAppService" jms="MyJmsAsyn"/>
<!-- 利用するイベントサービスの定義 -->
<jms name="MyJmsASyn" transaction="false" synchronously="async" jndi="MyJndi"
queueFactory="TestQueueFactory" queue="TestQueue"
topicFactory="TestTopicFactory " topic="TestTopic" />
<!-- JNDIで参照するオブジェクト名の定義 -->
<jndi name="TestQueueFactory" objectName="java:comp/env/jms/TestQueueFactory"/>
<jndi name="TestQueue" objectName="java:comp/env/jms/TestQueue"/>
<jndi name="TestTopicFactory" objectName="java:comp/env/jms/TestTopicFactory"/>
<jndi name="TestTopic" objectName="java:comp/env/jms/TestTopic"/>
<jms name="MyJms" transaction="false" synchronously="sync" jndi="MyJndi"
queueFactory="TestQueueFactory" queue="TestQueue"
topicFactory="TestTopicFactory " topic="TestTopic" />
<!-- イベントサービスを参照するコンテキストの初期化情報 -->
<jndi name="MyJndi" objectName="java:comp/env/jms/MyJndi">
<param name="java.naming.factory.initial"
value="com.fujitsu.interstage.j2ee.jndi.InitialContextFactoryForClient" />
</jndi>
- 125 -
<jndi name="MyCorbaJndi" objectName="corbaAppPkg::MyCorbaService"/>
</asyncMap>
asyncマップへは、バックエンド連携サービスライブラリの動作環境を定義します。
asyncマップに記載するタグの詳細は、asyncマップリファレンスを参照してください。asyncマップは、利用する環境により適切な場所へ
配置してください。配置する場所については、“12.4 バックエンド連携の実行環境の設定”を参照してください。
12.3 利用可能なサービスアダプタ
サービスアダプタは、AsyncServiceFactory#createAsyncServiceAdapterメソッドにより生成します。
AsyncServiceFactory#createAsyncServiceAdapterメソッドへ指定された文字列をサービス名と言います。指定されたサービス名で、async
マップのname属性を参照し、一致するタグのサービスアダプタオブジェクトを生成します。利用可能なサービスアダプタには、次のもの
があります。
12.3.1 CORBAサービスアダプタ
CORBAサービスと連携することができるサービスアダプタです。
AsyncServiceFactoryインタフェースで指定したサービス名が、asyncマップで定義したcorbaタグのname属性と一致する場合に、CORBA
サービスを呼び出せるCORBAサービスアダプタを生成します。
注意
連携を行うCORBAサービスにより、コード変換処理や、連携を行う上の注意が必要な場合があります。
詳しくは、次のInterstageオンラインマニュアルを参照してください。
・ Interstage Application Server OLTPサーバ運用ガイド
・ Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
次は、MyCorbaService.idlというIDLの定義例です。
module mypkg {
interface MyCorbaService {
string getPrivateAddress(in long target);
long getType();
string exercise(in string str1, inout string str2, out string str3);
};
};
次は、MyCorbaServiceというサービス名のCORBAサービスを直接呼び出しするasyncマップの定義例です。
<asyncMap>
<corba name="MyCorbaService" jndi="MyCorbaJndi" helper="mypkg.MyCorbaServiceHelper">
<method name="getPAddress" methodName="getPrivateAddress">
<type>int</type>
</method>
<method name="getType" methodName="getType"/>
<method name="exercise" methodName=" exercise">
<type mode="in">java.lang.String</type>
<type mode="inout">org.omg.CORBA.StringHolder</type>
<type mode="out">org.omg.CORBA.StringHolder</type>
</method>
</corba>
<jndi name="MyCorbaJndi" objectName="corbaAppPkg::MyCorbaService"/>
次は、上記asyncマップのサービスを利用するプログラム例です。
AsyncServiceFactory factory
= (AsyncServiceFactory)InitialFactory.createFactory(context, InitialFactory.ASYNCSERVICEFACTORY);
- 126 -
// name属性が"MyCorbaService"のcorbaタグを参照しサービスアダプタインスタンスを生成する。
AsyncServiceAdapter adapter = factory.createAsyncServiceAdapter("MyCorbaService");
adapter.begin(null);
// corbaタグのコンテントより、methodタグで定義されているgetTypeメソッドを呼び出す。
AsyncServiceID id0 = adapter.execute(null, "getType");
// 結果を参照する。
Object result0 = adapter.getResult(id0);
Integer type=null;
if( result0 != null && result0 instanceOf AsyncServiceCORBAResult )
// 結果は呼び出したCORBAアプリケーションが返すオブジェクトです。
type = (Integer)((AsyncServiceCORBAResult)result0).getValue();
...
beginメソッド
本メソッドで呼び出すCORBAアプリケーションオブジェクトを生成します。
引数へ初期化済みのorg.omg.CORBA.ORBオブジェクトを指定します。nullを指定した場合には、アプリケーションに共通なORBを利
用します。
executeメソッド
CORBAアプリケーションを実行します。
以下にexecuteメソッドの例を示します。
// 引数のない getType メソッドを実行する場合
AsyncServiceID id0 = adapter.execute(null, "getType");
// inモードのint型引数を渡す getPAdressメソッドを実行する場合
Object [] data1 = new Object[1];
data1[0] = Integer.valueOf(1);
AsyncServiceID id1 = adapter.execute(data1, "getPAddress");
// 各モードの引数を渡す exercise メソッドを実行する場合
Object [] data2 = new Object[3];
data2[0] = "hello ";
data2[1] = "world"; // StringHolderクラスのvalue変数に渡す値を指定する
data2[2] = null; // outモードの引数はnullを指定する
AsyncServiceID id2 = adapter.execute(data2, " exercise");
第一引数(dataパラメタ)
メソッドへ指定するパラメタを配列の先頭より、パラメタの順に値を格納します。
プリミティブ型のパラメタを指定する場合は、プリミティブな型をラップするオブジェクトにより指定します。
inoutモードのパラメタを指定する場合は、ホルダークラスのvalue変数に渡す値を指定します。また、outモードのパラメタを指定す
る場合はnullを指定します。
第二引数(parameterパラメタ)
呼び出すメソッドを指定します。
getResultメソッド
CORBAアプリケーションの結果を参照します。
以下にgetResultメソッドの利用例を示します。
// int型を返す getTypeメソッドの実行結果を参照する場合
Object result0 = adapter.getResult(id0);
Integer type = null;
if( result0 != null && result0 instanceOf AsyncServiceCORBAResult ) {
// 結果は呼び出したCORBAアプリケーションが返すオブジェクトです。
type = (Integer)((AsyncServiceCORBAResult)result0).getValue();
}
// 各モードのパラメタを渡す exercise メソッドのパラメタを参照する場合
- 127 -
Object result2 = adapter.getResult(id2);
String str0 = null, str1 = null;
if( result2 != null && result2 instanceOf AsyncServiceCORBAResult ){
// getArgsメソッドはパラメタの値を宣言順に格納した配列を返します。
args = ((AsyncServiceCORBAResult)result0).getArgs();
str0 = (String)args[0]; // 1番目のパラメタを参照(inモードのためnull)
str1 = (String)args[1]; // 2番目のパラメタを参照
str2 = (String)args[2]; // 3番目のパラメタを参照
}
メソッドの戻り値を参照するには、AsyncServiceCORBAResultクラスのgetValueメソッドを使用します。
戻り値がvoid型の場合はnullを返します。また、値がプリミティブな型の場合、プリミティブな型をラップするオブジェクトを返します。
メソッドのパラメタの値を参照するには、getArgsメソッドを使用します。
getArgsメソッドはパラメタの宣言順に値を格納した配列を返します。inモードの場合は、nullが格納されます。inoutモードまたはoutモー
ドの場合は、ホルダークラスに格納されたvalue変数の値が格納されます。また、値がプリミティブな型の場合、プリミティブな型をラップ
するオブジェクトが格納されます。
getArgメソッドで特定のパラメタの値のみを参照することもできます。
結果は、サービスの呼び出し方法、および、状態により異なります。
・ 直接呼出し
AsyncServiceCORBAResultが返ります。
・ 同期変換
AsyncServiceCORBAResultが返ります。
・ 突き放し
nullが返ります。
・ 突き合せ(結果待ち合わせ中)
AsyncServiceUnreceivedResultが返ります。
・ 突き合せ(結果受け取り後)
AsyncServiceCORBAResultが返ります。
AsyncServiceResultListener
突き合せによる呼び出しを行なう場合に、AsyncServiceResultListenerを設定することにより、結果を受け取ることが可能です。
listener へ は 、 AsyncServiceResultEvent が 通 知 さ れ ま す 。 通 知 イ ベ ン ト の getValue メ ソ ッ ド に よ り 得 ら れ る オ ブ ジ ェ ク ト は 、
AsyncServiceCORBAResultです。
プリミティブな型をラップするオブジェクト
executeメソッドや、getResultメソッドで利用するプリミティブな型と、プリミティブ型をラップするオブジェクトは、次のように対応します。
ラッピングするオブジェクト
Javaのプリミティブ型
boolean
java.lang.Boolean
byte
java.lang.Byte
char
java.lang.Character
double
java.lang.Double
float
java.lang.Float
int
java.lang.Integer
long
java.lang.Long
short
java.lang.Short
- 128 -
12.3.2 メッセージ送信サービスアダプタ
イベントサービスPoint-To-Pointモデルにより、メッセージを送信する機能を提供します。送信メッセージは、javax.jms.BytesMessage
の本文とし、UTF-8エンコーディング形式を使用してバイトメッセージを送信します。
AsyncServiceFactoryインタフェースで指定したサービス名が、asyncマップで定義したpostMsgタグのname属性と一致する場合に、メッ
セージ送信サービスアダプタを生成します。本サービスアダプタでは、直接呼び出しのみを行うことができます。
注意
イベントサービスについての詳細は、次のInterstageオンラインマニュアルを参照してください。
・ Interstage Application Server アプリケーション作成ガイド(イベントサービス編)
次は、MyPostMsgというサービス名のアダプタを直接呼び出しするasyncマップの定義例です。
<postMsg name="MyPostMsg" transaction="false" jndi="MyJndi"
queueFactory="PostQueueFactory" queue="PostQueue" />
次は、上記asyncマップのサービスを利用するプログラム例です。
AsyncServiceFactory factory
= (AsyncServiceFactory)InitialFactory.createFactory(context, InitialFactory.ASYNCSERVICEFACTORY);
// postMsgタグのname属性がMyPostMsgの環境を参照しサービスアダプタインスタンスを生成する。
AsyncServiceAdapter adapter = factory.createAsyncServiceAdapter("MyPostMsg");
adapter.begin(null);
// executeメソッドを呼び出す。
adapter.execute("送信メッセージ", null);
...
beginメソッド
サービスアダプタを初期化します。
引数へはnullを指定します。
executeメソッド
指定の文字列を送信します。
第一引数へは送信する文字列を指定します。
第二引数へはnullを指定します。
getResultメソッド
常にnullを返します。
MQ連携サービスの利用
メッセージの送信先をMQ連携サービスで使用するメッセージキューとすることで、MQ連携サービスのメッセージ送信機能を利用する
ことが可能です。MQ連携サービスの詳細は、MQ連携サービス 説明書を参照してください。
以下に、MQ連携サービスを利用する場合の構成を図示します。
- 129 -
12.3.3 コマンド実行サービスアダプタ
指定のコマンドを実行するサービスアダプタです。
AsyncServiceFactoryインタフェースで指定したサービス名が、asyncマップで定義したcommanderタグのname属性と一致する場合に、
コマンド実行サービスアダプタを生成します。本サービスアダプタで実行するコマンドは、独立したプロセスにて実行します。本サービ
スアダプタでは、直接呼び出し、および、突き放しによる呼び出しを行うことができます。
次は、MyCommandというサービス名のアダプタを直接呼び出しするasyncマップの定義例です。
<asyncMap>
<commander name="MyCommand" />
次は、上記asyncマップのサービスを利用するプログラム例です。
AsyncServiceFactory factory
= (AsyncServiceFactory)InitialFactory.createFactory(context, InitialFactory.ASYNCSERVICEFACTORY);
// commanderタグのname属性がMyCommandの環境を参照しサービスアダプタインスタンスを生成する。
AsyncServiceAdapter adapter = factory.createAsyncServiceAdapter("MyCommand");
adapter.begin(null);
String [] command = {"myCommand", "para1", "para2"};
// executeメソッドを呼び出す。
adapter.execute(command, null);
...
beginメソッド
サービスアダプタを初期化します。
引数へはnullを指定します。
executeメソッド
指定されたコマンドを実行します。
コマンドは、java.lang.Runtimeクラスのexecメソッドを利用して実行します。
第一引数へは実行するコマンドを指定します。
コマンドの指定がjava.lang.Stringクラス、または、java.lang.Stringクラスの配列以外が指定された場合には、指定クラスのtoStringメソッ
ドの結果をコマンドとして実行します。
第二引数へはnullを指定します。
getResultメソッド
AsyncServiceExecuteResultを返します。
実行結果を参照するには、AsyncServiceExecuteResultクラスのgetValueメソッドを使用します。
実行結果には、実行したコマンドプロセスの標準出力ストリーム、または、エラー出力ストリームから取得した値を返します。
- 130 -
Systemwalker OperationMGRの利用
Systemwalker OperationMGRで提供されているコマンドを指定することにより、ジョブの投入を行うなど、Systemwalker OperationMGR
の機能を利用することが可能となります。
次は、ジョブファイルにjob.bat、そのファイルに渡すパラメタとして0822および1000を指定するプログラム例です。
AsyncServiceFactory factory
= (AsyncServiceFactory)InitialFactory.createFactory(context, InitialFactory.ASYNCSERVICEFACTORY);
// commanderタグのname属性がMyCommandの環境を参照しサービスアダプタインスタンスを生成する。
AsyncServiceAdapter adapter = factory.createAsyncServiceAdapter("MyCommand");
adapter.begin(null);
String [] command = {"qsub", "job.bat", "0822", "1000"};
// executeメソッドを呼び出す。
adapter.execute(command, null);
...
以下に、Systemwalker OperationMGRを利用する場合の構成を図示します。
12.3.4 利用者作成サービスアダプタ
AsyncServiceAdapterインタフェースを実装し、サービスアダプタを作成できます。
AsyncServiceFactoryインタフェースで指定したサービス名が、asyncマップで定義したuserタグのname属性と一致する場合に、利用者
が作成した指定のサービスアダプタを生成します。
次は、MyAppcServiceというサービス名のアダプタを直接呼び出しするasyncマップの定義例です。
<asyncMap>
<user name="MyAppcService" class="test.MyAppService"/>
次は、test.MyAppServiceクラスの定義例です。
package test;
import com.fujitsu.uji.async.*;
public class MyAppService implements AsyncServiceAdapter{
public MyAppService(){
...
}
public void begin(Object parameter) throws AsyncServiceException{
...
- 131 -
}
public AsyncServiceID execute(Object data, Object parameter) throws AsyncServiceException{
...
}
public boolean hasResult(AsyncServiceID id) throws AsyncServiceException{
...
}
public Object getResult(AsyncServiceID id) throws AsyncServiceException{
...
}
public Object removeResult(AsyncServiceID id) throws AsyncServiceException{
...
}
...
次は、上記のサービスを利用するプログラム例です。
AsyncServiceFactory factory
= (AsyncServiceFactory)InitialFactory.createFactory(context, InitialFactory.ASYNCSERVICEFACTORY);
// userタグのname属性がMyAppcServiceの環境を参照しサービスアダプタインスタンスを生成する。
AsyncServiceAdapter adapter = factory.createAsyncServiceAdapter("MyAppcService");
adapter.begin(null);
// executeメソッドを呼び出す。
adapter.execute(null, null);
...
beginメソッド
本メソッドで呼び出す利用者アプリケーションの初期化を行います。
executeメソッド
利用者アプリケーションを実行します。
引数へは呼び出すアプリケーションで利用するパラメタを指定してください。
getResultメソッド
利用者アプリケーションの結果を参照します。
受け取る結果は、利用者が作成したアダプタの実装に依存します。
結果は、アダプタの実装、サービスの呼び出し方法、および、状態により異なります。
・ 直接呼出し
利用者の実装した結果が返ります。
・ 同期変換
利用者の実装した結果が返ります。
・ 突き放し
nullが返ります。
・ 突き合せ(結果待ち合わせ中)
AsyncServiceUnreceivedResultが返ります。
・ 突き合せ(結果受け取り後)
利用者の実装した結果が返ります。
AsyncServiceResultListener
突き合せによる呼び出しを行なう場合に、AsyncServiceResultListenerを設定することにより、結果を受け取ることが可能です。
listenerへは、AsyncServiceResultEventが通知されます。通知イベントのgetValueメソッドにより得られるオブジェクトは、利用者の実装した
getResultメソッドが返すオブジェクトが返ります。
- 132 -
12.4 バックエンド連携の実行環境の設定
バックエンド連携サービスライブラリを利用するには、次の利用環境を設定する必要があります。
・ Apcoordinatorビジネスクラスで呼び出すサービスアプタのアダプタ利用環境
・ サービスの呼び出し要求で利用するイベントサービス環境
・ 呼び出し要求イベントを処理するイベント処理Beanの利用環境
以降では、バックエンド連携サービスライブラリを利用する上で必要なInterstageの環境設定について概略を説明します。Interstageの
環境設定についての詳細は、Interstageオンラインマニュアルの J2EE ユーザーズガイド を参照してください。
12.4.1 サービスアダプタ利用環境
Apcoordinatorのビジネスクラスで、アダプタインタフェースを利用する上で必要な環境設定について示します。
実行時のクラスパス設定
Apcoordinatorが提供する以下のライブラリが参照できるようにクラスパスを設定します。
・ uji.jar
・ ujiasync.jar
利用するサービスにより、次のクラスパスを設定します。
・ 直接呼出しの場合には、呼び出すサービスに必要な環境を設定します。
・ イベントサービスを利用した呼び出しを行なう場合には、JMS運用環境を設定します。
・ CORBAサービスアダプタを利用する場合には、CORBAアプリケーションのスタブ・スケルトンクラスへのクラスパスを設定します。
・ 利用者が作成したサービスアダプタクラスを利用する場合には、作成したサービスアダプタクラスへのクラスパスを設定します。
定義ファイルの配置
作成したasyncマップを配置します。
利用するアプリケーションにより、以下のように配置します。
・ Webアプリケーションより利用する場合
Webアプリケーションの情報を配置するためのWEB-INFフォルダ下に配置します。
・ EJBアプリケーションより利用する場合
EJBアプリケーションの情報を配置するためのフォルダ下に配置します。
配置するフォルダ名は、SessionBean名_inf で、利用するEJBアプリケーションごとに異なります。
12.4.2 イベントサービス環境
バックエンド連携サービスライブラリで利用するイベントサービスの環境設定について示します。
設定する環境
イベントサービスの環境設定では、次のJMS環境の定義を行います。
・ Point-To-Pointメッセージングモデル環境
キューと、JMS 管理オブジェクト(ファクトリ)を定義します。
この環境は、サービスアダプタから、イベント処理Beanへサービスの呼び出し要求を行なう場合に利用します。
・ Publish/Subscribeメッセージングモデル環境
トピックと、JMS 管理オブジェクト(ファクトリ)を定義します。
この環境は、イベント処理Beanから、サービスアダプタが結果を受け取る場合に利用します。
- 133 -
イベントサービスの設定
Interstageのイベントサービスが提供するコマンドで環境を設定します。
・ イベントチャネルの生成
以下のモデルで使用するイベントチャネルを生成します。
- Point-To-Pointメッセージングモデル
- Publish/Subscribeメッセージングモデル
・ JMS運用環境の設定
JNDI環境定義のほか、Publish/Subscribe、Point-To-Pointそれぞれのメッセージングモデル用に、以下の定義を行います。
- ConnectionFactory定義の登録
- Destination定義の登録
12.4.3 イベント処理Bean利用環境
サービスアダプタからのイベントサービスを利用し呼び出し要求を処理するイベント処理Beanの環境設定について示します。
ワークユニット定義の登録
ワークユニットを作成します。ワークユニットを作成するには、Interstage管理コンソールを使用します。
ワークユニットの設定では、クラスパスに、全てのパスを含んだ次のオブジェクトの指定を行ってください。
・ uji.jar
・ ujiasync.jar
呼び出すサービスに必要な環境、および、JMS運用環境も合わせて設定してください。
また、利用者が作成したサービスアダプタクラスを利用する場合には、作成したサービスアダプタクラスへのクラスパスを設定します。
イベント処理Beanの配備
Interstage管理コンソールを使用してイベント処理Beanを配備します。配備対象のファイルとしてujiasyncwu.jar を指定します。
配備の実行により、以下の作業が完了します。
・ サーバ用のコードとクライアント配布物の生成
・ Interstageへのインストール
デプロイメント記述の設定値をカスタマイズ
Interstage管理コンソールを使用して、デプロイメント記述(実行環境定義)の設定値をカスタマイズします。
ワークユニットに配備されているアプリケーションからイベント処理Beanを選択し、[アプリケーション環境定義]タブの画面で次の設定値
をカスタマイズします。
・ JMSコネクションファクトリ名
キューコネクションファクトリを選択します。
・ Destination名
キューを選択します。
その他の定義項目は必要に応じて設定してください。
- 134 -
第13章 実行環境の設定
Apcoordinatorで作成したアプリケーションの実行環境の設定方法は、各アプリケーション種別の説明を参照してください。
・ Webアプリケーション: 第22章 Webアプリケーションの実行環境の設定
・ EJBセションBean: 第26章 セションBeanの実行環境の設定
・ 電子フォームアプリケーション: 第31章 電子フォームアプリケーションの実行環境の設定
この章では、Apcoordinatorに共通の以下の事項について説明します。
・ アプリケーションに必要なApcoordinatorのファイル
・ 実行時に必要なソフトウェア
・ 初期化パラメタ
13.1 アプリケーションに必要なApcoordinatorのファイル
各種別のアプリケーションに必要となるJARファイルは以下のとおりです。
アプリケーション種別
必要なJARファイル
Webアプリケーション
uji.jar
EJBセションBean
uji.jar, ujiejb.jar
電子フォームアプリケーション
uji.jar, ujiformc.jar, f3hksjsv.jar
以下の機能を使用する場合はJARファイルを追加する必要があります。
使用する機能
必要なJARファイル
データベース連携機能 (Webアプリケーション)
ujidb.jar
COBOL連携機能 (電子フォームアプリケーション)
ujicobol.jar
バックエンド連携サービスライブラリ
ujiasync.jar
ログ拡張機能 (ログフィルタ、syslog出力機能、Windowsイベン
トログ出力機能)
ujief.jar
高信頼性ログ機能
ログ制御ファイル (*1)
ujilog.jar
Struts連携機能
Strutsが提供するJARファイル
(*1)ログ制御ファイルはInterstage Business Application ServerのSolaris製品およびLinux製品でのみ提供されます。
ログ制御ファイルによる出力方法の設定を行う場合には、ujilog.jarが必要となります。
ログ制御ファイルによる出力方法の設定の詳細については以下のマニュアルを参照してください。
“Interstage Business Application Server セットアップガイド”の“ログ制御ファイルの設定”
注意
ログ機能を利用してWindowsイベントログへログを出力する場合は、次のファイルが環境変数PATHに設定されていることを確認してく
ださい。
デフォルトのインストール先は"C:¥Interstage¥bin¥"で、Windows版でのみ提供されます。
・ ujieventlog.dll
ログ機能のsyslogへのログ出力においてsyslog関数を使用する場合は、次のパスが環境変数LD_LIBRARY_PATHに設定されている
ことを確認してください。
Solaris環境およびLinux環境でのみ使用可能です。
・ /opt/FJSVapcef/lib
- 135 -
syslogへのログの出力の詳細については“syslogへの出力機能”を参照してください。
以下の場合は、クライアントアプリケーションにもJARが必要となります。
アプリケーション種別
必要なJARファイル
JARを必要とするクライアントアプリケー
ション
Webアプリケーション
アプレット
ujiapplet.jar
EJBセションBean
Apcoordinatorフレームワークを使用しな
いEJBクライアント
ujiejbcl.jar
バックエンド連携サービスライブラリを利用する場合は、イベント処理Bean利用環境にujiasyncwu.jarをEJBとして配備する必要がありま
す。
Apcoordinatorがインストールするファイルのインストール先は下記となります。
下表は、本ユーザーズガイドで説明する主なファイルについて記載しています。
ファイル
デフォルトのインストール先
Windows
Solaris
Linux
uji.jar, ujidb.jar
C:¥Interstage¥APC¥lib¥
/opt/FJSVwebc/lib/
ujiapplet.jar
C:¥Interstage¥APC¥redist¥applet¥
/opt/FJSVwebc/redist/applet/
ujiejb.jar
C:¥Interstage¥APC¥lib¥
/opt/FJSVbcco/lib/
ujiejbcl.jar
C:¥Interstage¥APC¥redist¥ejb¥
/opt/FJSVbcco/redist/ejb/
ujiformc.jar, ujicobol.jar
C:¥Interstage¥APC¥lib¥
/opt/FJSVapcfc/lib/
f3hksjsv.jar
C:¥Interstage¥APC¥lib¥
/opt/FJSVfcdn/lib/
ujiasync.jar,
ujiasyncwu.jar, ujief.jar
C:¥Interstage¥APC¥lib¥
/opt/FJSVapcef/lib/
ujiespec.jar (*1)
C:¥Interstage¥APC¥lib¥
-
ujilog.jar
C:¥Interstage¥APC¥lib¥
/opt/FJSVapclg/lib/
Struts 1.1が提供するJAR
ファイル
C:¥Interstage¥APC¥struts¥lib
/opt/FJSVapcst/struts/
Struts 1.2.9が提供するJAR
ファイル
C:¥Interstage¥APC¥struts12¥lib
/opt/FJSVapcst/struts12/
(*1) 開発環境パッケージでのみ提供されます。
以下のファイルは再配布可能です。クライアント環境に配布して使用できます。
・ ujiapplet.jar
・ ujiejbcl.jar
その他のファイルを配布することはできません。インストールされた場所からコピーせずに使用してください。
13.2 実行時に必要なソフトウェア
データベース連携機能、XML連携機能、バックエンド連携サービス、外字入力タグを使用する場合や、電子フォームアプリケーション
を作成する場合には、以下のソフトウェアが必要になります。
使用する機能または作成するアプリケー
ション
データベース連携機能
必要ソフトウェア
備考
・使用するデータベースサーバに対応したJDBCドラ
イバ
一般に、JDBCドライバはデー
タベースサーバのベンダに
よって提供されます。
- 136 -
使用する機能または作成するアプリケー
ション
XML連携機能
必要ソフトウェア
右記のいず
れか (*1)
備考
・Fujitsu XML プロセッサ (xmlpro.jar,
xmlschema.jar, xmltrans.jar)
(*2) (*4)
・Apache Xerces
・Apache Xalan
-
・JDK/JRE 5.0 が提供するXMLプロ
セッサ
(*3) (*4)
電子フォームアプリケーション
・Fujitsu XML プロセッサ (xmlpro.jar, xmlschema.jar,
xmltrans.jar)
(*2) (*4)
電子署名を利用する電子フォームアプ
リケーション
・Interstage Form Coordinator 署名オプション
-
COBOLと連携する電子フォームアプリ
ケーション
(Windowsプラットフォーム)
運用時
・NetCOBOL Base/Standard Edition
サーバ運用パッケージ for Windows
・NetCOBOL XMLオプション サーバ
運用パッケージ for Windows
-
開発時
・NetCOBOL for Windows または
NetCOBOL Base/Standard/
Professional Edition for Windows
・NetCOBOL XMLオプション for
Windows
運用時
・NetCOBOL Base/Standard Edition
運用パッケージ
・NetCOBOL XMLオプション 運用
パッケージ
開発時
・NetCOBOL Base/Standard/
Professional Edition
・NetCOBOL XMLオプション 運用
パッケージ
・NetCOBOL for Windows または
NetCOBOL Base/Standard/
Professional Edition for Windows
・NetCOBOL XMLオプション for
Windows
COBOLと連携する電子フォームアプリ
ケーション
(Solarisプラットフォーム)
-
バックエンド連携サービスライブラリ
以下のいずれかの製品が提供するアプリケーション
サーバ
・Interstage Application Server Standard-J Edition
・Interstage Application Server Enterprise Edition
・Interstage Business Application Server Standard
Edition
・Interstage Business Application Server Enterprise
Edition
-
バックエンド連携サービスライブラリを
使用したMQ連携サービスとの連携
以下のいずれかの製品(いずれもWindowsまたは
Solaris プラットフォーム)が提供するMQ連携サービ
ス
・Interstage Application Server Enterprise Edition
・Interstage Business Application Server Enterprise
Edition
-
バックエンド連携サービスライブラリを
使用したSystemwalker OperationMGR
との連携
・Systemwalker OperationMGR SE
-
- 137 -
使用する機能または作成するアプリケー
ション
必要ソフトウェア
備考
(Windowsプラットフォーム, Linuxプラッ
トフォーム)
バックエンド連携サービスライブラリを
使用したSystemwalker OperationMGR
との連携
(Solarisプラットフォーム)
・Systemwalker OperationMGR GEE
-
外字入力タグ
・Interstage Charset Manager Standard Edition Web入
力 Agent
-
高信頼性ログ
以下のいずれかの製品が提供するアプリケーション
サーバ
・Interstage Business Application Server Standard
Edition
・Interstage Business Application Server Enterprise
Edition
-
以下のいずれか
・Symfoware Server Enterprise Edition/Enterprise
Extended Edition
・Interstage Business Application Server Standard
Editionの高信頼性ログServer機能
・Interstage Business Application Server Enterprise
Editionの高信頼性ログServer機能
-
(*1) Interstageを使用する場合は、Fujitsu XML プロセッサの使用を推奨します。
(*2) Interstageで Fujitsu XML プロセッサを使用するには、Interstage管理コンソールのワークユニットの設定で以下の両方を設定して
ください。
・ ワークユニットの環境設定の共通定義にある、「使用するXMLパーサの種別」を「Fujitsu XML プロセッサ」に変更してください。変
更方法の詳細は Interstage Application Server J2EEユーザーズガイドの「XMLパーサの設定」を参照してください。
・ ワークユニットの環境設定のワークユニット設定にある「クラスパス」に、Fujitsu XML プロセッサが提供する以下のJARファイルを指
定してください。
- xmlschema.jar
- xmltrans.jar
変更方法の詳細は Interstage Application Server J2EEユーザーズガイドの「IJServerで使用するクラスの設定について」を参照して
ください。
(*3) InterstageでJDK/JRE 5.0 が提供するXMLプロセッサを使用するには、Interstage管理コンソールのワークユニットの環境設定の共
通定義にある、「使用するXMLパーサの種別」を「Xerces2」に設定してください。設定方法の詳細は Interstage Application Server J2EE
ユーザーズガイドの「XMLパーサの設定」を参照してください。
(*4) 以下の製品に同梱されています。
・ Interstage Web Server
・ Interstage Application Server Standard-J Edition / Enterprise Edition
・ Interstage Business Application Server Standard Edition / Enterprise Edition
・ Interstage Studio Standard-J Edition / Enterprise Edition
13.3 初期化パラメタ
Apcoordinatorアプリケーションには以下の初期化パラメタが設定できます。一部のパラメタは特定のアプリケーション種別でのみ使用
します。
- 138 -
パラメタ名
意味
パラメタを使用す
るアプリケーショ
ン種別
Web,
電子
フォー
ム
EJB
factory
ファクトリクラス名を指定します。
○
○
logLevel
ログ出力レベルを変更する場合に指定します。
○
○
commandMap
コマンドマップファイル名を変更する場合に指定します。(*1)
○
○
pageMap
ページマップファイル名を変更する場合に指定します。アプリケー
ションのコンテキストルートを基点としたパスで指定します。
○
-
uji.remoteMap
リモートマップファイル名を変更する場合に指定します。(*1)
○
○
(*2)
uji.convMap
データBean変換マップファイル名を変更する場合に指定します。
(*1)
○
○
uji.database.connection.minpoolsize
データベース連携でのプールコネクション数。
指定値のコネクション数が常時確保されます。
○
-
uji.database.connection.maxpoolsize
データベース連携での最大コネクション数。
指定値を超えた接続要求はエラーとなります。
○
-
uji.defaultEncoding
送信データのエンコーディングを明示的に指定します。全てのフォー
ムに適用されます。
各フォームにuji.encodingリクエストパラメタを明記した場合はそちら
が優先されます。
"none"を指定すると、エンコーディング処理を行いません。
○
-
uji.doublegetdisabled
HttpControlStateProfileクラスが提供する二重処理防止機能を使用
し、 GETメソッドによるリクエストに対して二重処理を防止する場合
に利用します。 uji.doublegetdisabledの値には、以下の場合の応答
に設定するHTTP応答コードを数字3桁で指定します。
○
-
・ リクエストAを処理中にリクエストBを受信して二重処理が検出
された場合で、以下のどちらかに該当する場合。
- Aの送信先がJSPで、Bの送信先がサーブレットの場合
- Aの送信先がサーブレットで、Bの送信先がJSPの場合
GETメソッドに対して二重処理防止を有効にすると、上記の場合は
画面を返すことができません。この場合、uji.doublegetdisabledに指
定されたHTTP応答コードが応答に設定されます。
uji.doublegetdisabledの指定を省略した場合、
HttpControlStateProfileクラスが提供する二重処理防止機能は
POSTメソッドによるリクエストのみ二重処理を防止します。
uji.model.viewName
リクエストパラメタuji.model.*, uji.pageidで使用する番号の初期値を
1に固定するかどうかを指定します。これらのリクエストパラメタは
Webcoordinatorによってフォーム内に自動生成され、uji.model.* リ
クエストパラメタ名の"*"部分と、uji.pageidの値に番号が使用されま
す。uji.model.viewNameの指定を省略した場合は、番号の初期値
は不定です。trueが指定された場合は、初期値は1に固定されま
す。 本リクエストパラメタはテストツールなどを利用して同じリクエス
トパラメタを繰り返し送信したい場合に利用してください。
○
-
uji.emptyCellRuled
uji:tableViewタグとuji:treeViewタグのセルの値が空の文字列また
は空白だけからなる文字列の場合に、セルの内枠を表示するため
○
-
- 139 -
パラメタ名
意味
パラメタを使用す
るアプリケーショ
ン種別
Web,
電子
フォー
ム
EJB
にセルに自動的に"&nbsp;"を埋め込むかどうかを指定します。 false
が指定された場合には"&nbsp;"は埋め込まれません。 この指定を
省略した場合やfalse以外を指定した場合は"&nbsp;"が埋め込まれ
ます。
uji.backupResponseBeans
Response Beanをバックアップするスタックのサイズを指定します。
バックアップの数がこの指定を超えると、超えた分だけ古いバック
アップが消去されます。省略した場合、サイズは5となります。
○
-
uji.infoPath
設定ファイルフォルダを変更する場合に指定します。設定ファイル
フォルダはコマンドマップ、リモートマップ、データBean変換マップ
を置くフォルダです。
-
○
uji.informSystemException
EJBセションBeanにおいて、システム例外をクライアントに通知する
かどうかを指定します。clientを指定するとクライアントに通知しま
す。この指定を省略した場合はEJBコンテナに通知されます。
-
○
uji.getProperty.escape
uji:getPropertyタグでescapeアトリビュートを省略した場合の動作を
false、 true、 fullのいずれかで指定します。大文字、小文字は区別
しません。
○
-
○
-
・ false
プロパティ値をそのままHTMLに出力します。
・ true
'"', '&', '<', '>' をそれぞれ '&quot;', '&amp;', '&lt;', '&gt;' に変換
して出力します。
・ full
trueの変換に加え、' 'を'&nbsp;'に変換して出力します。
省略時はfalseの動作となります。
初期化パラメタuji.escapeにtrueが指定された場合は、無効となりま
す。
uji.servlet.errorPage
UjiServletを使用する場合において、ビジネスクラスのメソッドまたは
ビジネスクラスの呼び出し処理で例外が発生した場合に表示するJSP
を指定します。JSPではスクリプトレットで以下の処理を実行すること
により、発生した例外を取得できます。
request.getAttribute(com.fujitsu.uji.http.UjiServlet.EXCEPTIONK
EY);
なお、指定したJSPでは、pageディレクティブ(<%@ page ~ %>)に
isErrorPage="true"を指定しないでください。
uji.formPath
電子フォームアプリケーションにおいて、電子フォームの格納場所
を指定します。省略した場合、環境設定で指定したフォルダとなり
ます。
○
-
uji.includeSessionScopeBean
setResposeBeanで指定したBeanをセションスコープとしない(リクエ
ストスコープとする)場合にfalseを指定します。
ただし、falseを指定した場合でも、setResponseBean(String, Object,
boolean)メソッドの第3パラメタでtrueを指定した場合は、セションス
コープとなります。
○
-
- 140 -
パラメタ名
意味
パラメタを使用す
るアプリケーショ
ン種別
Web,
電子
フォー
ム
EJB
uji.frameSyncTimeout
uji:frameタグのsyncアトリビュートにtrueを指定した場合に、表示完
了を待つ最大時間を秒単位で指定します。0を指定するとタイムア
ウトしません。
○
-
uji.handleException.wrap
trueを指定した場合、ビジネスクラスの親クラス(GenericHandler)お
よびセションクラス(HttpControlStateProfile)のhandleExceptionメソッ
ドでは、通知された例外をHandlerExceptionでラップしてスローしま
す。デフォルトの実装では、通知された例外をそのままスローしま
す。
○
○
uji.resource
リソースファイルとして使用するファイル名を設定します。拡張子は
つけないで指定します。拡張子は".xml"が使用されます。デフォル
トは、"ujiresource"です。
○
○
(*2)
uji.ejb.homeCacheSize
EJBのホームインタフェースのキャッシュサイズを指定します。キャッ
シュできるホームインタフェースの個数で指定します。0を指定した
場合、ホームインタフェースをキャッシュしません。デフォルトは100
です。
○
○
uji.ejb.errorMessage
以下の場合に発生する例外のメッセージを選択します。
○
○
・ CallFactory の createCall メ ソ ッ ド 、 EJBCallFactory の
createUjiSessionCallメソッドでセションBeanのホームインタフェー
ス、ビジネスインタフェースを取得する処理で発生する例外
・ セションBeanを呼び出す処理で発生する例外
以下のどれかを指定します。
・ latest
実行時に使用するApcoordinatorで利用可能な最新のメッセー
ジを使います。
・ 9.1
V9.1のメッセージを使います。アプリケーションで例外メッセー
ジの文字列を参照している処理がある場合に指定します。
・ 5.0
V5.0~V9.0と同じメッセージを使います。V9.0以前のバージョ
ンで作成したアプリケーションで、例外メッセージの文字列を参
照している処理がある場合に指定します。
省略時はlatestです。
uji.handlerConfig
ビジネスクラス設定ファイルとして使用するファイル名を指定しま
す。デフォルトはhandlerconfig.xmlです。
○
○
uji.flash.returnValue
Flash連携機能で、アプリケーション例外が発生した場合の通知方
法を設定します。uji_flashExceptionによる通知を行う場合
は"DataBean"を、エラーページによる通知を行う場合は"JSP"を指
定します。デフォルトは"JSP"です。
○
-
uji.ejstring.jsvrpath
uji:fieldEJStringタグで利用するCharset-Web入力の部門サーバへ
のURLを指定します。省略時には"/j_svr"が指定されます。
○
-
uji.ejstring.charset
uji:fieldEJStringタグで利用するCharset-Web入力の運用文字セッ
トを指定します。省略時には"EJ_SJIS"が指定されます。
○
-
- 141 -
パラメタ名
意味
パラメタを使用す
るアプリケーショ
ン種別
Web,
電子
フォー
ム
EJB
uji.logConf
ログ定義ファイルへのパスをフルパスで指定します。省略時は、設
定フォルダ下のlogConf.xmlを参照します。
○
○
uji.log.enablecache
アプリケーションログ(標準ログ)のキャッシュ利用有無を指定しま
す。省略時のデフォルトは"true"キャッシュ有効です。
○
○
uji.logresource
ログメッセージファイルとして使用するファイル名を設定します。拡
張子はつけないで指定します。拡張子は".xml"が使用されます。
デフォルトは、"logresource"です。
○
○
uji.syslog.interface
ログ定義ファイルでsyslogを出力先として指定した場合のlocalhost
へのログの出力方法を指定します。
パラメタとして以下の2つが指定できます。
○
○
○
-
・ systemcall:
syslog関数でログを出力します。
・ udp:
UDPでログを出力します。
Windowsの場合は設定値に関係なくUDPでログを出力します。
本パラメタを省略した場合は、以下のとおり動作します。
・ ログ制御ファイルがある場合
ログ制御ファイルに指定されている情報に従って動作します。
・ ログ制御ファイルがない場合
udpが指定されたものとして動作します。
(*3)
uji.log.contextidMode
コンテキストIDはセションIDを組み込んで生成されます。初期化パ
ラメタの指定によってコンテキストIDの長さが異なります。
・ trueを指定した場合は、セションIDの全体がコンテキストIDに組
み込まれます。
・ falseを指定した場合は、セションIDの末尾54文字がコンテキスト
IDに組み込まれます。54文字に満たない場合は、セションID
の全体がコンテキストIDに組み込まれます。
省略時はtrueです。
uji.session.manualControl
Webアプリケーションの起動時にセションを自動的に開始しない場
合にtrueを指定します。trueを指定した場合、openSessionメソッドを
使用してセションを開始する必要があります。この指定を省略した
場合やfalseを指定した場合は、Webアプリケーションの起動時にセ
ションが自動的に開始されます。
○
-
uji.escape
UJIタグが表示するデータをエスケープするかどうかをアプリケー
ション全体で指定します。trueを指定した場合、エスケープ機能が
有効になります。この指定を省略した場合やfalseを指定した場合
は、V7までと同じ動作となります。各タグでエスケープされる文字に
ついては、“UJIタグリファレンス”の「UJIタグのエスケープ処理」を
参照してください。
○
-
uji.escape.attribute
HTMLタグのアトリビュート値として使用されるUJIタグのアトリビュー
ト値をエスケープするかどうかを指定します。trueを指定した場合、
○
-
- 142 -
パラメタ名
意味
パラメタを使用す
るアプリケーショ
ン種別
Web,
電子
フォー
ム
EJB
「"」「&」「<」「>」をそれぞれ「&quot;」「&amp;」「&lt;」「&gt;」に変換
します。この指定を省略した場合やfalseを指定した場合は変換しま
せん。エスケープ処理の対象となるアトリビュートについては、“UJI
タグリファレンス”の「アトリビュート値のエスケープ処理」を参照して
ください。
uji.escape.v4Compatible
UJIタグにおけるエスケープ処理を指定します。trueを指定した場
合、以下の条件のタグが、V4と同等のエスケープ処理になります。
○
-
○
○
1. 以下のいずれかのUJIタグを使用し、項目クラス以外のプロ
パティを表示する場合。
uji:fieldString 、 uji:fieldLong 、 uji:fieldDouble 、
uji:fieldBigInteger 、 uji:fieldBigDecimal 、 uji:fieldDate 、
uji:fieldTextArea
2. 以下のいずれかのUJIタグを使用し、ラベルを表示する場
合。
uji:checkbox、uji:pushButton
・ trueを指定すると、上記の1.、2.場合に、初期化パラメタuji.escape
の指定は無効になります。
・ trueを指定した場合であっても、上記 1で、XMLデータBeanま
たは外付け属性の使用時は、エスケープ処理が有効になりま
す。
uji.taglib.awareOfSupplementaryChar
UJIタグで入力文字の文字数をチェックする機能で補助文字1文字を
1文字と数える場合はtrue、2文字と数える場合はfalseを指定しま
す。デフォルトはfalseです。この初期化パラメタの指定に従って文
字数の数え方が変更される機能は以下のとおりです。
・ 以下のUJIタグのmaxLengthアトリビュート
uji:fieldString 、 uji:fieldLong 、 uji:fieldDouble 、
uji:fieldBigInteger 、 uji:fieldBigDecimal 、 uji:fieldDate 、
uji:fieldTextArea
・ uji:validateタグのlength、minLength、maxLengthアトリビュート
・ com.fujitsu.uji.compo.FieldSupportクラスとそのサブクラスの
maxLengthプロパティ
この初期化パラメタはJavaVM内で共通です。“JavaVM内で共通
の初期化パラメタの注意事項”も合わせて参照してください。
uji.espec.awareOfSupplementaryChar
XMLデータ仕様記述のビルトインメソッドstringLengthで補助文字1
文字を1文字と数える場合はtrue、2文字と数える場合はfalseを指定
します。デフォルトはfalseです。この初期化パラメタはJavaVM内で
共通です。“JavaVM内で共通の初期化パラメタの注意事項”も合
わせて参照してください。
○
○
uji.compatible.clearbody
uji:caseタグの動作を指定します。詳細は“コンテントを持たない
uji:caseタグの動作の違い”を参照してください。
○
-
uji.*
Apcoordinatorで予約しています。
-
-
(*1) アプリケーション種別によりファイル名の指定方法が異なります。
- 143 -
・ Webアプリケーション、電子フォームアプリケーションでは、コンテキストルートを基点としたパスで指定します。コンテキストルートと
は、サーバ上でアプリケーションを配置したフォルダです。アプリケーションがWARファイルに格納されている場合は、WARファイ
ル内のルートを基点としたパスで指定します。
・ EJBセションBeanでは、指定方法が2通りあります。指定したファイル名が'/'で始まる場合、パッケージ階層のルートに対応するフォ
ルダを基点としたパスであると解釈されます。'/'以外で始まる場合は設定ファイルフォルダからの相対パスであると解釈されます。
なお、パスの区切り文字には'/'を使用します。
(*2) ファイルの分割機能は使用できません。
(*3) ログ制御ファイルを定義することによりシステムに一意な設定が可能となります。
注意
初期化パラメタuji.servlet.defaultErrorPageは推奨されません。詳細は、“初期化パラメタuji.servlet.defaultErrorPageを使用している場
合の修正”を参照してください。
初期化パラメタの設定方法は、以下を参照してください。
・ Webアプリケーション: 第22章 Webアプリケーションの実行環境の設定
・ EJBセションBean: 25.1.2 セションBeanの初期化パラメタの設定
・ 電子フォームアプリケーション: 第31章 電子フォームアプリケーションの実行環境の設定
JavaVM内で共通の初期化パラメタの注意事項
JavaVMで共通の初期化パラメタは、同一のJavaVMに配備されたすべてのアプリケーションで同じ設定にする必要があります。異なる
設定のアプリケーションが配備された場合、アプリケーションの実行時にUJI036の例外が発生します。以下は例外が発生する例です。
・ 同一のJavaVMに2つのWebアプリケーションを配備し、一方のWebアプリケーションではuji.taglib.awareOfSupplementaryCharをtrue
に、もう一方ではfalseに設定した場合。
・ 同一のJavaVMに2つのWebアプリケーションを配備し、一方のWebアプリケーションではuji.taglib.awareOfSupplementaryCharをtrue
に 設 定 し 、 も う 一 方 で は 初 期 化 パ ラ メ タ を 省 略 し た 場 合 。 こ の 場 合 、 後 者 の Web ア プ リ ケ ー シ ョ ン で は
uji.taglib.awareOfSupplementaryCharの設定値としてデフォルトであるfalseが適用されるため、前者のWebアプリケーションと異な
る設定となります。このため、例外が発生します。
・ WebアプリケーションとEJBアプリケーションを同一のJavaVMに配備できるコンテナにおいて、WebアプリケーションとEJBアプリケー
ションを配備し、Webアプリケーションではuji.espec.awareOfSupplementaryCharをtrueに設定し、EJBアプリケーションではfalseに設
定した場合。
InterstageのIJServerを使用し、HotDeploy機能またはクラスのオートリロード機能を有効にしている場合であっても、これらの機能を利用して
JavaVMで共通の初期化パラメタの設定を変更した場合は、アプリケーションの実行時に例外が発生します。
- 144 -
第3部 Webアプリケーションの開発
第14章 概要..................................................................................................................................................146
第15章 Webcoordinatorアプリケーションの骨格.............................................................................................149
第16章 UJIタグを使ったプログラミング...........................................................................................................155
第17章 APIを使ったプログラミング.................................................................................................................204
第18章 データベースとの連携........................................................................................................................224
第19章 アプレットとの連携.............................................................................................................................228
第20章 Flashとの連携...................................................................................................................................234
第21章 アプリケーション設計時の注意事項....................................................................................................242
第22章 Webアプリケーションの実行環境の設定.............................................................................................244
第23章 Interstage Studioを使ったWebアプリケーションの開発.......................................................................247
- 145 -
第14章 概要
14.1 Webcoordinatorとは
Webcoordinatorは、JSP(JavaServer Pages)を拡張することによってWebアプリケーションのフレームワーク(枠組み)を提供します。また、
このフレームワークに従ったWebアプリケーションの実行機能を提供します。 Webcoordinatorのフレームワークは、Apcoordinatorに共
通のフレームワークであるApcoordinatorコアを含んでいます。
Webcoordinatorフレームワークによるアプリケーションの分割
WebcoordinatorフレームワークではWebアプリケーションを主に3つの要素に分割します。
・ 入出力ページ
JSPで記述したページです。画面の全体ではなく、画面を分割した一部に対応します。
・ データBean
画面とロジックの間のデータの受渡しをします。
・ ビジネスクラス
ビジネスロジックを記述します。
Webcoordinatorはこれらの要素の独立性を保ちながら連携させることができます。このため、アプリケーションの部品化を進め、保守性
を高めることができます。
共通JSPインタフェース(UJI: Unified JSP Interface)
Webcoordinatorの機能を呼び出すには、 UJIタグと呼ぶJSP拡張タグを使用します。 UJIタグはWebcoordinatorが提供する共通JSPイ
ンタフェースを利用するためのタグです。 UJIタグを使用することにより、機能呼出しのための複雑な記述が不要になります。
- 146 -
UJIタグには、以下の種類があります。
・ アプリケーションの動作を制御するタグ
・ Webブラウザに表示する画面を作成するタグ
Webcoordinatorで提供する機能
Webcoordinatorでは以下の機能を提供します。
・ 実行制御機能
Webcoordinatorフレームワークに従って開発したアプリケーションを実行する機能です。入出力ページ、データBean、ビジネスクラ
スの各要素を連携させて実行します。
・ 画面部品タグ
表、ツリー、リストといった画面部品タグを提供します。これらの部品はデータの繰り返しを画面に展開します。
・ クライアントスクリプト
アプリケーションでJavaScriptを記述する場合、記述を統一化します。
・ コンポーネントタグ
HTML画面の見た目を設定したり、記述を簡略化したりすることができます。 23個のタグがあり、フィールドタグ、コレクションタグ、
レイアウトタグの3グループに分類されます。
・ アプリケーションプログラムインタフェース(API)
Webcoordinatorの機能を細かく制御する場合に利用するAPIを提供します。
14.2 Webcoordinatorの特長
Webcoordinatorフレームワークには以下の特長があります。
部品化の支援
ビジネスアプリケーションには、定型的な項目を使用する場合が多くあります。
- 147 -
Webcoordinatorでは、これらの定型部分を入出力ページとして部品化することを支援する以下の特長があります。
・ 画面を実行時に動的に結合します。
Webcoordinatorは実行時に複数の入出力ページを動的に結合します。動的に結合するため、ある入出力ページを変更しても他
の入出力ページには影響がありません。
・ データを集約した開発ができます。
同じデータについては、画面ごとにデータを持つ必要はなく、同じデータBean、同じビジネスクラスを使用します。
・ データやロジックを含めた形で部品化ができます。
Webcoordinatorでは、入出力ページ、データBean、ビジネスクラスの3つの要素を含めた形の部品化に対応しています。部品を利
用する側の処理が簡単になります。
・ 繰り返し構造をサポートする画面部品タグを提供します。
画面部品タグでは表、ツリー、リストの3種の繰り返し構造をサポートしています。これらの画面部品を利用することで、画面でのス
クリプト記述が不要になり、部品化を容易にします。
・ さまざまな粒度の部品を作成することができます。
部品の画面サイズやロジックの有無を問わずに部品化ができるため、さまざまな粒度(機能の大きさ)の部品を作成することができ
ます。
保守性の向上
Webcoordinatorには、保守性を向上する以下の特長があります。
・ 画面とビジネスロジックを分離します。
Webcoordinatorでは、画面とビジネスクラスを分離して作成します。これらはデータBeanを介して疎に連携しているため、画面の変
更、ビジネスロジックの変更を互いに影響なく行うことができます。
・ データ指向の実装を可能にします。
WebcoordinatorのデータBeanは、画面とビジネスクラスの間のデータの受渡しをするだけではなく、データを管理する意味がありま
す。データの追加がある場合は、データBeanの名前で検索をすることにより影響範囲を明確にすることができます。
・ 部品化を支援します。
部品化を行うことで同じ処理を一箇所に集めることができます。これは保守性の向上にも役立ちます。
・ 関係定義を外付けとしています。
入出力ページ名の解決、メソッド名の解決は、外付けの関係定義ファイルを使って実行しています。これを利用して、関係定義を
書き換えることで入出力ページの差し替え、メソッドの差し替えを可能にしています。
- 148 -
第15章 Webcoordinatorアプリケーションの骨格
15.1 Webcoordinatorの動作
Webアプリケーションは、クライアントのWebブラウザからHTTPリクエストを受け取り、処理の結果をHTMLとして返却することで動作し
ます。サーブレットはこれをJavaアプリケーションで作成します。JSPは画面記述ですが、JSPエンジンによってHTMLを出力するサーブ
レットが生成されています。
Webcoordinatorでは、受信したHTTPリクエストをデータBeanに変換します。Apcoordinatorコアにビジネスクラスが呼び出され、データBean
が渡されます。ビジネスクラスはデータBeanに対する処理を実行し、実行結果を次のデータBeanとしてWebcoordinatorに設定します。
Webcoordinatorは設定されたデータBeanに対応する入出力ページより画面を構成し、HTMLとしてクライアントに送信します。
この処理を繰り返すわけですが、アプリケーションの画面遷移のみに着目すると、次のように見ることができます。
画面での入力はデータBeanとして受け取ることができます。ビジネスクラスはデータBeanを入力し、次のデータBeanを出力します。データ
Beanは入出力ページを組み合わせることで画面に変換され、再び入力を繰り返します。
- 149 -
15.2 Webcoordinatorアプリケーションの設計
本節では、Webcoordinatorアプリケーションの設計時の考え方を説明します。機能設計、画面遷移設計については、Webcoordinator
特有の項目はありません。
この段階では、以下を明確にしておく必要があります。
・ 各画面の入出力項目
・ 各画面からの画面遷移(ボタン名)
・ 処理の概要
ボタン名はサーバの処理の契機となり、以下コマンドと呼びます。
次に部品化設計を行います。部品化設計は以下の手順で実施します。
1. データのグループ化
Webcoordinatorでは、画面の入出力項目をデータBeanとして表現します。データBeanのクラス名、各項目(Beanのプロパティ)の
型と名前を決めていきます。
単純には1画面を1データBeanとします。
類似のデータの組が複数の画面で使われている場合があります。例えば、照会画面と登録画面では同じデータが使われてい
て、入力が可能か不可能かの違いとなっているでしょう。このような画面では、同じデータBeanを利用します。画面の区別が必要
なため、表示モードによって画面を区別します。言い換えれば、表示モードはひとつのデータBeanに対して複数の画面が対応
する場合、どの画面を選択するかを指定する文字列です。表示モードは任意の文字列で表現します。
2. 画面領域の分割
画面のヘッダなどの領域は、処理内容とは独立に設定する場合が多くあります。このような部分に対しては画面領域を分割してデータ
Beanを分けます。分割した領域には領域名を設定しておきます。領域分割の例を以下に示します。
分割した領域のデータBeanの項目は、分割に従って、それぞれのデータBeanに振り分けます。なお、領域名については、Java
の予約語、JSPの既定の語(application、outなど)は使用できません。JSP規定の語については、JSPの解説書やInterstage Studio
のヘルプを参照してください。
3. 部品の領域の設定
処理本体(上記ではbody)の中でも、共通部品として使用する領域については、領域名を設定しておきます。共通部品に含まれ
る項目は共通部品用のデータBeanとして作成し、処理本体に対応するデータBeanは部品のデータBeanを型とするプロパティと
して持つように設計します。
- 150 -
4. 繰り返し部品の検討
表、ツリー、リストといった構造を持つ部分については、Webcoordinatorの画面部品タグが利用できます。これを利用するためには
WebcoordinatorのAPIに合わせたインタフェースが必要です。データBeanの項目をこのインタフェースを持つクラスに置き換えま
す。
5. ビジネスクラスの設定
画面の送信ボタンには、ビジネスクラスを対応付けます。画面で入力した内容はデータBeanとしてアプリケーションに渡されま
す。送信ボタンの名前はサーバのアプリケーションでコマンドとして認識されます。このデータBeanとコマンドに対応するビジネ
スクラス名およびメソッド名を設定しておきます。
6. 設計情報のまとめ
設計した情報をまとめておきます。JSPファイル名やビジネスクラス名、メソッド名を設定します。
例を示します。
□□登録画面
- 画面構成
領域名
データBean
表示モード
JSP名
head
HeadBean
-
head.jsp
body
SomeDataBean
entry
someentry.jsp
body_hiduke
HidukeBean
input
hidukein.jsp
foot
FootBean
normal
foot.jsp
- ボタン
データBean
コマンド
(ボタン名)
ビジネスクラス
メソッド名
遷移先
SomeDataBean
check
SomeDataHandler
check
□□チェック
SomeDataBean
ok
SomeDataHandler
exec
□□メイン
SomeDataBeanの内容
プロパティ名
型名
備考
name
String
名前
phone
String
電話番号
address
String
住所
この設計データを元にアプリケーションを作成します。アプリケーションの作成については、次節以降で説明します。
ポイント
JSPはJavaに変換されて実行されるため、JSPのサイズはメソッドのサイズに関するJavaの制約を受けます。Javaのメソッドのサイズには
以下の制約があります。
・ コードサイズの制約: コンパイル後のメソッドのサイズは64Kバイト以下である必要があります。
・ 分岐範囲の制約: コンパイル後のメソッドにおいて、前後に最大32Kバイトの範囲までしか分岐できません。
JSPのサイズが大きく、Javaに変換された結果が上記の制約を満たさなくなった場合、実行時にエラーが発生する場合があります。
また、実用的な開発、保守を考えた場合の目安として、JSPファイル1個につき200行(内、タグ50個)以内で作成することを推奨しま
す。
JSPサイズが大きくなる場合は、JSPを分割してuji:includeタグでインクルードすることにより、JSPファイル1個あたりのサイズを小さくする
ことができます。
- 151 -
15.3 Webcoordinatorアプリケーションのファイル
Webcoordinatorアプリケーションで作成するファイルの概要を説明します。各ファイルの詳細は“A.1 簡単なサンプル”を参照してくださ
い。
制御ページ
制御ページはHTTPリクエストを受け取りWebcoordinatorを起動するJSPファイルです。
・ main.jsp
データBean
データBeanは画面とロジックとの間でやりとりするデータを表すための、Bean形式のJavaクラスです。
・ HeadBean.java
・ BodyBean.java
入出力ページ
入出力ページは画面の入出力を記述するJSPファイルです。
・ header.jsp
・ request.jsp
・ response.jsp
ビジネスクラス
ビジネスロジックのJavaクラスです。
・ SampleHandler.java
関係定義ファイル
ビジネスクラスのメソッドを指定するコマンドマップと、表示する画面を指定するページマップを作成します。
・ commands.map
・ pages.map
以降では、基本的な入出力処理の流れを説明します。 Apcoordinatorアプリケーションのデバッグ時や、フレームワークをより深く理解
したい場合には“付録B Apcoordinatorの動作概要”を参照してください。
15.3.1 表示の処理の流れ
Webcoordinatorアプリケーションの表示の処理の流れを“A.1 簡単なサンプル”のサンプルに従って説明します。
制御ページmain.jspを指定してアプリケーションを起動すると、uji:dispatchタグからWebcoordinatorが起動します。Webcoordinatorはコ
マンドマップcommands.mapの以下の記述を参照して、最初に呼ぶメソッドを決めます。
;=sample.SampleHandler.startup
これで指定されたSampleHandlerクラスのstartupメソッドが呼ばれます。
表示のためにビジネスクラスのメソッドで必要な処理は以下です。
・ 表示用のデータをデータBeanに設定する。
・ データBeanにsetVerbメソッドで表示モードを設定する。
・ 各領域に対して、DispatchContextクラスのsetResponseBeanメソッドで表示用のデータを持つデータBeanを設定する。
サンプルでは以下の処理となっています。
public void startup(DispatchContext context) {
BodyBean dataBean = new BodyBean();
- 152 -
dataBean.setVerb("reqmode");
context.setResponseBean("body", dataBean);
setHead(context);
}
private HeadBean headBean;
private void setHead(DispatchContext context) {
if(headBean == null) {
headBean = new HeadBean();
headBean.setLoginTime(new java.util.Date());
}
headBean.setCount(headBean.getCount() + 1);
context.setResponseBean("head", headBean);
}
サンプルの例では、BodyBeanを作成して、body領域に対応付けて設定しています。また、setHeadメソッドの中で、HeadBeanを作成し、
loginTimeとcountを設定し、head領域に対応付けて設定しています。ここまでの処理を実行したところで、uji:dispatchタグの処理は終
了し、制御ページに戻ります。この時の設定状態を確認すると、以下のようになっています。
領域名
データBeanのクラス
表示モード
データBeanの内容
head
HeadBean
なし
count、loginTimeを設定
body
BodyBean
reqmode
初期値
制御ページmain.jspに戻ったあと、uji:includeタグで再度Webcoordinatorが起動します。
<uji:include pane="head" />
領域名をpane="head"と指定していますので、Webcoordinatorはheadの設定情報を探します。この例ではHeadBeanが設定されていま
す。次にWebcoordinatorは、入出力画面の決定のためにページマップpages.mapを参照します。先ほどの設定情報では、headに対応
付けられたデータBeanは、HeadBeanクラスで表示モードなしでした。ページマップ中でこれに一致する行があり、header.jspが入出力
ページ名となります。
sample.HeadBean;=header.jsp
以上の結果より、この領域にheader.jspを表示します。
もう一つのuji:includeタグでも同様に、body領域BodyBeanで表示モードがreqmodeという設定から、request.jspが表示されます。ページ
マップの記述方法の詳細は、“UJIタグリファレンス”を参照してください。
次にheader.jspの中を説明します。
<uji:useBean id="head" cls="sample.HeadBean" request="true" />
実行回数は&nbsp;<uji:getProperty bean="head" property="count" />&nbsp;回です。
uji:useBeanタグはhead領域に対応付けたHeadBeanをJSP上でheadという変数名で使用可能にする宣言です。request="true"の記述
は、次のリクエストまでWebcoordinatorで保持する指定です。この宣言後、uji:getPropertyタグで変数名headとプロパティ名countを指定
することで、countの設定内容が表示可能になります。同様にloginTimeも表示しています。
request.jspの中ではbody領域に対応付けたBodyBeanをJSP上でbodyという変数名で宣言しています。JSP変数としては使っていませ
んが、request="true"の指定で次のリクエストまでWebcoordinatorで保持するようにしています。
15.3.2 入力の処理の流れ
Webcoordinatorアプリケーションの入力の処理の流れを“A.1 簡単なサンプル”のサンプルに従って説明します。
request.jspのフォームで加算の送信ボタンが押されたとします。この時、次のようなパラメタを持つHTTPリクエストがサーバに送信され
ます。
uji.verbs="add,sub"
uji.id="body"
val1="4"
val2="6"
add="加算"
- 153 -
FORMタグのactionが省略されているので、これはこの画面の表示の元になったmain.jspに対して送信されます。このリクエストは、main.jsp
が受け取り、uji:dispatchタグでWebcoordinatorに渡されます。
uji.verbsは、リクエストの中でコマンドとして実行されうるボタン名の一覧を指定しています。この例ではこのフォームからはaddとsubが
指定可能になっています。実際addがコマンドとしてリクエストに付加されています。
uji.idは、データを持つ領域名を表しています。表示のときに、body領域にBodyBeanを設定していますので、これが利用されます。
val1とval2が通常の入力項目です。BodyBeanのsetVal1メソッドとsetVal2メソッドがこれを受け取ります。Webcoordinatorは、String、
boolean、byte、char、int、long、float、double、BigDecimal、BigIntegerの各型を判定して自動変換します。自動変換できない場合は、
初期値(null、ゼロ)が設定されます。
次に、Webcoordinatorは、ビジネスクラス決定のためにコマンドマップcommands.mapを参照します。
sample.BodyBean;add=sample.SampleHandler.add
入力のデータBeanがBodyBeanで、コマンドがaddであるため、コマンドマップよりSampleHandler.addがメソッド名として取得されます。こ
れに従って、SampleHandlerクラスがロードまたは再利用され、addメソッドが呼ばれます。コマンドマップの詳細については“3.6.1 コマ
ンドマップ”を参照してください。
addメソッドのパラメタには、Webcoordinatorへのアクセスを提供するDispatchContextと、入力のデータBeanが渡されます。
public void add(DispatchContext context, BodyBean dataBean) {
....
}
最初にアプリケーションが起動した時には、フォーム入力はありません。そのため、HTTPリクエストのパラメタは何も付いていません。こ
の場合は、データBeanへの転送はスキップして、コマンドマップを参照します。コマンドマップの中で、データBean名、コマンドとも空の
行を探し、SampleHandler.startupが呼ばれます。
15.3.3 includeのネスト
画面領域を細分化するような場合には、uji:includeをネストすることができます。
例を示します。
この場合、貼り付け領域にそれぞれ名前を指定して、ビジネスクラスで各領域に対してデータBeanを設定することで、画面の分割を動
的に変更することができます。
注意
データBeanは空でも可能ですが、必ず設定する必要があります。
uji:dispatchは制御ページに1回だけ記述します。2段目以降のページでは記述しません。
画面部品と組み合わせることによって、領域名を指定しないでuji:includeを実行することが可能です。この方法は“16.2 画面部品タグ”
で説明します。
- 154 -
第16章 UJIタグを使ったプログラミング
16.1 UJIタグの概要
UJIタグは、Webcoordinatorが提供するJSP用の拡張タグです。JSPにUJIタグを記述することにより、Webcoordinatorの機能を呼び出す
ことができます。
UJIタグには、以下の種類があります。
・ アプリケーションの動作を制御するタグ
・ Webブラウザに表示する画面を作成するタグ
この章では、Webブラウザの表示画面を作成するタグについて説明します。他の種類のUJIタグについては以下を参照してください。
・ アプリケーションの動作を制御するタグ
- 基本的なタグ: 15.3 Webcoordinatorアプリケーションのファイル
- セション管理に使用するタグ: 17.1.5 高度なセション管理
Webブラウザの表示画面を作成するタグには、以下があります。
・ 画面部品タグ
データの繰り返し数やデータの状態に従った動的な構成の画面を作成するタグです。
・ クライアントスクリプトタグ
ブラウザ上で実行するJavaScriptを生成するタグです。
・ コンポーネントタグ
画面の作成を容易にするタグで、入力項目を表現するフィールドタグ、選択項目や表などデータの組を表現するコレクションタグ、
画面の配置を決めるレイアウトタグがあります。
・ ウィンドウ制御タグ、フレーム制御タグ
サブウィンドウやフレームを利用したアプリケーションの作成を支援するタグです。
以降では、これらのタグの使用方法について解説します。
16.2 画面部品タグ
16.2.1 画面部品タグの概要
Webcoordinatorの画面部品タグは、データの繰り返し数やデータの状態に従った動的な画面構成や、データと入出力ページを組に
した部品化を支援する機能です。“A.2 画面部品のサンプル”には、画面部品タグを利用したアプリケーションのサンプルを示していま
す。
Webcoordinatorの画面部品タグには、以下のものがあります。
・ 表
2次元の表を作成します。
・ ツリー
木構造のデータを段下げして表示します。
・ リスト
単純な繰り返しです。
・ 条件
条件によって表示内容を選択します。
・ 複合Bean
データBeanの形で繰り返しを持っているとき、データBeanの各項目を参照します。
- 155 -
ポイント
画面部品タグは部品化やHTMLの詳細な記述が可能です。単純に表や選択項目を作成する場合はコンポーネントタグを利用すると
簡単に記述できます。
画面部品タグを使う場合には、各部品で決められたインタフェースを実装したデータBeanを準備します。また、入出力ページではレン
ダラと呼ばれるタグで繰り返し構造や条件ごとのフォーマットを記述します。画面部品タグはこのデータBeanにデータを問い合わせな
がら、該当するレンダラを選択して、内容を画面に転送します。例えば表の場合は、データBeanでTableModelを実装したプロパティを
作成し、uji:tableタグはこのインタフェースを通して表のデータを参照します。
uji:tableタグは以下のように動作します。
1. uji:tableタグのアトリビュートから、TableModelインタフェースを取得します。 bodyに対応付けられたデータBeanのsummaryプロ
パティがTableModelを返す場合、uji:tableタグで以下のように記述します。サンプルのsummary.jspで記述しています。
<uji:table bean="body" property="summary">
SummaryModelクラスはTableModelを実装しています。
public class SummaryModel implements com.fujitsu.uji.model.table.TableModel {
ModelBeanクラスのsummaryプロパティはこのSummaryModelクラスを返します。
protected SummaryModel summary;
public SummaryModel getSummary() {
return summary;
}
2. uji:tableタグはTableModelインタフェースに表のサイズ(行、列)を問い合わせます。 SummayModelクラスではこのための
getColumnCount、getRowCountメソッドを実装しています。
public int
return
}
public int
return
}
getColumnCount() {
6;
getRowCount() {
dm.getDataCount() + 1;
3. uji:tableタグは表全体のレンダラを探します。表全体のレンダラはtype="table"と指定されたuji:tableRendererタグです。見つかれ
ば、このタグの内容を出力します。なければ、デフォルトのパターンを出力します。 summary.jspでは以下のように記述していま
す。
<uji:tableRenderer type="table" >
<TABLE border="2" width="100%"><uji:children/></TABLE>
</uji:tableRenderer>
4. 出力中にuji:childrenタグがあれば、下位のレンダラの処理を実行します。表の場合は、キャプションのレンダラ(type="caption")
を処理したあと、行のレンダラ(type="row")を行数分だけ繰り返して処理をします。例では行のレンダラが省略されているので、
デフォルトで以下のように処理します。
<tr><uji:children/></tr>
5. 行のレンダラでuji:childrenタグがあれば、下位のセル(type="column")の処理を実行します。
6. 行とセルのレンダラは、データ属性(cls)を指定することで、複数のレンダラより選択することができます。 summary.jspでは以下
のように記述しています。
<uji:tableRenderer type="column" cls="header" >
<TH bgcolor="#EEFFEE"><uji:value/></TH>
</uji:tableRenderer>
<uji:tableRenderer type="column" cls="editable" >
- 156 -
<TD><INPUT name="<uji:name/>" value="<uji:value/>"></TD>
</uji:tableRenderer>
データ属性(cls)は、TableModelインタフェースのgetRowClass、getColumnClassより取得した任意の文字列です。 SummayModel
クラスで設定しています。
public java.lang.String getColumnClass(int row, int col) {
if(row == 0)
return "header";
else if(col == 5)
return "editable";
return null;
}
例ではクラス指定のないレンダラが省略されているため、クラスがnullのセルに対してはデフォルトのレンダラが使用されます。
<td><uji:value/></td>
7. セルのレンダラ中でuji:valueタグがあれば、セルのデータがそこに出力されます。また、uji:nameタグは、INPUTタグで入力され
た内容をデータBeanに書き戻すための名前を生成します。
ポイント
Webcoordinatorでは、データの状態判定はビジネスロジックまたはデータBean側で行って、表示の変更のみを画面に記述するように
設計します。
16.2.2 各種の画面部品タグ
本節では、各種の画面部品を紹介します。各画面部品タグの詳細は、“UJIタグリファレンス”を参照してください。
表
2次元の表を作成する画面部品です。
データBeanでは、com.fujitsu.uji.model.table.TableModelインタフェースを実装するクラスを型とするプロパティを持ちます。表は、以下
のようなデータ構造を持ちます。
- 157 -
ツリー
木構造を段下げして表示する画面部品です。
データBeanでは、com.fujitsu.uji.model.tree.TreeModelインタフェースまたは、com.fujitsu.uji.model.tree.TreeNodeインタフェースのどち
らかを実装するクラスを型とするプロパティを持ちます。 TreeNodeインタフェースは各ノードのデータで実装する必要があります。TreeModel
インタフェースは全体で1個のオブジェクトになります。各ノードのデータでTreeNodeインタフェースを実装可能な場合はTreeNode、そ
うでない場合はTreeModelの利用が便利です。
ツリーは以下のデータ構造を持ちます。
ノードは、任意の階層だけ作成できます。データに子供がないノードがリーフになります。
インデントは段下げのために必要に応じて指定します。 段下げの文字や線を指定することができます。指定の方法は、“UJIタグリファ
レンス”(uji:treeRendererタグ)を参照してください。
- 158 -
リスト
各種のリストを扱う画面部品です。
リスト単体で使う他、SELECTタグや、複合Bean画面部品を組み合わせて使用することで、画面の動的な構成が可能です。 データBean
では、com.fujitsu.uji.model.list.ListModelインタフェースを実装するクラスを型とするプロパティを持ちます。リストは以下のデータ構造
を持ちます。
条件
条件の画面部品は、条件によって表示内容を変える場合に使用します。次の例は条件によって項目の色を変えて表示する例です。
<uji:switch bean="body" property="status" >
<uji:case cls="error" >
<FONT color="red" ><uji:getProperty property="value" /></FONT>
</uji:case>
<uji:case cls="warning" >
<FONT color="yellow" ><uji:getProperty property="value" /></FONT>
</uji:case>
<uji:case>
<FONT color="black" ><uji:getProperty property="value" /></FONT>
</uji:case>
</uji:switch>
条件の画面部品を使う場合は、特別なインタフェースは必要ありません。指定されたプロパティをtoStringメソッドで文字列に変換して、
この値とclsで指定したクラス文字列と比較した結果、合致したuji:caseタグの内容が出力されます。
複合Bean
複合Beanは、データBeanのプロパティがユーザ定義のデータBeanのクラスを型とする場合に、その内容を操作します。特にデータBean
の繰り返しがある場合に、データBeanの内容を参照するために使用します。
<uji:composite>
<uji:compositeRenderer>
<TR>
<TD rowspan="2"><uji:getProperty property="denpyoNo" /></TD>
<TD><uji:getProperty property="chumonDate" /></TD>
<TD><uji:getProperty property="shohinCode" /></TD>
<TD><uji:getProperty property="shohinCount" /></TD>
<TD colspan="2"><uji:getProperty property="kokyakuWard" /></TD>
<TD><input name="<uji:compositeName property='nonyuDate' />"
value="<uji:getProperty property='nonyuDate' />" ></TD>
</TR>
<TR>
<TD colspan="3"><uji:getProperty property="shohinName" /></TD>
<TD><uji:getProperty property="tantoOffice" /></TD>
- 159 -
<TD><uji:getProperty property="kokyakuName" /></TD>
<TD><uji:getProperty property="kokyakuPhone" /></TD>
</TR>
</uji:compositeRenderer>
</uji:composite>
uji:compositeRendererタグ内では、uji:compositeNameタグによって、入力内容をデータBeanに反映するための名前を指定します。
16.2.3 画面部品タグのネスト
表のセル、ツリーのノード・リーフ、リストのエレメントでは、項目の値としてデータBeanを返すことができます。このデータBeanに対して
さらに画面部品タグを適用することで、画面部品タグをネストさせることができます。“A.2 画面部品のサンプル”のサンプルの詳細画面
は、リストのデータBeanを複合Beanで受け取る例です。 この方法を使うことにより、以下が可能です。
・ 表の中のリストなど、階層の深いデータを表現する。
・ データBeanの繰り返しを表現する。
画面部品タグをネストする場合、下位の画面部品タグを部品として別の入出力ページとすることができます。この場合、上位の画面部
品タグのレンダラ中にアトリビュートなしのuji:includeを記述します。このように指定することで、領域名を使用せずに、上位の画面部品
から渡されたデータBeanを使用してページマップを参照し、インクルードの動作をします。インクルードされる側の下位の入出力ペー
ジは、全体をuji:includedBodyタグで囲む必要があります。使用例を示します。
・ インクルードする側
<uji:list bean="body" property="listData" >
<uji:listRenderer type="element">
<uji:include />
</uji:listRenderer>
</uji:list>
・ インクルードされる側
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:includedBody>
<uji:composite>
<uji:compositeRenderer>
....
</uji:compositeRenderer>
</uji:composite>
</uji:includedBody>
この例ではリスト画面部品の中でuji:includeを使用しているので、リスト項目のデータBeanと表示モードに従ってページマップで指定さ
れた入出力ページがインクルードされます。インクルードされたページではuji:includedBodyタグで囲むことによって、リスト項目のデータ
Beanが利用可能となり、uji:compositeでデータBeanを引き継ぐ、uji:getPropertyを使用するなどの方法で画面項目を設定します。
16.3 クライアントスクリプト
16.3.1 クライアントスクリプトの概要
Webcoordinatorのクライアントスクリプト機能は、ブラウザ上で実行するJavaScriptを生成します。例を示します。この例は入力項目のinput
がフォーカスを失ったときに最小・最大のチェックをして、誤りがあればステータスバーにエラーメッセージを表示します。
<uji:form method="post" name="someform">
入力項目:
<uji:input name="someinput">
<uji:validate event="blur" type="int" minInclusive="10" maxInclusive="20" >
window.status="入力項目には10~20の整数を指定せよ";
target.focus();
</uji:validate>
</uji:input>
- 160 -
....
</uji:form>
ポイント
クライアントスクリプト機能では、JavaScriptを直接記述して任意の動作をさせることができます。簡単な入力チェックのみの場合はコン
ポーネントタグを利用すると簡単に記述することができます。
クライアントスクリプト、およびJavaScriptの使用にあたっては、以下の注意事項があります。
・ ブラウザの種別によって動作しない場合がある
JavaScriptは言語仕様が制式化されておらず、ブラウザごとに機能が異なったり、バージョンアップでの非互換が発生する場合が
あります。また、ブラウザの設定でJavaScriptを禁止にする場合もあり、アプリケーション作成においては、JavaScriptが動作しなくて
も構わないように設計する必要があります。
・ 繰り返し項目では書かない
JavaScriptを記述するとサーバからクライアントへのデータ送信量が多くなります。特に繰り返し項目中で使用すると、繰り返し回数
分だけのJavaScriptが送信されるため負荷がかかり、また場合によってはJSPのサイズ制約のために動作できなくなります。
ポイント
JSPのサイズ制約
JSPの画面はサーブレット化されて_jspServiceメソッドに展開されますが、Javaのメソッドサイズはコンパイル後で64kバイトが上限と
設定されており、これを超えると実行不可能となります。
・ ビジネスロジックレベルの判断を含んではならない
JavaScriptによってチェック処理をしたとしても、JavaScriptが動作しない環境を考慮してサーバ側のロジックで再度のチェックが必
要です。JavaScriptでビジネスロジックレベルの判断をすると、ビジネスロジックをサーバとJavaScriptの双方で持つことになって、保
守性が損なわれます。また、JavaScriptは画面ごとに記述するため、さらにビジネスロジックの所在が分散することになります。
・ UJIタグが生成するHTMLに依存した処理を作成しない
Apcoordinatorのバージョンアップに伴う機能追加や最適化のために、“UJIタグリファレンス”に記載の仕様の範囲内で、UJIタグが
生成するHTMLパターンが変更される場合があります。このため、UJIタグが生成するHTMLに依存した処理をJavaScriptで作成す
ると、Apcoordinatorをバージョンアップした際に動作しなくなる可能性があります。
例えば、JavaScriptの「elements[通し番号]」形式の記述で入力項目を参照すると、将来のバージョンでUJIタグが生成するHTMLで
INPUTタグが追加された場合に、通し番号が変わるため動作しなくなります。
ポイント
コンポーネントタグが出力した入力項目の参照方法
コンポーネントタグが生成した入力項目をJavaScriptで参照する方法については、「Tips」の「コンポーネントタグが作成した入力項目を
JavaScriptで参照したい」を参照してください。
以上のことを考慮して、クライアントスクリプト、JavaScriptは以下の条件で使用するようにします。
・ 単純な未入力チェックや文字種チェック等に限定する
必要以上のロジックを持たないチェックに限定します。
・ クライアントでのチェックが効果的な場合に限定する
誤りの起きやすい項目など、クライアントでのチェックによる効果が出る場合に限定します。
・ Webcoordinatorのクライアントスクリプトを使用する
クライアントスクリプトを使用することによって、JavaScript記述を最低限にすることができます。
16.3.2 クライアントスクリプトの使用方法
クライアントスクリプトの使用方法について説明します。タグの詳細については、“UJIタグリファレンス”を参照してください。
- 161 -
1. INPUTタグ、FORMタグをWebcoordinatorのタグに置換する。
クライアントスクリプトの記述対象とするINPUTタグ、およびそれを含むFORMタグを、uji:inputタグ、uji:formタグに置換します。
INPUTタグ内でvalueをuji:getPropertyタグを利用して設定している場合は、以下のように書き換えます。
<INPUT name="someinput" value="<uji:getProperty name='body' property='prop' />" >
↓
<uji:input name="someinput" bean="body" property="prop" ></uji:input>
ポイント
uji:getPropertyに限らず、拡張タグのアトリビュートには拡張タグ、JSPタグを記述することはできません。
uji:formタグには、フォームの名前を設定する必要があります。
<FORM method="post"> .... </FORM>
↓
<uji:form method="post" name="someform"> .... </uji:form>
2. uji:validateまたはuji:actionタグを記述する。
uji:inputタグの内容として、uji:validateまたはuji:actionタグを記述します。 uji:validateタグは予め準備された数種のチェック機能
を備えています。 uji:actionタグはチェック内容を自由に記述します。これらのチェックは1つの項目に複数記述することが可能で
す。
<uji:input name="someinput">
<uji:validate event="blur" type="int" minInclusive="10" maxInclusive="20" >
window.status="入力項目には10~20の整数を指定せよ";
target.focus();
</uji:validate>
<uji:action event="..submit">
if(target.value == 15) {
window.status="この場合15は指定できない";
target.focus();
return false;
}
</uji:action>
</uji:input>
eventアトリビュートには、チェックの契機を指定します。HTML組み込みイベントをカンマで区切って指定します。なお、submitと
resetはフォームのイベントのため、"..submit"、"..reset"のように指定します。よく使うイベントには以下のものがあります。
イベント名
意味
blur
INPUT項目がフォーカスを失った
submit
フォームの送信ボタンが押された
reset
フォームのリセットボタンが押された
3. エラー処理のJavaScriptを記述する。
uji:validateタグ、uji:actionタグの中では、inputのオブジェクトをtargetという変数名で参照できます。これを利用してJavaScriptを
記述します。
ポイント
uji:validateタグのlength、minLength、maxLengthアトリビュートを使うことで、入力された文字数のチェックが可能です。補助文字の数
え方は初期化パラメタuji.taglib.awareOfSupplementaryCharで設定できます。詳細は“13.3 初期化パラメタ”を参照してください。
- 162 -
16.3.3 ユーザ定義のチェック
uji:validateタグではユーザ定義のチェックを呼び出すことができます。 uji:validateタグは以下のように記述します。例ではmycheckとい
う利用者定義チェックを使っています。
<uji:validate event="blur" custom="mycheck" >
エラー時の処理
</uji:validate>
customアトリビュートは、typeやlengthなどの他のvalidateタグのアトリビュートと同時に使用することはできません。
これに対応する処理はJavaで作成します。以下の手順で作成します。
1. 拡張クラスの作成
ValidateScriptGeneratorクラスを継承したクラスを作成します。利用者定義チェック(ここではmycheck)と同名のメソッドを作成し
ます。このメソッドで、生成するスクリプトの内容を返すようにします。文字列はJavaScriptのif文で、"if(...) {"または"...; if(...) {"の
形にする必要があります。また、チェック対象項目は変数targetで参照できます。例を示します。
package somepackage;
public class MyScriptGenerator extends com.fujitsu.uji.script.ValidateScriptGenerator
{
public String mycheck() {
return "if(target.value.length != 8) {";
}
}
2. ファクトリクラスでの拡張クラスの生成
利用者のファクトリクラスにValidateScriptGeneratorFactoryインタフェースをインプリメントします。ファクトリクラスの作成方法は3.1
節を参照してください。 newValidateScriptGeneratorメソッドで、1)で作成したクラスを返すように実装します。例を示します。
package somepackage;
import com.fujitsu.uji.script.ValidateScriptGenerator
public class MyFactory extends com.fujitsu.uji.http.HttpFactory
implements com.fujitsu.uji.script.ValidateScriptGeneratorFactory
{
public ValidateScriptGenerator newValidateScriptGenerator() {
return new MyScriptGenerator();
}
}
注意
拡張クラスを使用する場合は、その前にuji:dispatchタグが1回以上実行されている必要があります。
ポイント
デフォルトのJavaScript生成パターンを変更したい場合には、拡張クラスで必要なメソッドをオーバライドします。例えば、lengthは以下
のように実装されています。これらのメソッドをオーバライドすると出力パターンを変更することができます。
// if文の前に必要な処理
public String uji_length_pre(String length) {
return null;
}
// if文内の判定文
public String uji_length(String length) {
return "target.value.length != " + length;
}
- 163 -
注意
ValidateScriptGeneratorクラスの以下のメソッドをオーバライドしてデフォルトのJavaScript生成パターンを変更した場合、初期化パラメタ
uji.taglib.awareOfSupplementaryChar の 指 定 は 無 効 と な り 、 オ ー バ ラ イ ド し た メ ソ ッ ド が 出 力 す る JavaScript が 有 効 と な り ま す 。
uji.taglib.awareOfSupplementaryCharについては“13.3 初期化パラメタ”を参照してください。
・ uji_length
・ uji_length_pre
・ uji_maxLength
・ uji_maxLength_pre
・ uji_minLength
・ uji_minLength_pre
16.4 コンポーネントタグを使ったプログラミング
16.4.1 コンポーネントタグの概要
コンポーネントタグは、HTML画面の作成を容易にするタグで、フィールドタグ、コレクションタグ、レイアウトタグの3つのグループに分
けられます。
フィールドタグ
フィールドタグは、入力項目を表現するタグのグループです。
フィールドタグには以下の特長があります。
・ 色、大きさ、フォント、境界線など外観の属性を設定します。
・ 数値項目のフォーマットを設定します。
・ 数値項目の上限下限を設定します。JavaScript使用でブラウザ上でチェックができます。
・ uji:checkBoxタグの使用でチェックボックスを容易に利用できます。
・ uji:anchorタグの使用でフォームを送信するためのアンカーを容易に利用できます。
・ uji:fieldEJStringタグの使用で、Interstage Charset Manager Standard Edition Web入力 Agentと連携した外字入力が利用できます。
フィールドタグには以下のものがあります。
タグ名
機能
uji:fieldString
文字列入力フィールド
uji:fieldLong
整数値入力フィールド
uji:fieldDouble
実数値入力フィールド
uji:fieldBigInteger
十進整数入力フィールド
uji:fieldBigDecimal
十進小数点数入力フィールド
uji:fieldDate
日付・時刻入力フィールド
uji:fieldTextArea
複数行テキスト入力フィールド
uji:checkbox
チェックボックス
uji:radioButton
ラジオボタン
- 164 -
タグ名
機能
uji:pushbutton
プッシュボタン
uji:anchor
アンカー
uji:label
ラベル
uji:fieldEJString
外字入力フィールド
コレクションタグ
コレクションタグは、選択項目や表などデータの組を表現するタグのグループです。
コレクションタグには以下の特長があります。
・ 選択項目や表を容易に作成することができます。
・ 選択項目や表の、色や大きさなどの外観の属性を設定します。
コレクションタグには以下のものがあります。
タグ名
機能
uji:comboBox
コンボボックス形式の選択項目
uji:listBox
リストボックス形式の選択項目
uji:buttonList
ボタンの組
uji:recordView
レコード形式の入力項目の組
uji:tableView
表
uji:treeView
ツリー付きの表
レイアウトタグ
レイアウトタグは、項目の配置を容易にするタグのグループです。
レイアウトタグには以下の特長があります。
・ 画面上の項目配置を容易に設定できます。
・ uji:tabbedLayoutタグは画面内の領域切り替えを可能にします。
- 165 -
レイアウトタグには以下のものがあります。
タグ名
機能
uji:borderLayout
上下左右に領域を設定するレイアウト
uji:gridLayout
項目をグリッドに揃えるレイアウト
uji:tabbedLayout
タブで切り替え可能なレイアウト
色名の指定
uji:colorMapタグを使用して、色に名前を付けることができます。作成した色名を使用することで、画面の色使いを一括管理することが
できます。
<uji:colorMap name="myForeground" value="rgb(0,240,240)" />
<uji:fieldString bean="body" property="strData"
foreground="myForeground" />
16.4.2 フィールドタグの利用
フィールドタグは、対応する項目クラスと組み合わせて利用する方法と、単独で利用する方法があります。
対応する項目クラスと組み合わせて利用する
フィールドタグには対応する項目クラスがあります。例えば、uji:fieldStringタグにはFieldStringクラスが対応しています。
データBeanでこの項目クラスをプロパティとして定義します。
package sample;
import com.fujitsu.uji.compo.*;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
protected FieldString strData = new FieldString();
public FieldString getStrData() {
return strData;
}
...
}
JSPではタグをデータBeanのプロパティに関連付けて記述します。
<FORM>
<uji:fieldString bean="body" property="strData" />
...
</FORM>
フォームが送信されると、入力項目に入力されたデータは項目クラスに格納されます。また、画面表示時には、項目クラスが持つデー
タが表示されます。このとき、表示するデータがエスケープされて出力されます。エスケープ機能については、“16.8 エスケープ機能”
を参照してください。
uji:labelタグには対応する項目クラスはありません。
また、フィールドタグと画面部品タグを組み合わせて使うことで、画面部品で利用したオブジェクトを引き継ぐことができます。
フィールドタグを単独で利用する
フィールドタグを利用する場合、データBeanに項目クラスではなく一般のString等の型が利用できます。
package sample;
import com.fujitsu.uji.DataBean;
- 166 -
public class BodyBean extends DataBean
{
protected String strData;
public String getStrData() {
return strData;
}
public void setStrData(String strData) {
this.strData = strData;
}
...
}
JSPの記述は項目クラスを利用する場合と同じです。
<FORM>
<uji:fieldString bean="body" property="strData" />
...
</FORM>
フォームが送信されると、入力項目に入力されたデータはpropertyアトリビュートで指定したプロパティに格納されます。また、画面表示
時には、プロパティの値が表示されます。このとき、表示するデータがエスケープされて出力されます。エスケープ機能については、“16.8
エスケープ機能”を参照してください。
uji:pushButtonタグ、uji:labelタグは項目に対応しません。データBeanのプロパティ、タグのプロパティ指定は必要ありません。
<FORM>
<uji:pushButton name="OK" />
...
</FORM>
項目クラスの代わりにデータBeanで使用できる型は、 String、boolean、byte、char、int、long、float、double、BigDecimal、BigInteger で
す。uji:fieldDateタグでは、さらにDate型も使用できます。これらの型を使用した場合、Webcoordinatorが型を判定し、フォームに入力
されたデータを自動変換します。自動変換できない場合は、初期値(null、ゼロ)がデータBeanに設定されます。
フィールドの色や大きさを指定する
フィールドタグのアトリビュートで、色や大きさを指定します。
<FORM>
<uji:fieldString bean="body" property="strData"
width="120" height="40" background="yellow" foreground="blue"
borderWidth="3" fontSize="12pt" />
...
</FORM>
文字色など設定の一部は、項目クラスのプロパティで変更できます。項目クラスで指定した内容はタグのアトリビュートよりも優先されま
す。
dataBean.getStrData().setForeground("red");
項目クラスを使用しない場合の指定方法は、“16.4.6 外付け属性の利用”を参照してください。
数値フォーマットを指定する
数値項目のフォーマットの指定が可能です。
<FORM>
<uji:fieldLong bean="body" property="longData"
outputFormat="¥¥#,##0" />
...
</FORM>
- 167 -
入力データは一般的な形式は自動的に変換されます。例として、整数フィールドでは"-1234"、"¥2,000"のような文字列は自動変換し
ます。
特別な形式で入力する場合には、項目クラスを継承し、変換用のメソッドを作成する必要があります。
package sample;
import java.text.*;
import com.fujitsu.uji.compo.*;
public class MyFieldDate extends FieldDate {
// 入力文字列originalを一般形に変換する
public String parse(String original) {
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd");
return formatter.parse(text).toString();
} catch(Exception e) {
return "0000/01/01"; // エラー用の値
}
}
}
入力値の範囲をチェックする
項目クラスに数値範囲の上限下限や最大入力文字数を設定することで、範囲チェックを容易に記述することができます。以下は、数
値範囲の上限と下限を設定する例です。
... 表示前
dataBean.getLongData().setMinimumValue(0);
dataBean.getLongData().setMaximumValue(100);
... 入力後
if(dataBean.getLongData().getErrorCode() != FieldLong.NO_ERROR) {
... エラー
}
uji:formタグと併用することにより、チェックのためのJavaScriptコードを自動生成します。送信時にチェックを実行し、エラーの場合、ブ
ラウザ画面にメッセージを表示します。
<uji:form name="myform">
<uji:fieldLong bean="body" property="longData"
minimumValue="0" maximumValue="100" />
...
</uji:form>
ポイント
最大入力文字数を設定して入力文字数をチェックする場合、 補助文字の数え方を初期化パラメタuji.taglib.awareOfSupplementaryChar
で設定できます。詳細は“13.3 初期化パラメタ”を参照してください。
16.4.3 コレクションタグの利用
コレクションタグは、対応する項目クラスと組み合わせて利用します。
コレクションタグの種類
以下のコレクションタグがあります。
- 168 -
・ uji:comboBox
選択肢をプルダウン形式で指定します。
・ uji:listBox
選択肢をリストから選択します。
・ uji:buttonList
選択肢をボタン形式で指定します。
・ uji:recordView
ラベル付きの入力項目です。
・ uji:tableView
表形式の項目です。
- 169 -
・ uji:treeView
表の第一列をツリー形式で表示します。
コレクションタグの基本的な利用方法
ここではuji:comboBoxタグを例に説明します。
データBeanに項目クラスをプロパティとして作成します。 uji:comboBoxタグを利用する場合は、データBeanにComboBoxクラスを利用
します。
package sample;
import com.fujitsu.uji.compo.*;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
protected ComboBox comboData = new ComboBox();
public ComboBox getComboData() {
return comboData;
}
...
}
項目クラスに対して一覧データを追加します。
... 表示前の処理
ComboBox cb = dataBean.getComboData();
cb.add("赤");
cb.add("青");
cb.add("緑");
...
ポイント
リソースファイルを使用すると、コンボボックス、リストボックス、ボタンリストの項目クラスに設定する選択肢を外付けのXMLファイルに定
義できます。詳細は、“4.5 リソースファイル”を参照してください。
JSPでuji:comboBoxタグを記述します。
- 170 -
<FORM>
<uji:comboBox bean="body" property="comboData" />
...
</FORM>
フォームが送信されると、選択肢の選択状態は項目クラスに格納されます。また、画面表示時には、項目クラスに追加された一覧デー
タが選択肢として表示されます。このとき、表示するデータがエスケープされて出力されます。エスケープ機能については、“16.8 エス
ケープ機能”を参照してください。
色や大きさをタグのアトリビュートや項目クラスのプロパティで設定できます。タグによって設定可能な内容は異なります。
<FORM>
<uji:comboBox bean="body" property="comboData"
width="100" background="yellow" fontSize="12pt" />
...
</FORM>
uji:tableViewの利用方法
uji:tableViewタグは以下のように利用します。
・ データを設定する
データBeanにTableViewクラスをプロパティとして作成します。
package sample;
import com.fujitsu.uji.compo.*;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
protected TableView tableView = new TableView();
public TableView getTableView() {
return tableView;
}
...
}
TableViewクラスに対してデータ行を追加します。
...
TableView table = dataBean.getTableView();
table.addRow(new Object[] { "りんご", "300", "1" } ); // 1行目のデータ
table.addRow(new Object[] { "みかん", "50", "2" } ); // 2行目のデータ
...
JSPでuji:tableViewタグを記述します。表の大きさやセルの色はタグのアトリビュートで設定します。
<FORM>
<uji:tableView bean="body" property="tableView"
width="400" background="yellow" />
</FORM>
・ ヘッダ行を作成する
表にはヘッダ行を付けることができます。
...
TableView table = dataBean.getTableView();
table.setHeader(new Object[] { "品名", "値段", "個数" } );
...
- 171 -
JSPでのタグのアトリビュートの指定により、ヘッダ行のセルをボタンまたはリンクにすることもできます。ボタンがクリックされる
と、"verb:"の後ろに記述したコマンド(下の例ではaction)が実行されます。
<FORM>
<uji:tableView bean="body" property="tableView"
header="verb:action" />
</FORM>
リンクにする場合は"link:"に続けてコマンドを指定します。
ヘッダの特定の列だけをボタンやリンクにすることもできます。 "verb:"または"link:"を設定した列のセルだけがボタンやリンクにな
ります。例のように各列ごとに異なるコマンドを設定できます。
<FORM>
<uji:tableView bean="body" property="tableView"
header="title;verb:action1;link:action2" />
</FORM>
データ行の任意の列もボタンやリンクにすることができます。以下の例では、第3列目がボタンになります。
<FORM>
<uji:tableView bean="body" property="tableView"
dataCellType="data;data;button:action" />
</FORM>
・ 文字列フィールドを作成する
タグのアトリビュートの指定により、データ行の特定の列を文字列フィールドにできます。例ではデータ行の第2列目と第3列目が文
字列フィールドになります。
<FORM>
<uji:tableView bean="body" property="tableView"
dataEditable="false;true;true" />
</FORM>
・ ラジオボタンやチェックボックスを作成する
タグのアトリビュートの指定により、データ行の特定の列をラジオボタンやチェックボックスにできます。例ではデータ行の第2列目と第
3列目がそれぞれラジオボタン、チェックボックスになります。
<FORM>
<uji:tableView bean="body" property="tableView"
dataCellType="data;radio;check" />
</FORM>
・ 列の色や大きさなどを指定する
タグのアトリビュートで、ヘッダ行やデータ行の列の色や大きさなどを指定します。
<FORM>
<uji:tableView bean="body" property="tableView"
headerBackground="gray"
dataFontWeight="bold;normal;normal" />
</FORM>
CellAttributeクラスを使うと、文字色など設定の一部をセル単位で指定できます。 CellAttributeクラスで指定した内容はタグのアト
リビュートよりも優先されます。
...
CellAttribute attr = new CellAttribute();
attr.setBackground("red");
TableView table = dataBean.getTableView();
table.setAttributeAt(attr, 0, 0);
...
- 172 -
・ セルを連結する
タグのアトリビュートで、セルを連結して表示することができます。
<FORM>
<uji:tableView bean="body" property="tableView"
multiRow="1,2;1;1$2" />
</FORM>
・ セルの数値フォーマットを設定する
セルの値にはCellModelインタフェースを実装したオブジェクトを設定できます。この場合、CellModelを実装したオブジェクトの
getValue()が返す値がそのセルに表示されます。
例えば次のようなクラスを用意すると、数値を"1,500"のようにフォーマットして表示できます。
package sample;
import com.fujitsu.uji.compo.*;
import java.text.*;
public class NumberFormatCell implements CellModel {
int number;
DecimalFormat formatter = new DecimalFormat("#,##0");
public NumberFormatCell(int number) {
this.number = number;
}
public Object getValue() {
return formatter.format((long)number);
}
public void setValue(Object value) {
try {
// #,##0の入力
number = formatter.parse((String)value).intValue();
} catch(Exception e) {
try {
// ###0の入力
number = Integer.parseInt((String)value);
} catch(Exception e2) {
//不明な入力
}
}
}
}
作成したクラスはTableViewクラスのaddRowメソッドで指定します。
...
TableView table = dataBean.getTableView();
table.addRow(new Object[] { "りんご", new NumberFormatCell(1500), "5" } );
table.addRow(new Object[] { "みかん", new NumberFormatCell(50), "2" } );
...
・ 一定行数ずつに分割表示する
表を一定行数ずつ表示し、「次へ」「前へ」などのスクロールボタンを設置して表示部分を切り替えることができます。この場合は、
TableViewクラスの代わりにScrollTableViewクラスを使用します。
package sample;
import com.fujitsu.uji.compo.*;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
- 173 -
protected ScrollTableView tableView = new ScrollTableView();
public ScrollTableView getTableView() {
return tableView;
}
...
}
ScrollTableViewを持つデータBeanを領域に割り当てるときには、setResponseBeanメソッドの第3引数にtrueを指定します。
public void startup(DispatchContext context) {
BodyBean bean = new BodyBean();
....
context.setResponseBean("body",bean,true);
}
表示行数はuji:tableViewタグのpageSizeアトリビュートか、ScrollTableViewクラスのsetPageSizeメソッドで指定します。両方指定した
場合、ScrollTableViewクラスの指定が優先されます。
<FORM>
<uji:tableView bean="body" property="tableView" pageSize="10" />
</FORM>
スクロールボタンを設置するには、uji:tableViewタグのscrollButtonアトリビュートか、uji:pushButtonタグを使用します。
scrollButtonアトリビュートは、容易にボタンを設置する場合に使用します。この場合、以下のようにタグを使用します。
- uji:tableViewタグのscrollButtonアトリビュートを指定して、表示するボタンの位置と種類を指定します。指定方法は、“UJIタグ
リファレンス”を参照してください。
- uji:formタグのverbsアトリビュートか、フォームから送信されるリクエストパラメタuji.verbsに"uji.showback"を追加します。
以下は、次へ進むボタン、前へ戻るボタンを表の右下に設置する例です。
<FORM method="post">
<input type="hidden" name="uji.verbs" value="uji.showback, ....">
<uji:tableView bean="body" property="tableView"
pageSize="10" scrollButton="right" />
</FORM>
ボタンの設置場所や形状を細かく指定する場合はuji:pushButtonタグを使用します。この場合、以下のようにタグを使用します。
- uji:tableViewタグのtableNameアトリビュートを指定して、テーブルに名前を付けます。この名前は、スクロールボタンを追加す
るテーブルを指定するのに使います。
- uji:pushButtonタグでボタンを作成します。以下のアトリビュートを指定してください。
- type: "scrollTable"を指定します。
- table: スクロールさせるテーブルの名前を指定します。つまり、uji:tableViewタグのtableNameアトリビュートで指定した名前
です。
- scroll: スクロールの動作を以下の4種類から指定します。
指定
意味
forward
次へ進む
backward
前へ戻る
last
末尾へ進む
first
先頭へ戻る
- フォームから送信されるリクエストパラメタuji.verbsか、uji:formタグのverbsアトリビュートに"uji.showback"を追加します。
以下は記述例です。
- 174 -
<FORM method="post">
<input type="hidden" name="uji.verbs" value="uji.showback, ....">
...
<uji:tableView bean="body" property="table"
pageSize="10" tableName="employee" />
<uji:pushButton type="scrollTable" label="前へ"
table="employee" scroll="backward"/>
<uji:pushButton type="scrollTable" label="次へ"
table="employee" scroll="forward"/>
...
</FORM>
スクロールボタンによって表示部分を切り替える処理は、サーバ側でJSPを再実行することによって実現されます。したがって、スク
ロールボタンを押した場合のアプリケーションの動作は、ビジネスクラスが呼ばれない点を除いて、通常の送信ボタンを押した場合
と同じです。すなわち、以下の処理が実行されます。
- クライアントスクリプトタグやコンポーネントタグの機能を使って入力項目の内容をチェックしている場合、スクロールボタンを押
した時にチェックが行われます。
- ページチェック機能およびリクエストの正当性検証機能を有効にしている場合、その確認が行われます。
- フォームに入力されたデータがデータBeanに格納されます。
- JSPが実行されます。
分割表示を使用する場合は以下の注意事項があります。
- uji:tableViewタグのbeanアトリビュートでXMLデータBeanを指定した場合、分割表示はできません。表のデータをXMLで持
ち 、 分 割 表 示 を 行 う 場 合 は 、 デ ー タ Bean に com.fujitsu.uji.xml.XmlScrollTableView 型 の プ ロ パ テ ィ を 追 加 し 、
XmlScrollTableViewに表のXMLデータをセットし、bean, propertyアトリビュートでそのプロパティを指定してください。
- リクエストをJSPではなくサーブレットで受け取る場合、分割表示はできません。
uji:treeViewの利用方法
uji:treeViewタグの利用方法はほぼuji:tableViewタグと共通です。以下では異なる部分を説明します。
・ データを設定する
データBeanにTreeViewクラスをプロパティとして作成します。
package sample;
import com.fujitsu.uji.compo.*;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
protected TreeView treeView = new TreeView();
public TreeView getTreeView() {
return treeView;
}
...
}
TreeViewクラスに対してデータ行を追加します。
...
TreeNodeRow root = new TreeNodeRow(new Object[] { "root" });
TreeNodeRow child1 = new TreeNodeRow(new Object[] { "child1" });
TreeNodeRow child2 = new TreeNodeRow(new Object[] { "child2" });
TreeNodeRow child3 = new TreeNodeRow(new Object[] { "child3" });
- 175 -
root.addChild(child1);
root.addChild(child2);
root.addChild(child3);
TreeNodeRow grandchild11 = new TreeNodeRow(new Object[] { "grandchild1" });
TreeNodeRow grandchild12 = new TreeNodeRow(new Object[] { "grandchild2" });
child1.addChild(grandchild11);
child1.addChild(grandchild12);
TreeView tree = dataBean.getTreeView();
tree.setRoot(root);
...
JSPでuji:treeViewタグを記述します。
<FORM>
<uji:treeView bean="body" property="treeView" />
</FORM>
・ アイコンを設定する
タグのアトリビュートで、インデントを表すアイコンやノードのアイコンを指定できます。
<FORM>
<uji:treeView bean="body" property="treeView"
openIcon="open.jpg"
closeIcon="close.jpg"
leafIcon="leaf.jpg"
indentIcon="child.jpg;lastchild.jpg;hasmorechild.jgp;nomorechild.jpg" />
</FORM>
TreeNodeRowクラスを使うと、ノードごとにアイコンを指定できます。TreeNodeRowクラスで指定した内容はタグのアトリビュートより
も優先されます。
...
TreeView tree = dataBean.getTreeView();
TreeNodeRow root = (TreeNodeRow)tree.getRoot();
root.setIcon("special.jpg");
...
16.4.4 レイアウトタグの利用
レイアウトタグは、画面の配置を決めるタグです。項目クラスはありません。
uji:borderLayout
画面の上下左右に領域を設定します。
- 176 -
uji:borderLayoutタグでは、画面の上下左右を"north"、"south"、"west"、"east"、中央を"center"という名前で識別します。これらの領域名を
uji:borderLayoutRendererタグで指定します。
<uji:borderLayout>
<uji:borderLayoutRenderer place="north">
... 画面上部のHTMLを記述します
</uji:borderLayoutRenderer>
<uji:borderLayoutRenderer place="west">
... 画面左部のHTMLを記述します
</uji:borderLayoutRenderer>
<uji:borderLayoutRenderer place="center">
... 画面中央のHTMLを記述します
</uji:borderLayoutRenderer>
<uji:borderLayout>
uji:gridLayout
画面をグリッドに分割し、グリッド座標を指定して項目等を配置します。
uji:gridLayoutは内部のuji:gridLayoutRendererタグに従って、グリッド座標を自動的に作成します。横のグリッド間隔はcolumnWidthア
トリビュートで設定します。
uji:gridLayoutRendererタグではグリッド座標と利用するグリッド数を指定します。グリッド座標を省略すると、前の項目に続けて配置しま
す。 gridWidth="remainder"と記述すると、そのグリッド行の最後までを利用します。
- 177 -
<uji:gridLayout columnWidth="50;100;100" >
<uji:gridLayoutRenderer gridX="1" gridY="0" gridWidth="2" >
... グリッドに配置するHTMLを記述します
</uji:gridLayoutRenderer>
<uji:gridLayoutRenderer gridWidth="remainder" >
... グリッドに配置するHTMLを記述します
</uji:gridLayoutRenderer>
<uji:gridLayoutRenderer gridX="0" gridY="1" >
... グリッドに配置するHTMLを記述します
</uji:gridLayoutRenderer>
<uji:gridLayout>
uji:tabbedLayout
画面内にタブで切り替わる領域を作成します。
uji:tabbedLayoutはJavaScriptとスタイルシートを利用して領域を切り替えます。各領域はuji:tabbedLayoutRendererタグで指定します。
<uji:tabbedLayout height="400" >
<uji:tabbedLayoutRenderer title="共通" >
... "共通"のHTMLを記述します
</uji:tabbedLayoutRenderer>
<uji:tabbedLayoutRenderer title="固有" >
... "固有"のHTMLを記述します
</uji:tabbedLayoutRenderer>
<uji:tabbedLayout>
16.4.5 外字入力タグの利用
uji:fieldEJStringタグを利用すると、Interstage Charset Manager Standard Edition Web入力 Agent(以下Charset-Web入力)と連携した外
字入力が可能になります。
Charset-Web入力は、ベンダ固有の文字や外字などを含む日本語文字列を扱う業務Webアプリケーションにおいて、入力・表示などの
機能を提供する製品です。
uji:fieldEJStringタグによって、他のフィールドタグと同様の記述で、Charset-Web入力の外字機能の利用が可能になります。
アプリケーション記述
uji:fieldEJStringタグは、uji:fieldStringと同様の記述で利用できます。項目クラスには、FieldStringクラスを利用します。
package sample;
import com.fujitsu.uji.compo.*;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
protected FieldString strData = new FieldString();
- 178 -
public FieldString getStrData() {
return strData;
}
...
}
<uji:form name="myform" method="post" ...>
<uji:fieldEJString bean="body" property="strData" />
...
</uji:form>
uji:fieldEJStringタグに固有のアトリビュートとして、以下が指定できます。
・ searched
変換時に利用する検索種別を指定します。Charset-Web入力では、標準の変換辞書の他に、氏名辞書、住所辞書、オプションのKUIN
辞書が提供されており、利用する辞書を"20"(標準変換)、"KUIN30"(KUIN住所入力)、"40|20"(氏名優先と標準のトグル)など
の形式で指定します。Charset-Web入力の入力スクリプト部品の「検索種別」に指定する値です。
・ listCount
文字を入力する場合に、Charset-Web入力によってインライン変換候補が表示されます。1度に表示する候補数を指定します。
環境設定
Charset-Web入力とuji:fieldEJStringタグを連携して利用する場合は、以下の設定が必要です。
・ 部門サーバ
外字タグを利用するWebcoordinatorアプリケーションと、Charset-Web入力の部門サーバとは、同じサーブレットコンテナ上で運用
する必要があります。
・ ライブラリ
uji:fieldEJStringタグでは、Charset-Web入力のタグライブラリ用クラスを利用します。機能が提供されるJARファイルをクラスパスに
追加する等の方法で、利用可能にする必要があります。
・ 初期化パラメタ
外字タグを利用するWebcoordinatorアプリケーションでは、以下の指定を初期化パラメタに追加することができます。
- uji.ejstring.jsvrpath
Charset-Web入力の部門サーバのURLを指定します。通常は"/j_svr"のようなルートからの相対形式で指定します。
- uji.ejstring.charset
Charset-Web入力を運用する文字セットを指定します。文字セットによって変換候補や、エンコード表現などが変わります。
注)"EJ_SJIS"等、Charset-Web入力の文字セット名を指定します。これは、変換候補のセットや、文字列の保持形式を変える機
能です。指定する文字セット名、および対応するJSPやHTMLの文字コードは、Charset-Web入力のマニュアルを参照してくだ
さい。
16.4.6 外付け属性の利用
“外付け属性対応のUJIタグ一覧”に示したコンポーネントタグでは、入力項目のデータを、String等の一般的な型のプロパティで受け
取ることができます。この場合、入力項目の色、大きさなどの属性は、外付け属性を使って指定できます。
外付け属性の利用手順
外付け属性を利用する場合は、DataBeanの代わりに、com.fujitsu.uji.AttributeDataBeanを利用します。
package sample;
public class BodyBean extends com.fujitsu.uji.AttributeDataBean
{
protected String strData;
public String getStrData() {
return strData;
}
- 179 -
public void setStrData(String value) {
strData = value;
}
}
属性は、AttributeDataBeanクラスのsetAttributeメソッドで指定します。引数は、プロパティ名、属性名、属性の値となります。
dataBean.setAttribute("strData", TagAttributeNames.FOREGROUND, "red");
属性の指定方法は項目クラスや、タグのアトリビュートでの指定と共通です。uji:fieldStringタグの場合は、FieldStringクラスや
FieldStringModelインタフェースと共通になります。項目クラスのインタフェースで、getメソッド、isメソッドに対応する属性が指定可能で
す。com.fujitsu.uji.compo.TagAttributeNamesクラスは、属性名の定数を持っています。
ポイント
例では、AttributeDataBeanクラスを利用していますが、データBeanにcom.fujitsu.uji.BeanAttributeAccessインタフェースを実装すれ
ば、任意のクラスで利用可能です。
外付け属性での選択肢の指定
選択肢を表すタグ、uji:comboBox、uji:listBox、uji:buttonListについても、外付け属性を利用することができます。
データBeanには、選択情報を保存するプロパティを作成します。プロパティの型はString (複数選択の場合はString[])を使用します。
フォームが送信されると、選択された選択肢の値がこのプロパティに代入されます。以下は、データBeanの作成例です。
package sample;
import com.fujitsu.uji.compo.*;
public class BodyBean extends com.fujitsu.uji.AttributeDataBean
{
protected String comboData;
public String getComboData() {
return comboData;
}
public void setComboData(String value) {
comboData = value;
}
}
選択肢については、特別な属性名valuesにjava.util.Map型で設定します。このMapは、選択肢の値をキーに、表示文字列を値に持っ
たものです。選択肢の順序を一定にするため、com.fujitsu.uji.util.SequencedMapが利用できます。
また、選択肢の色などのインデックスが必要な属性は、文字列の配列として指定します。
import java.util.*;
import com.fujitsu.uji.util.*;
import com.fujitsu.uji.compo.*;
....
// 値
dataBean.setComboData("HND");
// 選択肢
Map map = new SequencedMap();
map.put("HND", "羽田");
map.put("NRT", "成田");
dataBean.setAttribute("comboData", TagAttributeNames.VALUES, map);
// 選択肢の色
String[] colors = new String[]{"blue","green"};
dataBean.setAttribute("comboData", TagAttributeNames.COLORAT, colors);
- 180 -
リストとテーブルの利用
AttributeDataBean を 利 用 す る 場 合 は 、 uji:list お よ び uji:table に つ い て も 、 com.fujitsu.uji.model.list.ListModel や
com.fujitsu.uji.model.TableModelの代わりに、配列を利用することができます。この時、属性名elementClass(uji:listの場合)、rowClass
とcolumnClass(uji:tableの場合)を同様に利用可能です。
uji:listおよびuji:tableの属性名は、それぞれListModelインタフェースおよびTableModelインタフェースで定数として定義されています。
外付け属性対応のUJIタグ一覧
タグ名
関連する項目クラス、
インタフェース
値の型
利用可能な属性名(*1)
uji:fieldString
FieldString
FieldStringModel
String
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、editable、
enabled、plain、visible、infoText、
maxByteLength、maxLength、fullField、
indispensableField、enableChars、
enableCharType、uppercase
uji:fieldEJString
FieldString
FieldStringModel
String
background、fontSize、foreground、
enabled、plain、visible、maxLength
uji:fieldLong
FieldLong
FieldLongModel2
long
String
uji:fieldBigInteger
FieldBigInteger
FieldBigIntegerModel2
BigInteger
String
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、editable、
enabled、plain、visible、infoText、
maxByteLength、maxLength、fullField、
indispensableField、enableChars、
maximumValue、minimumValue
uji:fieldDouble
FieldDouble
FieldDoubleModel2
double
String
uji:fieldBigDecimal
FieldDecimal
FieldDecimalModel2
BigDecimal
String
uji:fieldDate
FieldDate
FieldDateModel2
Date
String
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、editable、
enabled、plain、visible、infoText、
maxByteLength、maxLength、fullField、
indispensableField、enableChars、
locale(java.util.Locale)、
timeZone(java.util.TimeZone)
uji:fieldTextArea
FieldTextArea
FieldTextAreaModel2
String
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、editable、
enabled、visible、infoText、
maxByteLength、maxLength、
indispensableField
uji:checkbox
CheckBox
CheckBoxModel
String
uji:pushbutton
PushButton
PushButtonModelValued
任意 (*3)
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、enabled、
visible、label
- 181 -
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、editable、
enabled、plain、visible、infoText、
maxByteLength、maxLength、fullField、
indispensableField、enableChars、
maximumValue、minimumValue、
maxDecimalDigit、maxIntegerDigit
タグ名
関連する項目クラス、
インタフェース
値の型
利用可能な属性名(*1)
PushButtonValued
PushButtonModel
uji:radioButton
RadioButton
RadioButtonModel
任意 (*4)
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、tipText、enabled、
visible、label
uji:anchor
Anchor
AnchorModel
任意 (*3)
background、fontSize、fontStyle、
fontWeight、foreground、
textDecoration、visible、label
uji:comboBox
ComboBox
ComboBoxModel2
String
values(Map)、colorAt(String[])、
enabled、visible
uji:listBox
ListBox
ListBoxModel2
String
String[](*2)
values(Map)、colorAt(String[])、
enabled、visible、multipleMode
uji:buttonList
ButtonList
ButtonListModel2
String
String[](*2)
values(Map)、colorAt(String[])、
enabled、visible、multipleMode
uji:list
DefaultListModel
ListModel
Object[]
elementClass(String[])
uji:table
DefaultTableModel
Object[][]
rowClass(String[])、
columnClass(String[][])
TableModel
(*1)「属性名(属性値の型)」の形式で記載しています。属性値の型が記載されていない属性はString型で設定します。この場合、数値や
boolean値を設定するものについては、java.lang.Integer型、java.lang.Boolean型などを利用することも可能で、toStringメソッドで取得で
きる値が利用されます。
com.fujitsu.uji.compo.TagAttributeNamesクラス等で持つ属性名の定数を利用する場合は、全て大文字で記述します。
例) "colorAt" → com.fujitsu.uji.compo.TagAttributeNames.COLORAT
(*2) multipleModeがtrueの場合にはString[]で指定します。
(*3) selectedPropertyアトリビュートを省略した場合、ボタンの値やアンカーの値は不要であるため、プロパティをデータBeanに作成す
る必要はありません。
(*4) pickUpModeアトリビュートにlistまたはtableを指定した場合、ラジオボタンに対応付けるオブジェクトは不要であるため、プロパティ
をデータBeanに作成する必要はありません。
16.5 タグによるXMLデータの利用
XML連携機能を使用すると、画面部品タグやコンポーネントタグでXML内のデータを表示したり、入力されたデータでXMLを更新し
たりすることが可能になります。XML連携機能については“第6章 XMLデータの利用”を参照してください。この節では、XML連携機
能のうちUJIタグでの利用方法について説明します。
実行時に使用するXMLプロセッサについては、“13.2 実行時に必要なソフトウェア”を参照してください。
16.5.1 基本的な使用方法
画面部品タグやコンポーネントタグでは、通常のデータBeanと同様にXMLデータBeanを使用することができ、XMLデータを表示した
り、入力データでXMLを更新したりすることが可能です。XML内のどのデータをタグで使用するかは、XPathを使って指定します。以
下のタグでXMLデータが利用できます。
タグ
機能
uji:table
表形式のデータを画面に展開
uji:tree
ツリー構造のデータを画面に展開
- 182 -
タグ
機能
uji:list
リスト形式のデータを画面に展開
uji:switch
条件によって異なる画面を展開
uji:composite
XMLデータBeanの一部の取り出し
uji:compositeName
XMLデータBeanの一部を更新するための入力項目名を生成
uji:value
画面展開中の値を表示
uji:getProperty
XML要素の内容を表示
uji:name
画面展開中のデータを更新するための入力項目名を生成
uji:input
クライアントスクリプトを記述する場合にHTMLのINPUTタグの代わりに使用
uji:textarea
クライアントスクリプトを記述する場合にHTMLのTEXTAREAタグの代わりに使用
uji:select
クライアントスクリプトを記述する場合にHTMLのSELECTタグの代わりに使用
uji:fieldString
文字列入力フィールド
uji:fieldEJString
外字対応文字列入力フィールド
uji:fieldLong
整数入力フィールド
uji:fieldDouble
実数入力フィールド
uji:fieldBigInteger
十進整数入力フィールド
uji:fieldBigDecimal
十進数入力フィールド
uji:fieldDate
日付・時刻入力フィールド
uji:fieldTextArea
複数行テキスト入力フィールド
uji:checkBox
チェックボックス
uji:radioButton
ラジオボタン
uji:pushButton
プッシュボタン
uji:anchor
アンカー
uji:comboBox
コンボボックス
uji:listBox
リストボックス
uji:buttonList
ボタンリスト
uji:recordView
レコードビュー
uji:tableView
テーブルビュー
uji:treeView
ツリービュー
注意
・ 次のいずれかのタグを使用してXMLデータの更新を行う場合、XMLデータに名前空間を使用することはできません。
- uji:getProperty
- uji:fieldTextArea
- uji:comboBox
- uji:listBox
- uji:buttonList
・ uji:fieldEJStringタグでXMLデータを利用し、かつ、Fujitsu XML プロセッサを使用する場合は、XMLデータの文字コードに以下
のどちらかを使用してください。
- UTF-8
- 183 -
- UTF-16
以下のXMLを例にして、基本的な入出力の方法を説明します。
・ XML(catalog.xml)
<?xml version="1.0" encoding="Shift_JIS" ?>
<catalog>
<item>
<name>赤ワイン</name>
<content>1000ml</content>
</item>
<price>2000</price>
</catalog>
このXMLデータのname要素を表示し、price要素の内容を入力するアプリケーションを例として説明します。ビジネスクラスでは、XML
データBeanを作成します。以下の例では、XMLをWEB-INFフォルダ直下に置いたファイル"catalog.xml"から読み込み、作成したXML
データBeanに"body"という名を付けています。
・ ビジネスクラス
import
import
import
import
java.io.File;import java.io.BufferedInputStream;import java.io.FileInputStream;
javax.servlet.ServletContext;
com.fujitsu.uji.DispatchContext;import com.fujitsu.uji.http.HttpDispatchContext;
com.fujitsu.uji.xml.XmlDataBean;
....
public void startup(DispatchContext context) {
try {
// ロードするファイルを表すFileオブジェクトを作成
ServletContext sc = ((HttpDispatchContext)context).getServletContext();
String root = sc.getRealPath("/");
File file = new File(root, "/WEB-INF/catalog.xml");
// XMLデータBeanを作成
XmlDataBean xmlBean = new XmlDataBean();
// XMLデータを読み込み
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
xmlBean.loadFrom(in);
// 出力するデータBeanを設定
context.setResponseBean("body", xmlBean);
} catch (Exception e) {
e.printStackTrace();
}
}
....
入出力ページでは、name要素の表示にはuji:getPropertyを、price要素の入力にはuji:fieldStringを使用します。以下は入出力ページ
の例です。
・ 入出力ページ
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="com.fujitsu.uji.xml.XmlDataBean" request="true" />
<form method="post">
<input type="hidden" name="uji.id" value="body">
<input type="hidden" name="uji.verbs" value="update">
商品情報<br>
- 184 -
品名: <uji:getProperty bean="body" xpath="item/name"/> <br>
価格: <uji:fieldString bean="body" xpath="price"/>円 <br>
<input type="submit" name="update" value="更新">
</form>
uji:getPropertyタグで表示するXMLデータの要素を指定するには、タグのbeanアトリビュートとxpathアトリビュートを使用します。beanア
トリビュートにはXMLデータBeanに付けた名前を指定します。そのXMLデータBean内のどの要素を表示するかは、xpathアトリビュートに
XPathで指定します。このXPathは、beanアトリビュートで指定したXMLデータBeanのルート要素からの相対パスで指定します。
ポイント
xpathアトリビュートを省略した場合には、beanで指定したXMLデータBeanのルート要素がタグで使用されます。beanアトリビュートを省
略した場合は、カレントオブジェクトが代わりに使用されます。
注意
XMLデータBean使用時は、コマンドマップとページマップの書き方が通常とは異なります。詳しくは“関係定義ファイルの書き方”を参
照してください。
ブラウザの表示は次のようになります。
文字列入力フィールドやテキストエリアなどの入力部品用のタグでXMLデータを使用すると、入力されたデータでXMLが更新されま
す。上記の例ではuji:fieldStringがprice要素を使用しています。したがって、ブラウザで"5250"と入力して更新ボタンを押すと、XMLデータ
Bean内のprice要素が更新されて次のようになります。
・ XML(catalog.xml)
<?xml version="1.0" encoding="Shift_JIS" ?>
<catalog>
<item>
<name>赤ワイン</name>
<content>1000ml</content>
</item>
- 185 -
<price>5250</price>
</catalog>
フォームに必要なリクエストパラメタ
フォームを作成する際は、通常のデータBeanを利用した場合と同様に、必要に応じてリクエストパラメタuji.id、uji.verbsが送信されるよ
うにしてください。<input type="hidden">タグを記述することによってこれらのリクエストパラメータを送信させることができます。新規作成した
XMLデータBeanに入力データを格納する場合は、リクエストパラメタuji.bean、uji.xmlBeanの値を以下のように与えてください。
・ uji.beanにはcom.fujitsu.uji.xml.XmlDataBeanを指定します。
・ uji.xmlBeanには、XMLデータのルート要素名を指定します。
<form method="post">
<input type="hidden" name="uji.bean" value="com.fujitsu.uji.xml.XmlDataBean">
<input type="hidden" name="uji.xmlBean" value="catalog">
<input type="hidden" name="uji.verbs" value="add">
商品情報<br>
品名: <uji:getProperty bean="body" xpath="item/name"/> <br>
価格: <uji:fieldString bean="body" xpath="price"/>円 <br>
<input type="submit" name="add" value="追加">
</form>
関係定義ファイルの書き方
XML デ ー タ Bean を 使 う 場 合 は 、 コ マ ン ド マ ッ プ と ペ ー ジ マ ッ プ の 書 き 方 が 通 常 と は 異 な り ま す 。 デ ー タ Bean の ク ラ ス 名
(com.fujitsu.uji.xml.XmlDataBean)の代わりにXMLデータBeanのルート要素の要素名を使い、その要素名の先頭に"/"を付加します。
ルート要素が"catalog"であるXMLデータBeanを使った例を示します。
・ コマンドマップ
/catalog;add=sample.CatalogHandler.add
・ ページマップ
/catalog;=catalogForm.jsp
複数のデータの組を扱うタグ
以下は、リストやテーブルなどの複数のデータの組を必要とするタグです。これらのタグでXMLデータを利用するには、それぞれのタ
グに合わせた構造のXMLを使用する必要があります。
タグ
説明
uji:comboBox
コンボボックス
uji:listBox
リストボックス
uji:buttonList
ボタンリスト
uji:recordView
レコードビュー
uji:tableView
テーブルビュー
uji:treeView
ツリービュー
uji:table
表形式のデータを画面に展開
uji:list
リスト形式のデータを画面に展開
uji:tree
ツリー構造のデータを画面に展開
各タグが必要とするXMLデータの構造は、“UJIタグリファレンス”を参照してください。ここでは、uji:comboBoxを例にしてXMLデータ
の表示方法、入力方法、必要となるXMLデータの構造を説明します。
以下は、コンボボックスを表示するのに必要なXMLデータとタグの例です。
- 186 -
・ 表示されるコンボボックス
・ XML
<root>
<selected>野球</selected>
<sports>
<data>野球</data>
<data>サッカー</data>
<data>テニス</data>
</sports>
</root>
・ タグ
<uji:comboBox bean="body" xpath="sports" selectedXPath="selected"/>
コンボボックスの選択肢として表示されるデータはuji:comboBoxのxpathアトリビュートで指定します。xpathで指定した要素の子要素が
それぞれ選択肢として使用されます。上記の例では、sports要素内のdata要素3個が選択肢になります。
selectedXPathアトリビュートは、選択状態の保存先となる要素をXPathで指定します。この指定はbeanアトリビュートで指定したXMLデータ
Beanのルート要素からの相対指定です。上記の例では、selected要素が保存先となります。リクエスト処理時には、コンボボックスで選
択された選択肢の表示文字列によってselected要素の内容が書き換えられます。画面表示時には、デフォルトで選択されている選択
肢としてselected要素の内容が使われます。
コンボボックスに表示される文字列と、selectedXPathで指定した要素に保存される文字列を別にしたい場合は、uji:comboBoxのvalueAttr
アトリビュートを使います。選択肢となる要素の属性名をvalueAttrに指定すると、その属性の値が選択状態の保存時に使われます。上
記の例で「野球」が選択されたときにselected要素に「baseball」が保存されるようにするには、以下のように記述します。
・ XML
<root>
<selected>baseball</selected>
<sports>
<data code="baseball">野球</data>
<data code="soccer">サッカー</data>
<data code="tennis">テニス</data>
- 187 -
</sports>
</root>
・ タグ
<uji:comboBox bean="body" xpath="sports"
selectedXPath="selected" valueAttr="code"/>
選択された要素の属性に選択状態を保存するには、selectedXPathで@に続けて属性名を記述します。前述のコンボボックスで、「野
球」が選択されたときに要素"<data>野球</data>"のselected属性の値がtrueになるようにするには、以下のように記述します。
・ XML
<root>
<sports>
<data selected="false">野球</data>
<data selected="true">サッカー</data>
<data selected="false">テニス</data>
</sports>
</root>
・ タグ
<uji:comboBox bean="body" xpath="sports" selectedXPath="@selected"/>
xpathアトリビュートやselectedXPathアトリビュートで指定する要素は、以下の条件を満たす必要があります。
・ xpathには複合要素を指定します。混合要素、単純要素は指定しないでください。また、xpathで指定した要素の子要素は全て単
純要素となるようにしてください。子要素の要素名がすべて同じである必要はありません。
・ selectedXPathで要素を指定する場合は単純要素を指定します。
注意
uji:comboBoxに限らず、どのタグでも使用する要素は複合要素または単純要素です。混合要素を使用するタグはありません。
ポイント
uji:comboBoxのように項目クラスが必須となるタグでも、XMLデータBeanを使用する場合は項目クラスが必須ではありません。ただし、
項目クラスを使用した方が性能が上がります。また項目クラスを使用して表示属性などを動的に変更することも可能です。項目クラスで
XMLを利用する方法については“16.5.2 XML用の項目クラス”を参照してください。
指定した要素が存在しない場合の動作
xpathアトリビュートで指定された要素や、selectedXPathアトリビュートで指定された要素または属性が存在しなかった場合、データの表
示と更新は次のように実行されます。
・ 表示時は、データがnullとして扱われます。true/falseのいずれかが要求されるデータの場合はfalseとして扱われます。
・ 更新時は、指定された要素または属性がXMLに追加されます。ただし、与えられたXPathが以下の条件のいずれかを満たす場合
に限ります。
- 述語("[式]"の形式)を使用していない。(例: item/name )
- 述語を使用している場合、それが"[整数]"か"[position()=整数]"のいずれかの形式である。(例: item[3]/note[position()=5] )
16.5.2 XML用の項目クラス
以下の表に示すタグには対応する項目クラスが用意されており、入出力データの保持や表示属性などの指定に使われます。各項目
クラスには、対応するXML用項目クラスが用意されています。通常の項目クラスと異なるのは、XMLツリーとしてデータを保持している
点です。以下の表は各タグに対応するXML用項目クラスの一覧です。各クラスの詳細は“APIリファレンス”を参照してください。
- 188 -
タグ
XML用項目クラス(*)
uji:table
XmlTable
uji:tree
XmlTree
uji:list
XmlList
uji:fieldString
XmlFieldString
uji:fieldEJString
XmlFieldString
uji:fieldLong
XmlFieldLong
uji:fieldDouble
XmlFieldDouble
uji:fieldBigInteger
XmlFieldBigInteger
uji:fieldBigDecimal
XmlFieldBigDecimal
uji:fieldDate
XmlFieldDate
uji:fieldTextArea
XmlFieldTextArea
uji:checkBox
XmlCheckBox
uji:radioButton
XmlRadioButton
uji:pushButton
XmlValuedPushButton
uji:anchor
XmlAnchor
uji:comboBox
XmlComboBox
uji:listBox
XmlListBox
uji:buttonList
XmlButtonList
uji:recordView
XmlRecordView
uji:tableView
XmlTableView, XmlScrollTableView
uji:treeView
XmlTreeView
(*)パッケージはcom.fujitsu.uji.xmlです。
XML用項目クラスを使うと、XMLデータBeanをそのままタグで使用する場合より性能が上がります。また、以下が可能になります。
・ 表示色、フォントなどの表示属性の指定や、必須入力、字数制限などの入力時検査の指定を、タグのアトリビュートではなくビジネ
スクラスで指定できます。com.fujitsu.uji.xmlパッケージに用意されているXML用項目クラスをそのまま使用できます。
・ 画面で表示、入力されるデータとXMLデータとの対応付けの方法を、タグの既定の方法から変更できます。この場合、あらかじめ
用意されているXML用項目クラスを継承してクラスを作成し、データの取得、設定用のメソッドをオーバーライドしてください。
XML用項目クラスの使用方法を説明します。uji:comboBoxタグと以下のXMLデータを使って、「野球」、「サッカー」、「テニス」の3つの
選択肢からなるコンボボックスを作成し、表示色をXML用項目クラスで指定する例を示します。
・ XML (sports.xml)
<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
<member>
<name>富士通太郎</name>
<hobby1>野球</hobby1>
</member>
<sports>
<data>野球</data>
<data>サッカー</data>
<data>テニス</data>
</sports>
</root>
- 189 -
XMLデータBeanのサブクラスを作成し、XML用項目クラスのプロパティを追加します。次の例ではサブクラス名をMyXmlDataBeanと
し、XmlComboBoxクラスのプロパティcomboBoxを追加しています。XmlComboBoxはuji:comboBoxに対応するXML用項目クラスで
す。
・ XMLデータBean (MyXmlDataBean.java)
import com.fujitsu.uji.xml.XmlDataBean;
import com.fujitsu.uji.xml.XmlComboBox;
public class MyXmlDataBean extends XmlDataBean {
XmlComboBox comboBox = null;
public void setComboBox(XmlComboBox comboBox) {
this.comboBox = comboBox;
}
public XmlComboBox getComboBox() {
return comboBox;
}
}
ビジネスクラスでは、XMLデータBeanとしてMyXmlDataBeanクラスを使用し、XMLデータをファイルから読み込みます。続いてXML
用項目クラスを作成し、表示色を設定します。作成したXML用項目クラスはMyXmlDataBeanのcomboBoxプロパティにセットします。
・ ビジネスクラス
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
import
import
import
import
com.fujitsu.uji.xml.XmlDataBean;
com.fujitsu.uji.xml.XmlComboBox;
com.fujitsu.uji.http.HttpDispatchContext;
com.fujitsu.uji.DispatchContext;
import java.io.*;
import javax.servlet.ServletContext;
(略)
public void startup(DispatchContext context) {
try {
// ロードするファイルを表すFileオブジェクトを作成
ServletContext sc = ((HttpDispatchContext)context).getServletContext();
String root = sc.getRealPath("/");
File file = new File(root, "/WEB-INF/sports.xml");
// XMLデータBeanを作成、XMLデータを読み込み
MyXmlDataBean xmlBean = new MyXmlDataBean();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
xmlBean.loadFrom(in);
// XML用項目クラスを作成
XmlComboBox xmlComboBox = new XmlComboBox(xmlBean);
xmlComboBox.setXpath("sports");
xmlComboBox.setSelectedXPath("member/hobby1");
// 表示色を指定
xmlComboBox.setColorAt(1,"red");
// MyXmlDataBeanのプロパティにXML用項目クラスを設定
xmlBean.setComboBox(xmlComboBox);
// 出力するXMLデータBeanを設定
context.setResponseBean("body",xmlBean);
} catch (Exception e) {
e.printStackTrace();
- 190 -
39:
}
39: }
XML用項目クラスを以下のように作成します。
・ uji:comboBoxタグで使用するXMLデータBeanを作成します(20-22行目)。
・ XMLデータBeanを項目クラスのコンストラクタに引数として与えます(25行目)。
・ タグのxpathアトリビュートやselectedアトリビュートと同様に、選択肢として使うデータと選択状態の保存先を、それぞれsetXpathメソッドと
setSelectedXPathメソッドを使用してXPathで指定します(26,27行目)。
・ 必要なら表示属性や入力時検査の指定を行ないます(30行目)。
・ XML用項目クラスをMyXmlDataBeanのcomboBoxプロパティに与えます(33行目)。
なお、コンストラクタに与えたXMLデータBeanが保持しているXMLツリーは、項目クラスと共有されます。
タグでは、beanアトリビュートとpropertyアトリビュートでMyXmlDataBeanのcomboBoxプロパティを指定します。
・ タグ
<uji:comboBox bean="body" property="comboBox" />
この例のように、あらかじめ用意されているXML用項目クラスを使用する場合、 画面で表示、入力されるデータとXMLデータとの対応
付けは、XMLデータBeanを使用する場合と同じになります。各XML用項目クラスが必要とするXMLデータの構造は、そのXML用項
目クラスに対応するタグの“UJIタグリファレンス”を参照してください。
注意
XML用項目クラスはXMLデータBeanではありません。XML用項目クラスを使用する場合は、タグのxpath、selectedXPath、valueAttr等の
XML連携機能専用のアトリビュートの値は無効です。各アトリビュートに対応するメソッドがXML用項目クラスに用意されているため、
そちらを使用してください。
状況により、XMLデータと異なる選択肢を設定する場合は、項目クラスの追加、削除メソッドを使用して選択肢を変更します。
・ ビジネスクラス
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
import
import
import
import
com.fujitsu.uji.xml.XmlDataBean;
com.fujitsu.uji.xml.XmlComboBox;
com.fujitsu.uji.http.HttpDispatchContext;
com.fujitsu.uji.DispatchContext;
import java.io.*;
import javax.servlet.ServletContext;
(略)
public void startup(DispatchContext context) {
(略)
}
public void exec(DispatchContext context, MyXmlDataBean dataBean) {
(略)
// XML用項目クラスを取得
XmlComboBox xmlComboBox = dataBean.getComboBox();
// 選択肢を追加する
xmlComboBox.add("volleyball", "バレーボール");
- 191 -
28:
29:
30:
31: }
// 出力するXMLデータBeanを設定
context.setResponseBean("body",dataBean);
選択肢を追加するには、データBeanから項目クラスを取得し(24行目)、項目クラスの追加メソッドを使用して選択肢を追加します(27行
目)。選択肢の削除および挿入することも可能です。詳細は各項目クラスの“APIリファレンス”を参照してください。
16.5.3 通常のデータBeanからXMLデータBeanへの移行
作成済みのアプリケーションにおいて、通常のデータBeanの代わりにXMLデータBeanを使うように修正する際の注意事項を説明しま
す。
通常のデータBeanをXMLデータBeanへ置き換えた場合でも、タグにxpathアトリビュートを追加する必要は必ずしもありません。property
アトリビュートがxpathの代わりとして機能します。beanアトリビュートで指定したオブジェクトがXMLデータBeanであった場合、そのルー
トの子要素の中からpropertyで指定した名前の要素が選択されてタグで使用されます。beanが省略されてカレントオブジェクトが使用さ
れる場合も同様です。
XMLデータBeanへの移行時にxpathアトリビュートの追加を避けるには、以下の方法でデータBeanをXMLデータに書き換えてくださ
い。
・ データBeanを親要素に、プロパティはその子要素にします
・ プロパティの値は、そのプロパティに対応する要素の内容にします。
・ プロパティの値がデータBeanなら、そのプロパティに対応する要素は、データBeanをXMLに書き換えた結果にします。
16.6 ウィンドウの制御
ウィンドウ制御機能を使うと、サブウィンドウを利用したアプリケーションの作成が容易になります。例えば、以下のようなアプリケーショ
ンが実現できます。
- 192 -
以降の説明では、「メインウィンドウ」「サブウィンドウ」という用語を次の意味で使用します。
・ メインウィンドウ
アプリケーションの実行を開始した時にユーザが使用したブラウザのウィンドウを指します。アプリケーションにはメインウィンドウが1
つだけ存在します。
・ サブウィンドウ
アプリケーションの実行中に開いたり閉じたりするウィンドウです。複数のサブウィンドウが使用できます。
ウィンドウの表示を制御するには、以下のクラスとUJIタグを使用します。
・ com.fujitsu.uji.http.Windowクラス
ビジネスクラスでWindowクラスのopenメソッドやcloseメソッドを使うことによって、ウィンドウの表示を制御できます。ウィンドウ1個に
Windowのオブジェクト1個が対応します。
・ com.fujitsu.uji.http.WindowControllerクラス
Windowクラスのオブジェクトを管理するクラスです。サブウィンドウを新規作成したり、指定した名前のウィンドウに対応するWindow
クラスのオブジェクトを取得したりするために使用します。
・ uji:windowControlタグ
Windowクラスに対する操作に応じて、ウィンドウを制御するためのFORMタグとJavaScriptを生成します。uji:windowControlタグは
制御ページに記述します。
JSPの作成
サブウィンドウを利用したアプリケーションでは画面を次のように作成します。
・ 各サブウィンドウにそれぞれ異なるウィンドウ名をつけます。メインウィンドウのウィンドウ名は固定で「main」です。
・ 各ウィンドウにそれぞれ制御ページを作成します。 制御ページには、uji:windowControlタグを1個記述します。記述位置は、uji:include
タグより後、</BODY>タグより前です。 uji:includeタグのpane属性で指定する領域名は、全制御ページで異なるように指定します。
・ 入出力ページにフォームを作成する場合は、HTMLのFORMタグの代わりに、uji:formタグを使用します。
- 193 -
ウィンドウ制御機能を使用する場合、画面の更新を行うためにはリクエストをJSP(制御ページ)で受け取るようにアプリケーションを作成
してください。リクエストをサーブレットで受け取り、レスポンスとして画面(JSP)を返した場合、ウィンドウ制御機能は使用できません。
表示の制御
ビジネスクラスでは、WindowクラスとWindowControllerクラスを使用して、次のようにプログラムを作成します。
・ サブウィンドウを開く
サブウィンドウを開くには、Windowクラスのopenメソッドを使用します。以下は、メインウィンドウ上のボタンが押された時にサブウィ
ンドウを開く場合の記述例です。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void someHandler(DispatchContext context, MyDataBean dataBean) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
// (1)
Window subWin = wCtrl.createWindow("subWindow");
// (2)
subWin.open("sub.jsp","resizable=yes,width=300,height=300"); // (3)
context.setResponseBean("subBody",new SubDataBean(),true);
// (4)
context.setResponseBean("mainBody",dataBean,true);
// (5)
}
(1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
(2) WindowControllerのcreateWindowメソッドで、新しいサブウィンドウに対応するWindowオブジェクトを作成します。
createWindowの引数にはサブウィンドウ名を指定します。
(3) Windowクラスのopenメソッドでサブウィンドウを開きます。このとき、サブウィンドウで使用する制御ページとウィンドウスタイ
ルを指定します。ウィンドウスタイルは、JavaScriptのWindowオブジェクトのopenメソッドで使用される形式で記述します。
(4) setResponseBeanメソッドを使って、サブウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引
数にはtrueを指定し、リクエストごとにデータBeanが領域に再設定されるように指示します。
(5) setResponseBean メ ソ ッ ド を 使 っ て 、 メ イ ン ウ ィ ン ド ウ で 使 用 す る 領 域 に デ ー タ Bean を 割 り 当 て ま す 。 (4) と 同 様 に 、
setResponseBeanの第3引数にはtrueを指定してください。
- 194 -
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが開きま
す。
・ サブウィンドウを閉じる
サブウィンドウを閉じるには、Windowクラスのcloseメソッドを使用します。以下は、メインウィンドウ上のボタンが押された時にサブ
ウィンドウを閉じる例です。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void someHandler(DispatchContext context, MyDataBean dataBean) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
// (1)
Window subWin = wCtrl.getWindow("subWindow");
// (2)
subWin.close();
// (3)
context.setResponseBean("mainBody",dataBean,true);
// (4)
}
(1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
(2) WindowControllerのgetWindowメソッドで、サブウィンドウの名前を指定して対応するWindowオブジェクトを取得します。
(3) Windowクラスのcloseメソッドでサブウィンドウを閉じます。
(4) setResponseBeanメソッドを使って、メインウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引
数にはtrueを指定してください。
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが閉じま
す。
サブウィンドウ上のボタンによって、そのサブウィンドウ自身を閉じる場合は、上記(4)は不要です。
・ 別のウィンドウの表示を更新する
画面上のボタンが押された時、そのボタンがあったウィンドウとは別のウィンドウを更新するには、Windowクラスのupdateメソッドを
使用します。以下は、サブウィンドウ上のボタンが押されたときにメインウィンドウの表示を更新する例です。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void someHandler(DispatchContext context, MyDataBean dataBean) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
// (1)
Window mainWin = wCtrl.getWindow(Window.MAIN_WINDOW);
// (2)
mainWin.update();
// (3)
context.setResponseBean("mainBody",new MainDataBean(),true); // (4)
context.setResponseBean("subBody",dataBean,true);
// (5)
}
(1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
(2) WindowControllerのgetWindowメソッドで、メインウィンドウの名前を指定して対応するWindowオブジェクトを取得します。
Window.MAIN_WINDOW変数は"main"(メインウィンドウの名前)と定義されています。
(3) Windowクラスのupdateメソッドでメインウィンドウの表示を更新します。
(4) setResponseBeanメソッドを使って、メインウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引
数にはtrueを指定してください。
(5) setResponseBeanメソッドを使って、サブウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引
数にはtrueを指定してください。
- 195 -
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、メインウィンドウの表示
が更新されます。
ビジネスクラス作成時は、以下の点に注意してください。
・ サブウィンドウの表示中に呼び出されるメソッドでは、setResponseBeanメソッドを呼び出す際に、その第3引数にtrueを指定してくだ
さい。
Windowクラスのオブジェクトは、セションが終了するまで有効です。したがって、これらをビジネスクラスの変数に一旦保存しておき、あ
とでビジネスクラスが呼び出された時に利用することができます。以下の記述例を参照してください。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
// サブウィンドウのWindowオブジェクトを保存する変数
Window subWin = null;
public boolean init() {
// このビジネスクラスをセションスコープに指定する
return true;
}
// 初回アクセス時に呼び出されるメソッド
public void startup(DispatchContext context) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
// サブウィンドウのWindowオブジェクトを作成して変数に保存
subWin = wCtrl.createWindow("subWindow");
...
}
// サブウィンドウを開くメソッド
public void openSubWindow(DispatchContext context, MyDataBean dataBean) {
subWin.open("sub.jsp","resizable=yes,width=300,height=300");
context.setResponseBean("subBody",new SubDataBean(),true);
...
}
// サブウィンドウを閉じるメソッド
public void closeSubWindow(DispatchContext context, MyDataBean dataBean) {
subWin.close();
...
}
リクエストの検証
サブウィンドウを使用したアプリケーションでも、HttpControlStateProfileクラスとuji:controlStateタグを使用することにより、リクエストを検
証することができます。リクエストの検証については、“17.1.8 リクエストの検証”を参照してください。
サブウィンドウを使用したアプリケーションの場合は、ウィンドウに表示されるフォームそれぞれにuji:controlStateタグを記述します。正
当性はウィンドウごとに検査されます。それぞれのウィンドウにおいて、最後に表示された画面からのリクエストが「正当な」リクエストとし
て扱われます。
ウィンドウ制御機能使用時の注意事項
ウィンドウ制御機能を使用する場合は、以下の注意事項があります。
- 196 -
・ ウィンドウ制御機能を使用した場合、ブラウザにおけるウィンドウ名(JavaScriptのwindow.nameで保持される名前)はApcoordinator
が設定します。Apcoordinatorがブラウザに設定するウィンドウ名は、com.fujitsu.uji.http.WindowクラスのgetIdメソッドで取得できま
す。
・ ブラウザの×ボタンによってすでに閉じられたウィンドウに対してWindowクラスのcloseメソッドを実行すると、小さいウィンドウが一
瞬表示される場合があります。
・ ブラウザの×ボタンによってすでに閉じられたウィンドウに対してWindowクラスのupdateメソッドを使用すると、ウィンドウが開きま
す。このとき、ウィンドウスタイルは以下のように設定されます。
- ブラウザとしてMicrosoft Internet Explorerを使用している場合、Windowクラスのopenメソッド使用時に指定したウィンドウスタイ
ルとなります。 ただし、対象のウィンドウがメインウィンドウであり、Windowクラスのopenメソッドがメインウィンドウに対してまだ使
用されていない場合は、ブラウザのデフォルトのウィンドウスタイルとなります。
・ ウィンドウ制御機能を使用した場合、SSLによる暗号化通信を行なうことはできません。
・ 初期化パラメタuji.model.viewNameを使用することはできません。
・ uji:resourceTextタグによるブラウザの「戻る」ボタンの擬似的な防止とウィンドウ制御機能を併用した場合、ブラウザの「戻る」ボタン
をクリックするとウィンドウが開く場合があります。この場合は、ウィンドウを閉じる処理で直接JavaScriptを用いるのではなく、必ずウィ
ンドウ制御機能を用いてウィンドウを閉じる処理を実行してください。
16.7 フレームの制御
ブラウザの画面をフレームに分割するには、HTMLのFRAMEタグの代わりにuji:frameタグを使用してフレームを定義します。uji:frame
タグを使うことにより、FRAMEタグに比べ以下の利点があります。
・ JSPの構成が簡潔になります。
・ フレームの表示更新をビジネスクラスで指示できます。
・ リクエストがフレームごとに検証されます。
・ フレーム更新中のリクエストが防止できます。
アプリケーションでフレームを利用するには、画面を以下のように作成してください。
・ フレームセットを定義する制御ページを作成します。この制御ページでは、FRAMESETタグとuji:frameタグでフレームの分割方法
を定義します。
・ フレームごとに制御ページを作成します。この制御ページは、各フレームで使用する領域名と領域の分割方法を定義します。
・ フレームに表示する入出力ページでフォームを使用する場合は、HTMLのFORMタグの代わりにuji:formタグを使用します。
フレームと制御ページの対応関係は以下の図のようになります。
- 197 -
サブウィンドウを使ったアプリケーションと同様に、フレームもcom.fujitsu.uji.http.WindowControllerクラスとcom.fujitsu.uji.http.Window
クラスによって管理されます。各フレームにそれぞれWindowオブジェクトが対応し、updateメソッドでフレームの表示更新が行えます。
サブウィンドウの利用法方は、“16.6 ウィンドウの制御”を参照してください。
注意
・ フレーム制御機能を使用した場合、ブラウザにおけるフレーム名(HTMLのFRAMEタグのnameアトリビュートで指定される名前)は
Apcoordinatorが設定します。Apcoordinatorがブラウザに設定するフレーム名は、com.fujitsu.uji.http.WindowクラスのgetIdメソッド
で取得できます。
・ フレーム制御機能と初期化パラメタuji.model.viewNameを併用することはできません。
JSPの作成
・ フレームセットを定義する制御ページの作成
一般にHTMLではFRAMESETタグとFRAMEタグでフレームを定義しますが、ApcoordinatorアプリケーションではFRAMEの代わりに
uji:frameタグを使用します。フレームには名前を付け、uji:frameのnameアトリビュートで指定します。フレーム名を付ける際には以
下に注意してください。
- フレーム名はアプリケーション内で一意になるように設定してください。例えば、複数のウィンドウをフレーム分割している場合
は、他のウィンドウのフレームも含めて全フレームが異なる名前になるようにしてください。
- フレーム名はどのウィンドウの名前とも重複しないようにしてください。また、メインウィンドウの名前である"main"をフレーム名と
して使用することはできません。
各フレームで使用する制御ページのURLをuji:frameタグのsrcアトリビュートで指定します。フレームセットを定義する制御ページに
は、uji:dispatchタグとuji:windowControlタグも記述してください。uji:includeタグは使用しません。以下は記述例です。
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="ErrorPage.jsp" %>
- 198 -
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD>
<TITLE>予約システム</TITLE>
<uji:dispatch />
<uji:windowControl/>
</HEAD>
<FRAMESET rows="50%,*">
<uji:frame src="mainFrm.jsp" name="mainFrame"/>
<uji:frame src="navFrm.jsp" name="navFrame"/>
<NOFRAMES>
フレーム対応のブラウザをご使用ください。
</NOFRAMES>
</FRAMESET>
</HTML>
uji:dispatch, uji:windowControlはこの順番で、HEADタグのコンテントに記述します。
・ 各フレーム用の制御ページの作成
通常の制御ページと同様にuji:dispatchタグとuji:includeタグを使うのに加え、さらにuji:windowControlタグも記述してください。以
下は記述例です。
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="ErrorPage.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<BODY>
<uji:dispatch />
<uji:include pane="mainHeader" />
<uji:include pane="mainBody" />
<uji:windowControl/>
</BODY>
</HTML>
uji:windowControlはuji:includeの後、</BODY>の前に記述します。
uji:frameタグを使用する場合、画面の更新を行うためにはリクエストをJSP(制御ページ)で受け取るようにアプリケーションを作成してく
ださい。リクエストをサーブレットで受け取り、レスポンスとして画面(JSP)を返した場合、uji:frameタグは使用できません。
フレームの表示
・ メインウィンドウをフレーム分割する場合
フレームセットを定義した制御ページのURLを、アプリケーションのURLとして使用します。例えば、main.jspという名前でフレーム
セットを定義した制御ページを作成し、アプリケーションのURLとして、http://yourHost/contextPath/main.jsp をアプリケーションのURL
として使用します。
アプリケーション実行開始時に呼ばれるビジネスクラスのメソッドでは、各フレームで使う領域にそれぞれデータBeanを割り当てま
す。以下の例は、画面を2つのフレームに分割し、片方で領域mainHeaderとmainBodyを、もう一方で領域navBodyを使う場合の記
述です。
public void startup(DispatchContext context) {
context.setResponseBean("mainHeader", new HeaderBean(), true);
context.setResponseBean("mainBody", new BodyBean(), true);
context.setResponseBean("navBody", new MenuBean(), true);
}
フレームの領域にデータBeanを割り当てる場合は、setResponseBeanの第3引数にtrueを指定してください。
・ サブウィンドウをフレーム分割する場合
サブウィンドウで、フレームセットを定義した制御ページを使用すると、サブウィンドウがフレーム分割されます。サブウィンドウで使
- 199 -
用する制御ページは、Windowクラスのopenメソッドで指定します。openメソッドについては、“16.6 ウィンドウの制御”を参照してくだ
さい。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void someHandler(DispatchContext context, MyDataBean dataBean) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
Window subWin = wCtrl.createWindow("subWindow");
subWin.open("frame.jsp","resizable=yes,width=300,height=300"); // (1)
context.setResponseBean("subHead", new SubHeadBean(),true);
// (2)
context.setResponseBean("subBody", new SubBodyBean(),true);
// (2)
...
}
(1) サブウィンドウを開くときに、フレームセットを定義した制御ページのURLを指定します。このURLはコンテキストルートからの
相対パスです。
(2) 各フレームで使用される領域にそれぞれデータBeanを割り当てます。このとき、setResponseBeanの第3引数にtrueを指定し
てください。
フレームの表示の更新
通常は、フォームが送信されるとそのフォームが表示されているフレームが更新されます。他のフレームを更新したい場合するには2通
りの方法があります。
・ 更新するフレームをビジネスクラスで指定する場合
ビ ジ ネ ス ク ラ ス で 、 フ レ ー ム の 表 示 更 新 を 指 示 し ま す 。 こ の 方 法 で は 、 com.fujitsu.uji.http.WindowController ク ラ ス と 、
com.fujitsu.uji.http.Windowクラスを使用します。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void someMethod(DispatchContext context, MyDataBean dataBean) {
WindowController wctrl=((HttpDispatchContext)context).getWindowContrller(); // (1)
Window frame=wctrl.getWindow("mainFrame"); // (2)
frame.update(); // (3)
context.setResponseBean("mainHeader",new HeaderBean(), true); // (4)
context.setResponseBean("mainBody",new BodyBean(), true);
// (4)
}
(1) WindowControllerクラスをHttpDispatchContextクラスから取得します。
(2) 更新するフレームに対応するWindowオブジェクトを、WindowControllerクラスからgetWindowメソッドで取得します。
getWindowの引数には更新するフレームの名前を指定します。
(3) (2)で取得したWindowオブジェクトのupdateメソッドを呼び出します。
(4) 必要なら、更新するフレームで使用している領域にデータBeanを割り当てます。このとき、setResponseBeanの第3引数にtrue
を指定してください。割り当てるデータBeanのオブジェクトが前回表示時と同じなら、この処理は不要です。
この方法の場合、updateメソッドで更新を指示したフレームのほかに、フォームが表示されていたフレームも更新されます。
・ 更新するフレームをJSP中で指定する場合
更新するフレームの名前をuji:formタグのtargetWindowアトリビュートで指定します。また、更新するフレームの制御ページをaction
- 200 -
アトリビュートで指定します。これにより、フォームが送信されたときに、そのフォームのあるフレームは更新されず、targetWindowで
指定したフレームが更新されます。
<uji:form name="updateForm" targetWindow="mainFrame" action="mainFrm.jsp">
...
</uji:form>
更新するフレームの各領域には、必要に応じてデータBeanを割り当てます。この処理は、フォーム送信時に呼び出されるビジネス
クラスのメソッドで行います。以下はビジネスクラスのメソッドの記述例です。
public void someMethod(DispatchContext context, MyDataBean dataBean) {
context.setResponseBean("mainHeader",new HeaderBean(), true);
context.setResponseBean("mainBody",new BodyBean(), true);
}
setResponseBeanの第3引数にはtrueを指定してください。割り当てるデータBeanのインスタンスが前回表示時と同じなら、
setResponseBeanの呼び出しは不要です。
・ 全フレームの表示を更新する場合
フレーム分割しているウィンドウの表示を更新することにより、フレームセットに含まれるすべてのフレームの表示が更新されます。
ウィンドウの表示を更新するには、 Windowクラスのupdateメソッドを使用します。
public void someMethod(DispatchContext context, MyDataBean dataBean) {
WindowController wctrl=((HttpDispatchContext)context).getWindowContrller(); // (1)
Window win=wctrl.getWindow("main"); // (1)
win.update(); // (2)
context.setResponseBean("mainHeader",new HeaderBean(), true); // (3)
context.setResponseBean("navBody",new MenuBean(), true);
// (3)
}
(1) WindowControllerを取得し、フレーム分割しているウィンドウのWindowオブジェクトを取得します。getWindowの引数には
ウィンドウ名を指定します。
(2) (1)で取得したウィンドウのupdateメソッドを呼び出し、表示更新を指示します。
(3) 必要なら、更新するフレームで使用している領域にデータBeanを割り当てます。このとき、setResponseBeanの第3引数にtrue
を指定してください。割り当てるデータBeanのオブジェクトが前回表示時と同じなら、この処理は不要です。
注意
全フレームの表示を更新した場合、リクエストを出したフレームが2回更新されるため、画面がちらついて見える場合があります。こ
れを防止するためには、更新したいフレームだけ指定してください。
フレーム更新中のリクエストの防止
uji:frameタグを使用した画面を表示させると、各フレームの中を表示させるために、フレームの数だけリクエストが発生します。このとき、
全てのフレームの表示が同時に完了するのではなく、一部のフレームの表示が遅れる場合があります。この状態でも表示済みのフレー
ムのボタンやリンクはユーザが操作できる状態にあるため、一部フレームの表示が未完了な状態で次のリクエストが送信される可能性
があります。このようなリクエストの実行を防止するには、uji:frameタグのsyncアトリビュートにtrueを指定します。
<FRAMESET rows="50%,*">
<uji:frame src="mainFrm.jsp" name="mainFrame" sync="true"/>
<uji:frame src="navFrm.jsp" name="navFrame" sync="true"/>
<NOFRAMES>
フレーム対応のブラウザをご使用ください。
</NOFRAMES>
</FRAMESET>
上記例の場合、mainFrm.jspとnavFrm.jspの表示が完了するまで、mainFrame, navFrameから送信されたリクエストに対しては空のレス
ポンス (HTTPのステータスコード204) が返されます。この結果、ビジネスクラスは呼び出されず、画面の表示も更新されません。この機
能は、sync="true"を指定したフレームの間でだけ働きます。一部のフレームにsync="true"を指定しなかった場合、そのフレームからの
リクエストは常に実行されます。また、そのフレームの表示が完了するのを、sync="true"が指定されたフレームは待ちません。
- 201 -
一定時間待っても表示が完了しなかった場合は、タイムアウトとなり本機能は自動的に解除され、表示未完了のフレームがあってもリ
クエストが処理されるようになります。これにより、ブラウザの停止ボタンが押された場合など、フレーム表示のためのリクエストが送信さ
れなかった場合に、フレームからのリクエストが全く受け付けられなくなってしまうのを防ぎます。タイムアウトまでの時間はデフォルトで10
秒です。この時間を変更するには初期化パラメタuji.frameSyncTimeoutにタイムアウトまでの秒数を設定してください。0を指定するとタ
イムアウトしません。
リクエストの検証
フレームを使用したアプリケーションでも、HttpControlStateProfileクラスとuji:controlStateタグを使用することにより、リクエストを検証す
ることができます。リクエストの検証については、“17.1.8 リクエストの検証”を参照してください。
フレームを使用したアプリケーションの場合は、フレームに表示されるフォームそれぞれにuji:controlStateタグを記述します。正当性は
フレームごとに検査されます。それぞれのフレームにおいて、最後に表示された画面からのリクエストが「正当な」リクエストとして扱われ
ます。
16.8 エスケープ機能
エスケープ機能は、入出力ページの表示時にHTMLで危険とされている文字をエスケープ(文字参照に変換)してから出力する機能
です。
16.8.1 UJIタグのエスケープ処理
UJIタグが表示するデータをエスケープする設定には、アプリケーション全体の設定とタグごとの個別設定があります。各タグでエスケー
プされる文字については、“UJIタグリファレンス”を参照してください。
アプリケーション全体の設定
アプリケーション全体でエスケープ機能を有効にするには、初期化パラメタuji.escapeにtrueを指定します。初期化パラメタuji.escapeを
省略した場合やfalseを指定した場合は、V7までと同じ動作となります。初期化パラメタuji.escapeの指定方法の詳細は、“13.3 初期化
パラメタ”を参照してください。
<context-param>
<param-name>uji.escape</param-name>
<param-value>true</param-value>
</context-param>
タグごとの個別設定
タグのアトリビュートでエスケープ処理を個別に設定することが可能です。タグのアトリビュートで指定した内容は初期化パラメタuji.escape
よりも優先されます。アトリビュートをエスケープする設定が可能なタグは以下のとおりです。各アトリビュートの指定方法の詳細は、“UJI
タグリファレンス”の解説を参照してください。
タグ名
uji:getProperty
アトリビュート名
escape
指定可能なアトリビュート値
full、true、false
uji:resourceText
full、true、false
uji:value
full、true、false
uji:anchor
true、false
uji:tableView
uji:treeView
headerEscape
dataEscape
full、true、false
full、true、false
16.8.2 アトリビュート値のエスケープ処理
HTMLタグのアトリビュート値として表示されるUJIタグのアトリビュート値をエスケープするには、初期化パラメタuji.escape.attributeにtrue
を指定します。アトリビュート値に「"」「&」「<」「>」が含まれる場合、それぞれ「&quot;」「&amp;」「&lt;」「&gt;」に変換されて出力されま
す。初期化パラメタuji.escape.attributeを省略した場合やfalseを指定した場合、UJIタグのアトリビュート値はエスケープされません。初
- 202 -
期化パラメタをtrueに設定した場合にエスケープ処理の対象となるアトリビュートについては、“UJIタグリファレンス”を参照してくださ
い。初期化パラメタuji.escape.attributeの指定方法の詳細は、“13.3 初期化パラメタ”を参照してください。
<context-param>
<param-name>uji.escape.attribute</param-name>
<param-value>true</param-value>
</context-param>
- 203 -
第17章 APIを使ったプログラミング
この章では以下の項目について説明します。
セション管理
- クライアントごとに管理するデータや、全てのクライアントで共有するデータを保持する
- アプリケーションを構成するオブジェクトのライフサイクル
- メソッドの実行を排他制御する
- タイムアウトなどによるセション切断を検出する
- 次のような高度なセション管理
- URLリライティングによるセション管理を利用する
- セションを明示的に切断する
- 画面のボタンを連続して押した場合に発生する二重処理を防止する
- セションIDを更新する
- セションを明示的に開始または破棄する
- 不当な画面から送信されたリクエストを検証する
バイナリファイルの送受信
- ブラウザからアップロードされたファイルを受信する
- ファイルを送信してブラウザにダウンロードさせる
エラー処理
- 例外発生時にJSPエラーページを表示させる
- HTTPリクエストによって送信されたデータをデータBeanに格納する際、文字列から数値への変換で発生した例外を処理する
17.1 セション管理
17.1.1 Webcoordinatorのセション管理
Webcoordinatorでは、セション管理の仕組みを提供しています。
セションは、クライアントごとに1個作成されます。同じクライアントから続けてリクエストがある場合、これらは同じセションとなります。異な
るクライアントからのリクエストは別のセションとして区別されます。
Webcoordinatorでは、セションを表すクラスとしてセションクラスが利用可能です。利用者定義のセションクラスを作成することによって、
クライアント単位のデータを保持することができます。また、全てのクライアントで共有されるデータは、アプリケーションクラスに保持す
ることができます。
- 204 -
注意
1台のクライアントで複数のブラウザを使用している場合、ひとつのセションとして実行されるか、ブラウザごとにセションが作成されるか
は、ブラウザによって異なります。
Webcoordinatorアプリケーションでセションやアプリケーションのレベルで持つデータを管理する場合は、利用者定義のセションクラス、
アプリケーションクラスを使用します。セションクラスは以下の手順で作成します。
1. セションクラスとしてHttpSessionProfileを継承したクラスを作成します。
package sample;
public class SampleSession extends com.fujitsu.uji.http.HttpSessionProfile
{
}
例えばログイン者名のようにセションを通して使われるデータは、このクラスの中に追加します。
2. ファクトリクラスとしてFactoryインタフェースを持つクラスを作成します。
Factoryインタフェースを直接に実装するのではなく、HttpFactoryを継承して作成すると便利です。
ファクトリクラスは、アプリケーションクラス、セションクラスを生成するために利用されるクラスです。
3. ファクトリクラスよりセションクラスを作成します。
package sample;
import com.fujitsu.uji.SessionProfile;
public class SampleFactory extends com.fujitsu.uji.http.HttpFactory
{
public SessionProfile newSessionProfile() {
return new SampleSession();
}
}
newSessionProfileで利用者定義のセションクラスを生成して返却します。ビジネスクラスではDispatchContextよりSessionProfileを
取得できます。このSessionProfileはここで作成したセションクラスになります。
public void startup(DispatchContext context) {
SampleSession session = (SampleSession)context.getSessionProfile();
}
4. ファクトリクラス名はWebアプリケーション環境定義ファイル(web.xml)で指定します。
<context-param>
<param-name>factory</param-name>
<param-value>sample.SampleFactory</param-value>
</context-param>
Webアプリケーション環境定義ファイルの詳細は“Webアプリケーション環境定義ファイル(web.xml)”を参照してください。
アプリケーションクラスも同様の手順で作成します。
1. アプリケーションクラスはApplicationProfileを継承します。
package sample;
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
}
2. ファクトリクラスのnewApplicationProfileメソッドでアプリケーションクラスを生成します。
public ApplicationProfile newApplicationProfile()
{
return new SampleApplication();
}
- 205 -
注意
アプリケーションサーバが提供するセションリカバリの機能を使用する場合など、 javax.sevlet.http.HttpSessionクラスに登録するオブジェ
クトがシリアライズ可能であることが要求される場合は、以下のオブジェクトがシリアライズ可能になるようにプログラムを作成してくださ
い。
・ セションクラスのインスタンス (ユーザ定義のセションクラスを作成する場合)
・ セションスコープに指定したビジネスクラスのインスタンス
・ データBeanのインスタンス
17.1.2 オブジェクトのライフサイクル
Webcoordinatorアプリケーションで使用する利用者オブジェクトは、それぞれリクエストやセションに従ったライフサイクルを持ちます。
アプリケーションは、クライアントからHTTPリクエストが送られることにより起動します。Webサーバは各クライアントにひとつセションを作
成します。クライアントから一定時間アクセスがなければタイムアウトとなり、セションが終了します。全てのセションが終了し、さらに一定
時間が経過すると、アプリケーションが終了します。
アプリケーションクラス
最初にアプリケーションが起動されたときにインスタンスが作成されます。別々のセション間で同一のインスタンスが共有されます。
インスタンスが削除されるタイミングはアプリケーションサーバに依存します。
セションオブジェクト
セションが開始されたあと、タイムアウトでセションが終了するまで同じインスタンスが使用されます。
ビジネスクラス(セションスコープtrue)
init()メソッドでtrueを返すビジネスクラスは、最初にクラスが呼ばれたときに作成され、セションが終了するまで同じインスタンスが使
われます。
ビジネスクラス(セションスコープfalse)
init()メソッドでfalseを返すビジネスクラスは、リクエスト処理のメソッドが呼ばれている間のみ利用可能です。
データBean(request=true)
uji:useBeanタグでrequest=trueと指定したデータBeanは次のリクエストまでインスタンスが保持されます。次のリクエストで同じクラス
のデータBeanが利用されたときは同じインスタンスが再利用されます。
データBean(request=false)
uji:useBeanタグでrequest=falseと指定したデータBeanは、クライアントへの返信後破棄されます。
- 206 -
17.1.3 排他制御
Webcoordinatorではビジネスクラスの実行について以下の排他制御が可能です。
アプリケーションの排他制御
アプリケーションクラスでjavax.servlet.SingleThreadModelを実装(必要なメソッドはなく、宣言するだけで使用可能)すると、そのアプリ
ケーションの中でビジネスクラスを同時にひとつだけ実行します。
同じビジネスクラス
異なるビジネスクラス
同じセション
排他
排他
異なるセション
排他
排他
セションの排他制御
セションクラスでjavax.servlet.SingleThreadModelを実装すると、そのセションの中でビジネスクラスを同時にひとつだけ実行します。
package sample;
public class SampleSession extends com.fujitsu.uji.http.HttpSessionProfile
implements javax.servlet.SingleThreadModel
{
}
- 207 -
同じビジネスクラス
異なるビジネスクラス
同じセション
排他
排他
異なるセション
フリー
フリー
ビジネスクラスの排他制御
ビジネスクラスでjavax.servlet.SingleThreadModelを実装すると、アプリケーションの中でそのビジネスクラスに関する実行を同時にひと
つだけ実行します。
同じビジネスクラス
異なるビジネスクラス
同じセション
排他
フリー
異なるセション
排他
フリー
これらの仕組みは、ビジネスクラスの実行中、ビジネスロジックの部分のみを排他制御します。リクエストの解析や表示画面作成の間は
マルチスレッド実行になります。
この方法の他に、synchronizedを利用して任意の部分に排他制御を行うことも可能です。
17.1.4 セション切断の検出
画面表示中にタイムアウトが発生するなどしてセションが切断すると、セションに関連付けられたオブジェクトは初期化されます。
最初にセションが起動された時に特定の処理を実行する
最初のセション起動かセション切断かの判定はできませんが、JSPで判定するのが簡単な方法です。 HTTPパラメタのuji.verbはコマン
ドを直接指定します。
<BODY>
<% if(session.isNew() && request.getParameter("uji.verb") == null) { %>
<jsp:forward page="main.jsp?uji.verb=login" />
<% } %>
<uji:dispatch />
セション切断時に特定の処理を実行する
タイムアウトが発生してセションが切断した場合、setResponseBeanメソッドや、uji:useBeanタグで指定したデータBeanは削除されます。
アプリケーションクラスのnotifyBeanLostメソッドはこの状態を検出します。 notifyBeanLostメソッドの復帰値は、セション切断時のコマン
ドを差し替えます。
package sample;
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
public String notifyBeanLost(String id) {
return("timeout");
}
}
この場合、Beanなし、コマンド名timeoutに対応するビジネスクラスのメソッドが呼ばれます。コマンドマップでメソッドに対応付けます。
;timeout=sample.SampleHandler.timeout
ビジネスクラスのメソッドでは画面構成を決めるなどの処理をします。
public class SampleHandler extends GenericHandler
{
public void timeout(DispatchContext context) {
// タイムアウトの処理を記述
...
}
}
- 208 -
notifyBeanLostメソッドを利用する場合は、入出力ページを作成する際に以下に注意してください。
・ フォームにリクエストパラメタuji.idを含めてください。また、uji.idで指定したデータBeanに対し、uji:useBeanタグでrequest="true"を
指定してください。uji.idは、フォームに入力されたデータを受け取るデータBeanを指定します。
<uji:useBean id="body" cls="sample.BodyBean" request="true" />
<FORM method="post">
<INPUT name="uji.id" type="hidden" value="body">
....
</FORM>
・ フォームにリクエストパラメタuji.beanを含めないでください。
セション切断を検出した処理を再実行する
セション切断の検出後、ログイン等の割り込み処理を行ってリトライする場合は、以下のようにアプリケーションを作成します。 uji:useBean
タグで指定したデータBeanは削除されても再度生成できるように、uji.beanパラメタを追加します。
<INPUT name="uji.id" type="hidden" value="body">
<INPUT name="uji.bean" type="hidden" value="sample.SampleBean">
セションのプリプロセスでは、フラグ等を設定して、現在の状態が新規のセションかどうか判定します。
package sample;
public class SampleSession extends com.fujitsu.uji.http.HttpSessionProfile
implements com.fujitsu.uji.Preprocessor
{
protected boolean loginFlag = false;
protected transient DispatchContext savedContext;
int preprocess(DispatchContext context) {
if(!loginFlag) {
// 初回でなければコンテキストを保存
if(context.getRequestBean() != null)
savedContext = context;
// context.setResponseBeanで画面を構成
....
return Preprocessor.SKIP_ALL;
}
return Preprocessor.EVAL;
}
}
ログイン処理が正常に実行されたあと、再処理をします。
public void login(DispatchContext context, LoginBean dataBean) {
// ログイン実行
....
// 正常の場合
SampleSession sp = (SampleSession)context.getSessionProfile();
sp.loginFlag = true;
if(sp.savedContext != null) {
// コンテキストが保存されている場合、再実行
Dispatcher.redispatch(context, sp.savedContext);
sp.savedContext = null;
} else {
// 初期画面の処理
....
}
}
17.1.5 高度なセション管理
Webcoordinatorでは、通常のセション管理に加えて、以下の機能を利用することができます。
- 209 -
URLリライティングを使用する
JSPでは一般的にはCookieを使用してセション管理を行います。携帯電話などのCookieを利用できない環境を対象とする場合は、
URLリライティングを使用してセション管理を行います。
二重処理を防止する
ブラウザの画面でボタンを連続して押した場合に、サーバへのリクエストが2度続けて発行される場合があります。このとき、処理が
二重に実行されることを防止します。
セションを明示的に切断する
タイムアウトを待たずにセションを切断することができます。
二重処理を防止する方法には以下の2つがあり、機能が有効になる範囲に違いがあります。
セションクラスにHttpControlStateProfileクラスを使う
HttpControlStateProfileクラスを継承してセションクラスを作成する方法です。uji:dispatchタグ動作中は二重処理が防止されます。
ビジネスクラスはuji:dispatchタグの動作中に実行されるため、ビジネスクラス実行中の二重処理が防止できます。
uji:formタグのpostOnceアトリビュートを使う
uji:formタグのpostOnceアトリビュートにtrueを指定すると、フォームの送信を1回のみに制限します。この場合、二重処理はブラウザ
上で防止され、2回目以降のリクエストはサーバに送信されません。ただし、JavaScriptを使用して実現しているため、JavaScriptを無
効にしているブラウザでは動作しません。
uji:formタグによる二重処理の防止機能は、“uji:formタグのpostOnceアトリビュートの使用方法”で説明します。
注意
Apcoordinator V5.0L10 、 INTERSTAGE WEBCOORDINATOR で 提 供 し て い た uji:controlSection タ グ は 提 供 さ れ ま せ ん 。
uji:controlSectionタグを使ったJSPは修正しなくても実行できますが、 uji:controlSectionタグを使用しない場合と同じ動作となります。詳
細は“付録C 旧バージョンとの互換情報”を参照してください。
HttpControlStateProfileクラスの使用方法
HttpControlStateProfileクラスを使用すると以下の機能が実現できます。
・ URLリライティング
・ 二重処理の防止
・ リクエストの検証
これらの機能を利用する場合には、以下の手順でアプリケーションを作成します。
1. 全てのHTMLフォームにuji:controlStateタグを追加します。
<FORM>
<uji:controlState />
...
</FORM>
2. セションクラスをHttpControlStateProfileから継承します。
package sample;
public class SampleSession extends com.fujitsu.uji.http.HttpControlStateProfile
{
}
- 210 -
3. セションクラスで、機能に対応したメソッドをオーバライドして、必要なパラメタを返却します。
- URLリライティングを使用する場合は、getSessionModeメソッドをオーバライドします。
public int getSessionMode() {
return HttpControlStateProfile.URLREWRITING;
}
リクエストに対してCookie使用かURLリライティング使用かを動的に切り替えることはできません。
リダイレクトロケーションURLにパラメタを付加する場合は、getRedirectURLメソッドをオーバライドします。
public String getRedirectURL(String defaultUrl) {
return defaultUrl + "?addparam";
}
注意
URLリライティング機能では、javax.servlet.http.encodeURLクラスのencodeURLメソッドを利用しています。
URLにセションIDを付けるかどうかは、アプリケーションサーバのencodeURLメソッドの実装に依存します。
そのため、URLリライティング機能を利用している場合でも、URLにセションIDが付かない場合があります。
- 二重処理を防止する場合は、isDoublePostEnabledメソッドをオーバライドします。
public boolean isDoublePostEnabled() {
return false;
}
1個目のリクエストに対する処理を実行中に2個目のリクエストを受け取った場合は、2個目のリクエストに対する処理は実行
せず、1度目の処理の結果を2度目のリクエストに対して返却します。
デフォルトではPOSTメソッドによるリクエストに対して二重処理を防止します。 GETメソッドによるリクエストの二重処理も防止
する場合は、初期化パラメタuji.doublegetdisabledを設定してください。
注意
- 二重処理機能を用いた場合でも完全に二重処理を防止することは出来ません。例えば、レスポンスが通信路上を流れ
ているときにリクエストが送信された場合は、サーバ側でそれが次のリクエストであるか、二重処理のリクエストであるかを
判断することはできません。できる限り二重処理を防止したい場合はuji:formタグのpostOnceアトリビュートと併用してくだ
さい。
- ウィンドウ制御機能、フレーム制御機能を使用する場合で、異なるウィンドウもしくはフレームから二重にリクエストを送信
した場合は、最初にサーバに到達したリクエストでビジネスクラスが実行されます。後に送信したリクエストはビジネスクラ
スを実行しないため画面は更新されません。
- 二重処理のリクエストの送信先で、一方がJSP、一方がServletの場合は正しく画面を返すことができません。同一画面か
らのリクエストはすべてJSPかServletのどちらかに統一してください。
- リクエストの検証については、“17.1.8 リクエストの検証”を参照してください。
セションを明示的に切断する方法
セションを切断するには、HttpSessionProfileクラスのdisposeメソッドをビジネスクラスから呼び出します。
public void finalHandler(DispatchContext context, SomeBean dataBean) {
....
context.setResponseBean("body", dataBean);
HttpSessionProfile sp =
(HttpSessionProfile)context.getSessionProfile();
- 211 -
sp.dispose();
}
disposeの呼び出しにより、サーブレットコンテナが管理するセションの情報 (javax.servlet.http.HttpSession) からセションクラスが削除さ
れます。 Webcoordinatorがセションに関連づけて管理する情報はセションクラスに格納されているため、それらの情報もセションクラス
と共にセションから削除されます。サーブレットコンテナが管理するセションとHttpSessionは存続します。 dispose実行後最初にリクエス
トを受けたタイミングで新しいセションクラスが作成されます。
uji:formタグのpostOnceアトリビュートの使用方法
uji:formタグのpostOnceアトリビュートによる二重処理の防止機能は、同じ画面から再度フォームを送信することを防ぎます。この機能は
JavaScriptを利用して、フォーム送信時にフラグを立てることにより実現されます。JavaScriptを無効にしてあるブラウザでは動作しませ
ん。
uji:formタグで二重処理を防止するには、uji:formタグでフォームを作成し、postOnceアトリビュートに"true"を指定します。
<uji:form name="order" method="post" postOnce="true" verbs="ok,cancel" beanId="body"
beanCls="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</uji:form>
postOnce="true"を指定した場合、ブラウザの読み込みが中断されたあとでも二重処理防止機能が有効になっています。そのため、次
の画面が表示される前に読み込み停止ボタンなどを押して送信処理を中断し、そのあとで送信ボタンを押した場合はフォームが送信
されません。このような状態に備えて、postOnce="true"の指定の有無にかかわらずフォームが送信できる送信ボタンを作成できます。
送信ボタンをuji:pushButtonタグで作成し、skipScript="true"を指定してください。
<uji:form name="order" method="post" postOnce="true" verbs="ok,cancel" beanId="body"
beanCls="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<uji:pushButton type="submit" name="cancel" label="キャンセル" skipScript="true" />
</uji:form>
skipScript="true"の指定は、フォーム送信時のJavaScriptの実行を抑止するための機能です。この指定のあるボタンが押された場合
は、二重処理を防止するJavaScriptだけでなく、入力値をチェックするJavaScriptも実行されません。
17.1.6 セションIDの更新
Webcoordinatorでは、セションIDをセションの途中で更新することが可能です。セションIDを更新するには、HttpSessionProfileクラスの
renewSessionIdメソッドを使用します。
package sample;
import com.fujitsu.uji.http.HttpSessionProfile;
import com.fujitsu.uji.SessionStateException;
public void someMethod(DispatchContext context, sample.MyDataBean dataBean) {
...
context.setResponseBean("body", dataBean);
HttpSessionProfile sp = (HttpSessionProfile)context.getSessionProfile();
// セションIDを更新します。
try {
sp.renewSessionId(context);
} catch (SessionStateException e) {
// renewSessionIdメソッドで発生した例外
...
}
}
- 212 -
ポイント
http通信からhttps通信に移行するときにセションIDを更新することでセションハイジャック等の脅威に対応することが可能です。
注意
セションIDを更新する場合の注意事項は以下のとおりです。
・ ログ機能で出力されるコンテキストIDは、セションIDの更新機能を使用した場合でも変更されません。このため、同一のコンテキスト
IDを持つログを追跡することで、セションIDの更新が実行されたかどうかにかかわらず、一連のセションのログを追跡することが可
能です。
・ セションIDの更新時は、セションが開始されている必要があります。
・ セションIDの更新時は、HttpSession関連のリスナーのメソッドが呼び出されます。
・ ビジネスクラスをセションスコープとした(initメソッドがtrueを返すようにプログラムした)場合であっても、セションIDの更新の前後で
ビジネスクラスのインスタンスは引継がれません。
17.1.7 セションの明示的な開始と破棄
Webcoordinatorでは、セションを明示的に開始または破棄することが可能です。
アプリケーション起動時のセション自動開始設定
アプリケーション起動時にセションを自動的に開始するかどうかを初期化パラメタuji.session.manualControlで設定します。セションを明
示 的 に 開 始 ま た は 破 棄 す る 場 合 は 、 初 期 化 パ ラ メ タ uji.session.manualControl に true を 指 定 し ま す 。 初 期 化 パ ラ メ タ
uji.session.manualControlの指定方法の詳細は、“13.3 初期化パラメタ”を参照してください。
<context-param>
<param-name>uji.session.manualControl</param-name>
<param-value>true</param-value>
</context-param>
セション開始前または破棄後に表示する画面の作成
セション開始前または破棄後に表示する制御ページおよび入出力ページは次のように作成します。
・ <%@ page session="false"%>を記述します。
・ “セション開始前または破棄後に表示する画面で使用可能なUJIタグ一覧”に示したUJIタグを使用します。
・ uji:formタグを使用している場合、uji:formタグのbeanClsアトリビュートを記述します。
・ HTMLのFORMタグを使用している場合、リクエストパラメタuji.beanを記述します。
・ データBeanは、com.fujitsu.uji.DataBeanクラスを継承して作成します。XML連携機能は利用できません。
制御ページ
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page session="false" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<%@ page errorPage="errorPage.jsp" %>
</HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="body" />
- 213 -
</BODY>
</HTML>
入出力ページ
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ page session="false" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
・・・・・・
<!-- uji:formタグを使用している場合 -->
<uji:form name="mainForm" verbs="ok" beanId="body" beanCls="sample.MyDataBean">
・・・・・・
</uji:form>
<!-- HTMLのFORMタグを使用している場合 -->
<form action="main.jsp">
<input type="hidden" name="uji.bean" value="sample.MyDataBean">
・・・・・・
</form>
セション開始前または破棄後に表示する画面で使用可能なUJIタグ一覧
タグ種別
基本タグ
画面部品タグ
クライアントスクリプ
トタグ
コンポーネントタグ
タグ名
機能
uji:dispatch
ビジネスクラスの呼び出し
uji:include
入出力ページの取り込み
uji:includedBody
uji:includeタグと連携した入出力ページの出力
uji:useBean
データBeanに対する名前付け
uji:getProperty
データBeanのプロパティの値を画面に出力
uji:controlState
セション管理
uji:resourceText
リソースファイルに定義した文字列の出力
uji:table
データを表形式に展開(*)
uji:tableRenderer
データを表形式に展開する場合の展開形を指定(*)
uji:tree
ツリー構造のデータを展開(*)
uji:treeRenderer
ツリー構造のデータを展開する場合の展開形を指定(*)
uji:list
リスト形式のデータを展開(*)
uji:listRenderer
リスト形式のデータを展開する場合の展開形を指定(*)
uji:switch
条件によって異なる画面を展開
uji:case
条件によって異なる画面を展開する場合の展開形を指定
uji:value
カレントオブジェクトの値(*)
uji:children
画面部品タグの展開形式で下位の構造を展開(*)
uji:action
HTMLのイベントに対して実行するJavaScriptの記述
uji:validate
HTMLのイベントが発生した時の項目チェックとJavaScriptの実
行
uji:form
フォーム
uji:input
クライアントスクリプトの利用(INPUTタグ相当)
uji:textarea
クライアントスクリプトの利用(TEXTAREAタグ相当)
uji:select
クライアントスクリプトの利用(SELECTタグ相当)
uji:label
ラベル
- 214 -
タグ種別
タグ名
機能
uji:borderLayout
上下左右に領域を設定するレイアウト
uji:borderLayoutRenderer
uji:borderLayoutの各領域の内容の記述
uji:gridLayout
項目をグリッドに揃えるレイアウト
uji:gridLayoutRenderer
uji:gridLayoutの各領域の内容の記述
uji:tabbedLayout
タブで切り替え可能なレイアウト
uji:tabbedLayoutRenderer
uji:tabbedLayoutRendererの各領域の内容の記述
(*)表やリストなどの繰り返しデータを画面に展開して表示する場合に使用します。ただし、INPUTタグなどの入力項目を作成すること
はできません。以下に使用例を示します。
<uji:table bean="body" property="table">
<uji:tableRenderer type="column">
<TD bgcolor="#EEFFEE"><uji:value/></TD>
</uji:tableRenderer>
....
</uji:table>
セションの開始
セションを開始するには、HttpSessionProfileクラスのopenSessionメソッドを使用します。
package sample;
import com.fujitsu.uji.http.HttpSessionProfile;
import com.fujitsu.uji.SessionStateException;
public void someMethod(DispatchContext context, sample.MyDataBean dataBean) {
...
context.setResponseBean("body", dataBean);
HttpSessionProfile sp = (HttpSessionProfile)context.getSessionProfile();
// セションを開始します。
try {
sp.openSession(context);
} catch (SessionStateException e) {
// openSessionメソッドで発生した例外
...
}
}
openSessionメソッドを呼び出すことにより、サーブレットコンテナが管理するセションの情報 (javax.servlet.http.HttpSession) が生成さ
れ、セションクラスがセションスコープに格納されます。セションクラスは、セションが開始されるまでリクエストスコープに格納されていま
す。
セションの破棄
セションを破棄するには、HttpSessionProfileクラスのcloseSessionメソッドを使用します。
package sample;
import com.fujitsu.uji.http.HttpSessionProfile;
import com.fujitsu.uji.SessionStateException;
public void someMethod(DispatchContext context, sample.MyDataBean dataBean) {
...
context.setResponseBean("body", dataBean);
HttpSessionProfile sp = (HttpSessionProfile)context.getSessionProfile();
// セションを破棄します。
try {
- 215 -
sp.closeSession(context);
} catch (SessionStateException e) {
// closeSessionメソッドで発生した例外
...
}
}
closeSessionメソッドを呼び出すことにより、サーブレットコンテナが管理するセションの情報 (javax.servlet.http.HttpSession) が破棄さ
れ、セションスコープに格納されていたセションクラスがリクエストコープに格納されます。
注意
セションを明示的に開始または破棄する場合の注意事項は以下のとおりです。
・ セションの開始時は、セションが開始されていない必要があります。
・ セションの破棄時は、セションが開始されている必要があります。
・ 以下の機能を有効に設定している場合でも、セション開始前、破棄後またはセションタイムアウト後の場合は機能が無効になりま
す。以下の機能は、セションを開始してから破棄するまで、またはセションタイムアウトとなるまでの間で有効となります。
- HttpControlStateProfileクラスによる二重処理防止機能
- ページチェック機能
- リクエストの正当性検証機能
セション開始前または破棄後に二重処理防止を行いたい場合は、uji:formタグのpostOnceアトリビュートを利用した二重処理防止機能
を使用する必要があります。
・ セション開始前、セション破棄後またはセションタイムアウト後に以下の機能を利用することはできません。
- ウィンドウ制御機能
- フレーム制御機能
・ セション開始前または破棄後の場合、ビジネスクラスをセションスコープとした(initメソッドがtrueを返すようにプログラムした)場合で
あってもビジネスクラスはリクエストスコープとなります。
・ セション開始前または破棄後の場合、HttpSessionProfileクラスのgetSessionメソッドはnullを返します。
・ セション開始前または破棄後の場合、uji:useBeanタグのrequestアトリビュートをtrueにした場合でもデータBeanは保持されません。
・ 初期化パラメタuji.session.manualControlは、初回利用時に読み込まれます。アプリケーション動作中の動的変更はできません。
17.1.8 リクエストの検証
Webcoordinatorでは、不当な画面から送信されたリクエストを検出して、例外を発生させることができます。 不当な画面から送信された
リクエストを検出する方法には、ページチェック機能とリクエストの正当性検証機能があります。
注意
ボタンのダブルクリック等で2重にリクエストが送信された場合でも不当なリクエストと判定される場合があります。
ページチェック機能
ブラウザの戻るボタンや、キャッシュ内の画面で実行することによって、予期しないページからのリクエストが実行される場合がありま
す。ページチェック機能では、これを検出して例外(エラーコード UJI055)を発生させることができます。
使用方法
ページチェック機能を利用する場合には、以下の手順でアプリケーションを作成します。
1. セションクラスをHttpControlStateProfileから継承します。HttpControlStateProfileクラスについては、“17.1.5 高度なセション管
理”を参照してください。
- 216 -
2. HttpControlStateProfileクラスのisPageCheckEnabledメソッドをオーバライドしてtrueを復帰するようにします。
public boolean isPageCheckEnabled() {
return true;
}
サーバが最後に送信したページ以外からのリクエストの場合は、ControlStateExceptionがスローされます。これを判定して別
の処理をする場合はセションクラスまたはアプリケーションクラスのhandleExceptionメソッドに記述します。
注意
セション開始前または破棄後の場合、本機能は無効となります。
リクエストの正当性検証機能
不当な画面から送信されたリクエストによって、実行すべきでないビジネスクラスのメソッドが実行されてしまう可能性があります。リクエ
ストの正当性検証機能では、この不当なリクエストを検出して例外を発生させることができます。
以下の図は、画面3からリクエストが送信された場合に実行されるビジネスクラスのメソッドが、画面1から送信されたリクエストによって実
行されてしまう例です。
1. 画面1を表示します。
2. 画面2に遷移せずに、画面3で送信されるリクエストを画面1から送信します。
3. 画面3からリクエストが送信された場合に実行されるビジネスクラスのメソッドが、画面1から送信されたリクエストによって実行され
てしまいます。
Webcoordinatorは、リクエストからコマンド名(uji.verb)と入力データBean情報(uji.beanまたはuji.id)を取得し、コマンドマップを参照して
ビジネスクラスのメソッドを呼び出します。リクエストの正当性検証機能では、これらの情報を用いて不当な画面から送信されたリクエス
トを検出します。
不当な画面から送信されたリクエストの場合は、IllegalRequestExceptionがスローされます。これを判定して別の処理をする場合はセ
ションクラスまたはアプリケーションクラスのhandleExceptionメソッドに記述します。
- 217 -
使用方法
リクエストの正当性検証機能を利用する場合には、以下の手順でアプリケーションを作成します。
1. セションクラスをHttpControlStateProfileから継承します。HttpControlStateProfileクラスについては、“17.1.5 高度なセション管
理”を参照してください。
2. HttpControlStateProfileクラスのisRequestCheckEnabledメソッドをオーバライドしてtrueを復帰するようにします。
public boolean isRequestCheckEnabled() {
return true;
}
3. 入力フォームに使用するタグによって以下のとおり異なります。
3-1) uji:formタグを使用する場合
uji:formタグのverbsアトリビュートに、このフォームから発生するコマンド一覧を指定します。
<uji:form name="myform" verbs="button1,button2" beanId="body">
....
<INPUT TYPE="SUBMIT" NAME="button1" VALUE="ボタン1">
<INPUT TYPE="SUBMIT" NAME="button2" VALUE="ボタン2">
</uji:form>
上記では、フォームから発生するコマンド一覧として「button1,button2」を指定しています。
3-2) HTMLのFORMタグを使用する場合
ビジネスクラスのメソッド内でHttpControlStateProfileクラスのaddNextCommandsメソッドを使用して、ウィンドウ名、コマンド名
(uji.verb)および入力データBean情報(uji.beanまたはuji.id)を設定します。 addNextCommandsメソッドの詳細は、“APIリファ
レンス”を参照してください。
package sample;
import com.fujitsu.uji.http.HttpDispatchContext;
public void someHandler(DispatchContext context, sample.MyDataBean dataBean) {
SampleSession session = (SampleSession)context.getSessionProfile();
String[] commends = {"button1", "button2"};
session.addNextCommands((HttpDispatchContext)context, "winName", "subBody",
null, commends);
...
}
上記では、ウィンドウ名「winName」、uji.idの値「subBody」、コマンド名「button1」と「button2」を指定しています。
以下のような入出力ページを使用している場合も、addNextCommandsメソッドを使用してウィンドウ名、コマンド名(uji.verb)および入力
データBean情報(uji.beanまたはuji.id)を設定する必要があります。
・ 同一ウィンドウ内でuji:formタグとHTMLのFORMタグを混在して使用している。
この場合、uji:formタグで指定された情報にaddNextCommandsメソッドで設定したウィンドウ名、コマンド名(uji.verb)および入力データ
Bean情報(uji.beanまたはuji.id)が追加されます。
・ ファイルのアップロード機能、ファイルのダウンロード機能を利用している場合で、入力フォームにHTMLのFORMタグを使用して
いる。
・ uji:anchorタグをフォーム指定モードで使用し、formアトリビュートでHTMLのFORMタグのフォーム名を指定している。
・ サブウィンドウまたはフレームで画面が複数ある場合で、入力フォームにHTMLのFORMタグを使用している画面が存在している。
注意
リクエストの正当性検証機能を利用する場合の注意事項は以下のとおりです。
・ セション開始前、セション破棄後またはセションタイムアウト後の場合、本機能は無効となります。
- 218 -
・ リクエストの正当性検証機能とページチェック機能の組み合わせで、ブラウザの戻るボタンやキャッシュ内の画面からのリクエストが
送信された場合の動作を以下に示します。
リクエストの正当性 ページチェック機
検証機能
能
有効
有効
動作
リクエストの正当性検証機能とページチェック機能の併用ができます。検証
順は以下のとおりです。
1. ページチェック機能
2. リクエストの正当性検証機能
無効
無効
リクエストの正当性検証機能が有効になります。
有効
ページチェック機能が有効になります。
無効
リクエストの検証をおこないません。リクエストの正当性検証機能、ページ
チェック機能とも無効になります。
・ タイムアウト後の画面からリクエストが送信された場合でも例外(IllegalRequestException)が発生します。
17.2 バイナリファイルの送受信
17.2.1 ファイルをアップロードする
Webcoordinatorはバイナリファイルの送受信の機能を持っています。ファイルのアップロード・ダウンロードのアプリケーションを簡単に
作成できます。ファイルをアップロードするアプリケーションは以下のように作成します。アップロードしたファイルを受け取るBeanのプ
ロパティを、com.fujitsu.uji.util.MimeSource型に定義します。
import com.fujitsu.uji.util.MimeSource;
import com.fujitsu.uji.DataBean;
public class UpBean extends DataBean {
protected MimeSource file;
public MimeSource getFile() {
return file;
}
public void setFile(MimeSource file) {
this.file = file;
}
}
入出力ページは以下のように作成します。
・ formタグにenctype="multipart/form-data"を追加します。
・ ファイル名入力の入力フィールドをtype="file"とします。また初期値を削除します。
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="updown.UpBean" request="true" />
<FORM method="post" enctype="multipart/form-data">
<INPUT name="uji.verbs" type="hidden" value="upload">
<INPUT name="uji.id" type="hidden" value="head">ファイル名:
<INPUT type="file" name="file" >
<BR>
<INPUT name="upload" type="submit" value="送信">
</FORM>
ビジネスクラスでは、Beanからストリームとファイルを取り出すことができます。サーバに格納する場合は、サーバ上の絶対パスを指定し
ます。
- 219 -
import java.io.InputStream;
import com.fujitsu.uji.util.MimeSource;
.....
public void upload(DispatchContext context, UpBean dataBean) {
MimeSource source = dataBean.getFile();
InputStream is = source.getInputStream();
String fname = source.getFileName();
....
}
.....
ファイルの取り出しが終了したら、MimeSource型のプロパティにnullを設定します。このようにしてMimeSourceへの参照を削除すること
により、ガーベジコレクタがMimeSourceを破棄できるようになります。MimeSourceが破棄された時点でリソースが解放されます。
dataBean.setFile(null);
ファイル転送のパラメタはアプリケーションクラスで指定します。アプリケーションクラスの以下のメソッドをオーバライドすることで、転送
サイズの上限、転送時に使用するメモリサイズ(超えると作業ファイルを使用)を指定することができます。デフォルトは、転送サイズの上限が
16Mバイト、メモリサイズが1Mバイトです。
// ファイル転送の最大サイズです。単位はバイトです。0は無制限を表します。
public long getMimeTransferSizeLimit() {
// 転送サイズの上限を32Mバイトにします。
return 32*1024*1024;
}
// ファイル転送時に準備するメモリサイズです。単位はバイトです。
public int getMimeTransferMemorySize() {
// 転送時に準備するメモリサイズを1Mバイトにします。
return 1024*1024;
}
ファイルをアップロードする場合には、以下の定量制限があります。
・ アップロードヘッダ長は1024バイト以内です。
アップロードヘッダには、項目名とファイル名の情報が含まれます。利用するブラウザによって多少異なりますが、項目名長とファ
イル名長を合わせて、970バイト程度を指定可能です。
・ アップロードファイルサイズの上限はデフォルトで16MB(16*1024*1024バイト)です。このサイズは、前述のとおり、アプリケーション
クラスでgetMimeTransferSizeLimitメソッドをオーバライドすることで変更できます。
これらの定量制限を超えた場合は、IOException例外が発生します。発生した例外はDispatchExceptionクラスでラップされ、セションク
ラスに実装したhandleExceptionメソッド、アプリケーションクラスに実装したhandleExceptionメソッドに通知されます。なお、handleException
メソッドを使用するには、Postprocessorインタフェースをセションクラスまたはアプリケーションクラスに実装する必要があります。
handleExceptionメソッドの使用方法については、“4.2 エラー処理”を参照してください。
17.2.2 ファイルをダウンロードする
ファイルをダウンロードする場合には、JSPと出力ストリームが競合するため、JSPは使用できません。そのため、サーブレットを作成し
て、サーブレットからダウンロードするようにします。
サーブレットは、UjiServletを継承して作成します。メソッドを作成する必要はありませんが、クラスローダがアプリケーションのJavaクラス
をロード可能にするために、アプリケーションの中にサーブレットクラスを持つ必要があります。
package updown;
public class DownloadServlet extends com.fujitsu.uji.http.UjiServlet {
public DownloadServlet() {
}
}
- 220 -
ダウンロードのための入力フォームでは、action="download"を追加します。ここで指定したdownloadはサーブレットの識別名で、任意
に指定可能です。例ではダウンロードファイル名を固定にして隠し項目で作成しています。データBean updown.DownloadParamの作
成については、一般的なWebcoordinatorアプリケーションと同じなので省略します。
<FORM action="download">
<INPUT name="uji.verbs" type="hidden" value="download">
<INPUT name="uji.bean" type="hidden" value="updown.DownloadParam">
<INPUT name="file" type="hidden" value="downloadfilename">
<INPUT name="download" type="submit" value="ダウンロード">
</FORM>
ビジネスクラスでは、復帰値をvoidに代えてObjectとします。ダウンロードするファイルをMimeSource、File、InputStreamで返します。復
帰値がMimeSource、File、InputStreamの場合は、ファイルとみなしてダウンロードを開始します。復帰値がStringの場合は、エラー等を
表示するための画面のJSPファイル名とみなします。ビジネスクラスでsetResponseBean等の処理をしてuji:includeなどを記述した
(uji:dispatchは書けません)JSPファイルを返すと、Webcoordinatorのアプリケーションに戻すことができます。
....
//
public Object download(DispatchContext context, DownloadParam dataBean)
throws FileNotFoundException {
String name = dataBean.getFile();
File file = new File("c:¥¥downloadarea", name);
InputStream is = new BufferedInputStream(new FileInputStream(file));
MimeSource ms = new MimeSource(is, name);
return ms;
}
ダウンロードするファイルをMimeSourceクラスで返した場合は、ファイル名のエンコーディングを指定することができます。ContentDispositionヘッダは、attachment; filename="ファイル名"の 形式で出力されます。 ファイル名は、指定された文字エンコーディングに
従 っ て 、 バ イ ト 列 に 変 換 さ れ 、 Content-Dispositon ヘ ッ ダ に 設 定 さ れ ま す 。 文 字 エ ン コ ー デ ィ ン グ を 設 定 し て い な い 場 合
は、"Shift_JIS"として処理します。
MimeSource ms = new MimeSource(is, name);
ms.setFileNameEnc("windows-31j");
コマンドマップは一般的なWebcoordinatorアプリケーションと共用になります。
updown.DownloadParam;download=updown.UploadHandler.download
サーバに配置する場合はweb.xmlを編集し、サーブレットマッピングを定義します。web.xmlの詳細については、“Webアプリケーション
環境定義ファイル(web.xml)”で説明します。以下はdownloadというサーブレットを定義するため、servlet、servlet-mappingを追加して
います。
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>updown.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
</web-app>
注意
ご使用のInternet Explorer 7の版数によっては以下の現象が発生する場合があります。
- 221 -
・ ブラウザの初回起動後、ファイルのダウンロード機能を使用してファイルのダウンロードを行った場合、「ファイルの情報を取得して
います」のダイアログが表示されたまま、処理が完了しません。
この場合には、ダイアログの[キャンセル]ボタンを押して処理を中止し、再度、ダウンロードを行ってください。
17.3 Webアプリケーションのエラー処理
17.3.1 JSPエラーページ
ビジネスクラス、セションクラス、アプリケーションクラスで例外が発生し、try-catch節やhandleExceptionメソッドで処理されなかった場
合、JSPエラーページが表示されます。handleExceptionメソッドによるエラー処理については“4.2 エラー処理”を参照してください。
JSPエラーページは2箇所で指定可能です。
・ @pageディレクティブ
・ uji:dispatch
uji:dispatchで指定したエラーページは、ビジネスクラス処理中の例外についてのみ使用され、@pageディレクティブで指定したエラー
ページより優先して使用されます。 @pageディレクティブで指定したエラーページには、アプリケーションの全てのエラーが表示されま
す。
<%@ page errorPage="jspError.jsp" %>
<uji:dispatch errorPage="dispatchError.jsp" />
JSPエラーページではJSPスクリプトレットを使用して例外の処理ができます。以下はJSPエラーページの例です。
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page isErrorPage="true" %>
<%@ page import="java.io.PrintWriter, com.fujitsu.uji.ApplicationProfile,
com.fujitsu.uji.log.*" %>
</HEAD>
<BODY>
<PRE>
<%
if(exception != null) {
// HTML画面に出力する
Throwable ex;
// 注意:HTML画面への出力はセキュリティ上の問題を内包しています。
// 以下のソースはデバッグ時のみ利用してください。
/*
PrintWriter writer = new PrintWriter(out);
ex = exception;
while(ex instanceof NestedException) {
String msg = ex.getClass().getName() + " : " + ex.getMessage();
msg = msg.replace('<','[');
msg = msg.replace('>',']');
writer.println(msg);
ex = ((NestedException)ex).getRootCause();
}
ex.printStackTrace(writer);
*/
// アプリケーションログに出力する
ApplicationProfile ap = (ApplicationProfile)application.getAttribute
(ApplicationProfile.APPLICATIONKEY);
if(ap != null) {
LogComposer lc = ap.getLogComposer();
- 222 -
if(lc != null) {
ex = exception;
while(ex instanceof NestedException) {
String msg = ex.getClass().getName() + " : " + ex.getMessage();
msg = msg.replace('<','[');
msg = msg.replace('>',']');
lc.println(msg);
ex = ((NestedException)ex).getRootCause();
}
lc.printStackTrace(ex);
}
}
}
%>
</PRE>
</BODY>
</HTML>
ポイント
HTML画面へのスタックトレースの出力は、セキュリティ上の問題を内包します。運用時は適切な画面を作成する必要があります。
17.3.2 データBeanのエラー処理
HTTPリクエストで送信されたデータをデータBeanに設定する場合、数値項目に対して不当な文字列を設定すると数値変換エラー
(NumberFormatException)となります。 Webcoordinatorでは、デフォルトでは、数値変換エラーは0の入力とみなして処理を継続しま
す。数値変換の厳密な判定や、特別な処理を行うためには、データBeanにUpdateExceptionListenerを実装します。
public class SampleBean extends DataBean implements UpdateExceptionListener {
public void handleException(UpdateExceptionEvent uee) {
// 例外を知る
Exception ex = uee.getException();
// 項目名を知る
String propertyName = uee.getName();
// 入力しようとした値を知る
Object value = uee.getValue();
// 代替処理の実行
....
// 処理できない場合は再度スローする
throw ex;
}
}
一例として、BigInteger型の項目に対して空文字列が送信された場合にnullを設定する場合、以下のようにします。
// 代替処理の実行
if(propertyName.equals("someBigIntProp")
&& ex instanceof NumberFormatException) {
if(value instanceof String && ((String)value).length() == 0) {
setSomeBigIntProp(null);
return;
}
// NumberFormatExceptionの場合はWebcoordinatorが
// new BigInteger(0)を設定するので、別の例外に置き換える
ex = new IllegalArgumentException("Error in someIntProp");
}
- 223 -
第18章 データベースとの連携
18.1 データベース連携の概要
コンポーネントタグとデータベース連携クラスを利用して、データベースの操作が容易にできます。 JDBC1.0、JDBC2.0に対応したデー
タベースが利用できます。
データベース連携には以下の機能があります。
・ データベースの内容を表やコンボボックスを使って画面に表示する
・ 表やレコードビューで入力した内容をデータベースに追加、更新する
・ データベースへのコネクションをデータベース連携クラスで自動管理する
データベース連携には以下のコンポーネントタグが利用できます。データBean側の項目クラスにデータベース連携クラスを使用するこ
とで、データベースから検索したデータを画面に表示します。
コンポーネントタグ
データベース連携クラス
機能
uji:comboBox
DBComboBox
コンボボックス形式の選択項目
uji:listBox
DBListBox
リストボックス形式の選択項目
uji:buttonList
DBButtonList
ボタンの組
uji:recordView
DBRecordView
レコード形式の入力項目の組
uji:tableView
DBTableView
表
uji:table
DBTableModel
画面部品のtableタグ
uji:list
DBListModel
画面部品のlistタグ
なお、データベース連携を使用する場合はJDBCドライバが必要です。詳細は“13.2 実行時に必要なソフトウェア”を参照してください。
また、実行時に必要なファイルと設定については“第22章 Webアプリケーションの実行環境の設定”を参照してください。
注意
アプリケーションサーバにInterstageを利用している場合で、コネクションプーリングだけ行いたい場合は、Interstage Application Server
のコネクションプーリング機能を使用してください。
Interstage Application Serverのコネクションプーリングについては、“J2EEユーザーズガイド”のJNDIの章を参照してください。
18.2 データベース連携のアプリケーション
データベース連携アプリケーションの作成の手順を以下に示します。
アプリケーションクラスの設定
アプリケーションクラスはDBApplicationProfileクラスを継承して作成します。
public class MyApplication extends com.fujitsu.uji.database.DBApplicationProfile
{
}
- 224 -
registDBConnectionInfoメソッドを使って、接続情報を登録します。データベース接続情報の登録はinitDBApplicationメソッドの中
で行います。
public class MyApplication extends com.fujitsu.uji.database.DBApplicationProfile {
public MyApplication() {
}
public void initDBApplication(){
// JDBC1.0使用の場合
registDBConnectionInfo("connection1",
//
"username",
//
"password",
//
"fujitsu.symfoware.jdbc.RDADriver", //
"jdbc:symforda://host:2002/db_env");//
接続名
ユーザ名
パスワード
JDBCドライバ
接続先URL
/*
// JDBC2.0使用の場合
registDBConnectionInfo("connection1",
// 接続名
"username",
// ユーザ名
"password",
// パスワード
"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory",
// JNDIファクトリ
"SYM://server",
// 接続先URL
"jdbc/Symfoware");
// JNDI名
*/
}
}
データベース連携機能を利用する場合は、必ず利用者定義のアプリケーションクラスを使用する必要があります。アプリケーション
クラスの設定方法は“17.1.1 Webcoordinatorのセション管理”を参照してください。
データBeanの設定
データBeanのプロパティとして、データベース連携クラスを作成します。
import com.fujitsu.uji.database.*;
import com.fujitsu.uji.DataBean;
public class MyBean extends DataBean
{
protected DBTableView dbView;
public DBTableView getDbView() {
return dbView;
}
public void setDbView(DBTableView dbView) {
this.dbView = dbView;
}
}
データベース連携クラスに、アプリケーションクラスから取得したコネクションと、検索方法を指定します。
public void startup(DispatchContext context) {
DBApplicationProfile app = (DBApplicationProfile)context.getApplicationProfile();
DBConnectionInfo conn = app.getDBConnectionInfo("connection1");
DBTableView dbView = new DBTableView(conn);
try {
dbView.query("SELECT * FROM TABLE");
}catch(SQLException e) {
}
MyBean bean = new MyBean();
bean.setDbView(dbView);
- 225 -
context.setResponseBean("body", bean);
}
入出力ページの作成
コンポーネントタグを使って入出力ページを作成します。
<uji:useBean id="body" />
<FORM>
<uji:tableView bean="body" property="dbView" />
...
</FORM>
色や入力フィールドの設定は、コンポーネントタグのアトリビュートで設定します。
<uji:tableView bean="body" property="dbView"
headerBackground="yellow"
dataEditable="false;false;false;false;true"
/>
データの更新
入力したデータをデータベースに反映する場合は、データベース連携クラスのupdateメソッドを使用します。
DBTableView dbView = dataBean.getDbView();
try{
dbView.update();
}catch(SQLException e){
}
行の追加や削除も、データベース連携クラスで指定して、最後にupdateメソッドで実行します。
// 追加
dbView.addRow(1);
... // 画面に表示して入力
// 削除
dbView.removeRow(4);
// データベースに反映
try{
dbView.update();
}catch(SQLException e){
}
接続のコントロール
コネクションのプール数は“Webアプリケーション環境定義ファイル(web.xml)”で指定します。
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>uji.database.connection.maxpoolsize</param-name>
<param-value>30</param-value>
</context-param>
<context-param>
<param-name>factory</param-name>
<param-value>MyFactory</param-value>
</context-param>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
- 226 -
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
- 227 -
第19章 アプレットとの連携
19.1 アプレット連携の概要
アプレット連携機能を利用して、アプレットをフロントエンドに使用したWebcoordinatorアプリケーションが容易に作成できます。
アプレット連携では以下の機能を提供します。
・ アプレットからの送信データをビジネスクラス内のメソッドに振り分けるサーブレット
・ アプレットからのデータ送受信を容易にするAPI
注意
本マニュアルでは、アプレットとWebcoordinatorアプリケーションの連携部分と、Webcoordinatorアプリケーションの作成方法を説明しま
す。
アプレットの作成方法は、Interstage Studioのマニュアルを参照してください。
19.2 アプレット連携のアプリケーション
アプレット連携のアプリケーションでは、下図のようにデータが送受信されます。
- 228 -
1. アプレットからcom.fujitsu.uji.ext.UjiServletConnectionクラスを利用して、サーバにデータBeanとコマンドを送信します
2. サーバ内のサーブレットがデータBeanとコマンドを受け取り、コマンドマップを参照してビジネスロジックに渡します。
3. ビジネスロジックでは、受け取ったデータBeanに対してユーザ定義の処理を行い、処理結果をデータBeanとして返却します。
4. 返却されたデータBeanはcom.fujitsu.uji.ext.UjiServletConnectionクラスが返却値として受信します。
上図のようにアプレット連携アプリケーションは、サーブレットとして作成されるサーバアプリケーションと、アプレットで作成されるクライ
アントアプレットから構成されます。
サーバアプリケーションは以下のファイルで構成されます。
・ サーブレットクラス
・ データBean
・ ビジネスクラス
・ コマンドマップ
以下の機能は通常のWebcoordinatorアプリケーションと同様に使用することができます。
詳細は“第3章 Apcoordinatorアプリケーションの主な構成要素”を参照してください。
・ ファクトリクラスの拡張
・ アプリケーションクラスの拡張
・ セションクラスの拡張
また、クライアントアプレットは以下のファイルで構成されます。
・ アプレットクラス
・ データBean
19.2.1 サーバアプリケーションの作成
サーバアプリケーションの作成の手順を以下に示します。
ここでは、アプレット連携特有の手順のみを説明します。各ファイルの概要や作成方法は通常のWebcoordinatorアプリケーションと同
様です。
- 229 -
“第3章 Apcoordinatorアプリケーションの主な構成要素”を参照してください。
サーブレットクラスの設定
サーブレットクラスはObjectSerializeServletクラスを継承して作成します。
public class MainServlet extends com.fujitsu.uji.http.ObjectSerializeServlet {
public MainServlet() {
super();
}
}
データBeanの設定
データBeanは直列化可能でなければいけません。com.fujitsu.uji.DataBeanクラスは直列化可能ですが、ユーザ定義のデータBean
で参照している全てのオブジェクトも直列化可能である必要があります。
詳細はJava2 SDKのドキュメントを参照してください。
ビジネスクラスの設定
ビジネスクラス内のメソッドはcom.fujitsu.uji.DataBeanを継承したクラスを返却しなければなりません。
public Object doSomething(com.fujitsu.uji.DispatchContext context,
com.fujitsu.uji.DataBean dataBean){
// ビジネスロジックを記述
return MyDataBean;
}
コマンドマップの設定
コマンドマップは通常のWebcoordinatorアプリケーションと同様です。
19.2.2 クライアントアプレットの作成
クライアントアプレットの作成方法を説明します。
サーバアプリケーションとの通信
アプレットクラスから、サーバアプリケーションと通信するには、com.fujitsu.uji.ext.UjiServletConnectionを利用します。
手順は次のとおりです。
1. com.fujitsu.uji.ext.UjiServletConnectionオブジェクトを、送信先のURLを引数にして作成します。
2. 送信するデータBeanを作成します。
3. com.fujitsu.uji.ext.UjiServletConnectionオブジェクトのinvokeメソッドを利用して、サーブレットと通信します。
4. サーブレットから送られてきたjava.io.Objectをユーザ定義のデータBeanにキャストします。
上記の手順の例を次に示します。
import java.net.URL;
import com.fujitsu.uji.ext.UjiServletConnection;
// 接続先のURLをjava.net.URLオブジェクトとして作成します。
URL url = new URL("http://somehost/myServlet");
// UjiServletConnectionオブジェクトです。
UjiServletConnection conn = null;
// 送信するデータBeanを作成します。
MyDataBean bean = new MyDataBean();
// アプレットからデータを取得します。
bean.setName(field.getText());
- 230 -
// サーブレットと通信し、返却値を取得します。
try{
// 送信先URLを使って、UjiServletConnectionオブジェクトを生成します。
conn = new UjiServletConnection(url);
// データBeanとコマンドを送信します。
bean = (MyDataBean)conn.invoke(bean, "doSomething");
} catch(Exception e){
// 通信に失敗した場合の処理を記述します。
}
ポイント
サーバアプリケーションと通信した後に画面全体を遷移したい場合はUjiServletConnectionクラスのdispatchメソッドを使用します。
dispatchメソッドの詳細は“APIリファレンス”を参照してください。
19.3 セション管理について
19.3.1 クッキーポリシーについて
アプレット連携機能では、セション管理にCookieを使用します。本機能で対応しているJava Plug-inではCookieをサポートしています
が、いくつかの制限があります。
Java Plug-in のCookieサポート機能については、Java Plug-in のドキュメントを参照してください。
また、JBKプラグインを使用する場合は、JBKプラグインのマニュアルを参照してください。
19.3.2 JBKプラグイン使用時のセション管理
JBKプラグインを使用する場合、セションはUjiServletConnectionオブジェクトのライフサイクルと同一となります。アプレット内で常に同
じセションを維持したい場合は、UjiServletConnectionのライフサイクルをアプレットと同一にしてください。
また、JSPの画面からアプレットの画面に遷移する場合、セションを維持するためにはブラウザからクッキーを取得し、UjiServletConnection
に設定する必要があります。この場合、com.fujitsu.uji.ext.PluginUtilityクラスを使うと、ブラウザから簡単にクッキーを取得することがで
きます。
例を次に示します。
import java.net.URL;
import com.fujitsu.uji.ext.UjiServletConnection;
/*
* 初期化処理。
*/
protected void initUser () {
try{
// UjiServletConnectionオブジェクトを生成します。
conn = new UjiServletConnection();
conn.setURL(new URL("http://somehost/myServlet"));
// ブラウザのクッキーを取得し、UjiServletConnectionオブジェクトに設定します。
String cookie = com.fujitsu.uji.ext.PluginUtility.getCookieFromBrowser(this);
// 設定するクッキーを取り出します。
// ここでは全てのクッキーをUjiServletConnectionに設定しています。
if(cookie != null && cookie.length() != 0){
conn.setCookie(cookie);
}
// 送信するデータを生成します。
MyBean reqBean = new MyBean();
- 231 -
MyBean resBean = (MyBean)conn.invoke(reqBean,"verb");
} catch(Exception e){
// 通信に失敗した場合の処理を記述します。
}
}
ポイント
アプレットからJSPに遷移する方法は、通常のApcoordinatorの遷移方法と同様です。
実装例はアプレット連携機能のサンプルを参照してください。
さらに、JBKプラグインを使用する場合は、明示的にセションを切断することが可能です。アプレット内でセションを切断したい場合は、
UjiServletConnectionクラスのclearCookieメソッドを使用してください。なお、ここでいうセションの切断とは、アプレットとサーバとの間の
セションを切断することであり、サーバ側のセションを破棄することではありません。
import java.net.URL;
import com.fujitsu.uji.ext.UjiServletConnection;
protected void method() {
try{
// UjiServletConnectionオブジェクトを生成します。
conn = new UjiServletConnection();
conn.setURL(new URL("http://somehost/myServlet"));
// セションを明示的に切断する。
conn.clearCookie();
// 送信するデータを生成します。新しいセションが作成されます。
MyBean reqBean = new MyBean();
MyBean resBean = (MyBean)conn.invoke(reqBean,"verb");
} catch(Exception e){
// 通信に失敗した場合の処理を記述します。
}
}
注意
明示的なセションの切断は、JBKプラグインのみ有効です。
Java Plug-inを利用する場合は、UjiServletConnectionクラスを使用したセションの明示的な切断はできません。
19.4 実行環境の設定
アプレット連携機能を使って作成したサーバアプリケーションは、通常のWebcoordinatorアプリケーションと同様の方法でサーバに配
備します。
Webcoordinatorアプリケーションの配備方法については、“第22章 Webアプリケーションの実行環境の設定”を参照してください。
ここでは、クライアントアプレットの実行環境について説明します。
クライアントアプレットの実行に必要はファイルは次の3つです。
アプレットクラス、またはアプレットクラスを含むJARファイル
作成したアプレットクラスです。クラスファイルが複数になる場合は、JARに圧縮して用意します。
HTMLファイル
アプレットを表示するためのタグが埋め込まれたHTMLファイルです。
HTMLファイルの記述方法はJava Plug-inのドキュメントを参照してください。
- 232 -
ujiapplet.jar
UjiServletConnectionとDataBeanを含む、クライアント配布用のライブラリです。
[Apcoordinatorのインストールフォルダ]¥redist¥applet にインストールされています。
ujiapplet.jarは再配布可能なファイルです。クライアント環境に配布して使用できます。
注意
JBKプラグインを使用する場合は、クライアントのクラスパスにuji.jarを含めないでください。
クライアントのクラスパスの設定方法は、JBKプラグインのマニュアルを参照してください。
- 233 -
第20章 Flashとの連携
20.1 Flash連携の概要
Flash連携機能を利用して、Flashをフロントエンドに使用したWebcoordinatorアプリケーションを作成することができます。
Flash連携機能では、FlashのActionScriptによって送信されたデータを受信するためのサーブレットを提供します。
注意
本マニュアルでは、FlashとWebcoordinatorアプリケーションの連携部分と、Webcoordinatorアプリケーションの作成方法を説明します。
Flashの作成方法は、Flash MXのマニュアルを参照してください。
20.2 Flash連携のアプリケーション
20.2.1 Flashの作成
Flash連携機能では、Flashが提供するActionScriptのうち、LoadVarsオブジェクトおよびXMLオブジェクトによる通信をサポートしてい
ます。
ActionScriptとはFlashが提供するスクリプト言語で、ムービーの制御やサーバアプリケーションとの通信が可能です。
ActionScriptはボタンのクリックや、キーの入力などのイベントによって動作が開始します。
ActionScriptの詳細はFlash MXのマニュアルを参照してください。
以下ではLoadVarsオブジェクトおよびXMLオブジェクトを利用したFlashの作成方法について説明します。
LoadVarsを使用する場合
LoadVarsオブジェクトを使用した場合の動作概要を次に示します。
- 234 -
LoadVarsオブジェクトを利用した場合、HTMLのフォームを送信した場合と同様に、キーと値の組みがサーバに送信されます。
送信されたキーは、サーバ側のデータBeanのプロパティと対応して値が格納されます。例えば、value="1"というデータを送信した場
合、データBeanのvalueフィールドに"1"が格納されます。ただし、Apcoordinatorで予約されているキー(uji_bean、uji_xmlBean、uji_verb)
はデータBeanに格納されません。
以下の例では、mypkg.MyDataBeanに対して、value1="3"、value2="4"、calMethod="add"というデータと、"myverb"というコマンドを送
信しています。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
on (release) {
myLoadVars = new LoadVars();
myLoadVars.uji_bean="mypkg.MyDataBean";
myLoadVars.uji_verb = "myverb";
myLoadVars.value1="3";
myLoadVars.value2="4";
myLoadVars.calMethod="add";
repData = new LoadVars();
repData.onLoad = myOnLoad;
myLoadVars.sendAndLoad("http://[ホスト名]/[サーブレット名]", repData);
function myOnLoad(success){
if(success){
// サーバとの通信が成功した場合の処理
_root.textarea.text = repData.message;
}
}
}
1行目
ActionScriptが起動するためのイベントハンドラです。この例ではボタンのクリックが解除されたときにActionScriptが起動します。
2行目
LoadVarsオブジェクトを作成しています。
3行目-4行目
Apcoordinatorに必要なリクエストパラメタを設定しています。上記例ではuji_beanリクエストパラメタに"mypkg.MyDataBean"を、uji_verb
リクエストパラメタに"myverb"を設定しています。Flash連携機能ではこの他にuji_xmlBeanリクエストパラメタを指定することができま
す。
リクエストパラメタ名
uji_bean
機能
省略時の動作
送信データを格納するデータBeanをパッケージ
名を含めて指定します。XMLデータBeanに送
信データを格納する場合
指定されていない場合はデータBeanを作成
しません。
- 235 -
リクエストパラメタ名
機能
省略時の動作
は"com.fujitsu.uji.xml.XmlDataBean"を指定し
てください。
uji_xmlBean
送信データをXMLデータBeanに格納する場合
のルート要素名を指定します。
XMLデータBeanに送信データを格納する場
合は省略できません
uji_verb
コマンドを指定します。
コマンドを送信しません。
5行目-7行目
送信するデータを設定しています。この例では次のデータを設定しています。データBeanに設定される場合には、キーがデータBean
のプロパティ名と対応し、XMLデータBeanに設定される場合はキーがXMLのルート要素直下の要素名に対応します。
キー
値
value1
3
value2
4
calMethod
add
8行目-9行目
返却されたデータを格納するためのオブジェクトを生成し、通信が完了した場合に呼び出すイベントを登録しています。
10行目
サーバにデータを送信し返却値を受け取ります。データを送信する場合に使用するメソッドによって返却されたデータの受け取り
方が異なります。
sendAndLoadメソッドを使用する場合
sendAndLoadメソッドに指定したオブジェクトに返却値が格納されます。指定できるものはLoadVarsオブジェクトかXMLオブジェ
クトです。
sendメソッドを使用する場合
サーバアプリケーションからの返却値がそのままブラウザに表示され、画面遷移が発生します。Webアプリケーションとしての処
理を継続する場合はJSP名を返却してください。
12行目-17行目
通信が成功した場合の処理を記述します。ここでは、テキスト(textareaオブジェクト)にrepDataのmessage変数の値を代入して画面
に表示しています。
XMLを使用する場合
XMLオブジェクトを使用した場合の動作概要を次に示します。
- 236 -
XMLオブジェクトを利用した場合、サーバ側にXMLデータが送信され、ビジネスクラスではXMLデータBeanとして受け取ることが可能
です。
このとき、コマンドや格納先のXMLデータBean(XMLデータBeanを拡張した場合)を指定することはできません。
以下では"<root><data>mydata</data></root>"というXMLデータを送信する例を示します。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
on (release) {
myXML = new XML("<root><data>mydata</data></root>");
repXML = new XML();
repXML.onLoad = myOnLoad;
myXML.sendAndLoad("http://[ホスト名]/[サーブレット名]", repXML);
function myOnLoad(success){
if(success){
// サーバとの通信が成功した場合の処理
_root.textarea.text=repXML.toString();
}
}
}
1行目
ActionScriptが起動するためのイベントハンドラです。この例ではボタンのクリックが解除されたときにActionScriptが起動します。
2行目
XMLオブジェクトを作成しています。この例ではコンストラクタでXMLデータを生成しています。
3行目-4行目
返却されたデータを格納するためのオブジェクトを生成し、通信が完了した場合に呼び出すイベントを登録しています。
5行目
サーバにデータを送信し返却値を受け取ります。データを送信する場合に使用するメソッドによって返却されたデータの受け取り
方が異なります。
sendAndLoadメソッドを使用する場合
sendAndLoadメソッドに指定したオブジェクトに返却値が格納されます。指定できるものはLoadVarsオブジェクトかXMLオブジェ
クトです。
sendメソッドを使用する場合
サーバアプリケーションからの返却値がそのままブラウザに表示され、画面遷移が発生します。Webアプリケーションとしての処
理を継続する場合はJSP名を返却してください。
7行目-12行目
通信が成功した場合の処理を記述します。ここでは、テキスト(textareaオブジェクト)にrepXMLが保持しているXMLデータを文字列
として代入し、画面に表示しています。
サーバ例外の通知
サーバアプリケーションで例外が発生した場合、ActionScriptオブジェクトには"uji_flashException"をキーにして例外情報が通知され
る場合があります。サーバアプリケーションからの例外の通知方法については“アプリケーション例外が発生した場合のクライアントへ
の通知方法”参照してください。
サーバアプリケーションが正常に終了しているかどうかは"uji_flashException"を参照してください。LoadVarsオブジェクトの場合
は"uji_flashException"変数を、XMLオブジェクトの場合は、ルート要素直下のテキストノードを参照してください。チェックの例を次に
示します。
・ LoadVarsオブジェクトの場合
on (release) {
myLoadVars = new LoadVars();
myLoadVars.uji_bean="mypkg.MyDataBean";
myLoadVars.uji_verb = "myverb";
myLoadVars.value1="3";
- 237 -
myLoadVars.value2="4";
myLoadVars.calMethod="add";
repData = new LoadVars();
repData.onLoad = myOnLoad;
myLoadVars.sendAndLoad("http://[ホスト名]/[サーブレット名]", repData);
function myOnLoad(success){
if(success){
if(repData.uji_flashException != null){
// 例外が返却された場合の処理
} else {
// サーバとの通信が成功した場合の処理
}
}
}
}
・ XMLオブジェクトの場合
on (release) {
myXML = new XML("<root><data>mydat</data></root>");
repXML = new XML();
repXML.onLoad = myOnLoad;
myXML.sendAndLoad("http://[ホスト名]/[サーブレット名]", repXML);
function myOnLoad(success) {
if (success) {
// ルートノード直下の要素に"uji_flashException"が含まれているかチェック
index = repXML.firstChild.nodeValue.indexOf("uji_flashException");
if (index != -1) {
// 例外発生時の処理を記述
// 例外メッセージの取得例("uji_flashException="以降のメッセージを取得)
_root.message.text = repXML.firstChild.nodeValue.substr(index+19);
} else {
_root.message.text = repXML.toString();
}
}
}
}
文字エンコーディングについて
Flash Player 6では、デフォルトの文字エンコーディングがUTF-8になっています。ただし、Flashコンテンツの1フレーム目のフレームス
クリプト最上部に次の一行を加えることで、文字エンコーディングを"Shift_JIS"にすることができます。詳細はAdobe社のホームページ
を参照してください。
System.useCodepage = true;
また、Webcoordinatorアプリケーションでは、初期化パラメタuji.defaultEncodingを利用することで文字エンコーディングを指定すること
ができます。ご使用の環境に合わせて、次の表を参考に文字エンコーディングを設定してください。
UTF-8を使用する場合
Shift_JISを使用する場合
[Flashの設定]
不要
[Flashの設定]
"System.useCodepage = true;"を記載
[Apcoordinatorの設定]
web.xmlでuji.defaultEncoding初期化パラメタ
に"UTF-8"を記載
[Apcoordinatorの設定]
web.xmlでuji.defaultEncoding初期化パラメタに"Shift_JIS"を
記載
- 238 -
20.2.2 サーバアプリケーションの作成
ここでは、Flash連携特有の手順のみを説明します。各ファイルの概要や作成方法は通常のWebcoordinatorアプリケーションと同様で
す。“第3章 Apcoordinatorアプリケーションの主な構成要素”を参照してください。
サーブレットクラスの作成
サーブレットクラスはFlashServletクラスを継承して作成します。 メソッドを追加する必要はありません。
public class MainServlet extends com.fujitsu.uji.http.FlashServlet {
public MainServlet() {
super();
}
}
Webアプリケーション環境定義ファイル (web.xml) の設定
web.xmlでは、次の2点を設定します。
- サーブレットを呼び出せるように"servlet"タグと"servlet-mapping"タグを記述します。
- ビジネスクラスから返却するオブジェクトのデフォルトの型を"uji.flash.returnValue"初期化パラメタで指定します。この指定によっ
て、アプリケーション例外が発生した場合のクライアントへの通知方法が異なります。デフォルトは"JSP"に設定されています。
詳細は“アプリケーション例外が発生した場合のクライアントへの通知方法”を参照してください。
以下の例はサーブレットクラスがflash.MainServletの場合で、ビジネスクラスから返却するオブジェクトのデフォルトの型をデータBean
の場合です。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
...
<context-param>
<param-name>uji.flash.returnValue</param-name>
<param-value>DataBean</param-value>
</context-param>
...
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>flash.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/MainServlet</url-pattern>
</servlet-mapping>
...
</web-app>
データBeanの作成
データBeanは通常のWebcoordinatorアプリケーションと同様です。XMLデータBeanを使用する場合はデータBeanを作成する必要
はありません。
ビジネスクラスの作成
ビジネスクラス内のメソッドでの返却値は、Flashで使用されたActionScriptのメソッドによって異なります。
LoadVars.sendAndLoadまたはXML.sendAndLoadを使用している場合は、データBeanまたはXMLデータBeanを返却します。
データBeanを返却する例
public Object doSomething(com.fujitsu.uji.DispatchContext context, com.fujitsu.uji.DataBean dataBean){
// ビジネスロジックを記述
- 239 -
return MyDataBean;
}
注意
データBeanを返却する場合、値として"&"や"="を使用することはできません。
LoadVars.sendまたはXML.sendを使用している場合は、JSP名かHTMLファイル名を返却します。ファイル名には任意の文字列を
指定することができます。 JSP名を返却する場合は、DispatchContextクラスのsetResponseBeanメソッドを使用してJSP内で使用する
データBeanを設定することが可能です。
JSP名を返却する例
public Object doSomething(com.fujitsu.uji.DispatchContext context, com.fujitsu.uji.DataBean dataBean){
// ビジネスロジックを記述
context.setResponseBean("body", dataBean);
return "nextPage.jsp";
}
また、"uji.flash.returnValue"初期化パラメタで指定された値と異なるオブジェクトを返却する場合は、DispatchContextオブジェクトを
FlashDispatchContextクラスにキャストし、setReturnValueメソッドで必ず指定してください。下記はJSPを返却する場合の指定例で
す。
public Object doSomething(com.fujitsu.uji.DispatchContext context, com.fujitsu.uji.DataBean dataBean){
((FlashDispatchContext)context).setReturnValue(FlashDispatchContext.RETURN_JSP);
context.setResponseBean("body", dataBean);
return "nextPage.jsp";
}
コマンドマップの作成
コマンドマップは通常のWebcoordinatorアプリケーションと同様です。以下に例を示します。
LoadVarsオブジェクトを使用する場合
mypkg.MyDataBean;myverb=mypkg.MyHandler.doVerb
XMLオブジェクトを使用する場合(コマンドは指定できません)
/root;=mypkg.MyHandler.doVerbXml
アプリケーション例外が発生した場合のクライアントへの通知方法
サーバアプリケーションで例外が発生した場合、クライアントへは次の2通りの通知方法があります。
・ uji_flashExceptionによるFlashへの通知
・ 画面遷移が発生する場合のエラーページによる通知
前者はsendAndLoadメソッドを使用して通信している場合に用いるもので、後者はsendメソッドを利用して通信している場合に用いるも
のです。上記の2つの通知方法は、uji.flash.returnValue初期化パラメタで指定する方法と、FlashDispatchContextクラスのsetReturnValue
メソッドで指定する方法があります。
uji.flash.returnValue初期化パラメタによる指定
uji.flash.returnValue初期化パラメタによって指定された値は、アプリケーションで共通の設定となります。uji_flashExceptionによる
通知を行う場合は"DataBean"を、エラーページによる通知を行う場合は"JSP"を指定してください。省略した場合は"JSP"となりま
す。
setReturnValueメソッドによる指定
setReturnValueメソッドで指定することで、リクエストごとの指定が可能です。setReturnValueメソッドによって指定された値
は"uji.flash.returnValue"初期化パラメタによる指定より優先度が高くなります。ただし、setReturnValueメソッドが呼ばれる前に例外
が 発 生 し た 場 合 は "uji.flash.returnValue" 初 期 化 パ ラ メ タ の 値 が 有 効 に な り ま す 。 エ ラ ー ペ ー ジ に よ る 通 知 を 行 う 場 合
- 240 -
は "FlashDispatchContext.RETURN_JSP" を 、 uji_flashException に よ る 通 知 を 行 う 場 合
は"FlashDispatchContext.RETURN_DATABEAN"を使用してください。メソッドを使用しない場合は"uji.flash.returnValue"初期化
パラメタによる指定が有効となります。
- 241 -
第21章 アプリケーション設計時の注意事項
21.1 データBeanの指定について
画面のデータを受け取るデータBeanをJSPで指定する場合、uji.idリクエストパラメタを使う方法とuji.beanリクエストパラメタを使う方法が
あります。アプリケーションによって適当な方法で指定する必要があります。
<uji:useBean id="body" cls="sample.BodyBean" request="true" />
<FORM method="post">
<INPUT name="uji.id" type="hidden" value="body">
<INPUT name="uji.bean" type="hidden" value="sample.BodyBean">
....
</FORM>
uji.id
uji.idは、DispatchContextクラスのsetResponseBeanメソッドで設定され、サーバで保持しているデータBeanに対してデータを設定し
ます。
以下の利点があります。
- 既存のデータBeanを使用するため、余分な処理が不要になり、アプリケーションの効率を上げることができます。
- 画面部品を利用する複雑な構造のデータBeanに対しても、データの設定ができます。
以下の注意事項があります。
- タイムアウトやブラウザの戻るボタン使用時に、サーバで保持されているデータBeanと画面との対応が取れなくなる場合があり
ます。戻るボタンを使用すると、サーバで保持されるデータBeanの型と画面のボタン名でコマンドマップを参照するため、意図
したビジネスクラスが呼ばれない場合があります。
- uji:useBeanタグで、request="false"と指定すると、サーバで保持しているデータBeanを削除します。request="true"と指定する必
要があります。
uji.bean
uji.beanは、HTTPリクエストに対して毎回データBeanを生成します。
以下の利点があります。
- リクエストごとにデータBeanを生成するため、タイムアウトやブラウザの戻るボタンに対しても動作可能です。
以下の注意事項があります。
- データBeanの内部に別のクラスがある場合、データBeanのコンストラクタで全て生成する必要があります。また、画面部品を利
用する場合は繰り返し数を合わせてクラスを生成する必要があります。項目クラスのインタフェース(ComboBoxModelや
TableViewModelなど)を実装するクラスでは、その内部にあるクラスについてもコンストラクタで生成する必要があります。
- 画面部品のクラス(TableModelやListModelを実装するクラス)で、値としてString以外のクラスを持つものは使用できません。
uji.idとuji.beanの併用
uji.idとuji.beanを両方指定した場合、まずサーバで保持しているデータBeanを探し、それがuji.beanで指定したクラスと一致してい
れば、そのデータBeanを使用します。サーバで保持しているデータBeanがなければ、データBeanを生成します。
以下の利点があります。
- サーバで保持しているデータBeanが利用可能な場合には、uji.idの利点が有効になります。
- タイムアウトやブラウザの戻るボタンに対しても動作可能です。
以下の注意事項があります。
- リクエスト時にデータBeanが生成される場合、uji.beanの注意事項が当てはまります。
- 242 -
21.2 送信データの文字エンコーディングについて
ブラウザから送信されるデータにどの文字エンコーディングが使用されているかを Webcoordinatorに明示的に指定できます。何も指
定しなかった場合、 JavaのエンコーディングJISAutoDetectを使用して文字エンコーディングが自動判定されます。 JISAutoDetectにつ
いては、“Java 2 SDK, Standard Edition ドキュメント”の「国際化」を参照してください。
送信データのエンコーディングの指定には以下の3通りの方法があります。
各フォームごとに文字エンコーディングを指定
フォームにuji.encodingリクエストパラメタを追加して、文字エンコーディングを 指定できます。詳細は、“UJIタグリファレンス”の
uji.encodingリクエストパラメタを参照してください。
全フォームに一括してエンコーディングを指定(API使用)
ApplicationProfileクラスのgetRequestEncodingメソッドをオーバーライドすることにより、全フォームの文字エンコーディングを 一括
して指定できます。詳細は“APIリファレンス”を参照してください。
全フォームに一括してエンコーディングを指定(Webアプリケーション環境定義ファイル使用)
Webアプリケーション環境定義ファイル(web.xml)に記述する初期化パラメタuji.defaultEncodingで全フォームの文字エンコーディ
ングを一括して指定できます。Webアプリケーション環境定義ファイルについては、“Webアプリケーション環境定義ファイル
(web.xml)”を参照してください。
複数の方法で文字エンコーディングを指定した場合、以下の優先順位で有効になります。
1. uji.encodingリクエストパラメタでの指定
2. ApplicationProfileクラスのgetRequestEncodingメソッドでの指定
3. Webアプリケーション環境定義ファイルに記述したuji.defaultEncodingパラメタの指定
サーブレットコンテナで文字エンコーディングの変換を行う場合は、getRequestEncodingメソッドまたは初期化パラメタuji.defaultEncoding
で文字エンコーディングとしてnoneを指定してください。この指定により、Webcoordinatorでは文字エンコーディングの変換をしなくなり
ます。
注意
Interstageを使用しており、以下のすべての条件に該当する場合は文字エンコーディングの変換が正しく行われません。
・ Interstage管理コンソールのワークユニットの環境設定で、Servletコンテナ設定の「リクエストURIのエンコーディング」をデフォルト
以外の設定にしている場合。
・ uji.encodingリクエストパラメタ、getRequestEncodingメソッド、初期化パラメタuji.defaultEncodingでnone以外の文字エンコーディン
グを指定している場合、または、いずれも指定を省略している場合。
・ GETメソッドで送信するフォームがある場合。(FORMタグまたはuji:formタグでmethod="get"を指定したもの、または、methodアトリ
ビュートを省略したものがある場合。)
この場合は、Interstage管理コンソールのワークユニットの環境設定で、Servletコンテナ設定の「リクエストボディ処理のエンコーディン
グをクエリパラメタに使用する」を「する」に設定してください。この設定が「しない」の場合、GETメソッドで送信されたデータについては
サーブレットコンテナとWebcoordinatorの両方で文字エンコーディングの変換が行われて正しくない変換結果となります。
- 243 -
第22章 Webアプリケーションの実行環境の設定
22.1 実行時に必要なファイル
Webcoordinatorアプリケーションの実行時に必要なファイルについて説明します。
JavaServer Facesアプリケーションについては、“JavaServer Faces ユーザーズガイド”を参照してください。
タグライブラリファイル
WebcoordinatorのUJIタグを定義するタグライブラリファイルです。 Apcoordinatorのインストールフォルダの下、libフォルダの中にありま
すので、各アプリケーションの環境(WEB-INF)に複写する必要があります。
タグライブラリのファイル名を以下に示します。
タグライブラリ名
機能
ujiall.tld
UJIタグのタグライブラリファイル
iform.tld
電子フォーム連携機能のタグライブラリファイル(このファイルは現在使用されていません。INTERSTAGE
WEBCOORDINATOR V4.0L10との互換のために残されています。)
実行時ライブラリ
Webcoordinatorアプリケーションには、以下の実行時ライブラリがあります。これらはApcoordinatorをインストールすることによって、
Apcoordinatorのインストールフォルダの下のlibフォルダにインストールされます。
実行時ライブラリはクラスパスで指定します。
ライブラリファイル名
機能
uji.jar
ApcoordinatorコアとWebcoordinatorの基本機能を提供するライブラリ
ujidb.jar
データベース連携機能のライブラリ
ujiiform.jar
電子フォーム連携機能のライブラリ (このファイルは現在使用されていません。INTERSTAGE
WEBCOORDINATOR V4.0L10との互換のために残されています。)
Webアプリケーション環境定義ファイル(web.xml)
Webアプリケーションの環境を定義します。このファイルには、以下の情報を記述します。
・ アプリケーションのコンテキストパラメタ
・ 初期化パラメタ
・ タグライブラリの場所
・ サーブレットのマッピング
以下はweb.xmlの例です。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample.SampleFactory</param-value>
</context-param>
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>sample.DownloadServlet</servlet-class>
- 244 -
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
アプリケーションのコンテキストパラメタは、context-paramタグで定義します。定義した値はjavax.servlet.ServletContextクラスの
getInitParameterメソッドで取得できます。
Webcoordinatorが使用する初期化パラメタは、コンテキストパラメタとしてcontext-paramタグで定義します。初期化パラメタの一覧は“13.3
初期化パラメタ”を参照してください。アプリケーションで使用するコンテキストパラメタは初期化パラメタ以外の名前を使用してくださ
い。
実行時に必要なソフトウェア
以下の機能を使用する場合は別途ソフトウェアが必要になります。“13.2 実行時に必要なソフトウェア”を参照してください。
・ データベース連携機能
・ XML連携機能
22.2 実行時のファイル配置
Webcoordinatorアプリケーション実行時の一般的なファイル配置を説明します。
・ JSPファイル
一般にはアプリケーションフォルダ直下に配置します。サブフォルダに配置することもできますが、その場合はページマップの定義
や、JSPから他のJSPの参照時のパスの考慮が必要です。
・ ユーザファイル
イメージなどの静的ドキュメントは、アプリケーションフォルダの直下に配置しても、サブフォルダに配置しても問題ありません。
・ Apcoordinatorファイル
関係定義ファイルおよびタグライブラリファイルは、WEB-INFフォルダの下に配置します。 WEB-INFフォルダはWebアプリケーショ
ンの情報を配置するための特別なフォルダで、クライアントから直接参照することが禁止されています。
- 245 -
・ Webアプリケーション環境定義ファイル(web.xml)
web.xmlはWEB-INFフォルダの直下に置く必要があります。
・ 利用者定義クラスファイル
利用者定義のクラスファイルは、WEB-INFのclassesフォルダの下にパッケージ階層に従って配置します。例えば、sampleパッケージの
SampleHandler.classの置き場所は、WEB-INF¥classes¥sampleの下になります。
・ 利用者定義JARファイル
利用者定義のクラスファイルをJARファイルに結合した場合は、WEB-INFのlibフォルダの下に配置します。
22.3 複数の関係定義ファイルの使用
Webcoordinatorでは、複数の関係定義ファイルを使用することができます。 commands.map、pages.mapをフォルダとして作成して、そ
の下に関係定義ファイルを名前を変えて配置します。フォルダの中の全ファイルがコマンドマップ、ページマップとして使用されます。
この機能を利用すると、アプリケーションに機能追加をした場合の関係定義の追加が容易になります。
- 246 -
第23章 Interstage Studioを使ったWebアプリケーションの開発
23.1 Interstage Studioの場合
23.1.1 Interstage Studioが提供する機能
Interstage Studioでは、Webcoordinatorアプリケーションを効率的に開発するウィザード機能を提供しています。 実際の使用例はチュー
トリアルを参照してください。
Webアプリケーション(Apcoordinator)プロジェクト作成
Interstage StudioでApcoordinatorのWebアプリケーションプロジェクトを定義することで、Interstage Studio上で構築・デバッグが可能に
なります。 ApcoordinatorのWebアプリケーションプロジェクトウィザードでは以下の機能を提供します。各クラスの詳細は“17.1.1
Webcoordinatorのセション管理”を参照してください。
・ ファクトリクラス、アプリケーションクラス、セションクラスの自動作成
・ エラーページの自動作成
・ ujiall.tldの複写、web.xmlの作成
この操作をすることで、以下が可能になります。
・ 構築
・ デバッグ
・ クラス情報の参照
注意
タグライブラリファイルujiall.tldはデバッグのためにプロジェクト内に配置しますが、更新しないでください。
データBean作成
データBean作成ウィザードでは、データBeanのプロパティ名と型を入力することで、データBeanを作成することができます。
- 247 -
入出力ページの作成
入出力ページ作成ウィザードでは、以下の機能を持っています。
・ データBeanのプロパティに対応する項目を画面に生成します。
・ ページマップを更新して、ページを追加します。
ビジネスクラスの作成
ビジネスクラス作成ウィザードでは、以下の機能を持っています。
・ Apcoordinatorインタフェースを持つメソッドを自動生成します。
・ コマンドマップを更新して、メソッドを追加します。
コマンドスクリプティングの作成
コマンドスクリプティングは、ビジネスクラス作成ウィザードで作成できます。指定された入力データとコマンドに応じて、entryタグを自動
生成します。
テンプレート
データベース連携機能を使用する場合、SQL文の入力を支援するテンプレートが利用できます。
構築
構築によって、JSPのスクリプトレット記述やタグの記述についてもエラーチェックができます。
- 248 -
注意
JavaScript記述は構築によるエラーチェックはできません。
関係定義チェック
アプリケーションの構築時にページマップ、コマンドマップに記述したクラスの存在確認をします。ページマップ、コマンドマップを手作
業で編集した場合に有効です。
デバッグ
Interstage Studioでは、2通りのデバッグ方法を提供しています。
・ ローカルマシンのInterstrage ワークユニット上でデバッグする。
・ サーバマシンのInterstage ワークユニット上でデバッグする。
23.1.2 ウィザードで生成したファイルの編集
Interstage Studioのウィザードを使用して作成したデータBean、ビジネスクラス、入出力ページのソースには、ウィザード情報が追加され
ます。これらのソースを編集する場合は、ウィザード情報を直接書き換えないようにするため、以下の方法で行なってください。
データBeanの編集
ウィザードが生成したデータBeanのソースの例を示します。
public class BodyBean extends DataBean
{
(A) //{{UJIWIZ_GENERATE(DATADEF)
//@@UJI-Wizard Information(Bean)
//@@項目1,item1,String
//}}UJIWIZ_GENERATE
(B) //{{UJIWIZ_GENERATE(DATA)
protected String item1;
//}}UJIWIZ_GENERATE
(C) //{{UJIWIZ_GENERATE(GETSET)
public String getItem1() {
return item1;
}
public void setItem1(String item1) {
this.item1 = item1;
}
//}}UJIWIZ_GENERATE
(D)
}
(A)はデータBeanのプロパティ情報、 (B)はデータBeanのプロパティ定義ブロック、 (C)はget/setメソッドブロックです。いずれも、Interstage
Studioによって管理されます。
- 249 -
データBeanのプロパティを追加する場合
データBeanの新規作成ウィザードを使用してください。ウィザードでBean参照ボタンを押して、既存のデータBeanを選択します。追
加ボタンでプロパティを追加したあとに完了ボタンを押し、上書き保存を選択します。既存のプロパティ、変数、メソッドを保存したま
ま、新たにプロパティが追加されます。
getメソッド、setメソッド以外のメソッドやデータBeanのプロパティ以外の変数を追加する場合
上記リストの(D)で示した範囲に追加してください。
ビジネスクラスの編集
ウィザードが生成したビジネスクラスのソースの例を示します。
public class SampleHandler extends GenericHandler
{
(A) //{{UJIWIZ_GENERATE(METHODDEF)
//@@UJI-Wizard Information(Class)
//@@sample.BodyBean,加算,add
//}}UJIWIZ_GENERATE
(B) public SampleHandler() {
// 以下に初期化する手続きを記述してください。
}
public boolean init() {
// セションスコープとする場合はtrue、
// しない場合はfalseを返します。
return true;
}
(C) //{{UJIWIZ_GENERATE(METHOD)
public void add(DispatchContext context, sample.BodyBean dataBean) {
// 「加算」の処理を記述します。
// 例 :
//
// 次画面用のBeanを生成し、データを設定します。
//
YYYBean bean = new YYYBean();
//
bean.setZZZ(...);
//
// 表示に使うBeanに表示モードを設定します。
//
bean.setVerb("mode2");
//
// 各画面領域対してBeanを設定します。
//
context.setResponseBean("body", bean);
}
//}}UJIWIZ_GENERATE
(D)
}
(A)はメソッド定義情報、(C)はメソッドブロックで、どちらもInterstage Studioによって管理されます。
コマンドに関連付けるメソッドを追加する場合
ビジネスクラスの新規作成ウィザードを使用してください。ウィザードでクラス参照ボタンを押して、既存のビジネスクラスを選択しま
す。追加ボタンでコマンドやメソッド名を追加したあとに完了ボタンを押し、上書き保存を選択します。既存の変数、メソッドを保存し
たまま、新たにメソッドが追加されます。
- 250 -
コマンド以外のメソッドを追加する場合や、変数を追加する場合
上記リストの(B), (D)で示した範囲に追加してください。
入出力ページの編集
ウィザードが生成した入出力ページのソースの例を示します。
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="sample.BodyBean" request="true" />
<form method="post">
<input type="hidden" name="uji.verbs" value="加算" >
<input type="hidden" name="uji.id" value="body" >
<input type="hidden" name="uji.bean" value="sample.BodyBean">
(A) <%-- {{UJIWIZ_GENERATE(ITEM) --%>
<br>項目1
<input name="item1" value="<uji:getProperty bean='body' property='item1' />">
<br>
<%-- }}UJIWIZ_GENERATE --%>
(B) <%-- {{UJIWIZ_GENERATE(SUBMIT) --%>
<input type="submit" name="加算" value="加算" >
<%-- }}UJIWIZ_GENERATE --%>
</form>
(A)は項目定義情報、(B)はコマンド情報で、どちらもInterstage Studioによって管理されます。
入出力ページを編集する際は、以下のようにしてください。
・ 上記リストの(A)の範囲に生成されたINPUTタグ、画面部品タグ、コンポーネントタグは削除しないでください。また、(A)の範囲以
外へ移動させないでください。
・ 上記リストの(B)の範囲に生成されたINPUTタグは削除しないでください。また、(B)の範囲以外へ移動させないでください。
・ HTMLタグ、レイアウトタグ、通常の文字列は、上記 (A), (B)の範囲内にも追加できます。それ以外のタグは(A), (B)の範囲以外に
追加してください。
- 251 -
第4部 EJBアプリケーションの開発
第24章 概要..................................................................................................................................................253
第25章 セションBeanの開発..........................................................................................................................257
第26章 セションBeanの実行環境の設定........................................................................................................274
第27章 Interstage Studioを使ったセションBeanの開発..................................................................................277
- 252 -
第24章 概要
Apcoordinatorが提供するEJBアプリケーションフレームワークは次の2つの機能に分けられます。
・ セションBeanの作成を支援する機能 (Bccoordinator)
・ EJBを呼び出す機能 (Apcoordinatorコア)
セションBeanの作成を支援する機能は、Apcoordinatorのフレームワークを使用してセションBeanを作成することを可能にします。
Apcoordinatorを使用することにより以下の利点があります。
・ セションBeanをWebアプリケーションと同様の手順で開発することが可能です。
・ Apcoordinatorを用いて構築されたWebアプリケーションとセションBeanの間で、それぞれが持つセション情報を自動的に互いに転
送します。
・ Apcoordinatorを用いて構築されたWebアプリケーションへデータを送信する前にHashMapクラスに変換することができます。このと
き、プロパティのフィルタリングが可能であり、セションBeanで必要となるプロパティのみを選択して送信することができます。
EJBを呼び出す機能は、Apcoordinatorで作成したWebアプリケーション、セションBeanからEJBを呼び出す機能を提供します。これは
以下の2つの機能を持ちます。
・ Apcoordinatorで作成したセションBeanを呼び出す機能: データBeanとコマンド名を引数に与えてセションBeanを呼び出します。呼
び出しにはApcoordinatorが提供するAPIを使用します。
・ 一般的なEJBの呼び出しを支援する機能: ホームインタフェースとリモートインタフェースを使って呼び出します。Apcoordinatorは
ホームインタフェースとリモートインタフェースの取得を簡単な記述で実現するためのAPIを提供します。
セションBeanの構成要素
Apcoordinatorで作成するセションBeanは以下の構成要素からなります。
ビジネスクラス
セションBeanで行う処理を実行するJavaのクラスです。
コマンドマップ
データBeanクラスとコマンド名の組に対し、呼び出されるビジネスクラスのメソッドを対応付けるファイルです。
- 253 -
セションBeanクラス
クライアントからの呼び出しを受け付け、Apcoordinatorに処理を依頼するクラスです。
ホームインタフェース
EJBオブジェクトの生成と削除を行うインタフェースです。EJBクライアントによって使用されます。
リモートインタフェース
EJBオブジェクトのメソッドを呼び出すためのインタフェースです。EJBクライアントによって使用されます。
以下は必要に応じて作成します。
データBean
クライアントからセションBeanへ入力されるデータとして、または、セションBeanからクライアントへ返されるデータとして使用されるJava
のクラスです。
セションクラス
セションを通して使われるデータを保持するためのクラスです。アプリケーション独自の情報をセションクラスに記憶させたい場合
は、ユーザ定義のセションクラスを作成します。
アプリケーションクラス
同一のJVMで動作するセションBeanのオブジェクトで共有されるデータを保持するためのクラスです。アプリケーション独自の情報
をアプリケーションクラスに記憶させたい場合は、ユーザ定義のアプリケーションクラスを作成します。
ファクトリクラス
アプリケーションクラスやセションクラスのインスタンスを作成するクラスです。ユーザ定義のアプリケーションクラスやセションクラスを
使用する場合に、ユーザ定義のファクトリクラスを作成する必要があります。
セションBean呼び出し時の動作
Apcoordinatorで作成したEJBクライアントからApcoordinatorで作成したセションBeanを呼び出す動作の概略を以下の図に沿って説明
します。なお、以降の図では説明の内容に直接関係しない構成要素は省略しています。
1. クライアントはデータBeanとコマンド名を引数としてセションBeanを呼び出します。
2. セションBeanは、データBeanとコマンド名を受け取ります。
3. データBeanとコマンド名に対応するビジネスクラスのメソッドがコマンドマップから検索され、検索されたメソッドが呼び出されま
す。
- 254 -
4. ビジネスクラスのメソッドは処理を実行し、処理結果をデータBeanに格納して返却します。
5. 返却されたデータBeanをクライアントが受け取ります。
Apcoordinatorで作成したクライアントからApcoordinatorで作成したセションBeanを呼び出す場合、以下の機能が使用できます。
・ セション情報の同期: セションクラスで保持しているデータをクライアントとセションBeanとの間で自動的に転送します。
・ データBean変換: データBeanをセションBeanに送信する前にHashMapクラスに変換します。データBeanが持つ項目クラスはString,
Integerなどの基本的なデータのクラスやその配列に変換されて、HashMapに格納されます。データBean変換使用時はプロパティ
のフィルタリングが可能です。フィルタリングにより、セションBeanで必要となるプロパティのみを選択して送信することができます。
・ HashMapクラスによるデータの入出力: セションBeanはクライアントとの入出力を行うクラスとして、データBeanの代わりにHashMap
クラスを使うことができます。この機能は、前述のデータBean変換を使用した場合に必要となります。
- 255 -
・ Apcoordinatorによるローカル呼び出し: クライアントと同じJVMの中でセションBeanを実行できます。これにより、アプリケーションの
デバッグが容易になります。
クライアントの作成
EJBを呼び出すプログラムの作成方法については以下を参照してください。
クライアントアプリケーション
Apcoordinatorで作成するアプリケー
ション
Apcoordinatorを利用せずに作成する
アプリケーション
呼び出されるEJB
参照する節
Apcoordinatorで作成した
セションBean
第7章 リモート共通インタフェース
一般的なEJB
8.2 一般的なEJBの呼び出し
Apcoordinatorで作成した
セションBean
25.3.5 Apcoordinator以外のEJBクライアントとの連携
- 256 -
8.1 Apcoordinatorで作成したセションBeanの呼び出し
第25章 セションBeanの開発
25.1 セションBeanの作成方法
セションBeanを作成するには、以下のファイルを作成する必要があります。
・ セションBeanクラス
・ ホームインタフェース
・ リモートインタフェース
・ コマンドマップ
・ ビジネスクラス
・ デプロイメント記述 (ejb-jar.xml)
・ ejb-jarファイル
以下のクラスは必要に応じて作成します。
・ データBean
・ ファクトリクラス
・ アプリケーションクラス
・ セションクラス
25.1.1 Javaソースファイルと関係定義ファイルの作成
セションBeanクラス
セションBeanクラスは、com.fujitsu.uji.ejb.bean.UjiSessionBeanクラスを継承して作成してください。メソッドを追加する必要はありませ
ん。以下の例は、セションBeanクラスのクラス名をejboffice.ejb.OfficeEJBとした場合のソースファイルです。
package ejboffice.ejb;
import com.fujitsu.uji.ejb.bean.UjiSessionBean;
public class OfficeEJB extends UjiSessionBean {
}
ホームインタフェース
ホームインタフェースはcom.fujitsu.uji.ejb.UjiSessionHomeインタフェースを継承して作成します。以下のようにcreate()メソッドを作成し
てください。
package ejboffice.ejb;
import com.fujitsu.uji.ejb.UjiSessionHome;
public interface OfficeEJBHome extends UjiSessionHome {
public OfficeEJBRemote create()
throws java.rmi.RemoteException, javax.ejb.CreateException,
java.lang.reflect.InvocationTargetException;
}
create()メソッドのシグネチャは次のようにしてください。
public [リモートインタフェース名] create()
throws java.rmi.RemoteException, javax.ejb.CreateException,
java.lang.reflect.InvocationTargetException;
- 257 -
ここで、[リモートインタフェース名]の部分はリモートインタフェースのインタフェース名で置き換えてください。
リモートインタフェース
リモートインタフェースはcom.fujitsu.uji.ejb.UjiSessionインタフェースを継承して作成します。メソッドの追加定義は必要ありません。
package ejboffice.ejb;
import com.fujitsu.uji.ejb.UjiSession;
public interface OfficeEJBRemote extends UjiSession {
}
ビジネスクラス
ビジネスクラスには、セションBeanで実行する処理を記述したメソッドを作成します。ビジネスクラスの例を示します。
package ejboffice.ejb;
import ejboffice.*;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
public class OfficeHandler extends GenericHandler {
// クライアントからの呼び出しを受けて実行されるメソッドを定義します。
// クライアントから受信したデータBeanが第2引数に与えられます。
public Object search(DispatchContext context, ViewBean dataBean) {
// 実行する処理を記述します。
int index=dataBean.getIndex();
...
dataBean.putHeader(header);
// クライアントに返却するオブジェクトをreturnで指定します。
return dataBean;
}
// 必要なだけメソッドを定義します。
...
}
ビジネスクラスの作成方法の詳細は“3.1 ビジネスクラス”を参照してください。以下では、セションBeanのビジネスクラスに特有の事項
を説明します。
・ メソッドの返り値の型はObjectにします。セションBeanからクライアントに返すオブジェクトをメソッドのreturn文で指定します。
・ クライアントからビジネスクラスが受け取るオブジェクトと、ビジネスクラスが返すオブジェクトはRMI over IIOPの規約に従っている必
要があります。この規約については“25.3.6 EJBの引数や返却値として使用可能なオブジェクト”を参照してください。
コマンドマップ
コマンドマップには、クライアントから受信したデータに応じて、どのビジネスクラスのメソッドを呼び出すのかを記述します。以下は記述
例です。
ejboffice.ViewBean;getArea=ejboffice.ejb.OfficeHandler.getArea
ejboffice.ViewBean;search=ejboffice.ejb.OfficeHandler.search
ejboffice.RenewBean;find=ejboffice.ejb.OfficeHandler.find
ejboffice.RenewBean;update=ejboffice.ejb.OfficeHandler.update
この記述例の1行目は以下の内容を意味しています。
・ クライアントから受信したデータBeanがejboffice.ViewBeanクラスであり、受信したコマンド名が"getArea"であるなら、ビジネスクラス
ejboffice.ejb.OfficeHandlerのgetAreaメソッドを呼び出す。
- 258 -
コマンドマップの記述方法の詳細は“3.6.1 コマンドマップ”を参照してください。
セションクラス
セションクラスはセションを通して使われるデータを保持するためのクラスです。セションクラスに記憶させたデータは、ビジネスクラスの
実行終了後でもセションBeanのオブジェクトが存在する限り保持されます。アプリケーション独自の情報をセションクラスに記憶させた
い場合は、ユーザ定義のセションクラスを使用してください。ユーザ定義のセションクラスの作成方法は“3.3 セションクラス”を参照して
ください。
アプリケーションクラス
アプリケーションクラスは同一のJVMで動作するセションBeanのオブジェクトで共有されるデータを保持します。アプリケーションクラス
に記憶させたデータは、他のセションBeanオブジェクトからも参照されます。アプリケーション独自の情報をアプリケーションクラスに記
憶させたい場合は、ユーザ定義のアプリケーションクラスを使用してください。ユーザ定義のアプリケーションクラスの作成方法は、“3.4
アプリケーションクラス”を参照してください。
ファクトリクラス
ファクトリクラスはアプリケーションクラスやセションクラスのインスタンスを作成するクラスです。ユーザ定義のアプリケーションクラスやセ
ションクラスを使用する場合は、ユーザ定義のファクトリクラスを作成し、そのクラス名を初期化パラメタで指定する必要があります。ファ
クトリクラスの作成方法は、“3.5 ファクトリクラス”を参照してください。初期化パラメタの設定方法は“25.1.2 セションBeanの初期化パラメ
タの設定”を参照してください。
25.1.2 セションBeanの初期化パラメタの設定
Apcoordinatorで作成したアプリケーションの動作を設定するパラメタを初期化パラメタと呼びます。初期化パラメタの一覧は“13.3 初期
化パラメタ”を参照してください。初期化パラメタの指定方法は2通りあります。
・ デプロイメント記述で指定する: エンタープライズBean環境のエントリとして初期化パラメタを定義する方法です。エントリ名は"uji/
xxx"とします。ここで、xxxは初期化パラメタ名です。エントリの型はjava.lang.Stringを指定します。パラメタlogLevel (ログ出力レベ
ルの設定) など、プログラムのコンパイル後に変更する可能性が高いパラメタはこの方法で指定することを推奨します。
ポイント
EJB2.0以前のEJBアプリケーションの場合、エントリの値は、セションBeanをEJBコンテナへ配備する際に変更可能です。
・ セションBeanクラスで指定する: 以下のように、UjiSessionBeanクラスのgetInitParametersメソッドをオーバーライドして、初期化パラメタを
Propertiesクラスに格納します。
import com.fujitsu.uji.ejb.bean.*;
import java.util.Properties;
public class OfficeEJB extends UjiSessionBean {
protected Properties getInitParameters() {
Properties p=new Properties();
// ユーザ定義のファクトリクラスを指定します。
p.setProperty("factory","ejboffice.ejb.OfficeFactory");
return p;
}
}
パラメタfactory (ファクトリクラスの指定) など、プログラムのコンパイル後に変更する可能性が低いパラメタはこの方法で指定するこ
とを推奨します。
25.1.3 デプロイメント記述 (ejb-jar.xml)
デプロイメント記述はEJBの構成や設定を記述するXMLファイルです。デプロイメント記述には以下の情報を記述します。
- 259 -
設定項目
デプロイメント記述の
タグ
設定値
EJBの名前
ejb-name
セションBeanに付ける名前。同一のejb-jarファイルに複数のEJBが格納されている場
合は、それぞれ異なる名前を付けます。
EJBのクラス
ejb-class
セションBeanクラスのクラス名
ホームインタ
フェース
home
ホームインタフェースのインタフェース名
リモートインタ
フェース
remote
リモートインタフェースのインタフェース名
セションBeanの
種類
session-type
ステートフルの場合はStateful、ステートレスの場合はStateless。
トランザクション
の管理方法
transaction-type
Bean管理のトランザクション区切り(Bean-managed transaction demarcation)の場合は
Bean、コンテナ管理のトランザクション区切り(Container-managed transaction
demarcation)の場合はContainer。
デプロイメント記述の具体的な作成方法は、Interstage Studioなどご使用になる開発環境の説明書を参照してください。以下にEJB2.0
のデプロイメント記述の例を示します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<display-name>OfficeEJB</display-name>
<ejb-name>OfficeEJB</ejb-name>
<home>ejboffice.ejb.OfficeEJBHome</home>
<remote>ejboffice.ejb.OfficeEJBRemote</remote>
<ejb-class>ejboffice.ejb.OfficeEJB</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>OfficeEJB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
25.1.4 ejb-jarファイル
ejb-jarファイルは、EJBに必要なファイルを格納したJARファイルです。ejb-jarファイルには以下のファイルを格納します。
・ 以下のJava クラスファイル: パッケージ階層に沿ったフォルダ階層に配置します。
- セションBeanクラス
- ホームインタフェース
- リモートインタフェース
- ビジネスクラス
- ユーザ定義のセションクラス
- 260 -
- ユーザ定義のアプリケーションクラス
- ユーザ定義のファクトリクラス
- 以上のクラスで使用されるユーザ定義のクラス
・ 以下の設定ファイル: 後述する設定ファイルフォルダに配置します。
- コマンドマップ
- コマンドスクリプティング
- リモートマップ
- データBean変換マップ
・ デプロイメント記述 (ejb-jar.xml): /META-INFに配置します。
設定ファイルフォルダはセションBeanクラス名から次のように決まります。
/[パッケージ階層]/[クラス名]_inf
ここで、[パッケージ階層]はセションBeanクラスのパッケージに沿ったフォルダ階層、[クラス名]はセションBeanクラスのクラス名です。例
えば、セションBeanクラスがejboffice.ejb.OfficeEJBなら、設定ファイルフォルダは/ejboffice/ejb/OfficeEJB_infとなります。
初期化パラメタuji.infoPathによって、設定ファイルフォルダを変更することも可能です。
ejb-jarファイルの具体的な作成方法は、Interstage Studioなどご使用になる開発環境の説明書を参照してください。
25.2 セションBean特有のプログラミング
25.2.1 例外処理
EJB仕様ではEJBの実行中に発生する例外として、以下の2種類を定義しています。
・ アプリケーション例外: クライアントに通知される例外です。以下の全ての条件を満たす例外がアプリケーション例外です。
- java.lang.Exceptionのサブクラスである。
- java.lang.RuntimeExceptionのサブクラスではない。
- java.rmi.RemoteExceptionのサブクラスではない。
・ システム例外: 処理を継続できなくなるような回復不能な例外を表します。この例外はEJBコンテナが受け取り、例外を発生したEJB
のオブジェクトは削除されます。以下のすべての条件を満たす例外がシステム例外です。
- アプリケーション例外でない。
- java.rmi.RemoteExceptionのサブクラスではない。
ビジネスクラスで発生した例外も基本的に上記の分類に従って処理されます。
・ アプリケーション例外の場合、クライアントに通知されます。
・ システム例外の場合、EJBコンテナに通知されます。その結果、セションBeanのオブジェクトは削除されます。
ただし、ビジネスクラスがPostprocessorインタフェースを実装している場合は、例外はhandleExceptionメソッドで処理されます。
handleExceptionメソッドが例外を発生した場合は、上記の処理に従います。handleExceptionメソッドについては、“4.2 エラー処理”を
参照してください。
デバッグの目的で、セションBean内で発生したシステム例外をクライアントに通知する場合は、初期化パラメータuji.informSystemException
を“client”に設定してください。この設定により、システム例外はコンテナではなくクライアントに通知されます。また、システム例外が発
生してもセションBeanオブジェクトは削除されません。運用時はuji.informSystemExceptionを“container”に設定して、通常どおりシステ
ム例外がEJBコンテナに通知されるように設定してください。
- 261 -
25.2.2 エンタープライズBean環境の参照
エンタープライズBean環境(デプロイメント記述の<env-entry>で定義された値)はEJBDispatchContextのgetEnvironmentメソッドで取得
できます。 以下は、ビジネスクラスのメソッドでエンタープライズBean環境を取得する例です。
import com.fujitsu.uji.ejb.bean.EJBDispatchContext;
...
public Object search(DispatchContext context, HashMap data) {
// エンタープライズBean環境java:comp/env/initialCountの値を取得します。
Integer i = (Integer)((EJBDispatchContext) context).getEnvironment("initialCount");
...
}
EJBDispatchContextのメソッドを利用するには、ビジネスクラスのメソッドの第1引数に与えられるDispatchContextをEJBDispatchContext
にキャストします。
getEnvironmentメソッドの引数にはエントリの名前からjava:comp/env/を除いた部分を指定します。上記の例ではjava:comp/env/
initialCountの値が取得されます。 指定された名前が未定義の場合はnullが返ります。
ポイント
一般的なEJBと同様にIniticalContextを使ってエンタープライズBean環境を取得することも可能です。ただし、getEnvironmentメソッドを
使用した場合には、ローカル呼び出し機能で呼び出された場合でもエンタープライズBean環境が取得できます。
25.2.3 SessionContextの取得
EJBコンテナはjavax.ejb.SessionContextインタフェースを実装したオブジェクトをセションBeanに与えます。このSessionContextを取得す
るには、EJBSessionProfileのgetEJBContextメソッドを使用します。このメソッドをビジネスクラスで呼び出す例を示します。
import com.fujitsu.uji.ejb.bean.EJBSessionProfile;
import javax.ejb.SessionContext;
public Object search(DispatchContext context, HashMap data) {
EJBSessionProfile sp = (EJBSessionProfile)context.getSessionProfile();
SessionContext sessionContext = (SessionContext)sp.getEJBContext();
}
getEJBContextメソッドの返り値の型はSessionContextのスーパーインタフェースであるEJBContextです。これをSessionContextにキャス
トして使用します。
EJBSessionProfileのメソッドを利用するには、DispatchContextのgetSessionProfileでセションクラスを取得し、それをEJBSessionProfile
にキャストします。
25.2.4 オブジェクトのライフサイクル
アプリケーションクラス、セションクラス、ビジネスクラスのライフサイクルは以下のようになります。
クラス
インスタンスが作成されるタイミング
インスタンスの有効期間
ビジネスクラス(initメ
ソッドがtrueを返す場
合)
セションBeanオブジェクト作成後、クライアント
からの呼び出しを受けてビジネスクラスが初
めて呼び出される時
セションBeanオブジェクトがEJB
コンテナから削除されるまで
ビジネスクラス(initメ
ソッドがfalseを返す
場合)
クライアントからの呼び出しを受けてビジネス
クラス呼び出される時
クライアントからの呼び出しが終
了するまで
- 262 -
備考
クライアントからの呼び
出しがあるたびにイン
スタンスが作成されま
す。
クラス
インスタンスが作成されるタイミング
インスタンスの有効期間
セションクラス
セションBeanオブジェクトが作成された時(セ
ションBeanのejbCreateメソッドが呼び出された
とき)
セションBeanオブジェクトがEJB
コンテナから削除されるまで
アプリケーションクラ
ス
同一のJVM内で最初にセションBeanのオブ
ジェクトが作成された時(同一のJVM内で最
初にセションBeanのejbCreateメソッドが呼び
出された時)
全てのセションBeanインスタン
スがEJBコンテナから削除され
るまで
備考
同一のJVMに存在す
る複数のセションBean
オブジェクトで1個のイ
ンスタンスが共有され
ます。
ステートフルセションBeanの場合、クライアントとセションBeanが1対1に対応します。したがって、ビジネスクラスが2回以上呼び出される
場合、その呼び出し元は同一のクライアントです。 一方、ステートレスセションBeanの場合、クライアントとセションBeanは1対1で対応づ
けられていません。そのため、ビジネスクラスが2回以上呼び出される場合、その呼び出し元が同じクライアントであるとは限りません。
25.2.5 ユーザ定義ビジネスメソッドの利用
Apcoordinatorで作成したセションBeanはビジネスメソッドを1個だけ持ち、そのメソッド名はexecです。 execとはトランザクション属性など
が異なるビジネスメソッドが必要な場合は、次のようにしてください。
・ セションBeanクラスにユーザ定義のビジネスメソッドを追加する。
・ 追加したビジネスメソッドをリモートインタフェースにも追加する。
・ デプロイメント記述で、execメソッドとユーザ定義ビジネスメソッドにそれぞれ別のトランザクション属性を割り当てる。
・ クライアントからセションBeanを呼び出すときはメソッド名を指定し、呼び出すメソッドを区別する。
ビジネスメソッドを追加したセションBeanクラスは次のように作成します。
import com.fujitsu.uji.ejb.bean.UjiSessionBean;
import java.lang.reflect.InvocationTargetException;
public class OfficeEJB extends UjiSessionBean {
public Object[] myExec(Object dataBean, String verb, Object syncData)
throws InvocationTargetException {
return exec(dataBean,verb,syncData);
}
}
これは、ビジネスメソッドmyExecを追加した例です。メソッドの引数の型、返り値の型、throws節は上記例と同じにしてください。また、
上記例と同様にexecを呼び出してその返り値を返すように作成してください。execメソッドはUjiSessionBeanクラスに定義されています。
クライアントからユーザ定義のビジネスメソッドを呼び出す時には次のようにメソッド名を指定してください。
・ セションBeanの呼び出しにEJBCallFactoryを使用する場合: UjiSessionCallクラスのinvokeメソッドの代わりにinvokeMethodメソッド
を使用します。その第1引数にメソッド名を指定します。
UjiSessionCall call=...;
call.invokeMethod("myExec",dataBean,verb);
・ セションBeanの呼び出しにリモート共通インタフェースを使用する場合: CallインタフェースをUjiSessionCallクラスにキャストして、
前項と同じ方法で呼び出します。
Call call=...;
((UjiSessionCall)call).invokeMethod("myExec",dataBean,verb);
なお、セションBeanの基本的な呼び出し方法については、“第8章 EJBの呼び出し”を参照してください。
- 263 -
25.3 セションBeanとクライアントとの連携
25.3.1 セション情報の同期
セション同期機能によって、クライアントからセションBeanを呼び出す時に、クライアントのセションクラスが持つ情報と、セションBeanの
セションクラスが持つ情報を互いに自動的に転送させることができます。
セションBeanを呼び出した時に、クライアントのセションクラスが持つ情報は、セションBeanに転送されてセションクラスにセットされま
す。セションBeanの呼び出しが終了するときに、セションBeanのセションクラスが持つ情報は、クライアントに転送されセションクラスに
セットされます。
セション同期機能を使用するには、クライアントのセションクラスとセションBeanのセションクラスを次のように作成してください。
・ クライアントのセションクラス
ユーザ定義のセションクラスを作成し、セションクラスにcom.fujitsu.uji.ejb.SynchronizedDataHolderインタフェースを実装して、
getSynchronizedDataメソッドとsetSynchronizedDataメソッドを作成します。getSynchronizedDataメソッドでは、クライアントからセション
Beanへ転送させたいオブジェクトを返却するように作成してください。setSynchronizedDataメソッドは、セションBeanから受け取った
オブジェクトをセションクラスにセットするときに呼び出されます。引数のオブジェクトをセションクラスに保持するように作成してくだ
さい。以下は記述例です。
import com.fujitsu.uji.ejb.SynchronizedDataHolder;
public class MyHttpSession extends HttpSessionProfile implements SynchronizedDataHolder {
protected MySyncObject syncData;
public Object getSynchronizedData() { return syncData; }
public void setSynchronizedData(Object data) { syncData = data; }
}
・ セションBeanのセションクラス
ユーザ定義のセションクラスを作成し、クライアントのセションクラスと同様にgetSynchronizedDataメソッドとsetSynchronizedDataメソッ
ドをオーバーライドして作成します。getSynchronizedDataメソッドでは、セションBeanからクライアントへ転送させたいオブジェクトを
返却するように作成してください。setSynchronizedDataメソッドは、クライアントから受け取ったオブジェクトをセションクラスにセット
するときに呼び出されます。引数のオブジェクトをセションクラスに保持するように作成してください。セションBean用のセションクラ
- 264 -
スであるEJBSessionProfileクラスのimplements節には com.fujitsu.uji.ejb.SynchronizedDataHolderインタフェースを宣言してあるた
め、ユーザ定義クラスでSynchronizedDataHolderをimplements節に加える必要はありません。
クライアントとセションBeanの間で転送されるデータはRMI over IIOPの規約に従っている必要があります。この規約については“25.3.6 EJB
の引数や返却値として使用可能なオブジェクト”を参照してください。
25.3.2 ローカル呼び出し
Apcoordinatorで作成したセションBeanは本来EJBコンテナ上で動作しますが、クライアントと同じJVM上でEJBコンテナを使用せずに
動作させることもできます。EJBコンテナを使用せずに、Apcoordinatorで作成したセションBeanをクライアントから直接呼び出す機能を
ローカル呼び出しと呼びます。
セションBean開発時にローカル呼び出し機能を使用すると、セションBeanをEJBコンテナに配置せずにデバッグができるため、開発の
効率が上がります。
ローカル呼び出しを行うには、クライアントのプログラムを次のように作成します。
・ セションBeanの呼び出しにはリモート共通インタフェースを使用します。
・ リモートマップにローカル呼び出しするセションBeanのエイリアスをlocalタグで定義します。 class属性にセションBeanクラスを指定
します。以下は記述例です。
<local name="MyLocalSessionBean" class="mypackage.MySessionBean"/>
・ 呼び出すセションBeanでエンタープライズBean環境を使用している場合は、localタグのコンテントにエンタープライズBean環境を
定義します。これは、以下の手順で行います。
- デプロイメント記述からセションBeanに対して定義されたenv-entryタグとそのコンテントを全てリモートマップのlocalタグのコン
テントにコピーします。
- 個々のenv-entryタグはエンタープライズBean環境のエントリを表し、env-entry-nameタグがそのエントリ名を表しています。エン
トリ名に対応する値を変更する場合は、env-entry-valueタグのコンテントにその値を記述します。env-entry-valueタグがない場
合は、追加してください。
以下に記述例を示します。
<local name="MyLocalSessionBean" class="mypackage.MySessionBean">
<env-entry>
<env-entry-name>guestUser</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>guest</env-entry-value>
</env-entry>
</local>
ローカル呼び出しと通常の呼び出しを簡単に切り替えられるようにするには、リモートマップに以下のように記述してください。localタグ
のタグ名をejbに、またはその逆に書き換えるだけで、切り替えができます。
<local name="MyLocalSessionBean" application="java:comp/env/ejb/MySessionBean"
class="mypackage.MySessionBean">
<env-entry>
<env-entry-name>guestUser</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>guest</env-entry-value>
</env-entry>
</local>
ローカル呼び出し機能を使用した場合、セションBeanに以下の制限があります。
・ EJBコンテナが提供する機能は使用できません。例えば、SessionContextオブジェクト、トランザクション制御、メソッドのアクセス制
限は使用できません。
・ InitialContextは、クライアントと同じものが使用されます。
また、以下の機能は通常の呼び出しとローカル呼び出しで動作が異なります。
- 265 -
・ EJBDispatchContextクラスのgetEnvironmentメソッド: このメソッドはエンタープライズBean環境の値を取得します。通常の呼び出し
の場合は、JNDIを使って取得します。ローカル呼び出しの場合は、クライアントのリモートマップで定義された値を取得します。
25.3.3 データBean変換
データBean変換機能は、セションBeanを呼び出す際に、データBeanをjava.util.HashMapクラスに変換して送信する機能です。データ
Beanが持つ項目クラスはString, Integerなどの基本的なデータのクラスやその配列に変換されます。セションBeanがHashMapを返却し
た場合は、クライアントで自動的にデータBeanに変換されます。
データBeanからHashMapへの変換を正変換、HashMapからデータBeanへの変換を逆変換と呼びます。
この機能を使用すると、以下のように不要なデータを削除して通信量を減らすことができます。
・ データBeanから表示のみに必要な情報を取り除いてセションBeanに送信: 項目クラスはWebページの表示に必要な色やフォント
などの情報を含んでいます。表示のみに必要な情報をデータBeanの送信前に取り除くことができます。
・ データBeanが持つプロパティのうち、セションBeanで必要なものだけを選択して送信: 変換後のHashMapに含めるプロパティを選
択することができます。
データBean変換機能を使うには、EJBを呼び出すアプリケーションに“データBean変換マップ”を作成してください。データBean変換
マップは、データBeanの変換規則をカスタマイズするファイルです。EJBを呼び出すアプリケーションにデータBean変換マップが存在
しない場合は、データBean変換は行われません。
データBeanの変換規則
以下にデータBeanの変換例を示します。
変換前のデータBean
プロパティ名
プロパティのクラス
プロパティの値
message
String
"Hello!"
info
InfoBean
(データBean)
プロパティ名
プロパティのクラス
プロパティの値
count
int
21
date
Date
2002/4/1
選択肢番号
値
表示文字列
色
1
tokyo
東京
赤
2
aomori
青森
緑
choice
ComboBox
(コンボボックスの項目ク
ラス)
- 266 -
プロパティ名
プロパティのクラス
プロパティの値
3
神戸
kobe
橙
選択されている選択肢は1
変換後のHashMap
HashMapのキー
HashMapの値のクラ
ス
HashMapの値
message
String
"Hello!"
info
HashMap
HashMapのキー
HashMapの値のクラス
HashMapの値
count
Integer
21
date
Date
2002/4/1
choice
Integer
1
choice.value
String[]
{"tokyo","aomori","kobe"}
choice.text
String[]
{"東京","青森","神戸"}
この例で示されているように、データBeanが変換されると、各プロパティがそれぞれ変換されてHashMapに格納されます。各プロパティ
の変換規則は基本的に次のようになります。この変換規則はデータBean変換マップによってカスタマイズができます。
・ プリミティブ型: プリミティブ型に対応するラッパクラスに変換されます。例えばintはjava.lang.Integerに変換されます。使用される
HashMapのキーはプロパティ名と同じです。
・ データBean: com.fujitsu.uji.DataBeanクラスとそのサブクラスは再帰的にHashMapクラスに変換されます。使用されるHashMapの
キーはプロパティ名と同じです。
・ 項目クラス: 項目クラスごとに規定された形式に変換されます。形式の概略は次のとおりです。
- FieldStringなどのフィールドタグの項目クラス(CheckBoxは除きます)は、そのデータがHashMapに格納されます。このとき、
HashMapのキーはプロパティ名と同じです。
- ComboBoxやTableViewなどコレクションタグの項目クラスとCheckBoxクラスは、項目クラスが持つ複数の情報がそれぞれ
HashMapのエントリに格納されます。このとき、HashMapのキーは"[プロパティ名].[情報の種類]"という形式の文字列になりま
す。
いずれの場合も、項目クラスが持つ色やフォントなどの表示に関する情報は、変換後のHashMapには含まれません。
・ 画面部品のインタフェース: ListModel, TableModel はそれぞれObject[]、Object[][]に、TreeNode は配列で構成したツリー構造に
変換されます。このとき、リストの要素、テーブルの要素、ツリーのノードの値は再帰的に変換されます。TreeModelは、ツリーを表
すオブジェクトが内部から取り出されてHashMapに格納されます。いずれの場合もHashMapのキーはプロパティ名と同じです。
・ 配列: 配列の各要素を再帰的に変換し、それらを要素とする配列に変換されます。各要素を変換した結果、全てHashMapクラスか
そのサブクラスの場合は、変換後の配列はHashMap[]です。それ以外の場合は、Object[]です。HashMapのキーはプロパティ名と
同じです。
・ それ以外のクラス: 変換されずにそのままHashMapに格納されます。HashMapのキーはプロパティ名と同じです。
項目クラス、画面部品のインタフェースが変換される形式の詳細は“定義ファイルリファレンス”を参照してください。
データタイプ
変換後のHashMapには、データタイプが与えられます。データタイプはHashMapに格納されたデータの種類を表す文字列です。これ
は、以下の目的で使用されます。
・ セションBeanが返したHashMapをデータBeanに逆変換するときに、どのクラスに変換するかを決定する
・ セションBeanがHashMapを受け取った時に、呼び出すビジネスクラスを決定する
データタイプはキー"uji.type"に対応するStringの値としてHashMapに格納されます。
- 267 -
データBean変換マップ
データBean変換マップはデータBeanや項目クラスの変換方法を設定するファイルです。以下の設定が可能です。
・ データBeanの各クラスについて、HashMapに変換されたときのデータタイプを指定します。
・ データBeanのプロパティから、セションBeanに送信するものを選択する。
・ 項目クラスが持つ情報から、セションBeanに送信するものを選択できる。例えば、TableViewのヘッダやComboBoxの選択肢表示
文字列について送信するかどうかを指定できます。
データBean変換マップはXMLで次のように記述します。
<?xml version="1.0" encoding="Shift_JIS"?>
<convMap
xmlns="http://interstage.fujitsu.com/schemas/uji/convMap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/convMap
http://interstage.fujitsu.com/schemas/uji/convmap.xsd">
<config>
<version>5.0</version>
</config>
<!-- mypackage.MyBeanの変換方法を指定 -->
<class name="mypackage.MyBean">
<beanConv target="my-bean">
<property name="description" pass="false"/>
</beanConv>
</class>
<!-- ComboBox(サブクラス含む)の選択肢はインデックス番号で送る -->
<model name="ComboBox">
<comboBoxConv useIndex="true"/>
</model>
</convMap>
上記記述を例にしてデータBean変換マップの記述方法を説明します。
データBean変換マップのルートはconvMapです。 convMapの内側には、最初にconfigタグを記述し、その内側にversionタグを記述し
ます。これはデータBean変換マップの文法のバージョンを表し、5.0を指定します。
<config>
<version>5.0</version>
</config>
configタグのあとに、データBeanや項目クラスの変換方法の指定が続きます。
classタグはname属性で指定したクラスの変換方法を定義します。
<class name="mypackage.MyBean">
<beanConv target="my-bean">
<property name="syokugyo" pass="false"/>
</beanConv>
</class>
この記述で以下を指定しています。
・ データBean送信時にmypackage.MyBeanクラスはHashMapに変換し、そのデータタイプをmy-beanとする。HashMapからデータBean
に逆変換する際は、HashMapのデータタイプがmy-beanなら、mypackage.MyBeanに変換する。
・ mypackage.MyBeanのプロパティdescriptionは、送信しない。つまり、変換後のHashMapには格納しない。
classタグの内側には、変換方法をあらわすタグを記述します。ここでは、beanConvタグを使用しています。このタグは、classタグで指定
されたデータBeanのクラスをHashMapに変換することを意味します。HashMapのデータタイプはtarget属性で指定します。target属性が
省略された場合はclassタグで指定したクラス名がデータタイプとして使用されます。
- 268 -
beanConvタグの内側には必要に応じてpropertyタグを記述します。このタグはname属性で指定されたプロパティを送信するかどうかを
pass属性で指定します。pass="false"を指定すると送信されません。 beanConvタグとpropertyタグを使って、データBeanの特定のプロパ
ティだけを送信するように指定するには次のように記述します。
<class name="mypackage.MyBean">
<beanConv target="my-bean" passByDefault="false">
<property name="userId" pass="true"/>
</beanConv>
</class>
セションBeanの呼び出し時に使用したコマンド名に応じて変換方法を変更したい場合は、classタグのverb属性にコマンド名を指定し
て、classタグによる指定が適用されるコマンド名を限定します。
<class name="mypackage.MyBean" verb="update">
<beanConv target="my-bean"/>
</class>
<class name="mypackage.MyBean">
<beanConv target="my-bean">
<property name="userId" pass="false"/>
</beanConv>
</class>
この例では、コマンド名がupdateの場合は、すべてのプロパティが送られ、それ意外の場合はuserIdプロパティが送信されません。
以下の記述は項目クラスcom.fujitsu.uji.compo.ComboBoxの変換方法を指定します。
<model name="ComboBox">
<comboBoxConv useIndex="true"/>
</model>
modelタグはname属性で指定した種類の項目クラスの変換方法を指定します。name="ComboBox"は、com.fujitsu.uji.compo.ComboBox
クラスとそのサブクラスを指定します。modelタグの内側には、変換方法をあらわすタグを記述します。ここでは、comboBoxConvタグを
使用して、ComboBoxを選択肢や表示文字列の配列に変換することを指定しています。useIndex="index"は、コンボボックスの選択肢
をインデックス番号で送信することを意味します。選択肢の値で送信するにはuseIndex="value"を指定します。
次のように指定すると、ComboBoxとそのサブクラスは変換されずに送信されます。
<model name="ComboBox">
<noConv/>
</model>
以下の情報については“定義ファイルリファレンス”のデータBean変換マップを参照してください。
・ 項目クラスを変換したあとのデータ構造
・ データBean変換マップで使用されるタグと属性
データBean変換マップのファイル名
デフォルトでは、データBean変換マップのファイル名はconv.xmlです。 Webアプリケーション、電子フォームアプリケーションでは/WEB-INF
に、セションBeanでは設定ファイルフォルダに配置します。ファイル名と配置場所は初期化パラメタuji.convMapで変更できます。リモー
ト共通インタフェースを使用した場合は、呼び出し対象となるセションBeanごとにデータBean変換マップを指定できます。この場合、リ
モートマップのejbタグまたはlocalタグのconvMap属性にファイル名を指定します。
初期化パラメタuji.convMapを指定されておらず、conv.xmlが既定の配置場所に存在しない場合、データBean変換は行われません。
注意
データBean変換はクライアントで実行されるため、データBean変換マップはクライアントに作成します。セションBeanから別のセションBean
を呼び出す場合は、呼び出し側のセションBeanにデータBean変換マップを作成します。
- 269 -
データBeanの上書き
データBean変換機能を使用している場合、データBeanの上書き機能が利用できます。この機能は、セションBeanが返したデータをそ
のまま受け取るのではなく、セションBeanを呼び出したときに引数として与えたデータBeanに上書きする機能です。
以下の条件を満たす場合に上書きが可能です。
・ データBean変換機能を有効にしている。
・ 上書き機能を有効にしている。
・ セションBeanから返されたデータを逆変換して得られるデータBeanと、セションBean呼び出し時のデータBeanのクラスが同じであ
る。
デフォルトでは上書き機能は有効に設定されています。無効に設定するには以下のようにします。
・ セションBeanの呼び出しにUjiSessionCallクラスを使用する場合: 次のいずれかの方法で指定します。
- invokeメソッドの第3引数にfalseを指定する。 一時的に上書きを無効にしたい場合はこの方法を使用します。
UjiSessionCall call=...;
call.invoke(dataBean,verb,false);
- UjiSessionCallのsetOverwriteModeメソッドでfalseを指定する。同一のUjiSessionCallインスタンスを使う時に常に上書きを無効
にしたい場合はこの方法を使用します。
UjiSessionCall call=...;
call.setOverwriteMode(false);
call.invoke(dataBean,verb);
call.invoke(dataBean2,verb2);
・ セションBeanの呼び出しにCallインタフェースを使用する場合: CallインスタンスをUjiSessionCallにキャストして、UjiSessionCallと同
じ方法を使用します。
Call call=...;
UjiSessionCall uCall=(UjiSessionCall)call;
uCall.invoke(dataBean,verb,false);
- 270 -
データBean変換使用時の注意事項
・ データBeanのプロパティの値として、ListModel, TableModel, TreeModel, TreeNodeインタフェースを実装したクラスを使用するとき
は、プロパティの型としてインタフェースそのものではなく、インタフェースを実装したクラスを使用してください。例えば、ListModel
インタフェースを実装したMyListModelをプロパティの値として使用する場合は、データBeanを次のように作成してください。
public class MyDataBean extends DataBean {
// プロパティlistの型にはListModelではなくMyListModelを使用します。
protected MyListModel list;
public void setList(MyListModel list) {this.list=list;}
public MyListModel getList() {return list;}
...
}
・ データBeanのプロパティの型として、ListModel, TableModel, TreeModelを実装したクラスを指定する場合、そのクラスに以下の形
式のコンストラクタを作成してください。
インタフェース
コンストラクタの例
説明
ListModel
public
MyList(MyBean[]
param)
リストの要素を格納した1次元配列を引数とするコンストラクタを作成し
てください。リストの要素が特定のクラスとサブクラスに限定される場合
は、配列の要素のクラスとしてリスト要素のクラスを使用できます。左記
記述はリスト要素がMyBeanとそのサブクラスの場合の例です。クラスが
限定できない場合は引数にObject[]を指定してください。
TableModel
public
MyTable(MyBean[][]
param)
テーブルの要素を格納した2次元配列を引数とするコンストラクタを作
成してください。テーブルの要素が特定のクラスとサブクラスに限定さ
れる場合は、配列の要素のクラスとしてテーブル要素のクラスを使用で
きます。左記記述はテーブル要素がMyBeanとそのサブクラスの場合
の例です。クラスが限定できない場合は引数にObject[][]を指定してく
ださい。
TreeModel
public MyTree(Object
param)
ルートノードを引数としたコンストラクタを作成してください。ルートノー
ドとは、TreeModelのgetRoot()メソッドで取得できるオブジェクトです。コ
ンストラクタの引数の型はObjectにしてください。
以上の形式のコンストラクタがない場合、逆変換実行時にエラーになります。
25.3.4 HashMapによるデータの入力
データBean変換機能を使ってデータBeanをHashMapに変換する場合、セションBeanは入力データとしてデータBeanではなくHashMap
を受け取ります。この場合、HashMapに設定されたデータタイプに基づいて、呼び出されるビジネスクラスのメソッドが決定されます。
データタイプは、HashMapのget("uji.type")で得られる文字列です。
入力データとしてHashMapを使用する場合、コマンドマップは次のように記述します。
# commands.map
$data-view;getArea=ejboffice.ejb.OfficeHandler.getArea
$data-view;search=ejboffice.ejb.OfficeHandler.search
$renew;find=ejboffice.ejb.OfficeHandler.find
$renew;update=ejboffice.ejb.OfficeHandler.update
コマンドマップの各行は次の形式で記述します。
$[データタイプ];[コマンド名]=[ビジネスクラス名].[メソッド名]
25.3.5 Apcoordinator以外のEJBクライアントとの連携
Apcoordinator以外のアプリケーションからApcoordinatorで作成したセションBeanを呼び出す場合のプログラミングを説明します。
- 271 -
セションBeanクラスは次のように作成して、execメソッドが発生するInvocationTargetExceptionにApcoordinatorの例外クラスが含まれな
いようにします。
・ セションBeanクラスのexecメソッドをオーバライドし、スーパークラス(UjiSessionBeanクラス)のexecメソッドを呼び出します。
・ スーパークラスのexecメソッドがInvocationTargetExceptionを発生した場合は、それを受け取り、Apcoordinatorの例外クラスを内部
にラップしないInvocationTargetExceptionを新たに作成して発生させます。
以下はセションBeanクラスの記述例です。
import com.fujitsu.uji.ejb.bean.UjiSessionBean;
import java.lang.reflect.InvocationTargetException;
public class OfficeEJB extends UjiSessionBean {
public Object[] exec(Object dataBean, String verb, Object syncData)
throws InvocationTargetException {
try {
return super.exec(dataBean,verb,syncData);
} catch (InvocationTargetException e) {
Throwable rootCause=e.getTargetException();
Exception replaced=new Exception(rootCause.getMessage());
throw new InvocationTargetException(replaced);
}
}
}
このように作成したセションBeanをApcoordinatorアプリケーションから呼び出す場合、セションBean内で例外が発生した際にクライアン
トに通知されるのはexecメソッドで作成した例外(上記の例ではExceptionクラス)になります。セションBeanのビジネスクラスで発生した例
外ではありません。
クライアントのプログラムではセションBeanを以下の手順で呼び出します。
1. JNDIを使ってホームインタフェースを取得します。
2. ホームインタフェースのcreateメソッドを呼び出し、リモートインタフェースを取得します。createメソッドの引数はありません。
3. リモートインタフェースのexecメソッドを呼び出します。引数には以下の3個のオブジェクトを渡します。
- 第1引数: データBeanまたはHashMapを指定します。このオブジェクトが、セションBeanのビジネスクラスの第2引数に与えら
れます。
- 第2引数: コマンドを指定します。
- 第3引数: セションクラスに転送するオブジェクトを指定します。セションBeanがセション同期機能を使用している場合に指定
してください。指定されたデータは、セションBeanにおいてsetSynchronizedDataメソッドによりセションクラスにセットされます。
セション同期機能が使用されていない場合はnullを指定します。
Apcoordinator以外のアプリケーションから呼び出す場合は、データBean変換機能は使用できません。入力データをHashMapで
受け取るセションBeanに対しては、execメソッドの第1引数にHashMapを指定してください。
4. execメソッドの返却値をの型はObject[]です。配列の各要素には以下のオブジェクトが格納されています。
- 要素[0]: ビジネスクラスの返却値です。
- 要素[1]: セションクラスから自動転送されたオブジェクトです。このオブジェクトは、セションBeanがセション同期機能を使用
している場合に、セションクラスのgetSynchronizedDataメソッドにより取得されたものです。セション同期機能が使用されてい
ない場合は、execメソッドの第3引数に与えたデータがそのまま返却されます。
セションBeanの実行中にアプリケーション例外が発生した場合は、execメソッドがjava.lang.reflect.InvocationTargetExceptionを発生し
ます。
以下はセションBeanを呼び出す例です。ホームインタフェースをSimpleBeanHome、リモートインタフェースをSimpleBeanRemoteとして
います。
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
...
- 272 -
HashMap syncData=new HashMap(); // セションBeanのセションクラスとの間で転送されるオブジェクト
syncData.put("userId","abc1234");
...
// ホームインタフェース取得
InitialContext ctx=new InitialContext();
SimpleBeanHome home=(SimpleBeanHome)PortableRemoteObject.narrow(
ctx.lookup("java:comp/env/ejb/SimpleBean"),SimpleBeanHome.class);
// リモートインタフェース取得
SimpleBeanRemote remote=home.create();
// セションBean呼び出し
MessageBean bean=new MessageBean();
bean.setMessage("Hello!");
Object[] replyArray=remote.exec(bean,"echo",syncData);
// 返却値の取得
MessageBean reply=(MessageBean)replyArray[0];
syncData=(HashMap)replyArray[1];
上記の方法でセションBeanを呼び出すEJBクライアントには、実行時ライブラリとしてujiejbcl.jarが必要です。このファイルをEJBクライア
ントの実行環境にコピーし、クラスパスに追加してください。 ujiejbcl.jarは、Apcoordinatorをインストールすることにより、[Apcoordinator
のインストールフォルダ]¥redist¥ejb にインストールされます。
ujiejbcl.jarにより、以下を利用するのに必要なクラスが提供されます。
・ Apcoordinatorで作成したセションBeanのホームインタフェース、リモートインタフェース
・ データBean (com.fujitsu.uji.DataBeanクラス)
ujiejbcl.jarは再配布可能なファイルです。クライアント環境に配布して使用できます。
25.3.6 EJBの引数や返却値として使用可能なオブジェクト
セションBean呼び出し時に与えるデータBeanは、以下の条件を満たす必要があります。
・ データBean変換を行う場合、データBean変換後のHashMapとそこに含まれるオブジェクトがRMI over IIOPの規約に従っている。
・ データBean変換を行わない場合、データBeanがRMI over IIOPの規約に従っている。
セションBeanが返すオブジェクトは、RMI over IIOPの規約に従っている必要があります。
RMI over IIOPでは以下の型がEJBの引数や返却値として使用できます。
・ Javaのプリミティブ型(intなど)
・ java.io.Serializableを直接または間接的に実装し、java.io.Remoteは直接的にも間接的にも実装しないオブジェクト
・ java.rmi.Remote イ ン タ フ ェ ー ス を 継 承 し 、 す べ て の メ ソ ッ ド ( 継 承 メ ソ ッ ド を 含 む ) が java.rmi.RemoteException 、 ま た は
java.rmi.RemoteExceptionのスーパークラスを例外としてthrowするリモートインタフェース
・ 通信に使用できる型の配列
例えば以下の場合は、上記の条件を満たさないため、セションBean呼び出し時にエラーが発生します。
・ クラスMyDataBeanは変換マップで「変換しない」設定になっているが、Serializableを実装していない。
・ クラスMyDataBeanはHashMapに変換されるように設定されている。MyDataBeanがプロパティとしてTableViewをもっており、
TableViewの表のセルのデータとしてMyCellクラスを使用している。MyCellはSerializableを実装していない。(この場合、変換後の
HashMapにテーブルを表すObject[][]が入り、その2次元配列の要素にMyCellが入るため、条件を満たさない。)
- 273 -
第26章 セションBeanの実行環境の設定
26.1 配備
セションBeanを動作させるには、EJBサーバが提供する配備ツールを使用して、セションBeanをEJBサーバに配備する必要がありま
す。配備の方法は、ご使用になるEJBサーバの説明書を参照してください。 Interstageをご使用になる場合の配備の概要について
は、“26.3 Interstage使用時のセションBeanの環境設定”を参照してください。
一般に、配備には以下の作業が含まれます。これらの作業は、ejb-jarファイルに対して配備ツールを使用して行います。
コンテナ用およびクライアント用のコードの生成
EJBコンテナとEJBクライアントに必要なコードを生成させます。
EJBコンテナへの登録
セションBeanをEJBコンテナへ登録します。
デプロイメント記述に記載した設定値のカスタマイズ
エンタープライズBean環境で定義した値を必要に応じて変更します。また、他のEJBを呼び出すセションBeanの場合は、デプロイ
メント記述に書いたEJB参照を、実行環境で動作しているEJBへ関連付けます。
配備時は、配備ツールで以下のライブラリが参照できるように、クラスパスを設定する必要があります。これらのライブラリはApcoordinator
によって提供されます。
・ uji.jar
・ ujiejb.jar
26.2 実行時のクラスパスの設定
EJBサーバでセションBeanを実行する際は、Apcoordinatorが提供する以下のライブラリが参照できるようにクラスパスを設定してくださ
い。
・ uji.jar
・ ujiejb.jar
セションBeanで使用する機能によっては上記以外に別途JARファイルが必要な場合があります。詳細は“13.1 アプリケーションに必要な
Apcoordinatorのファイル”と“13.2 実行時に必要なソフトウェア”を参照してください。
26.3 Interstage使用時のセションBeanの環境設定
Interstageにおける実行環境の設定の概略を以下に説明します。詳細は、Interstage管理コンソールのヘルプを参照してください。
配備
配備はInterstage管理コンソールを使用して以下の手順で実行します。
1. セションBeanの配備先となるワークユニットにクラスパスを設定します。配備先のワークユニットを選択し、[環境設定]タブを選択
すると、ワークユニットの環境設定を行う画面が表示されます。ここで、[ワークユニット設定]の[クラスパス]に、uji.jarとujiejb.jarを
改行で区切って設定します。ワークユニットのタイプが「WebアプリケーションとEJBアプリケーションを別JavaVMで運用」の場合
は、[ワークユニット設定]の[EJBコンテナ用]の[クラスパス]に設定します。以下は設定例です。
Windowsの場合
C:¥Interstage¥APC¥lib¥uji.jar
C:¥Interstage¥APC¥lib¥ujiejb.jar
Solaris, Linuxの場合
/opt/FJSVwebc/lib/uji.jar
/opt/FJSVbcco/lib/ujiejb.jar
- 274 -
ワークユニットを新規に作成する場合は、作成時に設定することもできます。
2. ワークユニットへセションBeanを配備します。配備先のワークユニットを選択し[配備]タブを選択するとアプリケーションを配備す
るための画面が表示されます。ここで、配備ファイルとして、ejb-jarファイル、または、ejb-jarファイルを含んだEARファイルを指定して
[配備]をクリックします。ここまでの手順で、以下の作業が完了します。
- サーバ用のコードとクライアント配布物の生成
- ワークユニットへのセションBeanの登録
ポイント
EJB2.0以前のEJBアプリケーションの場合、必要に応じて、デプロイメント記述に記載した設定値を変更できます。配備先のワークユニットの
[アプリケーション状態/配備解除]タブを選択し、[アプリケーション一覧]を選択します。EJBアプリケーション名の一覧から設定値を変
更するセションBeanを選択します。この画面で[アプリケーション環境定義]タブを選択し、詳細定義の[表示]をクリックするとデプロイメ
ント記述に記載した設定内容が表示されます。この画面で設定値を変更することができます。
Interstage Studioを使って開発する場合は、IJServerビューからInterstage管理コンソールを起動することにより、上記手順をInterstage Studio
上で行うことができます。
注意
Interstageが提供するHotDeploy機能とクラスのオートリロード機能は使用できません。
26.4 ワークユニット起動時実行クラスの設定
Interstageでワークユニットを使用する場合には、ワークユニットの起動時または終了時に、Apcoordinatorで作成したセションBeanを実
行することができます。ワークユニットの起動/停止における実行クラスの詳細はInterstage オンラインマニュアルの“J2EE ユーザーズ
ガイド”を参照してください。
ワークユニットの設定
ワークユニットの起動時にApcoordinatorで作成したセションBeanを実行する場合には、以下の設定をします。
1. Interstage管理コンソールから、セションBeanを実行するワークユニットを選択し、[実行クラス]タブを選択します。
2. [新規作成]タブから以下の内容を入力し、登録を実行します。
項目
起動時実行クラス
停止時実行クラス
名前
Initializerなど、適宜設定します。
Finalizerなど、適宜設定します。
クラス名
com.fujitsu.uji.ejb.workunit.Initializer
com.fujitsu.uji.ejb.workunit.Finalizer
実行順
任意に設定します。
引数
セションBeanのJNDI名をjava:comp/env/ejb/SomeEJBのような形式で指定します。
例外発生
時のワーク
ユニット起
動
任意に選択します。
ワークユ
ニット多重
時の呼び
出し
[すべてのVMで呼び出し]を選択します。
クラスを実
行するコン
テナ
[EJBコンテナ]を選択します。
この項目は表示されません。
- 275 -
アプリケーションの作成
ワークユニットの起動時または停止時にアプリケーションで特定の処理を行う場合は、以下のようにアプリケーションを作成します。
アプリケーション固有の処理が不要な場合は、以下の手順は行わずにワークユニットの設定のみを行うことで、セションBeanの呼び出
し部分を実行することができます。
1. ビジネスクラスへのメソッドの追加
ビジネスクラスに起動時(停止時)の処理のメソッドを追加します。メソッドは以下の形式となります。
package somepackage;
import com.fujitsu.uji.GenericHandler;
public class SomeHandler extends GenericHandler
{
public void startEjb(DispatchContext context) {
...
}
...
}
2. コマンドマップの追加
作成したメソッドを、コマンドマップに追加します。Beanはなし、コマンドはuji.initialize(停止時はuji.finalize)となります。
;uji.initialize=somepackage.SomeHandler.startEjb
ポイント
アプリケーションを最初に実行した時は、設定ファイルの読み込みやクラスのロードなどの初期化に時間がかかる場合があります。ワー
クユニットの起動時にセションBeanを実行することで、このような初期化処理をあらかじめ実行することができます。
アプリケーション固有の初期化が不要な場合には、ワークユニットの定義のみを行うことによって、Apcoordinatorの設定ファイルの読み
込みなどの初期化処理を実行することができます。
注意
ワークユニットの起動時実行クラスと停止時実行クラスからは、ワークユニット内のEJBのみ利用できます。
- 276 -
第27章 Interstage Studioを使ったセションBeanの開発
27.1 Interstage Studioの場合
Interstage Studioで作成するセションBeanの構築とデバッグが可能です。また、効率的に開発するウィザード機能を提供しています。実
際の使用例は“入門ガイド”を参照してください。
プロジェクトの作成
Interstage StudioでApcoordinatorによるセションBeanを開発するには、Apcoordinator Enterprise JavaBeansプロジェクトを定義し、
Enterprise Beanソース(Apcoordinator)ウィザードを使用します。このウィザードは以下の機能を提供します。
・ セションBeanクラス、リモートインタフェース、ホームインタフェースの自動作成
・ ファクトリクラス、アプリケーションクラス、セションクラス、コマンドマップの自動作成
・ デプロイメント記述の自動作成
ファイルの作成
以下のファイルはウィザードを使用して作成できます。
データBean
データBean作成ウィザードでは、データBeanのプロパティ名と型を入力することで、データBeanを作成することができます。
ビジネスクラス
ビジネスクラス作成ウィザードでは、入力データの型とコマンド名を入力することで、ビジネスクラスにメソッドを追加し、コマンドマッ
プを更新します。
リモートマップ
リモートマップ作成ウィザードは、リモートマップのテンプレートを作成します。
データBean変換マップ
データBean変換マップ作成ウィザードは、データBean変換マップのテンプレートを作成します。
デプロイメント記述の編集
deployment descriptorファイル編集で、エンタープライズBean環境やトランザクション属性などデプロイメント記述の編集が可能です。
- 277 -
関係定義チェック
コマンドマップに記述したクラスの存在確認をします。アプリケーションの構築時にチェックが実行されます。
ejb-jarファイルの作成
構築時にejb-jarファイルが自動的に作成されます。
デバッグ
Interstageのワークユニット上でセションBeanをデバッグ実行することができます。また、Apcoordinatorが提供するセションBeanのローカ
ル呼び出し機能を使用して、テスト用クライアントプログラムを作成することにより、ローカルマシン上でデバッグ実行することも可能で
す。
配備
IJServerビューからInterstage管理コンソールを起動して、InterstageのワークユニットにEJBを配備できます。 配備方法の概略について
は、“26.3 Interstage使用時のセションBeanの環境設定”を参照してください。
- 278 -
第5部 電子フォームアプリケーションの開発
第28章 概要..................................................................................................................................................280
第29章 電子フォームアプリケーションの作成方法...........................................................................................283
第30章 COBOLとの連携...............................................................................................................................291
第31章 電子フォームアプリケーションの実行環境の設定................................................................................294
第32章 Interstage Studioを使った電子フォームアプリケーションの開発..........................................................296
- 279 -
第28章 概要
Apcoordinatorでは、電子フォームを使ったアプリケーションを作成することができます。
電子フォームアプリケーションは、画面や帳票の電子フォームを利用して申請処理や伝票処理をWeb上で実現します。Apcoordinator
の電子フォームには以下の特長があります。
・ 簡単設計
- システムの拡張や連携に柔軟に対応できます
Java APIが用意されているので、サーブレット、JavaServer Pages(JSP)でWebアプリケーションを作成できます。
そのため、Webサーバ、およびInterstage Application Serverなどのアプリケーションサーバとの連携が容易であり、小・中規模
から大規模に至るあらゆるシステムのフロントエンドに使用できます。
- XMLを使用したデータ流通が可能です
電子フォームの入出力データをXMLで扱うことができます。XMLはデータの加工性および流通性に優れるため、複数企業間
での情報共有を始め、異なるシステムやアプリケーション間での連携した処理に利用することができます。
XMLのデータ構造は、Interstage Studioの電子フォームデザイナを使用してツリーイメージで設計できます。
- 電子フォームに入力したデータを保存して利用できます
電子フォームに入力したデータを保存したファイルは、XMLデータ形式で保存されます。文字コードはUTF-8です。保存した
ファイルは、XMLデータ形式を読み込めるアプリケーションでファイルを取り込んで利用できます。
- セキュリティに対応したシステムを構築できます
Webブラウザ、WebサーバのSSL機能を利用することで、データの受け渡しを暗号化できます。そのため、WebブラウザとWeb
サーバとの間の通信に対して、データの機密保持、および改ざん防止が可能になります。
・ 簡単操作
- 紙のイメージでの入力ができます
紙の帳票をそのままのレイアウトおよび書式でWebブラウザに表示して、データを入力できます。紙に記入するときと同じ感覚
で入力できるため、違和感なく業務を行うことができます。
また、Internet Explorerを使用する場合は、Interstage Charset Manager Standard Edition Web入力 Agentと連携することで、外
- 280 -
字入力のためのアプリケーションのクライアント側へのインストールや外字の登録を行うことなくWebブラウザ上で外字を入力で
きます。
- Webブラウザだけがあればすぐに使用できます
電子フォームは、Webブラウザだけですべて操作できます。そのため、Webブラウザが使用できる環境があれば、いつ、どこで
でも使用できます。また、WebブラウザはInternet Explorerが使用できます。
- 入力値のチェックや計算をWebブラウザ上で実行できます
入力値のチェックや計算をWebブラウザ上で実行できます。また、Webブラウザ上で入力したデータに応じて項目の表示/非表
示および必須チェック指定を変更することができます。
- Webブラウザ上での入力操作性を向上できます
Webブラウザ上で操作するとき、ドロップダウンリストボックスで選択する内容に応じて、次に入力するドロップダウンリストボック
スの内容を変更したり、電卓やカレンダーなどを使用して簡単に値を入力したりできます。
そのため、Webブラウザ上での入力操作性を向上させることができます。
- 電子フォームへのアクセスを容易にできます
音声ブラウザ(ホームページ・リーダ)をサポートします。電子フォームの内容を音声で読み上げるため、入力操作を容易にす
ることができます。
- コマンドボタンをクリックするだけで印刷できます
クライアント印刷と呼ばれる印刷では、電子フォームに定義したコマンドボタンをクリックするだけで印刷できます。
クライアント印刷を行う場合は、本製品が提供するクライアント部品(印刷機能)を使用します。
なお、Internet Explorerの場合にはクライアント印刷を行う電子フォームをWebブラウザに表示するときに、ActiveXコントロール
を使用して、クライアント部品(印刷機能)を自動インストールします。
- サーバのプリンタで印刷できます
サーバ印刷と呼ばれる印刷では、Webブラウザから送信された入力データをサーバのプリンタで印刷できます。
- 別ウィンドウと連携できます
電子フォームから別のウィンドウを開いたり、別のウィンドウまたは別のフレームから電子フォームを操作することができます。
・ 簡単保守
- 電子フォームの変更にも容易に対応できます
システムの運用後でも、電子フォームのレイアウトは簡単に変更できます。
入出力データに影響しない、レイアウトや入力値チェックの変更であれば、Webアプリケーションを変更する必要はありません。
電子フォームアプリケーションでは、電子フォームに対する以下の処理が可能です。
・ 電子フォームの表示
・ 電子フォームへのデータの設定
・ 電子フォームで入力したデータの参照
電子フォームアプリケーションの構成は以下の2通りがあります。
・ 電子フォームアプリケーション全体をApcoordinatorフレームワークを利用して構成する。
・ 電子フォームのみにApcoordinatorを利用する。その他の部分は一般的なサーブレットを使用して作成し、Apcoordinatorのフレー
ムワークを使用しない。
前者の構成の場合、後者に比べて、処理の振り分けや画面遷移の処理が容易に作成できます。また、“第2部 Apcoordinatorコアの機
能”が利用できます。そのため、電子フォームアプリケーション全体をApcoordinatorフレームワークを利用して構成する方法を推奨しま
す。
本マニュアルではアプリケーション全体をApcoordinatorフレームワークを利用して作成する方法を説明します。電子フォームのみに
Apcoordinatorを利用する場合の作成方法は、“Formcoordinatorユーザーズガイド”やサンプル集を参照してください。
電子フォームアプリケーション全体をApcoordinatorフレームワークを利用して作成した場合の、電子フォームアプリケーションの主な構
成要素を以下の図に示します。
- 281 -
なお、電子フォームアプリケーションの実行時にはFujitsu XML プロセッサが必要です。詳細は“13.2 実行時に必要なソフトウェア”を
参照してください。
- 282 -
第29章 電子フォームアプリケーションの作成方法
29.1 電子フォームの作成
電子フォームはInterstage Studioが提供するFormcoordinatorデザイナで作成します。
作成した電子フォームをアプリケーションフレームワーク上で利用する場合は、以下に注意して電子フォームを作成してください。
・ ボタンの送信先にはサーブレット名を指定します。サーバ名を省略して、サーブレット名のみ指定することができます。 例え
ば、"formservlet"のように指定できます。
・ 電子フォームで使用するデータが繰り返し項目を含む場合、以下の例のように同じタグ名を付けると、プログラムからのデータの取
得や設定時に便利です。
DataRoot
|
+- item
|
+- text1
|
+- text2
|
+- item
|
+- text1
|
+- text2
|
+- item
:
:
上記の例の場合、繰り返し項目であるitemを全て同じタグ名にします。また、itemの中のタグ名も同じにします。
29.2 電子フォームの表示
FormServletクラスを継承してサーブレットクラスを作成します。作成したクラスにメソッドや変数の追加は不要です。ブラウザからのリク
エストを受け付けるサーブレットとして、このサーブレットクラスを使用します。
- 283 -
public class FormSample extends com.fujitsu.uji.formc.FormServlet {
}
GenericHandleクラスを継承してビジネスクラスを作成します。ビジネスクラスのメソッドには、電子フォームから入力したデータの処理と、
電子フォームの表示の設定を記述します。ビジネスクラスの詳細については、“3.1 ビジネスクラス”を参照してください。
電子フォームを表示させるには、表示する電子フォーム名を設定したFormデータBean(com.fujitsu.uji.formc.FormDataBeanクラス)をメ
ソッドが返却するようにします。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
import com.fujitsu.uji.formc.FormDataBean;
public class FormSampleHandler extends GenericHandler {
public Object startup(DispatchContext context) {
// 電子フォーム名を設定したFormDataBeanクラスを返却します。
FormDataBean formBean = new FormDataBean("SampleForm");
return formBean;
}
}
注意
電子フォームを表示させる場合は、DispatchContextクラスのsetResponseBeanメソッドは使用しません。
起動時に実行するビジネスクラス名、メソッド名をコマンドマップで指定します。コマンドマップの詳細は“3.6.1 コマンドマップ”を参照し
てください。
#commands.map
;=FormSampleHandler.startup
Webアプリケーション環境定義ファイル(web.xml)に以下を設定します。これらの設定はweb.xmlのweb-appタグのコンテントに記述しま
す。
・ 作 成 し た サ ー ブ レ ッ ト ク ラ ス に 対 し 、 サ ー ブ レ ッ ト 名 と URL を 設 定 し ま す 。 以 下 の 記 述 例 で は 、 サ ー ブ レ ッ ト ク ラ ス が
form.FormSample、サーブレット名がformservlet、URLが/formservletです。
<servlet>
<servlet-name>formservlet</servlet-name>
<servlet-class>form.FormSample</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>formservlet</servlet-name>
<url-pattern>/formservlet</url-pattern>
</servlet-mapping>
・ 初期化パラメタuji.defaultEncodingにnoneを指定して、送信データの文字エンコーディングの変換が行われないようにします。
<context-param>
<param-name>uji.defaultEncoding</param-name>
<param-value>none</param-value>
</context-param>
また、必要に応じてweb.xmlに以下を記述します。
・ 電子フォームの格納場所を初期化パラメタuji.formPathで指定します。この指定が省略された場合、Formcoordinatorの「環境設
定」で指定された格納先が使用されます。
<context-param>
<param-name>uji.formPath</param-name>
- 284 -
<param-value>c:¥temp¥assets</param-value>
</context-param>
・ ユーザ定義のファクトリクラスのクラス名を初期化パラメタfactoryで指定します。ファクトリクラスの詳細は“3.5 ファクトリクラス”を参照
してください。
<context-param>
<param-name>factory</param-name>
<param-value>form.FormFactory</param-value>
</context-param>
・ エラーページのJSPファイル名を指定します。初期化パラメタuji.servlet.errorPageに指定します。uji.servlet.errorPageの詳細は“13.3
初期化パラメタ”を参照してください。
<context-param>
<param-name>uji.servlet.errorPage</param-name>
<param-value>formError.jsp</param-value>
</context-param>
ポイント
エラーページをJSPで作成しておくと便利です。予期せぬエラーが発生した場合に指定したエラーページが表示されます。
以上の設定を記述したweb.xmlの例を以下に示します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- エンコーディングは電子フォーム機能で制御するため、以下を必ず指定します -->
<context-param>
<param-name>uji.defaultEncoding</param-name>
<param-value>none</param-value>
</context-param>
<!-- セションクラス等利用する場合にファクトリを指定します -->
<context-param>
<param-name>factory</param-name>
<param-value>form.FormFactory</param-value>
</context-param>
<!-- エラーページの指定です -->
<context-param>
<param-name>uji.servlet.errorPage</param-name>
<param-value>formError.jsp</param-value>
</context-param>
<!-- 電子フォームの格納場所を指定します。省略した場合、-->
<!-- Formcoordinatorの「環境設定」で格納先を設定します。 -->
<context-param>
<param-name>uji.formPath</param-name>
<param-value>c:¥temp¥assets</param-value>
</context-param>
<!-- 以下はサーブレット名を設定する記述です -->
<servlet>
<servlet-name>formservlet</servlet-name>
<servlet-class>form.FormSample</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>formservlet</servlet-name>
<url-pattern>/formservlet</url-pattern>
</servlet-mapping>
</web-app>
- 285 -
29.3 電子フォームからの入力
“29.2 電子フォームの表示”で説明したアプリケーションに以下を追加します。
コマンドマップでは、入力したデータの電子フォーム名、ボタン名に対応付けてデータを受けるビジネスクラス名、メソッド名を以下の形
式で指定します。
/[電子フォーム名];[ボタン名]=[ビジネスクラス名].[メソッド名]
以下は記述例です。
#commands.map
;=FormSampleHandler.startup
/SampleForm;send=FormSampleHandler.onSend
ビジネスクラスにデータを受けるメソッドを追加します。 このメソッドで、電子フォームに入力されたデータの取得、データの処理、次に
表示する電子フォームの設定を行います。
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
import com.fujitsu.uji.formc.FormDataBean;
import com.fujitsu.uji.xml.XmlDataBean;
...
public class FormSampleHandler extends GenericHandler {
public Object startup(DispatchContext context) {
...
return formBean;
}
public Object onSend(DispatchContext context, FormDataBean dataBean) {
// 電子フォームからXMLを取得します。
XmlDataBean inData = dataBean.getData();
// 入力データを取得します。
String text1 = inData.getText("text1");
String text2 = inData.getText("text2");
// 次の画面を表示するため、FormDataBeanを作成します。
FormDataBean nextFormBean = new FormDataBean("NextForm");
// 出力データの雛形XMLを取得します。
XmlDataBean outData = nextFormBean.getTemplateData(context);
// 出力データを設定します。
outData.setText("text1", text1);
outData.setText("text2", text2);
nextFormBean.setData(outData);
// 次画面のFormDataBeanを返却します。
return nextFormBean;
}
}
電子フォームで使用するデータは、XMLデータBean (XmlDataBeanクラス) を使って取得や設定を行います。XMLデータBeanは、XML
のデータを保持するオブジェクトです。XMLデータBeanの使用方法の詳細は“6.2 XMLデータBean”を参照してください。
電子フォームに入力されたデータを取得するには、以下のようにします。
・ メソッドの引数であるFromDataBeanクラスのgetDataメソッドでXMLデータBean (XmlDataBeanクラス) を取得します。このXMLデータ
Beanに電子フォームに入力されたデータが格納されています。
・ XMLデータBeanのgetTextメソッドで、電子フォームのデータを取得します。getTextメソッドの引数には取得するデータをXPathで
指定します。
表示する電子フォームにデータを設定するには、以下のようにします。
・ FormDataBeanクラスのgetTemplateDataメソッドで、XMLデータBeanを取得します。
- 286 -
・ XMLデータBeanのsetTextメソッドで、電子フォームのデータを設定します。setTextメソッドの引数には設定対象をXpathで指定し
ます。
取得または設定するデータは、電子フォームの構造に従って指定します。上記のソースは、以下の構造のタグに対応します。
DataRoot
+- text1
+- text2
集団項目で階層構造になっている場合は、途中のパスを指定します 。以下は階層構造を持ったデータの例です。
DataRoot
+- group1
+- text1
+- text2
この構造の場合は、以下のようなソースになります。
String text1 = inData.getText("group1/text1");
String text2 = inData.getText("group1/text2");
繰り返し構造となる場合は、タグ名にインデックスを付けて指定します。以下は繰り返し構造を持ったデータの例です。
DataRoot
+- item
|
+- text1
|
+- text2
+- item
:
:
この構造の場合は、以下のようなソースになります。 インデックスは1から始まります。
//最初のitem内のデータを取得
String text1 = inData.getText("item[1]/text1");
String text2 = inData.getText("item[1]/text2");
//2番目のitem内のデータを取得
String text1 = inData.getText("item[2]/text1");
String text2 = inData.getText("item[2]/text2");
階層構造の一部を別のXMLデータBeanとして取得することで、データの取得時や設定時にXPathの指定が簡単になります。
XmlDataBean item = inData.getSubBean(item[1]);
String text1 = item.getText("text1");
String text2 = item.getText("text2");
FormDataBeanクラスのgetTemplateDataメソッドは、出力データの雛形となるXMLを作成し、そのXMLを格納したXMLデータBeanを返
却します。この雛型の代わりに、すでに保存されたXML等を利用することも可能です。この場合は、以下の手順で処理を行います。
・ XMLデータBeanを新規に作成し、出力データを格納します。XMLファイルを読み込んで格納するには、XmlDataBeanクラスの
loadFromメソッドを使います。
・ 作成したXMLデータBeanをFormDataBeanクラスに与えます。FormDataBeanのsetDataメソッドを使います。
次のソースは、他のXMLを利用する例です。
// 次の画面を表示するため、FormDataBeanを作成します。
FormDataBean nextFormBean = new FormDataBean("NextForm");
// 出力データをXMLから取得します。
XmlDataBean outData = new XmlDataBean();
outData.loadFrom("c:¥¥template¥¥sample.xml");
nextFormBean.setData(outData);
- 287 -
29.4 添付ファイルの取得
電子フォームの添付ファイル項目に入力されたファイルを取得するには、FormDataBeanクラスのgetAttachedFileKeysメソッドと
getAttachedFileメソッドを以下のように使用します。
・ 電子フォームの添付ファイル項目に設定した項目名の一覧をgetAttachedFileKeysメソッドで取得します。このメソッドはjava.util.Iterator
インタフェースで項目名一覧を返却します。
・ 項 目 名 一 覧 か ら 取 得 し た 個 々 の 項 目 名 を 指 定 し て 、 getAttachedFile メ ソ ッ ド で 添 付 フ ァ イ ル を 取 得 し ま す 。 フ ァ イ ル は
com.fujitsu.uji.util.MimeSourceクラスとして返却されます。
・ MimeSourceクラスのgetInputStremメソッドで入力ストリームを取得します。
・ 入力ストリームから添付ファイルを読み込みます。
・ ファイル名を取得するにはMimeSourceクラスのgetFileNameメソッドを使います。取得されるファイル名は、クライアントの環境(Web
ブラウザが動作している環境)におけるファイル名です。
以下は、添付ファイルを取得するプログラムの例です。
import
import
import
import
import
import
java.util.Iterator;
java.io.InputStream;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.xml.XmlDataBean;
com.fujitsu.uji.formc.FormDataBean;
com.fujitsu.uji.util.MimeSource;
...
public Object ensureOk(DispatchContext context, FormDataBean dataBean) {
// 項目名一覧を取得します。
Iterator it = dataBean.getAttachedFileKeys();
while (it.hasNext()) {
String key = (String)it.next();
// 項目名を指定して、MimeSourceを取得します。
MimeSource ms = dataBean.getAttachedFile(key);
if (ms != null) {
// ファイル名を取得します。
String fileName = ms.getFileName();
// 入力ストリームを取得します。
InputStream in = ms.getInputStream();
// 取得した入力ストリームからデータを読み出す処理を
// ここに記述します。
...
}
}
...
}
29.5 項目制御情報の操作
項目制御情報はsetItemAttributeメソッドを利用して設定します。setItemAttributeメソッドの引数には、項目のXPath、項目属性の名前、
項目属性の値を指定します。
import com.fujitsu.form.ItemAttributeAccess;
import com.fujitsu.uji.formc.ItemAttributes;
...
FormDataBean formBean = new FormDataBean("SampleForm");
formBean.setItemAttribute("group/name", ItemAttributes.COLOR, ItemAttributeAccess.RED);
formBean.setItemAttribute("group/list", ItemAttributes.LISTBOXVALUE, "東京¥¥n大阪");
- 288 -
ポイント
ドロップダウンリストの選択リストは、改行("¥¥n")で分割した文字列を記述します。
ItemAttributesクラスを利用して一括して設定することもできます。
import com.fujitsu.form.ItemAttributeAccess;
import com.fujitsu.uji.formc.ItemAttributes;
...
FormDataBean formBean = new FormDataBean("SampleForm");
ItemAttributes attributes = new ItemAttributes();
attributes.putAttribute(ItemAttributes.COLOR, ItemAttributeAccess.RED);
attributes.putAttribute(ItemAttributes.FONTSTYLE, ItemAttributeAccess.ITALIC);
formBean.setItemAttribute("group/name", attributes);
項目属性の名前はItemAttributesクラス、項目属性の値はItemAttributeAccessクラスで定義されています。それぞれのフィールドの意
味は、“APIリファレンス”を参照してください。
入力時にビジネスクラスに渡されるFormデータBeanでは、直前の表示で利用した項目制御情報を保持しています。複数の画面を同
時に表示する場合など、直前の表示とは異なる画面を利用する場合は、項目制御情報がクリアされます。このような場合に設定した項
目情報を何度も利用するためには、FormデータBeanをセションクラス等に保存する必要があります。
29.6 電子フォームと通常のJSP画面の混在利用
アプリケーションの画面遷移の過程で、電子フォームと通常のJSPを切り替えて使用することができます。通常のJSPを表示する方法を
説明します。
表示するJSPは、制御ページからuji:dispatchタグを除いた形式で作成します。この形式のJSPを台紙ページと呼びます。制御ページに
ついては、“第15章 Webcoordinatorアプリケーションの骨格”を参照してください。以下は台紙ページの例です。
<HTML>
<HEAD>
<TITLE>sample</TITLE>
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
</HEAD>
<BODY>
<uji:include pane="head" />
<uji:include pane="body" />
</BODY>
</HTML>
注意
台紙ページには uji:dispatch タグを記述しません。
ビジネスクラスのメソッドから台紙ページのJSPのファイル名を返却すると、JSPによる画面表示が行われます。
public Object toJsp(DispatchContext context, FormDataBean formBean) {
...
SomeBean someBean = new SomeBean;
context.setResponseBean("body", someBean);
return "base.jsp";
}
この場合、台紙ページからインクルードされる入出力ページの作成が必要です。また、入出力ページで使用するデータBeanの設定を
ビジネスクラスのメソッドで行います。入出力ページの作成方法とデータBeanの設定については、“第15章 Webcoordinatorアプリケー
ションの骨格”を参照してください。
- 289 -
FormServletクラスを利用する場合は、ビジネスクラスのメソッドは、必ず復帰値を持ちます。復帰値により、以下のように動作が決定さ
れます。
・ FormデータBeanの場合は電子フォームを表示します。
・ 文字列の場合は、JSPを表示します。
・ com.fujitsu.uji.util.MimeSourceの場合は、バイナリファイルをダウンロードします。
29.7 電子署名の利用
電 子 署 名 を 利 用 す る に は 、 Form デ ー タ Bean の getPackageData メ ソ ッ ド で Document ク ラ ス を 取 得 し 、 そ れ を 引 数 と し て
SimplePackageDataManagerクラスのインスタンスを作成します。その後、SimplePackageDataManagerクラスの機能で電子署名を利用
します。
import com.fujitsu.form.SimplePackageDataManager;
import com.fujitsu.form.SMEEUserInfo;
...
public Object onSend(DispatchContext context, FormDataBean formBean) {
SimplePackageDataManager spdm = new SimplePackageDataManager(formBean.getPackageData());
// 署名確認
SMEEUserInfo userInfo = new SMEEUserInfo ();
userInfo.setManageDirectory("file:///c:/home/user/sctldir");
userInfo.setSlotDirectory("file:///c:/home/user/cmidir");
userInfo.setLDAP(true);
spdm.setUserInfo(userInfo);
//署名付き申請データの検証
boolean verify = spdm.verify("SampleData");
if (verify != true) {
// 改ざんされている。JSP画面でエラー表示
ErrorBean bean = new ErrorBean();
bean.setMessage(spdm.getErrorMessage());
context.setResponseBean("body", errorBean);
...
return "base.jsp";
}
// データを利用
XmlDataBean inData = formBean.getData();
...
}
SimplePackageDataManagerクラスの使用方法の詳細は“Formcoordinator署名オプションユーザーズガイド”を参照してください。
29.8 セション管理
セション管理の処理はWebアプリケーションの場合と同様です。“17.1 セション管理”を参照してください。
- 290 -
第30章 COBOLとの連携
電子フォームとCOBOLで作成したアプリケーションを連携させることができます。ここでは、その方法を説明します。
サーブレットクラス、ファクトリクラスは以下のクラスをそのまま使用します。
・ サーブレットクラス: com.fujitsu.uji.cobol.COBOLServlet
・ ファクトリクラス: com.fujitsu.uji.cobol.COBOLFactory
コマンドスクリプティングを作成し、電子フォーム名、ボタン名と実行するCOBOLアプリケーション名を対応付けます。対応付けはentry
タグとinvokeCobolタグで以下のように記述します。
<entry bean="/[電子フォーム名]" verb="[ボタン名]">
<invokeCobol library="[COBOLアプリケーションのライブラリ名]"
program="[COBOLアプリケーションのプログラム名]"/>
</entry>
最初に実行されるアプリケーションでは電子フォーム名とボタン名の両方を省略します。以下は、コマンドスクリプティングの記述例で
す。
<?xml version = "1.0" encoding = "Shift_JIS"?>
<commandMap
xmlns="http://interstage.fujitsu.com/schemas/uji/commandMap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/commandMap
http://interstage.fujitsu.com/schemas/uji/commandmap.xsd">
<config>
<version>5.0</version>
</config>
<entry>
<invokeCobol library="startup.dll" program="STARTUP"/>
</entry>
<entry bean="/SampleData" verb="send">
<invokeCobol library="onsend.dll" program="ONSEND"/>
</entry>
</commandMap>
コマンドスクリプティングの詳細は“第10章 コマンドスクリプティング”を参照してください。 また、コマンドスクリプティングの各タグの詳
細については、“定義ファイルリファレンス”のコマンドスクリプティングを参照してください。
コマンドマップをcommands.mapというファイル名で作成し、上記で作成したコマンドスクリプティングのファイルが読み込まれるように指
定します。以下は、コマンドスクリプティングのファイル名がcommand.xmlの場合のコマンドマップです。
+command.xml
COBOLのアプリケーションでは、入力の電子フォームをREADし、出力の電子フォームをWRITEします。
IDENTIFICATION DIVISION.
PROGRAM-ID.
ONSEND.
ENVIRONMENT
DIVISION.
INPUT-OUTPUT
SECTION.
FILE-CONTROL.
SELECT FORMFILE ASSIGN TO GS-FORMFILE
FORMAT IS FORM-NAME
GROUP IS PARTITION-NAME
SESSION CONTROL IS SESSTION-INFO
FILE STATUS IS FS-DATA DETAIL-DATA.
...
DATA
DIVISION.
FILE
SECTION.
FD FORMFILE.
COPY SampleData
OF XMDLIB.
COPY NextSampleData OF XMDLIB.
- 291 -
WORKING-STORAGE SECTION.
...
PROCEDURE
DIVISION.
OPEN I-O FORMFILE.
* FORMから入力データを読み込む
MOVE "SampleData" TO FORM-NAME.
MOVE "PAGE" TO PARTITION-NAME.
READ FORMFILE.
* 入力データを使用した処理を行う
...
* FORMに出力データを書き込む
MOVE SPACE TO NextSampleData.
...
MOVE "NextSampleData" TO FORM-NAME.
MOVE "PAGE" TO PARTITION-NAME.
WRITE NextSampleData.
...
CLOSE FORMFILE.
EXIT PROGRAM.
終了画面(画面内にボタン等がない画面)を表示する場合は、コマンドスクリプティングのinvokeCobolタグでアトリビュートに
release="true"と記述すると、画面表示後に不要なリソースを解放します。
<commandMap>
...
<entry bean="/SampleData" verb="exit">
<invokeCobol library="endproc.dll" program="ENDPROC" release="true"/>
</entry>
</commandMap>
セションタイムアウト発生時にCOBOLプログラムを実行したい場合は次のようにコマンドスクリプティングを作成します。
・ verbに"uji.timeout"を指定したentryタグを定義します。beanアトリビュートにはなにも記述しません。
・ entryタグのコンテントとなるinvokeCobolタグのtypeアトリビュートに"TIMEOUT"を指定します。type指定がない場合は、通常呼び
出しとしてCOBOLプログラムの呼び出しを実行します。
<commandMap>
...
<entry verb="uji.timeout">
<invokeCobol type="TIMEOUT" library="apcocobol.dll" program="TIMEOUT" release="true"/>
</entry>
</commandMap>
エラー発生時にCOBOLプログラムを実行したい場合は次のようにコマンドスクリプティングを作成します。
・ verbに"uji.error"を指定したentryタグを定義します。beanアトリビュートにはなにも記述しません。
・ コンテントとなるinvokeCobolタグのtypeアトリビュートに"ERROR"を指定します。type指定がない場合は、通常呼び出しとしてCOBOL
プログラムの呼び出しを実行します。
<commandMap>
...
<entry verb="uji.error">
<invokeCobol type="ERROR" library="apcocobol.dll" program="ERROR" release="true"/>
</entry>
</commandMap>
Webアプリケーション環境定義ファイル (web.xml) を書き換えると、サーブレット名とサーブレットのURLを変更することができます。ま
た、エラーページのJSPを指定することで、エラー発生時の画面を変更できます。 Webアプリケーション環境定義ファイルの記述につ
いては、“29.2 電子フォームの表示”を参照してください。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 292 -
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- ファクトリクラスにはCOBOLFactoryクラスを使用します。-->
<context-param>
<param-name>factory</param-name>
<param-value>com.fujitsu.uji.cobol.COBOLFactory</param-value>
</context-param>
<!-- エラーページを指定します。-->
<context-param>
<param-name>uji.servlet.errorPage</param-name>
<param-value>formError.jsp</param-value>
</context-param>
<context-param>
<param-name>uji.defaultEncoding</param-name>
<param-value>none</param-value>
</context-param>
<!-- サーブレットクラスにはCOBOLServletクラスを使用します。-->
<servlet>
<servlet-name>formservlet</servlet-name>
<servlet-class>com.fujitsu.uji.cobol.COBOLServlet</servlet-class>
</servlet>
<!-- サーブレットのURLを指定します。-->
<servlet-mapping>
<servlet-name>formservlet</servlet-name>
<url-pattern>/formservlet</url-pattern>
</servlet-mapping>
</web-app>
- 293 -
第31章 電子フォームアプリケーションの実行環境の設定
電子フォームアプリケーションの実行環境の設定のうち以下の項目については、Webアプリケーションの場合と同じです。“第22章 Web
アプリケーションの実行環境の設定”を参照してください。
・ Webアプリケーション環境定義ファイル(web.xml)
・ 実行時のファイル配置
・ 複数の関係定義ファイルの使用
ここでは、電子フォームアプリケーションに特有の事項について説明します。
電子フォームの配置
作成した電子フォームを以下のフォルダに配置します。
・ Webアプリケーション環境定義ファイル(web.xml)で初期化パラメタuji.formPathに対し電子フォーム格納フォルダを指定した場合
は、指定したフォルダ
・ uji.formPathを指定しなかった場合は、Formcoordinatorの「環境設定」で電子フォームの格納先として指定したフォルダ
また、クライアント印刷で使用する電子フォームは、Webサーバの仮想ディレクトリとして定義したフォルダに配置し、その仮想ディレクトリを
Formcoordinator の「環境設定」で指定します。
Formcoordinatorの環境設定については、“Formcoordinatorユーザーズガイド”を参照してください。
タグライブラリファイルの配置
電子フォームと通常のJSP画面を混在して利用し、かつ、JSP画面でUJIタグを使用する場合は、タグライブラリファイルujiall.tldを電子
フォームアプリケーションのWEB-INFフォルダにコピーする必要があります。ujiall.tldは[Apcoordinatorインストールディレクトリ]¥lib に
インストールされています。UJIタグを使用しない場合はujiall.tldは不要です。
Webサーバの設定
Webサーバを設定し、[本製品のインストールフォルダ]¥APC¥cllib をWebサーバの仮想ディレクトリFormCDN/cllib として定義します。
具体的な方法は“Formcoordinatorユーザーズガイド”を参照してください。
サーブレットコンテナの設定
サーブレットコンテナに以下を設定します。
環境変数CLASSPATHの設定
Apcoordinatorが提供する以下のライブラリが参照できるようにクラスパスを設定します。
- uji.jar
- ujiformc.jar
- f3hksjsv.jar
また、Fujitsu XML プロセッサが提供するライブラリをクラスパスに設定します。
COBOLとの連携を行う場合は、上記のライブラリに加え、Apcoordinatorが提供する以下のライブラリをクラスパスに設定します。
- ujicobol.jar
以下の機能を使用する場合は別途ソフトウェアが必要です。必要に応じてクラスパスにライブラリを追加してください。詳細は“13.2
実行時に必要なソフトウェア”を参照してください。
- 電子署名
- COBOLとの連携
- XML連携機能
- バックエンド連携サービス
- 294 -
環境変数PATHの設定
Windowsの場合、環境変数PATHの設定に、[本製品のインストールフォルダ]¥APC¥bin を追加します。
SolarisおよびLinuxの場合、環境変数LD_LIBRARY_PATHの設定に、/opt/FJSVfcdn/lib を追加します。
電子フォームの表示モードの設定
使用するブラウザに応じて、電子フォームの表示モードをFormcoordinatorの「環境設定」で設定します。詳細は、“Formcoordinatorユー
ザーズガイド”を参照してください。
アプリケーションからAPIを使用して表示モードを設定することはできません。
COBOLアプリケーションの設定
COBOLアプリケーションと連携する電子フォームアプリケーションの実行には、COBOLアプリケーションの実行環境の設定が必要で
す。NetCOBOL XMLオプション for Windows に添付の“NetCOBOL XMLオプション 解説書”を参照してください。
- 295 -
第32章 Interstage Studioを使った電子フォームアプリケーショ
ンの開発
32.1 Interstage Studioの場合
Interstage Studioでは、電子フォームアプリケーションの構築とデバッグが可能です。また、効率的に開発するためのウィザードを提供
しています。 Interstage Studioを使った電子フォームアプリケーションの開発の流れを以下に説明します。
アプリケーションの作成
アプリケーションは以下の手順で作成します。
1. プロジェクトを作成する。
Interstage Studioを起動し、メニューバーから[ファイル] > [新規] > [プロジェクト]を選択して、[新規プロジェクト]ダイアログを表示
させます。
[Apcoordinator] > [電子フォームアプリケーションプロジェクト(Apcoordinator)]を指定します。
プロジェクト名を入力します。
- 296 -
コードを生成するためのウィザードを選択します。電子フォームアプリケーションのウィザードは1つのみですので、このまま[終
了]をクリックします。
- 297 -
続いて、電子フォームアプリケーションのウィザードが開始されます。
2. ウィザード情報を入力する。
サーブレットとエラーページの情報を入力します。
- 298 -
この画面では以下の情報を指定します。
- パッケージ
ウィザードによって生成されるJavaクラスのパッケージを指定します。
- サーブレット名
ブラウザからのリクエストを受け付けるサーブレットの名前を指定します。この名前はサーブレットのURLとしても使用されま
す。電子フォーム作成時には、コマンドボタン項目の送信先としてこのサーブレットを指定します。
- サーブレットクラス
サーブレットのクラス名を指定します。
- エラーページを使用する
エラーページを使用する場合、チェックします。
- エラーページ名
エラーページを使用する場合、エラーページのファイル名を指定します。
続いて、電子フォームアプリケーションを構成する各種クラスの情報を入力します。
- 299 -
この画面では以下の情報を指定します。
- ファクトリクラスを拡張する
ファクトリクラスを拡張する場合にチェックします。アプリケーションクラス、セションクラスを拡張する場合は、ファクトリクラスを
拡張する必要があります。
- ファクトリクラス
ファクトリクラスを拡張する場合、ファクトリクラスのクラス名を指定します。
- アプリケーションクラスを拡張する
アプリケーションクラスを拡張する場合にチェックします。
- アプリケーションクラス
アプリケーションクラスを拡張する場合、アプリケーションクラスのクラス名を指定します。
- セションクラスを拡張する
セションクラスを拡張する場合にチェックします。
- セションクラス
セションクラスを拡張する場合、セションクラスのクラス名を指定します。
最後にJSP画面と混在利用するかどうかを指定します。
- 300 -
この画面では以下の情報を指定します。
- 混在して利用する
通常のJSP画面を混在して利用する場合チェックします。
以上の操作で電子フォームアプリケーションプロジェクトが作成されます。作成されたファイルは以下のようになります。
- 301 -
3. 電子フォームを作成する。
電子フォームアプリケーションで使用する電子フォームを作成します。
まず、Interstage Studioのファイルメニューから[ファイル] > [新規] > [その他] を選択します。以下の画面が表示されます。[Java]
> [GUI] > [電子フォーム]を指定します。
- 302 -
作成する電子フォームの情報を入力します。
- 303 -
この画面では以下の情報を指定します。
- フォルダ名
電子フォームを格納するフォルダを指定します。
- 電子フォーム名
電子フォームの名前を指定します。
電子フォームデザイナウィザードが起動されます。
- 304 -
ウィザードの指示に従って、電子フォームを作成します。
詳細は、Interstage Studioが提供する“Formcoordinatorデザイナ ユーザーズガイド”を参照してください。
4. ビジネスクラスを作成する。
電子フォームアプリケーションで使用するビジネスクラスを作成します。
Interstage Studioのメニューバーから、[ファイル] > [新規] > [ビジネスクラス(Apcoordinator)]を選択します。以下の画面が表示さ
れます。
- 305 -
新規ビジネスクラス(Apcoordinator)生成ウィザードの画面では以下を指定します。
- パッケージ名
ビジネスクラスのパッケージ名を指定します。
- クラス名
ビジネスクラスのクラス名を指定します。
- メソッド
追加ボタンを押して、ビジネスクラスにメソッドを追加します。このとき、メソッドの生成に必要な情報として、使用する電子フォー
ムに従い、以下の情報を入力します。
- 入力データ種別
電子フォームのボタンを押すことで呼び出されるメソッドの場合は FormデータBeanを指定します。ブラウザからアプリケー
ションへ最初にアクセスがあったときに呼び出されるメソッドの場合は、入力データなしを指定します。
- フォーム名
データ送信元のフォーム名を指定します。
- コマンド
ボタン名を指定します。
- 306 -
- メソッド
メソッド名を指定します。
- 復帰値型
Object を指定します。
- セションスコープとして生成
セションスコープとする場合、チェックします。
- コマンドスクリプティングとして生成する
コマンドスクリプティングとする場合、チェックします。
以上で、コマンドマップとビジネスクラスのJavaソースファイルが生成されます。ビジネスクラスのJavaソースファイルを編集し、各
メソッドで実行する処理を作成してください。
5. Webアプリケーション関係定義ファイル(web.xml)を編集する。
Webアプリケーション関係定義ファイル(web.xml)をInterstage StudioのXMLエディタで編集します。
web.xmlに必要な設定については、“29.2 電子フォームの表示”を参照してください。
- 307 -
付録A サンプルアプリケーション
オンラインマニュアルの“サンプル集”ではApcoordinatorの各機能を利用したサンプルアプリケーションを提供しています。ここでは、
もっとも基本的な機能を使用した2つのサンプルアプリケーションについて解説します。
A.1 簡単なサンプル
アプリケーションの概要
2項の加減算を行う簡単なアプリケーションです。
制御ページ
・ main.jsp
<HTML>
<HEAD>
<TITLE>sample</TITLE>
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
</HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="head" />
<uji:include pane="body" />
</BODY>
</HTML>
アプリケーションはmain.jspを指定して実行を開始します。制御ページはHTTPリクエストを受け取り、Apcoordinatorを起動します。
taglibディレクティブは、ApcoordinatorのUJIタグを使用可能にする宣言です。 uji:dispatchタグは、HTTPリクエストを解析して、対
応するビジネスクラスを呼び出します。 uji:includeタグは画面の各領域にJSPを取り込む指示です。ここではheadとbodyの2つの領
域を指定しています。
データBean
・ HeadBean.java
package sample;
import com.fujitsu.uji.DataBean;
public class HeadBean extends DataBean
{
- 308 -
protected int count;
protected java.util.Date loginTime;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public java.util.Date getLoginTime() {
return loginTime;
}
public void setLoginTime(java.util.Date loginTime) {
this.loginTime = loginTime;
}
}
・ BodyBean.java
package sample;
import com.fujitsu.uji.DataBean;
public class BodyBean extends DataBean
{
protected String message;
protected double val1;
protected double val2;
protected double result;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public double getVal1() {
return val1;
}
public void setVal1(double val1) {
this.val1 = val1;
}
public double getVal2() {
return val2;
}
public void setVal2(double val2) {
this.val2 = val2;
}
public double getResult() {
return result;
}
public void setResult(double result) {
this.result = result;
}
}
- 309 -
データBeanは、画面とロジックの間で転送するデータを持つクラスです。データの項目は、JavaBeanのプロパティの形式でset・get
メソッドを作成します。例のHeadBeanではcountとloginTime、BodyBeanではmessage、val1、val2、resultの各項目を作成していま
す。
入出力ページ
・ header.jsp
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="head" cls="sample.HeadBean" request="true" />
実行回数は
<uji:getProperty bean="head" property="count" /> 回です。 <BR>
セションを開始した時間は
<uji:getProperty bean="head" property="loginTime" /> です。 <BR>
<HR><BR>
・ request.jsp
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="sample.BodyBean" request="true" />
サンプルプログラムでは、2項の加減算を実行します。
<FORM method="post">
<INPUT name="uji.verbs" type="hidden" value="add,sub">
<INPUT name="uji.id" type="hidden" value="body">
値1の入力: <INPUT name="val1"> <BR>
値2の入力: <INPUT name="val2"> <BR>
<INPUT name="add" type="submit" value="加算">
<INPUT name="sub" type="submit" value="減算">
</FORM>
・ response.jsp
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="sample.BodyBean" request="true" />
<uji:getProperty bean="body" property="message" /><BR>
<uji:getProperty bean="body" property="val1" />と
<uji:getProperty bean="body" property="val2" />の計算結果は<BR>
<uji:getProperty bean="body" property="result" />です。<BR>
<FORM method="post">
<INPUT name="uji.verbs" type="hidden" value="next">
<INPUT name="uji.id" type="hidden" value="body">
<INPUT name="next" type="submit" value="入力に戻る">
</FORM>
画面の本体です。例のheader.jspはヘッダ部に表示するための画面、request.jspとresponse.jspはボディ部に表示するための画面
です。 taglibディレクティブは、ApcoordinatorのUJIタグを使用可能にする宣言です。 uji:useBeanタグは、データBeanの変数名を
宣言しています。簡単のために、表示領域名と名前を合わせています。データBeanの変数の内容を参照するためには、uji:getProperty
タグを使用します。
request.jspでは、FORMタグ中のINPUTタグで2つの隠し項目uji.verbsとuji.id、2つの入力項目val1とval2、2つの送信ボタンaddとsub
を宣言しています。 uji.verbsはこのフォームで送信されるコマンド(ボタン名)の一覧をApcoordinatorに通知します。 uji.idはこの
フォームの入力を受け取るデータBeanの変数名をApcoordinatorに通知します。
response.jspには、フォームの入力項目なしで隠し項目と送信ボタンだけ定義してあります。
フォームのあて先(action)は省略してあります。この場合、HTTPリクエストは同じ制御ページmain.jspに送られます。また、データ
量が増えても送信可能にするため、method="post"を指定します。
request.jspとresponse.jspはどちらもBodyBeanに対応する画面で、区別のために画面の表示モードが必要です。あとで出てきます
が、これをreqmodeとresmodeとしておきます。 header.jspはHeadBeanに対応する唯一の画面のため、画面モードは不要です。
- 310 -
ビジネスクラス
・ SampleHandler.java
package sample;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
public SampleHandler() {
}
public boolean init() {
return true;
}
public void add(DispatchContext context, BodyBean dataBean) {
double result = dataBean.getVal1() + dataBean.getVal2();
dataBean.setMessage("加算を実行しました。");
dataBean.setResult(result);
dataBean.setVerb("resmode");
context.setResponseBean("body", dataBean);
setHead(context);
}
public void sub(DispatchContext context, BodyBean dataBean) {
double result = dataBean.getVal1() - dataBean.getVal2();
dataBean.setMessage("減算を実行しました。");
dataBean.setResult(result);
dataBean.setVerb("resmode");
context.setResponseBean("body", dataBean);
setHead(context);
}
public void next(DispatchContext context, BodyBean dataBean) {
dataBean.setVerb("reqmode");
context.setResponseBean("body", dataBean);
setHead(context);
}
public void startup(DispatchContext context) {
BodyBean dataBean = new BodyBean();
dataBean.setVerb("reqmode");
context.setResponseBean("body", dataBean);
setHead(context);
}
private HeadBean headBean;
private void setHead(DispatchContext context) {
if(headBean == null) {
headBean = new HeadBean();
headBean.setLoginTime(new java.util.Date());
}
headBean.setCount(headBean.getCount() + 1);
context.setResponseBean("head", headBean);
}
}
ビジネスクラスでは処理ロジックを記述します。例では送信ボタンに対応したメソッドadd、sub、nextと、初回起動のためのメソッドstartup
を持っています。 addメソッドでは、まず、ビジネスロジックとして加算を実行しています。次に結果をデータBeanに設定しています。
結果の画面に対応したデータBeanを使用しますが、この例ではデータBeanは共通なのでパラメタとして受け取ったBodyBeanをそ
- 311 -
のまま利用しています。 setVerbメソッドは、画面の表示モードを指定しています。setResponseBeanで、画面領域とデータBeanを対
応付けてApcoordinatorに設定します。 head領域の部分は共通のため、setHeadメソッドでサブルーチン化しています。setHeadの
中ではheadBeanに値を設定し、head領域に対応付けています。 initメソッドがtrueを返していますが、これはこのビジネスクラスをセ
ションスコープにする指定です。このクラスの中にはheadBeanという変数があります。セションスコープにすることにより、同じセショ
ンでは同じインスタンスを使うことが保証され、headBeanの値が保持されます。
関係定義ファイル
・ commands.map
# commands.map
sample.BodyBean;add=sample.SampleHandler.add
sample.BodyBean;sub=sample.SampleHandler.sub
sample.BodyBean;next=sample.SampleHandler.next
;=sample.SampleHandler.startup
・ pages.map
# pages.map
sample.HeadBean;=header.jsp
sample.BodyBean;reqmode=request.jsp
sample.BodyBean;resmode=response.jsp
コマンドマップファイルcommands.mapでは、画面の入力結果のデータBeanとコマンド(送信ボタンの名前)に対応して呼び出すビ
ジネスクラスとメソッドを指定しています。
ページマップファイルpages.mapでは、処理結果のデータBeanと表示モード(setVerbで指定)によって表示する入出力画面の名前
を指定しています。
A.2 画面部品のサンプル
アプリケーションの概要
画面部品を利用して、データを表形式で表示・入力します。概要モードでは、表を使用しています。
詳細モードでは、リストと複合Beanを使用しています。
- 312 -
アプリケーションの骨格部分
アプリケーションの骨格部分は、“A.1 簡単なサンプル”を参照してください。ここでは簡単な説明にとどめます。
・ main.jsp
<HTML>
<HEAD>
<TITLE>model</TITLE>
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
</HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="body" />
</BODY>
</HTML>
領域はbodyひとつだけを使用しています。
・ MeisaiBean.java
package model;
import com.fujitsu.uji.DataBean;
public class MeisaiBean extends DataBean
{
protected DataManager dm;
protected
protected
protected
protected
protected
protected
protected
protected
protected
protected
String
String
String
String
String
String
String
String
String
String
denpyoNo;
chumonDate;
shohinCode;
shohinName;
shohinCount;
tantoOffice;
nonyuDate;
kokyakuWard;
kokyakuName;
kokyakuPhone;
public MeisaiBean(DataManager dm, String[] data) {
this.dm = dm;
denpyoNo = data[0];
chumonDate = data[1];
shohinCode = data[2];
shohinName = data[3];
- 313 -
shohinCount = data[4];
tantoOffice = data[5];
nonyuDate = data[6];
kokyakuWard = data[7];
kokyakuName = data[8];
kokyakuPhone = data[9];
}
public String getDenpyoNo() {
return denpyoNo;
}
public String getChumonDate() {
return chumonDate;
}
public String getShohinCode() {
return shohinCode;
}
public String getShohinName() {
return shohinName;
}
public String getShohinCount() {
return shohinCount;
}
public String getTantoOffice() {
return tantoOffice;
}
public String getNonyuDate() {
return nonyuDate;
}
public String getKokyakuWard() {
return kokyakuWard;
}
public String getKokyakuName() {
return kokyakuName;
}
public String getKokyakuPhone() {
return kokyakuPhone;
}
public void setNonyuDate(String nonyuDate) {
if (this.nonyuDate != null && this.nonyuDate.equals(nonyuDate)) return;
dm.setNonyuDate(this, nonyuDate);
}
}
一件のデータを表すデータBeanです。更新はDataManagerクラスを呼び出すことで実行します。また、更新対象でないプロパティの
setメソッドは省略しています。
・ DataManager.java
package model;
import java.io.Serializable;
import java.util.Vector;
public class DataManager implements Serializable {
Vector data;
public DataManager() {
}
public int getDataCount() {
return data.size();
}
- 314 -
public MeisaiBean getData(int index) {
return (MeisaiBean)data.elementAt(index);
}
public void setNonyuDate(MeisaiBean bean, String value) {
// データベースの更新処理に相当
bean.nonyuDate = value;
}
public void prepareData() {
// データベースの読み込み処理に相当
data = new Vector();
for(int i = 0; i < initialData.length; i++) {
MeisaiBean bean = new MeisaiBean(this, initialData[i]);
data.addElement(bean);
}
}
private static final String initialData[][] = {
{ "401791","20000214","AC106W","エアコン 100V 6畳用ホワイト","1",
"川崎支店","未定","川崎市中原区","田村電気","044-999-9999" },
....(省略)....
};
}
データのアクセスを提供するクラスです。このサンプルでは、初期値を文字列で持っています。また更新時もメモリ上のデータを書
き換えるだけです。
・ ModelBean.java
package model;
import com.fujitsu.uji.DataBean;
public class ModelBean extends DataBean
{
protected SummaryModel summary;
protected DetailModel detail;
public SummaryModel getSummary() {
return summary;
}
public DetailModel getDetail() {
return detail;
}
public void initData(DataManager dm) {
summary = new SummaryModel(dm);
detail = new DetailModel(dm);
}
}
データBeanです。summaryとdetailのプロパティがそれぞれ画面部品のインタフェースを提供します。これらのクラスの詳細は後述
します。
・ ModelHandler.java
package model;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
- 315 -
public class ModelHandler extends GenericHandler
{
protected DataManager dm;
public ModelHandler() {
}
public boolean init() {
return true;
}
public void showDetail(DispatchContext context, ModelBean dataBean) {
dataBean.setVerb("detail");
context.setResponseBean("body", dataBean);
}
public void showSummary(DispatchContext context, ModelBean dataBean) {
dataBean.setVerb("summary");
context.setResponseBean("body", dataBean);
}
public void startup(DispatchContext context) {
dm = new DataManager();
dm.prepareData();
ModelBean dataBean = new ModelBean();
dataBean.initData(dm);
dataBean.setVerb("summary");
context.setResponseBean("body", dataBean);
}
}
showDetailとshowSummaryでは、表示モードを切り替える(setVerb)のみの処理をしています。 startupメソッドでは、データの初期
化をして、概要モードで表示しています。
・ commands.map
# commands.map
model.ModelBean;showDetail=model.ModelHandler.showDetail
model.ModelBean;showSummary=model.ModelHandler.showSummary
;=model.ModelHandler.startup
・ pages.map
# pages.map
model.ModelBean;summary=summary.jsp
model.ModelBean;detail=detail.jsp
・ web.xml
“A.1 簡単なサンプル”と同じです。割愛します。
概要表示(表の画面部品を使用)
・ summary.jsp
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="model.ModelBean" request="true" />
<P>納入予定日設定(概要モード)</P>
<FORM method="post">
<INPUT name="uji.verbs" type="hidden" value="showDetail">
<INPUT name="uji.id" type="hidden" value="body">
<uji:table bean="body" property="summary">
<uji:tableRenderer type="table" >
- 316 -
<TABLE border="2" width="100%"><uji:children/></TABLE>
</uji:tableRenderer>
<uji:tableRenderer type="column" cls="header" >
<TH bgcolor="#EEFFEE"><uji:value/></TH>
</uji:tableRenderer>
<uji:tableRenderer type="column" cls="editable" >
<TD><INPUT name="<uji:name/>" value="<uji:value/>"></TD>
</uji:tableRenderer>
</uji:table>
<INPUT name="showDetail" type="submit" value="詳細表示">
</FORM>
この入出力ページでは、uji:tableタグを使用しています。 uji:tableタグのアトリビュートでは、TableModelインタフェースを返すプロ
パティ名としてsummaryを指定しています。 uji:tableの中ではレンダラとして3つのuji:tableRendererタグを指定しています。レンダラ
は表やセルのフォーマットを記述するものです。uji:tableタグは、インタフェースで得られる情報に従って表・行・セルといった単位
でレンダラを呼び出し、その内容を画面に出力します。レンダラを省略した場合には、予め決まったパターンを出力します。
最初のレンダラは表全体(type="table")のフォーマットを指定します。ここでは、TABLEタグにborderとwidthのアトリビュートを追加
しています。uji:childrenタグは下位のレンダラの処理を行う指定です。
次のレンダラはセル(type="column")で状態がヘッダ(cls="header")のもののフォーマットを指定しています。ここではTHタグを使
い、背景色を設定しています。uji:valueはセルの値を表示する指定です。最後のレンダラは、セル(type="column")で状態が編集可能
(cls="editable")のもののフォーマットの指定です。INPUTタグで入力したデータはApcoordinatorが自動的にデータBeanに反映し
ます。これを可能にするため、uji:nameでは更新時の名前を自動生成しています。
・ SummaryModel.java
package model;
import java.io.Serializable;
public class SummaryModel implements com.fujitsu.uji.model.table.TableModel,Serializable {
DataManager dm;
public SummaryModel(DataManager dm) {
this.dm = dm;
}
public int getColumnCount() {
return 6;
}
public int getRowCount() {
return dm.getDataCount() + 1;
}
public java.lang.Object getValueAt(int row, int col) {
if(row == 0) {
switch(col) {
case 0: return "伝票番号";
case 1: return "注文日";
case 2: return "品番";
case 3: return "数量";
case 4: return "担当支店";
case 5: return "納入予定日";
}
} else {
MeisaiBean bean = dm.getData(row - 1);
switch(col) {
case 0:return bean.getDenpyoNo();
case 1:return bean.getChumonDate();
case 2:return bean.getShohinCode();
case 3:return bean.getShohinCount();
- 317 -
case 4:return bean.getTantoOffice();
case 5:return bean.getNonyuDate();
}
}
throw new ArrayIndexOutOfBoundsException();
}
public java.lang.String getColumnClass(int row, int col) {
if(row == 0)
return "header";
else if(col == 5)
return "editable";
return null;
}
public java.lang.String getRowClass(int row) {
return null;
}
public void setValueAt(java.lang.Object val, int row, int col) {
if(row == 0 || col != 5 || !(val instanceof String))
throw new IllegalStateException();
MeisaiBean bean = dm.getData(row - 1);
bean.setNonyuDate((String)val);
}
}
表のインタフェースの実装クラスです。
getColumnCountメソッドとgetRowCountメソッドは、それぞれ表のカラム数と行数を返します。
getValueAtメソッドは、表中のセルのデータを返します。ここでは0行目をヘッダ用として使っています。また、データの行では概要
表示の対象のみを選択して返しています。
getColumnClassメソッドは、セルのデータの状態を任意の文字列で返します。ここでは、0行目では"header"を、5カラム目で
は"editable"を返しています。その他の場合はデフォルトのレンダラを使うようにnullを返しています。
getRowClassメソッドは行のデータの状態を返しますが、ここではデフォルトを使用しています。
setValueAtメソッドは、データの更新のために呼ばれます。簡単なチェックのあと、beanの更新を呼び出しています。
この例ではヘッダの文字列もクラス側から通知する仕組みとなっていますが、ヘッダの文字列はJSPに書いてクラス側ではデータ
のみを返すという方法もあります。後述の詳細表示は、ヘッダを固定文字列でJSPに書くタイプになっています。
詳細表示(リストと複合Beanの画面部品を使用)
・ detail.jsp
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="model.ModelBean" request="true" />
<P>納入予定日設定(詳細モード)</P>
<FORM method="post">
<INPUT name="uji.verbs" type="hidden" value="showSummary">
<INPUT name="uji.id" type="hidden" value="body">
<uji:list bean="body" property="detail">
<uji:listRenderer type="list">
<TABLE border="2" width="100%">
<TR>
<TH bgcolor="#EEFFEE" rowspan="2">伝票番号
<TH bgcolor="#EEFFEE">注文日
<TH bgcolor="#EEFFEE">品番
<TH bgcolor="#EEFFEE">数量
<TH bgcolor="#EEFFEE" colspan="2">顧客地区
- 318 -
<TH bgcolor="#EEFFEE">納入予定日
<TR>
<TH bgcolor="#EEFFEE" colspan="3">商品名
<TH bgcolor="#EEFFEE">担当支店
<TH bgcolor="#EEFFEE">顧客名称
<TH bgcolor="#EEFFEE">顧客電話番号
<uji:children />
</TABLE>
</uji:listRenderer>
<uji:listRenderer type="element">
<uji:composite>
<uji:compositeRenderer>
<TR>
<TD rowspan="2"><uji:getProperty property="denpyoNo" />
<TD><uji:getProperty property="chumonDate" />
<TD><uji:getProperty property="shohinCode" />
<TD><uji:getProperty property="shohinCount" />
<TD colspan="2"><uji:getProperty property="kokyakuWard" />
<TD><input name="<uji:compositeName property='nonyuDate' />"
value="<uji:getProperty property='nonyuDate' />" >
<TR>
<TD colspan="3"><uji:getProperty property="shohinName" />
<TD><uji:getProperty property="tantoOffice" />
<TD><uji:getProperty property="kokyakuName" />
<TD><uji:getProperty property="kokyakuPhone" />
</uji:compositeRenderer>
</uji:composite>
</uji:listRenderer>
</uji:list>
<INPUT name="showSummary" type="submit" value="概要表示">
</FORM>
この入出力ページでは、uji:listタグとuji:compositeタグを使用しています。
uji:listタグのアトリビュートでは、ListModelインタフェースを返すプロパティ名としてdetailを指定しています。
レンダラは2つあります。最初のレンダラはリスト全体のレンダラです。見出しの部分をTABLEタグを使って記述しています。後のレ
ンダラは、リストのエレメント(各行)のレンダラです。この例ではリストのエレメントは単純なデータではなく、データBeanになってい
ます。そこで、さらにデータBeanの内容を参照するために、uji:compositeタグを利用しています。
uji:compositeタグではデータBeanを指定していません。これは上位の画面部品(ここではuji:list)からデータBeanを受け取ってい
るためです。この例では、リストのエレメントとして返される値がMeisaiBeanクラスで、これがuji:compositeタグで使うデータBeanにな
ります。
uji:compositeタグには、アトリビュートをもたないレンダラを1つ書きます。compositeRendererの中では値の参照にuji:getPropertyタ
グ、また更新時の名前の指定にuji:compositeNameタグを書きます。この例はデータを2段にフォーマットし、納入予定日を更新可
能にしています。
・ DetailModel.java
package model;
import java.io.Serializable;
public class DetailModel implements com.fujitsu.uji.model.list.ListModel,Serializable {
DataManager dm;
public DetailModel(DataManager dm) {
this.dm = dm;
}
public int getSize() {
return dm.getDataCount();
}
- 319 -
public java.lang.Object getElementAt(int pos) {
return dm.getData(pos);
}
public java.lang.String getElementClass(int pos) {
return null;
}
public void setElementAt(java.lang.Object obj, int pos) {
throw new IllegalStateException();
}
}
リストのインタフェースを実装するクラスです。
getSizeメソッドはリストのエレメントの数を返します。
getElementAtメソッドはリストのエレメントのデータを返します。ここでは、DataManagerクラスから受け取ったMeisaiBeanオブジェクト
をそのまま返しています。
getElementClassメソッドはデータの状態を返しますが、ここでは全てデフォルトです。
setElementAtメソッドはここでは呼ばれません。リストのエレメントが文字列などの単純なデータでuji:nameタグで入力フィールドを
指定するときはsetElementAtでデータを受け取りますが、この場合はuji:compositeタグを介して入力フィールドを設定しているた
め、MeisaiBeanのsetメソッドが直接呼ばれることになります。
- 320 -
付録B Apcoordinatorの動作概要
ここでは、Apcoordinatorの内部動作の概要を説明します。
Apcoordinatorアプリケーションのデバッグ時や、フレームワークをより深く理解したい場合に参照してください。
Webフロント部の動作概要
下図はApcoordinator Webフロント部の動作概要を示します。
・ uji:dispatchタグの実行(またはUjiServletの実行)では、リクエストを解析した内容のデータBeanをApcoordinatorコアに渡します。
・ ビジネスクラスでsetResponseBeanによって指定されたデータBeanがJSP表示時にUJIタグから参照されます。
・ この時に作成された対応表が次回のリクエストの解析に利用されます。
- 321 -
Apcoordinatorコアの動作概要
下図はApcoordinatorコア部分の動作概要を示します。
・ Webフロントではリクエストの解析から作成されたデータBeanが、EJBでは、パラメタのデータBeanが入力となります。
- 322 -
・ ロジックの前後に前処理・後処理が実行されます。
・ コマンドスクリプティング利用時は、通常のクラス呼出しの代わりにスクリプトが実行されます。
・ クラス呼出し時は、ロジック実行の前後にビジネスクラスのpreprocess、postprocessが実行されます。
・ 例外発生時はhandleExceptionメソッドに制御が渡されます。
- 323 -
付録C 旧バージョンとの互換情報
以下の製品が提供する旧バージョンのフレームワークとの互換情報を説明します。
・ Interstage Business Application Server
・ Interstage Application Server
・ Interstage Application Server Plus
・ Interstage Application Server Plus Developer
・ Interstage Application Framework Suite
・ Interstage Apcoordinator
・ INTERSTAGE WEBCOORDINATOR
・ Interstage Interaction Manager
・ Interstage Studio
・ Interstage Apworks
以下の表に従って、移行元の製品に応じて必要な互換情報を参照してください。
アプリ
ケー
ション
種別
互換情報
共通
XmlDataBeanクラスの
isValidXml,
getValidXmlMessage
メソッドを使用している
場合の修正
移行元の製品のバージョン
V3.0L20
Windowsにおいて
JDK1.4.1以降を使用
する場合の文字エン
コーディングの指定
○
V4.0L10
○
V4.0L20
V5.0L10
○
○
○
XMLデータ仕様記述
のバージョン指定につ
いて
V5.0L20 V6.0L10 V7.0L10
V6.0L11 V7.0L11
8.0
8.1
○
○
○
○
○
○
○
○
○
○
○
○
○
EJB複数指定機能を
使用する場合のクラス
パスの設定
○
XML連携機能で利用
するXMLプロセッサを
変更する場合の動作
の注意点
Web
アプ
リ
ケー
ショ
ン
○
○
○
○
○
○
○
○
○
○
○
ujiall.tld以外のタグラ
イブラリディスクリプタを
使用したアプリケーショ
ンの修正
○
○
○
UJIタグの新機能を使
用する場合の修正
○
○
○
○
○
○
uji:controlSectionタグ
を使用している場合の
修正
V9.0.0
V9.0.1
- 324 -
アプリ
ケー
ション
種別
互換情報
移行元の製品のバージョン
V3.0L20
V4.0L10
V4.0L20
uji:switchタグの動作
の違い
○
○
○
uji:includeタグ、
uji:useBeanタグで参照
するデータBeanのス
コープの違い
○
uji.methodリクエストパ
ラメタのデフォルトでの
使用可否状態の変更
○
○
○
○
HttpServletRequestか
ら取得されるリクエスト
パラメタの文字エン
コーディング変換の有
無の違い
○
○
○
○
アップロード可能なファ
イルサイズのデフォル
トの上限値の変更
○
○
○
○
UJIタグが生成する
HTMLの変更
○
○
○
uji:tableViewタグおよ
びuji:treeViewタグの
アトリビュートの修正
web.xmlの記述形式の
違い
○
○
○
JDK/JRE5.0以降を使
用する場合の例外の
違い
コンテントを持たない
uji:caseタグの動作の
違い
○
○
○
レンダラの動作の違い
○
○
○
初期化パラメタ
uji.servlet.defaultError
Pageを使用している場
合の修正
uif:iformタグを使用し
ているアプリケーション
の運用
○
V5.0L10
V5.0L20 V6.0L10 V7.0L10
V6.0L11 V7.0L11
8.0
8.1
V9.0.0
V9.0.1
○
○
○
○
○
○
○
○
(*1)
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
○
autoEscape機能による
フォーカス移動の動作
の違い
○
SOAPサーバアプリケーション
○
○
*1: 製品の版数により該当するかどうかが異なります。詳細は互換情報の説明を参照してください。
なお、INTERSTAGE APWORKS V3.0L20で開発したアプリケーションをInterstage Studioで利用する場合の注意事項について
は、“C.4 Interstage Studioでのウィザードの利用”を参照してください。
- 325 -
C.1 アプリケーション種別共通
XmlDataBeanクラスのisValidXml, getValidXmlMessageメソッドを使用している場合の修正
com.fujitsu.uji.xml.XmlDataBeanに新しいisValidXmlメソッドが追加され、XML Schema に対応したXML文書の検証が可能になりま
した。これに伴い、Apcoordinator V5.0L10、および、INTERSTAGE WEBCOORDINATORで提供されていた以下のメソッドは非推奨
とします。
・ isValidXml(InputStream is)
・ isValidXml(String uri)
・ isValidXml(File file)
・ isValidXml(InputSource is)
・ isValidXml()
・ getValidXmlMessage()
XML文書の検証は、新規に追加された以下のメソッドを使用してください。メソッドの使用方法は“APIリファレンス”を参照してくださ
い。
・ isValidXml(boolean useSchema)
・ isValidXml(Object schemaSource)
WindowsにおいてJDK1.4.1以降を使用する場合の文字エンコーディングの指定
JDK1.4.1以降、文字エンコーディング名Shift_JISの実体がMS932からSJISに変更になりました。JDK1.4.0以前を使用していたアプリ
ケーションをJDK1.4.1以降に移行するには、以下の場合に文字エンコーディング名Shift_JISをwindows-31jに書き換える必要がありま
す。
・ 文字エンコーディング名としてShift_JISを使用している、かつ、
・ 丸付き数字などWindows固有の文字コードを使用している場合
MS932はwindows-31jの別名として使用できます。
XMLデータ仕様記述のバージョン指定について
XMLデータ仕様記述にバージョン6.0が導入されました。推奨のバージョンは6.0となります。
バージョン5.0は継続して利用可能であり、アプリケーションの修正の必要はありません。
XMLデータ仕様記述のバージョンによる動作の差異については、“定義ファイルリファレンス”の“XMLデータ仕様記述”を参照してく
ださい。
また、コマンドスクリプティングにもバージョン6.0が導入され、推奨となります。
コマンドスクリプティングのバージョンはspecSectionタグ中のXMLデータ仕様記述のバージョンを表し、コマンドスクリプティング自体の
動作の変更はありません。
EJB複数指定機能を使用する場合のクラスパスの設定
EJB複数指定機能を使用する場合に必要となるJARがV5.0L20と比べて変更になり、ujief.jarは不要になりました。EJB複数指定機能
に必要なクラスはuji.jarによって提供されます。
XML連携機能で利用するXMLプロセッサを変更する場合の動作の注意点
XML連携機能で利用するXMLプロセッサを変更する場合、次の点に注意する必要があります。
・ XMLプロセッサによって処理性能に差が生じる場合があるため、事前に必ず性能測定を実施し、処理要件を満たすかどうか確認
してください。処理要件を満たさない場合、利用するXMLプロセッサを元に戻すなどの対処をしてください。
- 326 -
・ XMLプロセッサの仕様の違いにより、動作に差異が生じる場合があります。 以下に、XML連携機能を使用する上でのFujitsu XML
プロセッサとJDK/JRE 5.0 以降が提供するXMLプロセッサとの差異を説明します。
- com.fujitsu.uji.xml.XmlDataBeanクラスのsaveToメソッドで引数に符号化方式名を指定し、その符号化方式が不当だった場
合、以下の差異があります。
- Fujitsu XMLプロセッサの場合:UTF-8でXML文書が書き出されます。
- JDK/JRE 5.0 以降が提供するXMLプロセッサの場合:例外が発生します。
- フ ァ イ ル を エ ン テ ィ テ ィ と し て 宣 言 し エ ン テ ィ テ ィ 参 照 で フ ァ イ ル を イ ン ク ル ー ド し て い る XML 文 書 を
com.fujitsu.uji.xml.XmlDataBeanのloadFromメソッドで読み込み、saveToメソッドでXML文書を書き出した場合、書き出された
XML文書に以下の差異があります。
- Fujitsu XMLプロセッサの場合:ファイルからインクルードされた要素に追加されるアトリビュートはありません。
- JDK/JRE 5.0 以降が提供するXMLプロセッサの場合:ファイルからインクルードされた要素にxml:baseアトリビュートが追加
されます。その値はインクルードされたファイル名です。ファイル名は絶対パスとなっている場合があります。
C.2 Webアプリケーション
ujiall.tld以外のタグライブラリディスクリプタを使用したアプリケーションの修正
INTERSTAGE WEBCOORDINATOR が提供していた以下のタグライブラリディスクリプタを使用したアプリケーションの場合、Webア
プリケーション環境定義ファイル(web.xml)の修正と、タグライブラリファイルujiall.tldのコピーが必要です。
・ compo.tld
・ script.tld
・ uomf.tld
・ uji.tld
修正は以下のように行います。
・ web.xmlのtaglib-locationタグで上記のファイル名が指定されている場合、それを"ujiall.tld"に書き換えます。例えば、次のように書
き換えます。
修正前
<taglib>
<taglib-uri>uji-model</taglib-uri>
<taglib-location>/WEB-INF/uomf.tld</taglib-location>
</taglib>
修正後
<jsp-config>
<taglib>
<taglib-uri>uji-model</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
上記の例では、修正後のweb.xmlをServlet仕様バージョン2.4の形式で記述しています。 Servlet仕様バージョン2.4の形式への
web.xmlの移行については、“web.xmlの記述形式の違い”を参照してください。
・ Apcoordinatorのタグライブラリファイルujiall.tldを、WebアプリケーションのWEB-INFフォルダにコピーします。
なお、修正のないソースの再コンパイルは必要ありません。
UJIタグの新機能を使用する場合の修正
以前のバージョンのApcoordinatorや、INTERSTAGE WEBCOORDINATORで動作するアプリケーションにおいて、UJIタグの新機能
を利用する場合は、タグライブラリファイルujiall.tldを新しいものに置き換える必要があります。 Apcoordinatorのタグライブラリファイル
- 327 -
ujiall.tldを、WebアプリケーションのWEB-INFフォルダに上書きコピーしてください。このとき、修正のないソースの再コンパイルは必要
ありません。
uji:controlSectionタグを使用している場合の修正
uji:controlSectionタグは提供されません。 uji:controlSectionタグを使ったJSPは修正しなくても実行できますが、 uji:controlSectionタグ
を使用しない場合と同じ動作となります。
二重処理を防止するには、uji:formタグのpostOnceアトリビュート、または、HttpControlStateProfileクラスによる二重処理防止機能を使
用してください。二重処理防止機能については、“17.1.5 高度なセション管理”を参照してください。
なお、以下の条件の場合、uji:controlSectionタグを使用した場合と使用しない場合とで、エラーページ表示時の動作に違いがありま
す。
・ 制御ページでuji:includeタグを2個以上使用している場合で、
・ 2個目以降のuji:includeタグ実行中に例外が発生した場合。
この場合、エラーページが以下のように表示されます。
・ uji:controlSectionタグを使用しない場合、正常に終了したuji:includeタグでインクルードしたJSPは表示され、そのあとにエラーペー
ジの内容が追加されます。uji:includeによる出力は実行するたびにブラウザに送信されるため、このような結果となります。
・ uji:controlSectionタグを使用している場合、正常に終了したuji:includeタグでインクルードしたJSPは表示されず、エラーページの
みが表示されます。二重処理防止を実現するためにuji:includeの出力を一旦メモリにため込みすぐにはブラウザに送信しない仕
組であるため、このような結果となります。
なお、JSPは画面表示を行う手段であるため、例外を発生させるような要因は事前にビジネスクラスで検出し、JSP内では例外が発生し
ないようにJSP、データBean、ビジネスクラスを作成することを推奨します。
uji:switchタグの動作の違い
J2EE 仕 様 へ の 適 合 向 上 と 性 能 向 上 の 目 的 で 、 UJI タ グ の 評 価 方 法 に 変 更 が 加 え ら れ ま し た 。 こ れ に よ り 、 INTERSTAGE
WEBCOORDINATOR と Apcoordinatorとで以下の場合にuji:switchタグの動作に違いがあります。
a. uji:switchタグにbeanアトリビュートを指定し、かつ、
b. uji:caseタグのコンテントでUJIタグを使用し、かつ、
c. 2のUJIタグでbeanアトリビュートを指定している場合。
上記の場合、uji:caseタグのコンテントにあるUJIタグの評価タイミングに違いがあります。 INTERSTAGE WEBCOORDINATORの場
合、uji:caseの条件が評価され、条件が成立した場合にuji:caseのコンテントのUJIタグが評価されます。Apcoordinatorの場合、uji:case
のコンテントにUJIタグが出現した時点で評価されます。
この違いにより発生する影響について説明します。以下の例を参照してください。
<uji:switch bean="body" property="fullMode">
<uji:case cls="true">
<uji:comboBox bean="body" property="teamList" />
...
</uji:case>
<uji:case>
...
</uji:case>
</uji:case>
プロパティfullModeの値がfalseの場合、cls="true"を指定したuji:caseの条件は成立しません。この場合でも、Apcoordinatorの場合は
uji:caseのコンテントにあるuji:comboBoxタグが評価されます。ここで、"body"データBeanのtermListプロパティの値がnullの場合、
uji:comboBoxが使用する項目クラスが取得できないため例外が発生します。一方、INTERSTAGE WEBCOORDINATORの場合は
uji:comboBoxが評価されないため例外は発生しません。
上記条件に該当する場合、アプリケーションを次のどちらかの方法で修正することにより、Apcoordinatorでも動作します。
・ uji:switchタグのbeanアトリビュートと、uji:caseタグのコンテントにあるUJIタグのbeanアトリビュートが同じ場合には、uji:caseタグのコ
ンテントにあるUJIタグのbeanアトリビュートを省略します。
- 328 -
・ uji:caseタグのコンテントで使用する項目クラスがnullにならないように、データBeanに事前に項目クラスを設定しておきます。
uji:includeタグ、uji:useBeanタグで参照するデータBeanのスコープの違い
サブウィンドウ機能およびフレーム機能対応のため、uji:includeタグ、uji:useBeanタグで使用するデータBeanのスコープが、INTERSTAGE
WEBCOORDINATOR V3.0L20と比べて変更になっています。
・ INTERSTAGE WEBCOORDINATOR V3.0L20の場合、データBeanをリクエストスコープから検索します。現在処理中のリクエストで
setResponseメソッドにより設定されたデータBeanだけが参照されます。
・ Apcoordinator の 場 合 、 デ ー タ Bean を セ シ ョ ン ス コ ー プ か ら 検 索 し ま す 。 現 在 処 理 中 の リ ク エ ス ト の 処 理 中 に 実 行 さ れ た
setResponseBeanメソッドだけでなく、それ以前のリクエストのsetResponseBeanメソッドによって設定されたデータBeanが参照される
場合があります。
uji:include タ グ 、 uji:useBean タ グ の 動 作 を INTERSTAGE WEBCOORDINATOR V3.0L20 と 同 じ に す る に は 、 初 期 化 パ ラ メ タ
uji.includeSessionScopeBeanにfalseを指定してください。初期化パラメタはWebアプリケーション環境定義ファイルに記述します。以下
は記述例です。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample2.Sample2Factory</param-value>
</context-param>
<context-param>
<param-name>uji.includeSessionScopeBean</param-name>
<param-value>false</param-value>
</context-param>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
uji.methodリクエストパラメタのデフォルトでの使用可否状態の変更
Apcoordinator V5.0L10、または、INTERSTAGE WEBCOORDINATORで作成したアプリケーションで、isUjiMethodAvailableメソッド
をデフォルトのまま使用し、uji.methodリクエストパラメタを使用している場合は、アプリケーションの修正が必要です。ユーザ定義のア
プリケーションクラスを作成し、isUjiMethodAvailableメソッドをオーバライドしてtrueを返却するようにしてください。アプリケーションクラ
スについては、“3.4 アプリケーションクラス”を参照してください。
HttpServletRequestから取得されるリクエストパラメタの文字エンコーディング変換の有無の違い
送信データの文字エンコーディング変換をApcoordinatorまたはINTERSTAGE WEBCOORDINATORで処理している場合、
Apcoordinator V5.0L10、または、INTERSTAGE WEBCOORDINATORでは、 javax.servlet.http.HttpServletRequestからリクエストパラ
メタを取得すると、Apcoordinator または INTERSTAGE WEBCOORDINATORによって文字エンコーディングの変換が実施済みの文
字列が得られます。
Apcoordinator V5.0L10またはINTERSTAGE WEBCOORDINATORで作成したアプリケーションで以下の処理を行っている場合に
は、アプリケーションを修正して、com.fujitsu.uji.util.Parametersクラスからリクエストパラメタを取得してください。
・ javax.servlet.http.HttpServletRequestインタフェースから直接リクエストパラメタを取得し、かつ
・ 取得した文字列が、ApcoordinatorまたはINTERSTAGE WEBCOORDINATORによって文字エンコーディングの変換が実施済み
であることを想定している場合。
Parametersクラスからは、Apcoordinatorによって文字エンコーディングの変換が行われた文字列が取得されます。以下は、ビジネスク
ラスのメソッドおいて、Parametersクラスからリクエストパラメタ"userName"の値を取得する例です。
- 329 -
import
import
import
import
com.fujitsu.uji.GenericHandler;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.http.HttpDispatchContext;
com.fujitsu.uji.util.Parameters;
public class SampleHandler extends GenericHandler {
public void someMethod(DispatchContext context, BodyBean dataBean) {
Parameters parameters = ((HttpDispatchContext)context).getParameters();
String value = parameters.getSingleValue("userName");
...
}
}
アップロード可能なファイルサイズのデフォルトの上限値の変更
セキュリティ強化のため、アップロード可能なファイルサイズのデフォルトの上限値を16Mバイトに設定しています。 Apcoordinator V5.0L10
および INTERSTAGE WEBCOORDINATORでは、デフォルトではサイズの制限はありません。
Apcoordinator V5.0L10またはINTERSTAGE WEBCOORDINATORで作成したアプリケーションで以下に該当する場合は、アプリケー
ションを修正して、ファイルサイズの上限値を変更する必要があります。
・ アプリケーションクラスでgetMimeTransferSizeLimitメソッドをオーバライドせず、かつ、
・ 16Mバイト以上のファイルがアップロードされることを想定している場合。
修正は、アプリケーションクラスにgetMimeTransferSizeLimitメソッドをオーバーライドして、アップロード可能なファイルサイズの上限値
を返却するようにしてください。上限値の単位はバイトです。以下は、getMimeTransferSizeLimitメソッドの記述例です。
import com.fujitsu.uji.ApplicationProfile;
public class SampleApplication extends ApplicationProfile {
public long getMimeTransferSizeLimit() {
// ファイルサイズの上限値を32Mバイトに指定します。
return 32*1024*1024;
}
}
なお、getMimeTransferSizeLimitメソッドで0を返すことによってサイズの制限を無くすことができますが、セキュリティの観点から上限値
を設定することを推奨します。
UJIタグが生成するHTMLの変更
Apcoordinatorのバージョンアップに伴う機能追加や最適化のために、“UJIタグリファレンス”に記載の仕様の範囲内で、UJIタグが生成する
HTMLパターンが変更されています。変更内容には、HTMLタグの追加・削除、リクエストパラメタの変更が含まれます。 HTML比較に
よる自動テストツールを利用する場合などは、差異となります。
注意
Apcoordinatorを新しいバージョンに置き換えた場合でもアプリケーションが正常に動作するようにするため、“UJIタグリファレンス”に記
載されている場合を除き、UJIタグが生成するHTMLを仮定した処理は作成しないでください。
uji:tableViewタグおよびuji:treeViewタグのアトリビュートの修正
uji:tableViewタグおよびuji:treeViewタグの以下の問題を修正しました。
1. JSPファイル1個の中でuji:tableViewタグまたはuji:treeViewタグを2個以上使用し、2個目以降のタグでアトリビュートの値を省略
した場合にデフォルト値が適用されず、以前実行されたタグのアトリビュートで指定した値が適用される場合があります。
この問題が発生するのは、uji:tableViewタグとuji:treeViewタグの以下のアトリビュートで";"で区切った値を指定し、区切られた値
の一部を省略した場合です。
- columnWidth
- 330 -
- columnInputWidth
- columnInputHeight
- indentIcon
- indentIconUseImage
- header
- headerInsets
- headerBackground
- headerForeground
- headerFontStyle
- headerFontWeight
- headerFontSize
- headerTextDecoration
- headerAlignmentHorizontal
- headerAlignmentVertical
- headerRuleWidth
- headerRuleColor
- headerRuleType
- headerNoWrap
- headerUseImage
- dataInsets
- dataBackground
- dataForeground
- dataFontStyle
- dataFontWeight
- dataFontSize
- dataTextDecoration
- dataAlignmentHorizontal
- dataAlignmentVertical
- dataRuleWidth
- dataRuleColor
- dataRuleType
- dataNoWrap
- dataUseImage
- dataStripeBackground
- dataEmpty
- dataEditable
- dataCellType
- 331 -
2. JSPファイル1個の中でuji:tableViewタグまたはuji:treeViewタグを2個以上使用し、そのタグでmultiRowアトリビュートを使用した
場合に、2個目以降のタグでは以前実行されたタグのmultiRowアトリビュートの値が使用される場合があります。
これらの問題は以下の製品で発生します。本製品では修正済みであるため、以下の製品で問題が発生していたアプリケーションを本
製品に移行するとタグの動作が変わります。
・ Windows版
- Interstage Apcoordinator Web/Standard/Enterprise Edition V5.0L20以前
- Interstage Application Server Standard/Enterprise Edition V6.0L10
- Interstage Application Server Plus V6.0L10A 以前
- Interstage Application Framework Suite Web Edition V6.0L10A 以前
- Interstage Apworks Modelers-J Edition V6.0L10
- Interstage Application Server Plus Developer V6.0L10 以前
・ Solaris版
- Interstage Apcoordinator Web/Standard/Enterprise Edition 5.1 以前
- Interstage Application Server Standard/Enterprise Edition 6.0
- Interstage Application Server Plus 6.0 以前
- Interstage Application Framework Suite Web Edition 6.0
・ Linux版
- Interstage Apcoordinator Web/Standard/Enterprise Edition V5.0L20以前
- Interstage Application Server Standard/Enterprise Edition V6.0L10
- Interstage Application Server Plus V6.0L11 以前
- Interstage Application Framework Suite Web Edition V6.0L11 以前
移行前と同じ動作とするには、以下のようにJSPを修正してください。
・ アトリビュートの値を";"で区切って指定する場合は、区切られた値を省略せずに明示的に記述してください。
・ multiRowアトリビュートについては、以前実行されたタグのmultiRowアトリビュートの値が使用されることを前提とせずに、連結指
定を記述してください。
各アトリビュートの指定方法の詳細は、“UJIタグリファレンス”のuji:tableViewタグ、uji:treeViewタグの解説を参照してください。
web.xmlの記述形式の違い
Servlet仕様バージョン2.4では、web.xmlの記述形式が変更になりました。以前の形式のweb.xmlをServlet仕様バージョン2.4の形式に
移行する場合は、以下のとおり書き換えてください。
・ DOCTYPE宣言を削除します。
・ web-appタグに、以下の例のとおりアトリビュートを追加します。
・ taglibタグをjsp-configタグで囲みます。
以下は書き換えの例です。
修正前
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
- 332 -
<param-name>factory</param-name>
<param-value>sample2.Sample2Factory</param-value>
</context-param>
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>updown.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</web-app>
修正後
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample2.Sample2Factory</param-value>
</context-param>
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>updown.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
なお、Interstage Studioを使用している場合は、プロジェクトエクスプローラからプロジェクトを選択し、コンテキストメニューの[J2EEの
deployment descriptorの更新]を選択することでweb.xmlをServlet仕様バージョン2.4の形式に変換できます。
JDK/JRE5.0以降を使用する場合の例外の違い
JDK/JRE5.0で実施された修正の影響で、JDK/JRE1.4以前を使用していたアプリケーションをJDK/JRE5.0以降に移行した場合、以下
のメソッドが発生する例外が変わる場合があります。
・ com.fujitsu.uji.ext.ServletConnectionクラスのinvokeメソッド
影響をおよぼすJDK/JRE5.0の修正内容は以下のとおりです。
・ JDK/JRE1.4 で は 、 ObjectInputStream.readClassDescriptor メ ソ ッ ド で ClassNotFoundException が 発 生 す る と 、
ObjectInputStream.readObjectのトップレベルの呼び出し元にはStreamCorruptedExceptionとして反映されていました。また、その例
外の原因となる例外は存在しない状態でした。JDK/JRE5.0では、トップレベルの呼び出し元にはInvalidClassExceptionとして反映
されるようになりました。また、その例外の原因となる例外は元のClassNotFoundExceptionとなります。
ServletConnectionクラスのinvokeメソッドは内部でObjectInputStream.readObjectを呼び出しており、ObjectInputStream.readObjectが例
外を発生した場合はその例外をそのまま発生させます。このため、JDK/JRE5.0の修正によりObjectInputStream.readObjectが発生する
- 333 -
例外が変化するケースにおいては、invokeメソッドが発生する例外も同様に変化します。invokeの呼び出し元でStreamCorruptedException
とInvalidClassExceptionを区別して処理している場合、および、原因となる例外を参照している場合には修正が必要となります。この2
つの例外を区別せず、その共通のスーパークラス(java.io.IOExceptionなど)として処理している場合で、かつ、原因となる例外を参照
していない場合には影響はありません。
コンテントを持たないuji:caseタグの動作の違い
コンテントを持たないuji:caseタグを使用しているアプリケーションを Interstageで動作させる場合、V8.0以前のInterstageのサーブレット
実行環境で動作させた場合と比べて、以下のとおり動作が変わる場合があります。
1. V8.0以前のInterstageのサーブレット実行環境で動作させた場合
コンテントを持つuji:caseタグがある場合、その内容がコンテントを持たないuji:caseタグによって出力されることがあります。
2. V9.0以降のInterstageのサーブレット実行環境で動作させた場合
コンテントを持たないuji:caseタグは何も出力しません。
上記1の動作を前提としているアプリケーションをInterstageのV9.0以降のサーブレット実行環境に移行する場合は、コンテントを持たない
uji:caseタグを修正し、uji:caseタグで出力したい内容を明示的に記述してください。
なお、上記1の動作はApcoordinatorの障害であり、初期化パラメタuji.compatible.clearbodyにtrueを指定することで、サーブレット実行
環境に依存せずに上記2の動作となります。“13.3 初期化パラメタ”の詳細は初期化パラメタを参照してください。
レンダラの動作の違い
画面部品タグの性能向上のため、INTERSTAGE WEBCOORDINATORとそれ以外の製品でレンダラの評価タイミングが異なります。
該当するのは、以下のいずれかの組み合わせでUJIタグを使用している場合です。
1-1. uji:tableタグを指定し、かつ、
1-2. uji:tableRendererタグのコンテントでUJIタグを使用し、かつ
1-3. コンテントで使用しているUJIタグでbeanアトリビュートを指定している場合
2-1. uji:treeタグを指定し、かつ、
2-2. uji:treeRendererタグのコンテントでUJIタグを使用し、かつ
2-3. コンテントで使用しているUJIタグでbeanアトリビュートを指定している場合
3-1. uji:listタグを指定し、かつ、
3-2. uji:listRendererタグのコンテントでUJIタグを使用し、かつ
3-3. コンテントで使用しているUJIタグでbeanアトリビュートを指定している場合
この場合、uji:tableRendererタグ、uji:treeRendererタグ、もしくはuji:listRendererタグのコンテントにあるUJIタグの評価タイミングに違いが
あります。 INTERSTAGE WEBCOORDINATORの場合はレンダラの条件が評価され、条件が成立した場合にレンダラのコンテントの
UJIタグが評価されます。
一方、Apcoordinatorの場合はレンダラのコンテントにUJIタグが出現した時点で評価されます。
上記条件に該当する場合、アプリケーションを次のいずれかの方法で修正してください。
・ 条件が成立しない場合でも正常動作するようにデータBeanを設定しておく。
・ UJIタグがコンテントを繰り返し表示する回数に依存した処理を行なわない。
・ UJIタグがコンテントを繰り返し表示する回数に依存した処理を行なう場合は、beanアトリビュートを削除してカレントオブジェクトで
動作可能となるように修正する。
初期化パラメタuji.servlet.defaultErrorPageを使用している場合の修正
初期化パラメタuji.servlet.defaultErrorPageは推奨されません。以下の製品が提供するアプリケーションサーバを利用する場合には、旧
バージョンのサーブレット実行環境(V8.0互換モードのIJServer)でのみ利用することができます。
・ Interstage Business Application Server
・ Interstage Application Server
UjiServletを使用する場合において、例外発生時に表示するJSPを指定するには、初期化パラメタuji.servlet.errorPageを使用してくだ
さい。uji.servlet.errorPageの詳細は“13.3 初期化パラメタ”を参照してください。
- 334 -
uji.servlet.defaultErrorPageを使用していたアプリケーションを、uji.servlet.errorPageを使用するように変更するには、アプリケーションを
以下のとおり書き換えてください。
・ web.xmlの書き換え
「uji.servlet.defaultErrorPage」を「uji.servlet.errorPage」に書き換えます。
・ uji.servlet.defaultErrorPageで指定しているJSPの書き換え
1. 以下の記述を削除します。pageディレクティブ(<%@ page ~ %>)に複数のアトリビュートを指定している場合は、
「isErrorPage="true"」のみ削除します。
<%@ page isErrorPage="true" %>
2. 以下の記述を、ディレクティブ(<%@ ~ %>)の直後に追加します。
<%! Throwable exception; %>
<% exception = (Throwable)request.getAttribute(com.fujitsu.uji.http.UjiServlet.EXCEPTIONKEY); %>
注意
・ web.xmlのみを書き換え、uji.servlet.defaultErrorPageで指定しているJSPを書き換えなかった場合、JSPの実行時に変数exception
の値がnullになります。JSPで変数exceptionの値がnullとなることを想定していない場合は、JSPの実行時にNullPointerExceptionが
発生します。
・ 上記1の対処を実施し、上記2の対処を実施しなかった場合は、uji.servlet.defaultErrorPageで指定しているJSPのコンパイル時にエ
ラーとなります。
uif:iformタグを使用しているアプリケーションの運用
uif:iformタグは推奨されません。INTERSTAGE WEBCOORDINATOR V4.0L10との互換のために残されています。電子フォームを
表示させるには、JSPを使用せず、FormServletクラスを継承したサーブレットを作成します。詳細は“第5部 電子フォームアプリケーショ
ンの開発”を参照してください。
uif:iformタグの使用に必要な以下のファイルは標準ではインストールされません。
・ ujiiform.jar
・ iform.tld
上記のファイルはFormcoordinator連携互換機能を別途インストールすることにより提供されます。uif:iformタグを使用したアプリケー
ションを運用する場合はFormcoordinator連携互換機能をインストールしてください。インストール方法はインストールガイドに記載のフ
レームワークに関する注意事項を参照してください。
なお、Interstage Studioでは、上記のファイルは提供されません。
autoEscape機能によるフォーカス移動の動作の違い
autoEscape機能によるフォーカスの移動が、同一フォーム内に閉じて行われるように正しく修正しています。以下の条件の時、autoEscape
機能によるフォーカスの移動順が修正となります。
1. 同一のページ内に複数の uji:formタグを使用し、かつ、
2. 各 uji:formタグのコンテントとして、autoEscape機能を有効とした、以下のいずれかのフィールドタグを使用している場合。
- uji:fieldString
- uji:fieldLong
- uji:fieldDouble
- uji:fieldBigInteger
- uji:fieldBigDecimal
- uji:fieldDate
- 335 -
autoEscape機能によるフォーカスの移動順について、以下に示すSample.jspを例に説明します。 uji:formタグ、uji:fieldStringのアトリ
ビュートの記述は省略しています。
・ Sample.jsp
・・・
<%-- フォーム1 ここから --%>
<uji:form name="myform1" ・・・>
<uji:fieldString ・・・/>
<%-- 入力フィールド 1_1 --%>
<uji:fieldString ・・・/>
<%-- 入力フィールド 1_2 --%>
</uji:form>
<%-- フォーム1 ここまで --%>
<%-- フォーム2 ここから --%>
<uji:form name="myform2" ・・・>
<uji:fieldString ・・・/>
<%-- 入力フィールド 2_1 --%>
<uji:fieldString ・・・/>
<%-- 入力フィールド 2_2 --%>
</uji:form>
<%-- フォーム2 ここまで --%>
・・・
V9.0以前のフォーカスの移動順は、以下のとおりです。
フォーカスの移動順
フォーム1
入力フィールド 1_1と入力フィールド 1_2の間で移動します。
フォーム2
入力フィールド 2_1から入力フィールド 2_2へ移動後、入力フィールド 1_1へ移動します。
入力フィールド 1_1へ移動後は、入力フィールド 1_1と入力フィールド 1_2の間で移動します。
V9.1以降のフォーカスの移動順は、以下のとおりです。
フォーカスの移動順
フォーム1
入力フィールド 1_1と入力フィールド 1_2の間で移動します。
フォーム2
入力フィールド 2_1と入力フィールド 2_2の間で移動します。
C.3 SOAPサーバアプリケーション
以前のバージョンのApcoordinatorで動作するアプリケーションを利用する場合は、製品に同梱しているujisoap.jarを使用してください。
ujisoap.jarのデフォルトのインストール先は下記となります。
Windows
C:¥Interstage¥APC¥lib¥
Solaris
/opt/FJSVbcco/lib/
Linux
以下の製品が提供するアプリケーションサーバを利用する場合には、SOAPサービス(Application Serverの互換機能)実行環境でのみ
利用することができます。J2EEのWebサービス実行環境では利用できません。
・ Interstage Business Application Server
・ Interstage Application Server
C.4 Interstage Studioでのウィザードの利用
Interstage Studioのウィザード機能では、既存のソースに項目、メソッドを追加する機能を提供しています。 INTERSTAGE APWORKS
V3.0L20で作成したデータBean、ビジネスクラスのソースに項目、メソッドを追加する場合は、以下の修正が必要です。
・ データBean
下の例のようにソースを修正します。追加分を赤字で表示しています。
- 336 -
public class BodyBean extends DataBean
{
//{{UJIWIZ_GENERATE(DATADEF)
//@@UJI-Wizard Information(Bean)
//@@Item1,item,String
//}}UJIWIZ_GENERATE
protected String item;
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
//{{UJIWIZ_GENERATE(DATA)
//}}UJIWIZ_GENERATE
//{{UJIWIZ_GENERATE(GETSET)
//}}UJIWIZ_GENERATE
}
・ ビジネスクラス
下の例のようにソースを修正します。追加分を赤字で表示しています。
public class SampleHandler extends GenericHandler
{
//{{UJIWIZ_GENERATE(METHODDEF)
//@@UJI-Wizard Information(Class)
//}}UJIWIZ_GENERATE
public SampleHandler() {
}
public boolean init() {
return true;
}
public void next(DispatchContext context, BodyBean dataBean) {
}
...
//{{UJIWIZ_GENERATE(METHOD)
//}}UJIWIZ_GENERATE
}
- 337 -
付録D JIS X 0213:2004(通称JIS2004)規格について
Windows Vistaなど一部のOSで文字コード規格JIS2004に対応しています。JIS2004で規格された4バイトで表現される文字(補助文字)
の利用に関する注意事項を説明します。
文字数をチェックする機能
UJIタグで入力文字の文字数をチェックする場合、補助文字の数え方を初期化パラメタuji.taglib.awareOfSupplementaryCharで設定で
きます。詳細は“13.3 初期化パラメタ”を参照してください。
XMLデータ仕様記述のビルトインメソッドstringLength
XMLデータ仕様記述のビルトインメソッドstringLengthでの補助文字の数え方を初期化パラメタuji.espec.awareOfSupplementaryCharで
設定できます。詳細は“13.3 初期化パラメタ”を参照してください。
XMLデータ仕様記述コンパイラの使用
XMLデータ仕様記述コンパイラを利用する場合には、XMLデータ仕様記述の仕様名、セクション名などの名標に、補助文字は使用
できません。
正規表現の使用
以下の機能では正規表現を使用します。
・ XMLデータ仕様記述のビルトインメソッドpattern
・ com.fujitsu.uji.log.writer.FilterWriterクラス
・ ログ定義ファイルのparamタグでnameアトリビュートにfilterを指定し、フィルタ文字列を設定する機能
・ 以下のUJIタグのenableCharsアトリビュート
uji:fieldString、uji:fieldLong、uji:fieldDouble、uji:fieldBigInteger、uji:fieldBigDecimal、uji:fieldDate、uji:fieldTextArea
正規表現を使用するこれらの機能については以下の注意事項があります。
・ 正規表現中に補助文字を含めることはできません。
・ 文字列を正規表現とマッチさせる際、文字列中に補助文字が含まれている場合は、その補助文字は1文字としては扱われず2文
字として扱われます。
- 338 -
付録E Strutsとの連携
E.1 概要
Strutsとは、Apache Jakarta Projectによって開発されているオープンソースのWebアプリケーションフレームワークです。
ここでは、既存のStrutsアプリケーション上でApcoordinatorを利用する方法、およびStrutsアプリケーションとApcoordinatorアプリケー
ションを組み合わせて利用する方法について説明します。
Strutsアプリケーション上では、UJIタグとリモート共通インタフェースを利用することができます。
E.2 UJIタグを使ったプログラミング
StrutsアプリケーションでUJIタグを利用することで、画面項目の色や大きさを動的に変更することや、選択項目や表などの繰り返しの
ある画面項目の作成を容易に行うことができます。下記の例では、uji:useBeanでデータBeanの利用を宣言し、html:formタグの中で
uji:tableViewを使用しています。
<uji:useBean id="myDataBean" cls="mypkg.MyDataBean" scope="request" request="true" />
<html:form name="myForm" action="myAction" type="mypkg.MyFormBean">
<input type="hidden" name="uji.id" value="myDataBean" />
<uji:tableView bean="myDataBean" property="table"
borderWidth="1" ruleWidth="1" dataEditable=";;true" />
<html:submit value="決定" />
</html:form>
実行すると次のようになります。「ハンバーガー」等の表で使用されている値はデータBeanによって設定されているため、上記のJSPに
は現れていません。
- 339 -
このようにStrutsアプリケーションでUJIタグを利用する場合は、次の手順でそれぞれのファイルを編集してください。
1. データBeanの設定
アクションクラスでデータBeanをセションスコープかリクエストスコープに設定します。
2. JSPの編集
JSPにUJIタグを記述します。このとき、使用する場所によって利用できるUJIタグが異なります。
uji:form内で利用する場合
uji:formのコンテントとして記述することができるすべてのUJIタグが利用できます。
html:form内で利用する場合
html:form直下のコンテントとしてコンポーネントタグが利用できます。
フォーム外で利用する場合
基本タグの一部を除いてフォーム外に記述できるすべてのUJIタグが利用できます。
3. データの取得
アクションクラスでフォームに入力されたデータをデータBeanとして取得します。
その他 :利用可能なタグの一覧
Strutsアプリケーションで利用可能なタグの一覧です。
E.2.1
データBeanの設定
画面で使用するデータBeanはStrutsのアクションクラスで設定します。ここではuji:tableViewを使用するため、次のようなデータBeanを
作成します。
package mypkg;
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.*;
public class MyDataBean extends DataBean
{
protected TableView table = new TableView();
public MyDataBean() {
table.addRow(new Object[]{"ハンバーガー","400円","2個"});
table.addRow(new Object[]{"ホットドック","300円","2個"});
table.addRow(new Object[]{"ポテト","300円","3個"});
table.addRow(new Object[]{"コーラ","400円","4個"});
}
public TableView getTable() {
return table;
}
}
- 340 -
アクションクラスからデータBeanを設定する場合は、リクエストかセションのいずれかのスコープのオブジェクトとしてセットします。すな
わち、javax.servlet.http.HttpServletRequest、javax.servlet.http.HttpSessionのいずれかのインタフェースのsetAttributeメソッドを使用しま
す。
次の例では、リクエストにデータBeanを設定しています。
import
import
import
import
import
...
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
public class MyAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
MyDataBean dataBean = new MyDataBean();
request.setAttribute("myDateBean", dataBean);
...
}
}
E.2.2
JSPの編集
UJIタグを利用する場合は、まずWebアプリケーション環境定義ファイル (web.xml) を編集します。
次の例のようにUJIタグ用のタグライブラリディスクリプタファイル (ujiall.tld) の場所をtaglib要素で指定してください。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
...
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
...
</web-app>
JSPを編集します。まず、"uji:"という接頭辞でUJIタグを使うことをtaglibディレクティブで宣言します。
次に、データBeanのプロパティを参照するためにuji:useBeanタグを記述します。このとき必ずscopeアトリビュートと requestアトリビュート
を指定してください。
scopeアトリビュートにはデータBeanを設定したスコープを、requestアトリビュートには"true"を指定します。
<%@ taglib uri="uji-taglib" prefix="uji" %>
...
<uji:useBean id="myDataBean" cls="mypkg.MyDataBean" scope="request" request="true" />
以上でUJIタグを利用する準備が整いました。 Strutsアプリケーションで利用できるUJIタグは、利用する場所によって異なります。以
下、それぞれの場合について説明します。
- 341 -
uji:form内で利用する場合
uji:form内でUJIタグを利用する場合は、uji:formのコンテントとして記述できるすべてのUJIタグを利用することができます。ただし、Struts
タグを利用することはできません。またuji:formのbeanIdアトリビュートにはuji:useBeanのidアトリビュートで指定した値を使用してくださ
い。次に使用例を示します。
<uji:useBean id="myDataBean" cls="mypkg.MyDataBean" scope="request" request="true" />
<uji:form name="myform" beanId="myDataBean" action="MyAction.do" >
<uji:tableView bean="myDataBean" property="table"
borderWidth="1" ruleWidth="1" dataEditable=";;true" />
<input name="submit" type="submit" value="submit">
</uji:form>
注意
uji:formタグのactionアトリビュートにはサーブレットのURLを記述してください。
struts-config.xmlのactionタグに指定した名前ではありません。
html:formを利用する場合
html:form内でUJIタグを利用する場合は、html:form直下のコンテントとしてコンポーネントタグを利用することができます。
ただし、“UJIタグリファレンス”で、uji:formタグのコンテントで使用した場合のみ有効と記載されているアトリビュートは使用できません。
このようなアトリビュートを利用する場合はuji:formを使用してください。
また、値を更新するためにHTMLのINPUTタグで隠しパラメタ"uji.id"を送信する必要があります。
"uji.id"に指定する値はuji:useBeanのidアトリビュートで指定した値を使用してください。
次に使用例を示します。
<uji:useBean id="myDataBean" cls="mypkg.MyDataBean" scope="request" request="true" />
<html:form name="myForm" action="myAction" type="mypkg.MyFormBean">
<input type="hidden" name="uji.id" value="myDataBean" />
<uji:tableView bean="myDataBean" property="table"
borderWidth="1" ruleWidth="1" dataEditable=";;true" />
<html:submit value="決定" />
</html:form>
注意
html:form内でuji:anchorタグを利用する場合は、フォーム指定モードで使用してください。
フォーム外で利用する場合
uji:formやhtml:formなどのフォームの外でUJIタグを利用する場合は、フォーム外で利用可能な次のUJIタグを使用することができま
す。
・ uji:include
・ uji:includedBody
・ uji:useBean
・ uji:getProperty
・ uji:resourceText
・ 画面部品タグ
・ コンポーネントタグ
- 342 -
ただし、html:htmlタグを除いてStrutsタグとUJIタグを入れ子にすることはできません。
注意
uji:includeを使用する場合の注意事項
uji:includeを使用する場合は次の点に注意してください。
・ ページマップの記述
uji:includeを使用してインクルードするJSPに合わせてページマップを作成する必要があります。
次の例では、HeaderBeanに対してheader.jspを対応させています。
mypkg.HeaderBean;=header.jsp
・ uji:useBeanの記述
uji:includeを使用するJSPにuji:useBeanを記述する必要があります。
このとき、uji:useBeanでscopeアトリビュートとrequestアトリビュートを指定する必要があります。 scopeアトリビュートにはデータBeanを
設定したスコープを、requestアトリビュートには"true"を指定してください。
また、uji:useBeanのidアトリビュートとuji:includeのpaneアトリビュートにはデータBeanを設定した際のキーを指定してください。
...
<uji:useBean id="header" cls="mypkg.HeaderBean" scope="session" request="true" />
<uji:include pane="header" />
...
E.2.3
データBeanの取得
送信されたフォームデータをデータBeanとしてアクションクラスで利用するためには、com.fujitsu.uji.http.HttpBeanUpdaterを使用しま
す。
1. HttpBeanUpdaterのインスタンスを生成します。
2. getRequestBean()メソッドを呼び出し、データBeanを取得します。
次に例を示します。
import
import
import
import
import
import
import
...
javax.servlet.ServletContext;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
com.fujitsu.uji.http.HttpBeanUpdater;
public class MyAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
ServletContext context = request.getSession().getServletContext();
ClassLoader loader = this.getClass().getClassLoader();
HttpBeanUpdater beanUpdater = new HttpBeanUpdater(context, request, loader);
MyDataBean dataBean = (MyDataBean)beanUpdater.getRequestBean();
...
}
}
- 343 -
E.2.4
利用可能なタグの一覧
Strutsアプリケーションで利用可能なUJIタグの一覧表を次に示します。
タグ名
機能
uji:form内 html:form内 フォーム
外
uji:action
HTMLのイベントに対して実行するJavaScriptの記述
-
-
-
uji:anchor
アンカー
O
O(*)(**)
O
uji:borderLayout
上下左右に領域を設定するレイアウト
O
O(*)
O
uji:borderLayoutRenderer
uji:borderLayoutの各領域の内容の記述
O
O(*)
O
uji:buttonList
選択肢をボタン形式で表示
O
O(*)
-
uji:case
条件によって異なる画面を展開する場合の展開形を
指定
O
-
O
uji:checkBox
チェックボックス
O
O(*)
-
uji:children
画面部品タグの展開形式で下位の構造を展開
O
-
O
uji:colorMap
コンポーネントタグで使用する色名の定義
O
O(*)
O
uji:comboBox
コンボボックス形式の選択項目
O
O(*)
-
uji:composite
複合Bean形式のデータBeanの操作
O
-
O
uji:compositeName
uji:compositeRendererタグ中での入力項目名生成
O
-
O
uji:compositeRenderer
複合Bean形式のデータBeanを使用する場合の展開形
を指定
O
-
O
uji:controlState
セション管理
-
-
-
uji:dispatch
ビジネスクラスの呼び出し
-
-
-
uji:fieldBigDecimal
十進小数点数入力フィールド
O
O(*)
-
uji:fieldBigInteger
十進整数入力フィールド
O
O(*)
-
uji:fieldDate
日付・時刻入力フィールド
O
O(*)
-
uji:fieldDouble
実数値入力フィールド
O
O(*)
-
uji:fieldLong
整数値入力フィールド
O
O(*)
-
uji:fieldString
文字列入力フィールド
O
O(*)
-
uji:fieldTextArea
複数行テキスト入力フィールド
O
O(*)
-
uji:form
フォーム
-
-
O
uji:frame
画面をフレームに分割
-
-
-
uji:getProperty
データBeanのプロパティの値を画面に出力
O
-
O
uji:gridLayout
項目をグリッドに揃えるレイアウト
O
O(*)
O
uji:gridLayoutRenderer
uji:gridLayoutの各領域の内容の記述
O
O(*)
O
uji:include
入出力ページの取り込み
O
-
O
uji:includedBody
uji:includeタグと連携した入出力ページの出力
-
-
O
uji:input
クライアントスクリプトの利用(INPUTタグ相当)
-
-
-
uji:label
ラベル
O
O(*)
O
uji:list
リスト形式のデータを展開
O
-
O
uji:listBox
リストボックス形式の選択項目
O
O(*)
-
uji:listRenderer
リスト形式のデータを展開する場合の展開形を指定
O
-
O
- 344 -
タグ名
機能
uji:form内 html:form内 フォーム
外
uji:name
カレントオブジェクトを更新するための入力項目名を生
成
O
-
O
uji:pushButton
プッシュボタン
O
O(*)
O
uji:radioButton
ラジオボタン
O
O(*)
-
uji:recordView
レコード形式の入力項目の組
O
O(*)
-
uji:resourceText
リソースファイルに定義した文字列の出力
O
-
O
uji:saveSession
セションに関連付けられているデータのセション再登
録
O
-
O
uji:select
クライアントスクリプトの利用(SELECTタグ相当)
-
-
-
uji:switch
条件によって異なる画面を展開
O
-
O
uji:tabbedLayout
タブで切り替え可能なレイアウト
O
O(*)
O
uji:tabbedLayoutRenderer
uji:tabbedLayoutRendererの各領域の内容の記述
O
O(*)
O
uji:table
データを表形式に展開
O
-
O
uji:tableRenderer
データを表形式に展開する場合の展開形を指定
O
-
O
uji:tableView
データを表形式で表示
O
O(*)
-
uji:textarea
クライアントスクリプトの利用(TEXTAREAタグ相当)
-
-
-
uji:tree
ツリー構造のデータを展開
O
-
O
uji:treeRenderer
ツリー構造のデータを展開する場合の展開形を指定
O
-
O
uji:treeView
ツリー付きの表
O
O(*)
-
uji:useBean
データBeanに対する名前付け
-
-
O
uji:validate
HTMLのイベントが発生した時の項目チェックと
JavaScriptの実行
-
-
-
uji:value
カレントオブジェクトの値
O
-
O
uji:windowControl
ウィンドウの制御
-
-
-
(*)“UJIタグリファレンス”で、uji:formまたはHTMLのFORMタグに関する制約があるものはそれに従ってください。
(**)フォーム指定モードで使用してください。
E.3 リモート共通インタフェースの利用
リモート共通インタフェースを利用することで、Apcoordinatorを利用して開発したEJBや、一般的なEJBを同じインタフェースで呼び出
すことが可能です。詳細は“第7章 リモート共通インタフェース”を参照してください。
Strutsアプリケーションでリモート共通インタフェースを利用するためには、com.fujitsu.uji.ext.InitialCallFactoryクラスを利用してCallFactory
オブジェクトを取得してください。
import
import
import
import
import
import
import
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
com.fujitsu.uji.ext.CallFactory;
com.fujitsu.uji.ext.InitialCallFactory;
public class MyAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
- 345 -
HttpServletResponse response) throws Exception {
...
try{
CallFactory factory = (CallFactory)InitialCallFactory.createFactory(servlet);
Call call = factory.createCall("myejb");
ResponseBean responseBean = (ResponseBean)call.invoke(dataBean, "verb");
} catch(Throwable e){
...
}
...
}
}
EJBのセション情報の同期機能を利用する場合は、あらかじめ同期するオブジェクトをセションスコープにセットしておく必要がありま
す 。 こ の と き 、 オ ブ ジ ェ ク ト は java.io.Serializable イ ン タ フ ェ ー ス を 実 装 し た も の と し 、 オ ブ ジ ェ ク ト に 関 連 付 け る 名 前 に は
com.fujitsu.uji.SessionProfile.SYNCDATAHOLDERKEYを使用してください。
セションスコープにセットするクラスの例を次に示します。この例ではセションに保持する情報としてユーザIDを使用しています。
public class SynchronizedData implements java.io.Serializable {
protected String userId = null;
public String getUserId(){
return userId;
}
public void setUserId(String userId){
this.userId = userId;
}
}
セション情報の同期機能を利用した場合のリモート共通インタフェースの利用例を次に示します。
CallFactoryオブジェクトの生成にはInitialCallFactory#createFactory(Servlet, HttpSession)を使用してください。
import
import
import
import
import
import
import
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
com.fujitsu.uji.ext.CallFactory;
com.fujitsu.uji.ext.InitialCallFactory;
public class MyAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
...
SynchronizedData syncData = new SynchronizedData();
HttpSession session = request.getSession();
session.setAttribute(SessionProfile.SYNCDATAHOLDERKEY, syncData);
try{
CallFactory factory = (CallFactory)InitialCallFactory.createFactory(servlet, session);
Call call = factory.createCall("myejb");
ResponseBean responseBean = (ResponseBean)call.invoke(dataBean, "verb");
} catch(Throwable e){
...
}
...
}
}
- 346 -
E.4 Apcoordinatorアプリケーションとの共存
StrutsアプリケーションとApcoordinatorアプリケーションを共存させることで、それぞれの業務ロジックを修正せずに組み合わせることが
可能です。例えば、ログイン処理のような汎用性のあるアプリケーションをコンポーネントとして用意しておき、Apcoordinatorアプリケー
ションやStrutsアプリケーションと共存させることで開発期間の短縮や品質の向上を図ることができます。このとき、2つのアプリケーショ
ン間でセションスコープのオブジェクトが共有されます。
共通資産の統合
2つのWebアプリケーションを組み合わせる場合、Webアプリケーション環境定義ファイル(web.xml)を統合する必要があります。そのた
め、異なる利用方法で同一名の初期化パラメタやサーブレットを使用している場合は、あらかじめ名前を修正して一意名となるようにし
てください。次はApcoordinatorアプリケーションとStrutsアプリケーションのWebアプリケーション環境定義ファイルを統合した例です。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<jsp-config>
<!-- Struts Tag Library Descriptors -->
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<!-- UJI Tag Library Descriptor -->
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
StrutsアプリケーションからApcoordinatorアプリケーションへの遷移
StrutsアプリケーションからApcoordinatorアプリケーションに遷移する場合は、Apcoordinatorの制御ページに遷移するようにフォームを
作成してください。下記の例はデータBeanやコマンドを送信しない例です。
- 347 -
<uji:form name="myForm" action="main.jsp" >
<input type="submit" value="送信" >
</uji:form>
次はデータBeanとコマンドを送信する例です。ここではuji:formタグのverbsアトリビュートと、beanClsアトリビュートを使用しています。
<uji:form name="myForm" action="main.jsp" verbs="myverb" beanCls="mypkg.MyDataBean" >
<input type="submit" value="送信" >
</uji:form>
ApcoordinatorアプリケーションからStrutsアプリケーションへの遷移
ApcoordinatorアプリケーションからStrutsアプリケーションに遷移する場合は、JSPに遷移する場合とロジック(サーブレット)に遷移する
場合の2通りがあります。
JSPに遷移する場合は、フォームのアクションに遷移先のJSPを指定してください。
<uji:form name="myForm" action="index.jsp">
<input type="submit" value="送信">
</uji:form>
ロジックに遷移する場合は、フォームのアクションにサーブレットのURLを指定してください。
<uji:form name="myForm" action="index.do">
<input type="submit" value="送信">
</uji:form>
- 348 -
付録F Tips
本付録では、Apcoordinatorで開発する際の役立つ情報について説明します。
F.1
Webアプリケーションの画面
F.1.1
UJIタグを使用したい
UJIタグは、Apcoordinatorが提供するJSP用の拡張タグです。UJIタグを使用するのに必要な設定について説明します。
JSPファイルの設定
"uji:"という接頭辞でUJIタグを使うことをtaglibディレクティブで宣言します。JSPファイルに以下の行を記述してください。この行は、UJI
タグが出現する位置より前に記述する必要があります。
<%@ taglib uri="uji-taglib" prefix="uji" %>
・ 制御ページとして使用するJSPファイルの例
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="ErrorPage.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<TITLE>TEST</TITLE>
</HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="body" />
</BODY>
</HTML>
Webアプリケーション環境定義ファイル(web.xml)の設定
UJIタグ用のタグライブラリディスクリプタファイル (ujiall.tld) の場所をtaglib要素で指定します。タグライブラリディスクリプタとは、JSP拡
張タグの名前やアトリビュートなどを記述したファイルです。ujiall.tldはApcoordinatorが提供するファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample2.Sample2Factory</param-value>
</context-param>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
この例は、ujiall.tldをWEB-INFディレクトリの下に配置した場合の記述です。taglib-locationタグで指定した"/WEB-INF/ujiall.tld"がファ
イル名です。ファイル名はWebアプリケーションを配置したディレクトリからの相対パスで指定します。
- 349 -
注意
Webアプリケーション環境定義ファイルのweb-appタグのコンテントには記述順序があります。以下のタグはこの順序で記述してくださ
い。代表的なものだけを示します。
・ context-param
・ servlet
・ servlet-mapping
・ taglib
・ ejb-ref
クラスパスの設定
Webアプリケーションからuji.jarが参照できるようにクラスパスを設定します。設定方法はアプリケーションサーバにより異なります。お使
いのアプリケーションサーバの説明書を参照してください。Interstageの場合は、Interstage管理コンソールを使用してワークユニットの
環境設定としてクラスパスを設定します。
アプリケーションで使用する機能によっては、さらにJARファイルの追加が必要な場合があります。詳細は、“F.7.1 アプリケーションで必要な
ApcoordinatorのJARファイルを知りたい”を参照してください。
関連項目
・ Apcoordinatorインストールフォルダにあるタグライブラリディスクリプタをコピーせずに直接使用したい
・ UJIタグを使ったプログラミング
・ Webアプリケーションの実行環境の設定
・ UJIタグリファレンス
F.1.2
フォームを作成したい
フォームを作成するには、入出力ページでuji:formタグを使用します。 フォーム内の入力項目は、HTMLタグやUJIタグで作成します。
フォームが送信されると、入力項目に入力されたデータはデータBeanのプロパティに代入されます。フォームとデータBeanの対応関係は
uji:formタグのアトリビュートで指定します。
ここでは、まずuji:formでフォームを作成する場合の基本的な方法について説明したあと、フォームとデータBeanの対応関係の指定方
法を以下の2通りに分けて説明します。
・ データBeanインスタンスを新しく作成して入力データを格納する
・ 前回のリクエストで使用したデータBeanに入力データを格納する
uji:formタグによるフォームの基本的な作成方法
uji:formタグで囲った範囲がフォームになります。uji:formタグのコンテントにHTMLタグやUJIタグで入力項目や送信ボタンを作成しま
す。
<uji:form name="order" method="post" verbs="ok,cancel" ...>
商品コード: <INPUT NAME="code"><BR>
- 350 -
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<%--(1)--%>
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル"> <%--(2)--%>
</uji:form>
uji:formタグのnameアトリビュートでフォーム名を指定します。同じ画面にフォームを複数作成する場合は、名前が一意になるようにし
てください。verbsアトリビュートには、フォーム内のボタンで使用されるコマンドをカンマで区切って指定します。HTMLのINPUTタグで
送信ボタンを作成した場合は、NAMEアトリビュートの値がコマンドとして使用されます。コマンドは、リクエストが送信されたときに実行
させたい処理を指定する情報です。上記例では、(1)、(2)の行でそれぞれコマンドokとcancelを使用しているため、verbsアトリビュート
に"ok,cancel"と指定します。
入力項目をUJIタグで作成する方法については、“F.1.3 入力項目を作成したい”を参照してください。
データBeanインスタンスを新しく作成して入力データを格納する
フォームが送信されたときに、データBeanのインスタンスを新しく作成して、そのインスタンスに入力データを格納することができます。
この場合、uji:formタグのbeanClsアトリビュートにデータBeanのクラス名を指定してください。クラス名はパッケージ名を含めて指定しま
す。
<uji:form name="order" method="post" verbs="ok,cancel" beanCls="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</uji:form>
フォームが送信されると、my.pkg.MyDataBeanクラスのインスタンスが新規に作成され、そのcode, countプロパティにそれぞれ商品コー
ドと個数が代入されます。
前回のリクエストで使用したデータBeanに入力データを格納する
前回のリクエストにおいて画面の表示に使用したデータBeanへ、入力データを格納することができます。この場合、以下を指定してく
ださい。
・ uji:formタグのbeanIdアトリビュートにデータBeanの名前を指定してください。データBeanの名前とは、DispatchContextクラスの
setResponseBeanメソッドでデータBeanに割り当てた名前です。
・ フォームを作成した入出力ページにuji:useBeanタグを記述し、データの格納に使うデータBeanが次回のリクエストまで保存される
ように指定してください。具体的にはアトリビュートに以下を指定します。
アトリビュート
指定内容
id
データBeanの名前
cls
データBeanのクラス名(パッケージ名含む)
request
"true"
request="true"を指定することにより、画面表示時に使用したデータBeanが、次回リクエストを受信するときまで保存されます。
・ setResponseBeanの実行の例
public void someMethod(DispatchContext context, MyDataBean dataBean) {
....
context.setResponseBean("body",dataBean);
}
この例では、名前はbodyです。次の記述例のようにuji:formでbeanId="body"と指定すると、入力項目の値はdataBean変数で表さ
れるデータBeanに格納されます。
・ "body"データBeanに入力データを格納する場合のフォームの例
<uji:useBean id="body" cls="my.pkg.MyDataBean" request="true" />
...
- 351 -
<uji:form name="order" method="post" verbs="ok,cancel" beanId="body">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</uji:form>
beanId="body"を指定することにより、フォームが送信されると、"body"という名前が割り当てられたデータBeanのcode, countプロパ
ティにそれぞれ商品コードと個数が代入されます。
セションがタイムアウトしたあとでフォームが送信された場合、保存してあったデータBeanがタイムアウトによって失われるため、フォー
ムに入力されたデータをデータBeanに格納できず、ビジネスクラスが呼び出されません。タイムアウト後のリクエストでもビジネスクラス
が呼び出されるようにするには、uji:formタグにbeanClsアトリビュートを追加し、データBeanのクラス名を指定します。
<uji:useBean id="body" cls="my.pkg.MyDataBean" request="true" />
...
<uji:form name="order" method="post" verbs="ok,cancel" beanId="body" beanCls="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</uji:form>
タイムアウト後にリクエストが送信されると、my.pkg.MyDataBeanのインスタンスが新規に作成され、そこに入力データが格納されます。
HTMLのFORMタグでフォームを作成する
HTMLのFORMタグでフォームを作成することもできます。ただし、以下の機能を使用する場合はuji:formタグを使う必要があります。
・ JavaScriptを生成する以下の機能
- uji:action, uji:validateタグ
- コンポーネントタグが提供する入力値のチェック、自動脱出などの機能 (具体的にどの機能でuji:formが必要になるかは“UJI
タグリファレンス”を参照してください。)
・ ウィンドウ制御機能、フレーム制御機能
HTMLのFORMタグでフォームを作成する方法は、verbs, beanId, beanClsアトリビュートの指定を除いてuji:formタグの場合と同じです。
uji:formの場合にverbs, beanId, beanClsアトリビュートで指定した内容は、FORMタグの場合はINPUTタグで次のように記述します。
uji:formタグでの指定
INPUTタグでの記述方法
verbs="xxx,yyy"
<INPUT TYPE="HIDDEN" NAME="uji.verbs"
VALUE="xxx,yyy">
beanId="xxx"
<INPUT TYPE="HIDDEN" NAME="uji.id" VALUE="xxx">
beanCls="xxx"
<INPUT TYPE="HIDDEN" NAME="uji.bean" VALUE="xxx">
・ FORMタグを使ったフォームの記述例
<FORM METHOD="POST">
<INPUT type="HIDDEN" name="uji.verbs" value="ok,cancel">
<INPUT type="HIDDEN" name="uji.id" value="body">
<INPUT type="HIDDEN" name="uji.bean" value="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</FORM>
- 352 -
関連項目
・ UJIタグを使用したい
・ 入力項目を作成したい
・ UJIタグリファレンス
F.1.3
入力項目を作成したい
フォームの作成方法は“F.1.2 フォームを作成したい”を参照してください。ここでは、uji:formタグやHTMLのFORMタグのコンテントに
タグを記述して入力項目を作成する方法を説明します。
入力項目を作成する主な方法は以下のとおりです。
種類
用途
タグの例
コンポーネントタグ
表示内容、装飾、入力項目のチェックを含め
て、簡単に記述したい場合
uji:fieldString, uji:comboBox,
uji:tableView
クライアントスクリプト
タグ
JavaScriptを直接記述して入力項目のチェック
や操作を行ないたい場合
uji:input, uji:select, uji:textarea
・ コンポーネントタグ
少ないタグで画面を容易に作成するためのUJIタグです。
・ クライアントスクリプトタグ
ブラウザ上で実行するJavaScriptを入力項目に関連づけて生成するUJIタグです。
基本的な考え方
フォームにはデータBeanが対応付けられています。フォームが送信されると、入力されたデータは、対応づけられたデータBeanに格
納されます。フォームとデータBeanを対応付ける方法は、“F.1.2 フォームを作成したい”を参照してください。
入力項目は、それぞれデータBeanのプロパティに対応付ける必要があります。フォームが送信されると、入力項目に入力されたデー
タは、対応付けられたプロパティに格納されます。対応付けは、UJIタグのアトリビュートで定義します。
入力項目に対応付けたプロパティの値は入力項目の初期値としても使用されます。この初期値は、フォームが表示される際に、入力
項目に表示される文字列や、コンボボックスの既選択状態の選択肢として使用されます。
コンポーネントタグを使う
入力項目の形式ごとに、以下のコンポーネントタグが用意されています。
形式
1行入力(文字列)
UJIタグ
uji:fieldString
- 353 -
形式
UJIタグ
1行入力(整数)
uji:fieldLong
1行入力(実数)
uji:fieldDouble
1行入力(十進整数)
uji:fieldBigInteger
1行入力(十進小数点数)
uji:fieldBigDecimal
1行入力(日付、時刻)
uji:fieldDate
複数行入力
uji:fieldTextArea
コンボボックス
uji:comboBox
リストボックス
uji:listBox
チェックボックス
uji:checkBox
ラジオボタン
uji:radioButton
また、以下のタグを使うと複数の入力項目の組を簡単に作成できます。
入力項目の形式
UJIタグ
複数の選択肢からチェックボックスまたはラジオボタン
で選択
uji:buttonList
レコード形式の入力項目の組
uji:recordView
テーブルの表示と入力 (列ごとに、1行文字列入力、
チェックボックス、ラジオボタンに指定可能)
uji:tableView
ツリー付きのテーブルの表示と入力 (列ごとに、1行文
字列入力、チェックボックス、ラジオボタンに指定可能)
uji:treeView
ここでは、コンポーネントタグの基本的な使用方法として、1行入力項目の作成方法を説明します。その他のタグについては、“UJIタグ
リファレンス”や以下のマニュアルを参照してください。
マニュアル
UJIタグ
uji:comboBox, uji:listBox
F.1.6 選択項目を作成したい
uji:radioButton
F.1.7 ラジオボタンを作成したい
uji:checkBox
F.1.8 チェックボックスを作成したい
uji:buttonList
F.1.7 ラジオボタンを作成したい、F.1.8 チェックボックス
を作成したい
uji:tableView
F.1.4 表を表示したい
uji:treeView, uji:recordView
16.4.3 コレクションタグの利用
1行入力項目の作成方法をuji:fieldStringを例に説明します。
Stringの値を入力する場合はuji:fieldStringを使用します。uji:fieldStringに対応付けるプロパティは、beanアトリビュートとpropertyアトリ
ビュートで指定します。beanでデータBeanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名
前とは、DispatchContextクラスのsetResponseBeanメソッドでデータBeanに割り当てた名前です。
beanアトリビュートで指定したデータBeanは、次回のリクエストまで保存されるようにuji:useBeanタグで指定する必要があります。 uji:useBean
タグのアトリビュートに以下を指定してください。
アトリビュート
指定内容
id
データBeanの名前
cls
データBeanのクラス名(パッケージ名含む)
request
"true"
- 354 -
request="true"を指定することにより、画面表示時に使用したデータBeanが、次回リクエストを受信するときまで保存されます。
・ uji:fieldStringタグで入力項目を作成する
<uji:useBean id="body" cls="my.pkg.MyDataBean" request="true" />
...
<uji:form name="order" method="post" verbs="ok" beanId="body">
商品コード: <uji:fieldString bean="body" property="code"/><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
</uji:form>
商品コードの入力項目は、"body"と名前を付けたデータBeanのcodeプロパティに対応付けられます。フォームが表示される際は、
codeプロパティの値が初期値として表示されます。
1行入力項目を作成する場合、プロパティの型に応じて、使用するUJIタグを以下のように使い分けます。
プロパティの型
UJIタグ
java.lang.String
uji:fieldString
int, long
uji:fieldLong
float, double
uji:fieldDouble
java.math.BigInteger
uji:fieldBigInteger
java.math.BigDecimal
uji:fieldBigDecimal
java.util.Date
uji:fieldDate
入力項目のフォント、サイズ、色などはアトリビュートで指定できます。また、ビジネスクラスから動的に変更することも可能です。具体的
な方法については、“F.1.9 入力項目やボタンの色、サイズ、フォントを指定したい”を参照してください。
入力可能な値の範囲や文字種をアトリビュートで指定することにより、フォーム送信前に入力値をチェックできます。具体的な方法につ
いては、“F.2.1 入力項目に入力されたデータが適切かどうかチェックしたい”を参照してください。
注意
JSPのサイズに関する留意事項は“F.1.15 JSPのサイズの制限について知りたい”を参照してください。
クライアントスクリプトタグを使う
uji:input, uji:select, uji:textareaは、入力項目に対してユーザ定義のJavaScriptによる処理を行ないたい場合に、HTMLのINPUT,
SELECT, TEXTAREAタグの代わりに使用するタグです。したがって、基本的な使用方法は対応するHTMLタグと同じです。例えば、
uji:selectタグでコンボボックスを作成する場合、コンテントにHTMLのOPTIONタグを記述して選択肢を定義します。
対応付けるプロパティを指定するには、beanアトリビュートとpropertyアトリビュートを使用します。beanでデータBeanの名前を指定し、
propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前はsetResponseBeanメソッドで割り当てたものです。フォー
ムに割り当てたデータBeanと同じものを指定する必要があります。
・ uji:inputタグで入力項目を作成する
<uji:useBean id="body" cls="my.pkg.MyDataBean" request="true" />
...
<uji:form name="order" method="post" verbs="ok" beanId="body">
商品コード: <uji:input bean="body" property="code"/><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
</uji:form>
商品コードの入力項目は、"body"と名前を付けたデータBeanのcodeプロパティに対応付けられます。フォームが表示される際は、
codeプロパティの値が初期値として表示されます。
- 355 -
JavaScriptを記述して入力された値をチェックする方法については、“F.2.1 入力項目に入力されたデータが適切かどうかチェックした
い”を参照してください。
注意
uji:inputタグで入力項目を繰り返し表示したい場合は、uji:listタグと組み合わせてください。
HTMLのタグを使う
特に機能を必要としない場合は、HTMLのINPUT, SELECT, TEXTAREAタグで入力項目を作成できます。HTMLのタグで入力項目
を作成する場合は、NAMEアトリビュートでプロパティ名を指定することにより、プロパティと入力項目を対応付けます。対応付けるプロ
パティは、フォームに対応付けられたデータBeanのプロパティです。以下の型のプロパティと対応付けることができます。
String、boolean、byte、char、int、long、float、double、BigDecimal、BigInteger
・ INPUTタグで入力項目を作成する
<uji:useBean id="body" cls="my.pkg.MyDataBean" request="true" />
...
<uji:form name="order" method="post" verbs="ok" beanId="body">
商品コード: <INPUT NAME="code"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
</uji:form>
商品コードの入力項目は、"body"と名前を付けたデータBeanのcodeプロパティに対応付けられます。
UJIタグの場合と異なり、HTMLのタグを使用した場合、入力項目の初期値は自動的には設定されません。 INPUTタグを使用した場
合で、入力項目の初期値をデータBeanから取得したい場合は、uji:getPropertyタグを使用して、VALUEアトリビュートの値の部分にプ
ロパティの値を出力します。
<INPUT NAME="code" VALUE="<uji:getProperty bean='body' property='code' />">
関連項目
・ フォームを作成したい
・ チェックボックスを作成したい
・ 表を表示したい
・ ラジオボタンを作成したい
・ 選択項目を作成したい
・ 入力項目に入力されたデータが適切かどうかチェックしたい
・ 入力項目やボタンの色、サイズ、フォントを指定したい
・ JSPのサイズの制限について知りたい
・ UJIタグリファレンス
・ UJIタグを使ったプログラミング
F.1.4
表を表示したい
以下の3通りの作成方法を説明します。
- 356 -
用途
作成方法
表示するデータの指定や装飾を
含め、簡単な記述で表を表示し
たい場合
uji:tableViewタグを使用します。1個のタグで表を表示
できます。
セルの表示形式を細かく制御し
たい場合
uji:tableタグを使用します。セルの表示内容をHTMLの
タグやUJIタグで記述できます。
表の各行をデータBeanで表し、
各プロパティを列に対応付けて
表を表示したい場合
uji:listタグを使用します。
簡単な記述で表を表示したい
uji:tableViewタグを使用すると、1個のタグで表を表示できます。uji:tableViewタグのアトリビュートで、罫線や枠線の指定、色やフォン
トの指定が可能です。
・ uji:tableViewタグの使用例
<uji:tableView bean="body" property="table"
borderWidth="1" ruleWidth="1" background="gray"/>
この記述ではborderWidth, ruleWidth, backgroundアトリビュートでそれぞれ、枠線の幅、罫線の幅、背景色を指定しています。
表示する表のデータは、uji:tableViewタグ用の項目クラスに格納します。項目クラスとは、UJIタグで入力や表示を行なうデータが格納
されるクラスです。uji:tableViewタグでは、com.fujitsu.uji.compo.TableViewクラスを項目クラスとして使用します。
uji:tableViewタグを使用する手順は以下のとおりです。
1. データBeanにuji:tableView用の項目クラスをプロパティとして追加します。
2. 表示するデータを項目クラスに格納する処理をビジネスクラスに追加します。
3. JSPにuji:tableViewタグを記述します。1 で作成したプロパティを、uji:tableViewタグのbean, propertyアトリビュートで指定します。
beanでデータBeanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、
DispatchContextクラスのsetResponseBeanメソッドでデータBeanに割り当てた名前です。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.TableView;
public class ViewBean extends DataBean {
protected TableView table = null;
....
public TableView getTable() {
return table;
}
public void setTable(TableView table) {
this.table = table;
}
- 357 -
....
}
ここでは、TableView型のプロパティtableをデータBeanに追加しています。
・ 表のデータを項目クラスに格納する処理の記述例
private static final String[][] initialData = {
{"1","島崎 智弘","男","1968/08/11","スポーツ","月1回野球の試合を開いています。参加者随時募集中"},
{"2","大槻 太助","男","1968/04/02","読書",null},
....
};
private static final String[] header = {
"会員番号","氏名","性別","生年月日","趣味","プロフィール"
};
public void startup(DispatchContext context) {
ViewBean view = new ViewBean();
TableView table = new TableView(initialData);
table.setHeader(header);
view.setTable(table);
context.setResponseBean("body",view);
}
TableViewのコンストラクタで表のデータを格納しています。また、ヘッダ行に表示する文字列をsetHeaderメソッドで格納していま
す。
・ JSPの記述例
<uji:tableView bean="body" property="table" borderWidth="2" borderType="solid"
ruleWidth="1" ruleType="solid" />
bean, propertyアトリビュートでtableプロパティを指定します。また、borderWidth, borderType, ruleWidth, ruleTypeアトリビュートでそ
れぞれ枠線の幅、枠線の形式、罫線の幅、罫線の形式を指定しています。
・ 表の表示例
dataCellTypeアトリビュートを使うと特定の列を入力項目、ボタン、リンクに指定できます。入力項目に指定した場合、入力されたデータ
はフォーム送信時に項目クラスに格納され、項目クラスのgetValueAtメソッドで取得できます。ボタンやリンクに指定した場合、クリックさ
れたボタンやリンクの行番号、列番号が項目クラスに格納されます。この値は、TableViewクラスの場合、getLastPushedメソッドで取得
できます。headerアトリビュートを使うと、ヘッダ行をボタンやリンクに指定することもできます。これらのアトリビュートの詳細は“UJIタグリ
ファレンス”を参照してください。
ポイント
com.fujitsu.uji.compo.TableViewModelインタフェースを実装したクラスを作成し、項目クラスとして使用することもできます。
- 358 -
参考
サンプルの「board」にuji:tableViewの使用例があります。
セルの表示形式を細かく制御したい
uji:tableタグを使用すると、セルの表示内容をHTMLのタグやUJIタグで記述できます。
・ uji:tableタグの使用例
<uji:table bean="body" property="table">
<uji:tableRenderer type="table" >
<TABLE border="2" width="100%"><uji:children/></TABLE>
</uji:tableRenderer>
<uji:tableRenderer type="row" >
<TR><uji:children/></TR>
</uji:tableRenderer>
<uji:tableRenderer type="column" >
<TD><uji:value/></TD>
</uji:tableRenderer>
</uji:table>
表示する表のデータは、com.fujitsu.uji.model.table.TableModelインタフェースを実装したクラスに格納します。TableModelインタフェー
スのデフォルトの実装クラスとしてcom.fujitsu.uji.model.table.DefaultTableModelクラスが用意されています。
uji:tableタグを使用する手順は以下のとおりです。
1. TableModelを実装したクラスをデータBeanにプロパティとして追加します。
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.model.table.DefaultTableModel;
public class ViewBean extends DataBean {
protected DefaultTableModel table = null;
....
public DefaultTableModel getTable() {
return table;
}
public void setTable(DefaultTableModel table) {
this.table = table;
}
....
}
ここでは、DefaultTableModel型のプロパティtableをデータBeanに追加しています。
- 359 -
2. TableModel実装クラスに表示データを格納する処理をビジネスクラスに追加します。
private static final String[][] initialData = {
{"会員番号","氏名","性別","生年月日","趣味","プロフィール"},
{"1","島崎 智弘","男","1968/08/11","スポーツ","月1回野球の試合を開いています。参加者随時募集中"},
{"2","大槻 太助","男","1968/04/02","読書",null},
....
};
public void startup(DispatchContext context) {
ViewBean view = new ViewBean();
DefaultTableModel table = new DefaultTableModel(initialData);
view.setTable(table);
context.setResponseBean("body",view);
}
DefaultTableModelのコンストラクタで表のデータを格納しています。
3. JSPにuji:tableタグを記述します。1 で作成したプロパティを、uji:tableタグのbean, propertyアトリビュートで指定します。beanでデータ
Beanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、DispatchContextクラスの
setResponseBeanメソッドでデータBeanに割り当てた名前です。
<uji:table bean="body" property="table">
....
</uji:table>
bean, propertyアトリビュートでtableプロパティを指定しています。
4. uji:tableタグのコンテントにレンダラを記述します。レンダラは、表の表示方法をHTMLのタグやUJIタグで定義します。uji:tableタ
グのレンダラはuji:tableRendererタグです。セルの表示形式を定義するには、type="column"を指定したuji:tableRendererタグを
記述します。
<uji:table bean="body" property="table">
<uji:tableRenderer type="column">
<TD nowrap><uji:value/></TD>
</uji:tableRenderer>
....
</uji:table>
表示時にuji:valueタグはセルの値に置き換えられます。この記述によって、各セルの値がTDタグで囲まれて出力されます。
5. セルのレンダラのほかに、行のレンダラ、表全体のレンダラも記述します。行のレンダラにはtype="row"を、表全体のレンダラには
type="table"を指定します。
<uji:table bean="body" property="table">
<uji:tableRenderer type="table">
<TABLE border="2" width="100%"><uji:children/></TABLE>
</uji:tableRenderer>
<uji:tableRenderer type="row">
<TR><uji:children/></TR>
</uji:tableRenderer>
<uji:tableRenderer type="column">
<TD nowrap><uji:value/></TD>
</uji:tableRenderer>
</uji:table>
行のレンダラの中のuji:childrenタグは、表示時に列数分のセルに置き換えられます。各セルはセルのレンダラに従って出力され
ます。また、表全体のレンダラの中のuji:childrenタグは行数分の行に置き換えられます。上記の記述では、1行がTRタグで囲ま
れて、表全体がTABLEタグで囲まれて出力されます。
表示結果は以下のようになります。
- 360 -
ヘッダ行を表示したり、特定の列だけ表示形式を変更したりする場合は、行やセルにデータ属性を付加します。異なるデータ属性を
持つ行やセルにそれぞれ別のレンダラを定義することができるため、データ属性に応じて表示形式を変更することができます。例とし
て、ヘッダ行だけTDタグの変わりにTHタグで表示する方法を説明します。
1. TableModelインタフェースを実装したクラスを作成し、getColumnClassメソッドを作成します。DefaultTableModelクラスを継承す
ると作成が容易になります。getColumnClassメソッドは、引数として行番号、列番号を受け取り、そのセルのデータ属性を返却し
ます。
import com.fujitsu.uji.model.table.DefaultTableModel;
public class MyTable extends DefaultTableModel {
public String getColumnClass(int rowIndex, int columnIndex) {
if (rowIndex == 0 ) {
return "header";
}
return null;
}
}
この例では、ヘッダ行の場合だけ"header"を、その他の場合はnullを返却するようにしています。
2. 1 で作成したクラスのプロパティをデータBeanに追加します。また、uji:tableタグのbean, propertyアトリビュートでそのプロパティを
指定します。
3. データ属性が"header"の場合のレンダラをuji:tableタグのコンテントに追加します。データ属性は、uji:tableRendererタグのclsアト
リビュートで指定します。
<uji:table bean="body" property="table">
<uji:tableRenderer type="table">
<TABLE border="2" width="100%"><uji:children/></TABLE>
</uji:tableRenderer>
<uji:tableRenderer type="row">
<TR><uji:children/></TR>
</uji:tableRenderer>
<uji:tableRenderer type="column">
<TD nowrap><uji:value/></TD>
</uji:tableRenderer>
<uji:tableRenderer type="column" cls="header">
<TH nowrap><uji:value/></TH>
</uji:tableRenderer>
</uji:table>
セルに入力項目を作成するには、入力項目を作成するタグをセルのレンダラの中に記述します。以下は、uji:fieldStringタグで入力項
目を作成する例です。 通常、uji:fieldStringなどのコンポーネントタグは、bean, propertyアトリビュートでデータBeanのプロパティと対応
付けて使用します。uji:tableRendererのコンテントで使用する場合は、bean, propertyを省略することにより、表のセルの値と対応付けら
れます。
<uji:table bean="body" property="table">
....
<uji:tableRenderer type="column">
<TD><uji:fieldString/></TD>
</uji:tableRenderer>
- 361 -
....
</uji:table>
特定の列だけ入力項目にするには、前述のようにデータ属性を利用して、入力項目を作成したレンダラと通常の表示のレンダラを作
成してください。
uji:tableタグの詳細は“UJIタグリファレンス”を参照してください。
参考
サンプルの「model」にuji:tableの使用例があります。
表の各行をデータBeanで表し、各プロパティを列に対応付けて表を表示したい
表の1行分のデータを1個のデータBeanで表し、その各々のプロパティを表の列に対応付けて表示させたい場合、uji:listタグを使用し
ます。uji:listはリスト構造のデータを表示するためのタグで、表の表示にも応用できます。uji:tableを使用した方法と同様に、セルの表
示内容をHTMLのタグやUJIタグで記述できます。
・ uji:listタグでテーブルを表示する例
<uji:list bean="body" property="table">
<uji:listRenderer type="list">
<TABLE border="2" width="100%">
<TR><TH>会員番号<TH>氏名<TH>....</TR>
<uji:children/>
</TABLE>
</uji:listRenderer>
<uji:listRenderer type="element">
<TR>
<uji:composite>
<uji:compositeRenderer>
<TD><uji:getProperty property="id"/>
<TD><uji:getProperty property="name"/>
....
</uji:compositeRenderer>
</uji:composite>
</TR>
</uji:listRenderer>
</uji:list>
以下の図のような表示を行う場合を例に表の作成方法を説明します。
1行分のデータを持つデータBeanにはid, nameなどのプロパティがあり、idを1列目に、nameを2列目に表示させます。
以降の説明では、1行分のデータを持つデータBeanを行データBeanと呼びます。
表 の デ ー タ は 、 行 デ ー タ Bean の リ ス ト と し て 表 す こ と が で き ま す 。 uji:list タ グ を 使 用 す る た め 、 リ ス ト を 表 す ク ラ ス と し て
com.fujitsu.uji.model.list.ListModel イ ン タ フ ェ ー ス を 実 装 し た ク ラ ス を 使 用 し ま す 。 デ フ ォ ル ト の 実 装 ク ラ ス と し て
com.fujitsu.uji.model.list.DefaultListModelクラスをそのまま使用することもできます。
- 362 -
表を作成する手順は以下のとおりです。
1. ListModelインタフェースを実装したクラスをデータBeanにプロパティとして追加します。
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.model.list.DefaultListModel;
public class ViewBean extends DataBean {
protected DefaultListModel table = null;
....
public DefaultListModel getTable() {
return table;
}
public void setTable(DefaultListModel table) {
this.table = table;
}
....
}
ここでは、DefaultListModel型のプロパティtableをデータBeanに追加しています。
2. ListModel実装クラスに行データBeanを格納する処理をビジネスクラスに追加します。
private static final RowBean[] initialData = {
new RowBean("1","島崎 智弘","男","1968/08/11","スポーツ",
"月1回野球の試合を開いています。参加者随時募集中"),
new RowBean("2","大槻 太助","男","1968/04/02","読書",null),
....
};
public void startup(DispatchContext context) {
ViewBean view = new ViewBean();
DefaultListModel table = new DefaultListModel(initialData);
view.setTable(table);
context.setResponseBean("body",view);
}
この記述では、行データBeanのクラス名をRowBeanとしています。DefaultListModelのコンストラクタで行データBeanを格納して
います。
- 363 -
3. JSPにuji:listタグを記述します。1 で作成したプロパティを、uji:listタグのbean, propertyアトリビュートで指定します。beanでデータ
Beanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、DispatchContextクラスの
setResponseBeanメソッドでデータBeanに割り当てた名前です。
<uji:list bean="body" property="table">
....
</uji:list>
bean, propertyアトリビュートでtableプロパティを指定しています。
4. uji:listタグのコンテントにレンダラを記述します。レンダラは、リストの表示方法をHTMLのタグやUJIタグで定義します。uji:listタ
グのレンダラはuji:listRendererタグです。以下に示すように、type="element"を指定したuji:listRendererタグ、uji:compositeタグ、
uji:compositeRendererタグを記述し、uji:compositeRendererタグのコンテントに、表の1行分を表示するためのHTMLタグやUJIタ
グを記述します。
<uji:list bean="body" property="table">
<uji:listRenderer type="element">
<TR>
<uji:composite>
<uji:compositeRenderer>
....
</uji:compositeRenderer>
</uji:composite>
</TR>
</uji:listRenderer>
....
</uji:list>
5. 行データBeanのプロパティを表示するには、uji:compositeRendererのコンテントでuji:getPropertyタグを使用し、そのpropertyアト
リビュートで行データBeanのプロパティ名を指定します。
<uji:list bean="body" property="table">
<uji:listRenderer type="element">
<TR>
<uji:composite>
<uji:compositeRenderer>
<TD><uji:getProperty property="id"/>
<TD><uji:getProperty property="name"/>
....
</uji:compositeRenderer>
</uji:composite>
</TR>
</uji:listRenderer>
....
</uji:list>
この記述では、行データBeanのidプロパティが1列目に、nameプロパティが2列目に表示されます。
6. 表全体をTABLEタグで囲むために、type="list"を指定したuji:listRendererタグを以下のように追加します。また、ヘッダ行も
uji:listRendererに追加します。
<uji:list bean="body" property="table">
<uji:listRenderer type="list">
<TABLE border="2" width="100%">
<TR><TH>会員番号<TH>氏名<TH>....</TR>
<uji:children/>
</TABLE>
</uji:listRenderer>
<uji:listRenderer type="element">
<TR>
<uji:composite>
<uji:compositeRenderer>
<TD><uji:getProperty property="id"/>
<TD><uji:getProperty property="name"/>
- 364 -
....
</uji:compositeRenderer>
</uji:composite>
</TR>
</uji:listRenderer>
</uji:list>
type="list"を指定したレンダラの中のuji:childrenタグは、表示時に行数分の行に置き換えられます。各行は、type="element"を
指定したレンダラに従って出力されます。表示結果は以下のようになります。
表のセルに入力項目を作成するには、入力項目を作成するタグをuji:getPropertyの代わりに使用します。以下は、uji:fieldStringタグで
入力項目を作成する例です。 通常、uji:fieldStringなどのコンポーネントタグは bean, propertyアトリビュートでデータBeanのプロパティ
と対応付けて使用します。uji:listRendererのコンテントで使用する場合は、beanを省略することにより、行データBeanのプロパティの値
と対応付けられます。
<uji:listRenderer type="element">
<TR>
<uji:composite>
<uji:compositeRenderer>
<TD><uji:getProperty property="id"/>
<TD><uji:fieldString property="name"/>
....
</uji:compositeRenderer>
</uji:composite>
</TR>
</uji:listRenderer>
uji:listタグの詳細は“UJIタグリファレンス”を参照してください。
関連項目
・ コレクションタグの利用
・ 画面部品タグ
・ フォームを作成したい
・ 入力項目を作成したい
・ UJIタグリファレンス
・ APIリファレンスのTableViewクラス
・ APIリファレンスのDefaultTableModelクラス
・ APIリファレンスのDefaultListModelクラス
F.1.5
画面をヘッダ部とボディ部などに分けて作成したい
以下のようにして画面を複数の領域に分割し、各領域ごとに入出力ページを作成することができます。
・ 制御ページに領域の数だけuji:includeタグを記述します。uji:includeタグのpaneアトリビュートに領域名を指定します。
領域を分割するための制御ページの例
- 365 -
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="error.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD><TITLE>領域分割サンプル</TITLE></HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="head" />
<uji:include pane="body" />
</BODY>
</HTML>
この例では、head, bodyという2つの領域を定義しています。
・ それぞれの領域に使用するデータBeanと入出力ページを作成します。
各領域に画面を表示させるためには、ビジネスクラスのメソッドで以下の処理を実行します。
・ 表示するデータをデータBeanに格納します。
・ データBeanのsetVerbメソッドで表示モードを設定します。表示モードが不要な場合はこの処理を省略できます。
・ com.fujitsu.uji.DispatchContextクラスのsetResponseBeanメソッドで、データBeanを各領域に割り当てます。
ビジネスクラスの例
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler {
....
public void startup(DispatchContext context) {
BodyBean bodyBean = new BodyBean();
bodyBean.setVerb("input");
HeadBean headBean = new HeadBean();
....
context.setResponseBean("head",headBean);
context.setResponseBean("body",bodyBean);
}
}
head領域にHeadBeanを、body領域にBodyBeanを割り当てています。ページマップでHeadBeanクラス、表示モード無しに対応付
けられた入出力ページがhead領域に表示され、BodyBeanクラス、表示モードinputに対応付けられた入出力ページがbody領域に
表示されます。
各領域の画面は、対応するuji:includeタグの位置に表示されます。領域の位置関係を指定したい場合は、TABLEタグやスタイルシー
トを使います。
・ TABLEタグで領域の位置を調整する例
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="error.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD><TITLE>領域分割サンプル</TITLE></HEAD>
<BODY>
<uji:dispatch />
<TABLE>
<TR>
<TD><uji:include pane="head" /></TD>
<TD><uji:include pane="body" /></TD>
</TR>
</TABLE>
- 366 -
</BODY>
</HTML>
この例では、head領域が左に、body領域が右に表示されます。
・ DIVタグとスタイルシートで領域の位置を調整する例
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="error.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD>
<TITLE>領域分割サンプル</TITLE>
<STYLE TYPE="text/css">
<!-DIV.header_x{ position:absolute;
left:0px;
width:500px;}
DIV.body_x{ position:absolute;
left:560px;
width:500px;}
-->
</STYLE>
</HEAD>
<BODY>
<uji:dispatch />
<DIV CLASS="header_x">
<uji:include pane="head" />
</DIV>
<DIV CLASS="body_x">
<uji:include pane="body" />
</DIV>
</BODY>
</HTML>
この例では、head領域が左に、body領域が右に表示されます。スタイルシートで領域の表示位置と横幅を指定しています。
関連項目
・ Webcoordinatorアプリケーションの設計
F.1.6
選択項目を作成したい
コンポーネントタグで選択項目を作成する方法を説明します。フォームや入力項目を作成する基本的な方法については、“F.1.2 フォー
ムを作成したい”や“F.1.3 入力項目を作成したい”を参照してください。
コンポーネントタグを使うと容易に選択項目が作成できます。
目的
作成方法
コンボボックスを作成する
uji:comboBoxタグを使用します。
リストボックスを作成する
uji:listBoxタグを使用します。
コンボボックスを作成する
uji:comboBoxタグでコンボボックスを作成する方法は以下のとおりです。
1. uji:comboBoxタグに対応付けるプロパティをデータBeanに作成します。プロパティの型はuji:comboBox用の項目クラスである必
要 が あ り ま す 。 項 目 ク ラ ス と は 、 入 力 や 表 示 を 行 な う デ ー タ が 格 納 さ れ る ク ラ ス で す 。 uji:comboBox で は 、
com.fujitsu.uji.compo.ComboBoxクラスを項目クラスとして使用します。
2. 表示する選択肢のラベルは項目クラスに格納します。ComboBoxクラスの場合は、add, setメソッドで選択肢を追加、設定します。
- 367 -
3. JSPにuji:comboBoxタグを記述します。1で作成したプロパティを、uji:comboBoxタグのbean, propertyアトリビュートで指定します。
beanでデータBeanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、
DispatchContextクラスのsetResponseBeanメソッドでデータBeanに割り当てた名前です。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.ComboBox;
public class MyDataBean extends DataBean {
protected ComboBox item = new ComboBox();
....
public ComboBox getItem() {
return item;
}
....
}
ここでは、ComboBox型のプロパティitemをデータBeanに作成しています。
・ 選択肢のラベルをビジネスクラスのメソッドで指定するための記述例
public void startup(DispatchContext context) {
String[] ivalue={
"醤油","味噌","酢"
};
MyDataBean dataBean = new MyDataBean();
ComboBox item = dataBean.getItem();
for (int i = 0; i < ivalue.length; i++) item.add(ivalue[i]);
....
context.setResponseBean("body",dataBean);
}
ComboBoxクラスのaddメソッドで選択肢を追加します。
・ JSPの記述例
<uji:comboBox bean="body" property="item" />
bean, propertyアトリビュートで、itemプロパティを指定します。この記述により、 画面には次のように表示されます。
フォームが送信されたあと、どの選択肢が選択されたのかを項目クラスからgetSelectedIndexメソッドで取得できます。このメソッドは選
択されている選択肢のインデックスを返します。
・ 選択された選択肢のインデックスを取得する処理の記述例
public void update(DispatchContext context, MyDataBean dataBean) {
ComboBox item = dataBean.getItem();
int index = item.getSelectedIndex();
....
}
- 368 -
ポイント
com.fujitsu.uji.compo.ComboBoxModelインタフェースを実装したクラスを作成し、項目クラスとして使用することもできます。
リストボックスを作成する
uji:listBoxタグでリストボックスを作成する方法は、uji:comboBoxタグの使用方法と同様です。違いは以下の点です。
1. uji:listBoxタグに対応付けるプロパティの型はuji:listBox用の項目クラスです。uji:listBoxでは、com.fujitsu.uji.compo.ListBoxク
ラスを項目クラスとして使用します。
2. JSPにはuji:listBoxタグを記述します。リストボックスの表示行数をsizeアトリビュートで指定します。また、複数の選択肢の選択を
許す場合は、multipleModeアトリビュートにtrueを指定します。
3. どの選択肢が選択されたかを知るには、項目クラスのgetSelectedIndexesメソッドを使用します。このメソッドは選択されている選
択肢のインデックスの配列を返します。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.ListBox;
public class MyDataBean extends DataBean {
protected ListBox item = new ListBox();
....
public ListBox getItem() {
return item;
}
....
}
ここでは、ListBox型のプロパティitemをデータBeanに作成しています。
・ 選択肢のラベルをビジネスクラスのメソッドで指定するための記述例
public void startup(DispatchContext context) {
String[] ivalue={
"東京","ロンドン","パリ","ローマ"
};
MyDataBean dataBean = new MyDataBean();
ListBox item = dataBean.getItem();
for (int i = 0; i < ivalue.length; i++) item.add(ivalue[i]);
....
context.setResponseBean("body",dataBean);
}
ListBoxクラスのaddメソッドで選択肢を追加します。
・ JSPの記述例
<uji:listBox bean="body" property="item" size="3" multipleMode="true" />
この記述では、表示行数は3行、複数選択可となります。 画面には次のように表示されます。
- 369 -
ポイント
com.fujitsu.uji.compo.ComboBoxModelインタフェースを実装したクラスを作成し、項目クラスとして使用することもできます。
関連項目
・ コレクションタグの利用
・ フォームを作成したい
・ 入力項目を作成したい
・ UJIタグリファレンス
・ APIリファレンスのComboBoxクラス
・ APIリファレンスのListBoxクラス
F.1.7
ラジオボタンを作成したい
コンポーネントタグでラジオボタンを作成する方法を説明します。フォームや入力項目を作成する基本的な方法については、“F.1.2
フォームを作成したい”や“F.1.3 入力項目を作成したい”を参照してください。
主に以下の4通りの方法があります。
目的
作成方法
複数の選択肢から1個を選択するための一連の
ラジオボタンをまとめて作成する
uji:buttonListタグを使用します。
uji:tableView, uji:treeViewタグで作成した表の
特定の列をラジオボタンに指定する
ji:tableView, uji:treeViewタグのdataCellTypeアトリビュート
で、ラジオボタンにする列を指定します。
uji:list, uji:tableタグで作成した表の特定の列を
ラジオボタンに指定する
uji:radioButtonタグを使用します。
ラジオボタンを個別に作成する
uji:radioButtonタグを使用します。
複数の選択肢から1個を選択するための一連のラジオボタンをまとめて作成する
uji:buttonListタグを使うと、選択肢群から項目を選ぶためのラジオボタンが容易に作成できます。
<uji:buttonList bean="body" property="button" columns="3" />
この記述によるラジオボタンの表示例は以下のようになります。
uji:buttonListタグは以下のように使用します。
1. uji:buttonListタグに対応づけるプロパティをデータBeanに作成します。プロパティの型はuji:buttonList用の項目クラスである必
要 が あ り ま す 。 項 目 ク ラ ス と は 、 入 力 や 表 示 を 行 な う デ ー タ が 格 納 さ れ る ク ラ ス で す 。 uji:buttonList で は 、
com.fujitsu.uji.compo.ButtonListクラスを項目クラスとして使用します。
2. 表示する選択肢のラベルは項目クラスに格納します。ButtonListクラスの場合は、add, setメソッドで選択肢を追加、設定します。
3. JSPにuji:buttonListタグを記述します。1 で作成したプロパティを、uji:buttonListタグのbean, propertyアトリビュートで指定します。
beanでデータBeanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、
DispatchContextクラスのsetResponseBeanメソッドでデータBeanに割り当てた名前です。
- 370 -
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.ButtonList;
public class MyDataBean extends DataBean {
protected ButtonList button = new ButtonList();
....
public ButtonList getButton() {
return button;
}
....
}
ここでは、ButtonList型のプロパティbuttonをデータBeanに作成しています。
・ 選択肢のラベルをビジネスクラスのメソッドで指定するための記述例
public void startup(DispatchContext context) {
String[] ivalue={
"スポーツ","音楽","ドライブ","読書",
"映画鑑賞","園芸","旅行","ギャンブル"
};
MyDataBean dataBean = new MyDataBean();
ButtonList button = dataBean.getButton();
for (int i = 0; i < ivalue.length; i++) button.add(ivalue[i]);
....
context.setResponseBean("body",dataBean);
}
ButtonListクラスのaddメソッドで選択肢を追加します。
・ JSPの記述例
<uji:buttonList bean="body" property="button" columns="3" />
bean, propertyアトリビュートで、buttonプロパティを指定します。columnsアトリビュートには、1行に何個のラジオボタンを表示するか
を指定します。
フォームが送信されたあと、どの選択肢がチェックされたのかを項目クラスからgetSelectedIndexメソッドで取得できます。このメソッドは
チェックされている選択肢のインデックスを返します。
・ チェックされた選択肢のインデックスを取得する処理の記述例
public void update(DispatchContext context, MyDataBean dataBean) {
ButtonList button = dataBean.getButton();
int index = button.getSelectedIndex();
....
}
ポイント
com.fujitsu.uji.compo.ButtonListModelインタフェースを実装したクラスを作成し、項目クラスとして使用することもできます。
- 371 -
uji:tableView, uji:treeViewタグで作成した表の特定の列をラジオボタンに指定する
uji:tableView、uji:treeViewタグで表を作成している場合、dataCellTypeアトリビュートで各列の表示形式をセミコロンで区切って指定で
きます。ラジオボタンにする列には表示形式として"radio"を指定します。なお、uji:tableView, uji:treeViewタグで表を作成する方法
は、“F.1.4 表を表示したい”を参照してください。
<uji:tableView bean="body" property="table" dataCellType="data;data;radio" />
この記述では、3列目がラジオボタンで表示されます。
ラジオボタンに対応するセルの値はBooleanクラスで表します。フォームが送信されると、チェックされたセルの値にはBoolean.TRUE
が、チェックされていないセルの値にはBoolean.FALSEがセットされます。 画面表示時は、セルの値に従ってチェック状態が決定され
ます。
uji:list, uji:tableタグで作成した表の特定の列をラジオボタンに指定する
uji:list, uji:tableタグで作成した表の特定の列をラジオボタンに指定し、ラジオボタンで行を選択したい場合、uji:radioButtonタグをレン
ダラの中で使用します。uji:list, uji:tableタグで表を作成する方法は、“F.1.4 表を表示したい”を参照してください。
uji:radioButtonタグは、アトリビュートで以下の2種類の情報を指定します。
1. ラジオボタンに関連付けるオブジェクトを指定します。このオブジェクトは、個々のラジオボタンを識別するために使用します。例
えば、会員番号(会員一覧の表の場合)、商品コード(商品カタログの表の場合)などをラジオボタンに関連付けます。
2. ラジオボタンのチェック状態を記録するプロパティを指定します。このプロパティには、チェックされたラジオボタンに対応付けた
オブジェクト(前項の例では、会員番号や商品コード)が格納されます。また、ラジオボタンの初期選択状態はこのプロパティの値
に従います。
以降、uji:listタグでテーブルを作る場合と、uji:tableで作る場合に分けて説明します。
uji:listタグで作成した表の場合、以下のようにuji:radioButtonタグを使用します。
1. データBeanに、選択された行の情報を記憶するためのプロパティを追加します。プロパティの型は行を識別する値 ( 2で説明し
ます) に合わせます。
2. 1行分のデータを持つデータBeanに行を識別する値のプロパティを作成します。例えば、会員一覧の表なら、会員番号をこのプ
ロパティにセットします。
3. uji:listRendererタグのコンテントに、uji:radioButtonタグを記述します。selectedBean, selectedPropertyアトリビュートには1で作成し
たプロパティを指定します。propertyアトリビュートには、2で作成したプロパティを指定します。beanアトリビュートは省略します。
これにより、行を識別する値がラジオボタンに対応付けられます。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.model.list.DefaultListModel;
public class ViewBean extends DataBean {
protected DefaultListModel table = null;
protected String selectedMember = null;
....
public String getSelectedMember() {
return selectedMember;
}
public void setSelectedMember(String selectedMember) {
this.selectedMember = selectedMember;
}
....
}
ここでは、String型のプロパティselectedMemberをデータBeanに追加しています。
- 372 -
・ JSPの記述例
<uji:list bean="body" property="table">
<uji:listRenderer type="list">
<TABLE border="2" width="100%">
<TR><TH>会員番号<TH>氏名<TH>....</TR>
<uji:children/>
</TABLE>
</uji:listRenderer>
<uji:listRenderer type="element">
<TR>
<uji:composite>
<uji:compositeRenderer>
<TD><uji:radioButton selectedBean="body" selectedProperty="selectedMember" property="id"/>
<TD><uji:getProperty property="name"/>
....
</uji:compositeRenderer>
</uji:composite>
</TR>
</uji:listRenderer>
</uji:list>
表示結果は以下のようになります。
フォームが送信されると、チェックされた行を識別する値が1で作成したプロパティにセットされます。また、画面表示時のデフォルトの
チェック状態は、1で作成したプロパティの値に従います。
uji:tableタグで作成した表の場合、以下のようにuji:radioButtonタグを使用します。
1. データBeanに、選択された行の情報を記憶するためのプロパティを追加します。プロパティの型は行を識別する値 ( 3で説明し
ます) に合わせます。
2. ラジオボタンの列のセルにデータ属性を与えて、他の列のセルと区別できるようにします。データ属性を与えるために、TableModel
インタフェースを実装したクラスを作成し、その getColumnClassメソッドを実装します。
3. TableModel実装クラスに格納された表のデータのうち、ラジオボタンの列には行を識別する値を入れます。例えば、会員一覧の
表なら、会員番号をラジオボタンの列にセットします。
4. uji:tableタグのコンテントに、ラジオボタンのセルを表示するためのレンダラを追加します。このレンダラに、uji:radioButtonタグを
記述します。selectedBean, selectedPropertyアトリビュートには1で作成したプロパティを指定します。bean, propertyアトリビュート
を省略することにより、セルの値がラジオボタンに対応付けられます。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.model.table.DefaultTableModel;
public class ViewBean extends DataBean {
protected MyTable table = null;
protected String selectedMember = null;
....
- 373 -
public String getSelectedMember() {
return selectedMember;
}
public void setSelectedMember(String selectedMember) {
this.selectedMember = selectedMember;
}
....
}
ここでは、String型のプロパティselectedMemberをデータBeanに追加しています。
・ TableModel実装クラスを作成し、データ属性を定義する例
import com.fujitsu.uji.model.table.DefaultTableModel;
public class MyTable extends DefaultTableModel {
public String getColumnClass(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return "radio";
}
return null;
}
}
この例では、DefaultTableModelを継承してTableModel実装クラスを作成しています。getColumnClassメソッドは、最初の列のデー
タ属性を"radio"としています。
・ JSPの記述例
<uji:table bean="body" property="table">
<uji:tableRenderer type="table">
<TABLE border="2" width="100%"><uji:children/></TABLE>
</uji:tableRenderer>
<uji:tableRenderer type="row">
<TR><uji:children/></TR>
</uji:tableRenderer>
<uji:tableRenderer type="column">
<TD nowrap><uji:value/></TD>
</uji:tableRenderer>
<uji:tableRenderer type="column" cls="radio">
<TD><uji:radioButton selectedBean="body" selectedProperty="selectedMember"/></TD>
</uji:tableRenderer>
</uji:table>
フォームが送信されると、チェックされた行を識別する値が1で作成したプロパティにセットされます。また、画面表示時のデフォルトの
チェック状態は、1で作成したプロパティの値に従います。
ラジオボタンを個別に作成する
uji:radioButtonタグで作成します。アトリビュートで以下の2種類の情報を指定します。
1. ラジオボタンに関連付けるオブジェクトを指定します。例えば、ラジオボタンを識別する文字列やインデックス番号を指定します。
2. ラジオボタンのチェック状態を記録するプロパティを指定します。このプロパティには、チェックされたラジオボタンに対応付けた
オブジェクトが格納されます。また、ラジオボタンの初期選択状態はこのプロパティの値に従います。
uji:radioButtonタグでラジオボタンを作成する手順は以下のとおりです。
1. 以下の2種類のプロパティをデータBeanに作成します。
- ラジオボタンに対応付けるオブジェクトを持つプロパティ
- ラジオボタンのチェック状態を記録するプロパティ
この2種類のプロパティは同じ型にします。
- 374 -
- データBeanの記述例
import com.fujitsu.uji.DataBean;
public class MyDataBean extends DataBean {
protected String city = null;
protected String choice1 = "ローマ";
protected String choice2 = "パリ";
....
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getChoice1() {
return choice1;
}
public String getChoice2() {
return choice2;
}
....
}
ここでは、ラジオボタンに対応付けるオブジェクトのためのプロパティchoice1, choice2 と、チェック状態を記録するプロパティ
cityを作成しています。
この例では、DefaultTableModelを継承してTableModel実装クラスを作成しています。getColumnClassメソッドは、最初の列のデー
タ属性を"radio"としています。
2. JSPにuji:radioButtonタグを記述します。1 で作成したプロパティを以下のように指定します。
- ラジオボタンに対応付けるオブジェクトのためのプロパティをbean, propertyアトリビュートで指定します。beanでデータBeanの
名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、DispatchContextクラスの
setResponseBeanメソッドでデータBeanに割り当てた名前です。
- チェック状態を記録するプロパティをselectedBean, selectedPropertyアトリビュートで指定します。selectedBeanでデータBean
の名前を指定し、selectedPropertyでそのデータBeanのプロパティ名を指定します。
- JSPの記述例
<uji:radioButton selectedBean="body" selectedProperty="city"
bean="body" property="choice1" />
<uji:getProperty bean="body" property="choice1"/>
<uji:radioButton selectedBean="body" selectedProperty="city"
bean="body" property="choice2" />
<uji:getProperty bean="body" property="choice2"/>
この例では、uji:getPropertyタグでラベルを表示しています。
フォームが送信されると、チェック状態がプロパティに反映されます。チェックされたラジオボタンに関連づけられているオブジェクトが、
selectedBean, selectedPropertyアトリビュートで指定したプロパティにセットされます。上記の例では、「パリ」をチェックすると、cityプロパ
ティの値が"パリ"になります。
関連項目
・ フォームを作成したい
・ 入力項目を作成したい
・ 表を作成したい
・ コレクションタグの利用
- 375 -
・ UJIタグリファレンス
・ APIリファレンスのButtonListクラス
F.1.8
チェックボックスを作成したい
コンポーネントタグでチェックボックスを作成する方法を説明します。フォームや入力項目を作成する基本的な方法については、“F.1.2
フォームを作成したい”や“F.1.3 入力項目を作成したい”を参照してください。
主に以下の3通りの方法があります。
目的
作成方法
チェックボックスを個別に作成する
uji:checkBoxタグを使用します。
選択肢群から項目を選んでチェックするための
一連のチェックボックスをまとめて作成する
uji:buttonListタグで作成します。複数の選択肢のチェック
ボックスをまとめてuji:buttonListタグ1個で作成できます。
uji:tableViewタグ、uji:treeViewタグで作成した
表の特定の列をチェックボックスにする
チェックボックスにする列を、uji:tableViewタグ、
uji:treeViewタグのdataCellTypeアトリビュートで指定しま
す。
チェックボックスを個別に作成する
uji:checkBoxタグでチェックボックスを作成する方法は以下のとおりです。
1. uji:checkBoxタグに対応付けるプロパティをデータBeanに作成します。プロパティの型としては、Boolean, boolean, String を使用
します。チェックボックスの色やサイズを動的に変更したい場合は項目クラスを使用することもできます。項目クラスの使用方法
は“F.1.9 入力項目やボタンの色、サイズ、フォントを指定したい”を参照してください。以降はBoolean, boolean, Stringの場合を
説明します。
2. JSPにuji:checkBoxタグを記述します。1 で作成したプロパティを、uji:checkBoxタグのbean, propertyアトリビュートで指定します。
beanでデータBeanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、
DispatchContextクラスのsetResponseBeanメソッドでデータBeanに割り当てた名前です。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
public class MyDataBean extends DataBean {
protected boolean accepted = false;
....
public boolean isAccepted() {
return accepted;
}
public void setAccepted(boolean accepted) {
this.accepted = accepted;
}
....
}
ここでは、boolean型のプロパティacceptedをデータBeanに作成しています。
・ JSPの記述例
<uji:checkBox bean="body" property="accepted" />
bean, propertyアトリビュートで、accepted プロパティを指定します。
フォームが送信されると、チェック状態がプロパティに反映されます。チェックされている場合はプロパティの値がtrue (booleanの場合)、
Boolean.TRUE (Booleanの場合), "true" (Stringの場合)となります。チェックされていない場合は、false (booleanの場合)、Boolean.FALSE
(Booleanの場合), "false" (Stringの場合)となります。
- 376 -
選択肢群から項目を選んでチェックするための一連のチェックボックスをまとめて作成する
uji:buttonListタグを使うと、選択肢群から項目を選ぶためのチェックボックスが容易に作成できます。
<uji:buttonList bean="body" property="button" multipleMode="true" columns="3" />
この記述によるチェックボックスの表示例は以下のようになります。
uji:buttonListタグは以下のように使用します。
1. uji:buttonListタグに対応づけるプロパティをデータBeanに作成します。プロパティの型はuji:buttonList用の項目クラスである必
要 が あ り ま す 。 項 目 ク ラ ス と は 、 入 力 や 表 示 を 行 な う デ ー タ が 格 納 さ れ る ク ラ ス で す 。 uji:buttonList で は 、
com.fujitsu.uji.compo.ButtonListクラスを項目クラスとして使用します。
2. 表示する選択肢のラベルは項目クラスに格納します。ButtonListクラスの場合は、add, setメソッドで選択肢を追加、設定します。
3. JSPにuji:buttonListタグを記述します。1 で作成したプロパティを、uji:buttonListタグのbean, propertyアトリビュートで指定します。
beanでデータBeanの名前を指定し、propertyでそのデータBeanのプロパティ名を指定します。データBeanの名前とは、
DispatchContextクラスのsetResponseBeanメソッドでデータBeanに割り当てた名前です。
4. uji:buttonListタグのmultipleModeアトリビュートにtrueを指定します。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.compo.ButtonList;
public class MyDataBean extends DataBean {
protected ButtonList button = new ButtonList();
....
public ButtonList getButton() {
return button;
}
....
}
ここでは、ButtonList型のプロパティbuttonをデータBeanに作成しています。
・ 選択肢のラベルをビジネスクラスのメソッドで指定するための記述例
public void startup(DispatchContext context) {
String[] ivalue={
"スポーツ","音楽","ドライブ","読書",
"映画鑑賞","園芸","旅行","ギャンブル"
};
MyDataBean dataBean = new MyDataBean();
ButtonList button = dataBean.getButton();
for (int i = 0; i < ivalue.length; i++) button.add(ivalue[i]);
....
context.setResponseBean("body",dataBean);
}
ButtonListクラスのaddメソッドで選択肢を追加します。
- 377 -
・ JSPの記述例
<uji:buttonList bean="body" property="button"
multipleMode="true" columns="3" />
bean, propertyアトリビュートで、buttonプロパティを指定します。columnsアトリビュートには、1行に何個のチェックボックスを表示す
るかを指定します。
フォームが送信されたあと、どの選択肢がチェックされたのかを項目クラスからgetSelectedIndexesメソッドで取得できます。このメソッド
はチェックされている選択肢のインデックスを配列で返します。
・ チェックされた選択肢のインデックスを取得する処理の記述例
public void update(DispatchContext context, MyDataBean dataBean) {
ButtonList button = dataBean.getButton();
int[] indexes = button.getSelectedIndexes();
....
}
ポイント
com.fujitsu.uji.compo.ButtonListModelインタフェースを実装したクラスを作成し、項目クラスとして使用することもできます。
uji:tableViewタグ、uji:treeViewタグで作成した表の特定の列をチェックボックスにする
uji:tableView、uji:treeViewタグで表を作成している場合、dataCellTypeアトリビュートで各列の表示形式をセミコロンで区切って指定で
きます。チェックボックスにする列には表示形式として"check"を指定します。
<uji:tableView bean="body" property="table" dataCellType="data;data;check" />
この記述では、3列目がチェックボックスで表示されます。
チェックボックスに対応するセルの値はBooleanクラスで表します。フォームが送信されると、チェックされたセルの値にはBoolean.TRUE
が、チェックされていないセルの値にはBoolean.FALSEがセットされます。 画面表示時は、セルの値に従ってチェック状態が決定され
ます。
関連項目
・ フォームを作成したい
・ 入力項目を作成したい
・ コレクションタグの利用
・ フィールドタグの利用
・ UJIタグリファレンス
・ APIリファレンスのButtonListクラス
F.1.9
入力項目やボタンの色、サイズ、フォントを指定したい
コンポーネントタグで入力項目やボタンを作成すると、色、サイズ、フォントなどを簡単に指定できます。また、これらの表示属性をビジ
ネスクラスで動的に変更することも可能です。
なお、以下で説明する方法で表示属性を指定しても、ブラウザの機能レベルによって指定が有効にならないものがあります。“UJIタグ
リファレンス”には、各アトリビュートのブラウザでの対応状況をまとめてあります。
タグのアトリビュートで指定する
表示属性を静的に決定できる場合は、タグのアトリビュートで指定します。
- 378 -
<uji:fieldString bean="body" property="strData"
width="120" height="40" background="yellow" foreground="blue"
borderWidth="3" fontSize="12pt" />
この例では、文字列入力フィールドの幅、高さ、背景色、文字色、枠の線幅、文字サイズを指定しています。
各タグで指定可能なアトリビュートの詳細は“UJIタグリファレンス”を参照してください。
項目クラスで指定する
表示属性を動的に変更する場合は、項目クラスを使用します。項目クラスは、タグで入力や表示を行なうデータが格納されるクラスで
す。表示属性を設定することもできます。コンポーネントタグのうち、入力を行なうもの(uji:fieldStringやuji:comboBoxなど)やボタン、リ
ンクを表示するもの(uji:pushButton, uji:anchor)には、それぞれ対応する項目クラスが用意されています。
uji:fieldStringタグで項目クラスを使用する場合を例に説明します。
デ ー タ Bean に は 項 目 ク ラ ス を 値 と す る プ ロ パ テ ィ を 作 成 し ま す 。 uji:fieldString の 場 合 に 使 用 す る 項 目 ク ラ ス は 、
com.fujitsu.uji.compo.FieldStringクラスです。
package sample;
import com.fujitsu.uji.compo.FieldString;
public class BodyBean extends DataBean {
protected FieldString strData = new FieldString();
public FieldString getStrData() {
return strData;
}
...
}
ここでは、FieldString型のプロパティとしてstrDataプロパティを作成しています。
JSPではuji:fieldStringのbean, propertyアトリビュートで、前述のデータBeanのstrDataプロパティを指定してタグに関連付けます。
<uji:fieldString bean="body" property="strData" />
項目クラスには表示属性を設定するためのプロパティがあり、ビジネスクラスなどから表示属性を指定することができます。以下は、文
字色と文字サイズを指定する例です。
BodyBean dataBean = ...;
dataBean.getStrData().setForeground("red");
dataBean.getStrData().setFontSize("12pt");
各タグで使用する項目クラスと、指定可能な表示属性については“UJIタグリファレンス”、“APIリファレンス”を参照してください。
スタイルシートで一括して指定する
入力を行なうコンポーネントタグは、実行時にHTMLのINPUTタグやSELECTタグなどを出力します。これらのタグにスタイルシートで
表示属性を指定することができます。UJIタグが出力するHTMLのタグにクラスの指定 (classアトリビュート) が必要な場合は、UJIタグに
cssアトリビュートでクラスを指定してください。
<style type="text/css">
<!-INPUT.option { color: blue; }
-->
</style>
....
<uji:fieldString bean="body" property="strData" css="option"/>
uji:fieldStringが出力するINPUTタグには、アトリビュートclass="option"が追加されます。
各タグでcssアトリビュートが使用できるかどうかは“UJIタグリファレンス”を参照してください。
- 379 -
スタイルシートの詳細は、カスケーディングスタイルシート関連のドキュメントを参照してください。
関連項目
・ コンポーネントタグを使ったプログラミング
・ UJIタグリファレンス
F.1.10
直接HTMLに記述すると誤動作を招く文字 <, >, &, " を安全に表示させたい
HTMLでは、文字<, >, &, "は特別な意味を持つため、テキストやタグのアトリビュートにこれらの特殊文字が含まれると、ブラウザの表
示が乱れたり、意図しないJavaScriptが実行されるなどの危険があります。
以下のUJIタグは、表示する文字列に<, >, &, "が含まれていると、自動的に&lt;, &gt;, &amp;, &quot;に置き換えて出力するため、特
殊文字の表示による危険が防止されます。
・ 以下のコンポーネントタグ
uji:fieldString, uji:fieldLong, uji:fieldDouble, uji:fieldBigInteger, uji:fieldBigDecimal, uji:fieldDate, uji:fieldTextArea,
uji:checkBox, uji:radioButton, uji:pushButton, uji:label, uji:comboBox, uji:listBox, uji:buttonList, uji:recordView, uji:tableView,
uji:treeView
・ uji:anchorタグ (escapeアトリビュートにfalseを指定した場合を除く)
・ uji:getPropertyタグ (escapeアトリビュートにtrueまたはfullを指定した場合)
アプリケーションの初期化パラメタuji.getProperty.escapeにtrueまたはfullを指定すると、uji:getPropertyタグでescapeアトリビュートを省略
した場合でも特殊文字が置換されます。fullの指定時は上記文字に加えて、半角空白を&nbsp;に置換します。
関連項目
・ UJIタグリファレンス
・ 初期化パラメタ
F.1.11
サブウィンドウを表示したい
ウィンドウ制御機能を使うと、サブウィンドウを利用したアプリケーションの作成が容易になります。例えば、以下のようなアプリケーショ
ンが実現できます。
以降の説明では、「メインウィンドウ」「サブウィンドウ」という用語を次の意味で使用します。
メインウィンドウ
アプリケーションの実行を開始した時にユーザが使用したブラウザのウィンドウを指します。アプリケーションにはメインウィンドウが1
つだけ存在します。
- 380 -
サブウィンドウ
アプリケーションの実行中に開いたり閉じたりするウィンドウです。複数のサブウィンドウが使用できます。
サブウィンドウの利用に必要なプログラミングの要点は以下のとおりです。
・ メインウィンドウ、サブウィンドウそれぞれに制御ページを作成します。
・ 制御ページにはuji:windowControlタグを記述します。
・ WindowControllerクラスとWindowクラスを使って、サブウィンドウを開いたり閉じたりします。
・ フォームを作成するときは、uji:formタグでフォームを作成します。HTMLのFORMタグは使用できません。
制御ページを作成する
メインウィンドウ、サブウィンドウそれぞれに制御ページを作成します。
・ メインウィンドウ用制御ページ
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="subwinError.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD><TITLE>メインウィンドウ</TITLE></HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="mainBody" />
<uji:windowControl/>
</BODY>
</HTML>
・ サブウィンドウ用制御ページ
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="subwinError.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<HEAD><TITLE>サブウィンドウ</TITLE></HEAD>
<BODY>
<uji:dispatch />
<uji:include pane="subBody" />
<uji:windowControl/>
</BODY>
</HTML>
- 381 -
制御ページの作り方はメインウィンドウ、サブウィンドウのどちらでも同じです。 サブウィンドウ利用時の注意点は次のとおりです。
・ uji:includeタグより後、かつ、</BODY>タグより前にuji:windowControlタグを記述します。
・ 領域名(uji:includeタグのpaneアトリビュートで指定する名前)は、メインウィンドウ、サブウィンドウで異なるものを使用します。
入出力ページを作成する
入出力ページの作成方法は、サブウィンドウを利用しない場合とほぼ同じです。 ただし、フォームはuji:formタグで作成してください。HTML
のFORMタグは使用できません。
・ 入出力ページ
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<!-- メインウィンドウ用入出力ページ -->
<uji:useBean id="mainBody" cls="subwin.MainBean" request="true" />
<uji:form name="main" method="post">
<input type="hidden" name="uji.verbs" value="openSub,sendMain,sendMainSub" >
<input type="hidden" name="uji.id" value="mainBody" >
<input type="hidden" name="uji.bean" value="subwin.MainBean">
入力データ:<input name="info" value="<uji:getProperty bean='mainBody' property='info' escape='true'/>">
<INPUT type="submit" name="sendMain" value="送信" >
</uji:form>
サブウィンドウの表示をビジネスクラスで制御する
サブウィンドウの表示をビジネスクラスで制御するために、以下の2つのクラスを使用します。
com.fujitsu.uji.http.Window
ブラウザのウィンドウに対応するクラスです。openメソッド、closeメソッドなどでウィンドウの表示を制御します。
com.fujitsu.uji.http.WindowController
Windowオブジェクトを管理するクラスです。サブウィンドウを新規作成したり、指定した名前のウィンドウに対応するWindowオブジェ
クトを取得したりするために使用します。
どのウィンドウを制御するか指定できるように、各サブウィンドウにはそれぞれ異なるウィンドウ名をつける必要があります。メインウィンド
ウには、固定的に「main」という名前が付けられています。
サブウィンドウを開くには、Windowクラスのopenメソッドを使用します。以下は、ビジネスクラスでサブウィンドウを開く場合の記述例で
す。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void openSubWin(DispatchContext context, MyDataBean dataBean) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
// (1)
Window subWin = wCtrl.createWindow("subWindow");
// (2)
subWin.open("sub.jsp","resizable=yes,width=300,height=300"); // (3)
context.setResponseBean("subBody",new SubDataBean(),true);
// (4)
context.setResponseBean("mainBody",dataBean,true);
// (5)
}
(1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
(2) WindowControllerのcreateWindowメソッドで、新しいサブウィンドウに対応するWindowオブジェクトを作成します。createWindow
の引数にはサブウィンドウ名を指定します。
(3) Windowクラスのopenメソッドでサブウィンドウを開きます。このとき、サブウィンドウで使用する制御ページとウィンドウスタイルを
指定します。ウィンドウスタイルは、JavaScriptのWindowオブジェクトのopenメソッドで使用される形式で記述します。
- 382 -
(4) setResponseBeanメソッドを使って、サブウィンドウで使用する領域にデータBeanを割り当てます。setResponseBeanの第3引数には
trueを指定し、リクエストごとにデータBeanが領域に再設定されるように指示します。
(5) setResponseBeanメソッドを使って、メインウィンドウで使用する領域にデータBeanを割り当てます。(4)と同様に、setResponseBean
の第3引数にはtrueを指定してください。
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが開きます。
サブウィンドウを閉じるには、Windowクラスのcloseメソッドを使用します。以下は、サブウィンドウ上の送信ボタンが押されてビジネスク
ラスが呼び出されたときに、サブウィンドウを閉じる例です。
import com.fujitsu.uji.http.Window;
import com.fujitsu.uji.http.WindowController;
import com.fujitsu.uji.http.HttpDispatchContext;
...
public void closeSubWin(DispatchContext context, MySubDataBean dataBean) {
WindowController wCtrl =
((HttpDispatchContext)context).getWindowController();
// (1)
Window subWin = wCtrl.getWindow("subWindow");
// (2)
subWin.close();
// (3)
}
(1) HttpDispatchContextクラスのgetWindowControllerメソッドで、WindowControllerを取得します。
(2) WindowControllerのgetWindowメソッドで、サブウィンドウの名前を指定して対応するWindowオブジェクトを取得します。(ウィン
ドウを開く時にWindowオブジェクトの作成をしたので、createWindowを実行する必要はありません。)
(3) Windowクラスのcloseメソッドでサブウィンドウを閉じます。
以上のプログラムにより、 ビジネスクラスの実行が終了してブラウザに次の画面が表示されたタイミングで、サブウィンドウが閉じます。
サブウィンドウを閉じると同時に、メインウィンドウの表示を更新したい場合は、上記のメソッドに以下の処理を追加します。
MyDataBean mainBean = new MyDataBean();
mainBean.setValue(dataBean.getValue());
context.setResponseBean("mainBody",mainBean,true);
Window mainWin = wCtrl.getWindow(Window.MAIN_WINDOW);
mainWin.update();
// (4)
// (5)
// (6)
// (7)
(4) メインウィンドウの表示に使うデータBeanを準備します。記述例では新規にインスタンスを作成して、リクエストBeanからデータを
コピーしています。新規作成せずに、セションクラスやビジネスクラスに保存しているデータBeanを使用しても問題ありません。
(5) メインウィンドウで使用する領域にデータBeanを割り当てます。
(6) windowControllerから、メインウィンドウに対応するWindowオブジェクトを取得します。メインウィンドウの名前は"main"に固定さ
れています。この名前はWindowクラスに定数MAIN_WINDOWとして宣言されています。
(7) updateメソッドでメインウィンドウの更新を指示します。
メインウィンドウ上の送信ボタンが押されたときにサブウィンドウを閉じる場合も上記と同様の処理で実現できます。ただし、(7)の処理は
省略できます。
関連項目
・ ウィンドウの制御
・ UJIタグリファレンス
・ APIリファレンスのWindowController クラス
・ APIリファレンスのWindowクラス
- 383 -
F.1.12
Apcoordinatorインストールフォルダにあるタグライブラリディスクリプタをコ
ピーせずに直接使用したい
ujiall.tldなどのタグライブラリディスクリプタを使用する場合、Webアプリケーションを配置したディレクトリにコピーして使用せず、
Apcoordinatorインストールフォルダにあるものを直接使用することができます。
この場合、Webアプリケーション環境定義ファイル(web.xml)のtaglib-location要素で、タグライブラリディスクリプタの場所を絶対パスで
指定します。絶対パスで指定するには、"file:///"で始まるURLを使用します。Windowsの場合、"file:///ドライブ文字:/"がルートディレク
トリを表します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample2.Sample2Factory</param-value>
</context-param>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>file:///c:/APC/lib/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
Solaris, Linuxの場合、"file:///"がルートディレクトリを表します。
....
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
....
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>file:///opt/FJSVwebc/lib/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
関連項目
・ UJIタグを使用したい
F.1.13
コンポーネントタグが作成した入力項目をJavaScriptで参照したい
コンポーネントタグはJSP実行時にHTMLのINPUT, SELECT, TEXTAREAタグを出力して入力項目を作成します。これらのHTMLの
タグを、ユーザが独自に作成したJavaScriptから参照する方法を以下の2通りに分けて説明します。
・ 入力項目で発生したイベントによって呼び出される関数から参照する場合
・ 入力項目のイベントと直接関係がない関数から参照する場合
入力項目で発生したイベントによって呼び出される関数から参照する場合
以下のコンポーネントタグにはeventアトリビュートがあり、イベントの発生によって呼び出される関数を指定できます。
- 384 -
種類
タグ
フィールドタグ
fieldString, fieldLong, fieldDouble, fieldBigInteger, fieldBigDecimal, fieldDate,
fieldTextArea, checkBox, pushButton, radioButton, anchor, label
コレクションタグ
comboBox, listBox, buttonList
eventアトリビュートでJavaScript関数を指定するときに、関数の引数にthisを指定すると、 関数の中で入力項目を参照できます。
<uji:fieldString .... event="onblur='emptyCheck(this)'"/>
<script type="text/javascript">
<!-function emptyCheck(obj) {
if (obj.value == '') {
alert("商品名を入力してください。");
obj.focus();
}
}
// -->
</script>
入力項目のイベントと直接関係がない関数から参照する場合
一般にJavaScriptでは、INPUT, SELECT, TEXTAREAタグのnameアトリビュートに指定した名前で入力項目を参照できます。 しかし、
コンポーネントタグの場合は、入力項目とプロパティを適切に対応付けるためにnameアトリビュートに指定する名前を自動的に生成し
ます。 そのため、名前で入力項目を直接参照するのは困難です。
フォーム内の入力項目には先頭から順にインデックス番号が与えられます。これを利用して、コンポーネントタグで作成する入力項目
を以下の方法で参照できます。
1. 参照したい入力項目に付ける名前を決定します。
2. コンポーネントタグの直前にtype="hidden"を指定したINPUTタグを配置して、1で決定した名前をINPUTタグに付けます。
3. 名前を元に、INPUTタグのフォーム内でのインデックス番号を取得します。
4. その番号+1をインデックス番号とする入力項目がコンポーネントタグによって作成された入力項目です。
上記3,4を実現するJavaScript関数はuji:resourceTextタグを使用して出力させることができます。
uji:comboBoxが出力するSELECTタグを参照する場合を例に説明します。
1. uji:comboBoxタグに名前を付けます。ここでは、destComboという名前をつけることにします。
2. 以下のようにuji:comboBoxタグの直前にINPUTタグを記述します。
<uji:form name="reserveForm" ...>
<INPUT type="hidden" value="destCombo">
<uji:comboBox .... />
....
</uji:form>
INPUTタグのvalueアトリビュートに名前destComboを指定します。nameアトリビュートは省略します。上記の記述はJSP実行時に
以下のようなHTMLを出力します。
<FORM name="reserveForm" ...>
<INPUT type="hidden" value="destCombo">
<SELECT name="uji.model.42445.combo">
<OPTION VALUE="rome">ローマ</OPTION>
....
</SELECT>
....
</FORM>
- 385 -
3. uji:comboBoxの出力するSELECTタグを取得するためのJavaScript関数をHTMLに埋め込みます。この関数は、以下のように
uji:resourceTextタグを使用することによって出力させることができます。
<uji:resourceText id="uji.findElement"/>
この記述は、以下のような関数findElementを出力します。
function findElement(formName, name, idx) {....}
4. 3のfindElementには、第1引数にフォームの名前、第2引数にuji:comboBoxタグの名前を指定します。uji:buttonListタグのように
一つのUJIタグが複数の入力項目を生成する場合は、何番目の項目かを第3引数に指定します。先頭を0番と数えます。
uji:comboBoxのように入力項目が1個の場合は第3引数に0を指定します。以下は使用例です。
var sel;
sel = findElement("reserveForm", "destCombo", 0);
alert(sel.selectedIndex + "番目が選択されました。");
関連項目
・ UJIタグリファレンス
F.1.14
1個のデータBeanを複数の画面で使用したい
データBeanに表示モードを設定すると、同じクラスのデータBeanでも表示する入出力ページを切り替えることができます。
・ データBeanのクラスと表示モードの組に対し、表示する入出力ページのファイル名を指定します。この指定はページマップに記述
します。
・ データBeanに表示モードを設定する処理をビジネスクラスのメソッドに追加します。
ページマップには、以下のようにエントリを追加して、データBeanクラスと表示モードの組に対し、表示する入出力ページのファイル名
を定義します。
・ ページマップの記述例
...
sample.ViewBean;summary=summaryView.jsp
sample.ViewBean;detailed=detailedView.jsp
...
ViewBeanクラスのデータBeanで表示を行う場合、表示モードがsummaryならsummaryView.jspを、detailedならDetailedView.jspを
表示します。
表示モードはcom.fujitsu.uji.DataBeanクラスのsetVerbメソッドで指定します。
・ ビジネスクラスのメソッドで表示モードを指定する例
public void startup(DispatchContext context) {
ViewBean view = new ViewBean();
...
view.setVerb("summary");
context.setResponseBean("body",view);
}
この例では、表示モードとしてsummaryを指定しています。summaryView.jspを使って画面が表示されます。
同様に表示モードを使用して、複数の画面での入力データを1つのデータBeanに格納することができます。
1. 各画面の入力項目に対応付けるプロパティを全てまとめて1つのデータBeanクラスに作成します。
2. 各画面を表示するために使用する表示モードを決めます。
3. ページマップにエントリを追加し、1で作成したデータBeanと2で決めた表示モードの組に対し、表示する入手力ページのファイ
ル名を指定します。
4. データBeanに表示モードを設定する処理を、ビジネスクラスのメソッドに追加します。
- 386 -
以下は、2つの画面A, Bで同じデータBeanを使用し、画面A→画面Bの順に遷移する場合の記述例です。
・ データBeanの記述例
import com.fujitsu.uji.DataBean;
public class InputBean extends DataBean {
// 画面Aの入力項目に対応するプロパティ
protected String userName = null;
protected String address = null;
....
// 画面Bの入力項目に対応するプロパティ
protected String creditCard = null;
protected String expired = null;
....
}
画面A、画面Bで使用するプロパティを1つのデータBeanクラスにまとめて作成しています。(プロパティの値を設定、取得するため
のメソッドの記載は省略しました。)
・ ページマップの記述例
...
sample.InputBean;first=first.jsp
sample.InputBean;second=second.jsp
...
この例は、画面Aの表示に表示モードfirstを、画面Bに表示モードsecondを使用する場合の記述です。
・ ビジネスクラスのメソッドで表示モードを指定する例
public void startup(DispatchContext context) {
InputBean input = new InputBean();
...
input.setVerb("first");
context.setResponseBean("body",input);
}
public void next(DispatchContext context, InputBean dataBean) {
...
dataBean.setVerb("second");
context.setResponseBean("body",dataBean);
}
ブラウザからの初回のリクエストで呼ばれるメソッドstartupでは、表示モードfirstを指定しています。この結果、画面Aが表示されま
す。画面Aの「次へ」ボタンが押されたときに呼び出されるメソッドnextでは、表示モードとしてsecondを指定しています。その結果、
画面Bが表示されます。メソッドnextでは、引数dataBeanに与えられたデータBeanインスタンスをsetResponseBeanメソッドで再び領
域に割り当てています。そのため、画面A、画面Bで入力されたデータは同一のインスタンスに格納されます。
関連項目
・ 表示の処理の流れ
F.1.15
JSPのサイズの制限について知りたい
JSPはJavaに変換されて実行されるため、メソッドのサイズに関するJavaの制約を受けます。Javaのメソッドのサイズには以下の制約が
あります。
・ コードサイズの制約: コンパイル後のメソッドのサイズは64Kバイト以下である必要があります。
・ 分岐範囲の制約: コンパイル後のメソッドにおいて、前後に最大32Kバイトの範囲までしか分岐できません。
JSPのサイズが大きく、Javaに変換された結果が上記の制約を満たさなくなった場合、実行時にエラーが発生する場合があります。
- 387 -
また、実用的な開発、保守を考えた場合の目安として、JSPファイル1個につき200行(内、タグ50個)以内で作成することを推奨します。
JSPサイズが大きくなる場合は、JSPを分割してuji:includeタグでインクルードすることにより、JSPファイル1個あたりのサイズを小さくする
ことができます。
F.1.16
uji:compositeタグを使用したい
サンプルの「model」のソースコードや“16.2.2 各種の画面部品タグ”を参照してください。
繰り返しの項目を簡単に作成したい
F.1.17
表・リスト・ツリーの画面部品タグがあります。以下はそれぞれの画面部品に対して使用するタグをまとめたものです。
画面部品名
使用するタグ
テーブル部品
<uji:table>
<uji:tableRenderer>
リスト部品
<uji:list>
<uji:listRenderer>
ツリー部品
<uji:tree>
<uji:treeRenderer>
タグの詳細な利用方法は“UJIタグリファレンス”を参照してください。
F.1.18
画面部品タグを使いたい
表の場合は以下のようにします。
1. beanにTableModelのプロパティを作成します。以下のようにします。
- データBeanの例(抜粋)
protected ScheduleModel scheduleTable;
....
public ScheduleModel getScheduleTable() {
return scheduleTable;
}
public void setScheduleTable(ScheduleModel scheduleTable) {
this.scheduleTable = scheduleTable;
}
2. TableModelを実装したクラスを作成します。
implements com.fujitsu.uji.model.table.TableModelをクラス名の直後に記述したあと、以下の6つのメソッドを実装します。
- getColumnCount()
- getRowCount()
- getValueAt(int row, int col)
- getColumnClass(int row, int col)
- getRowClass(int row)
- setValueAt(java.lang.Object val, int row, int col)
3. <uji:table>タグを書いて、<uji:tableRenderer>で展開形を指定します。
- データBeanの例(抜粋)
<uji:table bean="body" property="scheduleTable">
<uji:tableRenderer type="table" >
<TABLE height="160" border="2" width="100%">
<uji:children/>
- 388 -
</TABLE>
</uji:tableRenderer>
<uji:tableRenderer type="column" cls="empty" >
<TD>&nbsp;</TD>
</uji:tableRenderer>
</uji:table>
<uji:tableRenderer type="table" >の中ではテーブル全体の属性の定義を行います。<uji:tableRenderer type="column"
cls="empty" >の中ではテーブルのカラムの要素のうち"empty"と印のついたもの(正確にはgetRowClass(int row)の返す文
字列)について、空白表示を行うと言う意味です。そのほかの要素については、デフォルトで要素の値をそのまま表示しま
す。
F.1.19
テーブルの行ごとに色を変更したい
最初に、TableModelを実装したクラスで、行ごとに偶数行なら"even",奇数行なら"odd"を返すように印をつけます。以下のようにします。
・ TableModelを実装したクラスの例(抜粋)
public String getRowClass(int row) {
return (row % 2 == 0) ? "even" : "odd";
}
次に、JSP側で偶数行か奇数行かを見て表示を変えます。以下のようにします。
・ 表を表示するJSPの例(抜粋)
<uji:tableRenderer type="row" cls="even">
<TR bgcolor="lightgrey"><uji:children/></TR>
</uji:tableRenderer>
<uji:tableRenderer type="row" cls="odd">
<TR bgcolor="white"><uji:children/></TR>
</uji:tableRenderer>
F.1.20
画面部品タグで使用するクラスを簡単に作成したい
Interstage StudioのJavaクラス生成ウィザードを使い、クラスの選択でTableModelインタフェースを選択、継承された抽象メソッドにチェッ
クを入れてクラスを作成すると、空のメソッドができます。リスト部品も同様の方法でListModelインタフェースを実装することにより、リスト
の表示に必要なメソッドを実装します。
F.1.21
テーブル幅を画面と同じ幅に指定したい
テーブルレンダラの「type="table"」内部でテーブルの大きさを決める属性を埋め込むことができます。以下の記述で高さと、線種、横
幅の比率の指定ができます。
<uji:tableRenderer type="table" >
<TABLE height="160" border="2" width="100%">
<uji:children/>
</TABLE>
</uji:tableRenderer>
F.1.22
複数画面でデータBeanを共有したい
同一のデータBeanでも、表示モードを設定することによって入出力ページを切り替えることができます。データBeanのメソッド
setVerb("表示モード") で表示モードの設定を行います。ページマップ(pages.map)には、表示に使う入出力ページと表示モードの対
応を以下の形式で記述します。
データBeanのクラス名;表示モード=入出力ページのファイル名
以上の方法で、同一のクラスのデータBeanでも、setVerbで設定した表示モードによって異なる入出力ページが使用されますので、画
面間でのデータBeanの共有が可能になります。また、データBeanの一部のプロパティのみを表示させたい場合には、表示させたいプ
ロパティについてのみ対応するタグを入出力ページに記述します。
- 389 -
フレームおよびサブウィンドウを表示したい
F.1.23
サブウィンドウを使ったアプリケーションはuji:windowControlタグを使用すると容易に作成できます。“16.6 ウィンドウの制御”やサンプルの
「subwin」を参照してください。フレームを使ったアプリケーションは、uji:frameタグを使用すると容易に作成できます。“16.7 フレームの
制御”やサンプルの「frame」を参照してください。
例外発生時にエラー画面を表示したい
F.1.24
JSPのpageディレクティブ(<%@ page errorPage=…>)が使用できます。また、uji:dispatchタグのerrorPageアトリビュートでエラー画面のJSP
ファイル名を指定することも可能です。詳細は“4.2 エラー処理”を参照してください。
画面を表示したい
F.1.25
以下の事を行う必要があります。
1. ビジネスクラスの中で"setResponseBean()"メソッドを実行します。最初の引数は画面領域名でもうひとつは対応付けるBean名で
す。Beanに複数の画面を対応づけるためには上記に加えて"setVerb()"メソッドを追加します。"setVerb"の引数には、「表示モー
ド」と呼ばれる、対応する画面を表す別名を記述します。
- setResponseBean()とsetVerb()を実装したメソッドの例(抜粋)
public void showUserSchedule(DispatchContext context, ProfileBean dataBean) {
.....
//選択された課員の予定を表示する
scheBean.setVerb("userschedule");
context.setResponseBean("body",scheBean);
......
}
2. 次に、"pages.map"ファイルを編集します。上で記述したデータBeanと表示モードの組に加えて、表示したい入出力ページ名を
記述します。以下の例は、userschedule.jspを表示したい入出力ページに割り付ける例です。
- pages.mapの例(抜粋)
# pages.map
....
board.ScheduleBean;userschedule=userschedule.jsp
....
上記の処理でbody領域にuserschedule.jspが表示されます。
F.2
F.2.1
Webアプリケーションの入力チェック
入力項目に入力されたデータが適切かどうかチェックしたい
ブラウザ上でフォームの送信直前にチェックする方法と、サーバ側でチェックする方法とがあります。
ブラウザ上でチェックする(フィールドタグ)
フィールドタグ、クライアントスクリプトタグを使用すると、入力された文字種や値の範囲をチェックできます。チェックはフォームが送信
されるときに行なわれ、チェックでエラーになった場合は警告を表示し送信を中止するといった処理が可能です。
フィールドタグでチェックを行なう場合は、タグのアトリビュートでチェック内容を指定します。フォームはuji:formタグで作成します。以下
は、入力値の上限と下限を指定する例です。
<uji:form name="order" method="post" ... >
...
数量: <uji:fieldLong bean="body" property="longData"
minimumValue="0" maximumValue="100"
infoText="数量は0以上100以下で入力してください。" />
- 390 -
...
</uji:form>
入力値が0未満の場合、100を超える場合は、送信ボタンを押した時に以下のようなダイアログボックスが表示され、送信は中止されま
す。
フィールドタグで可能なチェック内容は以下の表のとおりです。対応しているチェック内容はタグにより異なります。個々のタグについて
は“UJIタグリファレンス”を参照してください。
チェック内容
指定するアトリビュート
字数
文字数が指定した字数以下である
maxLength, maxByteLength
有効文字種
指定した文字種(英字、英数字、日本語文字など)
のみ入力されている
enableCharType
有効文字
正規表現で指定した形式に合っている
enableChars
最大値, 最小値
数値が指定した範囲内である
maximumValue, minimumValue
必須入力
入力値が空でない
indispensableField
全桁入力
指定字数が入力されている
fullField
整数部、小数部の最
大桁数
実数の整数部、小数部の桁数が指定の桁数以下
である
maxIntegerDigit, maxDecimalDigit
チェック内容をタグのアトリビュートではなく、項目クラスで指定することもできます。項目クラスで指定すると、チェック内容をビジネスク
ラスで指定することが可能になります。項目クラスについては、“16.4.2 フィールドタグの利用”を参照してください。
ブラウザ上でチェックする(クライアントスクリプトタグ)
クライアントスクリプトタグを使ったチェックでは、チェックでエラーとなった場合の動作をJavaScriptで記述することができます。また、
チェックをするタイミングを指定できます。入力項目をuji:input, uji:select, uji:textareaタグで作成した場合に、この方法が利用できます。
チェック内容はuji:validateタグまたはuji:actionタグで記述します。
・ uji:validateタグは最大値、最小値のチェックなど、あらかじめ準備された数種のチェックをしたい場合に使用します。コンテントに
は、チェックでエラーとなった場合に実行するJavaScriptを記述します。
・ uji:actionタグはチェック内容をJavaScriptで自由に記述できます。JavaScriptはコンテントに記述します。
これらのタグは、チェックの対象となるuji:input, uji:select, uji:textareaタグのコンテントに記述します。
また、HTMLのFORMタグの代わりにuji:formタグでフォームを作成する必要があります。
・ 入力項目がフォーカスを失ったときに入力値をチェックして、エラーならステータスバーにメッセージを表示する例
<uji:form name="someform" method="post" ... >
入力項目:
<uji:input name="someinput">
<uji:validate event="blur" type="int" minInclusive="10" maxInclusive="20" >
window.status="入力項目には10~20の整数を指定せよ";
target.focus();
</uji:validate>
</uji:input>
....
</uji:form>
- 391 -
uji:validateのeventアトリビュートには、チェックの契機となるイベントを指定します。type="int"は入力が数値であることを、minInclusive,
maxInclusiveの指定は入力が10以上20以下であることをチェックします。チェックがエラーとなった場合はuji:validateのコンテント
に書かれたJavaScriptが実行されます。このJavaScriptの中では、入力項目であるINPUTタグのオブジェクトをtargetという変数名で
参照できます。
・ フォーム送信前に入力値をチェックして、特定の値の場合はステータスバーにメッセージを表示する例
<uji:form name="someform" method="post" ... >
入力項目:
<uji:input name="someinput">
<uji:action event="..submit">
if(target.value == 15) {
window.status="この場合15は指定できない";
target.focus();
return false;
}
</uji:action>
</uji:input>
....
</uji:form>
uji:actionのeventアトリビュートには、チェックの契機となるイベントを指定します。"..submit"はフォームの送信を意味します。このイ
ベントの発生時にuji:actionのコンテントに記述したJavaScriptが実行されます。このJavaScriptの中では、入力項目であるINPUTタ
グのオブジェクトをtargetという変数名で参照できます。JavaScriptがfalseを返して終了すると、フォームの送信を中止します。trueの
場合は続行します。
クライアントスクリプトタグを使用する場合の注意事項や、 uji:validate, uji:actionの詳細は、“UJIタグリファレンス”、“16.3 クライアントス
クリプト”を参照してください。
サーバ側でチェックする
サーバ側でチェックする場合は、ビジネスクラスのメソッドで、受け取ったデータBeanをチェックします。チェックの内容はJavaでプログ
ラムすることもできますが、ApcoordinatorのXMLデータ仕様記述を使用してチェックすることもできます。 XMLデータ仕様記述を使う
と、チェックの内容をXMLで定義できます。そのため、チェック内容が変更された場合でも、プログラムを変更と再コンパイルが不要で
あり保守性の向上が期待できます。
ポイント
チェックの実行速度を重視する場合には、チェック内容を記述したXMLから、そのチェックを実行するJavaソースを生成することもでき
ます。Javaソースの生成にはXMLデータ仕様記述コンパイラ を使用します。
データのチェックを行うには、以下のようにアプリケーションを作成します。
・ チェックの内容をXMLで定義します。
・ ビジネスクラスのメソッドで、そのXMLファイルとチェック対象のデータBeanを指定してチェックの実行を指示します。
チェックの基本的な記述方法を以下の例で説明します。チェックはXMLデータ仕様記述ファイルにXMLで記述します。XMLデータ
仕様記述については“第11章 XMLデータ仕様記述”を参照してください。ここでは基本的な使い方を説明します。
<?xml version="1.0" encoding="Shift_JIS"?>
<eSpec
xmlns=http://interstage.fujitsu.com/schemas/uji/eSpec
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec
http://interstage.fujitsu.com/schemas/uji/espec.xsd">
<!-- checkValue という名前の仕様を定義 -->
<specification name="checkValue">
<!-- check1, check2 セクションをこの順で実行する-->
<control>
<validate section="check1"/>
<validate section="check2"/>
</control>
- 392 -
<!-- check1セクションの処理 (0~100のデータをチェックする)-->
<section name="check1">
<!-- プロパティ"value" が 0以上のとき-->
<block property="value" function="int" op="GE" operand="0">
<!-- かつプロパティ"value" が 100以下のとき 指定メッセージの例外を投げる-->
<term property="value" op="LE" operand="100" exception="#valueは0~100の間です"/>
</block>
</section>
<!-- check2セクションの処理 -->
<section name="check2">
....
</section>
</specification>
<!-- 別の仕様を定義 -->
<specification name="nextSpec">
....
</specification>
</eSpec>
XMLデータ仕様記述ファイルには、specificationタグで仕様を定義します。1つの仕様は、複数のチェック内容をまとめたものです。ビ
ジネスクラスからは、どの仕様を使うのかを指定してチェックを実行します。1つの仕様の中には、セクションを必要なだけsectionタグで
記述します。セクションは1つのチェック内容を定義したものです。例えば、「valueプロパティの値が0以上100以下である」「textプロパ
ティの値がnullや空文字列ならばエラー」といったチェック内容をそれぞれセクションとして記述します。
セクションの処理順序はcontrolタグのコンテントに書いたvalidateタグで定義します。validateのsectionアトリビュートでセクションの名前
を指定します。validateを記述した順番でセクションが処理されます。
セクションで処理するチェックの内容は、termタグ、verifyタグなどで記述します。これらのタグは、チェック内容を「プロパティ□□に対
して、条件○○が成立した場合に××する。」というように「プロパティ(□□)」と、チェックが成立する「条件(○○)」と、条件を満たし
た場合もしくは満たさなかった場合の「結果(××)」をセットで定義します。termタグでは条件を満たした場合の結果を、verifyタグでは
満たさなかった場合の結果を定義します。
以下のtermタグでは、チェック対象のプロパティは「value」(property="value")、条件は「100以下」(op="LE" operand="100")、条件が成
立した場合「例外を発生」(exception="...")することを意味します。exceptionに指定した文字列は例外のクラス(ESpecResultException)の
getStatusTextメソッドによって取得できます。
<term property="value" op="LE" operand="100" exception="#valueは0~100の間です"/>
blockタグは、アトリビュートで指定した条件を満たす場合にだけ、blockのコンテントに書いたチェックを処理することを意味します。
XMLデータ仕様記述で使用するタグの詳細は、“定義ファイルリファレンス”を参照してください。
チェックの実行方法を以下の例で説明します。
import
import
import
import
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.xscript.ESpecValidator;
com.fujitsu.uji.xscript.ESpecResultException;
com.fujitsu.uji.xscript.ESpecException;
public void processOrder(DispatchContext context, OrderBean bean) {
....
ESpecValidator validator =
ESpecValidator.getInstance(this.getClass().getClassLoader());
// (1)
validator.setInfLoader(context.getApplicationProfile().getInfLoader()); // (2)
validator.setXml("checkPrice.xml");
try {
validator.validate("checkValue", bean);
}
catch (ESpecResultException e) {
System.out.println(e.getStatusText());
}
catch (ESpecException e) {
// (3)
// (4)
// exception= で指定した文字列を出力
- 393 -
System.out.println(e.toString());
// ランタイムエラーの出力
}
....
}
(1) チェック定義エンジン(com.fujitsu.uji.xscript.ESpecValidator)を生成します。
(2) チェック定義エンジンにInfLoader (com.fujitsu.uji.util.InfLoader) をセットします。InfLoaderは設定ファイルフォルダからファイル
を読み込むためのクラスです。設定ファイルフォルダは、コマンドマップ、リモートマップなどApcoordinatorの定義ファイルを置くフォ
ル ダ で す 。 例 え ば 、 Web ア プ リ ケ ー シ ョ ン の 場 合 は WEB-INF フ ォ ル ダ で す 。 InfLoader は ア プ リ ケ ー シ ョ ン ク ラ ス
(com.fujitsu.uji.ApplicationProfile) のgetInfLoaderメソッドで取得できます。アプリケーションクラスはcom.fujitsu.uji.DispatchContext
クラスのgetApplicationProfileメソッドで取得できます。
(3) 使用するXMLデータ仕様記述ファイルを指定します。ファイル名は、設定ファイルフォルダからの相対パスで指定します。
(4) (3)で生成したエンジンにデータBeanと仕様の名前(specificationタグで指定したもの)を指定してチェックを実行します。チェック
内容に従って例外の発生が指示された場合には、ESpecResultExceptionが発生します。
関連項目
・ 入力項目に入力できる字数を制限したい
・ コンポーネントタグが作成した入力項目をJavaScriptで参照したい
・ フィールドタグの利用
・ XMLデータ仕様記述
・ APIリファレンスのESpecValidatorクラス
・ APIリファレンスのESpecResultExceptionクラス
・ UJIタグリファレンス
・ 定義ファイルリファレンス
F.2.2
入力項目に入力できる字数を制限したい
以下のUJIタグでは、入力できる最大字数をアトリビュートによって指定できます。
タグ
字数を指定するアトリビュート
uji:input
maxlength
uji:fieldString, uji:fieldLong, uji:fieldDouble, uji:fieldBigInteger,
uji:fieldBigDecimal, uji:fieldDate
maxLength, maxByteLength
maxlength, maxLengthは入力できる最大字数を、maxByteLengthは最大バイト数を指定します。
以下は記述例です。
・ 最大入力字数を5文字に制限
<uji:fieldString bean="body" property="stringData" maxLength="5"/>
・ 最大入力字数を10バイトに制限
<uji:fieldString bean="body" property="stringData" maxByteLength="10"/>
2バイト文字の場合は5文字まで入力できます。
関連項目
・ 入力項目に入力されたデータが適切かどうかチェックしたい
・ フィールドタグの利用
・ UJIタグリファレンス
- 394 -
F.3
Webアプリケーションの画面遷移
F.3.1
ブラウザの「戻る」ボタンを無効にしたい
JSPにuji:resourceTextタグを記述することにより、ブラウザの「戻る」ボタンの使用を擬似的に防止することができます。
・ 制御ページ記述例
<%@ page contentType= "text/html; charset=shift_jis" %>
<%@ page errorPage="subwinError.jsp" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<HTML>
<BODY>
<uji:dispatch />
<uji:include pane="mainBody" />
<uji:resourceText id="uji.disableBack"/>
</BODY>
</HTML>
「戻る」ボタンによって表示させたくない画面に、上記のタグを記述してください。ユーザが「戻る」ボタンを押した場合、自動的に「進
む」ボタンが押されたのと同じ効果が得られます。結果として、「戻る」ボタンを押しても画面は最新の状態に保たれます。
uji:resourceTextは、外付けのファイルに記述したユーザ定義のテキストを出力するタグです。idアトリビュートに"uji."で始まる名前を指
定すると、Apcoordinatorによってあらかじめ定義されているテキストが出力されます。
参考
uji:resourceTextは、id="uji.disableBack"を指定すると以下のJavaScriptを出力します。このJavaScriptにより、「戻る」ボタンの使用を擬
似的に防止します。
<script type="text/javascript">
<!-history.forward();
window.focus();
// -->
</script>
関連項目
・ 予期しない画面からのフォームの送信を検出したい
・ UJIタグリファレンス
F.3.2
ブラウザの「更新」ボタンを無効にしたい
ブラウザの「更新」ボタンは前回送信したリクエストを再度ブラウザに送信するため、クライアント側で抑止することはできませんが、リク
エストの正当性検証機能を用いることで不当な画面からのリクエストとして検出することが可能です。リクエスト正当性検証機能の詳細
については“F.3.3 予期しない画面からのフォームの送信を検出したい”を参照してください。
関連項目
・ 予期しない画面からのフォームの送信を検出したい
・ リクエストの検証
F.3.3
予期しない画面からのフォームの送信を検出したい
ブラウザのキャッシュ内の画面が再利用されることにより、予期しないページからリクエストが送信される場合があります。これをApcoordinator
で検出することができます。予期しない画面からのリクエストを検出することを、以降では、リクエストの正当性検査と呼びます。
- 395 -
ブラウザの仕様に依存しますが、以下の場合には再利用された画面からリクエストが送信されることがあります。
・ ブラウザの「戻る」ボタンを押すと、キャッシュ内の画面が再度表示されます。この状態で送信ボタンなどによりフォームを送信する
と、再利用された画面からリクエストが送信される結果となります。
・ 過去にGETメソッドによるリクエストを送信して画面を取得したことがある場合、そのリクエストと同じURLでアクセスした場合に画面
が再利用されることがあります。この状態でフォームを送信すると、再利用された画面からリクエストが送信される結果となります。
リクエストの正当性検査により、上記のようなリクエストが検出できます。
リクエストの正当性検査を有効にすると、Apcoordinatorによって以下の処理が行なわれます。
・ Webアプリケーションが最後にブラウザに送信した画面からリクエストを受信した場合は、ビジネスクラスの呼び出しを実行します。
・ それ以外の画面からのリクエストを受信した場合は、ControlStateExceptionをスローします。このとき、ビジネスクラスは呼び出され
ません。
リクエストの正当性検査を有効にするには、アプリケーションを以下のように作成します。
1. HttpControlStateProfileクラスを継承して、ユーザ定義のセションクラスを作成します。
2. すべてのフォームにuji:controlStateタグを追加します。
3. 予期されないページからのリクエストを検出した場合に実行する処理を追加します。
ユーザ定義のセションクラスを作成する
ユーザ定義のセションクラスをcom.fujitsu.uji.http.HttpControlStateProfileクラスを継承して作成します。また、isPageCheckEnabled メソッ
ドをオーバライドしてtrueを返却するようにします。このメソッドは、リクエストの正当性検査を有効にするかどうかを指定するものです。
public class SampleSession extends com.fujitsu.uji.http.HttpControlStateProfile {
public boolean isPageCheckEnabled() {
return true;
}
}
なお、ユーザ定義のセションクラスを有効にするために、以下の作業が必要になります。具体的な方法は“3.5 ファクトリクラス”を参照し
てください。
・ ファクトリクラスを作成し、ユーザ定義セションクラスのオブジェクトが作成されるようにします。
・ 初期化パラメタでファクトリクラスのクラス名を指定します。Webアプリケーションの初期化パラメタはWebアプリケーション環境定義
ファイル(web.xml)に記述します。
フォームにuji:controlStateタグを追加する
すべてのフォームにuji:controlStateタグを追加します。 1画面に複数のフォームがある場合、全てのフォームにuji:controlStateを記述し
てください。
<uji:form ...>
<uji:controlState />
...
</uji:form>
予期されないページからのリクエストを検出した場合の処理を追加する
Webアプリケーションが最後に送信した画面以外からリクエストが送信された場合、com.fujitsu.uji.ControlStateExceptionが発生しま
す。この例外をキャッチして処理を実行するには、セションクラスまたはアプリケーションクラスのhandleExceptionメソッドに処理を記述
してください。例外が発生すると、handleExceptionメソッドが呼び出されます。
・ セションクラスに例外処理を追加する例
import com.fujitsu.uji.ControlStateException;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.http.HttpControlStateProfile;
public class SampleSession extends HttpControlStateProfile {
- 396 -
public boolean isPageCheckEnabled() {
return true;
}
public Object handleException(DispatchContext context, Throwable th) throws Throwable {
if (th instanceof ControlStateException) {
// (1)
context.setResponseBean("body", new ErrorBean()); // (2)
} else {
throw th;
// (3)
}
return null;
}
}
この例では、予期されないページからリクエストがあった場合にユーザが定義したエラーページを表示させます。処理の内容は次
のとおりです。
(1) 発生した例外はhandleExceptionの引数thに与えられます。例外がControlStateExceptionの場合のみ、目的の処理を実行
するようにプログラムします。handleExceptionは、ビジネスクラスの呼び出しで発生した例外をまとめて処理するためのメソッドで
あり、ControlStateException以外の例外が引数に与えられる場合があります。
(2) ユーザ定義のエラー画面を表示させるため、エラー画面用のデータBeanを適切な領域に割り当てます。
(3) ControlStateException以外の例外は再度スローするか、例外の種類に応じた適切な処理を行ないます。
ポイント
サブウィンドウを利用したアプリケーションでリクエストの正当性検査を行う場合は、ウィンドウ制御機能を使ってサブウィンドウの表示を
制御してください。また、フレームを利用したアプリケーションの場合は、uji:frameタグを使ってフレームを作成してください。ウィンドウ
制御機能やuji:frameタグを使った場合、リクエストの正当性検査は各ウィンドウ、各フレームごとに行われます。
ウィンドウ制御機能やuji:frameタグを使わずにサブウィンドウやフレームを作成し、かつ、リクエストの正当性検査を行う場合は、いずれ
か一つのウィンドウまたはフレームだけでリクエストの正当性検査を行うことができます。検査を行うウィンドウやフレームにはuji:controlState
タグを記述し、それ以外のウィンドウやフレームに表示されるフォームにはuji:controlStateタグを記述しないでください。
関連項目
・ サブウィンドウを表示したい
・ 高度なセション管理
・ エラー処理
F.3.4
1つ前の画面に戻る処理を実現したい
1つ前の画面を表示させる処理は1つ前の画面で使用したデータBeanを領域に割り当てることで実現できます。通常、領域にデータBean
を 割 り 当 て る に は com.fujitsu.uji.DispatchContext ク ラ ス の setResponseBean メ ソ ッ ド を 使 用 し ま す が 、
com.fujitsu.uji.http.HttpDispatchContextクラスのpopBeanBackupメソッドを使用すると以前に使用したデータBeanを簡単に再割り当て
できます。
画面に「戻る」ボタンを作成し、そのボタンが押されると前の画面に戻るアプリケーションを例に説明します。このアプリケーションで、
popBeanBackupメソッドを使用して以下の図のような画面遷移が実現できます。
- 397 -
画面Aの次に画面Bが表示され、画面Bに設置した「戻る」ボタンを押すと画面Aに戻るという遷移です。
画面Aを表示させるために、ビジネスクラスではMenuBeanクラスを領域に割り当てるとします(図の(X)のメソッド)。この処理は以下のよ
うな記述になります。
public void startup(DispatchContext context) {
MenuBean menuBean = new MenuBean();
....
context.setResponseBean("body",menuBean);
}
同様に、画面Bを表示させるために、ビジネスクラスでInputBeanを領域に割り当てるとします(図の(Y)のメソッド)。
public void input(DispatchContext context, MenuBean dataBean) {
InputBean inputBean = new InputBean();
....
context.setResponseBean("body",inputBean);
}
図の(Z)のメソッドで、以下のようにpopBeanBackup(1)を実行することにより、画面Aが再び表示されます。
public void back(DispatchContext context, InputBean dataBean) {
((HttpDispatchContext)context).popBeanBackup(1);
}
Apcoordinatorは領域に割り当てられたデータBeanを保存するためのスタックを持っており、リクエストごとにデータBeanを保存していま
す。popBeanBackupメソッドはスタックに保存されたデータBeanを取り出して領域に再割り当てします。
popBeanBackupの引数には、スタックから捨てる画面の数を指定します。上記図の(Z)の時点では、スタックに保存されているデータBean
は以下の図のようになっています。
- 398 -
popBeanBackupの引数に1を指定すると、スタックの先頭にある画面B用のデータBeanが捨てられ、画面A用のデータBeanが領域に割
り当てられます。その結果、画面Aが表示されます。仮にpopBeanBackupの引数に0を指定したとすると、スタックから何も捨てられない
ため、画面Bが表示されることになります。
スタックのサイズはデフォルトで5です。この値を変更する方法については“13.3 初期化パラメタ”を参照してください。保存されている
画面の数がこの指定を超えると、古いものから順に消去されます。
注意
スタックにはデータBeanのコピーが保存されるのではなく、データBeanそのものが保存されます。したがって、データBeanの中のデー
タを書き換えた場合には、popBeanBackupメソッドを使って戻した画面には書き換えられたデータが表示されます。
関連項目
・ APIリファレンスのHttpDispatchContextクラス
・ 初期化パラメタ
・ 表示の処理の流れ
F.3.5
HTMLのAタグを利用して画面遷移を行いたい
フォーム使用時に<input type="hidden">タグで送信されるのと同じリクエストパラメタが送信されるようにAタグのURLを記述します。URL
の後に?に続けてリクエストパラメタ名とその値を記述してください。以下に記述例を示します。
<a href="main.jsp?uji.id=body&uji.bean=examples.bean.Login&uji.verb=worklist">
Show Worklist
</a>
F.4
F.4.1
Webアプリケーションのセション管理
セション管理の基本的な方法を知りたい
Apcoordinatorでは、セション管理の仕組みを提供しています。セションは、クライアントごとに1個作成されます。同じクライアントから続
けてリクエストがある場合、これらは同じセションに属します。異なるクライアントからのリクエストは別のセションとして区別されます。
Apcoordinatorでは、セションを表すクラスとしてセションクラスを使用します。ユーザ定義のセションクラスを作成することによって、クラ
イアント別にデータを保持することができます。
ビジネスクラスをセションスコープとして宣言すると、ビジネスクラスのオブジェクトはセションごとに作成され、セションが終了するまで保
存されます。したがって、クライアント別のデータをセションスコープのビジネスクラスに保持することもできます。
また、全てのセションに共通のデータを管理するクラスとして、アプリケーションクラスを使用します。ユーザ定義のアプリケーションクラ
スを作成することにより、全クライアントで共有するデータをアプリケーションクラスに保持することができます。
データの種類に応じて、データを保持するクラスを以下のように選択してください。
データの種類
データを保持するクラス
各クライアントごとに使用するデータで、1つのビジネスクラスだけで使用する
もの
- 399 -
セションスコープのビジネスクラス
データの種類
データを保持するクラス
各クライアントごとに使用するデータで、複数のビジネスクラスで共有するもの
セションクラス
全クライアントで共有するデータ
アプリケーションクラス
注意
1台のクライアントで複数のブラウザを使用している場合、ひとつのセションとして実行されるか、ブラウザごとにセションが作成されるか
は、ブラウザによって異なります。
ビジネスクラスをセションスコープとして宣言する
ビジネスクラスをセションスコープとして宣言するには、ビジネスクラスのinitメソッドをオーバライドし、trueを返却するようにします。
public class SampleHandler extends GenericHandler {
public boolean init() {
return true;
}
....
}
セションスコープとして宣言したビジネスクラスは、最初にクラスが呼ばれたときに作成され、セションが終了するまで同じインスタンスが
使われます。 ビジネスクラスのインスタンス変数は、クライアント別に用意するデータを保持する目的で使用できます。
セションスコープを持つビジネスクラスのインスタンスをセションから切り離すには、セションクラス (com.fujitsu.uji.SessionProfileクラス) の
clearHandlersメソッドを呼び出してください。
ユーザ定義のセションクラスを作成する
ユーザ定義のセションクラスは以下のように作成します。
1. com.fujitsu.uji.HttpSessionProfileクラスを継承して、セションクラスを作成します。また、クライアント別のデータを保持する変数を
追加します。
package sample;
public class SampleSession extends com.fujitsu.uji.http.HttpSessionProfile {
protected String userId = null;
}
この例では、ユーザIDを保持するための変数userIdを追加しています。
2. ファクトリクラスを作成します。ファクトリクラスは、アプリケーションクラス、セションクラスのインスタンスを作成するクラスです。
com.fujitsu.uji.Factoryインタフェースを実装する必要がありますが、com.fujitsu.uji.http.HttpFactoryクラスを継承して作成すると
便利です。
- 400 -
3. ファクトリクラスのnewSessionProfileメソッドを実装し、ユーザ定義のセションクラスを生成して返却するようにします。
package sample;
import com.fujitsu.uji.SessionProfile;
public class SampleFactory extends com.fujitsu.uji.http.HttpFactory {
public SessionProfile newSessionProfile() {
return new SampleSession();
}
}
4. ファクトリクラスのクラス名は初期化パラメタfactoryで指定します。初期化パラメタはWebアプリケーション環境定義ファイル (web.xml)
のcontext-paramタグに記述します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample.SampleFactory</param-value>
</context-param>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
セションクラスをセションから切り離す方法については、“F.4.5 明示的にセションを終了させたい”を参照してください。
ユーザ定義のアプリケーションクラスを作成する
ユーザ定義のアプリケーションクラスも、セションクラスと同様の手順で作成します。
1. com.fujitsu.uji.ApplicationProfileクラスを継承してアプリケーションクラスを作成します。また、全クライアントで共有するデータを
保持する変数を追加します。
package sample;
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile {
protected int accessCount = 0;
}
この例では、ユーザIDを保持するための変数userIdを追加しています。
2. ファクトリクラスを作成します。そのnewApplicationProfileメソッドをオーバライドし、ユーザ定義のアプリケーションクラスを生成し
て返却するようにします。
package sample;
import com.fujitsu.uji.SessionProfile;
public class SampleFactory extends com.fujitsu.uji.http.HttpFactory {
public ApplicationProfile newApplicationProfile() {
return new SampleApplication();
}
}
3. ファクトリクラスのクラス名は初期化パラメタfactoryで指定します。初期化パラメタはWebアプリケーション環境定義ファイル (web.xml)
のcontext-paramタグに記述します。
関連項目
・ 明示的にセションを終了させたい
- 401 -
・ セション管理
・ Webアプリケーション環境定義ファイル(web.xml)
・ APIリファレンスのApplicationProfileクラス
・ APIリファレンスのHttpSessionProfileクラス
・ APIリファレンスのFactoryインタフェース
・ APIリファレンスのHttpFactoryクラス
・ APIリファレンスのGenericHandlerクラス
F.4.2
タイムアウトを検出したい
セション開始後、一定時間ブラウザからのリクエストがないとタイムアウトが発生し、セションに関連付けられたデータは失われます。そ
のため、タイムアウト後にブラウザからのリクエストを受信しても正常に処理が行なえない場合があります。
タイムアウト後にリクエストを受信した場合に特定の処理を実行させるには、以下のようにアプリケーションを作成します。
1. タイムアウトした場合に実行するメソッドを追加します。
2. 上記メソッドを呼び出すためのコマンドを定義します。
3. ユーザ定義のアプリケーションクラスを作成します。
4. アプリケーションクラスのnotifyBeanLostメソッドをオーバライドします。
1. タイムアウトした場合に実行するメソッドを追加する
タイムアウト後にリクエストを受信した場合の処理を実行するメソッドをビジネスクラスに作成します。
public class SampleHandler extends GenericHandler {
public void timeoutProcess(DispatchContext context) {
// タイムアウトの処理を記述
...
}
}
引数は1個で、型はDispatchContextにします。
2. タイムアウトした場合のメソッドを呼び出すコマンドを定義する
上記メソッドを呼び出すためのコマンドを定義します。そのコマンドと1のメソッドの対応付けをコマンドマップに記述します。
;timeout=sample.SampleHandler.timeoutProcess
この例では、コマンドをtimeoutとしました。データBeanなし、コマンドtimeout の対を1で定義したメソッドに対応づけます。
3. ユーザ定義のアプリケーションクラスを作成する
com.fujitsu.uji.ApplicationProfileクラスを継承してユーザ定義のアプリケーションクラスを作成します。
なお、ユーザ定義のアプリケーションクラスを有効にするために、以下の作業が必要になります。具体的な方法は“3.5 ファクトリクラス”
を参照してください。
・ ファクトリクラスを作成し、ユーザ定義アプリケーションクラスのオブジェクトが作成されるようにします。
・ 初期化パラメタでファクトリクラスのクラス名を指定します。
4. アプリケーションクラスのnotifyBeanLostメソッドをオーバライドする
アプリケーションクラスのnotifyBeanLostメソッドをオーバライドします。このメソッドが2のコマンドを返却するように作成します。
package sample;
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile {
public String notifyBeanLost(String id) {
- 402 -
return "timeout";
}
}
注意
以上の方法を使ってタイムアウトを検出する場合は、フォームを作成する際に以下の点に注意してください。
・ フォームをuji:formタグで作成する場合は、beanIdアトリビュートを指定してください。HTMLのFORMタグの場合は、uji.idリクエスト
パ ラ メ タ を フ ォ ー ム に 追 加 し て く だ さ い 。 ま た 、 beanId ま た は uji.id で 指 定 し た デ ー タ Bean に 対 し て 、 uji:useBean タ グ で
request="true"を指定してください。beanId、uji.id は、フォームに入力されたデータを受け取るデータBeanを指定します。
<uji:useBean id="body" cls="my.pkg.MyDataBean" request="true" />
...
<uji:form name="order" method="post" verbs="ok,cancel" beanId="body">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</uji:form>
・ フォームをuji:formタグで作成する場合は、beanClsアトリビュートを指定しないでください。HTMLのFORMタグの場合は、uji.bean
リクエストパラメタを含めないでください。
beanId, beanClsアトリビュート、uji.id, uji.beanリクエストパラメタの詳細は、“F.1.2 フォームを作成したい”を参照してください。
関連項目
・ タイムアウト発生時点で特定の処理を実行したい
・ セション切断の検出
F.4.3
タイムアウト発生時点で特定の処理を実行したい
タイムアウト発生時点で特定の処理を実行したい場合は、ユーザ定義のセションクラスを作成して、sessionValueUnboundメソッドに記
述します。
ユーザ定義のセションクラスの作成方法は、“F.4.1 セション管理の基本的な方法を知りたい”を参照してください。
import javax.servlet.http.HttpSessionBindingEvent;
import com.fujitsu.uji.http.HttpSessionProfile;
public class SampleSession extends HttpSessionProfile {
public void sessionValueUnbound(HttpSessionBindingEvent event) {
// セションが終了したときの処理を記述します。
....
}
}
sessionValueUnboundの引数eventは、javax.servlet.http.HttpSessionBindingListenerインタフェースのvalueUnboundメソッドに渡される
ものと同じです。eventのgetSessionメソッドで、終了するセションのjavax.servlet.http.HttpSessionオブジェクトが取得できます。
ポイント
HttpSessionProfileクラスはjavax.servlet.http.HttpSessionBindingListenerインタフェースを実装しており、そのvalueUnboundメソッドが呼
び出されるとsessionValueUnboundを呼び出します。つまり、valueUnboundが呼び出されるのは、セションクラスがHttpSessionから切り
離されたときです。以下の事象が発生したときにHttpSessionから切り離されます。
・ タイムアウトが発生したとき
- 403 -
・ HttpSessionProfileクラスのdisposeメソッドが呼び出されたとき
uji:saveSessionタグを使うと、セションクラスをHttpSessionに再登録するため、セションクラスのvalueUnboundが呼び出されます。ただ
し、この場合はsessionValueUnboundは呼び出されません。
関連項目
・ APIリファレンスのHttpSessionProfileクラス
F.4.4
ボタンの多重押下による二重処理を防止したい
ブラウザの画面でボタンを何度か押した場合に、サーバへのリクエストが複数回発行されます。このとき、処理が二重に実行されること
を防止する機能をApcoordinatorは提供しています。
二重処理を防止する機能にはブラウザ側で処理するものと、サーバ側で処理するものがあります。
・ ブラウザ側で二重処理を防止する
JavaScriptを利用して、フォーム送信時にフラグを立てることにより、同じ画面から再度送信することを防ぎます。
・ サーバ側で二重処理を防止する
uji:dispatchタグ実行中に同じセションから別のリクエストが送信された場合に、後者のリクエストを実行しません。その結果、二重処
理が防止されます。最初のリクエストの実行結果が、後者のリクエストへの応答としてブラウザに送信されます。
2つの機能の長所、短所を比較すると以下のようになります。
・ ブラウザ側での処理の場合、JavaScriptが無効になっている場合は使用できません。サーバ側での処理の場合、JavaScriptの有無
に関わらず動作します。
・ サブウィンドウやフレーム分割によって複数の画面を使用している場合、ブラウザ側の処理では、別の画面からのリクエストによる
二重処理は防止できません。サーバ側の処理の場合、同じセションからのリクエストなら画面によらず防止できます。
・ サーバ側での処理の場合、ビジネスクラス呼び出し中の二重処理は防止できますが、uji:dispatch以降のJSP実行中(画面表示処
理中)の二重処理は防止できません。ブラウザ側の処理の場合、ビジネスクラス、JSP実行を含め全体の二重処理が防止できます。
ブラウザ側で二重処理を防止する
uji:formタグでフォームを作成し、postOnceアトリビュートに"true"を指定します。
<uji:form name="order" method="post" postOnce="true" verbs="ok,cancel" beanId="body" beanCls="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル">
</uji:form>
postOnce="true"を指定した場合、ブラウザの読み込みが中断されたあとでも二重処理防止機能が有効になっています。そのため、次
の画面が表示される前に読み込み停止ボタンなどを押して送信処理を中断し、そのあとで送信ボタンを押した場合はフォームが送信
されません。このような状態に備えて、postOnce="true"の指定の有無にかかわらずフォームの送信できる送信ボタンを作成できます。
送信ボタンをuji:pushButtonタグで作成し、skipScript="true"を指定してください。
<uji:form name="order" method="post" postOnce="true" verbs="ok,cancel" beanId="body" beanCls="my.pkg.MyDataBean">
商品コード: <INPUT NAME="code"><BR>
個数:
<INPUT NAME="count"><BR>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">
<uji:pushButton type="submit" name="cancel" label="キャンセル" skipScript="true" />
</uji:form>
skipScript="true"の指定は、フォーム送信時のJavaScriptの実行を抑止するための機能です。この指定のあるボタンが押された場合
は、二重処理を防止するJavaScriptだけでなく、入力値をチェックするJavaScriptも実行されません。
サーバ側で二重処理を防止する
サーバ側で二重処理を防止するには、アプリケーションを以下のように作成します。
- 404 -
・ HttpControlStateProfileクラスを継承して、ユーザ定義のセションクラスを作成します。
・ すべてのフォームにuji:controlStateタグを追加します。
この2つを順に説明します。
ユーザ定義のセションクラスをcom.fujitsu.uji.http.HttpControlStateProfileクラスを継承して作成します。また、isDoublePostEnabled メ
ソッドをオーバライドしてfalseを返却するようにします。このメソッドは、二重処理を認めるかどうかを指定するものです。
public class SampleSession extends com.fujitsu.uji.http.HttpControlStateProfile {
public boolean isDoublePostEnabled() {
return false;
}
}
なお、ユーザ定義のセションクラスを有効にするために、以下の作業が必要になります。具体的な方法は“3.5 ファクトリクラス”を参照し
てください。
・ ファクトリクラスを作成し、ユーザ定義セションクラスのオブジェクトが作成されるようにします。
・ 初期化パラメタでファクトリクラスのクラス名を指定します。Webアプリケーションの初期化パラメタはWebアプリケーション環境定義
ファイル(web.xml)に記述します。
以下のように、すべてのフォームにuji:controlStateタグを追加します。
<uji:form ...>
<uji:controlState />
...
</uji:form>
注意
サーバ側で二重処理を防止する場合、セションが開始されてから破棄されるまで有効です。セションが開始される前または破棄された
あとは機能が無効になります。
関連項目
・ 高度なセション管理
・ UJIタグリファレンス
F.4.5
明示的にセションを終了させたい
明示的にセションを終了する方法には、以下の2つがあります。
・ Apcoordinatorが管理するセション関連のデータをクリアする
・ サーブレット上のセションをすべて破棄する
Apcoordinatorが管理するセション関連のデータをクリアする
com.fujitsu.uji.http.HttpSessionProfileクラスのdisposeメソッドを呼び出すと、Apcoordinatorが管理するデータでセションに関連するもの
(セションクラス、セションスコープのビジネスクラス、データBeanなど) は、リクエストの処理が完了した時点で全てクリアされます。ブラウ
ザから次のリクエストを受信した場合は、新しくセションクラスのインスタンスが作成されます。サーブレットコンテナが管理するセション
は存続します。
HttpSessionProfileクラスはWebアプリケーションのセションクラスです。
・ disposeメソッドを呼び出す処理の例
package sample;
import com.fujitsu.uji.http.HttpSessionProfile;
- 405 -
public void finalHandler(DispatchContext context, SomeBean dataBean) {
...
context.setResponseBean("body", dataBean);
HttpSessionProfile sp = (HttpSessionProfile)context.getSessionProfile();
sp.dispose();
}
サーブレット上のセションをすべて破棄する
com.fujitsu.uji.http.HttpSessionProfileクラスのcloseSessionメソッドを呼び出すと、セションスコープに格納されているオブジェクトをリク
エストスコープに格納し、javax.servlet.http.HttpSessionクラスのinvalidateメソッドを呼び出してサーブレットコンテナが管理するセション
を破棄します。
・ closeSessionメソッドを呼び出す処理の例
package sample;
import com.fujitsu.uji.http.HttpSessionProfile;
import com.fujitsu.uji.SessionStateException;
public void finalHandler(DispatchContext context, SomeBean dataBean) {
...
context.setResponseBean("body", dataBean);
HttpSessionProfile sp = (HttpSessionProfile)context.getSessionProfile();
try {
sp.closeSession(context);
} catch (SessionStateException e) {
// closeSessionメソッドで発生した例外
...
}
}
関連項目
・ 高度なセション管理
・ セションの明示的な開始と破棄
・ APIリファレンスのHttpSessionProfileクラス
F.4.6
URLリライティングを使用したい
セション管理にURLリライティングを使用する場合は、アプリケーションを次のように作成します。
・ HttpControlStateProfileクラスを継承して、ユーザ定義のセションクラスを作成する
・ すべてのフォームにuji:controlStateタグを追加する
ユーザ定義のセションクラスを作成する
ユーザ定義のセションクラスをcom.fujitsu.uji.http.HttpControlStateProfileクラスを継承して作成します。また、getSessionMode() メソッド
をオーバライドしてURLREWRITINGを返却するようにします。このメソッドは、セション管理にCookieとURLリライティングのどちらを使
うのかを選択するものです。
public class SampleSession extends com.fujitsu.uji.http.HttpControlStateProfile {
public int getSessionMode() {
return HttpControlStateProfile.URLREWRITING;
}
}
なお、ユーザ定義のセションクラスを有効にするために、以下の作業が必要になります。具体的な方法は“3.5 ファクトリクラス”を参照し
てください。
- 406 -
・ ファクトリクラスを作成し、ユーザ定義セションクラスのオブジェクトが作成されるようにします。
・ 初期化パラメタでファクトリクラスのクラス名を指定します。Webアプリケーションの初期化パラメタはWebアプリケーション環境定義
ファイル(web.xml)に記述します。
フォームにuji:controlStateタグを追加する
すべてのフォームにuji:controlStateタグを追加します。
<uji:form ...>
<uji:controlState />
...
</uji:form>
参考
HTMLのAタグ、FORMタグ、FRAMEタグなどを使用し、そのアトリビュートでリクエスト送信先のURLを記述している場合、そのURLを
リライティングするスクリプトレットを追加する必要があります。uji:form、uji:anchor、uji:frameで指定したURLについては、この作業は不
要です。
URLをリライティングする処理はサーブレットのAPIを使用して実現します。javax.servlet.http.HttpServletResponseインタフェースの
encodeURLを次のように使用します。
・ リライティング処理追加前のAタグ
<A HREF="main.jsp?uji.verb=cancel&uji.id=body">キャンセル</A>
・ リライティング処理追加後のAタグ
<A HREF="<%=response.encodeURL("main.jsp?uji.verb=cancel&uji.id=body")%>">キャンセル</A>
変数responseはJSPで暗黙的に定義されている変数で、HttpServletResponseのオブジェクトです。このオブジェクトのencodeURLメ
ソッドでURLリライティングを実行します。
関連項目
・ 高度なセション管理
F.4.7
高度なセション管理について知りたい
セションの管理にはCookieとURLリライティングのいずれかが使用できます。通常はCookieが使用されます。URLリライティングを使用
する方法は“17.1.5 高度なセション管理”を参照してください。
F.4.8
セション切断時に開放される資源を知りたい
セションが切断されると、セションに関連付けられている以下のオブジェクトはApcoordinatorによって破棄されます。
・ セションクラス
・ セションスコープのビジネスクラス
F.4.9
セションタイムアウトを考慮した開発について知りたい
クライアントから一定以上の期間リクエストが無い場合、Servletによってセションが切断されます。この場合、セションクラスやセションス
コープのビジネスクラスは破棄されますので、これらをアプリケーションで使用する場合はセションタイムアウトを考慮したプログラミング
が必要です。セションタイムアウト検出の方法は、“17.1.4 セション切断の検出”で具体例を解説しています。
- 407 -
F.5
Webアプリケーションのその他
F.5.1
文字エンコーディングを制御したい
Javaでは文字エンコーディングとしてUnicodeを使用するのに対して、ブラウザに表示するHTMLでは、シフトJIS、日本語EUCなどが使
用されます。そのため、JSPの実行時には文字エンコーディングの変換が行なわれます。同様に、ブラウザから送信されるリクエストで
は、シフトJIS、日本語EUCなどが使用されるため、リクエストの内容をJavaの文字列に変換するときに文字エンコーディングの変換が
行なわれます。これらの変換が正確に実行できるように、文字エンコーディングを指定する必要があります。
表示に使用する文字エンコーディングを指定する
表示に使用する文字エンコーディングは、JSPに記述するpageディレクティブで指定します。
<%@ page contentType= "text/html; charset=Shift_JIS" %>
charset= の直後に文字エンコーディングを指定します。この例のように"Shift_JIS"を指定するとシフトJISが使用されます。他の日本語
の文字エンコーディングとしては、"windows-31j" (WindowsのシフトJIS), "EUC-JP" (日本語EUC), "UTF-8" (Unicode) などがあります。
参考
文字エンコーディング"Shift_JIS"の実態はプラットフォームにより異なります。丸付き数字などWindows固有の文字コードを使用する場
合は、"windows-31j"を指定してください。 "MS932"は"windows-31j"の別名として使用できます。
・ ディレクティブ
ディレクティブはJSPがJavaに変換されるときに使用される情報を指定します。page, taglib, includeなどのディレクティブがあります。
ディレクティブは <%@ と %> で囲んで記述します。
pageディレクティブのcontentTypeは、表示に使用する文字エンコーディングと、JSPファイルで使用している文字エンコーディングの両
方を指定するのに使われます。そのため、上記のように"Shift_JIS"を指定した場合は、JSPファイル自身もシフトJISで作成されている必
要があります。
リクエストに使用するエンコーディングを指定する
Apcoordinatorは、ブラウザから送信されるリクエストの文字エンコーディングを、JavaのエンコーディングJISAutoDetectを使用して自動
判定します。ただし、シフトJISと日本語EUCの両方に存在するコードが使用された文字列などは、正確に判定できない場合がありま
す。
リクエストに使用されている文字エンコーディングを明示的に指定するには、Apcoordinatorの初期化パラメタuji.defaultEncodingで指
定します。初期化パラメタはWebアプリケーション環境定義ファイル(web.xml)に記述します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<context-param>
<param-name>factory</param-name>
<param-value>sample2.Sample2Factory</param-value>
</context-param>
<context-param>
<param-name>uji.defaultEncoding</param-name>
<param-value>Shift_JIS</param-value>
</context-param>
<jsp-config>
<taglib>
<taglib-uri>uji-taglib</taglib-uri>
<taglib-location>/WEB-INF/ujiall.tld</taglib-location>
</taglib>
- 408 -
</jsp-config>
</web-app>
以下の場合は、uji.defaultEncodingにnoneを指定してください。
・ サーブレットコンテナで文字エンコーディング行う場合
・ 電子フォームアプリケーションの場合
関連項目
・ 送信データの文字エンコーディングについて
・ Webアプリケーション環境定義ファイル(web.xml)
・ APIリファレンスのApplicationProfileクラス
・ UJIタグリファレンス
エンコーディングの詳細について知りたい
F.5.2
一般的に利用されるエンコーディングと、そのエンコーディングで利用できる文字を説明します。
エンコーディングの種類
一般的に利用されるエンコーディングの指定には、以下のものがあります。
エンコーディング名
説明
SJIS
JIS規格に準拠したシフトJISです。
EUC-JP
JIS規格に準拠したEUCです。
windows-31j
またはMS932
Windows拡張文字を含んだシフトJISです。
UTF-8
データをUnicode形式で送受信します。
Shift_JIS
一般にはSJISの別名ですが、Windows上でJDKの古いバージョンを使う場合は
windows-31jと判断されます。
UTF-8の場合は、ブラウザ側で必要に応じて文字コードを変換します。その他のエンコーディングは、サーバ側で文字コード変換が行
われます。
エンコーディングを指定する場所
エンコーディングは以下の場所で指定します。
指定する場所
説明
JSP自体のエンコーディング
JSPを保存するときに指定するエンコーディングです。エディタ等で明に指定す
るか、OSの標準のエンコーディングが使われます。
<%@ page>のcontentType指定
JSPサーバがJSPファイルのエンコーディングを認識するために使用します。
<META>のcontent指定
ブラウザが送受信のエンコーディングを認識するために使用します。
web.xmlのuji.defaultEncoding
Apcoordinatorが受信データのエンコーディングを認識するために使用します。
エディタ等での指定方法は各エディタに依存します。
<META>での指定はブラウザに依存しますが、windows-31jおよびSJISの場合には、"Shift_JIS"と指定するのが一般的です。
エンコーディングで利用できる文字
通常の英数字やJIS漢字は各エンコーディングで利用可能です。
利用時に注意の必要な文字を以下に示します。
- 409 -
文字
SJIS
備考
EUC-JP Window
s-31j
UTF-8
○
○
○
○
半角円記号、半角ティルダは、フォントの指定や
OSによって異なる外観となります。
○
○
○
△
UTF-8を指定する場合には、OSによって異なる
コードで入力されます。
○
○
△
△
windows-31jを指定した場合、またはUTF-8指
定でWindows上のブラウザを利用する場合に
は、標準JISとは異なるコードで入力されます。
×
×
△
○
Windows上のブラウザでのみ利用できます。
拡張漢字など(*2)
×
×
△
△
Windows上のブラウザでのみ利用できます。
補助文字
×
×
×
△
Unicode仕様においてFFFF(16進数表記)より大
きいコードポイントを持つ文字を補助文字と呼び
ます。日本語の文字については、JIS X
0213:2004 (JIS2004)において、第3水準、第4水
準の文字の一部が補助文字となっています。利
用するには、ブラウザとその動作OSが補助文字
に対応している必要があります。
マル付き数字、ローマ数
字、
など
(*1)
該当する文字の詳細は以下です。
(*1)
(*2)
関連項目
・ 文字エンコーディングを制御したい
F.5.3
文字化けを調査したい
サーブレット内に格納されているリクエストパラメタと、Apcoordinatorが保持しているリクエストパラメタの文字コード情報を比較すること
で、文字化けが発生した場合の原因調査を行なうことが可能です。
文字コード情報の出力方法
文字コード情報はcom.fujitsu.uji.HttpDispatchContextクラスのdumpParametersメソッドを利用することで取得することができます。 以下
は標準出力に文字コード情報を出力する場合の使用例です。
import com.fujitsu.uji.GenericHandler;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.http.HttpDispatchContext;
public class SampleHandler extends GenericHandler {
- 410 -
public void doSomething(DispatchContext context, MyDataBean bean) {
((HttpDispatchContext)context).dumpParameters();
...
}
}
※ dumpParameters(PrintStream out)メソッドを用いることで出力先を指定することも可能です。
文字コード情報
文字コード情報は1個のリクエストパラメタごとにキーと値をそれぞれ16進で出力されます。出力された文字コード情報は次のとおりで
す。
-- dumpParameters start -encoding:shift_jis
←Apcoordinatorが使用するエンコード名
...
(省略)
...
+---| 7
←Parametersクラスに格納されているパラメタの項番
| ServletRequest
|
name=?f?[?^1
|
key : 6e 61 6d 65
←キーの文字列のバイトデータの16進表示
|
value: 83 66 81 5b 83 5e 31
←値の文字列のバイトデータの16進表示
| ----------------------------------------------------| Parameters
|
name=データ1
|
key : 00 6e 00 61 00 6d 00 65 ←キーの文字列のcharの16進表示
|
value: 30 c7 30 fc 30 bf 00 31 ←値の文字列のcharの16進表示
+---+---| 8
| ServletRequest
|
[0]array1=?f?[?^2
←同一キーに対して複数の値が存在する場合
|
[1]array1=
|
key : 61 72 72 61 79 31
|
value[0]: 83 66 81 5b 83 5e 32
|
value[1]: (length:0)
←値の文字列長が 0 の場合
| ----------------------------------------------------| Parameters
|
[0]array1=データ2
|
[1]array1=
|
key : 00 61 00 72 00 72 00 61 00 79 00 31
|
value[0]: 30 c7 30 fc 30 bf 00 32
|
value[1]: (length:0)
+----- dumpParameters end --
encodingに記載されている文字列がServletRequestをParametersクラスに格納する際に使用したエンコード名です。 例えば、上記の出
力例の項番7の場合、ServletRequestのvalue列"83 66 81 5b 83 5e 31"がshift_jisの"データ1"を表しており、shift_jisからUnicodeに変換して
Parametersクラスに格納したものが"30 c7 30 fc 30 bf 00 31"となります。文字化けが発生しているということは、言い換えるとServletRequest
に格納されている文字情報に対して、誤ったエンコード名が指定されているということになります。ServletRequestに格納されているバ
イトデータの16進表示が、その文字列をencodingで指定されているエンコード名で表現したものになっているか確認してください。
関連項目
・ 文字エンコーディングを制御したい
・ 文字エンコーディングの詳細について知りたい
- 411 -
F.5.4
クライアントのファイルをサーバへアップロードしたい
クライアントのファイルをサーバにアップロードすることができます。 アップロードされたファイルは com.fujitsu.uji.util.MimeSourceクラス
から取り出すことができます。
例として、以下のような画面を作成します。
1. "参照"ボタンを押すと、クライアント側のファイル選択ダイアログが出力されます。
2. "アップロード"ボタンを押すと、filenameで示されるファイルがサーバへアップロードされます。
以下の3つの定義が必要です。
定義場所
定義内容
1. 入出力ページ(JSP)
送信するファイルの指定と送信ボタンの追加
1.1 uji:formタグのenctype="multipart/form-data"アトリビュート指定
1.2 "参照"ボタン付の入力領域
1.3 サーバへの送信ボタン
2. データBean
送信されたファイルを受け取るMimeSource型のプロパティを追加
3. ビジネスロジック
送信されたファイルをMimeSourceクラスから取得する処理を追加
3.1 データBeanから、MimeSourceの取得
3.2 MimeSourceから、InputStreamとファイル名の取得
3.3 InputStreamから、アップロードされたファイルの読み込み
3.4 リソースを解放可能にするためプロパティにnullを設定
1. 入出力ページ(JSP)
以下の3つの定義を追加します。
1.1 uji:formタグのenctypeアトリビュート指定
uji:formタグには、enctype="multipart/form-data"アトリビュートを指定します。
<uji:form method="post" name="mainForm" enctype="multipart/form-data" beanId="body" beanCls="upfile.BodyBean"
verbs="upload" >
....
</uji:form>
1.2 "参照"ボタン付の入力領域
INPUTタグのtype="FILE"アトリビュートは、フォームのデータとして送信するファイル を選択するボタンと入力域を表します。
name="file"で示されるのは、サーバでファイルを受け取るプロパティの名前と対応しています。
詳細は“2. データBean”を参照してください。
<INPUT type="FILE" name="file" />
- 412 -
1.3 サーバへの送信ボタン
サーバへの送信ボタンをINPUTタグで作成します。 この例ではボタンを押すと"upload"というコマンドを発行しています。 コマンドは、INPUT
タグのnameアトリビュートに指定しています。
<uji:form method="post" name="mainForm" enctype="multipart/form-data" beanId="body" beanCls="upfile.BodyBean"
verbs="upload" >
....
<INPUT type="submit" name="upload" value="アップロード">
最終的に作成されるJSPは以下のようになります。
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="upfile.BodyBean" request="true" />
<uji:form method="post" name="mainForm" enctype="multipart/form-data" beanId="body" beanCls="upfile.BodyBean"
verbs="upload" >
<uji:controlState/>
<INPUT type="FILE" name="file"/><BR>
<INPUT type="submit" name="upload" value="アップロード" >
</uji:form>
2. データBean
送信されたファイルを受け取るMimeSource型のプロパティを追加します。
このプロパティの名前は、“1.2 "参照"ボタン付の入力領域”で指定したプロパティと対応しています。
import com.fujitsu.uji.DataBean;
import com.fujitsu.uji.util.MimeSource;
public class BodyBean extends DataBean
{
protected MimeSource file;
public MimeSource getFile() {
return file;
}
public void setFile(MimeSource file) {
this.file = file;
}
}
3. ビジネスロジック
送信されたファイルをMimeSourceクラスから取得する処理を追加します。
以下の4つの処理を追加します。
3.1 データBeanから、MimeSourceの取得
データBeanから、MimeSource型のプロパティを取得します。
MimeSource source=dataBean.getFile();
3.2 MimeSourceから、InputStreamとファイル名の取得
MimeSourceから、InputStreamと送信されたファイル名を取得します。 それぞれ、変数is, fnameへ格納しています。
InputStream is = source.getInputStream();
String fname = source.getFileName();
3.3 InputStreamから、アップロードされたファイルの読み込み
InputStreamからアップロードされたファイルを読み込みます。 この例では、サーバのフォルダにファイルとして書き出します。
- 413 -
// 格納するサーバのフォルダを求めます。
// ここでは、アプリケーションの配置と同じフォルダとします。
String name = "/";
if(context instanceof HttpDispatchContext) {
ServletContext svc = ((HttpDispatchContext)context).getServletContext();
name = svc.getRealPath(name);
}
// 格納するファイル名を決定します。
File savename = new File(getRealFolder(context), fname);
// 実際にファイルへ書き出します。
try {
FileOutputStream os = new FileOutputStream(savename);
byte buffer[] = new byte[1024];
int size;
while((size = is.read(buffer)) > 0)
os.write(buffer, 0, size);
os.close();
} catch(Exception e) {
e.printStackTrace();
}
3.4 リソースを解放可能にするためプロパティにnullを設定
アップロードの処理が終了したら、MimeSource型のプロパティにnullを設定します。このようにしてMimeSourceへの参照を削除するこ
とにより、ガーベジコレクタがMimeSourceを破棄できるようになります。MimeSourceが破棄された時点でリソースが解放されます。
dataBean.setFile(null);
最終的に作成されるJSPは以下のようになります。
import
import
import
import
import
import
import
import
....
java.io.File;
java.io.FileOutputStream;
java.io.InputStream;
javax.servlet.ServletContext;
com.fujitsu.uji.util.MimeSource;
com.fujitsu.uji.GenericHandler;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.http.HttpDispatchContext;
public class UploadHandler extends GenericHandler {
public void upload(DispatchContext context, BodyBean dataBean) {
MimeSource source=dataBean.getFile();
InputStream is = source.getInputStream();
String fname = source.getFileName();
// 格納するサーバのフォルダを求めます。
// ここでは、アプリケーションの配置と同じフォルダとします。
String name = "/";
if(context instanceof HttpDispatchContext) {
ServletContext svc = ((HttpDispatchContext)context).getServletContext();
name = svc.getRealPath(name);
}
// 格納するファイル名を決定します。
File savename = new File(getRealFolder(context), fname);
// 実際にファイルへ書き出します。
try {
FileOutputStream os = new FileOutputStream(savename);
byte buffer[] = new byte[1024];
int size;
while((size = is.read(buffer)) > 0)
os.write(buffer, 0, size);
- 414 -
os.close();
} catch(Exception e) {
e.printStackTrace();
}
dataBean.setFile(null);
....
}
....
}
4. アップロードファイルの定量制限について
ファイルをアップロードする場合には、以下の定量制限があります。
・ アップロードヘッダ長は1024バイト以内です。
アップロードヘッダには、項目名とファイル名の情報が含まれます。利用するブラウザによって多少異なりますが、項目名長とファ
イル名長を合わせて、970バイト程度を指定可能です。
・ アップロードファイルサイズの上限はデフォルトで16MB (16*1024*1024バイト)です。このサイズは、アプリケーションクラスで
getMimeTransferSizeLimitメソッドをオーバライドすることで変更できます。getMimeTransferSizeLimitメソッドの詳細は、“17.2 バイ
ナリファイルの送受信”を参照してください。
これらの定量制限を超えた場合は、IOException例外が発生します。発生した例外はDispatchExceptionクラスでラップされ、セションク
ラスに実装したhandleExceptionメソッド、アプリケーションクラスに実装したhandleExceptionメソッドに通知されます。なお、handleException
メソッドを使用するには、Postprocessorインタフェースをセションクラスまたはアプリケーションクラスに実装する必要があります。
handleExceptionメソッドの使用方法については、“4.2 エラー処理”を参照してください。
以下は、セションクラスのhandleExceptionメソッドで、アップロードヘッダ長が制限を越えた場合の例外を受け取る例です。
import
import
import
import
com.fujitsu.uji.http.HttpControlStateProfile;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.log.NestedException;
com.fujitsu.uji.DispatchException;
public class UpdownSession extends HttpControlStateProfile {
public Object handleException(DispatchContext context, Throwable th) throws Throwable {
if (th instanceof DispatchException) {
Throwable rootCause = th;
// 原因となった例外を取得します。
while(rootCause instanceof NestedException) {
rootCause = ((NestedException)rootCause).getRootCause();
}
String errorMessage = rootCause.getMessage();
if (errorMessage != null && errorMessage.startsWith("UJI075:")) {
// エラーメッセージが "UJI075:" で始まっていれば ヘッダデータ長が
// 制限を越えた場合の例外だと判断します。
// 以下でアップロードヘッダ長が制限を越えた時の処理を実行します。
....
} else {
// それ以外の例外の処理です。
....
// このメソッドで処理しない場合は、throw文を使って例外を
// 再度スローします。
// throw th;
}
} else {
// DispatchException以外の例外の処理です。
....
// このメソッドで処理しない場合は、throw文を使って例外を再度スローします。
// throw th;
}
- 415 -
return null;
}
}
関連項目
・ サーバのファイルをクライアントへダウンロードしたい
・ バイナリファイルの送受信
F.5.5
サーバのファイルをクライアントへダウンロードしたい
サーバのファイルをクライアントにダウンロードすることができます。 ダウンロードされたファイルは、ブラウザの機能によりファイルの保
存ダイアログが開いたり、 ブラウザ内で表示されたりします。
例として、以下のような画面を作成します。
1. "ダウンロード"ボタンを押すと、クライアント側のファイル保存ダイアログが出力されます。指定したフォルダへファイルが保存され
ます。
以下の3つの定義が必要です。
定義場所
定義内容
1. 入出力ページ(JSP)
リクエストの送信先の指定と、受信するボタンの追加
1.1 リクエストの送信先の指定
1.2 ダウンロードボタンの追加
2. ビジネスロジック
サーバから送信するファイルの準備
3. サーブレット
ブラウザからのリクエストを受信するためのサーブレットを追加
3.1 サーブレットの追加
3.2 環境ファイルの編集
1. 入出力ページ(JSP)
ダウンロードを依頼するリクエストの送信先(サーブレット)の指定と、ダウンロードを開始するためのボタンを作成します。
以下の2つの定義を追加します。
1.1 リクエストの送信先の指定
uji:formタグのactionアトリビュート属性にリクエストの送信先となるサーブレットを指定します。この例では"download"というサーブレット
を指定しています。
この指定は、“3.2 環境ファイルの編集”の<url-pattern>の指定と対応しています。
- 416 -
<uji:form method="post" name="mainForm" action="download" beanId="body" beanCls="upfile.BodyBean" verbs="dwload" >
....
</uji:form>
1.2 ダウンロードボタンの追加
ダウンロードを開始する送信ボタンをINPUTタグで作成します。 この例ではボタンを押すと"dwload"というコマンドを発行しています。
コマンドは、INPUTタグのnameアトリビュートに指定しています。
<uji:form method="post" name="mainForm" action="download" beanId="body" beanCls="upfile.BodyBean" verbs="dwload" >
....
<INPUT type="submit" name="dwload" value="ダウンロード">
最終的に作成されるJSPは以下のようになります。
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="upfile.BodyBean" request="true" />
<uji:form method="post" name="mainForm" action="download" beanId="body" beanCls="upfile.BodyBean" verbs="dwload" >
<uji:controlState/>
<INPUT type="submit" name="dwload" value="ダウンロード" >
</uji:form>
2. ビジネスロジック
サーバからクライアントへ送信するファイルを準備します。
ダウンロードを開始するコマンドを処理するメソッドは、Object型を返却する必要があります。
この例では、サーバの "download.zip"ファイルをクライアントへ"download.zip"というファイル名で送信しています。
public Object dwload(DispatchContext context, upfile.BodyBean dataBean) {
// 送信するサーバのフォルダを求めます。
// ここでは、アプリケーションの配置と同じフォルダとします。
String name = "/";
if(context instanceof HttpDispatchContext) {
ServletContext svc = ((HttpDispatchContext)context).getServletContext();
name = svc.getRealPath(name);
}
// 送信するサーバ上のファイル名を決定します。
// ここでは、"download.zip"とします。
File filename = new File(getRealFolder(context), "download.zip");
FileInputStream is=null;
try {
is = new FileInputStream(filename);
} catch(Exception e) {
e.printStackTrace();
}
// サーバから送信するファイルと、クライアントで受け取るファイル名を指定します。
com.fujitsu.uji.util.MimeSource mimesource=null;
mimesource = new com.fujitsu.uji.util.MimeSource(is,"download.zip");
mimesource.setContentType("application/octet-stream");
return (mimesource);
}
3. サーブレット
ブラウザからのリクエストを受信するためのサーブレットを追加します。
以下の2つの処理を追加します。
3.1 サーブレットの追加
サーブレットはcom.fujitsu.uji.http.UjiServletクラスを継承します。
コンストラクタ以外の処理は必要ありません。
この例では、サーブレットを"upfile.DownloadServlet"とします。
- 417 -
package upfile;
public class DownloadServlet extends com.fujitsu.uji.http.UjiServlet {
public DownloadServlet() {
super();
}
}
3.2 環境ファイルの編集
サーブレットを呼び出せるようにweb.xmlを編集し、サーブレットマッピングを定義します。
ここでは、「3.1 サーブレットの追加」で作成した upfile.DownloadServletクラスを、"download" のURLで呼び出せるようにします。
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>upfile.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
</web-app>
関連項目
・ クライアントのファイルをサーバへアップロードしたい
・ バイナリファイルの送受信
F.5.6
電子フォームの添付ファイル項目に入力されたファイルを順番に取得したい
電子フォームの添付ファイル項目に入力されたファイルはcom.fujitsu.uji.formc.FormDataBeanクラスのgetAttachedFileメソッドで取得
することができます。画面上の添付ファイルの順番を意識する必要がある場合には、画面の項目名を順番に指定して添付ファイルを
取得してください。
以下は項目名を配列で定義した場合の例です。
// 項目名を配列で定義します。
static final String items[] = {"file1", "file2", ... };
public Object ensureOk(DispatchContext context, FormDataBean dataBean) {
// 設定した項目順に処理をします
for(int i = 0; i < items.length; i++) {
// 項目名を指定して、MimeSourceを取得します。
MimeSource ms = dataBean.getAttachedFile(items[i]);
if (ms != null) {
// 取得したMimeSourceに対する処理を記述します。
...
}
}
...
}
- 418 -
F.6
EJBアプリケーション
F.6.1
指定時刻にビジネスクラスを呼び出したい
EJBコンテナが提供するEJBタイマーサービス機能は、タイマーをEJBコンテナに設定することで、任意の時刻にEJBコンテナがEJBセション
Beanを実行します。
ApcoordinatorのEJBアプリケーションフレームワークでは、EJBタイマーサービス機能を使用して指定時刻にビジネスクラスを呼び出す
ことができます。
注意
EJBタイマーサービス機能を利用する場合、以下の点に注意してください。
・ EJBタイマーサービス機能は、EJB 2.1以上のステートレスセションBeanだけで使用することができます。
・ EJBタイマーサービスでは、呼び出す時刻をミリ秒単位で指定しますが、ミリ秒単位の精度のタイマーを提供するものではありませ
ん。
EJBタイマーサービス機能を利用してビジネスクラスを呼び出す場合は、アプリケーションを次のように作成します。
・ タイマー情報クラスを作成する
・ タイマーを作成する
・ ejbTimeoutメソッドを実装する
タイマー情報クラスを作成する
EJBタイマーサービスでは、タイマーの作成時に任意のデータをタイマーに設定して、コールバック処理時に参照できます。これを利
用して、ビジネスクラスのメソッド呼び出しに必要なデータBean、コマンド名をタイマーに設定します。タイマーに設定可能なオブジェクトは
1つであるため、データBean、コマンド名を格納するためのクラスを作成する必要があります。ここでは、このクラスをタイマー情報クラス
と呼びます。タイマー情報クラスは、例えばJavaBeans形式のクラスとして作成します。
・ タイマー情報クラス(JavaBeans形式)の作成例
import com.fujitsu.uji.DataBean;
public class UserTimerInfo implements java.io.Serializable {
// データBean
DataBean dataBean;
// コマンド名
String verb;
public DataBean getDataBean() {
return dataBean;
}
public void setDataBean(DataBean dataBean) {
this.dataBean = dataBean;
}
public String getVerb() {
return verb;
}
public void setVerb(String verb) {
this.verb = verb;
}
}
- 419 -
注意
タイマー情報クラスの作成では、以下の点に注意してください。
・ タイマー情報クラスは、シリアライズ可能である必要があります。
・ タイマー情報クラス内では、データBeanを除いて、Apcoordinatorが提供するクラスを継承、もしくはインタフェースを実装したクラス
を保持することはできません。
タイマーを作成する
タイマーの作成は、次の手順で行います。
1. EJBSessionProfileのgetEJBContextメソッドを使用して、EJBContextを取得します。取得したEJBContextのgetTimerServiceメソッ
ドを使用して、TimerServiceを取得します。
2. タイマー情報クラスを生成して、呼び出すビジネスクラスのメソッドに対応したデータBeanとコマンド名をタイマー情報クラスに設
定します。
3. TimerServiceのcreateTimerメソッドを使用して、時刻とタイマー情報クラスを指定します。この処理により、タイマーが作成され、
開始されます。
・ 60秒後に1回だけビジネスクラスを呼び出すタイマーの作成例
import
import
import
import
import
javax.ejb.EJBContext;
javax.ejb.TimerService;
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.GenericHandler;
com.fujitsu.uji.ejb.bean.EJBSessionProfile;
public class EjbTimerHandler extends GenericHandler {
public Object createTimer(DispatchContext context, test.DataBean dataBean) {
// EJBSessionProfileの取得
EJBSessionProfile sp = (EJBSessionProfile)context.getSessionProfile();
// EJBContextの取得
EJBContext ejbContext = (EJBContext)sp.getEJBContext();
// TimerServiceの取得
TimerService ts = ejbContext.getTimerService();
// タイマー情報クラスの生成
UserTimerInfo userTimerInfo = new UserTimerInfo();
// データBeanを設定
userTimerInfo.setDataBean(dataBean);
// コマンド名を設定
userTimerInfo.setVerb("verb1");
// タイマーを作成
ts.createTimer(60000, userTimerInfo);
return dataBean;
}
}
注意
タイマーの作成をトランザクションの範囲内で実行した場合、トランザクションがロールバックされると、 EJBコンテナはタイマーの作成を
取り消します。 詳細については、ご使用になるアプリケーションサーバのマニュアルを参照してください。
- 420 -
ejbTimeoutメソッドを実装する
セションBeanクラスにTimedObjectインタフェースを実装してejbTimeoutメソッドを作成します。 ejbTimeoutメソッドは、タイマーで指定し
た時刻にEJBコンテナから呼び出されるメソッドで、 TimedObjectインタフェースで定義されています。ejbTimeoutメソッドには、 タイマー
で指定した時刻に呼び出される処理を実装します。 ここでは、ビジネスクラスのメソッドを呼び出すために以下の処理を作成します。
1. ejbTimeoutメソッドの第一引数はTimerクラスです。Timerクラスから、タイマー作成時に設定したタイマー情報クラスを取得しま
す。
2. タイマー情報クラスからデータBeanとコマンド名を取得します。
3. 取得したデータBeanとコマンド名を指定してUjiSessionBeanクラスのexecメソッドを呼び出します。execメソッドの第三引数はnull
を指定します。
・ ejbTimeoutメソッドの実装例
import
import
import
import
com.fujitsu.uji.ejb.bean.UjiSessionBean;
java.lang.reflect.InvocationTargetException;
javax.ejb.TimedObject;
javax.ejb.Timer;
public class EjbTimer extends UjiSessionBean implements TimedObject {
public void ejbTimeout(Timer timer) {
// タイマー情報クラスの取得
UserTimerInfo userTimerInfo = (UserTimerInfo)timer.getInfo();
// ビジネスクラスのメソッドの呼び出し
try {
exec(userTimerInfo.getDataBean(), userTimerInfo.getVerb(), null);
}
catch(InvocationTargetException e) {
throw new RuntimeException("exec error: " + e.getMessage(), e.getCause());
}
}
}
注意
ejbTimeoutメソッドをトランザクションの範囲内で実行した場合、トランザクションがロールバックされると、 EJBコンテナはejbTimeoutメ
ソッドを再試行します。 詳細については、ご使用になるアプリケーションサーバのマニュアルを参照してください。
F.7
F.7.1
Apcoordinatorアプリケーション共通
アプリケーションで必要なApcoordinatorのJARファイルを知りたい
各種別のアプリケーションに必要となるJARファイルは以下のとおりです。
アプリケーション種別
必要なJARファイル
Webアプリケーション
uji.jar
EJBセションBean
uji.jar, ujiejb.jar
電子フォームアプリケーション
uji.jar, ujiformc.jar, f3hksjsv.jar
また、以下の機能を使用する場合はJARファイルを追加する必要があります。
使用する機能
データベース連携機能 (Webアプリケーション)
必要なJARファイル
uji.jar
- 421 -
使用する機能
必要なJARファイル
COBOL連携機能 (電子フォームアプリケーション)
ujicobol.jar
バックエンド連携サービスライブラリ
ujiasync.jar
ログ拡張機能 (ログフィルタ、syslog出力機能)
ujiasync.jar
Struts連携機能
Strutsが提供するJARファイル
以下の場合は、クライアントアプリケーションにもJARが必要となります。
アプリケーション種別
JARを必要とするクライアントアプリケーション
必要なJARファイル
Webアプリケーション
アプレット
ujiapplet.jar
EJBセションBean
Apcoordinatorフレームワークを使用しないEJBクライア
ント
ujiejbcl.jar
ujiapplet.jar, ujiejbcl.jarは再配布可能です。クライアント環境に配布して使用できます。
バックエンド連携サービスライブラリを利用する場合は、イベント処理Bean利用環境にujiasyncwu.jarをEJBとして配備する必要がありま
す。
関連項目
・ アプリケーションに必要なApcoordinatorのファイル
ログに情報を出力したい
F.7.2
Apcoordinatorはアプリケーションログを採取する機構を持っており、アプリケーションから任意の情報をログに出力できます。
基本操作
ビジネスクラスでログを出力するためには、com.fujitsu.uji.log.LogComposerクラスを以下の手順で使用します。
1. アプリケーションクラス、または、DispatchContextからgetLogComposerメソッドでLogComposerオブジェクトを取得します。
2. LogComposerのprintlnメソッドで情報をログに出力します。
DispatchContextクラスを用いてLogComposerを参照するとリクエストを識別するコンテキストIDをログへ出力します。アプリケーションク
ラスを用いてLogComposerを参照すると従来と同様なログ出力が行えます。
・ DispatchContextでLogComposerを参照する例
import com.fujitsu.uji.log.LogComposer;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
....
LogComposer lc = context.getLogComposer();
lc.println("処理を開始");
}
}
デフォルトフォーマットを利用している場合、時刻、コンテキストID、メッセージ本文の順で出力されます。
2008/01/31 20:40:07 [0140-1U758OIN0N39RFV1A9NLFPVOERUUNJ3NEBBI169TNLLBG963Q8C9QCD5PSBG200008000000.IJServer_001-001]
処理を開始
- 422 -
・ アプリケーションクラスでLogComposerを参照する例
import com.fujitsu.uji.log.LogComposer;
import com.fujitsu.uji.ApplicationProfile;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
....
ApplicationProfile ap = context.getApplicationProfile();
LogComposer lc = ap.getLogComposer();
lc.println("処理を開始");
}
}
デフォルトフォーマットを利用している場合、時刻、メッセージ本文の順で出力されます。
2004/08/19 9:48:17 処理を開始
ログの出力先を変更する
デフォルトでは、ログは標準出力に出力されます。ログの出力先は、定義ファイルを用いて任意の出力先を指定するか、アプリケーショ
ンクラスが持っているデフォルトのLogComposerオブジェクトを入れ替えることで変更します。
・ 定義ファイルで、ログの出力先を指定する
例えば、ログの出力先をファイルにするには、以下のようにします。
- ログ定義ファイルへ管理名mylogを定義します。
- mylogの出力先をc:¥myapp¥mylog.txtとします。
- 定義ファイルを設定ファイルフォルダへ配置します。
- LogComposerオブジェクトを参照するには、管理名を引数として、DispatchContextクラスのメソッドgetLogComposerを呼び出し
ます。
定義ファイルの例です。
<logComposer name="mylog">
<output name="sysFileOut" type="file">
<param name="path" value="c:¥myapp>
<param name="prefix" value="mylog"/>
<param name="extension" value=".txt"/>
</output>
</logComposer>
ビジネスクラスでログを出力する例です。
import com.fujitsu.uji.log.LogComposer;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler
{
....
public void startup(DispatchContext context) {
....
LogComposer lc = context.getLogComposer("mylog");
lc.println("処理を開始");
}
}
- 423 -
・ プログラムにより出力先を指定する
例えば、ログの出力先をファイルにするには、以下のようにします。
- アプリケーションクラスを継承して、ユーザ定義のアプリケーションクラスを作成します。
- ユーザ定義のアプリケーションクラスでnewLogComposerメソッドをオーバライドし、ログの出力先を設定したLogComposerオブ
ジェクトを返却します。
- LogComposerオブジェクトを作成するには、ファイル名を引数として、LogComposerクラスのstaticメソッドgetFileOutputInstance
を呼び出します。
public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
public LogComposer newLogComposer() {
LogComposer lc;
try {
lc = LogComposer.getFileOutputInstance("c:¥¥myapp¥¥mylog.txt", true);
} catch(IOException e) {
return null; // デフォルトのLogComposerオブジェクトを使用
}
return lc;
}
}
この例では、ログの出力先をファイルc:¥myapp¥mylog.txtにしています。また、ユーザ定義のアプリケーションクラスのクラス名を
SampleApplicationとしています。
なお、ユーザ定義のアプリケーションクラスを有効にするために、以下の作業が必要になります。具体的な方法は“3.5 ファクトリクラス”
を参照してください。
・ ファクトリクラスを作成し、ユーザ定義アプリケーションクラスのオブジェクトが作成されるようにします。
・ 初期化パラメタでファクトリクラスのクラス名を指定します。
関連する機能
ログについては以下の機能が使用可能です。
機能
詳細解説
出力するログの書式を指定する
第5章 アプリケーションログ
ログの出力をキューイングする
第5章 アプリケーションログ
重要度に応じて出力の有無を切り替える
F.7.3 デバッグ時と本稼動時で出力するログの種類を切り替えたい
第5章 アプリケーションログ
特定の文字列を含むログだけ出力する
ログフィルタ機能
syslogへログを送信する
syslogへの出力機能
関連項目
・ デバッグ時と本稼動時で出力するログの種類を切り替えたい
・ アプリケーションログ
・ APIリファレンスのLogComposer
F.7.3
デバッグ時と本稼動時で出力するログの種類を切り替えたい
Apcoordinatorのログ機能では出力する情報に重要度を表すレベルを設定することができます。また、一定以上のレベルのログのみを
出力するように設定できます。このレベルを設定することにより、デバッグ時には多くの情報をログに出力し、本稼動時には重要なログ
に絞って出力するという制御が可能になります。
- 424 -
ログのレベル
レベルは整数で表され、0が最重要であり、数が大きくなるほど重要度が下がります。レベルは任意に設定できますが、Apcoordinator
が自動的にログに出力する情報では、以下のレベルを使用しています。
レベル
内容
0
最重要のログ
3
Apcoordinatorのエラーログのレベル
5
レベル未指定のメッセージに与えられるデフォルトレベルの初期値
10
Apcoordinatorのインフォメーションログのレベル
20
Apcoordinatorのトレースログのレベル
ログへ出力する情報にレベルを指定する
レベルを指定するには、com.fujitsu.uji.log.LogComposerクラスのprintlnメソッドでログを出力するときに、引数でレベルを指定します。
LogComposer lc = context.getLogComposer();
lc.println(7, "処理を開始");
「処理を開始」はレベル7で出力されます。
レベルを指定しないとデフォルトレベルが使用されます。デフォルトレベルの初期値は5ですが、LogComposerのsetDefaultLevelメソッ
ドで設定を変更できます。
LogComposer lc = context.getLogComposer();
lc.setDefaultLevel(6);
lc.println("処理を開始");
「処理を開始」はレベル6で出力されます。
実際に出力される情報を重要なものだけに絞り込む
ログ出力レベルを指定すると、レベルがログ出力レベル以下の情報のみがログに出力されます。初期化パラメタで指定する方法、ログ
定義ファイルで指定する方法、および、APIで指定する方法があります。デフォルトのログ出力レベルは9です。
初期化パラメタの場合、logLevelパラメタで指定します。初期化パラメタの指定方法はアプリケーション種別ごとに異なります。Webアプ
リケーションの場合、初期化パラメタはWebアプリケーション環境定義ファイル(web.xml)で以下のように指定します。
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version="2.4">
<context-param>
<param-name>logLevel</param-name>
<param-value>5</param-value>
</context-param>
</web-app>
この指定では、レベルが5以下の(レベル5と同じかより重要な)情報のみが出力されます。
ログ定義ファイルの場合、levelタグで指定します。ログ定義ファイルは、設定ファイル格納フォルダ下のlogConf.xml、または、初期化パラメタ
uji.logConfで指定の定義ファイルで以下のように指定します。
<logComposer name="system">
<level>5</level>
<output name="systemOutput" type="stderr"/>
</logComposer>
この指定では、レベルが5以下の(レベル5と同じかより重要な)情報のみが出力されます。
APIで指定する場合、LogComposerクラスのsetLogLevelメソッドで指定します。
- 425 -
LogComposer lc = context.getLogComposer();
lc.setLogLevel(5);
初期化パラメタとAPIの両方で指定した場合、APIでの指定が優先されます。 定義ファイルと初期化パラメタの両方で指定した場合、
初期化パラメタが優先されます。
注意
LogComposerクラスの以下の2つのメソッドの違いは以下のとおりです。
・ setDefaultLevelメソッド: 出力する情報に与えるデフォルトのレベルを指定します。printlnメソッド使用時にレベルを省略した場合に
デフォルトのレベルが使用されます。
・ setLogLevelメソッド: 実際にファイルなどに出力される情報を指定レベルより重要なものだけに絞り込む場合に、そのレベルを指定
します。
関連項目
・ ログに情報を出力したい
・ アプリケーションログ
・ 初期化パラメタ
・ APIリファレンスのLogComposer
F.7.4
ビジネスクラスのメソッドで発生した例外をまとめて処理したい
ビジネスクラスのメソッドで発生した例外については、基本的にはtry-catchブロックを使って各メソッド内で例外処理を記述します。
com.fujitsu.uji.Postprocessorインタフェースをビジネスクラスやセションクラスに実装して使用すると、複数のメソッドで発生する例外の処理を
1つのメソッドにまとめて記述できます。 あまり発生しないような例外の処理をまとめて記述したい場合に使用します。
それぞれのビジネスクラスに特有の例外をまとめて処理する方法は次のとおりです。
1. ビジネスクラスにcom.fujitsu.uji.Postprocessorインタフェースを実装します。ビジネスクラスをGenericHandlerクラスから継承して作
成している場合は、この作業は不要です。GenericHandlerがPostprocessorを実装しているためです。
2. ビジネスクラスにhandleExceptionメソッドを作成します。
3. handleExceptionの中に例外処理を記述します。
以上のようにビジネスクラスを作成した場合、ビジネスクラスのメソッドから例外がスローされると、handleExceptionメソッドが呼び出され
ます。handleExceptionの引数には発生した例外が与えられるため、それを参照して例外処理を実行できます。発生した例外を
handleExceptionで処理できなかった場合は、再度その例外をスローするように処理を作成してください。
ビジネスクラスに共通の例外をまとめて処理する方法は次のとおりです。
1. ユーザ定義のセションクラスを作成します。作成方法は、“F.4.1 セション管理の基本的な方法を知りたい”を参照してください。
2. セションクラスにcom.fujitsu.uji.Postprocessorインタフェースを実装します。
3. セションクラスにhandleExceptionメソッドを作成します。
4. handleExceptionの中に例外処理を記述します。
以上のようにセションクラスを作成すると、ビジネスクラスで例外が処理されなかった場合には、セションクラスのhandleExceptionメソッド
が呼び出されます。ビジネスクラスのhandleExceptionメソッドの場合と同様に例外を処理してください。
・ handleExceptionの実装例
public class SampleHandler extends GenericHandler {
....
public Object handleException(DispatchContext context, Throwable th) {
// 発生した例外がthに渡されます。
- 426 -
if(th instanceof MyException) {
// MyExceptionが発生した場合の処理を行ないます。
....
} else {
// 処理できない例外はスローします。
throw new com.fujitsu.uji.HandlerException(th.getMessage(),th);
}
return null;
}
}
ポイント
一度キャッチした例外を再度スローする場合、そのままスローすると、例外の中のスタックトレース情報が再スローした時点のものに書
き換えられます。最初にスローした時点の情報を得るには以下のような方法があります。
・ 新しく例外のインスタンスを作成し、元の例外をラップしてからスローします。上記記述例では、HandlerExceptionにラップしてスロー
しています。元の例外はHandlerExceptionクラスのgetRootCauseメソッドで取得できます。
・ ログや標準出力にスタックトレースを出力してから再スローします。
関連項目
・ エラー処理
・ Webアプリケーションのエラー処理
F.7.5
ビジネスロジックに共通な前処理、後処理をまとめて記述したい
前処理用、後処理用のメソッドを作成しておくことにより、ビジネスクラスの呼び出し前後に実行させることができます。 前処理用、後処
理用のメソッドは、ビジネスクラスごとに、または全ビジネスクラスで共通に使用されます。
前処理用のメソッドを作成する
前処理用のメソッドは次のように作成します。
1. ビジネスクラスにcom.fujitsu.uji.Preprocessorインタフェースを実装します。GenericHandlerクラスを継承してビジネスクラスを作成
している場合はこの作業は不要です。GenericHandlerクラスがPreprocessorを実装しているためです。
2. ビジネスクラスにpreprocessメソッドを作成し、そこに前処理を記述します。
アプリケーションがリクエストを受信すると、ビジネスクラスのメソッドが呼ばれますが、その前にそのビジネスクラスのpreprocessメソッドが
呼ばれます。
preprocessメソッドの復帰値により、その後の処理を制御できます。
復帰値
意味
Preprocessor.EVAL
ビジネスクラスの処理を継続します
Preprocessor.SKIP_DISPATCH
ビジネスクラスのメソッドを呼び出さず、後処理のみ実行します
Preprocessor.SKIP_ALL
ビジネスクラスの呼び出しも後処理の実行も行いません
・ preprocessメソッドの記述例
import com.fujitsu.uji.Preprocessor;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler {
....
public int preprocess(DispatchContext context) {
// 前処理を記述します。
- 427 -
....
return Preprocessor.EVAL;
}
}
全ビジネスクラスに共通の前処理を作成する場合は、ビジネスクラスではなくセションクラスにPreprocessorインタフェースを実装しpreprocess
メソッドを作成します。 セションクラスのpreprocessメソッドは、どのビジネスクラスのメソッドが呼ばれる場合でも、その前に呼び出されま
す。
後処理用のメソッドを作成する
後処理用のメソッドは次のように作成します。
1. ビジネスクラスにcom.fujitsu.uji.Postprocessorインタフェースを実装します。GenericHandlerクラスを継承してビジネスクラスを作成
している場合はこの作業は不要です。GenericHandlerクラスがPostprocessorを実装しているためです。
2. ビジネスクラスにpostprocessメソッドを作成し、そこに後処理を記述します。
アプリケーションがリクエストを受信すると、ビジネスクラスのメソッドが呼ばれますが、正常に(例外をスローせずに)終了した場合、続い
てそのビジネスクラスのpostprocessメソッドが呼ばれます。
・ preprocessメソッドの記述例
import com.fujitsu.uji.Postprocess;
import com.fujitsu.uji.GenericHandler;
public class SampleHandler extends GenericHandler {
....
public Object postprocess(DispatchContext context, Object result) {
// 後処理を記述します。
....
return result;
}
}
全ビジネスクラスに共通の後処理を作成する場合は、ビジネスクラスではなくセションクラスにPostprocessorインタフェースを実装し
postprocessメソッドを作成します。 セションクラスのpostprocessメソッドは、どのビジネスクラスのメソッドが呼ばれる場合でも、そのあとに
呼び出されます。
PostprocessorがhandleExceptionメソッドを持つため、以下の場合はhandleExceptionメソッドも実装する必要があります。handleException
メソッドについては“F.7.4 ビジネスクラスのメソッドで発生した例外をまとめて処理したい”を参照してください。
・ ビジネスクラスに後処理を作成する場合で、そのビジネスクラスがGenericHandlerを継承していない場合
・ セションクラスに後処理を作成する場合
関連項目
・ セション管理の基本的な方法を知りたい
・ 共通処理
・ APIリファレンスのPreprocessor
・ APIリファレンスのPostprocessor
F.7.6
コンテナの起動時にアプリケーションを動作させたい
アプリケーションを最初に動作させる時に、環境設定ファイルの読み込みやクラスのロードなどのために時間がかかることがあります。
コンテナの起動時にアプリケーションを一度動作させることで、このような初期化時間の影響を少なくすることができます。
- 428 -
Webアプリケーションの場合
Webアプリケーションでは、サーブレットのスタートアップを利用して、コンテナの起動時にアプリケーションを動作させます。
以下の手順で作成します。
1. UjiServletを継承して、スタートアップ用のサーブレットクラスを作成します。
initメソッドからUjiServletのinitApplicationメソッドを呼び出します。
- サーブレットの記述例
public class MyServlet extends UjiServlet {
public MyServlet() {
}
public void init() {
try {
ApplicationProfile ap = initApplication();
} catch(Exception e) {
e.printStackTrace();
}
}
}
2. 固有のアプリケーション初期化処理を記述する場合は、アプリケーションクラスを利用して記述します。
3. スタートアップ用のサーブレットをWebアプリケーション環境定義ファイル(web.xml)で指定します。
load-on-startupを指定することで、コンテナの起動時に呼び出されます。
- web.xmlの記述例
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>somePackage.MyServlet</servlet-class>
<load-on-startup/>
</servlet>
EJBアプリケーションの場合
Interstage Application Serverのワークユニット機能を利用して、ワークユニット起動時にApcoordinatorで作成したセションBeanを実行す
ることができます。
1. Interstage管理コンソールでワークユニットを選択し、[実行クラス][新規作成]で、以下の情報を作成します。
項目
指定方法
名前
Initializerなど、適宜設定します。
クラス名
com.fujitsu.uji.ejb.workunit.Initializerを指定します。
実行順
任意に指定します。
引数
セションBeanのJNDI名をjava:comp/env/ejb/SomeEJBのような形式で指定
します。
例外発生時のワークユニット起動
任意に指定します。
ワークユニット多重時の呼び出し
[すべてのVMで呼び出し]を選択します。
クラスを実行するコンテナ
[EJBコンテナ]を選択します。
2. 固有のアプリケーション初期化処理を記述する場合は、以下のようにビジネスクラスを作成します。
作成したビジネスクラスは、Beanなし、コマンドはuji.initializeとしてコマンドマップに登録します。
- ビジネスクラスの記述例
package somepackage;
import com.fujitsu.uji.GenericHandler;
- 429 -
public class SomeHandler extends GenericHandler
{
public void startEjb(DispatchContext context) {
...
}
...
}
- コマンドマップの記述例
;uji.initialize=somepackage.SomeHandler.startEjb
関連項目
・ ワークユニット起動時実行クラスの設定
・ APIリファレンスのUjiServletクラス
F.7.7
ビジネスロジックをJavaではなくXMLで記述したい
Apcoordinatorの「コマンドスクリプティング」を利用すると、ビジネスクラス全体をJavaで記述する代わりに、処理のフローをXML形式で
記述しJavaの記述を必要な部分のみに限定することができます。
・ コマンドスクリプティングの記述例
<?xml version="1.0" encoding="UTF-8"?>
<commandMap
xmlns=http://interstage.fujitsu.com/schemas/uji/commandMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/commandMap
http://interstage.fujitsu.com/schemas/uji/commandmap.xsd">
<config>
<version>5.0</version>
</config>
<!-- ユーザが初めてアプリケーションにアクセスしたときの処理を定義 -->
<entry>
<newBean cls="sample1.BodyBean"/>
<copyValue bean="#ようこそ" targetProperty="message"/>
<setResponseBean pane="body" verb="reqmode" />
</entry>
<!-- 入力のデータBeanが sample1.BodyBeanで、コマンドがokの時の処理を定義 -->
<entry bean="sample1.BodyBean" verb="ok">
<!-- 入力値のチェック -->
<validate property="value" type="int" minValue="0" maxValue="10" statusText="valueError" />
<!-- Javaクラスの呼び出し -->
<invoke name="sample1.MyHandler.update" />
<setResponseBean pane="body" verb="resmode"/>
<catch status="valueError">
<copyValue bean="#値は0以上10以下で入力してください" targetProperty="message" />
<setResponseBean pane="body" verb="retry"/>
</catch>
</entry>
</commandMap>
コマンドスクリプティングには、以下の機能があります。
・ 入力値の検証
・ EJBの呼びだし
- 430 -
・ 一般のクラスの呼びだし
・ XMLデータ仕様記述の呼びだし
・ データBeanの領域への対応付け
・ ログの出力
・ サブルーチンの定義
・ 例外のキャッチ
コマンドスクリプティングを利用すると、以下のメリットがあります。
・ 処理のフローが明確になる
・ Javaの処理を細分化し、再利用を容易にする
・ 修正時の再構築が不要で、変更が容易にできる
以下のような場合は、Javaで記述する必要があります。
・ 分岐や条件を伴い、一連のフローで表現できない場合
・ 実行性能を追求する場合
コマンドスクリプティングの記述の構成
コマンドスクリプティングの記述は以下の構成になっています。
<?xml version="1.0" encoding="UTF-8"?>
<commandMap>
<!-- コマンドスクリプティングの動作を設定 -->
<config>
....
</config>
<!-- bean, verbで指定したデータBean,コマンドを受けて実行する処理を記述 -->
<entry bean="入力のデータBeanのクラス名" verb="コマンド">
....
</entry>
<!-- 同様に entryタグを必要なだけ記述 -->
....
<!-- サブルーチンを定義 -->
<procedure name="サブルーチン名">
....
</procedure>
<!-- 同様に必要なだけサブルーチンを定義 -->
....
</commandMap>
Webアプリケーションの場合、ユーザが初めてアプリケーションにアクセスしたときの処理は、bean, verbアトリビュートを省略したentryタ
グに記述します。
上記の記述では文字エンコーディングが"UTF-8"となっていますが、"Shift_JIS"等、Javaでサポートされている各種のエンコーディング
が利用できます。
処理の記述
entry, procedureタグのコンテントには処理を実行するためのタグを記述します。簡単な例で基本的なタグの使い方を説明します。
- 431 -
・ データBeanのインスタンスを新しく作成して領域に対応付ける
<entry>
<newBean cls="sample1.BodyBean" bean="uji.current"/>
<copyValue bean="#ようこそ" targetBean="uji.current" targetProperty="message"/>
<setResponseBean pane="body" bean="uji.current" verb="reqmode" />
</entry>
この記述例で使用しているタグを解説します。
newBeanタグ
インスタンスを新しく作成します。Java のnew 演算子に相当します。クラス名をclsアトリビュートで指定します。作成されたインスタン
スは、beanアトリビュートで指定したスクリプトデータ名で保存されます。スクリプトデータとは、コマンドスクリプティングで使用する変
数です。
copyValueタグ
データBeanのプロパティの値を別のプロパティにコピーします。bean, propertyアトリビュートで指定したプロパティの値をtargetBean,
targetPropertyアトリビュートで指定したプロパティにコピーします。この記述例ではプロパティの値ではなく文字列定数をプロパティ
に代入するためにcopyValueタグを使用しています。beanアトリビュートに"#"に続けて文字列を指定すると、その文字列がtargetBean,
targetPropertyで指定したプロパティに代入されます。従って、記述例では「ようこそ」がBodyBeanのmessageプロパティに代入され
ます。
setResponseBeanタグ
paneアトリビュートで指定された領域にデータBeanを対応付けます。データBeanのスクリプトデータ名をbeanアトリビュートで指定し
ます。表示モードを設定したい場合は、verbアトリビュートで指定します。設定不要の場合はverbを省略できます。
スクリプトデータ名"uji.current"はApcoordinatorで予約されている特別な名前で、現在処理中のオブジェクトを保存するために使用さ
れています。newBean, setResponseBean タグのbeanアトリビュートやcopyValueタグのtargetBeanアトリビュートを省略した場合
は、"uji.current"が指定されたものとみなされます。従って、上記の記述例は以下のように短く書くことができます。
<entry>
<newBean cls="sample1.BodyBean"/>
<copyValue bean="#ようこそ" targetProperty="message"/>
<setResponseBean pane="body" verb="reqmode" />
</entry>
この3つ以外のタグでも多くの場合同様のルールが適用されます。
もう少し複雑な例を説明します。
・ 入力値のチェックと、Javaクラスの呼び出しを行なう例
<entry bean="sample1.BodyBean" verb="ok">
<!-- 入力値のチェック -->
<validate property="value" type="int" minValue="0" maxValue="10" statusText="valueError" />
<!-- Javaクラスの呼び出し -->
<invoke name="sample1.MyHandler.update" />
<setResponseBean pane="body" verb="resmode"/>
<catch status="valueError">
<copyValue bean="#値は0以上10以下で入力してください" targetProperty="message" />
<setResponseBean pane="body" verb="retry"/>
</catch>
</entry>
この記述例で使用しているタグを解説します。
validateタグ
入力値のチェックを行ないます。チェックの対象となるデータBeanとプロパティ名をbean, propertyアトリビュートで指定します。記述
例ではbeanが省略されているため"uji.current"が指定されたと見なされます。entryタグの直後では、"uji.current"にはリクエストBean
(記述例ではsampl1.BodyBeanクラス) が保存されているため、BodyBeanのvalueプロパティがチェックの対象となります。 検証の内容は
type, minValue, maxValueアトリビュートなどで指定します。type="int" はプロパティの値をint型とみなすことを指定します。minValue,
maxValueは許容する最小値、最大値を指定します。プロパティの値がこの範囲外の場合はエラーとなり、例外が発生します。この
- 432 -
例外は、後述するcatchタグで処理できます。statusTextには、エラーが発生した時に、例外に付加する付加情報を文字列で指定し
ます。catchタグでは、特定の付加情報を持つ例外のみを選んで処理することができます。
catchタグ
例外処理を記述します。catchタグのコンテントに例外処理を記述します。 statusアトリビュートに文字列を指定すると、その文字列
を付加情報として持つ例外のみを処理します。記述例では、catchタグのstatusにvalidateタグのstatusTextと同じ文字列を指定して
いるため、validateタグで値をチェックしてエラーとなった場合にcatchタグの処理が実行されます。
invokeタグ
サブルーチン、Javaクラスのメソッド、EJBセションBeanを呼び出します。記述例ではJavaクラスのメソッドの呼び出しに使用していま
す。この場合、呼び出すJavaクラスのメソッドをnameアトリビュートで"クラス名.メソッド名"の形式で指定します。メソッドに引数として
与えるデータBeanはbeanアトリビュートで指定しますが、ここでは省略されているため、"uji.current"に保存したデータBeanが与えら
れます。呼び出されるメソッドのシグネチャはビジネスクラスのメソッドと同様に以下の形式で作成してください。
public void someMethod(com.fujitsu.uji.DispatchContext context, [データBeabのクラス名] data);
メソッドの返却値は、resultアトリビュートで指定したスクリプトデータ名で保存されます。記述例ではresultを省略しているため、スク
リプトデータ名"uji.current"で保存されます。
作成したコマンドスクリプティング記述を使用する
作成したコマンドスクリプティング記述を使用するには、コマンドマップにコマンドスクリプティング記述のファイル名を記述します。コマ
ンドマップと同じディレクトリにコマンドスクリプティング記述"comscript.xml"を置いた場合、コマンドマップに次の1行を追加します。
+comscript.xml
以上で説明した以外の機能については、“定義ファイルリファレンス”、“第10章 コマンドスクリプティング”を参照してください。
関連項目
・ コマンドスクリプティング
・ コマンドマップ
・ 定義ファイルリファレンス
F.7.8
Apcoordinatorの定義ファイルを分割して作成したい
以下のファイルは他のファイルをインクルードすることができるため、分割して作成できます。
・ コマンドマップ、ページマップ
・ XMLで記述するファイル(コマンドスクリプティング、リモートマップ、XMLデータ仕様記述、リソースファイル、データBean変換マッ
プ)
コマンドマップ、ページマップの分割
コマンドマップ、ページマップ中に"+"に続けてファイル名を書くと、そのファイルをインクルードできます。ファイル名はコマンドマップの
あるフォルダからの相対パスで記述します。パス区切り文字は"/"です。コマンドマップからインクルードするファイルの拡張子が.xmlの
場合は、コマンドスクリプティングとして扱われます。以下はコマンドマップを分割する例です。
・ コマンドマップcommands.map(インクルードする側)
# このファイルと同じフォルダにあるsub.mapをインクルード
+sub.map
# サブフォルダcompo1にあるcmd.mapをインクルード
+compo1/cmd.map
# 通常のエントリを混在して書くことも可能
;=calc.CalcHandler.startup
- 433 -
・ コマンドマップsub.map(インクルードされる側)
calc.BodyBean;add=calc.CalcHandler.add
calc.BodyBean;sub=calc.CalcHandler.sub
calc.BodyBean;next=calc.CalcHandler.next
また、以下の方法でも、コマンドマップとページマップを分割することができます。
・ WEB-INF フ ォ ル ダ の 下 に commands.map 、 pages.map と い う 名 前 の フ ォ ル ダ を 作 り 、 そ の 下 に フ ァ イ ル を 置 い て く だ さ い 。
commands.mapフォルダ内のファイルはすべてコマンドマップとして、pages.mapフォルダ内のファイルはすべてページマップとして
使用されます。
この方法は、Webアプリケーション、電子フォームアプリケーションで使用可能です。
XMLで記述するファイルの分割(コマンドスクリプティング、リモートマップ、XMLデータ仕様記述、リソースファイル、データ
Bean変換マップ)
XMLで記述するファイルの場合は、XMLのエンティティ宣言を使うとファイルをインクルードできます。 インクルードする側のDTDで、
インクルードされる側のファイルをエンティティとして宣言します。
DTDは以下の書式でXML宣言 (<?xml ... ?>の書式) の直後に記載します。
<!DOCTYPE ルート要素名 [
DTDの内容
]>
ここで、「ルート要素名」は定義ファイルの種類に応じて以下を使用します。
定義ファイル
ルート要素名
コマンドスクリプティング
commandMap
リモートマップ
remoteMap
XMLデータ仕様記述
eSpec
リソースファイル
ujiResource
データBean変換マップ
convMap
「DTDの内容」にエンティティ宣言を以下の書式で記述します。複数のファイルをインクルードする場合は、そのファイルの数だけエン
ティティ宣言を記述します。
<!ENTITY エンティティ名 SYSTEM "インクルードするファイル名">
「インクルードするファイル名」は、設定ファイルフォルダからの相対パスで指定します。設定ファイルフォルダは、コマンドマップ、リモー
トマップなどのApcoordinatorの定義ファイルを置くフォルダです。例えば、Webアプリケーションの場合は、WEB-INFディレクトリです。
なお、1階層上のフォルダを表す「..」を相対パス中に含めることはできません。また、インクルードされるファイルからさらに別のファイル
をインクルードすることはできません。
「エンティティ名」は、インクルードするファイルを参照するための名前です。XML中に以下のようにエンティティ名を記述することによ
り、その位置にファイルがインクルードされます。
&エンティティ名;
以下は、リモートマップを分割する例です。
・ リモートマップremote.xml(インクルードする側)
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE remoteMap [
<!ENTITY sub1 SYSTEM "subremote1.xml">
]>
<remoteMap>
<config>
<version>5.0</version>
</config>
- 434 -
<!-- subremote1.xmlをインクルード -->
&sub1;
<!-- 通常のエントリを混在して書くこともできる -->
<ejb name="MySessionBean" application="java:comp/env/ejb/MySessionBean"/>
</remoteMap>
・ リモートマップsubremote1.xml(インクルードされる側)
<?xml version="1.0" encoding="Shift_JIS"?>
<ejb name="CartBean" application="java:comp/env/ejb/CartBean"/>
<ejb name="OrderBean" application="java:comp/env/ejb/OrderBean"/>
注意
コマンドスクリプティング、リモートマップ、リソースファイル、データBean変換マップでファイルのインクルードを使用する場合は、インク
ルードする側のファイル、インクルードされる側のファイルは設定ファイルフォルダ配下(サブフォルダ含む)に置いて使用します。
注意
XMLデータ仕様記述でファイルのインクルードを利用する場合は以下の注意事項があります。
・ XMLデータ仕様記述をインタープリタで実行する場合、チェック定義エンジン (com.fujitsu.uji.xscript.ESpecValidator) に対して以
下の処理が必要です。
- setXmlメソッドを呼ぶ前に、setInfLoaderメソッドでInfLoaderをセットする必要があります。記述例は“F.2.1 入力項目に入力され
たデータが適切かどうかチェックしたい”を参照してください。
- setXmlメソッドに入力ストリーム (java.io.InputStream) を渡す場合は、XMLデータ仕様記述のファイル名を第2引数に指定する
必要があります。
・ XMLデータ仕様記述をインタープリタで実行する場合、インクルードする側のファイル、インクルードされる側のファイルは設定ファ
イルフォルダ配下(サブフォルダ含む)に置いて使用します。
・ XMLデータ仕様記述コンパイラ利用時は、インクルードするファイル名はカレントディレクトリからの相対パスとなります。
関連項目
・ コマンドマップ
・ XMLデータ仕様記述
・ コマンドスクリプティング
・ リモートマップ
・ リソースファイル
F.7.9
例外発生時に処理を再試行したい
排他制御によってデータベースに一時的にアクセスできなかった場合など、エラーが発生しても同じ処理を再度実行することによって
正常に処理が完了できる場合があります。このような場合に以下の機能を使用すると、自動的に同じ処理を再度実行することができま
す。
ビジネスクラス再試行機能
ビジネスクラスが例外を発生した場合に、ビジネスクラスを再度実行する機能です。
EJB再試行機能
EJBセションBean (以降、単にセションBeanと呼びます) がアプリケーション例外を発生した場合に、再度自動的にセションBeanを
呼び出す機能です。Apcoordinatorで作成したセションBeanを呼び出す場合に使用できます。
- 435 -
セションBeanの処理を再試行したい場合は、上記のどちらの機能を使用しても再試行が実現できます。この場合、上記2つの機能に
は以下の違いがあります。
使用する機能
左記機能を使用するアプリ
ケーションと再試行の動作
利点
注意点
ビジネスクラス再
試行機能
セションBeanで使用しま
す。セションBeanの内部で
ビジネスクラスの処理を再
試行します。
再試行時に呼び出し元と
の通信が発生しません。
EJBコンテナがEJBの実行時間を監視して
タイムアウト時にEJBを停止するよう設定し
ている場合は、再試行中にタイムアウトとな
らないようにタイムアウト時間の設定に注意
が必要です。
EJB再試行機能
セションBeanの呼び出し側
で使用します。呼び出し側
でセションBeanの呼び出し
を再試行します。
呼び出すセションBeanの
内部で再試行を実装して
いない場合でも、再試行を
実現できます。
再試行するたびにセションBeanとの通信が
発生します。
以降では、ビジネスクラス再試行機能とEJB再試行機能の基本的な使用方法を説明します。これらの機能の詳細は以下を参照してく
ださい。
・ 4.6 ビジネスクラスの再試行
・ 8.6 EJBの再試行
ビジネスクラス再試行機能
ビジネスクラス再試行機能を使用すると、以下の条件でビジネスクラスが再試行されます。
・ ビジネスクラスのうちコマンドマップで指定されたもの(以降、ビジネスメソッドと呼びます)が、例外としてjava.lang.Exceptionまたはそ
のサブクラスを発生した場合。ただしjava.lang.RuntimeExceptionとそのサブクラスは除きます。以降、再試行を起こす例外を再試
行例外と呼びます。
- 436 -
・ com.fujitsu.uji.DispatchContextクラスのsetRetryメソッドが呼び出された場合。この場合、メソッドが再試行例外を発生しなくても、メ
ソッドの終了後に再試行されます。例外を発生させずに再試行させたい場合にこのメソッドを使用します。
ビジネスクラス再試行機能を使用するには、com.fujitsu.uji.GenericRetriableHandlerクラスを継承してビジネスクラスを作成します。デ
フォルトでは再試行に関する設定は以下のとおりです。
・ 再試行間隔は100ミリ秒です。ビジネスメソッドが再試行例外を発生した場合に、100ミリ秒待ってから再試行します。
・ 再試行最大回数は2回です。2回再試行しても再試行例外が発生する場合はそれ以上再試行せずに例外を発生します。初回の
実行を合わせて最大で合計3回ビジネスメソッドが実行されます。
・ GenericRetriableHandlerを継承したビジネスクラスのビジネスメソッド全てで再試行が有効です。
ビジネスクラス設定ファイルを作成すると、再試行の有無、再試行間隔、再試行最大回数をビジネスメソッドごとに指定できます。詳細
については“4.6 ビジネスクラスの再試行”を参照してください。
EJB再試行機能
EJB再試行機能を使用すると、セションBeanがある特定のアプリケーション例外を発生した場合に、セションBeanの呼び出しが再試行
されます。再試行を起こすアプリケーション例外を再試行例外と呼びます。再試行例外として使用する例外クラスはアプリケーション開
発者が指定します。
EJB再試行機能を使用してEJBを呼び出すには、リモート共通インタフェースを使用し、EJBを呼び出すアプリケーションを以下のよう
に作成します。
1. リモートマップを作成して、呼び出すセションBeanの名前と再試行のパラメータを定義します。リモートマップは、リモート共通イ
ンタフェースにおいて、呼び出されるアプリケーションを定義するXMLファイルです。 以下は、EJB再試行機能を使う場合のリ
モートマップの記述例です。
<?xml version="1.0" encoding="Shift_JIS"?>
<remoteMap
xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap
http://interstage.fujitsu.com/schemas/uji/remotemap.xsd">
<config>
<version>5.0</version>
</config>
<!-- EJB再試行機能を使って呼び出すセションBeanを定義します。-->
<ejbExt name="MySessionBean">
<application name="java:comp/env/ejb/MySessionBean" />
<retriableException class="some.pkg.BusyException" />
<retriableException class="some.pkg.NotReadyException" />
</ejbExt>
</remoteMap>
ejbExtタグを使って呼び出すセションBeanを記述します。セションBeanに与える名前をejbExtタグのnameアトリビュートに指定し
ます。ejbExtタグのコンテントには以下のタグを記述します。
applicationタグ
JNDIで検索するセションBeanの名前をnameアトリビュートに指定します。
retriableExceptionタグ
再試行例外を定義します。classアトリビュートに例外クラスを指定します。セションBeanを呼び出した結果、アプリケーション
例外が発生し、その例外のクラスがclassアトリビュートに指定したクラスと同じか、そのサブクラスであった場合に、再試行しま
す。なお、以下のクラスを再試行例外に指定することはできません。
- java.lang.RuntimeExceptionとそのサブクラス
- java.rmi.RemoteExceptionとそのサブクラス
- java.lang.Exception
- java.lang.Errorとそのサブクラス
- 437 -
また、必要に応じてejbExtタグには以下のアトリビュートを指定できます。
retryCountアトリビュート
再試行最大回数を指定します。例えば2を指定すると、初回の呼び出しを含めて最大で合計3回呼び出されます。デフォルトは
2です。
retriableExceptionタグ
再試行例外を検出してから再試行するまでの時間をミリ秒単位で指定します。デフォルトは100ミリ秒です。
リモートマップは設定ファイルフォルダに置きます。設定ファイルフォルダは、コマンドマップ、リモートマップなどのApcoordinator
の定義ファイルを置くフォルダです。例えば、Webアプリケーションの場合は、WEB-INFディレクトリです。
2. CallFactoryインタフェースとCallインタフェースを使ってセションBeanを呼び出します。
com.fujitsu.uji.ext.CallFactoryとcom.fujitsu.uji.ext.Callの2つのインタフェースを使用してセションBeanを呼び出します。これらの
インタフェースは、リモート共通インタフェースにおいてアプリケーションを呼び出すためのインタフェースです。
CallFactoryインタフェースとCallインタフェースを使った呼び出しの手順は以下のとおりです。
1. com.fujitsu.uji.DispatchContextクラスからCallFactoryインタフェースを取得します。
2. セションBeanの名前(ejbExtタグのnameアトリビュートに指定したもの)を指定してCallFactoryインタフェースからCallインタ
フェースを取得します。この処理によって、セションBeanオブジェクトが作成されます。
3. データBeanとコマンド名を引数としてCallインタフェースのinvokeメソッドを呼び出すと、セションBeanが呼び出されます。
セションBeanが再試行例外を発生した場合は、セションBeanが再度呼び出されます。
以下はビジネスクラスからセションBeanを呼び出す例です。
import
import
import
import
import
import
com.fujitsu.uji.DispatchContext;
com.fujitsu.uji.ext.CallFactory;
com.fujitsu.uji.ext.Call;
com.fujitsu.uji.ext.UjiCreateException;
com.fujitsu.uji.ext.UjiRemoteException;
com.fujitsu.uji.ext.UjiTargetException;
...
public Object doSomething(DispatchContext context, SomeBean dataBean) {
// CallFactoryインタフェースを取得します。
CallFactory factory = context.getCallFactory();
try {
// セションBeanの名前を指定してCallインタフェースを取得します。
Call call = factory.createCall("MySessionBean");
// 送信するデータとコマンド名を指定してセションBeanを呼び出します。
ResBean response = (ResBean)call.invoke(dataBean,"update");
} catch (UjiCreateException e) {
...
} catch (UjiRemoteException e) {
...
} catch (UjiTargetException e) {
...
}
...
}
再 試 行 最 大 回 数 だ け 再 試 行 を 繰 り 返 し て も セ シ ョ ン Bean が 例 外 を 発 生 す る 場 合 、 invoke メ ソ ッ ド は
com.fujitsu.uji.ejb.EJBApplicationException を 発 生 し ま す 。 セ シ ョ ン Bean で 発 生 し た 例 外 は 、 EJBApplicationException の
getRootCauseメソッドにより取得できます。
再試行間隔、再試行最大回数の決定
再試行間隔、再試行最大回数は、アプリケーションに要求される応答時間を考慮して決定します。ビジネスクラスの実行時間(ビジネス
クラス再試行機能の場合)や Callインタフェースのinvokeメソッドの実行時間(EJB再試行機能の場合)の最大値は、以下の式で見積も
れます。
- 438 -
処理時間 * (再試行最大回数 + 1) + 再試行間隔 * 再試行最大回数
ここで、処理時間は以下を指します。
・ ビジネスクラス再試行機能の場合、ビジネスメソッドとbeforeMethodCompletionメソッドの処理時間です。
・ EJB再試行機能の場合、EJB再試行機能を使用しない場合のinvokeの実行時間であり、EJBコンテナとの通信、EJBコンテナ上に
おけるセションBeanの実行時間を含みます。
注意
再試行間隔の精度はご使用になるシステムに依存します。 10ミリ秒より高い精度による指定はシステムによっては有効にならない場合
があります。
関連項目
・ ビジネスクラスの再試行
・ EJBの再試行
・ リモート共通インタフェース
・ リモートマップ
F.7.10
JavaScriptと連携したい
JavaScriptの利用を支援するタグとして、uji:inputなどのクライアントスクリプトタグが用意されています。また、uji:fieldString等のフィー
ルドタグには入力値の有無、最大字数、文字種などを検査する機能があり、JavaScriptを記述することなくこれらの機能が実現できま
す。詳細は“UJIタグリファレンス”をご覧ください。
F.7.11
XML連携機能とデータBeanとの性能差について知りたい
以下のタグでXML連携機能を使用する場合、従来のデータBeanや項目クラスを使用する場合に比べると処理に時間がかかります。
・ コレクションタグ(uji:comboBox、uji:buttonList、uji:listBox、uji:recordView、uji:tableView、uji:treeViewタグ)
・ uji:table、uji:list、uji:treeタグ
従来のデータBeanや項目クラスを使用する場合との性能差は使用するXMLプロセッサに依存します。性能測定を実施するなどして
性能要件を満たすかどうかを確認してください。
なお、上記のタグでXML連携機能を使用する場合にXML用項目クラスを使用すると、XMLデータBeanだけを使用する場合に比べ
て、表示、更新がより高速になります。
F.7.12
データBean生成ウィザードを使用せずに、入出力ページ生成ウィザードを使
用したい
データBean生成ウィザードを使わずに作成したデータBeanをプロジェクトに登録したあとに、入出力ページ生成ウィザードを使用する
ことは可能です。ただし、入出力ページ内に表示項目や入力項目は自動生成されません。
F.7.13
データBean生成ウィザードで選択肢にない型のプロパティを追加したい
データBean生成ウィザードで、選択肢にないクラスやユーザ定義クラスをプロパティとするには、以下のように操作します。
・ 選択肢にないオブジェクトを、ウィザード画面の入力部分に直接入力する
F.7.14
ログの出力レベルの使い分けについて知りたい
ログの出力レベルを大きく設定しておくと、問題が発生した時に解決のための詳細な情報が取得できます。
ただし、ログの出力レベルを大きく設定するとサーバ負荷が大きくなるため、状況に応じて調整することを推奨します。
- 439 -
一例として、開発時はログの出力レベルを"20"に設定して詳細なログを出力し、運用時はログの出力レベルを"10"に設定して実行状
況のログのみ出力するようにすることが考えられます。
F.7.15
ApcoordinatorからのEJBの呼出し方法を知りたい
JNDIの初期コンテキストの取得やホームインタフェースの取得などのアプリケーション単位で初期化が必要なものは、Apcoordinatorの
アプリケーションクラスに記述します。リモートインタフェースの呼び出しなどリクエスト単位で必要な処理はビジネスクラスから呼び出し
ます。なお、Apcoordinatorが提供するEJB呼び出しの機能を使用すると、JNDIへのアクセスをプログラムする必要がありません。また、
取得したホームインタフェースは自動的にアプリケーションクラスに保存され再利用されますので、ホームインタフェースをアプリケー
ション単位で初期化する処理は不要になります。
F.7.16
Apcoordinatorアプリケーションの設計手順を知りたい
Apcoordinatorアプリケーションの設計には、再利用性を高めるため、設計の段階では従来に無い手順が要求されます。もっとも顕著
な違いは、明示的にデータ、表示、手続きを分離して設計する必要があります。流れは以下のとおりです。
1. 画面を設計する
2. 各部品に分割
3. 各部品に対して入出力するデータの一覧を作る
4. 各部品に対してビジネスクラスのメソッド一覧を作る
5. データBean作成
6. 入出力ページ作成とページレイアウト修正
7. ビジネスクラス作成
F.7.17
入出力ページのボタンから呼び出されるメソッドを知りたい
入出力ページのボタンを押したときに、呼び出されるメソッドについて説明します。
1. 入出力ページ側で、ボタンを表示するINPUTタグの中に"name=(コマンド名)"を定義します。コマンド名とは、ボタンが押された
と き に 送 ら れ る サ ー バ に 送 ら れ る 文 字 列 を あ ら わ し ま す 。 こ の と き サ ー バ に hidden 属 性 で 一 緒 に 送 る 文 字 列 と し て 、
name="uji.verbs"の値として、"value=(コマンド名)"を追加してください。
以下の例では、ボタンが押されるとhidden属性として、"uji.verbs"の値と、"uji.id"の値がサーバに送られます。uji.idの値は領域
名を記述します。uji:useBeanの中でuji.idと対応するBeanクラス名が記述されています。
- 入出力ページの例(抜粋)
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="menu" request="true" cls="board.ProfileBean" />
......
<INPUT type="hidden" value="selectuser" name="uji.verbs">
<INPUT type="hidden" value="menu" name="uji.id">
......
<INPUT type="submit" value="選択" name="selectuser">
......
2. commands.map側で、入出力ページに定義したデータBeanとコマンドの組に加えて、パッケージ名を含むビジネスクラス名と呼
ばれるメソッドを記述します。以下は、1で示した入出力ページのボタンが押されたときに呼ばれるメソッド名とし
て、"showUserSchedule"を定義した時の例です。BoardHandlerクラスにメソッドは実装されているものとします。
- commands.mapの例(抜粋)
# commands.map
.....
board.ProfileBean;selectuser=board.BoardHandler.showUserSchedule
.....
- 440 -
3. 2で記述したメソッドをビジネスクラスに実装します。引数としてcommands.mapで記述したBean名にします。上記引数から、値を
取り出し、処理を行うロジックを実装します。
- showUserScheduleメソッドの例(抜粋)
public void showUserSchedule(DispatchContext context, ProfileBean dataBean) {
.....
この中にボタンが押されたときの処理を記述します。
.....
}
F.7.18
負荷分散装置を利用するときの注意事項を知りたい
Apcoordinatorアプリケーションに関して特に注意事項はありませんが、サーブレットやJSPが正常に動作する必要があります。
Interstage Application Serverを利用している場合は、“Interstage Application Server 高信頼性システム運用ガイド”を参照してください。
F.7.19
性能・負荷テストツールを使用する場合の注意事項を知りたい
Apcoordinatorでは、UJIタグが動的に値を生成する場合があります。そのため、性能・負荷テストツールであらかじめ決められたリクエ
ストパラメタを送信してもフレームワークが正常に動作しません。
UJIタグが生成する値を静的にするためには、初期化パラメタuji.model.viewNameを使用してください。uji.model.viewNameの詳細
は“13.3 初期化パラメタ”を参照してください。
- 441 -
付録G トラブルシューティング
本付録では、既知のトラブルについて、現象と解決方法を説明します。
G.1 例外発生時の対処
ここでは、例外が発生したときの対処方法について説明します。
G.1.1
例外発生時の原因調査方法
アプリケーション実行時にApcoordinatorの例外が発生しましたが、原因がわかりません。
Apcoordinatorが発生させる例外のメッセージには、「UJIxxx」の形式のエラーコードが付けられています。 例外の原因を特定するに
は、“メッセージ集”を参照してエラーの内容を確認してください。
別の例外が原因となってApcoordinatorが例外を発生させる場合もあります。 この場合には、以下の方法によって、原因となった元の
例外を調べる ことができます。
・ ログの確認
以下のログに記録されている例外の情報を確認してください。
- アプリケーションがApcoordinatorのログ機能を使ってログの出力先を設定している場合は、そのログ。
- アプリケーションサーバ(サーブレットコンテナ、EJBコンテナなど)のログ。
Interstageの場合は、Interstage管理コンソールから参照できます。Interstage管理コンソールの左のペインからアプリケーション
を運用しているワークユニットを選択し、右のペインで[ログ参照]タブを選択してログを参照してください。
例外の発生箇所によっては、Apcoordinatorがcatchした例外が上記のログに出力されます。 また、 アプリケーションサーバが例外を
catchしている場合は、アプリケーションサーバのログに出力されている場合があります。
WebアプリケーションでEJB呼び出し関連の例外が発生している場合は、 EJBで発生した例外が原因の場合があります。 EJBが出
力しているログや、EJBコンテナのログも確認してください。
・ ラップされている例外の取得
Apcoordinatorが発生する例外のうち、com.fujitsu.uji.log.NestedException インタフェースを実装したものは元の例外をラップして
おり、NestedExceptionのgetRootCauseメソッドで元の例外を取得できます。
アプリケーション開発時には、以下のように一時的に処理を追加することで、 元の例外を再帰的に取り出して標準エラー出力に出
力できます。
例外が発生しているメソッドが特定できている場合は、メソッド内の処理をtry, catchで囲って以下のようにプログラムします。
try {
...
} catch (Throwable t) {
for( ; ; ) {
t.printStackTrace();
if(!(t instanceof com.fujitsu.uji.log.NestedException)) {
break;
}
System.err.println("root cause:");
t = ((com.fujitsu.uji.log.NestedException)t).getRootCause();
}
}
例外が発生しているメソッドが特定できない場合は、 ビジネスクラス、セションクラス、アプリケーションクラスのいずれかに
handleExceptionメソッドを追加して元の例外のスタックトレースを出力する処理を実行します。 例外が発生しているビジネスクラス
が特定できている場合、そのビジネスクラスのhandleExceptionを、特定できていない場合は、セションクラスかアプリケーションクラスの
handleExceptionを使用します。
- handleExceptionを追加するクラスがcom.fujitsu.uji.Postprocessorインタフェースを実装していない場合は、そのクラスで実装す
るインタフェースにPostprocessorを追加します。ビジネスクラスにhandleExceptionを追加する場合で、そのビジネスクラスが
- 442 -
com.fujitsu.uji.GenericHandlerを継承している場合は、すでにPostprocessorが実装済みですのでPostprocessorの追加は不要
です。
- 以下のようにhandleExceptionメソッドを追加します。
public Object handleException(DispatchContext context, Throwable th) throws Throwable {
Throwable t = th;
for( ; ; ) {
t.printStackTrace();
if(!(t instanceof com.fujitsu.uji.log.NestedException)) {
break;
}
System.err.println("root cause:");
t = ((com.fujitsu.uji.log.NestedException)t).getRootCause();
}
throw th;
}
標準エラーはアプリケーションサーバのワークユニットのログに出力されます。
G.1.2
java.lang.NoClassDefFoundError: org/xml/sax/ContentHandler
アプリケーションを実行すると例外「java.lang.NoClassDefFoundError: org/xml/sax/ContentHandler」が発生しま
す。
SAX2.0に準拠したクラスライブラリが利用可能になるようにコンテナを設定してください。コマンドスクリプティング、XMLデータ仕様記
述、リモートマップ、データBean変換マップ、ログ定義ファイル、ビジネスクラス設定ファイルを使用する場合は、SAX2.0に準拠したライ
ブラリが必要です。SAX2.0に準拠したライブラリとしては、Fujitsu XML プロセッサ、Apache Xerces、JDK/JRE 5.0 が提供するXMLプ
ロセッサがあります。
G.1.3
UJI505: method not supported.
XMLデータBeanを利用したアプリケーションを実行すると、例外"UJI505: method not supported."が発生します。
XMLデータBeanを利用するには、以下のいずれかのXMLプロセッサが必要です。
・ Fujitsu XML プロセッサ
・ Apache が提供する Xerces と Xalan
・ JDK/JRE 5.0 が提供するXMLプロセッサ
これらが提供するライブラリが利用可能になるようにコンテナを設定してください。
G.1.4
IndexOutOfBoundsException
XML用項目クラスXmlComboBox、XmlButtonList、XmlListBoxでsetColorAtメソッドを呼び出すと例外
IndexOutOfBoundsExceptionが発生します。
setColorAtは以下の処理が完了してから呼び出してください。
・ XML用項目クラスのコンストラクタでXmlDataBeanを指定しなかった場合は、setXmlDataBeanメソッドを呼び出してXmlDataBeanを
与えます。
・ 必要ならsetXpath、setSelectedXPath、setValueAttrメソッドを呼び出してタグで使用する要素や属性を指定します。
G.1.5
java.io.IOException: パイプが切断されました
「java.io.IOException: パイプが切断されました。」という例外が発生しますが発生原因は何ですか?
一般的にサーブレット・コンテナからレスポンスを返却する際にサーブレット・ゲートウェイとサーブレット・コンテナ間が切断されていた
ことが考えられます。発生原因としては以下のことが考えられます。
- 443 -
1. クライアントで処理が中断された。
2. クライアントからリクエストを送信したあと、レスポンスが返ってくる前に同クライアントより再びリクエストが送信された。
3. サーブレット・ゲートウェイでタイムアウトが発生した。
4. クライアントでブラウザが強制停止された。
5. クライアントでリロードボタン、同じリンク先のボタンなどが連打された。
G.1.6
java.lang.NoClassDefFoundError: org/apache/commons/digester/
RuleSet
JavaServer Facesを利用したアプリケーションを配備してコンテナを起動すると例外
「java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet」が発生します。
コンテナ起動時に以下の例外とエラーメッセージがコンテナのログに記録される場合、コンテナのクラスパスに誤ってjsf-impl.jarを設定
している可能性があります。
・ 例外
java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet
・ メッセージ
クラス com.sun.faces.config.ConfigureListener のアプリケーションリスナの設定中にエラーが発生しました
(メッセージの内容は利用するアプリケーションサーバによって異なる場合があります。)
jsf-impl.jarはコンテナのクラスパスに設定せず、アプリケーションのWEB-INF¥libフォルダ内に配置してください。
JavaServer Facesを利用したアプリケーションでのJARファイルの設定については、JavaServer Facesユーザーズガイドの“実行時に必
要なファイル”を参照してください。
G.2 異常時の対処
ここでは、異常が発生したときの対処方法について説明します。
G.2.1
enableCharsアトリビュートで“¥”記号を有効にできない
“¥¥¥¥”のように“¥”を4個記述してください。例えば、enableChars="[0-9,¥¥¥¥]*"とすると、“1,200”、“¥1,980” などは有効にな
り、“1.0”、“$1,280”などは入力エラーになります。
G.2.2
「戻る」ボタンの擬似的な防止が正常に動作しない
uji:resourceTextタグを使用したブラウザの「戻る」ボタンの防止では、JavaScriptを用いて画面の履歴(history)を常に最新にすることで
擬似的に「戻る」ボタンを抑止しています。これに対して、ウィンドウ制御機能ではJavaScriptを用いてウィンドウの制御を実現しているた
め、「戻る」ボタンが押下されて一度画面が戻ったあとに最新の画面が表示されたタイミングで再びウィンドウが開く場合があります。
これを防止するためには、ウィンドウを閉じる処理で直接JavaScriptを用いるのではなく、必ずウィンドウ制御機能を用いてウィンドウを
閉じる処理を実行してください。
G.2.3
データBeanに対するメソッドの実行に時間が掛かる
画面項目が極端に多い場合は、Apcoordinatorが保持している過去の情報を削除する際に遅延する場合があります。UJIタグはJSPファイル
1つにつき50個以内を推奨しています。また繰り返しなどで多数の画面項目を表示する場合も遅くなる原因となるため、uji:tableView
などのコンポーネントタグでタグ数を抑えてください。
G.2.4
クライアントの日付を未来日にすると動作しない
サーバとクライアントの日付が異なる場合に、以下が問題となる可能性があります。それぞれの提供元に問い合わせてください。
・ クッキーの動作によるセション管理
ご利用になっているアプリケーションサーバに問い合わせてください。
- 444 -
・ 日付変更時のプロキシのキャッシュ動作
プロキシの提供元に問い合わせてください。
・ 日付変更時のブラウザのキャッシュ動作
必要に応じてキャッシュの有効期限を設定するのが一般的です。詳細はブラウザの提供元に問い合わせてください。
G.2.5
Interstage Application Serverのセションリカバリ機能が正常に働かない
セションリカバリ機能が動作するためには、バックアップ対象となるオブジェクトが直列化可能である必要があります。Apcoordinatorで
は以下のオブジェクトがバックアップ対象となります。
・ セションクラス
・ セションスコープに保存されるビジネスクラス
・ セションスコープに保存されるデータBean(DispatchContextクラスのsetResponseBeanメソッドで設定されたデータBean)
これらのクラス内に作成したフィールドがすべて直列化可能であることを確認してください。
G.2.6
EJBアプリケーションのログから呼出し元のWebアプリケーションログを参照
する
コンテキストIDを利用すると、WebアプリケーションのログとEJBアプリケーションのログを関連付けて参照することができます。 EJBアプ
リケーションが出力したログのコンテキストIDは、EJBアプリケーションを呼び出したWebアプリケーションログのコンテキストIDと一致し
ます。
G.2.7
問題発生時にログを取得する
Apcoordinatorのログ機能では、アプリケーションに記述を行わなくても実行状況を表すログを自動的に出力することができます。
問題が発生した時は、ログの出力レベルを大きく設定することにより、詳細な情報をログに出力することができます。
例えば、ログの出力レベルを"10"に設定した場合、内部の実行状況を表すログを出力することができます。また、ログの出力レベル
を"20"に設定した場合、データBeanのダンプや詳細な実行状況を表すログを出力することができます。
ログの出力レベルは、初期化パラメタで指定する方法、ログ定義ファイルで指定する方法、および、APIで指定する方法があります。
詳細は、“第5章 アプリケーションログ”や、“F.7.3 デバッグ時と本稼動時で出力するログの種類を切り替えたい”を参照してください。
G.2.8
問題発生時に関連するログを検索する
コンテキストIDを利用すると、同一セション内で出力されたログを収集することができます。
コンテキストIDは、同一セション内リクエストごとに一意になっています。
以下の例では、1,2および4が同じセションであることがわかります。
1: 2004/10/29
理を開始
2: 2004/10/29
ページ1
3: 2004/10/29
理を開始
4: 2004/10/29
ページ2
5: 2004/10/29
ページ1
G.2.9
11:54:10 [0108-GTAJVPCJLNDL8LSDKFIT2MC9O3UUNJ3NEBBI16EAE37595RUD1P8F86JNSBG20000K000000.IJServer_001-000]処
11:54:23 [0108-GTAJVPCJLNDL8LSDKFIT2MC9O3UUNJ3NEBBI16EAE37595RUD1P8F86JNSBG20000K000000.IJServer_001-001]
11:54:52 [0108-F9IDEJ4C90IJL60FJQEN6E1VPNUUNJ3NEBBI16EAE37595RUD1P4N7NCNSBG20000S000000.IJServer_001-000]処
11:54:56 [0108-GTAJVPCJLNDL8LSDKFIT2MC9O3UUNJ3NEBBI16EAE37595RUD1P8F86JNSBG20000K000000.IJServer_001-002]
11:55:30 [0108-F9IDEJ4C90IJL60FJQEN6E1VPNUUNJ3NEBBI16EAE37595RUD1P4N7NCNSBG20000S000000.IJServer_001-001]
コマンドマップおよびページマップの書換えが反映されない
アプリケーションのコンテナを再起動してください。コマンドマップ、ページマップが読み込まれるのは、アプリケーションが最初に実行
されたときか、アプリケーションがタイムアウトしたあとに再び呼び出されたときです。したがって、ファイルを書き換えただけでは実行に
反映されない場合があります。
- 445 -
G.2.10 Flash連携機能で予期しない動作をする
まず、Flash側の問題か、サーバアプリケーションの問題か調査してください。サーバアプリケーションで、初期化パラメタ"logLevel"を10
に設定することで、Flashから送信されたリクエストがサーバアプリケーションに届いているかどうかが分かります。サーバアプリケーショ
ンに届いている場合は、サーバアプリケーションの構成やロジックが正しいかどうか確認してください。サーバアプリケーションに届いて
いない場合はFlashが正しく作成されているか、ActionScriptが正しく動作しているか確認してください。
- 446 -
付録H 各エディションで提供される機能
各エディションで提供される機能は以下のとおりです。
コンポーネント
機能
製品とエディション
(1)
(2)
(3)
(4)
(5)
(6)
アプリケーションの構造を規定するフレームワーク
O
O
-
O
O
O
バックエンド連携サービスライブラリ(*1)
ログ拡張機能 (Windowsイベントログ出力機能(*2)、ロ
グフィルタ、syslog出力機能)
O
O
-
-
O
-
高信頼性ログ機能
-
O
-
-
O
-
Webアプリケーションの構築
外付け属性
O
O
-
O
O
O
外字入力タグ
O
O
-
O
O
-
Bccoordinator
EJBの構築
O
O
-
O
O
-
Formcoordinator
電子フォームアプリケーションの構築(*3)(*4)
O
O
-
-
O
-
署名オプション
電子フォームでの電子署名(*5)
-
-
O
-
-
-
Mccoordinator
Web層とAP層を1つのフレームワークで制御(*6)
-
O
-
-
-
-
JavaServer Faces 1.1
JSR-127としてJava Community Process (JCP)で策定さ
れた、Webアプリケーションのユーザインタフェースを作
成するためのフレームワーク
O
O
-
O
O
-
Apcoordinatorコア
Webcoordinator
(*1) Linux版ではMQ連携サービスが提供されないため、バックエンド連携サービスライブラリでMQ連携サービスを利用できません。
(*2) Windowsイベントログ出力機能はWindows版で利用できます。
(*3) Linux版では、COBOLアプリケーションとの連携機能は提供されません。
(*4) 本機能は以下の環境には提供されません。
・ Red Hat Enterprise Linux AS (v.4 for Itanium)
・ Red Hat Enterprise Linux 5 (for Intel Itanium)
(*5) 本機能は以下の環境には提供されません。
・ Red Hat Enterprise Linux AS (v.4 for Itanium)
・ Red Hat Enterprise Linux 5 (for x86)
・ Red Hat Enterprise Linux 5 (for Intel64)
・ Red Hat Enterprise Linux 5 (for Intel Itanium)
(*6) 対応するJava2 SDK, Standard Edition のバージョンは1.4です。また、アプリケーションの開発時はInterstage Apworks Enterprise
Edition 8.xを使用してください。
表中の番号に対応する製品とエディションは以下のとおりです。
番号
製品名とエディション
(1)
Interstage Studio Enterprise Edition
(2)
Interstage Business Application Server Enterprise Edition
(3)
Interstage Form Coordinator 署名オプション
- 447 -
番号
製品名とエディション
(4)
Interstage Application Server Standard-J Edition
Interstage Application Server Enterprise Edition
Interstage Studio Standard-J Edition
(5)
Interstage Business Application Server Standard Edition
(6)
Interstage Interaction Manager
エディションに含まれない機能のマニュアルは提供されない場合があります。
- 448 -
用語集
Apache SOAP
SOAP 1.1とSOAP Messages with Attachmentsの仕様を実装したオープンソースのAPIです。Apache Software Foundationによって
提供されています。
Apcoordinator
Java(TM) 2 Platform, Enterprise Edition(J2EE)に従ったアプリケーションの構築を支援するアプリケーションフレームワーク製品で
す。
Apcoordinatorコア
アプリケーションの構造を規定するフレームワークです。Apcoordinatorで作成するWebアプリケーション、EJBセションBean、SOAP
サーバアプリケーションで共通に使用される機能を提供します。
Bccoordinator
EJBセションBean、SOAPサーバアプリケーションの作成支援機能を提供します。
Cookie
ユーザ情報やセション管理の情報などをWebブラウザとWebサーバの間でやりとりする仕組みです。
Enterprise JavaBeans (EJB)
Javaでサーバ側のアプリケーションを作成するためのコンポーネントモデルです。
Formcoordinator
電子フォームによるWeb画面の運用機能を提供します。紙の帳票と同じイメージをWebブラウザに表示し、帳票に入力されたデータを
Webアプリケーションで処理することができます。
HTTPリクエスト
ブラウザからWebサーバに対して処理や動作を要求する送信です。HTTPプロトコルに従って送信されます。
HTTPレスポンス
Webサーバからブラウザに送られるリクエストの処理結果です。
Interstage
富士通の提供するアプリケーションサーバ製品のファミリ名です。
Interstage Studio
ビジネスアプリケーションを効率的に開発するための統合開発環境を提供する富士通製品です。
Java Plug-in
Sun Microsystems社が提供する、Webブラウザ上でのアプレット実行をサポートするためのツールです。
JBKプラグイン
JBKプラグインとは、Webブラウザ上でのアプレット実行をサポートするための機能です。Interstage Studioに同梱されています。
JDBC
リレーショナルデータベースに接続するためのJava標準ライブラリです。
JSP(JavaServer Pages)
Javaによる動的Webページです。JSPタグやJSPスクリプトレット記述により、サーバでの動作を記述します。
- 449 -
RMI-IIOP
あるJVMで実行中のオブジェクトが、別のJVMで実行中のオブジェクトを呼び出すための技術です。オブジェクト間の通信には、
分散オブジェクトモデルであるCORBAが使用するプロトコルが用いられます。RMI-IIOPはEnterprise JavaBeansで使用されていま
す。
SOAP
SOAPとはSimple Object Access Protocolの略でW3C(World Wide Web Consortium)によって標準化作業が進められている軽量プ
ロトコルです。通信インフラとしてインターネット標準のHTTP(Hyper Text Transfer Protocol)、XML(eXtensible Markup Language)を
使用しています。
SOAPサービスクラス
SOAPサービスクラスとは、SOAPサーバアプリケーションとして公開するクラスです。SOAPサーバアプリケーションに必ず1つ必要
です。
UJI(Unified JSP Interface)
共通JSPインタフェースを参照してください。
URLリライティング
セション管理の方法のひとつです。URLの末尾にセションを同定するための文字列を付加します。一般に、Cookieが使用できない
ブラウザに対してこの方法が用いられます。
Webcoordinator
Webアプリケーションの作成支援機能を提供します。
Webアプリケーション環境定義ファイル(web.xml)
アプリケーションのパラメタや、タグライブラリの場所など、Webアプリケーションの環境を定義します。
Webサービス
Webサービスは、インターネット上で利用可能なサービス・コンポーネントです。
WYSIWYG
WYSIWYGとは“What You See Is What You Get”の略で、出力イメージ(文書や画面)を確認しながら編集できるという概念を表し
ます。
XMLデータ仕様記述
データ項目の転記や範囲チェックの処理を外付けのファイルにXML形式で記述し、実行する機能です。XMLファイルには、各
データ項目について、データの範囲、文字列のパターンなどの仕様を記述します。
XMLデータBean
XML連携機能で使用するデータBeanです。内部にXMLデータを保持します。XMLデータBeanを使用することにより、UJIタグとXML
データを連携させることができます。
XPath
XMLデータ内の特定の要素や属性を指定する記述方法です。
アトリビュート
タグの属性です。下記の例では、idとclsをアトリビュート名、"body"と"somePackage.someBean"をアトリビュート値と呼びます。
<uji:useBean id="body" cls="somePackage.someBean" />
アプリケーションログ
実行時の内部情報の出力です。Apcoordinatorでは、ログをキューイングすることによって、アプリケーションのレスポンスに影響な
くログを出力することができます。
- 450 -
アプレット
アプレットとは、Webブラウザ上に表示されるHTMLに埋め込まれて動作するプログラムです。
エスケープ機能
危険とされている文字を数値文字参照や文字実体参照に変換して出力する機能です。
エンタープライズBean環境
EJBのプログラムに必要な定数をデプロイメント記述に記述することにより、ソースコードを変更することなくアプリケーションのカスタ
マイズを可能にする機能です。
画面部品タグ
繰り返しデータの画面への展開や、画面の部品化を支援する機能です。表、ツリー、リスト、条件、複合Beanの5種の画面部品タグ
があります。
画面部品のインタフェース
画面部品タグは、繰り返し数やデータを画面部品インタフェースを通してデータBeanに問い合わせます。表ではTableModel、ツ
リーではTreeNodeまたはTreeModel、リストではListModelの各インタフェースを利用します。
関係定義ファイル
Apcoordinatorでは、アプリケーション中でビジネスクラス名やJSPファイル名を直接指定せずに、関係定義ファイルを用いて間接的
に指定します。関係定義ファイルにはコマンドマップとページマップがあります。
共通JSPインタフェース(Unified JSP Interface)
WebアプリケーションのJSPからApcoordinatorの機能を利用するインタフェースです。JSP拡張タグで記述します。
クライアントスクリプト
クライアントのブラウザ上で動作するJavaScriptをWebアプリケーションの中に記述する機能です。
高信頼性ログ
アプリケーションでユーザが利用するユーザログの1つです。データベース更新や、監査に利用する情報、データ操作の運用履歴
など重要な情報を取得するログです。
高信頼性ログ機能
業務履歴などのユーザログの取得で、高信頼性を求められるログ取得を目的とした機能です。
項目クラス
フィールドタグやコレクションタグにおいて、入力や表示を行なうデータが格納されるクラスです。表示時に使用される属性(色やフォ
ントなど)を設定することも可能です。データを持つタグに対応して用意されています。
コマンド
クライアントからApcoordinatorのアプリケーションを呼び出す際は、アプリケーションに実行させたい処理をコマンドで指定します。
Apcoordinatorはクライアントからのリクエストに対してどのビジネスクラスのメソッドを呼ぶかを、コマンドに従って選択します。
コマンドスクリプティング
処理のフローをXMLで記述して実行する機能です。コマンドスクリプティングを用いることにより、Javaによるビジネスクラスの記述を
必要な部分のみに限定することができます。
コマンドマップ
コマンドマップは、クライアントからの入力を保持するデータBeanとコマンドを、ビジネスクラスのメソッドに関連付けます。
コレクションタグ
コンポーネントタグのひとつで、複数のデータの組を表現するタグの総称です。選択項目、表などがあります。
- 451 -
コンポーネントタグ
画面項目を容易に作成するタグです。フィールドタグ、コレクションタグ、レイアウトタグの3つのグループに分けられます。
サーブレット
Webサーバ上で動作するJavaアプリケーションです。ダイナミックな処理結果を返却するアプリケーションの開発に適しています。
初期化パラメタ
Apcoordinatorで作成したアプリケーションの動作を設定するパラメタです。ユーザ定義のファクトリクラス名やログのレベルなどを設
定します。
制御ページ
HTTPリクエストを受け取り、uji:dispatchタグによってApcoordinatorに指示をするJSPページを制御ページと呼びます。
セション
サーバとクライアントとの接続を表します。各クライアントごとにひとつのセションが作成されます。
セションBean
Enterprise JavaBeansで規定されるコンポーネントのひとつです。クライアントによって生成され、1つのクライアント/サーバセションの
実行中のみ存在します。
タグライブラリファイル
拡張タグを定義するファイルです。
ディレクティブ(JSP)
ディレクティブはJSPがJavaに変換されるときに使用される情報を指定します。Page、taglib、includeなどのディレクティブがあります。
ディレクティブは <%@ と %> で囲んでJSPに記述します。
デプロイメント記述
アプリケーションを運用環境にインストールする際に必要な情報を記述したファイルです。
データタイプ(データBean変換)
データBean変換機能において、データBeanから変換されたHashMapに付けられるラベルです。データタイプはHashMapに格納さ
れたデータの種類を表します。
データのクラス
画面部品で、いくつかの展開形式からひとつを選択するために使用するデータ属性です。
データBean
クライアントとビジネスクラスの間のデータ受渡しを行うJavaBeans形式のクラスです。
データBean変換
Apcoordinatorで作成したEJBセションBeanを呼び出す際に、データBeanをjava.util.HashMapクラスに変換して送信する機能です。
セションBeanでは不要なデータを削除して通信量を減らすために使用できます。
データBean変換マップ
データBean変換機能においてデータBeanの変換方法を指定するファイルです。
入出力ページ
入出力項目を持つJSPページを入出力ページと呼びます。画面全体が1つの入出力ページになるわけではなく、画面はいくつか
の入出力ページから成り立っています。
ビジネスクラス
ビジネスロジックを記述するJavaのクラスをビジネスクラスと呼びます。
- 452 -
表示モード
1つのデータBeanが複数の入出力ページに関連付けられる場合、表示モードによってどの入出力ページを表示するか選択しま
す。ビジネスクラスでDataBeanクラスのsetVerbメソッドによって設定します。
ファクトリ
アプリケーションで使用するJavaクラスを間接的に作成する機能をファクトリと呼びます。利用者がファクトリクラスを作成することで、
利用者の作成したクラスを使用可能にします。
フィールドタグ
コンポーネントタグのひとつで、単一のデータの入力項目を表現するタグの総称です。文字列入力フィールド、チェックボックスな
どがあります。
ページマップ
ページマップは、ビジネスクラスの処理結果であるデータBeanと、データBeanの持つ表示モードを、入出力ページに関連付けま
す。
ホームインタフェース
EJBの作成と削除を行うインタフェースです。
補助文字
Unicode仕様においてFFFF(16進数表記)より大きいコードポイントを持つ文字を補助文字と呼びます。UTF-16では、FFFF(16進数
表記)以下のコードポイントを持つ文字は16ビットで表現されますが、補助文字は16ビットの値2個のペア(合計32ビット)で表現され
ます。また、このペアを構成する各々の16ビットの値をサロゲートと呼びます。日本語の文字については、JIS X 0213:2004 (JIS2004)
において、第3水準、第4水準の文字の一部が補助文字となっています。
リモートインタフェース
EJBのビジネスメソッドを呼び出すためのインタフェースです。
リモート共通インタフェース
Apcoordinatorで作成したEJBセションBeanとSOAPサーバアプリケーションを呼び出す機能です。呼び出すアプリケーションがEJB
セションBeanかSOAPサーバアプリケーションかに関わらず、共通のAPIで呼び出せます。
リモートマップ
リモート共通インタフェースを使って呼び出すアプリケーションの名前を定義するファイルです。
領域名
入出力ページを結合して画面を作成する場合に、入出力ページをどこに配置するかを領域名に従って決めます。制御ページで
は、uji:includeタグで領域を作成します。ビジネスクラスはDispatchContextクラスのsetResponseBeanメソッドで領域にデータBeanを
対応付けます。
レイアウトタグ
コンポーネントタグのひとつで、項目の配置を容易にするタグの総称です。
レンダラ
画面部品での展開形式を指定するタグです。
ログのレベル
ログの重要度を表し、数が小さいほど重要なログになります。Apcoordinatorでは、特定のレベル以下のログだけを出力するように
設定して、不要なログを抑止することができます。
- 453 -
Fly UP