ITエンジニアぽむの備忘録

IT系で気になったことを書き留めておく備忘録です。仕事でよく使っているJavaと自宅で使っているLinuxについて書いていこうと思っています。同じお悩みをお持ちの方のお役に立てたら嬉しいです。

Struts2を使ってテーブルのデータを表で表示してみよう!

まえがき

テーブルのデータを画面内に表として表示するプログラムを紹介したいと思います。

下記サイトでテーブルのデータをリストデータとして取得する方法を書いているので、よかったら参考にしてみて下さいね。

pom2019.hatenablog.com

今回扱うJavaフレームワークは「Struts2」です。

Struts2ではモデルとしてリストデータを渡してあげれば、繰り返し処理を使って(s:iterator)、簡単にデータを表示することができます。

モデルとは、MVC(Model View Controller)デザインパターンのモデルのことです。

簡単に言うと、プログラムをModel(データそのものやデータ操作)とView(画面)とController(MとVの橋渡し役もしくは司令塔的な役割)の3つに分けて作成しようという考え方です。

詳しくは、「MVC」でグーグル検索してみて下さいね。

今回で言うと、コントローラがモデルからビューにデータを渡すイメージです。

開発環境

開発環境は下記の通りです。

モデルの作成

今回、画面に受け渡すリストデータが変数名listです。

package com.pom2019.Struts2Web.model;

import java.util.List;

import com.pom2019.Struts2Web.entities.HouseholdAppliances;

public class IndexModel {
    private List<HouseholdAppliances> list;

    //ゲッター、セッター
    public List<HouseholdAppliances> getList() {
        return list;
    }
    public void setList(List<HouseholdAppliances> list) {
        this.list = list;
    }
}

コントローラの作成

  1. どのモデルを使うか宣言
    ModelDrivenをインプリメントすることで、どのモデルを使うのかを宣言しています。ここでは、IndexModelクラスを使うことを宣言しています。(18行目)
  2. モデルの初期化
    フィールドでIndexModelインスタンスを作成しています。(21行目)
  3. モデルにデータの設定
    モデルにリストデータ(hList)を設定しています。(31行目)
package com.pom2019.Struts2Web.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.pom2019.Struts2Web.entities.HouseholdAppliances;
import com.pom2019.Struts2Web.entities.dao.HouseholdAppliancesDao;
import com.pom2019.Struts2Web.model.IndexModel;
import com.pom2019.listener.HibernateListener;

import java.util.List;

import javax.servlet.ServletContext;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.util.ServletContextAware;
import org.hibernate.SessionFactory;

@Namespace("/")
@ParentPackage("struts-default")
public class Index extends ActionSupport implements ServletContextAware, ModelDriven<IndexModel> {
    private static final long serialVersionUID = -1884587001523422505L;
    ServletContext context;
    private IndexModel indexModel = new IndexModel();
    
    @Action(value = "display", results = {
            @Result(name = "success", location = "/WEB-INF/content/displayList.jsp")
    })
    public String execute() {
        SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
        
        HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
        List<HouseholdAppliances> hList = hDao.findAll();
        indexModel.setList(hList);
        
        return ActionSupport.SUCCESS;
    }

    public void setServletContext(ServletContext context) {
        this.context = context;
    }

    @Override
    public IndexModel getModel() {
        return indexModel;
    }
}

ビューの作成

リストデータ(list)をs:iteratorで繰り返し処理を行い、データを表示させています。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>家電リスト</title>
    <style>
    table {
        border-collapse: collapse;
    }
    td {
        border: 1px solid gray;
        padding: 3px 8px;
    }
    </style>
</head>
<body>
<h2>家電リスト</h2>

<table>
    <tr>
        <td>id</td>
        <td>家電名</td>
        <td>購入日時</td>
    </tr>
    <s:iterator value="list">
        <tr>
            <td><s:property value="id"/></td>
            <td><s:property value="householdAppliancesName"/></td>
            <td><s:property value="purchaseDate"/></td>
        </tr>
    </s:iterator> 
</table>

</body>
</html>

実行結果

家電リストが表示されました。

f:id:pom2019:20190901144622p:plain

あとがき

MVCデザインパターンを使えば、作業の分業が行えて、保守性も上がります。

例えば、画面作成とロジック作成を別の人で行う、もしくはEntity/Dao作成とロジック作成を別の人で行うなどです。

最後までお読み頂きありがとうございました。