Gradleとは何者?インストール方法〜使い方までわかりやすく解説
- 1.JavaBeansとは?
- 2.JavaBeansの仕様
- 3.JavaBeansを使うメリット
- 4.JavaBeans仕様のクラスの作り方
- 5.JavaBeans仕様のクラスの使い方
- 6.JSPでJavaBeansを使う方法
- 7.JavaBeansを使う際の注意点
サーブレットの学習や、Javaフレームワークの学習をすると必ずと言っていいほど登場するのが「JavaBeans」です。
今回は、そのJavaBeansとは何者なのか、どうやって使うのかについて詳しく解説します。
1.JavaBeansとは?
JavaBeansは、Javaにおいてデータをひとつにまとめて格納するために利用する仕組みを指します。
名前の理由には諸説ありますが、Javaのロゴがコーヒーであることから、コーヒーの原料であるコーヒー豆が由来であるといわれています。
ユーザーが入力した内容をサーバーへ送信したり、データベースに保存したりする際、それらのデータをひとつの「Bean」として定義することで扱いやすくなるのです。
2.JavaBeansの仕様
JavaBeansは、クラスやライブラリとして提供されているわけでありません。
以下のルールに則ってクラスを作成することで、JavaBeansとして扱えるようになります。
- getter/setterメソッドを用意する
- 引数なしのpublicコンストラクタを作成する
- java.io.Serializableを実装する
また、慣例として以下のルールでクラスを作成することが多いため、合わせて覚えておきましょう。
- クラスはpublicで宣言する
- クラス名は「〜Bean」とする
それでは、大事な3つのルールについて解説していきます。
①getter/setterメソッドを用意する
getter/setterは、作成したプロパティに外部からアクセスするためのメソッドです。
このgetterとsetterは「カプセル化」を実現するために作成しますが、理由については後述します。
getter(ゲッター)メソッド
getterは、JavaBeansのプロパティから値を取得するために利用するメソッドです。
以下の規則でメソッドを作成します。
・メソッド名は「getプロパティ名」
・対応するプロパティの値を返却する
setter(セッター)メソッド
一方、setterは、JavaBeansのプロパティに値を格納するために利用するメソッドです。
以下の規則でメソッドを作成します。
・メソッド名は「setプロパティ名」
・対応するプロパティに格納する値を受け取り、プロパティに代入する
②引数なしのpublicコンストラクタを定義する
Javaのオブジェクトにはコンストラクタが必要ですので、引数のない空のコンストラクタを作成します。
引数なしにインスタンスを生成できるということは、後述の「シリアライズ」を行う上で重要な意味合いをもちます。
フレームワークでは、自動でJavaBeansを作成するような機能をもっているのものが多いです。
その時、フレームワークはJavaBeansのルールに基づき、「引数なしのコンストラクタ」を利用してJavaBeansを生成します。
あまり意味のないようなルールにも見えますが、このルールを活用しているフレームワークは多いため、利用する際には注意しましょう。
③java.io.Serializableを実装する
インターフェースであるjava.io.Serializableを実装します。
Serializableを実装することで、そのJavaオブジェクトは「シリアライズ」できるようになるのです。(シリアライズについては後述します。)
3.JavaBeansを使うメリット
JavaBeansを使うことによるメリットを紹介します。
①カプセル化を実現する
JavaBeansにおいては、データの格納のために「プロパティ」という概念を利用します。
Javaのクラス変数は「フィールド」と呼びますが、このフィールドとプロパティは異なる意味合いをもつので注意しましょう。
フィールドは、そのインスタンスのもつ「変数」を保持するために利用します。
プロパティは、クラスインスタンスの外部から値を参照するために利用します。
一見同じことを指しているように見えますが、プロパティを活用することで、
・値の参照はできるけど代入はできない
・継承したクラスからしか値を代入できない
といったように、フィールド変数とは違った細かいアクセス制御が実現できるのです。
②シリアライズすることで通信に利用できる
JavaBeansの特徴のひとつとして、「Serializableを実装してシリアライズ化する」という点があります。
シリアライズとは直訳すると「直列化」という意味で、Javaにおいては外部との通信やデータ保存に利用できるような仕組みを指します。
通常のJavaオブジェクトでは、サーバー間などでデータの送受信をするために利用することができません。
Serializableインターフェースを実装することで通信に利用できるようになり、JSPでの利用やセッションへの格納が可能となるのです。
4.JavaBeans仕様のクラスの作り方
JavaBeansの仕様に基づいたクラスの作り方を紹介します。
ここでは、氏名や電話番号といったユーザー情報を保持するBeanを作成してみましょう。
パッケージ「beans」を作成し、その中にクラスを作成します。
package beans;
import java.io.Serializable;
/**
* ユーザー情報のBean
*/
public class UserInfoBean implements Serializable { // ③ - Serializableを実装する
/** 姓 */
private String lastName;
/** 名 */
private String firstName;
/** 住所 */
private String address;
// -------------------
// ① - プロパティの宣言
// -------------------
/**
* 姓のgetter
* @return 姓
*/
public String getLastName() {
return lastName;
}
/**
* 姓のsetter
* @param lastName 姓
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* 名のgetter
* @return 名
*/
public String getFirstName() {
return firstName;
}
/**
* 名のsetter
* @param firstName 名
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* 住所のgetter
* @return 住所
*/
public String getAddress() {
return address;
}
/**
* 住所のsetter
* @param address 住所
*/
public void setAddress(String address) {
this.address = address;
}
// -------------------------
// ② - 空のコンストラクタを生成
// -------------------------
/**
* 空のコンストラクタ
*/
public UserInfoBean() { }
}
5.JavaBeans仕様のクラスの使い方
JavaBeansのクラスを利用する場合には、通常のクラスと同様に利用できます。
import beans.UserInfoBean;
public class Main {
public static void main(String[] args) {
// Beanを生成
UserInfoBean userInfoBean = new UserInfoBean();
// getterを使ってプロパティを代入
userInfoBean.setFirstName("太郎");
userInfoBean.setLastName("佐藤");
userInfoBean.setAddress("東京都中央区");
// setterを使ってプロパティを取得
System.out.printf("%s %sさんは%sに住んでいます",
userInfoBean.getLastName(),
userInfoBean.getFirstName(),
userInfoBean.getAddress());
}
}
6.JSPでJavaBeansを使う方法
基本的なJavaBeansの仕様を理解したところで、JSPを用いたWebアプリケーションでの利用方法を紹介します。
今回は、サーブレットで生成したBeanをJSP上で表示するサンプルを紹介します。
①サーブレットを作成する
まずは、リクエストURLを受け取るサーブレットを作成します。
package beans;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Beanを生成
UserInfoBean userInfoBean = new UserInfoBean();
// setterを使ってプロパティを代入
userInfoBean.setFirstName("太郎");
userInfoBean.setLastName("佐藤");
userInfoBean.setAddress("東京都中央区");
// リクエストスコープにBeanを保持
req.setAttribute("userInfo", userInfoBean);
// JSPを表示
req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req, resp);
}
}
②JSPを作成する
次に、Beanの内容を表示するためのJSPを作成します。
<%@ page pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>一覧</title>
</head>
<body>
<jsp:useBean id="userInfo" class="beans.UserInfoBean" scope="request"></jsp:useBean>
<p>
<span>こんにちは、</span>
<jsp:getProperty name="userInfo" property="firstName" />
<span>さん!</span>
</p>
</body>
</html>
JSP上でJavaBeanを扱うためには、「jsp:useBean」と「jsp:getProperty」を使用します。
jsp:useBean
まずは、JSP上で取り扱うJavaBeansの情報を記述します。
jsp:useBeanを使用することで、サーバー上に保持されたJavaBeansのデータを取得して使用できるのです。
タグの中で指定する属性は、それぞれ以下の意味をもちます。
属性名 | 説明 |
id | JSPの中で対象のBeanを参照するための名前を指定します。 |
class | 扱いたいJavaBeansのクラスを指定します。 ※パッケージを含むフルパスで指定する必要があることに注意しましょう。 |
scope | どのスコープからBeanを取り出すかを指定します。 今回はリクエストスコープから情報を取得するため「request」を指定しています。 |
jsp:getProperty
JSPに読み込んだJavaBeansのプロパティを取得して表示するには、「jsp:getProperty」を使用します。
タグの中で指定する属性は、それぞれ以下の意味をもちます。
属性名 | 説明 |
name | 取得対象のJavaBeansを指定します。 jsp:useBeanのタグで指定したid属性の内容と一致させます。 |
property | JavaBeansのプロパティ名を指定します。 「get」は不要であることを忘れないようにしましょう。 |
7.JavaBeansを使う際の注意点
①複数の情報を保持できない
JavaBeansとして作成したクラスは、その情報をひとつの単位として扱います。
そのため、ひとつのBeanはひとつの情報しか格納できません。
// Beanを生成
UserInfoBean userInfoBean = new UserInfoBean();
// setterを使ってプロパティを代入
userInfoBean.setFirstName("太郎");
userInfoBean.setLastName("佐藤");
// 姓に「高橋」を指定
userInfoBean.setLastName("高橋");
System.out.println(userInfoBean.getLastName()); //-> 「高橋」が出力される
複数の情報を扱いたい場合には別名で
複数のユーザーを扱いたい場合には、それぞれ別のBeanとしてインスタンスを生成しましょう。
// Beanを生成
UserInfoBean taro = new UserInfoBean();
// setterを使ってプロパティを代入
taro.setFirstName("太郎");
taro.setLastName("佐藤");
// 姓に「鈴木」を指定したインスタンスを別途生成
UserInfoBean jiro = new UserInfoBean();
jiro.setFirstName("次郎");
jirp.setLastName("鈴木");
System.out.println(taro.getLastName());
// -> 「佐藤」が出力される
System.out.println(jiro.getLastName());
// -> 「鈴木」が出力される
②setterを使う際は意図しない値が入らないよう注意
JavaBeansにおけるプロパティは、カプセル化を実現するために利用します。
特に、setterによる値の代入を行う場合には、間違った値が代入されていないことに注意しましょう。
例えば、次のように誤ったフィールドに代入してしまった場合、予期しないエラーが発生することになります。
public void setFirstName(String name) {
// firstNameのプロパティなのにlastNameのフィールドに代入してしまっている
this.lastName = name;
}
もしくは、以下のようにJavaBeansを使う側でも間違った使い方をすることで発生することもあります。
// 名に対して苗字の「佐藤」を代入してしまっている
userInfoBean.setFirstName("佐藤");
このように、JavaBeansを利用する場合には間違った代入をしないように注意が必要です。
getter/setterの生成はIDEの自動生成を使おう
EclipseなどのIDEには、getterやsetterを自動で生成する機能がついています。
Eclipseの場合、ソースコードを右クリックして「ソース」 > 「getter および setter の生成」を選択することで、フィールドからgetterとsetterを自動生成できます。