0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Spring MVC] 基礎から非同期処理まで、Web掲示板実装のロードマップ

0
Posted at

1.Spring MVCパターンに基づいた掲示板(Board)プログラムの全体のデータフローとアーキテクチャ図(構造図)です。

image.png

主要機能別のフロー解説

代表的な機能のフローを追いかけると、全体の構造が理解しやすくなります。

① 記事一覧の表示 (list.do)
1.ユーザーが list.jsp 画面にアクセスするか、リクエストを送ります。

2.Controller の list(request, response) メソッドが呼び出されます。(GET方式)

3.Controller は DAO の select(): List を呼び出します。

4.DAO は DB で select * from board order by board_id desc クエリを実行し、記事一覧を取得します。

5.取得した一覧(List)を Controller が受け取り、list.jsp に渡すことで、画面に記事一覧が表示されます。

② 新規記事の登録 (register.do)
画面移動 (GET): register.jsp へ移動し、ユーザーがタイトルや内容を入力できるフォームを表示します。

実際の保存 (POST):

1.ユーザーが入力後に保存ボタンを押すと、registerPOST リクエストが発生します。

2.パラメータとして タイトル(boardTitle)、内容(boardContent)、作成者(memberId)が Controller へ送られます。

3.Controller はこれらのデータをまとめて DAO の insert(BoardVO vo) を呼び出します。

4.DAO が DB に insert into board values (...) クエリを実行して保存し、成功すると index.jsp へ画面を遷移(リダイレクト)させます。

③ 記事の詳細表示 (detail.do)
1.list.jsp などで特定の記事をクリックすると、記事番号(boardId)を持って detail.do リクエストを送ります。

2.Controller は受け取った boardId を使って DAO の select(int boardId) を呼び出します。

3.DAO は DB から該当する番号の記事を1件だけクエリ(select * from board where board_id = ...)し、BoardVO オブジェクトに格納して返します。

4.Controller はこの詳細データを持って detail.jsp 画面を表示します。

④ 記事の修正 (update.do) と 削除 (delete.do)
修正: updateGET で既存のデータを読み込んで修正フォーム(update.jsp)に表示し、ユーザーが修正して保存すると updatePOST が動作して、DAO の update メソッド経由で DB を更新します。

削除: deletePOST リクエストが入ると、boardId を DAO に渡し、DB から該当するレコードを delete します。

掲示板システムに「ページング処理(Paging / ページネーション)」の機能が追加されたデータフロー図です。

Pagination
image.png

  1. 新しく追加された重要キーワード(クラス)
    ページングを実装するために、以下の要素が新しく組み込まれています。

PageCriteria (または Criteria): * 画面下部にあるクラスです。「現在何ページ目を見ているか(page)」と「1ページに何件の記事を表示するか(numsPerPage)」という情報を保持するバケツの役割をします。

PageMaker.java:

左下にあるクラスです。全体の記事数(totalCount)と、現在のページ情報(PageCriteria)を計算して、画面の下に表示する「 [1] [2] [3] [次へ] 」のようなページボタン(ナビゲーション)を生成する役割を担います。

2. ページング処理の一連のフロー(list.do)

ユーザーが「2ページ目を見たい」とリクエストした時の流れを追ってみましょう。

① リクエストの発生(画面 ➔ Controller)

  • ユーザーが画面(index.jsp または list.jsp)から特定のページ番号をクリックします。

  • Controller(list.do)に対して、リクエストパラメータとして「文字列のページ番号(String page)」が渡されます。

② データ件数の取得とクエリの実行(Controller ➔ DAO ➔ DB)
1.Controllerは、まずDBの中に全部で何件の記事があるかを把握するため、DAOの getTotalCount() を呼び出します。

SQL: select count(board_id) as total_cnt from board

これにより、全体の件数(int totalCount)がControllerに戻ってきます。

2.次に、Controllerは PageCriteria(例:2ページ目、10件ずつ)を DAO の select() メソッドに渡します。

3.DAOは、全データの中から「必要なページの部分だけ」を切り取るためのサブクエリ(row_number())を使った効率的なSQLを実行します。

