Java サーブレットでのデータベースプログラミング(JSF を使用)
このページでは, JavaServer Faces (JSF) を使って,リレーショナルデータベースと連携する簡単なWeb アプリケーション・プログラムを開発する手順を, 見本となるプログラムと図解で説明する.
見本となるプログラムは, ユーザ名とメールアドレスと登録種別をデータベースに登録するとともに, 固有のユーザIDを自動で割り当てる,というものです.
動作画面の例
- リレーショナルデータベースの1つのレコード(行)を,1つの Java オブジェクトに対応 させます.
⇒ そのために,AccountDso という名前のクラスを定義します.
- Java プログラムの中に SQL プログラムを埋め込みます..
⇒ SQL とは,リレーショナルデータベースを扱うためのプログラミング言語です. Java と SQL を組み合わせて動かすために,JDBCを使う. このとき,Java のプログラムが,SQL のプログラムをリレーショナルデータベースに送りつけて,結果を待つ,という振る舞いになる. 変数を使って、Java と SQL との間のデータのやり取りを行う.
- SQL プログラムの評価結果は,テーブルのレコード(行)の集まりになる.
これを,Java のリスト (List) などに変換したい.
⇒ SpringJDBC を使うと簡単です. SpringJDBC とは,JDBC 抽象化フレームワークの機能を持ったソフトウェアで,Spring 2 の構成要素になっています.
- SpringJDBC の機能を使う部分は,1つのクラスに集める
そのために,AccountDao という名前のクラスを定義します. つまり,データベースの操作は,必ず AccountDao を経由する.SpringJDBC の流儀に従って書くのは,CommodityDao クラスだけということになりあmす.
- Web サーバと連携させたい
⇒ そのために,Tomcat を使う.
- Java サーブレットのクラスの doGet() メソッドの中に,表示したい Web ページの中身を生成するプログラムを書く.ここに SQL プログラムを埋め込みます.
- JSP と JavaServer Faces (JSF) を組み合わせる
tomcat と連携した Java サーブレットのプログラムを開発しますが, JSF の機能を使い,素の tomcat を使う場合と比べて,簡単に開発ができるよ うにします.JSF (JSF) を使った理由については,いずれ,別ペー ジで詳しく解説したいと考えています.
ここに書いたプログラムは,PostgreSQLで 動く.ごく簡単な設定の変更でMySQLや Java DBや他のリレーショナルデータベースソフトウェアでも動く.
【補足説明】
下記の 2つのサーバは別物です. 2つを同時に動かすことはできません(ポートを奪い合うことができないので).一方を動かすときは,もう一方を止めることになる.
- Eclipse 内部の tomcat サーバ:
Eclipse では,Eclipse 内部の tomcat サーバが動き, Java サーブレットの動作テストなどに使う.
- 公開 tomcat サーバ:
Eclipse とは無関係の tomcat サーバ(C:\tomcat55\bin\tomcat5w.exe 等で起動する Tomcat サーバのこと).当然, 公開 tomcat サーバが管理するディレクトリも Eclipse とは独立している.
なお,「Eclipse 内部の tomcat サーバ」を使えるようには, Eclipse で「新規サーバの定義」を行う必要がある.これは,1回行うだけで十分です.
JSF の概要
JSF を使ってプログラムを作成するときの作業項目は,次のようになっています.
- 入力フォーム
- フォーム・ビーンのクラス定義
フォーム・ビーンと言っているのは,フォームデータ(フォーム部品に,ユーザ からの記入したデータの中身)が格納される Java のマネージド・ビーン (Managed Bean) のことです.
フォーム・ビーンのクラス定義は自前で行う必要がある. フォーム・ビーンは,フォームデータを格納するための属性と,属性ごとのセッ ターとゲッターを持ちます.
- 入力フォームの記述
入力フォームは,Web ブラウザで表示される部分のことです. テキスト,テキストエリア,チェックボックス,セレクトメニュー,ラジオボタンなどのフォーム部品と,サブミット用のボタンを配置(レイアウト)する. 今回は,プログラミングとしては,JSP と JSF の組み合わせですので, 入力フォームは,
- 入力フォームの全体構成は,JSF の f:view タグ, html タグ,body タグ, h:form タグの入れ子(この順で入れ子)
- フォーム部品やボタンの記述のために JSF のタグを使用(詳しくは,JavaServer Faces タグ の Web ページを見てください
それぞれのフォーム部品ごとに,記入内容を格納すべきフォーム・ビーンの属性名を割り当てます. 割り当ての結果,フォーム部品への入力内容が,自動的にフォーム・ビーンの属性に格納されるとともに, フォーム・ビーンの属性の値が,フォーム部品に表示(テキスト,テキストエリアなど値が表示されるフォーム部品)されます. そのために, フォーム部品ごとに,value 属性として,フォーム・ビーンのマネージド・ビーン (Managed Bean) 名 と属性名を記述することになる.
ボタンについては,それぞれのボタンごとに,アクション・コントローラ・オブジェクトのメソッド名を割り当てます. そのためには,タグの action 属性として「 action="%{hogeClass.hogeMethod}"」 のように,メソッド名(とそのメソッドに関係するマネージド・ビーン (Managed Bean) 名)を記述します. ボタンを押すと,割り当てられたアクション・コントローラ・メソッドが自動的に呼び出されるようになる. なお,JSFでは,それぞれのボタンごとに,異なるアクション・コントローラ・メソッドを割り当てるという流儀になっています.
- マネージド・ビーン (Managed Bean) 名と,Java クラスの対応は,faces-config.xml に書く
faces-config.xml では, マネージド・ビーン (Managed Bean) 名と,Java クラスの対応を書く. さらには,faces-config.xml では, フォーム・ビーンごとに,スコープの設定,初期値の設定を行うことができる. スコープの指定は,例えば,「<managed-bean-scope>session</managed-bean-scope>」のよう に書く. このように書くと,指定されたマネージド・ビーン (Managed Bean) オブジェクトを,セッション開始時に 自動生成するようになる.
- フォーム・ビーンのクラス定義
- アクション・コントローラ・メソッドの呼び出しと,画面遷移に関する記述
- アクション・コントローラ・メソッドの呼び出し
ボタンが押されると,対応するアクション・コントローラ・メソッドが自動的 に呼び出されます. このとき, フォームデータが,自動的に, Java サーブレット側にを送信され,自動生成されたフォーム・ビーンに格納されます. 詳しくは次の通りです.
まず,faces-config.xml に,アクション・コントローラ・メソッドを持つク ラス名と,マネージド・ビーン (Managed Bean) 名の対応関係を書いておきます.JSF で記述する入 力フォームのボタンの部分には,クラス名では無く,このマネージド・ビーン (Managed Bean) 名を 書く. また, faces-config.xml では, マネージド・ビーン (Managed Bean) 名と,Java クラスの対応を書くと同時に, 「<managed-bean-scope>session</managed-bean-scope>」のよう スコープの指定を書く.これは, アクション・コントローラ・メソッドを持つクラスのオブジェクトを,セッショ ン開始時に自動生成させるための記述です.
- 画面遷移に関する記述
アクション・コントローラ・メソッドの戻り値は文字列(String)にす る,という決まりがあります. アクション・コントローラ・メソッドの戻り値である文字列の値によって,新しく表示すべきページが選択されます. faces-config.xml 内のナビゲーション・ルール (navigation rule) に記述された from-outcome に一致する文字列になっている場合,faces-config.xml 内のナビゲーション・ルール (navigation rule) の to-view-id に記述されたページが表示されます. これが画面遷移に関する記述です.
- アクション・コントローラ・メソッドの呼び出し
- ビジネスロジックの定義
実際の処理を行うビジネスロジックは,上記で説明したフォーム・ビーン・オブ ジェクトや,アクション・コントローラ・メソッドを持つオブジェクト)とは分けるというのが一般の流儀です. つまり,アクション・コントローラ・メソッドが,ビジネスロジックを呼び出すことになる.
ビジネスロジックのオブジェクトを自動生成する処理は,faces-config.xml に書く.
上記のことを,実際のプログラム実行を通して理解しよう,というのがこの Web ページの目的です.
準備事項
前準備
JDK (Java Development Kit) のインストール
Eclipse のインストール
その他
- Eclipse の Web, XML, and Java EE Development に関するプラグインのインストールが終わっていること
- Eclipse の SpringIDE プラグイン がインストール済みであること
- Spring 2 インストールのWebページの記述に従って,Spring 2 のインストールを終えていること.
- リレーショナルデータベース・ソフトウェアのインストールが済んでいること.
インストールしていないときは,下記の Web ページを参考に,インストールを済ませておくこと.
- 「Tomcat インストール」の Web ページの記述に従って,Tomcat のインストールが終わっていること.
- 「Eclipse 内部の tomcat サーバ」を使えるようにするために, 「Eclipse を使用しての Java サーブレット・プログラムの開発」の Web ページに記載 の「新規サーバの定義」を行っておくこと.
設定項目
前もって,Tomcat インストールディレクトリと, Spring 2 インストールディレクトリを調べておいてください.このページでは,次のように書く.
- Tomcat インストールディレクトリ: C:\tomcat55
- Spring 2 インストールディレクトリ: C:\Program Files\Java\spring-framework-2.5
データベースシステムに関する項目
データベースシステムに関するいくつかの設定内容があります. このページでは,設定内容を下記のように書くので, 違う設定にする場合には, この Web ページの説明を読み替えてください.
- PostgreSQL の利用 を使う場合
データベース名と, PostgreSQL にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)を決めておくこと. このページでは,次のように書く.
- データベース名: testdb
使用するデータベースの名前のことを,「データベース名」と呼ぶことにする. データベース名は,自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと, すでに存在するデータベースを使ってもいい(つまり,既存のデータベースのデータベース名を使う)し,新しいデータベースを作ることにしてもいいです.
- PostgreSQL にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)
- ユーザ名: testuser
- パスワード: hoge$#34hoge5
データベース名 testdb の権限を持ったユーザにして下さい.(そうで無いとエラーが出ます).
この Web ページの手順を試すために,新しいデータベースと,新しい一般ユーザのアカウントを作りたいという場合は, phpPgAdmin などを使ってください.
psql のようなコマンドライン・クライアントを使う場合には,次のようになります(エンコーディングについて調べきっていません.まだ不完全です.参考情報ということでご理解下さい).
CREATE ROLE testuser LOGIN PASSWORD 'hoge$#34hoge5' NOINHERIT VALID UNTIL 'infinity'; CREATE DATABASE testdb WITH ENCODING='UTF8' OWNER=testuser;
パスワードは,説明を簡単にするために hoge$#34hoge5 と書いているが,実際には,これとは違うものを,必ず適切に設定してください.
PostgreSQL の利用 を使うために,次の設定を行うことになるので,確認しておく.
- JDBC ドライバ: org.postgresql.Driver (PostgreSQL に依存する値)
- PostgreSQL 用 JDBC の jar ファイル:c:\Program Files\psqlJDBC\postgresql-8.3-603.jdbc4.jar
PostgreSQL 用 JDBC の Java ファイルが存在するディレクトリ C:\Program Files\psqlJDBC を探すとすぐに見つかります.
- データベース名: testdb
- MySQL の利用 を使う場合
データベース名と,MySQL にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)を, このページでは,次のように書く.
- データベース名: testdb
使用するデータベースの名前のことを,「データベース名」と呼ぶことにする. データベース名は,自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと, すでに存在するデータベースを使ってもいい(つまり,既存のデータベースのデータベース名を使う)し,新しいデータベースを作ることにしてもいいです.
- MySQL にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)
- ユーザ名: testuser
- パスワード: hoge$#34hoge5
データベース名 testdb の権限を持ったユーザにして下さい.(そうで無いとエラーが出ます).
この Web ページの手順を試すために,新しいデータベースと,新しい一般ユーザのアカウントを作りたいという場合は, MySQL コマンドライン・クライアントの主な機能 や MySQL GUI Tools などを使い,次のコマンドを実行してください.
* それぞれのツールの操作法(起動法,ログインの方法など)は,MySQL コマンドライン・クライアントの主な機能 や MySQL GUI Tools の Web ページを見てください.
create database 'testdb' default character set cp932 collate cp932_japanese_ci; create user testuser identified by 'hoge$#34hoge5'; grant all on testdb.* to 'testuser';
パスワードは,説明を簡単にするために hoge$#34hoge5 と書いているが,実際には,これとは違うものを,必ず適切に設定してください.
MySQL の利用 を使うために,次の設定を行うことになるので,確認しておく.
- JDBC ドライバ: org.gjt.mm.mysql.Driver (MySQL に依存する値)
- MySQL 用 JDBC の jar ファイル名: C:\Program Files\Java\mysql-connector-java-5.1.6\mysql-connector-java-5.1.6-bin.jar
JDBC で MySQL を使うために必要になるので、 https://dev.mysql.com/downloads/connector/ から Connector/J をダウンロードして、解凍しておく(展開(解凍)するディレクトリは何でもよい。この資料では上記のディレクトリにあるものとして説明する)。
ダウンロードの手順は, 「MySQL コネクタ (Connector) Java のダウンロード」の Web ページで説明している.
- データベース名: testdb
- Java DB を使う場合
次の設定を確認しておく.
- Java DB データベースディレクトリ(相対): dbdir
Java DB のデータベースファイルが置かれるディレクトリのことです. これは自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと, データベース名と Java DB データベースディレクトリとは別ものです.混同しないこと.
なお,Java DB データベースディレクトリは,「dbdir」 のように,相対パス形式で書く場合と,「C:\hoge\dbdir」のように,絶対パス形式で書く場合があります. 今回は,相対パス形式で書く.
- データベース・ロケーション: C:\Program Files\eclipse3.5\eclipse\dbdir
データベース・ロケーションとは, データベースファイルが置かれる実際のディレクトリのことです.
Java DB データベースディレクトリを,「dbdir」のような相対パス形式にする場合, データベース・ロケーションは,Eclipse インストールディレクトリである C:\Program Files\eclipse3.5\eclipse のサブディレクトリになる. (一方で,絶対パス形式の場合は,データベース・ロケーションは,Eclipse インストールディレクトリと無関係になります). このデータベース・ロケーションは, Eclipse インストールディレクトリと,Java DB データベースディレクトリ(相対)を連結したものになる.
- JDBC ドライバ: org.apache.derby.jdbc.EmbeddedDriver (Java DB に依存する値)
- Java DB 用 JDBC の jar ファイル:C:Program Files\eclipse3.5\eclipse\plugins\org.apache.derby.core_10.5.1\derby.jar
Java DB (Derby) インストールのときに,Eclipse プラグインもインストールしますが,その中に Java DB 用 JDBC の jar ファイルが含まれています.
テスト用データベースの作成
テスト用データベースとして,下記の SQL コマンドで,テーブル Account が作られていること.
create table Account ( ユーザ名 VARCHAR(100) not null, メールアドレス VARCHAR(100) not null, 登録種類 VARCHAR(20) not null, ユーザID INTEGER primary key not null );Eclipse の操作手順
以下,Eclipse を使う. 動的 Web プロジェクトの作成,Apache MyFaces のインポートとJava サーブレットの作成とテスト実行という一連の操作を,図解で説明する.
Eclipse の使用にあたって,事前に決めておく事項
Eclipse のプロジェクト等を作る. このページでは,Eclipse のプロジェクト名,Java パッケージ名は次のように記述します. (すでに同じ名前のプロジェクトがある,といったときは,プロジェクト名を変えてください).
- Eclipse のプロジェクト名: MYFACES
- Java パッケージ名: hoge.hoge.com
ファイル構成
ファイル構成は次のようになる.
├MYFACES ├ : ├Javaリソース; src │└hoge.hoge.com │ ├AccountDao.java │ ├AccountDso.java │ ├DataSourceFactory.java │ ├アクション.java │ ├システム内部状態.java │ ├登録ビジネスロジック.java │ └登録フォーム.java : ├WebContent ← Webアプリケーションのルート ├WEB-INF │ : │ ├faces-config.xml │ : │ ├web.xml │ : │ ├failure.jsp ├index.jsp ├success.jsp └登録画面.jsp ← 入力フォームプログラム
- Java DB データベースディレクトリ(相対): dbdir
動的 Web プロジェクトの新規作成
下記の手順で,動的 Web プロジェクトを新規に作成する.
- (もし,プロジェクト・エクスプローラが開いていなければ)プロジェクト・エクスプローラを開く
「ウインドウ (Window)」→「ビューの表示 (Show View)」→「プロジェクト・エクスプローラ (Project Explorer)」 と操作する.
- プロジェクトの新規作成の開始
「ファイル」→「新規 (New)」→「プロジェクト (Project)」
または,プロジェクト・エクスプローラ内で,右クリック→「新規 (New)」→「プロジェクト (Project)」 - 「Web」の展開
新規プロジェクトのウインドウが開くので, 「Web」を展開する.
- 「動的 Webプロジェクト (Dynamic Web Project)」の選択
展開した「Web」の下にある 「動的 Webプロジェクト (Dynamic Web Project)」を選び, 「次へ」をクリック.
- プロジェクト名の設定など
設定用のウインドウが開くので,下記の設定を行う. 設定が終わったら,「次へ」をクリック.
- 「プロジェクト名 (Project name)」(name)(1行目)では,プロジェクト名を付ける.
プロジェクト名は,好きな名前でよいが,スペースや全角文字は避けること. ここでは,プロジェクト名を,「MYFACES」と付けることにする.
- 「プロジェクト・コンテンツ (Project contents)」(2行目)では,ファイルの保存場所を指定する.
「デフォルトの使用 (Use default)」にチェックを入れたままで良い.
- 「ターゲット・ランタイム (Target Server)」 (3行目)は,
「Apache Tomcat v5.5」になっているはず.
他のもの(例えば「なし」)になっていたら,「Apache Tomcat v5.5」に変更しておく
* 変更のとき,「なし」だけしか無くて,「Apache Tomcat v5.5」が候補として表示されない場合は, 「Eclipse を使用しての Java サーブレット・プログラムの開発」の Web ページに記載の「新規サーバの定義」を行うこと.
- 「プロジェクト名 (Project name)」(name)(1行目)では,プロジェクト名を付ける.
- 次の「プロジェクト・ファセット」は,デフォルトのままでよい
「次へ」をクリック.
* このウインドウが開かないことがある.気にしなくてよい.
- 次の「Web モジュール」は,デフォルトのままでよい
「終了」をクリック.
- 作成されたプロジェクトの確認
プロジェクト・エクスプローラで,いま作成した動的 Web プロジェクト MYFACES が表示されていることを確認する.
Apache MyFaces に関するファイル群 jsf-blank のインポート
Apache MyFaces の動作確認のため, 公開されている jsf-blank プログラム (jsf-blank-myfaces-with-extensions-app.zip) を実行してみる.
- JSF チュートリアルの Web ページを開く
https://www.tutorialspoint.com/jsf/index.htm をクリック.
- jsf-blank-myfaces-with-extensions-app.zip のダウンロード
今開いている Web ページの「Section 1: Introducing JSF」のところにある jsf-blank-myfaces-with-extensions-app.zip をダウンロード.
- 解凍
展開(解凍)してできたファイルのうち,WEB-INF/web.xml, WEB-INF/struts-config.xml, WEB-INF/lib, css/styles.css, index.jsp, welcome.jsp を使う (要するに全部を使う).
- Eclipse で,インポート開始
プロジェクト・エクスプローラで, プロジェクト名 MYFACES の下の「WebContent」を右クリックし,「インポート」を選ぶ.
- インポート・ソースの選択
「一般」→「ファイルシステム」と操作した後, 「次へ」をクリック.
- ソース・ディレクトリの指定
- ソース・ディレクトリとして,先ほど解凍した jsf-blank-with-extensions を指定
- すると,ソース・ディレクトリの下に,ファイルの一覧が表示される. ここで,インポートすべきファイルを選ぶ. 「すべて選択」をクリック.
- 以上の操作の後,「終了」をクリック.
- 「上書きしますか?」に対しては「すべてはい」と答える
- インポートの結果,ファイルが増える
WebContent\css, WebContent\WEB-ING\lib, WebContent\index.jsp, , WebContent\welcome.jsp が増えていることがみてとれる.web.xml などは上書きされる.
(オプション) 新しい版の MyFaces Core, MyFaces Tomahawk に入れ替え
さきほど作成したプロジェクト MYFACES の lib を展開すると, MyFaces Core と MyFaces Tomahawk のバージョンが分かります. 1.1.3 のように古いバージョンになっているでしょう. バージョンアップしたいときの手順は次の通りです.
- ファイルのダウンロード
- Apache MyFaces Project の ダウンロード用 Web ページを開く
- MyFaces Core バージョン 1.1.6 バイナリ・リリースの選択
Apache MyFaces Project の ダウンロード用 Web ページで,zip 形式ファイル myfaces-core-1.1.6-bin.zip をクリック.
* MyFaces Core 1.1 系列と,MyFacesTomahawk 1.1 系列を組み合わせて使うルールなので, MyFaces Core 1.2.4 をダウンロードしない.
- ミラーサイトの選択
一番上の URL をクリック.
- ダウンロードしたファイルの解凍
どこに解凍しても良いが,後で分かりやすいように C:\Program Files\Java の下に解凍しておく. 解凍の結果,新しいディレクトリ C:\Program Files\Java\myfaces-core-1.1.6 ができる.
- MyFaces Tomahawk バージョン 1.1.7 バイナリ・リリースの選択
Apache MyFaces Project の ダウンロード用 Web ページで,zip 形式ファイル tomahawk-1.1.7-bin.zip をクリック.
- ミラーサイトの選択
一番上の URL をクリック.
- ダウンロードしたファイルの解凍
どこに解凍しても良いが,後で分かりやすいように C:\Program Files\Java の下に解凍しておく. 解凍の結果,新しいディレクトリ C:\Program Files\Java\tomahawk-1.1.7 ができる.
- MyFaces Core を,プロジェクトの WebContent\WEB-INF\lib にインポート
先ほど作ったプロジェクト MYFACES に,MyFaces Core をインポートします.
- Eclipse で,インポートの開始
プロジェクト・エクスプローラで,WebContent\Web-INF\lib を右クリックし,「インポート」を選ぶ.
- インポート・ソースの選択
「一般」→「ファイルシステム」と操作した後, 「次へ」をクリック.
- MyFaces Core ファイルの指定
- ソース・ディレクトリとして,先ほど解凍した C:\Program Files\Java\myfaces-core-1.1.6\lib を指定
- すると,ソース・ディレクトリの下に,ファイルの一覧が表示される. ここで,インポートすべきファイルを選ぶ. 「lib」をチェック.
- 以上の操作の後,「終了」をクリック.
- 「上書きしますか?」に対しては「すべてはい」と答える
- Eclipse で,インポートの開始
- MyFaces Tomahawk を,プロジェクトの WebContent\WEB-INF\lib にインポート
上記と同様の手順で,MyFaces Tomahawk をインポートします.
- Eclipse で,インポートの開始
プロジェクト・エクスプローラで,WebContent\Web-INF\lib を右クリックし,「インポート」を選ぶ
- インポート・ソースの選択
「一般」→「ファイルシステム」と操作した後, 「次へ」をクリック.
- Tomahawk ファイルの指定
- ソース・ディレクトリとして,先ほど解凍した C:\Program Files\Java\tomahawk-1.1.7\lib を指定
- すると,ソース・ディレクトリの下に,ファイルの一覧が表示される. ここで,インポートすべきファイルを選ぶ. 「lib」をチェック.
- 以上の操作の後,「終了」をクリック.
- Eclipse で,インポートの開始
- WebContent\WEB-INF\lib の古いファイルを削除
次のファイルを削除する.削除するには, 「lib」を展開した後,削除したいファイルを右クリックして, 「削除」を選ぶ.
- commons-digester-1.6.jar
- commons-logging-1.0.4.jar
- myfaces-api-1.1.5.jar
- myfaces-impl-1.1.5.jar
- tomahawk-1.1.3.jar
(Java DB (Derby) を使うときのみ) Apache Derby ネーチャーの追加と,サーバの開始
Java DB (Derby) を使うときに限り,プロジェクトへのApache Derby ネーチャーの追加 と,Java DB (Derby) サーバの開始を行う. これは, Java DB (Derby) を使うための追加的な設定です.
- パッケージ・エクスプローラで,プロジェクト名 MYFACES を右クリック.
- 「Apache Derby」→「Apache Derby ネーチャーの追加」
「Apache Derby」が候補として現れないときは, Java DB (Derby) インストール の手順に従って,インストールと設定を行う.
- 「Apache Derby」→「Derby ネットワーク・サーバの開始」
「Derby ネットワーク・サーバの開始」が選べない状態になっているときは, すでに開始済みなので,この手順は不要.
リレーショナルデータベース・ソフトウェアとして,Java DB (Derby) 以外を使う場合は,上記は不要です.
プロジェクトへの Spring プロジェクト・ネイチャーの追加
今度は,Spring JDBC を使うための設定です.
プロジェクトへの Spring プロジェクト・ネーチャーの追加を,次の操作で行う.
- プロジェクト・エクスプローラで,プロジェクト名 MYFACES を右クリック.
- 「Spring ツール (Spring Tools)」→「Spring プロジェクト・ネーチャーの追加」と操作.
「Spring ツール (Spring Tools)」が候補として現れないときは, Eclipse の SpringIDE プラグイン の手順に従って,インストールを行う.
- プロジェクトの下に,「Spring Elements」が増えるので確認しておく.
プロジェクト名 MYFACES の左横の 「+」をクリックして展開すると, 「Spring Elements」が増えている. (Spring プロジェクト・ネーチャーの追加ができたことが分かる).
WebContent\WEB-INF\lib への,jar ファイルのインポート
次の2種類の jar ファイルを,今度は,WebContent\WEB-INF\lib にインポートします. (先ほど,外部 jar ファイルとして追加したものと同じファイル).
- Spring 2 の jar ファイル
Spring 2 を Java サーブレット・プログラムから使えるようにするために, Spring 2 に関する 2 つの jar ファイルをインポートします. 次の 2 つです.
C:\Program Files\Java\spring-framework-2.5\dist\spring.jar C:\Program Files\Java\spring-framework-2.5\lib\jakarta-commons\commons-logging.jar
- リレーショナルデータベースシステムに付属の JDBC の jar ファイル
JDBC を使いリレーショナルデータベース・ソフトウェアと接続できるようにするため,リレーショナルデータベース・ソフトウェアに付属の JDBC ファイルをインポートする必要がある. (JDBC ファイルは,使用するリレーショナルデータベース・ソフトウェアごとに違う,ということ).
プロジェクトの WebContent\WEB-INF\lib へのインポートを行う手順を下記に示す.
- プロジェクト構成物の表示
プロジェクト・エクスプローラで, プロジェクト名 MYFACES の左横の「+」をクリックして展開すると,「Java リソース; src」などが現れる(その他,いろいろ,プロジェクトの構成物が現れる).
* すでに展開済みのときは,この手順は不要.
- WebContent の展開
WebContent の左横の「+」をクリックして展開する.
* すでに展開済みのときは,この手順は不要.
- WEB-INF の展開
WEB-INF の左横の「+」をクリックして展開する.
* すでに展開済みのときは,この手順は不要.
- WEB-INF の下の lib を右クリックし,「インポート」を選ぶ.
- インポート・ソースの選択
「一般」→「ファイルシステム」と操作した後, 「次へ」をクリック.
- ファイルの指定
インポートの手順は下記の通りである.
- 今出ているウインドウで,ソース・ディレクトリとして,各ファイルのディレクトリを指定.
- すると,ソース・ディレクトリの下に,ファイルの一覧が表示される. ここで,インポートすべきファイルを選ぶ. インポートすべきファイルをチェックする
- 以上の操作の後,「終了」をクリック.
インポートするファイルが複数あるので, lib を右クリックし,「インポート」を選ぶという手順に戻って,やり直す必要がある. (つまり,ファイルの数だけ,インポートの操作を繰り返す). 上にも書きましたが,インポートすべきファイルは,次の2種類です.
- Spring 2 に関する次の 2 つの jar ファイル
C:\Program Files\Java\spring-framework-2.5\dist\spring.jar C:\Program Files\Java\spring-framework-2.5\lib\jakarta-commons\commons-logging.jar
上記のファイルが現れないときは,Spring 2 インストール の手順に従ってインストールを行う.
- JDBC の jar ファイル.
- PostgreSQL の場合:
C:\Program Files\psqlJDBC\postgresql-8.3-603.jdbc4.jar をインポート
- MySQL の場合:
C:\Program Files\Java\mysql-connector-java-5.1.6\mysql-connector-java-5.1.6-bin.jar をインポート
JDBC の jar ファイルが無い,というときは,MySQL Connector Java のダウンロードの Web ページを見てください.
- Java DB の場合:
C:Program Files\eclipse3.5\eclipse\plugins\org.apache.derby.core_10.5.1\derby.jar をインポート
- PostgreSQL の場合:
- インポートの結果,ファイルが増える
インポートの結果,ファイルが増えたことを確認したいときは,プロジェクト・エクスプローラで,「lib」を展開する.
Java パッケージ作成
Eclipse のプロジェクト・エクスプローラを使って, Java パッケージを作成します. Java パッケージ名には hoge.hoge.com のようなドメイン名を付ける習慣があることに注意してください. このページでは,作成するJava パッケージ名は,hoge.hoge.com と書く. (Java パッケージ名を変えるときは,読み替えてください).
- (もし,プロジェクト・エクスプローラが開いていなければ)プロジェクト・エクスプローラを開く
「ウインドウ」→「ビューの表示」→「プロジェクト・エクスプローラ」 と操作する.
Java パッケージの作成,クラスの作成などの作業は,プロジェクト・エクスプローラで行う.
- Java パッケージを新規作成すべきプロジェクトの選択
プロジェクト・エクスプローラに,プロジェクト一覧が表示されているはずです. Java パッケージを新規作成したいプロジェクト名 MYFACES を右クリックして, 「新規」→「パッケージ」と操作する.
- Java パッケージ名の設定
「Java パッケージ (Java package)」の名前として,Java パッケージ名 hoge.hoge.comを記入する.
その後,「終了」をクリック.
- Java パッケージの確認
プロジェクト・エクスプローラにおいて, Java パッケージ hoge.hoge.com が増えていることを確認する.
* プロジェクト・エクスプローラで, Java パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト MYFACES の左横の「+」をクリックして展開した後, 下の 「Java リソース; src」の左横の「+」をクリックして展開して下さい.
クラス定義と実行
- プロジェクト・エクスプローラで, プロジェクト名の下の 「Java リソース; src」または「src」の下を展開すると,パッケージ名 hoge.hoge.com が出ます.
- パッケージ名 hoge.hoge.com を右クリックして,クラス作成
- AccountDao クラス : 「新規」→「その他」→「Java」→「クラス」
- AccountDso クラス : 「新規」→「その他」→「Java」→「クラス」
- DataSourceFactory クラス : 「新規」→「その他」→「Java」→「クラス」
- アクションクラス : 「新規」→「その他」→「Java」→「クラス」
- システム内部状態クラス : 「新規」→「その他」→「Java」→「クラス」
- 登録ビジネスロジッククラス : 「新規」→「その他」→「Java」→「クラス」
- 登録フォームクラス : 「新規」→「その他」→「Java」→「クラス」
- プロジェクト・エクスプローラで,クラスの「クラス名.java 」をダブルクリック すると,エディタが開きます.下記のプログラムを,カット&ペースト.
AccountDao.java
----------------------ここから----------------------
package hoge.hoge.com;
import java.sql.*;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
// テーブル Person に関わる操作
public class AccountDao {
// 使用するテーブル名
final private static String TABLE = "Account";
// private で SimpleJdbcTemplate オブジェクトを定義して,他のメソッドで使う,というのが決まり文句(詳しくは Spring のマニュアル)
private SimpleJdbcTemplate jdbcTemplate;
public void setDataSource(org.springframework.jdbc.datasource.DriverManagerDataSource dataSource) {
this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
//
// ステートメント実行の例 (テーブル定義)
//
public void initializeTable() {
// executing statements;
this.jdbcTemplate.update("drop table " + TABLE);
// create table Account (ユーザ名 VARCHAR(100), メールアドレス VARCHAR(100), 登録種類 VARCHAR(20), ユーザID integer)
this.jdbcTemplate.update("create table " + TABLE + " (ユーザ名 VARCHAR(100), メールアドレス VARCHAR(100), 登録種類 VARCHAR(20), ユーザID integer)");
}
//
// 更新の例(1行挿入.値の更新)
//
public void insertTuple(AccountDso account) {
this.jdbcTemplate.update("insert into " + TABLE + " values ( '" + account.getユーザ名() + "', '" + account.getメールアドレス() +
"', '" + account.get登録種類() + "', " + account.getユーザID() + " )");
}
//
// 問い合わせ
//
// タップル数
public int getCount() {
return this.jdbcTemplate.queryForInt("select count(*) from " + TABLE);
}
public int getMaxUserID() {
return this.jdbcTemplate.queryForInt("select MAX(ユーザID) from " + TABLE);
}
// 結果が,AccountDso オブジェクトのリスト (つまり,結果が Java の PersonDso オブジェクトに格納されている)
public List<AccountDso>getAllAccount() {
return this.jdbcTemplate.query(
"select * from " + TABLE,
new org.springframework.jdbc.core.simple.ParameterizedRowMapper<AccountDso>() {
public AccountDso mapRow(ResultSet rs, int rowNum) throws SQLException {
AccountDso p = new AccountDso();
p.setユーザ名(rs.getString("ユーザ名"));
p.setメールアドレス(rs.getString("メールアドレス"));
p.set登録種類(rs.getString("登録種類"));
p.setユーザID(rs.getInt("ユーザID"));
return p;
}
}
);
}
// 選択条件あり.name で選択して,PersonDso オブジェクトを出力 (name が主キーならば PersonDso オブジェクトは1つ)
public AccountDso selectNameById( String name ) {
return this.jdbcTemplate.queryForObject(
"select * from " + TABLE + " where name = ?",
new org.springframework.jdbc.core.simple.ParameterizedRowMapper<AccountDso>() {
public AccountDso mapRow(ResultSet rs, int rowNum) throws SQLException {
AccountDso p = new AccountDso();
p.setユーザ名(rs.getString("ユーザ名"));
p.setメールアドレス(rs.getString("メールアドレス"));
p.set登録種類(rs.getString("登録種類"));
p.setユーザID(rs.getInt("ユーザID"));
return p;
}
},
name );
}
};
----------------------ここまで----------------------
AccountDso.java
----------------------ここから----------------------
package hoge.hoge.com;
//テーブル Account の1タップル(行)を格納するためのオブジェクト
public class AccountDso {
private String ユーザ名 = null;
private String メールアドレス = null;
private String 登録種類 = null;
private int ユーザID = 0;
public String getユーザ名() {
return ユーザ名;
}
public void setユーザ名(String ユーザ名) {
this.ユーザ名 = ユーザ名;
}
public String getメールアドレス() {
return メールアドレス;
}
public void setメールアドレス(String メールアドレス) {
this.メールアドレス = メールアドレス;
}
public String get登録種類() {
return 登録種類;
}
public void set登録種類(String 登録種類) {
this.登録種類 = 登録種類;
}
public int getユーザID() {
return ユーザID;
}
public void setユーザID(int ユーザid) {
ユーザID = ユーザid;
}
}
----------------------ここまで----------------------
DataSourceFactory.java
JDBC ドライバ名,データベース名などの定義を行うクラスです. DataSourceFactory.java は,PostgreSQL 用になっているので,他のリレーショ ナルデータベースシステムを使うときは,先頭部分を書き換えることを忘れないこと.
なお,インポートすべき JDBC ファイルの jar のファイル名は,参考のため,下記のプログラム DataSourceFactory.java に記載している.
Eclipse で DataSourceFactory クラスを新規作成したら,下記のプログラムをカット&ペースト.
JDBC プログラムで,データベースシステムと接続するとき, 新しいデータベースを作るには,「;create=true」を付ける.
----------------------ここから----------------------
package hoge.hoge.com;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class DataSourceFactory {
// 決まり文句 (ドライバクラス)
final private static String PostgresJDBCDriver = "org.postgresql.Driver";
final private static String MySQLJDBCDriver = "org.gjt.mm.mysql.Driver";
final private static String JavaDBJDBCDriver = "org.apache.derby.jdbc.EmbeddedDriver";
final private static String HiRDBDriver = "JP.co.Hitachi.soft.HiRDB.JDBC.PrdbDriver";
// 下記の変数を正しく設定する
// DBNAME, DBDIR, USER, PASS, JDBCDriver, DBURL
// PostgreSQL 用デフォルト
// Eclipse で PostgreSQL を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
// WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
// その後インポートすべきファイルとして,次のファイルを指定
// C:\Program Files\psqlJDBC\postgresql-8.3-603.jdbc4.jar
final private static String DBNAME = "testdb"; // Database Name
final private static String USER = "testuser"; // user name for DB.
final private static String PASS = "hoge$#34hoge5"; // password for DB.
final private static String JDBCDriver = PostgresJDBCDriver;
final private static String DBURL = "jdbc:postgresql://localhost/" + DBNAME;
// MySQL 用デフォルト
// Eclipse で MySQL を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
// https://dev.mysql.com/downloads/connector/ から,Connector/J をダウンロード
// c:\Program Files\Java\mysql-connector-java-5.1.6\ に置く.
// WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
// その後インポートすべきファイルとして,次のファイルを指定
// c:\Program Files\Java\mysql-connector-java-5.1.6\mysql-connector-java-5.1.6-bin.jar を追加
// final private static String DBNAME = "testdb"; // Database Name
// final private static String USER = "testuser"; // user name for DB.
// final private static String PASS = "hoge$#34hoge5"; // password for DB.
// final private static String JDBCDriver = MySQLJDBCDriver;
// final private static String DBURL = "jdbc:mysql://localhost/" + DBNAME;
// JavaDB用デフォルト
// final private static String DBNAME = "dbdir;create=true"; // Java DB の場合は,Java DB データベースディレクトリ(相対)
// final private static String DBDIR = "C:\\Program Files\\eclipse3.5\\eclipse\\"; // データベースが存在するディレクトリ
// DTP, DBViewer などを使ってデータベースを生成した場合は Eclipse インストールディレクトリ
// ij などを使ってデータベースを生成した場合は,c:\\<ワークスペース>\\<プロジェクト名>
// final private static String USER = ""; // user name for DB. Java DB (Derby) の場合は空
// final private static String PASS = ""; // password for DB. Java DB (Derby) の場合は空
// final private static String JDBCDriver = JavaDBJDBCDriver;
// final private static String DBURL = "jdbc:derby:" + DBDIR + DBNAME;
// HiRDB用デフォルト
// Eclipse で HiRDB を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
// WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
// その後インポートすべきファイルとして,次のファイルを指定
// C:\win32app\hitachi\hirdb_s\CLIENT\UTL\pdjdbc.jar
// ユーザ名,パスワード: C:/windows/HiRDB.iniのPDUSER の値を調べておく
// final private static String USER = "ユーザ名"; // user name for HiRDB. see C:/windows/HiRDB.ini
// final private static String PASS = "パスワード"; // password for HiRDB. see C:/windows/HiRDB.ini
// final private static String JDBCDriver = HiRDBDriver;
// final private static String HiRDBServerName = "hitachi-664320D"; // HiRDB サーバのコンピュータ名
// final private static String DBURL = "jdbc:hitachi:PrdbDrive://DBID=22200,DBHOST=" + HiRDBServerName + ",ENCODELANG=MS932"; // 'DBID=22200' is in "conf\pdsys";
DriverManagerDataSource connect() {
org.springframework.jdbc.datasource.DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName((String)JDBCDriver);
dataSource.setUrl(DBURL);
dataSource.setUsername(USER);
dataSource.setPassword(PASS);
return dataSource;
}
}
----------------------ここまで----------------------
アクション.java
----------------------ここから----------------------
package hoge.hoge.com;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class アクション {
private 登録ビジネスロジック logic;
private 登録フォーム regform;
// 以下のうち,2つのセッターはJSFが呼び出す.
// ※ JSFコンテナのほうで,登録ビジネスロジックと,登録フォームという
// 2つのアプリケーションオブジェクトを保持する.
public 登録ビジネスロジック getLogic() {
return logic;
}
public void setLogic(登録ビジネスロジック logic) {
this.logic = logic;
}
public 登録フォーム getRegform() {
return regform;
}
public void setRegform(登録フォーム regform) {
this.regform = regform;
}
// アクション・コントロール・メソッド
public String doRegistration() {
// JFS で HttpServletRequest, HttpSession を取得するときの決まり文句
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)context.getRequest();
HttpSession session = request.getSession();
// セッション変数に入っていれば,ビジネスロジックにも設定済みなので,何もしない.
システム内部状態 state = (システム内部状態)session.getAttribute("systemState");
if ( state == null ) {
state = new システム内部状態();
state.reset();
session.setAttribute("systemState", state);
logic.setSystemState(state);
}
AccountDao accountDao = (AccountDao)session.getAttribute("accountDao");
if ( accountDao == null ) {
DataSourceFactory dataSourceFactory = new DataSourceFactory();
DriverManagerDataSource dataSource = dataSourceFactory.connect();
accountDao = new AccountDao();
accountDao.setDataSource(dataSource);
session.setAttribute("accountDao", accountDao);
logic.setAccountDao(accountDao);
}
//登録処理
logic.registration(this.regform);
// いつも成功
return "success";
// return "failure";
}
}
----------------------ここから----------------------
システム内部状態.java
----------------------ここから----------------------
package hoge.hoge.com;
public class システム内部状態 {
// システムの内部状態の保持.
private int ユーザID = 0;
private boolean 初期済か = false; // true ならば,ユーザIDに正しい値が入っているという意味
private String 最終アクセスページID = null; // JSP 内の hiddenInput
// 「<h:inputHidden value="index" binding="#{regform.hiddenInput}"/>」でバインディング
// などで送られてくる「"index"」を入れる
public int getユーザID() {
return ユーザID;
}
public void setユーザID(int ユーザid) {
ユーザID = ユーザid;
}
public boolean is初期済か() {
return 初期済か;
}
public void set初期済か(boolean 初期済か) {
this.初期済か = 初期済か;
}
public String get最終アクセスページID() {
return 最終アクセスページID;
}
public void set最終アクセスページID(String 最終アクセスページid) {
最終アクセスページID = 最終アクセスページid;
}
public void reset() {
this.ユーザID = 0;
this.初期済か = false;
this.最終アクセスページID = null;
}
}
----------------------ここまで----------------------
登録ビジネスロジック.java
package hoge.hoge.com;
import java.util.Date;
public class 登録ビジネスロジック
{
// システムの内部状態の保持.
private システム内部状態 state = null;
public void setSystemState(システム内部状態 data) {
this.state = data;
}
public システム内部状態 getSystemState() {
return this.state;
}
// データアクセスオブジェクト (Dao) の保持.
private AccountDao accountDao = null;
public void setAccountDao(AccountDao DAO) {
this.accountDao = DAO;
}
public AccountDao getAccountDao() {
return this.accountDao;
}
private void createNewId(){
System.out.println("ユーザID設定開始");
if ( !this.state.is初期済か() ) {
System.out.println("ユーザID取得");
// データベースが空の場合,ユーザIDを1にセットし,
// 空で無い場合,データベース内のユーザIDの最大値に1足した値にセットする
if ( this.accountDao.getCount() == 0 ) {
this.state.setユーザID(1);
}
else {
this.state.setユーザID( this.accountDao.getMaxUserID() + 1 );
}
this.state.set初期済か(true);
}
else {
// システム内部状態が初期済みなら,その「ユーザID」属性の値に1足すだけの処理
int id = this.state.getユーザID();
this.state.setユーザID( id + 1 );
}
}
/**
* 登録ビジネスロジックの実装
* 初期登録(Registration)の場合,DBにデータを登録
* 登録フォームオブジェクトを与えて呼び出すこと.
*/
public void registration( 登録フォーム regform ){
// ユーザIDの生成
this.createNewId();
// システム内部状態の「最終アクセスページID」の更新
this.state.set最終アクセスページID(regform. getHiddenInput().getValue().toString());
// タップル挿入
AccountDso a = new AccountDso();
a.setユーザ名(regform.getユーザ名_必須());
a.setメールアドレス(regform.getメールアドレス_必須());
a.set登録種類(regform.get登録種類_必須());
a.setユーザID(this.state.getユーザID());
// this.accountDao.initializeTable();
this.accountDao.insertTuple(a);
// 確認表示
System.out.println("--システム内部状態--");
System.out.println("PAGEID:"+this.state.get最終アクセスページID());
System.out.println("--DBに登録--");
System.out.println("ユーザ名:"+a.getユーザ名());
System.out.println("メールアドレス:"+a.getメールアドレス());
System.out.println("登録種類:"+a.get登録種類());
System.out.println("ユーザID:"+a.getユーザID());
System.out.println("以上のデータでDBにINSERTしました");
System.out.println("DATE:"+(new Date()));
}
}
----------------------ここまで----------------------
登録フォーム.java
----------------------ここから----------------------
package hoge.hoge.com;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
// アクションフォーム・クラス
// 入力フォームデータの格納を行うとともに,アクション・コントロール・メソッドも持つ
public class 登録フォーム {
private String ユーザ名_必須 = null;
private String メールアドレス_必須 = null;
private String 登録種類_必須 = null;
// JSP 内の「<h:inputHidden value="index" binding="#{regform.hiddenInput}"/>」でバインディング
public javax.faces.component.html.HtmlInputHidden hiddenInput = null;
public String getユーザ名_必須() {
return ユーザ名_必須;
}
public void setユーザ名_必須(String ユーザ名_必須) {
this.ユーザ名_必須 = ユーザ名_必須;
}
public String getメールアドレス_必須() {
return メールアドレス_必須;
}
public void setメールアドレス_必須(String メールアドレス_必須) {
this.メールアドレス_必須 = メールアドレス_必須;
}
public String get登録種類_必須() {
return 登録種類_必須;
}
public void set登録種類_必須(String 登録種類_必須) {
this.登録種類_必須 = 登録種類_必須;
}
public javax.faces.component.html.HtmlInputHidden getHiddenInput() {
return hiddenInput;
}
public void setHiddenInput(
javax.faces.component.html.HtmlInputHidden hiddenInput) {
this.hiddenInput = hiddenInput;
}
public void reset(){
this.ユーザ名_必須 = null;
this.メールアドレス_必須 = null;
this.登録種類_必須 = null;
}
}
----------------------ここまで----------------------
JSPファイルの作成
4つのJSPファイル index.jsp, success.jsp, failure.jsp, 登録画面.jsp を作成する.
- プロジェクト・エクスプローラで, プロジェクト名 MYFACES の下の 「WebContent」を展開しておく
- WebContent を右クリックして,下記の4つの JSP ファイルを作成.
- index.jsp :「新規」→「その他」→「Amateras」→「JSF」→「Faces JSP ファイル」
- success.jsp :「新規」→「その他」→「Amateras」→「JSF」→「Faces JSP ファイル」
- failure.jsp :「新規」→「その他」→「Amateras」→「JSF」→「Faces JSP ファイル」
- 登録画面.jsp :「新規」→「その他」→「Amateras」→「JSF」→「Faces JSP ファイル」
- プロジェクト・エクスプローラで,JSP ファイルをダブルクリック すると,エディタが開きます.下記のプログラムを,カット&ペースト.
index.jsp
----------------------ここから----------------------
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="https://myfaces.apache.org/tomahawk" prefix="t" %>
<f:view>
<html>
<head>
<!-- タイトルを適切に付ける-->
<title>
登録画面
</title>
</head>
<body>
<h:form id="form1">
<!-- inputHidden の value="ほにゃらら" の部分は,value="index" のように,ページIDを付ける -->
<h:inputHidden value="index" binding="#{regform.hiddenInput}"/>
<H1>
<center>登録画面</center>
</H1>
<f:subview id="table">
<!-- インクルードするJSPファイル名は,画面ごとに異なる.書き換えて下さい-->
<%@ include file="登録画面.jsp"%>
</f:subview>
</h:form>
</body>
</html>
</f:view>
----------------------ここまで----------------------
登録画面.jsp
ラジオボタンは2段組にしている(tomahawk の機能)
----------------------ここから----------------------
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="https://myfaces.apache.org/tomahawk" prefix="t" %>
<center>
<!-- panelGrid は,複数の列があるような表 -->
<h:panelGrid columns="2">
<h:outputLabel for="text1" value="ユーザ名" />
<h:inputText id="text1" value="#{regform.ユーザ名_必須}"/>
<h:outputLabel for="text2" value="メールアドレス" />
<h:inputText id="text2" value="#{regform.メールアドレス_必須}"/>
<!-- 入れ子表 (ラジオボタンを2列にしたいときは columns="2", 1列にしたいときは columns="1"-->
<h:panelGrid columns="2">
<h:outputLabel value="登録種類" />
<!-- layout="spread" にしているので,ラジオボタンを作るが表示はされない(2カラム表示を可能にするための工夫) -->
<t:selectOneRadio id="radio1" value="#{regform.登録種類_必須}" layout="spread" styleClass="selectOneRadio">
<f:selectItem itemValue="学生" itemLabel="学生"/>
<f:selectItem itemValue="登録会員" itemLabel="登録会員"/>
<f:selectItem itemValue="その他の会員" itemLabel="その他の会員"/>
<f:selectItem itemValue="非会員" itemLabel="非会員"/>
</t:selectOneRadio>
<!-- 作ったラジオボタンの表示.for="???" 部分は一致させること.index は 0 から始まる -->
<t:radio for="radio1" index="0" />
<t:radio for="radio1" index="1" />
<t:radio for="radio1" index="2" />
<t:radio for="radio1" index="3" />
</h:panelGrid>
<h:outputLabel value="" />
<h:commandButton id="button1" value="登録" action="#{action.doRegistration}"/>
</h:panelGrid>
</center>
----------------------ここまで----------------------
success.jsp
----------------------ここから----------------------
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="https://myfaces.apache.org/tomahawk" prefix="t" %>
<f:view>
<html>
<head>
<!-- タイトルを適切に付ける-->
<title>
登録成功
</title>
</head>
<body>
<h:form id="form1">
<H1>
<center>登録成功</center>
</H1>
<p>
ユーザ名:
<h:outputText value="#{regform.ユーザ名_必須}" />
</p>
<p>
メールアドレス:
<h:outputText value="#{regform.メールアドレス_必須}" />
</p>
<p>
登録種類:
<h:outputText value="#{regform.登録種類_必須}" />
</p>
<p>
登録に成功しました
</p>
<p>
<h:commandButton value="初めに戻る" action="returnToStart"/>
</p>
</h:form>
</body>
</html>
</f:view>
----------------------ここまで----------------------
failure.jsp
----------------------ここから----------------------
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="https://myfaces.apache.org/tomahawk" prefix="t" %>
<f:view>
<html>
<head>
<!-- タイトルを適切に付ける-->
<title>
登録失敗
</title>
</head>
<body>
<h:form id="form1">
<H1>
<center>登録失敗</center>
</H1>
<p>
ユーザ名:
<h:outputText value="#{regform.ユーザ名_必須}" />
</p>
<p>
メールアドレス:
<h:outputText value="#{regform.メールアドレス_必須}" />
</p>
<p>
登録種類:
<h:outputText value="#{regform.登録種類_必須}" />
</p>
<p>
登録に失敗しました
</p>
</h:form>
</body>
</html>
</f:view>
----------------------ここまで----------------------
設定ファイル web.xml と faces-config.xml
WEB-INF/lib/web.xml
WEB-INF/lib/web.xml を,以下の手順で書き換える.
- プロジェクト・エクスプローラで,WEB-INF/lib/web.xml をダブルクリック
- エディタが開くので「ソース」をクリック
- ファイルエディタに切り替わるので,編集する.
web.xml は下記のようにする.これは,JSF を使うときの決まり文句なので,悩まないこと.
編集が終わったら,プロジェクト・エクスプローラで,web.xml を右クリックして,「リフレッシュ」(または「更新)を選ぶ.
extensionFilter の部分は、Apahce MyFaces の tomahawk コンポーネントと、sandbox コンポーネントを使うときに必要になる。
(特記事項) web.xml の書き方は、tomahawk のバージョンに依存する。 下記に書いた web.xml は、tomahawk のバージョン 1.1.6 で確認済み。
----------------------ここから----------------------
<?xml version="1.0" encoding="UTF-8"?>
<!--
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
-->
<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">
<display-name>MyFaces Application</display-name>
<!-- Extensions Filter -->
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>20m</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.) -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
<!-- servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet-mapping -->
<!--
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
-->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<!-- The Usual Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
----------------------ここまで----------------------
WEB-INF/lib/faces-config.xml
faces-config.xml は、ビーン名とクラス名のマッピングを取るなどのためのファイル。 ここでの設定の要点は下記の通りです.このことを頭に入れて理解してください.
マネージド・ビーン (Managed Bean)
- 入力フォームデータを保持するJava ビーン: regform, hoge.hoge.com.登録フォーム (session)
- アクション・コントローラ・メソッドを持つJava ビーン: action, hoge.hoge.com.アクション (session)
- ビジネスロジック: logic, hoge.hoge.com.登録ビジネスロジック (application)
- マネージド・属性(managed property)がある
----------------------ここから----------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>regform</managed-bean-name>
<managed-bean-class>hoge.hoge.com.登録フォーム</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>logic</managed-bean-name>
<managed-bean-class>hoge.hoge.com.登録ビジネスロジック</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>action</managed-bean-name>
<managed-bean-class>hoge.hoge.com.アクション</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>logic</property-name>
<property-class>hoge.hoge.com.登録ビジネスロジック</property-class>
<value>#{logic}</value>
</managed-property>
<managed-property>
<property-name>regform</property-name>
<property-class>hoge.hoge.com.登録フォーム</property-class>
<value>#{regform}</value>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/success.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/failure.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>returnToStart</from-outcome>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
----------------------ここまで----------------------
テスト実行
以下の手順で,index.jsp を実行する.- プロジェクト・エクスプローラーで,index.jsp」を右クリック.
- 「実行 (Run As)」→「サーバーで実行 (Run on Server)」と操作
- サーバの選択
ウインドウが開くので, 「ローカルホストの Tomcat v5.5 サーバ」が選択されていることを確認の後,「終了」をクリック.
- Tomcat のサーバが起動(または,再起動)するので確認する
コンソール・ビューの表示を確認する.
- 実行結果の確認
Eclipse の 組み込み Web ブラウザ (Internal Web ブラウザ)が開き,そこに実行結果が出る.
うまく動作しないときの確認項目
- データベースソフトが起動済み
- ユーザ名,パスワードに間違いがないこと