Javaで簡易な掲示板を作成する方法を現役エンジニアが解説【初心者向け】
初心者向けにJavaで簡易な掲示板を作成する方法について解説しています。ここでは「名前」「メッセージ」を入力し投稿を行う掲示板を構成するコードを紹介します。全体の構造と処理の流れを見てみましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Javaで簡易な掲示板を作成する方法について解説します。実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。
そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

今回は、Javaに関する内容だね!

どういう内容でしょうか?

簡易な掲示板を作成する方法について詳しく説明していくね!

お願いします!
掲示板の設計
名前とメッセージを入力して投稿する簡易的な掲示板を作成します。掲示板の内容はデータベースに保存し、投稿機能でデータ追加、ページアクセスでデータを全件表示します。
作成するものは以下です。
- データベース
- データモデル
- データベースアクセスオブジェクト(DAO)
- 投稿したメッセージの一覧表示と、投稿フォームをもつ画面
- データベースからデータを全件取得し、取得データを画面へ引き渡すサーブレット
- 画面の入力フォームの内容を元に、データベースに一件データを追加するサーブレット
eclipse Maven MySQL を用いて実装します。またローカルのtomcatへデプロイをして動作確認を行います。
実際に作成してみよう
eclipseで動的WEBプロジェクトを新規作成してからMavenプロジェクトへ変換します。pom.xmlに以下3つの依存関係を追加します。
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
データベースとテーブルを作成します。
create database sample default character set utf8; create table board (id int(11) auto_increment NOT NULL PRIMARY KEY, name VARCHAR(10) NOT NULL, content TEXT );
テーブルにメッセージ登録者の名前と、メッセージ内容、メッセージを識別するためのidを持たせます。idフィールドは自動採番とします。
データモデルをテーブルの定義に対応した構造で作成します。
package sample_board;
public class Board {
int id;
String name;
String content;
/**
* @return id
*/
public int getId() {
return id;
}
/**
* @param id セットする id
*/
public void setId(int id) {
this.id = id;
}
/**
* @return name
*/
public String getName() {
return name;
}
/**
* @param name セットする name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return content
*/
public String getContent() {
return content;
}
/**
* @param content セットする content
*/
public void setContent(String content) {
this.content = content;
}
}
DAOを作成します。全件取得のメソッドと一件追加のメソッドを用意します。
package sample_board;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BoardDAO {
// データベース接続と結果取得のための変数
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
//全件取得用メソッド
public List<Board> selectAllBoard() {
// メソッドの結果として返すリスト
List<Board> results = new ArrayList<Board>();
try {
//ドライバを読み込み、DBに接続
this.getConnection();
// Statementオブジェクトの作成
pstmt = con.prepareStatement("select * from board");
//Select文実行
rs = pstmt.executeQuery();
// 6. 結果を表示する
while (rs.next()) {
// 1件ずつCountryオブジェクトを生成して結果を詰める
Board Board = new Board();
Board.setId(rs.getInt("id"));
Board.setName(rs.getString("name"));
Board.setContent(rs.getString("content"));
// リストに追加
results.add(Board);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
this.close();
}
return results;
}
//1件登録用メソッド
public void insertBoard(Board board) {
try {
//ドライバを読み込み、DBに接続
this.getConnection();
// Statementオブジェクトの作成
pstmt = con.prepareStatement("insert into board(name,content) values(?,?)");
pstmt.setString(1, board.getName());
pstmt.setString(2, board.getContent());
//Select文実行
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
this.close();
}
}
public void getConnection() throws SQLException, ClassNotFoundException {
//ドライバクラス読込
Class.forName("com.mysql.jdbc.Driver");
// DBと接続
con = DriverManager.getConnection("jdbc:mysql://localhost/sample?useSSL=false&characterEncoding=utf8", "ユーザ", "パスワード");
// ※ユーザとパスワードはMySQLに設定済みのものを記載してください。
}
private void close() {
// 接続を閉じる
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
画面のjspは以下のようにします。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>board</title>
</head>
<body>
<h2>○○掲示板</h2>
<table border="1">
<tbody>
<tr>
<th>id</th>
<th>名前</th>
<th>メッセージ</th>
</tr>
<c:forEach var="message" items="${list}" varStatus="status">
<tr>
<td><c:out value="${message.id}" /></td>
<td><c:out value="${message.name}" /></td>
<td><textarea><c:out value="${message.content}" /></textarea></td>
</tr>
</c:forEach>
</tbody>
</table>
<br /><br />
<form method="POST" action="<c:url value='/insert' />">
<label for="name">名前</label><br />
<input type="text" name="name"/>
<br /><br />
<label for="content">メッセージ</label><br />
<textarea name="content"></textarea>
<br /><br />
<button type="submit">投稿</button>
</form>
</body>
</html>
<c:forEach>タグを使って、取得データをテーブルに一覧表示します。入力フォームのactionで後で記載するinsertサーブレットを起動するようにします。
insertサーブレットは下記のようにします。
package sample_board;
import java.io.IOException;
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 SelectServlet
*/
@WebServlet("/insert")
public class InsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InsertServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
Board b = new Board();
b.setName(request.getParameter("name"));
b.setContent(request.getParameter("content"));
BoardDAO boardDAO = new BoardDAO();
//1件追加
boardDAO.insertBoard(b);
//追加後トップページへリダイレクト
response.sendRedirect(request.getContextPath() + "/toppage");
}
}
最後にトップページを表示するサーブレットです。
package sample_board;
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;
/**
* Servlet implementation class SelectServlet
*/
@WebServlet("/toppage")
public class SelectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SelectServlet() {
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");
BoardDAO boardDAO = new BoardDAO();
//全件取得
List<Board> list = boardDAO.selectAllBoard();
request.setAttribute("list", list);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/board.jsp");
rd.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
サーバへデプロイし
http://localhost:8080/sample_board/toppage
へアクセスし、掲示板の表示と登録機能を確認しましょう。
本サンプルは簡易的なものですので、こちらを元に投稿内容を充実させたり、バリデーションをかけたり、画面装飾をつけたりとアレンジをしてみてください。
監修してくれたメンター
| 長屋雅美
独立系SIerで7年勤務後、現在はフリーのエンジニアとして自宅をオフィスとして活動しています。 |

内容分かりやすくて良かったです!

ゆかりちゃんも分からないことがあったら質問してね!

分かりました。ありがとうございます!
TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。