JavaBeansの使い方を具体的に知りたい
こんにちは!フリーランスの長野です。JavaBeans使っていますか? JavaBeansとは再利用可能なプログラムを実現するための仕様およびその仕様に沿ったクラスのことです。おもにWEBアプリ開発の際に作成するJSPファイルから利用します。
この記事では、そんなJavaBeansについて、以下の内容を解説していきます。
- そもそもJavaBeansとは
- JavaBean仕様のクラスを作成する方法
- JSPでJavaBeansを利用する方法
- Serializableを実装した永続化
- XMLEncoderとXMLDecoderで保存と復元
など、JavaBeansの基礎の基礎から応用的な内容についても解説していきます。
なお、Javaの記事については、こちらにまとめています。
JavaBeansとは?
JavaBeansとは、Javaで書かれた再利用可能なソフトウェアコンポーネントまたはその技術仕様のことです。ソフトウエアコンポーネントとはクラスのことです。JavaBeansはWEBアプリでデータを操作する際によく使われます。
操作するデータのことをプロパティと呼びます。JavaBeansは仕様ですので以下のような規則があります。
JavaBeansの仕様
- クラスをpublicで指定する
- プロパティ(クラスのメンバ変数)はprivateで指定する
- public指定で引数なしのコンストラクタを定義する
- プロパティにアクセスするためのgetter、setterメソッドを用意する
- java.io.Serializableインタフェースを実装する(必須ではない)
- パッケージ化する
- クラス名の最後は慣例的にBeanにする
それでは、このあとこの仕様に従ったクラスの作成について説明していきます。
JavaBean仕様のクラスの作成
それではJavaBean仕様のクラスの例をご紹介します。
import java.io.Serializable; public class InfoBean implements Serializable { // static final long serialVersionUIDが必要 private static final long serialVersionUID = 1L; // プロパティ(メンバ変数)の宣言 private String code; private String name; // 引数なしコンストラクタの定義 public InfoBean() {} // プロパティcodeのsetter、getter public void setCode(String code) {this.code = code;} public String getCode() {return this.code;} // プロパティnameのsetter、getter public void setName(String name) {this.name = name;} public String getName() {return this.name;} }
- プロパティcode、nameはprivateで指定
- 引数なしのコンストラクタをpublicで指定
- プロパティcode、nameのsetter、getterメソッドを定義する
- setter、getterメソッドの命名には規則がある
- setterメソッドの場合はメソッド名の最初をsetとし、そのあとにプロパティの頭文字を大文字にして続ける
- getterメソッドも同様にメソッド名の最初をgetとし、そのあとにプロパティの頭文字を大文字にして続ける
このようにsetter、getterメソッドを使ってデータを扱うクラスを定義することで、以下のようなメリットがあります。
- 読み書きの可否を制御できる
上記の例ではsetter、getterメソッド両方を定義しましたのでプロパティは他のクラスから読み書きの両方が可能です。例えばgetterメソッドのみ定義した場合は読み込み可能で書き込みが不可とすることができます。メンバ変数のアクセス修飾子の指定では、読み書き両方不可か両方可能しか選択することができません。
- 書き込み時の値の妥当性を検証できる
例えばプロパティに入力する値の文字数などが決められている場合などは、妥当かどうか検証する処理をメソッドで定義することができます。メンバ変数自体では検証することができません。
JSPでJavaBeansを利用する方法
JSPとはJavaServer Pageの略でサーブレットと同じようにサーバー上で動作させるJavaのプログラムのことです。サーブレットではJavaのコードの中にHTMLのコードを記述します。
これに対して、JSPではHTMLのコードの中にJavaのコードを記述します。WEBページ上で動的な処理が必要な個所をJavaのコードで記述することができます。
サーブレットはJavaで記述されるので、JavaBeansクラスを呼び出す場合は普通のクラスを利用する方法と何も変わりません。JSPではHTMLで記述されますが、よく使用する処理をHTML同様にタグ形式で記述することができるアクションタグが用意されています。
このアクションタグの中にJavaBean仕様で定義したクラスのプロパティを操作するタグも含まれています。
- <jsp:useBean> JavaBeansの使用を定義
- <jsp:setProperty> JavaBeansのプロパティに指定値を設定
- <jsp:getProperty> JavaBeansのプロパティの値を取得
<jsp:useBean>要素
<jsp:useBean>要素はJSPでJavaBeansクラスをインスタンス化するのに使います。<jsp:useBean>要素の構文は以下のとおりです。
<jsp:useBean id="オブジェクト名" class="JavaBeansクラスの完全修飾名" scope="スコープの範囲" />
- id属性では、インスタンス化したオブジェクト名を指定
- class属性では、JavaBeansクラスの完全修飾名を指定
- 完全修飾名とはパッケージ名も含めたクラス名、インターフェース名のこと
- scope属性では、プロパティの値が保持される期間と範囲を指定
指定可能な設定値は以下のとおりです。デフォルト値はpageです。
スコープ名 | 説明 |
---|---|
page | 現在のページ内でのみ有効 |
request | 一連のリクエストの処理の範囲で有効 現在のページおよびフォワードされた先のページのみ有効 |
session | ユーザーセッションの範囲で有効 複数のページ間で情報を共有したい場合に使用 異なるユーザーとの間では共有されない |
application | 現在のアプリケーション内のすべてのページ、アクセスしている全ユーザー間で有効 |
<jsp:setProperty>要素
<jsp:setProperty>要素はJavaBeansクラスのプロパティに値を設定するのに使います。<jsp:setProperty>要素の構文は、以下のとおりです。
<jsp:setProperty name="オブジェクト名" property="プロパティ名" [value="プロパティ値"|param="パラメータ名"] />
- me属性では、JavaBeansクラスのオブジェクト名を指定
- <jsp:useBean>要素のid属性と対応する必要がある
- property属性では、JavaBeansクラス内の対応するプロパティ名を指定
- JavaBeansクラス内では対応するsetterメソッドが呼び出される
- value属性はプロパティの値を固定値として設定したい場合に使う
- param属性はリクエストパラメータから設定したい場合に使う
<jsp:getProperty>要素
<jsp:getProperty>要素はJavaBeansクラスのオブジェクトの指定されたプロパティ値を取得し、クライアント(ブラウザ)に返します。<jsp:getProperty>要素の構文は以下のとおりです。
<jsp:getProperty name="オブジェクト名" property="プロパティ名" />
Serializableを実装した永続化
JavaBeansの仕様の中で「java.io.Serializableインタフェースを実装する」とお伝えしました。Serializableとは、永続化可能ということです。
先ほどJSPのアクティブタグのscope属性でお伝えしたように、データの保持期間・範囲は限定されています。JavaBeansクラスはjava.io.Serializableインタフェースを実装することで、インスタンス化したオブジェクトのデータをメモリ上からディスク上のファイルに保存、永続化させることができます。
ちなみにSerializableを直列化可能と説明されている場合もあります。この場合はファイルにデータを保存する際に、1列のデータ列に変換して保存することを指して直列化可能と説明されています。
オブジェクトのデータをファイルに保存するには、ObjectOutputStreamクラスのwriteObjectメソッドを使用します。writeObjectメソッドの引数にjava.io.Serializableインタフェースを実装したJavaBeansクラスのオブジェクトを指定し実行することで、バイナリファイルが生成されます。
また、保存したファイルからオブジェクトのデータを復元することも可能です。オブジェクトのデータを復元することをデシリアライズといいますが、ObjectInputStreamクラスのreadObjectメソッドを使用します。
サンプルコードで確認しましょう。JavaBeansクラスには先ほどのInfoBeanクラスを使います。「Sample.bin」というバイナリーファイルが作成されます。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class BeanSample { public static void main(String[] args) { String fileName = "Sample.bin"; // オブジェクトを作成 InfoBean info = new InfoBean(); info.setCode("A0001"); info.setName("Taro Yamada"); // オブジェクトのデータを保存 try { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(fileName) ); oos.writeObject(info); oos.close(); } catch(Exception e) { e.printStackTrace(); } // オブジェクトのデータを復元 InfoBean new_info = null; try { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(fileName) ); new_info = (InfoBean)ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); return; } System.out.println(new_info.getCode() + ", " + new_info.getName()); } }
実行結果:
A0001, Taro Yamada
XMLEncoderとXMLDecoderで保存と復元
先ほどはjava.io.Serializableインタフェースを実装してオブジェクトのデータをシリアライズ、デシリアライズする方法を説明しました。Javaではこの他にもXMLEncoderクラスとXMLDecoderクラスを使ってオブジェクトのデータを書き出し保存、復元することができます。
クラス名にXMLが付いていますので、XML形式で書き出します。XML形式ですから、バイナリデータに比べて後から内容を追加、変更することも簡単です。
XMLEncoderクラスはJavaBeansクラスのオブジェクトのデータをXML形式に変換するためのクラスでjava.beansパッケージに含まれています。同じようにXMLDecoderはXML形式で保存されたファイルからデータを復元するためのクラスです。
使い方をサンプルコードで確認しましょう。ここでもJavaBeansクラスには先ほどのInfoBeanクラスを使います。
import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class BeanSample { public static void main(String[] args) { String fileName = "Sample.xml"; // オブジェクトを作成 InfoBean info = new InfoBean(); info.setCode("A0001"); info.setName("Taro Yamada"); // オブジェクトのデータを保存 try { XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream( new FileOutputStream(fileName) ) ); encoder.writeObject(info); encoder.close(); } catch(Exception e) { e.printStackTrace(); } // オブジェクトのデータを復元 InfoBean new_info = null; try { XMLDecoder decoder = new XMLDecoder( new BufferedInputStream( new FileInputStream(fileName) ) ); new_info = (InfoBean)decoder.readObject(); decoder.close(); } catch (FileNotFoundException e) { e.printStackTrace(); return; } System.out.println(new_info.getCode() + ", " + new_info.getName()); } }
実行結果:
A0001, Taro Yamada
Sample.xml:
<?xml version="1.0" encoding="UTF-8"?> <java version="10.0.1" class="java.beans.XMLDecoder"> <object class="InfoBean"> <void property="code"> <string>A0001</string> </void> <void property="name"> <string>Taro Yamada</string> </void> </object> </java>
まとめ
ここではJavaBeansについて説明しました。JavaBeansはクラスのオブジェクトでデータを操作する際にクラスを定義するための仕様です。
この仕様を活用すれば、オブジェクトのデータをJSPのアクティブタグで利用できます。またデータを永続化、復元することも可能です。使いこなすことができるように、この記事を何度も参考にして下さいね!