学習27日目:一応、カリキュラム終わった。
2020
6 Aug
Thu, 6 Aug 2020 21:21:28
Sun, 4 Apr 2021 13:07:13
@Contents
今日の学習時間。
Day:27 Today:10h Total:177h
学習内容について。
日報情報の管理機能を作成。
Reportモデルを作成。
カラム名 用途 データ型 id
リソース内での連番 数値型 employee_id
日報を登録した社員の社員番号 文字列型 report_date
いつの日報かを示す日付 日付型 title
日報のタイトル 文字列型 content
日報の内容 テキスト型 created_at
登録日時 日時型 updated_at
更新日時 日時型
Report
に設定するプロパティ
src
/ models
package models;
import java.sql.Date;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Table(name = "reports")
@NamedQueries({
@NamedQuery(
name = "getAllReports",
query = "SELECT r FROM Report AS r ORDER BY r.id DESC"
),
@NamedQuery(
name = "getReportsCount",
query = "SELECT COUNT(r) FROM Report AS r"
),
})
@Entity
public class Report {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "employee_id", nullable = false)
private Employee employee;
@Column(name = "report_date", nullable = false)
private Date report_date;
@Column(name = "title", length = 255, nullable = false)
private String title;
@Lob
@Column(name = "content", nullable = false)
private String content;
@Column(name = "created_at", nullable = false)
private Timestamp created_at;
@Column(name = "updated_at", nullable = false)
private Timestamp updated_at;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public Date getReport_date() {
return report_date;
}
public void setReport_date(Date report_date) {
this.report_date = report_date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Timestamp getCreated_at() {
return created_at;
}
public void setCreated_at(Timestamp created_at) {
this.created_at = created_at;
}
public Timestamp getUpdated_at() {
return updated_at;
}
public void setUpdated_at(Timestamp updated_at) {
this.updated_at = updated_at;
}
}
java.sql.Date
java.sql.Timestamp
@Lob
アノテーションテキストエリアの指定を行う改行もデータベースに保存される(何もしなければテキストボックスの扱いと同じ)
1対多と多対多
ひとりの従業員は毎日日報を作成するので複数の日報を持っているしかし、1枚の日報から見たら作成者はたった1人 1対多の関係 互いに複数のデータを持つことが考えられる場合
外部キー(外部キー制約)テーブルBに、テーブルAのidを保持するカラムを追加 1対多で用いられることが多い
中間テーブル例:テーブルAとテーブルBがある テーブルAのidとテーブルBのidのみを持つ新しいテーブルを作成 多対多で用いられることが多い
バリデーションを作成。
src
/ models
/ validators
package models.validators;
import java.util.ArrayList;
import java.util.List;
import models.Report;
public class ReportValidator {
public static List<String> validate(Report r) {
List<String> errors = new ArrayList<String>();
String title_error = _validateTitle(r.getTitle());
if (!title_error.equals("")) {
errors.add(title_error);
}
String content_error = _validateContent(r.getContent());
if (!content_error.equals("")) {
errors.add(content_error);
}
return errors;
}
private static String _validateTitle(String title) {
if (title == null || title.equals("")) {
return "タイトルを入力してください。";
}
return "";
}
private static String _validateContent(String content) {
if (content == null || content.equals("")) {
return "内容を入力してください。";
}
return "";
}
}
Tomcatを再起動してログインページからログインしてトップページにアクセス。それだけでMySQLにreports
テーブルが作成されている(下記)。
mysql> use daily_report_system;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SELECT * FROM reports;
Empty set (0.00 sec)
ここまでをGitにコミット
$ git add .
$ git commit -m "Add Report class"
[master 276bf7e] Add Report class
3 files changed, 146 insertions(+)
create mode 100644 src/models/Report.java
create mode 100644 src/models/validators/ReportValidator.java
Reportのindexを作成。
アクション サーブレット名 URLマッピング HTTPメソッド index
ReportsIndexServlet
/reports/index
GET new
ReportsNewServlet
/reports/new
GET create
ReportsCreateServlet
/reports/create
POST show
ReportsShowServlet
/reports/show
GET edit
ReportsEditServlet
/reports/edit
GET update
ReportsUpdateServlet
/reports/update
POST
Report
の情報を管理するアクション
勝手に日報を削除されると困るからReport
に関してdestroy
は作成しない。
src
/ controllers
/ reports
package controllers.reports;
import java.io.IOException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Report;
import utils.DBUtil;
/**
* Servlet implementation class ReportsIndexServlet
*/
@WebServlet("/reports/index")
public class ReportsIndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReportsIndexServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EntityManager em = DBUtil.createEntityManager();
int page;
try {
page = Integer.parseInt(request.getParameter("page"));
} catch (Exception e) {
page = 1;
}
List<Report> reports = em.createNamedQuery("getAllReports", Report.class)
.setFirstResult(15 * (page - 1))
.setMaxResults(15)
.getResultList();
long reports_count = (long) em.createNamedQuery("getReportsCount", Long.class)
.getSingleResult();
em.close();
request.setAttribute("reports", reports);
request.setAttribute("reports_count", reports_count);
request.setAttribute("page", page);
if (request.getSession().getAttribute("flush") != null) {
request.setAttribute("flush", request.getSession().getAttribute("flush"));
request.getSession().removeAttribute("flush");
}
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/index.jsp");
rd.forward(request, response);
}
}
WebContent
/ WEB-INF
/ views
/ reports
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:import url="/WEB-INF/views/layout/app.jsp">
<c:param name="content">
<c:if test="${flush != null}">
<div id="flush_success">
<c:out value="${flush}"></c:out>
</div>
</c:if>
<h2>日報 一覧</h2>
<table id="report_list">
<tbody>
<tr>
<th class="report_name">氏名</th>
<th class="report_date">日付</th>
<th class="report_title">タイトル</th>
<th class="report_action">操作</th>
</tr>
<c:forEach var="report" items="${reports}" varStatus="status">
<tr class="row${status.count % 2}">
<td class="report_name"><c:out value="${report.employee.name}" /></td>
<td class="report_date"><fmt:formatDate value='${report.report_date}' pattern='yyyy-MM-dd' /></td>
<td class="report_title">${report.title}</td>
<td class="report_action"><a href="<c:url value='/reports/show?id=${report.id}' />">詳細を見る</a></td>
</tr>
</c:forEach>
</tbody>
</table>
<div id="pagination">
(全 ${reports_count} 件)<br />
<c:forEach var="i" begin="1" end="${((reports_count - 1) / 15) + 1}" step="1">
<c:choose>
<c:when test="${i == page}">
<c:out value="${i}" />
</c:when>
<c:otherwise>
<a href="<c:url value='/reports/index?page=${i}' />"><c:out value="${i}" /></a>
</c:otherwise>
</c:choose>
</c:forEach>
</div>
<p><a href="<c:url value='/reports/new' />">新規日報の登録</a></p>
</c:param>
</c:import>
style.css
に追加
table#report_list th {
font-weight: bold;
padding: 10px 2%;
}
table#report_list .report_name {
width: 20%;
padding: 10px 2%;
}
table#report_list .report_date {
width: 20%;
}
table#report_list .report_title {
width: 37%;
}
table#report_list .report_action {
width: 13%;
}
ここまでをgitにコミット
$ git add .
$ git commit -m "Add Report index"
[master 2ae6246] Add Report index
4 files changed, 136 insertions(+), 1 deletion(-)
create mode 100644 WebContent/WEB-INF/views/reports/index.jsp
create mode 100644 src/controllers/reports/ReportsIndexServlet.java
Reportのnewを作成。
src
/ controllers
/ reports
package controllers.reports;
import java.io.IOException;
import java.sql.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Report;
/**
* Servlet implementation class ReportsNewServlet
*/
@WebServlet("/reports/new")
public class ReportsNewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReportsNewServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("_token", request.getSession().getId());
Report r = new Report();
r.setReport_date(new Date(System.currentTimeMillis()));
request.setAttribute("report", r);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/new.jsp");
rd.forward(request, response);
}
}
37-39行目事前に本日の日付を取得して格納 今日の日報を新規で登録する際、すでに今日の日付が入力欄に入っていた方が利用者にとって便利
WebContent
/ WEB-INF
/ views
/ reports
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:if test="${errors != null}">
<div id="flush_error">
入力内容にエラーがあります。<br />
<c:forEach var="error" items="${errors}">
・<c:out value="${error}" /><br />
</c:forEach>
</div>
</c:if>
<label for="report_date">日付</label><br />
<input type="date" name="report_date" value="<fmt:formatDate value='${report.report_date}' pattern='yyyy-MM-dd' />" />
<br /><br />
<label for="name">氏名</label><br />
<c:out value="${sessionScope.login_employee.name}" />
<br /><br />
<label for="title">タイトル</label><br />
<input type="text" name="title" value="${report.title}" />
<br /><br />
<label for="content">内容</label><br />
<textarea name="content" rows="10" cols="50">${report.content}</textarea>
<br /><br />
<input type="hidden" name="_token" value="${_token}" />
<button type="submit">投稿</button>
WebContent
/ WEB-INF
/ views
/ reports
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:import url="/WEB-INF/views/layout/app.jsp">
<c:param name="content">
<h2>日報 新規登録ページ</h2>
<form method="POST" action="<c:url value='/reports/create' />">
<c:import url="_form.jsp" />
</form>
<p><a href="<c:url value='/reports/index' />">一覧に戻る</a></p>
</c:param>
</c:import>
ここまでをGitにコミット
$ git add .
$ git commit -m "Add Report new"
[master e4b86af] Add Report new
3 files changed, 88 insertions(+)
create mode 100644 WebContent/WEB-INF/views/reports/_form.jsp
create mode 100644 WebContent/WEB-INF/views/reports/new.jsp
create mode 100644 src/controllers/reports/ReportsNewServlet.java
Reportのcreateを作成。
src
/ controllers
/ reports
package controllers.reports;
import java.io.IOException;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Employee;
import models.Report;
import models.validators.ReportValidator;
import utils.DBUtil;
/**
* Servlet implementation class ReportsCreateServlet
*/
@WebServlet("/reports/create")
public class ReportsCreateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReportsCreateServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String _token = (String)request.getParameter("_token");
if(_token != null && _token.equals(request.getSession().getId())) {
EntityManager em = DBUtil.createEntityManager();
Report r = new Report();
r.setEmployee((Employee)request.getSession().getAttribute("login_employee"));
Date report_date = new Date(System.currentTimeMillis());
String rd_str = request.getParameter("report_date");
if(rd_str != null && !rd_str.equals("")) {
report_date = Date.valueOf(request.getParameter("report_date"));
}
r.setReport_date(report_date);
r.setTitle(request.getParameter("title"));
r.setContent(request.getParameter("content"));
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
r.setCreated_at(currentTime);
r.setUpdated_at(currentTime);
List<String> errors = ReportValidator.validate(r);
if(errors.size() > 0) {
em.close();
request.setAttribute("_token", request.getSession().getId());
request.setAttribute("report", r);
request.setAttribute("errors", errors);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/new.jsp");
rd.forward(request, response);
} else {
em.getTransaction().begin();
em.persist(r);
em.getTransaction().commit();
em.close();
request.getSession().setAttribute("flush", "登録が完了しました。");
response.sendRedirect(request.getContextPath() + "/reports/index");
}
}
}
}
50行目日付欄をわざと未入力にした場合、当日の日付を入れる処理 バリデーションで入力値チェックをする形でもOK 51行目Stringで受け取った日付をDate
型へ変換する処理
ここまでをGitにコミット
$ git add .
$ git commit -m "Add Report create"
[master b49f3be] Add Report create
1 file changed, 84 insertions(+)
create mode 100644 src/controllers/reports/ReportsCreateServlet.java
Reportのshowを作成。
src
/ controllers
/ reports
package controllers.reports;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Report;
import utils.DBUtil;
/**
* Servlet implementation class ReportsShowServlet
*/
@WebServlet("/reports/show")
public class ReportsShowServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReportsShowServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EntityManager em = DBUtil.createEntityManager();
Report r = em.find(Report.class, Integer.parseInt(request.getParameter("id")));
em.close();
request.setAttribute("report", r);
request.setAttribute("_token", request.getSession().getId());
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/show.jsp");
rd.forward(request, response);
}
}
WebContent
/ WEB-INF
/ views
/ reports
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<c:import url="/WEB-INF/views/layout/app.jsp">
<c:param name="content">
<c:choose>
<c:when test="${report != null}">
<h2>日報 詳細ページ</h2>
<table>
<tbody>
<tr>
<th>氏名</th>
<td><c:out value="${report.employee.name}" /></td>
</tr>
<tr>
<th>日付</th>
<td><fmt:formatDate value="${report.report_date}"
pattern="yyyy-MM-dd" /></td>
</tr>
<tr>
<th>内容</th>
<td><pre>
<c:out value="${report.content}" />
</pre></td>
</tr>
<tr>
<th>登録日時</th>
<td><fmt:formatDate value="${report.created_at}"
pattern="yyyy-MM-dd HH:mm:ss" /></td>
</tr>
<tr>
<th>更新日時</th>
<td><fmt:formatDate value="${report.updated_at}"
pattern="yyyy-MM-dd HH:mm:ss" /></td>
</tr>
</tbody>
</table>
<c:if test="${sessionScope.login_employee.id == report.employee.id}">
<p>
<a href="<c:url value="/reports/edit?id=${report.id}" />">この日報を編集する</a>
</p>
</c:if>
</c:when>
<c:otherwise>
<h2>お探しのデータは見つかりませんでした。</h2>
</c:otherwise>
</c:choose>
<p>
<a href="<c:url value="/reports/index" />">一覧に戻る</a>
</p>
</c:param>
</c:import>
41行目日報の作成者以外の人が該当の日報を編集できない処理 違う人の日報の場合はedit
へのリンクを出さない 改行には<br />
か<pre>
を使う<pre>
を使うと中の文字列の表示が小さい文字になるのでCSSで装飾の調整を行う(下記)
style.css
に追加
pre {
font-family: "Hiragino Kaku Gothic Pro",Meiryo,"MS PGothic",Helvetica,Arial,sans-serif;
}
ここまでをGitに登録
$ git add .
$ git commit -m "Add Report show"
[master d14dfdc] Add Report show
3 files changed, 109 insertions(+)
create mode 100644 WebContent/WEB-INF/views/reports/show.jsp
create mode 100644 src/controllers/reports/ReportsShowServlet.java
Reportのeditを作成。
src
/ controllers
/ reports
package controllers.reports;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Employee;
import models.Report;
import utils.DBUtil;
/**
* Servlet implementation class ReportsEditServlet
*/
@WebServlet("/reports/edit")
public class ReportsEditServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReportsEditServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EntityManager em = DBUtil.createEntityManager();
Report r = em.find(Report.class, Integer.parseInt(request.getParameter("id")));
em.close();
Employee login_employee = (Employee) request.getSession().getAttribute("login_employee");
if (r != null && login_employee.getId() == r.getEmployee().getId()) {
request.setAttribute("report", r);
request.setAttribute("_token", request.getSession().getId());
request.getSession().setAttribute("report_id", r.getId());
}
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/edit.jsp");
rd.forward(request, response);
}
}
WebContent
/ WEB-INF
/ views
/ reports
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:import url="/WEB-INF/views/layout/app.jsp">
<c:param name="content">
<c:choose>
<c:when test="${report != null}">
<h2>日報 編集ページ</h2>
<form method="POST" action="<c:url value='/reports/update' />">
<c:import url="_form.jsp" />
</form>
</c:when>
<c:otherwise>
<h2>お探しのデータは見つかりませんでした。</h2>
</c:otherwise>
</c:choose>
<p>
<a href="<c:url value='/reports/index' />">一覧に戻る</a>
</p>
</c:param>
</c:import>
ここまでをGitにコミット
$ git add .
$ git commit -m "Add Report edit"
[master eedf2fa] Add Report edit
2 files changed, 76 insertions(+)
create mode 100644 WebContent/WEB-INF/views/reports/edit.jsp
create mode 100644 src/controllers/reports/ReportsEditServlet.java
Reportのupdateを作成。
src
/ controllers
/ reports
package controllers.reports;
import java.io.IOException;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Report;
import models.validators.ReportValidator;
import utils.DBUtil;
/**
* Servlet implementation class ReportsUpdateServlet
*/
@WebServlet("/reports/update")
public class ReportsUpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReportsUpdateServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String _token = (String) request.getParameter("_token");
if (_token != null && _token.equals(request.getSession().getId())) {
EntityManager em = DBUtil.createEntityManager();
Report r = em.find(Report.class, (Integer) (request.getSession().getAttribute("report_id")));
r.setReport_date(Date.valueOf(request.getParameter("report_date")));
r.setTitle(request.getParameter("title"));
r.setContent(request.getParameter("content"));
r.setUpdated_at(new Timestamp(System.currentTimeMillis()));
List<String> errors = ReportValidator.validate(r);
if (errors.size() > 0) {
em.close();
request.setAttribute("_token", request.getSession().getId());
request.setAttribute("report", r);
request.setAttribute("errors", errors);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/edit.jsp");
rd.forward(request, response);
} else {
em.getTransaction().begin();
em.getTransaction().commit();
em.close();
request.getSession().setAttribute("flush", "更新が完了しました。");
request.getSession().removeAttribute("report_id");
response.sendRedirect(request.getContextPath() + "/reports/index");
}
}
}
}
ここまでをGitにコミット
$ git add .
$ git commit -m "Add Report update"
[master 67b783a] Add Report update
1 file changed, 74 insertions(+)
create mode 100644 src/controllers/reports/ReportsUpdateServlet.java
トップページに自分の日報一覧を表示。
src
/ models
package models;
import java.sql.Date;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Table(name = "reports")
@NamedQueries({
@NamedQuery(name = "getAllReports", query = "SELECT r FROM Report AS r ORDER BY r.id DESC"),
@NamedQuery(name = "getReportsCount", query = "SELECT COUNT(r) FROM Report AS r"),
@NamedQuery(name = "getMyAllReports", query = "SELECT r FROM Report AS r WHERE r.employee = :employee ORDER BY r.id DESC"),
@NamedQuery(name = "getMyReportsCount", query = "SELECT COUNT(r) FROM Report AS r WHERE r.employee = :employee")
})
@Entity
public class Report {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "employee_id", nullable = false)
private Employee employee;
@Column(name = "report_date", nullable = false)
private Date report_date;
@Column(name = "title", length = 255, nullable = false)
private String title;
@Lob
@Column(name = "content", nullable = false)
private String content;
@Column(name = "created_at", nullable = false)
private Timestamp created_at;
@Column(name = "updated_at", nullable = false)
private Timestamp updated_at;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public Date getReport_date() {
return report_date;
}
public void setReport_date(Date report_date) {
this.report_date = report_date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Timestamp getCreated_at() {
return created_at;
}
public void setCreated_at(Timestamp created_at) {
this.created_at = created_at;
}
public Timestamp getUpdated_at() {
return updated_at;
}
public void setUpdated_at(Timestamp updated_at) {
this.updated_at = updated_at;
}
}
@NamedQuery
を2つ追加(上記)getMyAllReports
getMyReportsCount
src
/ controllers
/ toppage
package controllers.toppage;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TopPageIndexServlet
*/
@WebServlet("/index.html")
public class TopPageIndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TopPageIndexServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (request.getSession().getAttribute("flush") != null) {
request.setAttribute("flush", request.getSession().getAttribute("flush"));
request.getSession().removeAttribute("flush");
}
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/topPage/index.jsp");
rd.forward(request, response);
}
}
package controllers.toppage;
import java.io.IOException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Employee;
import models.Report;
import utils.DBUtil;
/**
* Servlet implementation class TopPageIndexServlet
*/
@WebServlet("/index.html")
public class TopPageIndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TopPageIndexServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EntityManager em = DBUtil.createEntityManager();
Employee login_employee = (Employee) request.getSession().getAttribute("login_employee");
int page;
try {
page = Integer.parseInt(request.getParameter("page"));
} catch (Exception e) {
page = 1;
}
List<Report> reports = em.createNamedQuery("getMyAllReports", Report.class)
.setParameter("employee", login_employee)
.setFirstResult(15 * (page - 1))
.setMaxResults(15)
.getResultList();
long reports_count = (long) em.createNamedQuery("getMyReportsCount", Long.class)
.setParameter("employee", login_employee)
.getSingleResult();
em.close();
request.setAttribute("reports", reports);
request.setAttribute("reports_count", reports_count);
request.setAttribute("page", page);
if (request.getSession().getAttribute("flush") != null) {
request.setAttribute("flush", request.getSession().getAttribute("flush"));
request.getSession().removeAttribute("flush");
}
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/topPage/index.jsp");
rd.forward(request, response);
}
}
WebContent
/ WEB-INF
/ views
/ topPage
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:import url="../layout/app.jsp">
<c:param name="content">
<c:if test="${flush != null}">
<div id="flush_success">
<c:out value="${flush}"></c:out>
</div>
</c:if>
<h2>日報管理システムへようこそ</h2>
</c:param>
</c:import>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<c:import url="../layout/app.jsp">
<c:param name="content">
<c:if test="${flush != null}">
<div id="flush_success">
<c:out value="${flush}"></c:out>
</div>
</c:if>
<h2>日報管理システムへようこそ</h2>
<h3>【自分の日報 一覧】</h3>
<table id="report_list">
<tbody>
<tr>
<th class="report_name">氏名</th>
<th class="report_date">日付</th>
<th class="report_title">タイトル</th>
<th class="report_action">操作</th>
</tr>
<c:forEach var="report" items="${reports}" varStatus="status">
<tr class="row${status.count % 2}">
<td class="report_name"><c:out
value="${report.employee.name}" /></td>
<td class="report_date"><fmt:formatDate
value='${report.report_date}' pattern='yyyy-MM-dd' /></td>
<td class="report_title">${report.title}</td>
<td class="report_action"><a
href="<c:url value='/reports/show?id=${report.id}' />">詳細を見る</a></td>
</tr>
</c:forEach>
</tbody>
</table>
<div id="pagination">
(全 ${reports_count} 件)<br />
<c:forEach var="i" begin="1" end="${((reports_count - 1) / 15) + 1}"
step="1">
<c:choose>
<c:when test="${i == page}">
<c:out value="${i}" />
</c:when>
<c:otherwise>
<a href="<c:url value='/?page=${i}' />"><c:out value="${i}" /></a>
</c:otherwise>
</c:choose>
</c:forEach>
</div>
<p>
<a href="<c:url value='/reports/new' />">新規日報の登録</a>
</p>
</c:param>
</c:import>
style.css
に追加
h3 {
font-size: larger;
}
ここまでをGitにコミット
$ git add .
$ git commit -m "Modify top page"
[master 9d35e3a] Modify top page
4 files changed, 82 insertions(+), 2 deletions(-)
GitHubにプッシュ
$ git remote add origin https://github.com/kikikeiten/daily_report_system.git
$ git push -u origin master
Enumerating objects: 234, done.
Counting objects: 100% (234/234), done.
Delta compression using up to 8 threads
Compressing objects: 100% (204/204), done.
Writing objects: 100% (234/234), 32.52 KiB | 1.91 MiB/s, done.
Total 234 (delta 92), reused 0 (delta 0)
remote: Resolving deltas: 100% (92/92), done.
To https://github.com/kikikeiten/daily_report_system.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
一応完成。あとは下記の機能を実装する予定(ちょっと難しそう?)。
実装予定
社員同士のフォロー機能・フォローした社員の日報を一覧表示する機能 課長や部長などの権限追加・および部下の日報を承認する機能 日報にリアクション(いいね)する機能 顧客管理の機能・日報の内容に「商談状況」を追加する 出勤と退勤時間を日報の項目として追加
今日の反省と明日の目標。
今日でとりあえずカリキュラムは終わりました。目標の1ヶ月以内に終われてよかったです。サーブレットでアプリを作ってはみたけど、あんまり関数とか使ってないので、今後取り入れていきたいと思います。
さて、ポートフォリオを作るにあたってJavaだけではダメなので他の言語も学んでいく予定です。大まかな理解にはProgateというサービスが良さそうなのでいくつかピックアップしてやってみます。具体的にはHTML&CSS、JavaScript、jQuery、Sass、Reactです。それをしながら、ポートフォリオの構成を固めていきます。