2014年2月23日日曜日

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

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

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

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

ロジック層

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

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

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

  1. public static PagingList<Site> getSiteCriteria() {  
  2.  return find.where().orderBy().desc("createDate")  
  3.    .findPagingList(ApplicationConfigUtils.MAX_PER_PAGE);  
  4. }  
  5.   
  6. public static List<Site> getSiteResultList(Integer page) {  
  7.  PagingList<Site> pagingList = getSiteCriteria();  
  8.  Page<Site> currentPage = pagingList.getPage(page);  
  9.  return currentPage.getList();  
  10. }  
  11.   
  12. public static Integer getSiteResultCount(Integer page) {  
  13.  PagingList<Site> pagingList = getSiteCriteria();  
  14.  return pagingList.getTotalPageCount();  
  15. }  


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

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

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モジュールに書いてあります。
  1.    
  2. public static final int MAX_PER_PAGE = 10;  

コントローラ層

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

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

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

  1.    
  2. <div class="container">  
  3. <div class="row">  
  4.  @if(beanList != null && beanList.size() > 0){  
  5.      @for(bean <- beanList){  
  6.     <div class="col-sm-6 col-md-4">  
  7.       <div class="thumbnail">  
  8.       <a href="@{bean.url}"><img title="@{bean.title}" src="@{bean.thumbUrl}" alt="@{bean.url}" /></a>  
  9.       </div>  
  10.     </div>  
  11.      }  
  12.  }  
  13. </div>  
  14. </div>  

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


0 件のコメント:

コメントを投稿