【Java Web開発 完全ロードマップ】HTML・SQL・サーブレット・DAOまで1日で学ぶ!今日の学習を総まとめ

「Javaって学ぶことが多すぎて、どこから手をつければいいかわからない」——そう感じている方は多いはずです。でも実は、Java Web開発に必要な技術には決まった順番と繋がりがあります。

今日1日で学んだのは、その繋がりの核心部分——「HTMLでページを作り・SQLでデータを取り・サーブレットで処理して・DAOで綺麗に設計する」という一連の流れです。この記事では、今日カバーした4つのテーマを「全体像が見える総まとめ」として整理します。各テーマの詳細記事へのリンクも用意しているので、復習に活用してください!


目次


今日の学習マップ:4テーマの繋がりを理解しよう

今日学んだ4テーマは、バラバラに存在しているわけではありません。Webアプリケーションの「リクエスト〜レスポンス」という1本の流れの中で、それぞれが明確な役割を担っています。

【今日の学習マップ:Webアプリ リクエスト〜レスポンスの流れ】

① ブラウザ(クライアント)
   └─ テーマ① HTMLで作られた入力フォームからリクエストを送信
            └─ DOCTYPE・head/body構造・ブロック/インライン要素
            └─ CSSで「構造(HTML)」と「見た目」を分離する

                        ↓ HTTPリクエスト

② サーブレット(Controller)
   └─ テーマ③ サーブレットがリクエストを受け取り処理を振り分ける
            └─ HttpServlet継承・doGet()/doPost()・ライフサイクル
            └─ フォワードでJSPへ、リダイレクトで別URLへ
            └─ セッション管理でログイン状態を保持する

                        ↓ DAOを呼ぶ

③ DAO / Model層
   └─ テーマ④ DAOがDBアクセスを一手に引き受ける
            └─ JDBC:接続→PreparedStatement→ResultSet→クローズ
            └─ ResultSet → DTOに変換 → List<DTO>でサーブレットへ返す
            └─ JavaBeansでビジネスロジックをModelにまとめる

                        ↓ SQL発行

④ データベース(MySQL)
   └─ テーマ② SELECT文でデータを取得・集計・結合する
            └─ WHERE・ORDER BY・GROUP BY+集約関数
            └─ INNER JOIN / LEFT OUTER JOIN
            └─ PreparedStatementでプレースホルダ実行

                        ↓ DTOリストで返却

⑤ JSP(View)
   └─ テーマ③ JSPがデータを受け取りHTMLとして表示する
            └─ EL式 ${ } でスクリプトレスに表示
            └─ ビジネスロジックはJSPに書かない

                        ↓ HTMLレスポンス

⑥ ブラウザ(クライアント)
   └─ テーマ① CSS(外部ファイル)でデザインされた画面が表示される

この流れが「頭の地図」として入ると、今後どんな機能を作るときも「どのクラスに何を書けばいいか」が迷わなくなります。では各テーマを順に振り返りましょう。


テーマ① HTMLの基本構造とCSSの役割分担

Web開発の出発点は「ブラウザに表示される画面を作ること」です。HTMLとCSSはその2大技術ですが、それぞれの役割を混同しないことが最初の重要ポイントです。

🔑 今日のキーポイント

