似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

JPA + EJB + JSF による Web アプリケーション(その 5)

長らくお待たせいたしました。今回は Javaソースコードを書いていきます。

下準備

前回作った JSF のプロジェクトのビルド・パスに、以前に作った EJB のプロジェクトを含めること。これをしないと EJB 側のパッケージを参照できずエラーになります。

管理 Bean の作成

JSF では管理 Bean という Bean を作成します。「管理 Bean って何を管理するの ?」と思うかも知れませんが、英語では Managed Bean、つまり「(JSF によって)管理されている Bean」という意味です。

package jp.mydns.akanekodou;

import javax.ejb.EJB;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import java.io.Serializable;
import java.util.List;

import jp.mydns.akanekodou.dao.CityDAO;
import jp.mydns.akanekodou.entity.City;

@SuppressWarnings("serial")
@ManagedBean
@SessionScoped
public class MajorCity implements Serializable {
    @EJB
    private CityDAO dao;
    private List<City> cities;
    private City city;

    @PostConstruct
    private void init() {
        cities = dao.all();
    }

    public List<City> getCities() {
        return cities;
    }
    public City getCity() {
        return city;
    }

    public String detail(int id) {
        city = dao.find(id);
        return "detail";
    }
}

JSF 2.0 からは faces-config.xml をいちいち編集せずともこのようにアノテーションで管理 Bean であることを JSF に教えてあげることができます。煩わしい XML の編集作業から解放されるのは楽ですね。

管理 Bean にはスコープを設定します。特に指定しなければ RequestScoped になるようです。また今回のように SessionScoped にする場合は Serializableimplements する必要があります。それ以外の部分は基本的に POJO として作成できます。

public String detail(int id) {
    city = dao.find(id);
    return "detail";
}

の部分はアクションメソッドと言われる部分で、戻り値は遷移先の View の名前です。自分自身に遷移する場合は空文字列または nullreturn するようにします(2015/03/07 追記 : メソッドの返り値を void にしても同じ効果が得られるようです)。