Java + MySQLで簡易掲示板を作る

![board.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566570/44aafca8-4c47-98a7-814f-4ba20f3e45ef.png)

mysqlを使った簡易的な掲示板を作りました。

##概要
・ID、名前、コメント、タイムスタンプを掲示板に表示する。
・名前かコメントが未入力だとエラーメッセージがポップアップする。

##苦労したところ
・DBに格納したデータを取り出す方法がわからなかった。
最初は配列で別々にID、名前、コメント、タイムスタンプを取り出そうとしたが上手くできなかった。
ArrayListならインスタンスまるごと格納できる！

・ArrayListの中身をjspで取り出す方法がわからなかった。
EL式で取り出そうとしたが上手くできなかった。
JSTLのcoreタグライブラリで`forEach`を使って取り出すことができた。

・mysql接続時にtime zoneエラーが出る。
下記を参考に接続URLを変更。日本時間にしたい場合は末尾をJSTに変更する。
[Grails 3 + MySQLでrun-app時に「The server time zone value」でエラーが出る場合の対処](https://qiita.com/KKZ@github/items/e3f594b04c9233a86419)

##ソースコード
###model
```java:Board.java
package model;

import java.io.Serializable;
import java.sql.Timestamp;

public class Board implements Serializable {
	private int id;
	private String name;
	private String comment;
	private Timestamp time;


	public Timestamp getTime() {
		return time;
	}
	public void setTime(Timestamp time) {
		this.time = time;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}

}

```
```java:FindCommentDAO.java
package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class FindCommentDAO {

	public List<Board> findcomment() {

		// id,name,commentを格納するリスト
		List<Board> list = new ArrayList<>();

		final String jdbcId = "id";
		final String jdbcPass = "password";
		final String jdbcUrl = "jdbc:mysql://localhost:3306/dbname?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=JST";

		Connection con = null;

		try {

			con = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPass);

			System.out.println("Connected....");

			try {
				Statement st = con.createStatement();
				String sql = "select * from board";

				try {
					// sqlを送信
					ResultSet rs = st.executeQuery(sql);

					while (rs.next()) {
						// DBから取り出したid,name,commentをJavaBeansにset
						Board bo = new Board();
						bo.setId(rs.getInt("id"));
						bo.setName(rs.getString("name"));
						bo.setComment(rs.getString("comment"));
						bo.setTime(rs.getTimestamp("time"));

						// リストに1個ずつ格納。末尾に要素が追加されていく。
						list.add(bo);
					}

					rs.close();
					st.close();

				} catch (SQLException e) {
					e.printStackTrace();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				// データベース接続の切断
				if (con != null) {
					try {
						con.close();

					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("Connection Failed.");
			return null;
		}
		return list;

	}

}

```
```java:FindCommentLogic.java
package model;

import java.util.List;

public class FindCommentLogic {
	public List<Board> executeFindComment() {
		FindCommentDAO fcdao = new FindCommentDAO();
		List<Board> list = fcdao.findcomment();
		return list;
	}

}
```
```java:AddCommentDAO.java
package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class AddCommentDAO {

	// DBにid,name,commentを加えるメソッド
	public AddCommentDAO(Board bo) {

		if(bo.getName().isEmpty()) {
			bo.setName( "名無し");
		}
		if(bo.getComment().isEmpty()) {
			bo.setComment( "コメント無し");
		}


		final String jdbcId = "id";
		final String jdbcPass = "password";
		final String jdbcUrl = "jdbc:mysql://localhost:3306/dbname?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=JST";

		Connection con = null;

		try {

			con = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPass);

			System.out.println("Connected....");

			try {

				PreparedStatement ps = con.prepareStatement("INSERT INTO board (name, comment) VALUES (?, ?)");

				ps.setString(1, bo.getName());
				ps.setString(2, bo.getComment());

				// ひな形を送信
				int r = ps.executeUpdate();

				if (r != 0) {
					System.out.println(r + "件の書き込みを追加しました。");
				} else {
					System.out.println("書き込みできませんでした。");
				}

				ps.close();

			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				// データベース接続の切断
				if (con != null) {
					try {
						con.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		} catch (SQLException e) {

			e.printStackTrace();
			System.out.println("Connection Failed.");

		}

	}

}
```
```java:AddCommentLogic
package model;

public class AddCommentLogic {
	public void executeAddComment(Board bo) {
		AddCommentDAO acdao = new AddCommentDAO(bo);
	}
}
```
###view
```html:main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">


<script type="text/javascript">

function check(){
	var flag = 0;

	if(document.form1.name.value == ""){
		flag = 1;
	}
	else if(document.form1.comment.value == ""){
		flag = 1;
	}

	if(flag){
		window.alert('名前とコメントを入力してください'); 
		return false; // 送信を中止
	}
	else{
		return true; // 送信を実行
	}
}
</script>

<title>掲示板</title>
</head>
<body>
<form action="/board/BoardServlet" method="post" name="form1" onSubmit="return check()">
<p>名前:<input type="text" name="name"></p>
<p>コメント:<br>
<textarea name="comment" rows="5" cols="40"></textarea>
</p>
<p><input type="submit" value="送信"><input type="reset" value="リセット">
</p>
</form>

<c:forEach var="list" items="${listAttribute}">
<p>ID:<c:out value="${list.id}"/>　名前:<c:out value="${list.name}"/>　日付:<c:out value="${list.time}"/><br>
<c:out value="${list.comment}"/></p>
</c:forEach>

</body>
</html>
```
###controller
```java:BoardServlet.java
package servlet;

import java.io.IOException;
import java.util.List;

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 javax.servlet.http.HttpSession;

import model.AddCommentLogic;
import model.Board;
import model.FindCommentLogic;

/**
 * Servlet implementation class BoardServlet
 */
@WebServlet("/BoardServlet")
public class BoardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public BoardServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		//リスナークラスに移動したい
		request.setCharacterEncoding("UTF-8");

		// 既存のコメントを確認
		FindCommentLogic fcl = new FindCommentLogic();
		List<Board> list = fcl.executeFindComment();

		// セッションスコープにコメントリストを保存
		HttpSession session = request.getSession();
		session.setAttribute("listAttribute", list);

		RequestDispatcher rd =request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");

		// 入力された値を取得
		String name = request.getParameter("name");
		String comment = request.getParameter("comment");

		//JavaBeansに格納
		Board bo = new Board();
		bo.setName(name);
		bo.setComment(comment);

		// mysqlに格納
		AddCommentLogic acl = new AddCommentLogic();
		acl.executeAddComment(bo);

		// 今入力されたコメントと既存のコメントをmysqlから取得
		FindCommentLogic fcl = new FindCommentLogic();
		List<Board> list = fcl.executeFindComment();

		// セッションスコープにコメントリストを保存
		HttpSession session = request.getSession();
		session.setAttribute("listAttribute", list);

		RequestDispatcher rd =request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
		rd.forward(request, response);

	}

}
```