こんにちは、ぽむです。
今回は、Struts2フレームワークを使ってO/Rマッパ経由で家電情報テーブルを編集するプログラムをご紹介したいと思います。
はじめに
前回までで、家電情報テーブルにデータを新規保存する方法を見てきました。
今回は、Struts2を使って元あるテーブルのデータを編集する方法について見ていきたいと思います。
開発環境
開発環境は下記の通りです。
Struts2 | 2.5.14.1 |
Hibernate | 4.3.0.Final |
MySQL | 8.0.16 |
ビューの作成
画面 編集モードの場合、編集するidが表示されます。
Javascript 編集モードの場合、フォームデータにidをセットして、更新用のアクションを呼び出しています。
※編集モードは、パラメータisNewにtrueがセットされているかどうかで判断しています。
<%@ 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; } .grayStyle { background: lightgray; } </style> <%-- jQuery --%> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <%-- jQuery UI --%> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <%-- jQuery UI(日本語ライブラリ) --%> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script> </head> <body> <h2>家電情報の登録</h2> <p> <button id="btnBack">戻る</button> <button id="btnSave">保存</button> </p> <table> <tr> <td>id</td> <td id="id" class="grayStyle"> <s:if test='"true".equals(isNew)'> idは自動採番されます。 </s:if> <s:else> <s:property value="id"/> </s:else> </td> <tr> <td>家電名</td> <td><input id="householdAppliancesName" type="text" value="<s:property value='householdAppliancesName'/>"/></td> </tr> <tr> <td>購入日時</td> <td><input id="purchaseDate" type="text" value="<s:property value='purchaseDate'/>" readonly="readonly"/></td> </tr> </table> <%-- 隠しパラメータ --%> <input id="isNew" type="hidden" value="<s:property value='isNew'/>"> <script> $(function() { //日付ピッカーの設定 $('#purchaseDate').datepicker({ dateFormat: 'yy/mm/dd', changeYear: true, changeMonth: true }); //戻るボタン $('#btnBack').on('click', function() { history.back(); }); //保存ボタン $('#btnSave').on('click', function() { //フォームデータの取得 var fd = new FormData(); var url; var isNew = $('#isNew').val(); if (isNew && isNew == "true") { //保存の場合 url = '${pageContext.request.contextPath}/save'; } else { //編集の場合 fd.append("id", $('#id').html()); url = '${pageContext.request.contextPath}/update'; } //フォームデータの追加 fd.append("householdAppliancesName", $('#householdAppliancesName').val()); fd.append("purchaseDate", $('#purchaseDate').val()); //AJAX通信 $.ajax({ url: url, type: 'POST', data: fd, processData: false, contentType: false }) //Ajaxリクエストが成功した時発動 .done( (data) => { location.href = "${pageContext.request.contextPath}/display"; }) //Ajaxリクエストが失敗した時発動 .fail( (data) => { }) //Ajaxリクエストが成功・失敗どちらでも発動 .always( (data) => { }); }); }); </script> </body> </html>
モデルの作成
連携データの作成
編集するためにidを連携しないといけないため、モデルにidを追加しています。
package com.pom2019.Struts2Web.model; import java.util.List; import com.pom2019.Struts2Web.entities.HouseholdAppliances; public class IndexModel { private List<HouseholdAppliances> list; //新規登録フラグ private String isNew; //登録用 private String id; private String householdAppliancesName; private String purchaseDate; //ゲッター、セッター public List<HouseholdAppliances> getList() { return list; } public void setList(List<HouseholdAppliances> list) { this.list = list; } public String getIsNew() { return isNew; } public void setIsNew(String isNew) { this.isNew = isNew; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getHouseholdAppliancesName() { return householdAppliancesName; } public void setHouseholdAppliancesName(String householdAppliancesName) { this.householdAppliancesName = householdAppliancesName; } public String getPurchaseDate() { return purchaseDate; } public void setPurchaseDate(String purchaseDate) { this.purchaseDate = purchaseDate; } }
DAOの作成
今回追加したメソッドは、下記の通りになります。
findById idから家電データを検索します。 編集するデータを特定するために使っています。
update 家電データを更新します。
package com.pom2019.Struts2Web.entities.dao; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.pom2019.Struts2Web.entities.HouseholdAppliances; public class HouseholdAppliancesDao { private SessionFactory sf; public HouseholdAppliancesDao() { super(); } public HouseholdAppliancesDao(SessionFactory sf) { super(); this.sf = sf; } @SuppressWarnings("unchecked") public List<HouseholdAppliances> findAll() { Session ss = sf.openSession(); return ss.createQuery("from HouseholdAppliances").list(); } @SuppressWarnings("unchecked") public List<HouseholdAppliances> findById(String id) { Session ss = sf.openSession(); return ss.createQuery("from HouseholdAppliances " + "where id = " + id).list(); } public boolean save(HouseholdAppliances h) { Session ss = sf.openSession(); Transaction trans = null; try { trans = ss.beginTransaction(); ss.save(h); trans.commit(); } catch (Exception e) { trans.rollback(); return false; } finally { ss.close(); } return true; } public boolean update(HouseholdAppliances h) { Session ss = sf.openSession(); Transaction trans = null; try { trans = ss.beginTransaction(); ss.update(h); trans.commit(); } catch (Exception e) { trans.rollback(); return false; } finally { ss.close(); } return true; } }
コントローラの作成
今回編集もしくは追加したアクションは、下記の通りになります。
dispModify idから家電データを検索し、検索されたデータをモデルにセットしています。
update モデルから家電データを取得し、テーブルを更新しています。
@Action(value = "dispModify", results = { @Result(name = "success", location = "/WEB-INF/content/displayModify.jsp") }) public String dispModify() { String id = indexModel.getId(); //idがパラメータとして存在した場合(編集の場合) if (id != null && !"".equals(id)) { SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME); HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf); List<HouseholdAppliances> hList = hDao.findById(id); if (hList.size() > 0) { //編集する家電情報を取得する HouseholdAppliances h = hList.get(0); indexModel.setHouseholdAppliancesName(h.getHouseholdAppliancesName()); indexModel.setPurchaseDate(new SimpleDateFormat("yyyy/MM/dd").format(h.getPurchaseDate())); } } return ActionSupport.SUCCESS; } @Action(value = "update", results = { @Result(name = "success", location = "/WEB-INF/content/displayModify.jsp") }) public String update() { //パラメータの取得 String id = indexModel.getId(); String householdAppliancesName = indexModel.getHouseholdAppliancesName(); String purchaseDate = indexModel.getPurchaseDate(); //編集用インスタンスの取得 SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME); HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf); HouseholdAppliances h = hDao.findById(id).get(0); //家電名の設定 h.setHouseholdAppliancesName(householdAppliancesName); //購入日時の設定 Date d = new Date(); try { d = new SimpleDateFormat("yyyy/MM/dd").parse(purchaseDate); } catch(ParseException e) {} h.setPurchaseDate(d); //更新処理 hDao.update(h); return ActionSupport.SUCCESS; }
実行結果
idが6のデータを編集します。
編集画面に遷移しました。
データを編集後、保存ボタンをクリックします。
データが編集されました。
おわりに
新規保存の際と変わったことは、DAOで「ss.save(h);」を呼ぶのではなく、「ss.update(h);」を呼んでいる点です。
「ss.update(h);」にセットしているエンティティhは、もちろん存在するエンティティを指定しないとエラーとなってしまいます。
存在するエンティティを取得するために、findByIdメソッドを使っていたのです。
逆に「ss.save(h);」にセットしているエンティティhは、家電情報テーブルに存在しない新規インスタンスをセットしなければエラーとなってしまいます。
最後までお読み頂きありがとうございました。