項目内容覚えておくべき鉄則
HTML骨格 <!DOCTYPE html><html><head>(設定)+ <body>(表示) headは「ブラウザに見えない設定エリア」、bodyが「ブラウザに見えるコンテンツエリア」
ブロック vs インライン ブロック(<div><p><h1>)は「箱」。インライン(<span><a>)は「文中の部品」 ブロックの中にインラインはOK。逆はNG
CSSの書き場所 インライン / styleタグ / 外部ファイル(.css)の3パターン 実務は外部ファイル一択。複数ページに一括適用できる
セレクタの種類 要素セレクタ・クラス(.)・ID(# 使い回すなら class、1か所だけなら id
役割分担の鉄則 HTMLは「構造・意味」、CSSは「見た目」 <font color="red"> のようにHTMLにデザインを書かない
<!-- ✅ 今日の最重要コード:HTML構造とCSSの役割分担 -->

<!-- HTML(構造・意味だけを書く) -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>ページタイトル</title>
    <link rel="stylesheet" href="style.css">  <!-- CSSは外部ファイルで -->
  </head>
  <body>
    <div id="header">ヘッダー</div>
    <p class="important">重要なお知らせ</p>
  </body>
</html>

/* CSS(見た目だけを書く) */
#header   { background-color: #333; color: #fff; padding: 20px; }
.important { color: red; font-weight: bold; }

テーマ② 現場で使うSELECT文:データ調査編&プログラミング編

Webアプリのほぼすべての機能はDBとの連携があります。「どうデータを取るか」を制するのがSELECT文です。今日は「現場でよく使う6パターン」を2軸で整理しました。

🔑 今日のキーポイント

分類パターン覚えておくべき鉄則
データ調査編 WHERE 句:IN・BETWEEN・LIKE で絞り込む LIKE '%キーワード%' で部分一致検索。% は任意文字列
ORDER BY:ASC(昇順)/ DESC(降順) 複数列指定は左から優先。省略時はASC
GROUP BY + 集約関数(COUNT/SUM/MAX) 実行順は WHERE → GROUP BY → HAVING → SELECT → ORDER BY
プログラミング編 INNER JOIN:両テーブルに一致するレコードだけ取得 ON t1.company_id = t2.company_id で結合条件を指定
LEFT OUTER JOIN:左テーブル全件+一致しなければNULL 「未登録・未設定の人も漏れなく取りたい」ときに使う
PreparedStatement?(プレースホルダ)でSQL実行 SQLインジェクション防止の必須手段。文字列結合は絶対NG
-- ✅ 今日の最重要SQLパターン集

-- ①絞り込み(LIKE・IN・BETWEEN)
SELECT * FROM m_company WHERE company_name LIKE '%株式会社%';
SELECT * FROM m_company WHERE company_id IN (1, 3, 5);
SELECT * FROM m_company WHERE company_id BETWEEN 2 AND 6;

-- ②並べ替え(ORDER BY)
SELECT * FROM m_company ORDER BY area_id ASC, company_id DESC;

-- ③集計(GROUP BY + COUNT)
SELECT area_name, COUNT(*) AS cnt FROM m_company
GROUP BY area_name HAVING COUNT(*) >= 2;

-- ④内部結合(INNER JOIN)
SELECT t1.person_lname, t2.company_name
FROM m_person t1 INNER JOIN m_company t2 ON t1.company_id = t2.company_id;

-- ⑤PreparedStatement(Javaコード)
String sql = "SELECT * FROM m_company WHERE company_name = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, inputName);
ResultSet rs = pstmt.executeQuery();

特に「WHEREとHAVINGの使い分け」は試験でも実務でも頻出です。「集約関数(COUNT等)の結果を条件にするならHAVING、個別レコードの絞り込みはWHERE」と覚えておきましょう。


テーマ③ サーブレット&JSPの本質と注意点

JavaでWebアプリを作るときの2大サーバサイド技術です。「サーブレットで処理してJSPで表示する」という役割分担がMVCの基本になります。

🔑 今日のキーポイント

技術本質覚えておくべき注意点
サーブレット HTTPリクエストを処理するJavaクラス。HttpServletを継承しdoGet()/doPost()をオーバーライド インスタンスは1つ=マルチスレッド動作。フィールド変数にリクエストデータを持つのは危険
GET vs POST GETはURLにデータが見える。POSTはメッセージボディに格納 パスワード・個人情報の送信は必ずPOST
JSP HTMLにJavaを埋め込める画面表示専用ファイル。初回アクセス時にサーブレットへ自動コンパイル スクリプトレットを書きすぎると保守地獄。ビジネスロジックはサーブレット/DAOへ
フォワード 同一APサーバ内の転送。URLが変わらない。requestオブジェクトを共有できる 「サーブレットで処理 → JSPで表示」の黄金パターンで使う
リダイレクト ブラウザへ「このURLに移動して」と指示。URLが変わる 処理完了後にトップページへ誘導するときなどに使う
セッション管理 HTTPはステートレスなので、セッションオブジェクトでログイン情報を保持する 不要になったらinvalidate()で必ず破棄。放置はサーバのメモリ圧迫につながる
// ✅ 今日の最重要コードパターン:サーブレット→JSPフォワード

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        String name     = request.getParameter("NAME");
        String password = request.getParameter("PASSWORD");

        if ("embex".equals(password)) {
            // セッションにログイン情報を保存
            HttpSession session = request.getSession();
            session.setAttribute("loginUser", name);

            // JSPへフォワード(処理結果を表示させる)
            request.setAttribute("userName", name);
            request.getRequestDispatcher("/welcome.jsp").forward(request, response);
        } else {
            request.getRequestDispatcher("/login.html").forward(request, response);
        }
    }
}
<!-- ✅ JSP側:EL式でスクリプトレスに表示(スクリプトレットを書かない!) -->
<%@ page contentType="text/html; charset=UTF-8" %>
<h1>ようこそ、${userName}さん!</h1>
<p>ログインに成功しました。</p>

