2014年2月23日日曜日

PlayFrameworkで会員制ギャラリーサイトを作る習作:EBeanを使ってデータの取得を行う

さて、それではさっそくデータを取得してトップ画面に一覧を表示する機能を作っていきます。

プロジェクトの概要はこちら

今回の機能に関するIssueはこちらになります。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/issues/9

ロジック層

まずはデータを取得していく、MVCで言えばMのあたりから作っていきます。

modules/core/app/services/bases/SiteService.java
を作ります。

データの件数取得、データの一覧取得の条件は
getSiteCriteria
のメソッドにして共通の処理を呼ぶようにしています。

 public static PagingList<Site> getSiteCriteria() {
  return find.where().orderBy().desc("createDate")
    .findPagingList(ApplicationConfigUtils.MAX_PER_PAGE);
 }

 public static List<Site> getSiteResultList(Integer page) {
  PagingList<Site> pagingList = getSiteCriteria();
  Page<Site> currentPage = pagingList.getPage(page);
  return currentPage.getList();
 }

 public static Integer getSiteResultCount(Integer page) {
  PagingList<Site> pagingList = getSiteCriteria();
  return pagingList.getTotalPageCount();
 }


なかなかPlayFrameworkでページャーを使ってるサンプルがないのですが、このようにして呼ぶみたいです。

つぎにSiteServiceをextendsしたクラス
を作ります。
 
 public static List<SiteBean> getSiteBeanResultList(Integer page) {
  ArrayList<SiteBean> list = new ArrayList<SiteBean>();
  List<Site> resultList = getSiteResultList(page);
  for (Site site : resultList) {
   list.add(setSiteBean(site));
  }
  return list;
 }

SiteServiceはDBに直接操作を行うクラスという位置づけにしていて、
Controller側ではそのラッパーのSiteBeanServiceを呼ぶようにしています。
このクラスではDBからデータを取得する処理をSiteServiceから呼び出して、SiteBeanにセットする処理をしています。

こうすることで今後例えばキャッシュ機構を組み込む、などのようになった場合にDBアクセス層のSiteServiceはそのままで、SiteBeanServiceにキャッシュ機構を組み込めばいいようになります。

今の段階ではSiteBeanはSiteクラスをextendsしていますが、これはEBeanのModelではないため、多分extendsはやめると思います。。

JavaだとこういったModel,Bean系はsetter,getterを使うのが常ですが、Playはpublicにするのが流儀っぽいので、そういう感じにしています。

1ページに表示する件数については
modules/base/app/utils/base/ApplicationConfigUtils.java
に記述しています。こういうのは1つのサービス上統一するケースが多いと思うので、baseモジュールに書いてあります。
 
public static final int MAX_PER_PAGE = 10;

コントローラ層

 app/controllers/Application.java
のコントローラ側では
 
List resultList = SiteBeanService.getSiteBeanResultList(0);

のようにSiteBeanServiceを呼びます。
テンプレート側では
@(message: String, description: String, beanList: List[models.beans.SiteBean])

のようにしてリストを渡します。

 
<div class="container">
<div class="row">
 @if(beanList != null && beanList.size() > 0){
     @for(bean <- beanList){
    <div class="col-sm-6 col-md-4">
      <div class="thumbnail">
      <a href="@{bean.url}"><img title="@{bean.title}" src="@{bean.thumbUrl}" alt="@{bean.url}" /></a>
      </div>
    </div>
     }
 }
</div>
</div>

 でSiteBeanの一覧を表示します。
出来上がったのがこんなかんじになっています。


0 件のコメント:

コメントを投稿