SQL: select * from (...) where rn between start and end;

これにより、2ページ目に該当する10件だけのデータ(List)がControllerに返されます。

③ ページナビゲーションの作成(Controller ➔ PageMaker)

  • Controllerは、先ほど取得した「全体の件数(totalCount)」と「現在のページ情報(PageCriteria)」を PageMaker.java に渡します。

  • PageMaker はこれを計算し、「前のページはあるか?」「次のページはあるか?」「エンドページはいくつか?」といった画面表示に必要な情報を組み立てます。

④ 画面への出力(Controller ➔ list.jsp)

  • Controllerは、最終的に以下の2つのデータをセットにして list.jsp へ送ります(Response)。

1.List(切り出された10件の記事データ)

2.PageMaker pageMaker(ページボタンを描画するための情報)

  • list.jsp は、受け取った記事リストを綺麗に表示し、画面下部に pageMaker の情報を使って [1] [2] [3] といったリンクを生成します。

掲示板の中の「コメント(返信・リプライ:Reply)機能」に特化したデータフロー図です。

Reply.drawio.html
image.png

  1. コア構成要素(Reply専用のパーツ)
    Reply テーブル(DB): 一番右側です。コメントを保存するテーブルで、どの記事に対するコメントなのかを識別するために BOARD_ID を外部キー(FK)として持っています。

ReplyVO.java: コメント1件のデータ(replyId, boardId, memberId, replyContent など)を運ぶバケツです。

ReplyDAOImple.java: コメントの登録、取得、修正、削除のSQLクエリ(insert, select, update, delete)を直接実行します。

ReplyController.java: コメントに関するリクエスト(/replies/add, /replies/list など)を一手に引き受けるコントローラーです。図の中に response url : Asynchronous(非同期) と書かれているのが特徴です。

detail.jsp & JavaScript関数(左側): ユーザーが見ている画面(detail.jsp)から、画面をリロードせずに裏側でデータを送受信するため、writeReply(), getReplyList(), updateReply(), deleteReply() というJavaScriptの関数が起点となっています。

2. 非同期通信による主要フロー解説

① コメントの登録 (/replies/add)
1.ユーザーが detail.jsp でコメントを入力し、登録ボタンを押すと、JavaScriptの writeReply() が作動します。

2.画面はそのままの状態で、裏側で boardId, memberId, replyContent が POST方式 で ReplyController へ送られます。

3.Controllerは受け取ったデータを ReplyVO に詰め、DAOの insert(ReplyVO vo) を呼び出してDBに保存します。

4.処理が終わると、Controllerは新しい画面を返すのではなく、「String result(成功したという結果の文字列:例えば "SUCCESS" など)」だけを画面に返します。

5.これを受け取った画面側は、次に説明する「一覧の再取得」を自動で呼び出します。

② コメント一覧の取得 (/replies/list)
1.記事詳細画面が開いた時や、コメントが登録・修正・削除された瞬間に、JavaScriptの getReplyList() が自動で走ります。

2.コントローラーの /replies/list へ、現在の記事番号(boardId)を GET方式 で送ります。

3.Controllerは DAO の select(int boardId) を呼び出し、その記事に紐づくコメントだけをDBからまとめて取得します。

SQL: select * from Reply where Board_id = ... order by Reply_id desc;

4.Controllerは、取得した List(コメントのリスト)をそのまま画面に返します。(一般的にJSONというデータ形式に変換して返されます)

5.detail.jsp のJavaScriptは、届いたデータを使って、コメント欄の部分だけを新しく書き換えて表示します。

③ コメントの修正 (/replies/update) と 削除 (/replies/delete)
修正: updateReply() 関数が動き、コメント番号(replyId)と新しい内容(replyContent)を POST で送ります。DAOが update クエリを実行し、成否の結果(String result)だけを画面に戻します。

削除: deleteReply() 関数が動き、コメント番号(replyId)を POST で送ります。DAOが delete クエリを実行し、同じく結果(String result)だけを画面に戻します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?