テーマ④ DAOクラス&Modelクラスの設計パターン

サーブレット・JSP・SQLと学んできて、最後に「それらをどう綺麗に繋げるか」の設計パターンを学びました。それがDAOパターン + DTO/JavaBeansです。

🔑 今日のキーポイント:3者の違いを整理する

クラス役割持つものたとえ話
DTO
(Data Transfer Object)
テーブル1行分のデータを運ぶ入れ物 フィールド+getter/setterのみ 宅配の「段ボール箱」
JavaBeans DTOにビジネスロジックを追加したModel フィールド+getter/setter+業務処理メソッド 「判断もできる段ボール箱」
DAO
(Data Access Object)
DBアクセスを専門に行うクラス JDBC処理・SQL・CRUD操作 「倉庫の担当者」
// ✅ 今日の最重要コードパターン:DAO → DTO変換 → Listで返す

public class CompanyDAO {
    public List<CompanyDTO> findAll() {
        List<CompanyDTO> list = new ArrayList<>();
        Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null;
        try {
            con   = DriverManager.getConnection(URL, USER, PASS);
            pstmt = con.prepareStatement("SELECT * FROM m_company ORDER BY company_id");
            rs    = pstmt.executeQuery();
            while (rs.next()) {
                CompanyDTO dto = new CompanyDTO();          // DBの1行 → DTOの1インスタンス
                dto.setCompanyId(rs.getInt("company_id"));
                dto.setCompanyName(rs.getString("company_name"));
                dto.setAreaName(rs.getString("area_name"));
                list.add(dto);                              // ListにDTOを追加
            }
        } catch (SQLException e) { e.printStackTrace();
        } finally {
            // 必ずクローズ(finally で確実に)
            try { if (rs    != null) rs.close();    } catch (SQLException e) {}
            try { if (pstmt != null) pstmt.close(); } catch (SQLException e) {}
            try { if (con   != null) con.close();   } catch (SQLException e) {}
        }
        return list;   // List<CompanyDTO> をサーブレットへ返す
    }
}

4テーマを繋げると見えてくる「Webアプリの全体像」

今日学んだ4テーマを1本のコードフローとして繋げると、以下のようになります。これがMVCモデルに基づいたJava Webアプリの完成形です。

// ===== MVCモデル完成形:会社一覧表示機能の全体フロー =====

// 【テーマ① HTML:ブラウザからリクエスト送信】
// <a href="/companyList">会社一覧を見る</a>
// ↓ GETリクエスト送信

// 【テーマ③ サーブレット(Controller)】
@WebServlet("/companyList")
public class CompanyListServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 【テーマ④ DAOを呼ぶ(ビジネスロジックはDAOに任せる)】
        CompanyDAO dao = new CompanyDAO();
        List<CompanyDTO> companyList = dao.findAll();   // ← 内部でSQLを発行

        // JSP(View)へ渡すためにrequestにセット
        request.setAttribute("companyList", companyList);

        // JSPへフォワード(URLは変わらない)
        request.getRequestDispatcher("/companyList.jsp").forward(request, response);
    }
}

