--- title: Java + MySQLで簡易掲示板を作る tags: Java MySQL author: parapore slide: false --- ![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 findcomment() { // id,name,commentを格納するリスト List 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 executeFindComment() { FindCommentDAO fcdao = new FindCommentDAO(); List 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" %> 掲示板

名前:

コメント:

ID: 名前: 日付:

``` ###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 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 list = fcl.executeFindComment(); // セッションスコープにコメントリストを保存 HttpSession session = request.getSession(); session.setAttribute("listAttribute", list); RequestDispatcher rd =request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); rd.forward(request, response); } } ```