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」でエラーが出る場合の対処
##ソースコード
###model
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;
}
}
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;
}
}
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;
}
}
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.");
}
}
}
AddCommentLogic
package model;
public class AddCommentLogic {
public void executeAddComment(Board bo) {
AddCommentDAO acdao = new AddCommentDAO(bo);
}
}
###view
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
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);
}
}