Servlet における Bean クラスとは Part 2
Java
この記事は以下の記事の続きです。
Servlet における Bean クラスとは Part 1
Bean と一緒に覚えておきたい BeanList という存在
前回の記事では「キャラクター」という塊にまとめてわかりやすくすることに成功しました。
これで bean をいくつか作って、キャラクターの数だけ setAttribute するだけでよくなりますね。やったー!
BeanList は Bean をさらにまとめた塊
が、実はこれをさらに簡潔にするための考え方が存在します。それが BeanList です。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// BeanList を宣言
ArrayList<CharacterBean> beanList = new ArrayList<CharacterBean>();
// bean を宣言
CharacterBean bean = new CharacterBean();
// データの書き込み
bean.setCharaId(1);
bean.setName("タロー");
bean.setJob("勇者");
bean.setLevel(33);
// beanList に bean を追加
beanList.add(bean);
// 新しく bean を宣言
// 新しく new しているので一度初期化され
// さっきまでとは別の bean に格納される
bean = new CharacterBean();
bean.setCharaId(2);
bean.setName("ジロー");
bean.setJob("魔法使い");
bean.setLevel(31);
beanList.add(bean);
bean = new CharacterBean();
bean.setCharaId(3);
bean.setName("ハナコ");
bean.setJob("僧侶");
bean.setLevel(32);
beanList.add(bean);
request.setAttribute("beanList", beanList);
ServletContext context = this.getServletContext();
// フォワード先を指定
RequestDispatcher dispatcher = context
.getRequestDispatcher("/partyMember.jsp");
// フォワード処理
dispatcher.forward(request, response);
}
BeanList は ArrayList の要素の型を bean にしたものです。
まず ArrayList について説明します。
ArrayList は名前からも察することができるとおり、配列の仲間です。しかし、配列よりも柔軟で、配列にはできない様々なことができるようになっています。
たとえば String 型配列の要素の型は String です。つまり、String 型の文字列のみを入れることができます。
しかし、ArrayList は「<>」の中に指定した型ならなんでも好き勝手に入れることができます。たとえば、以下のように宣言すれば String 型配列に似たものが作れます。
ArrayList<String> strArrayList = new ArrayList<String>();
逆にいえば要素の型を CharacterBean にすれば、自作した CharacterBean という型を配列のようなモノにぶちこめるということになります。これは便利です。
もう一つの ArrayList にできることというと、要素の数の変更です。配列は要素数を 4 個と宣言してしまうと途中から 5 個や 6 個に変更することはできませんが、ArrayList は追加や削除することを前提に作られているクラスです。
// 要素の追加
strArrayList.add("test");
strArrayList.add("てすと");
strArrayList.add("テスト");
// これで要素が3個のデータになりました。
// 要素の削除
strArrayList.remove(1);
// 1番目の要素が削除され、test, テスト というリストになりました。
要素の追加に関して、上記 Servlet の bean を例にすると以下の部分が該当します。
// キャラクター3のデータをまとめてから、
bean.setCharaId(3);
bean.setName("ハナコ");
bean.setJob("僧侶");
bean.setLevel(32);
// beanList に追加している
beanList.add(bean);
つまり Servlet のコードでは「CharacterBean というキャラクターデータ」を持つことができる ArrayList を作り、それに対してキャラクターデータを add して追加していった。という処理をしたことになります。
request.setAttribute("beanList", beanList);
そしてこの 1 行で一気にリクエストに乗せています。
前回の記事で例えた倉庫でいうと、まず setter という番人を通してデータを運び入れた倉庫を何個も用意し、複数の倉庫を一個の大型トラックで運び込んだといったところでしょうか。
BeanList の中身を JSP で表示してみる
Servlet を実行して beanList の中身を表示したいと思います。
前回の記事で使った JSP を少し書き換えます。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="hello.CharacterBean" %>
<%@ page import="java.util.ArrayList" %>
<% // beanList をリクエストデータから取得
ArrayList<CharacterBean>beanList = (ArrayList<CharacterBean>)request.getAttribute("beanList"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>パーティメンバー</title>
</head>
<body>
<table>
<tbody>
<tr>
<th>キャラID</th>
<th>キャラ名</th>
<th>職業</th>
<th>レベル</th>
</tr>
<% for(CharacterBean bean : beanList){ %>
<tr>
<td><%=bean.getCharaId() %></td>
<td><%=bean.getName() %></td>
<td><%=bean.getJob() %></td>
<td><%=bean.getLevel() %></td>
</tr>
<% } // endfor %>
</tbody>
</table>
</body>
</html>
上のようなソースコードになりました。
<%@ page import="java.util.ArrayList" %>
この記述は JSP で ArrayList を使用できるようにするための記述です。
ArrayList<CharacterBean> beanList = (ArrayList<CharacterBean>)request.getAttribute("beanList");
リクエストから beanList を取得する記述です。
ArrayList は基本的に何でも入ってしまうので、Eclipse などの IDE を利用していると型の安全性に関する警告が表示されますが、気にしなくても問題ありません。
<% for(CharacterBean bean : beanList){ %>
<tr>
<td><%=bean.getCharaId() %></td>
<td><%=bean.getName() %></td>
<td><%=bean.getJob() %></td>
<td><%=bean.getLevel() %></td>
</tr>
<% } // endfor %>
「beanList の中身が存在する限り、中身を取得してテーブルの行を生成しつづける」というループをおこなっています。
ループするたびに bean の中身が変わるので、行ひとつひとつ別のキャラクターデータが取得できます。
beanList に add していった bean の内容と同じですね。
bean 一つのデータが一行となって表示され、それが複数行表示されることで beanList を再現しています。
広告