// 【テーマ② SQL(DAOの内部で発行)】
// SELECT company_id, company_name, area_name
// FROM testdb.m_company
// INNER JOIN testdb.m_area ON m_company.area_id = m_area.area_id
// ORDER BY company_id ASC;

// 【テーマ④ DTO:ResultSet → Javaオブジェクトへ変換】
// DBの1行 = CompanyDTOの1インスタンス → List<CompanyDTO> でサーブレットへ返る

// 【テーマ③ JSP(View):EL式でスクリプトレスに表示】
// <c:forEach var="company" items="${companyList}">
//   <tr>
//     <td>${company.companyId}</td>
//     <td>${company.companyName}</td>
//     <td>${company.areaName}</td>
//   </tr>
// </c:forEach>

// 【テーマ① CSS:外部ファイルで画面をデザイン】
// table { border-collapse: collapse; width: 100%; }
// td, th { border: 1px solid #ccc; padding: 8px; }

4テーマはそれぞれ独立した技術ですが、Webアプリという1つのシステムの中で「画面 → 処理 → DB → 表示」という役割を担い、密接に連携しています。どのテーマが欠けても、Webアプリは成立しません。

また、各技術の「役割分担の鉄則」も今日のテーマに一貫して流れていました。

技術やることやらないこと
HTMLコンテンツの構造・意味を定義する色・フォントなどデザインを書かない
CSS見た目・スタイルを定義するコンテンツの意味に関与しない
サーブレットリクエスト処理・DAOを呼ぶ・JSPへ渡すSQL・JDBCコードを書かない
JSP受け取ったデータをHTMLとして表示する業務ロジック・DB処理を書かない
DAOSQL発行・DB接続・CRUD操作HTTPリクエスト・HTMLの構造に関わらない
DTO/JavaBeansデータを保持・ビジネスロジックを持つDBアクセス・HTTP通信を行わない

まとめ:今日の学びを3行で整理

今日カバーした内容は、Java Web開発のほぼすべての土台になる技術群です。最後に「今日の学びの核心」を3行でまとめます。

#テーマ今日の核心メッセージ
HTML / CSS 「HTMLは骨格、CSSは服」。この役割分担を守るだけで保守しやすいコードになる
SELECT文 WHERE・ORDER BY・GROUP BYの3つを自在に組み合わせるのが第一目標。?(PreparedStatement)でSQLは必ず安全に実行する
サーブレット / JSP 「サーブレットは司令塔、JSPは表示係」。JSPにビジネスロジックを書くのが最大の落とし穴
DAO / Model 「DAO=倉庫担当、DTO=段ボール箱」。DB処理をDAOに隔離することで変更の影響範囲が最小限になる

今日の4テーマを貫く一番大切な考え方は「役割分担」です。HTMLとCSS、サーブレットとJSP、DAOとDTO——それぞれが「自分の仕事だけをする」ように設計することで、修正が楽になり、チームで分業でき、バグが減ります。

次のステップは、今日の4テーマをすべて使った「会社一覧 → 詳細 → 登録 → 更新 → 削除」のフルCRUDアプリを実際に手を動かして作ることです。設計図(データの流れ)は今日学んだもので完成しています。あとはコードに落とすだけ!

各テーマの詳細については、シリーズ別記事もあわせてご活用ください。手を動かすことが一番の近道——今日学んだことをぜひ実際のコードで試してみてください!


📚 シリーズ記事一覧(今日の補講)

  • 【Java基礎①】変数(プリミティブ型・参照型・スコープ)
  • 【Java基礎②】メソッド(定義・引数・戻り値・命名規約)
  • 【Java基礎③】クラス(設計図・インスタンス・カプセル化・コンストラクタ)
  • 【Web基礎①】HTMLの基本構造とCSSの役割分担 ← 今日
  • 【DB/SQL①】現場で使うSELECT文(データ調査編&プログラミング編) ← 今日
  • 【Java Web①】サーブレット&JSPの本質と注意点 ← 今日
  • 【Java Web②】DAOクラス&Modelクラスの設計パターン ← 今日

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *