SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

GlassFishからアプローチするJava

GlassFishからアプローチするJava~入門編~
第4回「Webアプリケーションの作成 GlassFish管理コンソールを使う」

式言語とJSTLの組み合わせは美しい


ダウンロード サンプルコード (7.8 KB)

ServletとDAOクラスのインターフェースとなるImoshochuCatalogItemクラスを作成

 今回の目標は、ブラウザに芋焼酎のカタログを表示することです。カタログを表示するためにはリストでブラウザに表示するのが一番分かりやすいと考えられます。つまり、ブラウザに結果を返すのはJSPの役割となりますが、JSPに値を渡すときは1つの芋焼酎を表したクラスを用意し、それをArrayListとするのがJSPとしては処理しやすいと思います。この形式にするのはJSTLのc:forEachアクションを使えるからです。

 この芋焼酎を表したクラスをImoshochuCatalogItemという名称で作成します。プロパティとして、銘柄名、銘柄読み方、度数、麹、芋の種類、製造元、容量、単価を持たせることにします。図10がImoshochuCatalogItemのクラスです。コンストラクタで全ての値を設定し、プロパティはgetterメソッドのみ用意しています。

図10.ImoshochuCatalogItemクラス(一部)
001:package jp.kawakubo;
002:
003:/**
004: *
005: * @author tomoharu
006: */
007:public class ImoshochuCatalogItem {
008:    
009:    private String name = "";
010:    private String nameKana = "";
011:    private int dosu = 0;
012:    private String koji = "";
013:    private String sweetPotatoName = "";
014:    private String manufacturer = "";
015:    private float volume = 0f;
016:    private int price = 0;
017:
018:    public ImoshochuCatalogItem() {
019:        
020:    }
021:
022:    public ImoshochuCatalogItem(String name,
023:            String nameKana,
024:            int dosu,
025:            String koji,
026:            String sweetPotatoName,
027:            String manufacturer,
028:            float volume,
029:            int price) {
030:        this.name = name;
031:        this.nameKana = nameKana;
032:        this.dosu = dosu;
033:        this.koji = koji;
034:        this.sweetPotatoName = sweetPotatoName;
035:        this.manufacturer = manufacturer;
036:        this.volume = volume;
037:        this.price = price;
038:    }
039:
040:    /**
041:     * @return the name
042:     */
043:    public String getName() {
044:        return name;
045:    }
046:
047:    /**
048:     * @return the nameKana
049:     */
050:    public String getNameKana() {
051:        return nameKana;
052:    }

疑似DAOクラスを作成

 本来であればデータベースに接続するDAOクラスを作成するところですが、入門レベルの時は一度に作成せず、今回作成するような疑似クラス(スケルトン)を用意し、インタフェースがうまく設計されていることを確認することをお薦めします。JSPでImoshochuCatalogItemオブジェクトのArrayListを渡すことでカタログを作成できるか確認した後に本来のDAOクラスを作成しても遅くはありません。もしかしたら、ArrayListを渡してもカタログが作成できないのであれば、DAOクラスの作り直しになってしまいます。

インターフェースを作成

 このインターフェースは先述のServletとDAOクラスで受け渡されるものを指しているのではなく、JavaのInterfaceを指しています。インターフェースを導入することにより、実装を置き換えることが容易になります。これは疑似DAOから本来のDAOに置き換えることを容易にしてくれます。また、データソースがリレーショナル・データベース(以降、RDB)ではなくXMLデータベースに置き換えるなどの変更が発生しても、Servlet側は一切修正を加える必要がなくなります。

 ImoshochuWeb01を右クリック。[新規]-[その他]-[ファイルの種類を選択]と操作し、カテゴリの[Java]をクリックして、ファイルの種類から[Java インタフェース]を選択します。[名前と場所]画面が表示されます。クラス名は「ImoshochuCatalogDAO」と入力、パッケージ名は「jp.kawakubo」と入力し[完了]ボタンをクリックします。エディタが開き、図11のように修正します。引数を持っていませんが、カタログに検索機能を持たせたい場合などは、引数として検索条件を渡すことになります。このサンプルではデータベースの内容をそのまま出力するものとします。

図11.ImoshochuCatalogDAOインターフェース
001:package jp.kawakubo;
002:
003:import java.util.ArrayList;
004:
005:/**
006: *
007: * @author tomoharu
008: */
009:public interface ImoshochuCatalogDAO {
010:
011:    public ArrayList getImoshochuCatalogList();
012:
013:}

インターフェースを実装した疑似DAOクラスを作成

 図12がimoshochuCatalogDaoインターフェースを実装した疑似DAOクラスです。コンストラクタでカタログの明細に相当するImoshochuCatalogItemオブジェクトを作成し、ArrayListに追加します。実装するgetImoshochuCatalogListは単にこのArrayListを返すだけです。どうでしょう、至ってシンプルだと思いませんか。このようなクラスを用意することでインターフェースの変更という大きなリスクを軽減することができます。

図12.ImoshochuCatalogDAOImplクラス(疑似版)
001:package jp.kawakubo;
002:
003:import java.util.ArrayList;
004:
005:/**
006: *
007: * @author tomoharu
008: */
009:public class ImoshochuCatalogDAOImpl implements ImoshochuCatalogDAO {
010:    
011:    private ArrayList imoCatalog =
012:        new ArrayList();
013:
014:    public ImoshochuCatalogDAOImpl() {
015:
016:        imoCatalog.add(new ImoshochuCatalogItem("がんこ焼酎屋",
017:            "がんこしょうちゅうや", 25, "白", "ジョイホワイト", "大石酒造", 1.8f , 2630));
018:        imoCatalog.add(new ImoshochuCatalogItem("貴心樹",
019:            "きしんじゅ", 25, "黒", "黄金千貫", "オガタマ酒造", 1.8f , 1724));
020:        imoCatalog.add(new ImoshochuCatalogItem("鴨神楽",
021:            "かもかぐら", 25, "白", "黄金千貫", "小牧醸造", 1.8f , 2930));
022:        imoCatalog.add(new ImoshochuCatalogItem("一壺春",
023:            "いっこしゅん", 25, "白", "ジョイホワイト", "古澤醸造", 0.72f , 1360));
024:        imoCatalog.add(new ImoshochuCatalogItem("杜氏潤平紅芋原酒",
025:            "とうじじゅんぺいべにいもげんしゅ", 38, "白", "紅芋コトブキ", "小玉醸造", 0.5f , 2050));
026:        imoCatalog.add(new ImoshochuCatalogItem(
027:            "宝山蒸撰綾紫酒精乃雫", "ほうざんじょうせんあやむらさきしゅせいのしずく",
028:             34, "白", "南薩産綾紫", "西酒造", 0.72f , 2050));
029:        imoCatalog.add(new ImoshochuCatalogItem("角玉",
030:            "かくたま", 25, "黒", "黄金千貫", "佐多宗二商店", 1.8f , 2050));
031:        imoCatalog.add(new ImoshochuCatalogItem("古の千鶴",
032:            "いにしえのちづる", 25, "黒", "黄金千貫", "神酒造", 1.8f , 2625));
033:
034:    }
035:
036:    public ArrayList getImoshochuCatalogList() {
037:        return imoCatalog;
038:    }
039:
040:}

 上記リストでimoCatalogのaddメソッドは途中で改行していますが、実際には1行で記述してください。

Servletを修正

 一応、DAOクラスができました。JSPにDAOクラスの戻り値を返すにはHttpSessionクラスを使用します。第3回のJSPの基礎のスコープで一度出てきたクラスです。その時はJSPの変数にアクセスできるスコープとして暗黙オブジェクトのsessionを紹介しましたが、その型がHttpSessionクラスです。他のクライアント同士の情報を隔離したい場合に使用します。DAOクラスからの戻り値をHttpSessionに設定し、RequestDispatcherのforwardメソッドでカタログを表示するJSPへ遷移します。図13はServletのprocessRequestのみを抜粋したものです。

図13.ImoshochuCatalogのprocessRequestメソッド
001:protected void processRequest(HttpServletRequest request,
002:                                HttpServletResponse response)
003:throws ServletException, IOException {
004:    // DAOクラスをインスタンス化する
005:    ImoshochuCatalogDAO imoshochuCatalogDAO = new ImoshochuCatalogDAOImpl();
006:    // requestからHttpSessionを取り出し、ImoshochuCatalogItemのArrayList
007:    // を"imoCatalog"として埋め込む
008:    request.getSession().setAttribute("imoCatalog",
009:                            imoshochuCatalogDAO.getImoshochuCatalogList());
010:
011:    // ImoshochuShop.jspに遷移する
012:    RequestDispatcher rd = request.getRequestDispatcher("/ImoshochuShop.jsp");
013:    rd.forward(request, response);
014:
015:}

芋焼酎酒店のJSPを作成

 図14が芋焼酎酒店のJSPであるImoshochuShop.jspです。図15がその出力結果です。JSP 1.Xを知っている方はこのシンプルさに感動されるのではないでしょうか。JSLTのc:forEachアクションを使用するだけで、ほぼコーディングが完成してしまいます。JSP 1.XであればsessionのgetAttributeメソッドで"imoCatalog"を指定し、Servletで設定したArrayListを取得し、for文でループを回していました。今回はアクション要素すら使用していません。式言語とJSTLだけを使ってtableを生成することができました。式言語やJSTLの威力を感じていただけたでしょうか?

図14.ImoshochuShop.jsp
図14.ImoshochuShop.jsp

 c:forEachアクションについて少し詳しく解説します。

 c:forEachアクションのitems属性には配列やCollectionクラスを継承するものを指定できます。この例ではArrayListが${sessionScope.imoCatalog}で返され、ArrayListはCollectionクラスを継承しているためitemsで指定することが可能です。

 また、sessionScopeは変数がどこにあるのかを指定するのに用います。sessionScopeは文字通りsessionのスコープ内にある変数を指す場合に使用する式言語の暗黙オブジェクトです。第3回でスコープについて説明しましたが、session以外に、application、request、pageのスコープがありました。それぞれに対応するのはapplicationScope、requestScope、pageScopeとなります。

 次にvar属性は、itemsの要素が格納されます。この例ではImoshochuCatalogItemオブジェクトが格納されますが、属性値は分かりやすい名前であれば何でも構いません。この例ではmeigaraという名前をImoshochuCatalogItemオブジェクトに付けています。このオブジェクトのプロパティから値を取り出したい場合、${meigara.name}のようにvar属性値に.(ドット)でプロパティ名を連結するだけです。当然、nameプロパティはgetterメソッドがなければなりません。第3回の式言語で説明したように型変換を行う必要がないのも便利です。(テンプレート・テキスト内の式言語の結果はStringに型変換されます)。

図15.芋焼酎酒店カタログ作成版
図15.芋焼酎酒店カタログ作成版

 カタログを確認するにはImoshochuWelcome.htmlを右クリックして[ファイルを実行]を選択すると図8の画面が表示され、その中の[芋焼酎カタログへ]ボタンをクリックすると図15の画面が表示されます。

次のページ
疑似DAOクラスから本物のDAOクラスを作成

この記事は参考になりましたか?

GlassFishからアプローチするJava連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4841 2010/02/27 14:46

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー