JSPの基本(スクリプトレットと式中心) – 課題30問

2025-08-04

初級問題 (9問)

  1. JSPとは何か、Servletとの関係を説明してください。
  2. JSPの基本的なファイル構造を説明してください。
  3. JSPのスクリプトレット(<% %>)の使い方を説明してください。
  4. JSPの式(<%= %>)の使い方を説明してください。
  5. JSPの宣言(<%! %>)の使い方を説明してください。
  6. JSPコメントの書き方を2通り示してください。
  7. JSPでimport文を使用する方法を説明してください。
  8. JSPからServletにデータを渡す方法を説明してください。
  9. ServletからJSPにデータを渡す方法を説明してください。

中級問題 (15問)

  1. スクリプトレットを使用して、1から10までの数字を表示するJSPを作成してください。
  2. JSPの式を使用して、現在の日時を表示するコードを書いてください。
  3. JSPの宣言を使用して、ページ訪問カウンターを実装してください。
  4. スクリプトレットと式を組み合わせて、簡単な九九表を生成するJSPを作成してください。
  5. JSPで条件分岐(if文)を行う方法を2通り示してください。
  6. JSPでループ処理(for文)を行う方法を2通り示してください。
  7. Servletで設定したリクエスト属性をJSPで表示する方法を説明してください。
  8. JSPでエラーが発生した場合に表示する専用ページを設定する方法を説明してください。
  9. JSPのディレクティブ(<%@ page %>)で設定できる主な属性を3つ挙げてください。
  10. JSPのincludeディレクティブとincludeアクションの違いを説明してください。
  11. JSPから別のJSPにリクエストを転送する方法を説明してください。
  12. JSPで例外を処理する方法を2通り説明してください。
  13. JSPの暗黙オブジェクトのうち、よく使用するものを5つ挙げてください。
  14. JSPでHTTPメソッド(GET/POST)を判別する方法を説明してください。
  15. JSPでセッションを無効化する方法を説明してください。

上級問題 (6問)

  1. スクリプトレットを使用せずに、Javaコードを極力減らしたJSP設計のメリットを説明してください。
  2. JSPの宣言を使用して、ユーティリティメソッドを定義する例を示してください。
  3. 複数のJSPで共通使用するヘッダー/フッターをインクルードする最適な方法を説明してください。
  4. JSPのパフォーマンスを向上させるための方法を3つ挙げてください。
  5. JSPとServletを適切に役割分担させるアーキテクチャについて説明してください。
  6. 大規模アプリケーションでのJSP管理のベストプラクティスを3つ説明してください。

解答例

初級問題解答

  1. JSPとServletの関係
   JSP(JavaServer Pages)は、動的なWebページを作成するための技術で、内部的にはServletに変換されます。JSPはHTMLにJavaコードを埋め込む形で記述でき、表示ロジックに適しています。一方、ServletはJavaコード内にHTMLを埋め込む形で、制御ロジックに適しています。
  1. JSPの基本構造
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP Example</title>
</head>
<body>
    <%-- JSPコード --%>
    <h1>Hello JSP!</h1>
    <% String name = "World"; %>
    <p>Hello, <%= name %></p>
</body>
</html>
  1. スクリプトレット
   <% 
       // Javaコードを記述
       String message = "Hello JSP";
       out.println(message);
   %>
   <p>現在時刻: <%= new java.util.Date() %></p>
  1. 宣言
   <%!
       // メンバ変数やメソッドを宣言
       private int count = 0;

       public void increment() {
           count++;
       }
   %>
  1. JSPコメント
<%-- JSPコメント(クライアントに送信されない) --%>
<!-- HTMLコメント(クライアントに送信される) -->
  1. import文
   <%@ page import="java.util.List,java.util.ArrayList" %>
   または
   <%@ page import="java.util.*" %>
  1. JSP→Servletデータ渡し
    <form action="MyServlet" method="post">
        <input type="text" name="username">
        <input type="submit">
    </form>
  1. Servlet→JSPデータ渡し
   // Servlet内
   request.setAttribute("message", "Hello from Servlet");
   request.getRequestDispatcher("/result.jsp").forward(request, response);
   <!-- JSP内 -->
   <p><%= request.getAttribute("message") %></p>

中級問題解答

  1. 1~10表示
<% for (int i = 1; i <= 10; i++) { %>
    <%= i %><br>
<% } %>
  1. 現在日時表示
<p>現在日時: <%= new java.util.Date() %></p>
  1. 訪問カウンター
<%! private int counter = 0; %>
<% counter++; %>
<p>訪問回数: <%= counter %></p>
  1. 九九表
<table border="1">
<% for (int i = 1; i <= 9; i++) { %>
  <tr>
    <% for (int j = 1; j <= 9; j++) { %>
      <td><%= i * j %></td>
    <% } %>
  </tr>
<% } %>
</table>
  1. 条件分岐
<%-- 方法1: スクリプトレット --%>
<% if (condition) { %>
    <p>条件が真です</p>
<% } else { %>
    <p>条件が偽です</p>
<% } %>

<%-- 方法2: 式 --%>
<%= (condition) ? "条件が真です" : "条件が偽です" %>
  1. ループ処理
<%-- 方法1: forループ --%>
<% for (int i = 0; i < 10; i++) { %>
    <p>Item <%= i %></p>
<% } %>

<%-- 方法2: whileループ --%>
<% int i = 0; %>
<% while (i < 10) { %>
    <p>Item <%= i %></p>
    <% i++; %>
<% } %>
  1. リクエスト属性表示
<p>ユーザー名: <%= request.getAttribute("username") %></p>
  1. エラーページ設定
<%-- JSPページで --%>
<%@ page errorPage="error.jsp" %>

<%-- web.xmlで全体設定 --%>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.jsp</location>
</error-page>
  1. pageディレクティブ属性
<%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="java.util.*" %> <%@ page session="false" %>
  1. includeディレクティブ vs アクション
<%-- ディレクティブ --%>
<%@ include file="header.jsp" %>
* コンパイル時にインクルード
* 静的コンテンツ向け

<%-- アクション --%>
<jsp:include page="header.jsp" />
* 実行時にインクルード
* 動的コンテンツ向け
  1. リクエスト転送
<jsp:forward page="otherPage.jsp" />
 または 
<% request.getRequestDispatcher("otherPage.jsp").forward(request, response); %>
  1. 例外処理
<%-- 方法1: try-catch --%>
<% try { %>
    <%-- 処理 --%>
<% } catch (Exception e) { %>
    <p>エラーが発生しました: <%= e.getMessage() %></p>
<% } %>

<%-- 方法2: エラーページ指定 --%>
<%@ page errorPage="error.jsp" %>
  1. 暗黙オブジェクト
  1. request (HttpServletRequest)
  2. response (HttpServletResponse)
  3. out (JspWriter)
  4. session (HttpSession)
  5. application (ServletContext)
  1. HTTPメソッド判別
<% if ("GET".equals(request.getMethod())) { %>
    <p>GETリクエストです</p>
<% } else if ("POST".equals(request.getMethod())) { %>
    <p>POSTリクエストです</p>
<% } %>
  1. セッション無効化
<% session.invalidate(); %> セッションを無効化しました

上級問題解答

  1. スクリプトレット不使用のメリット
  1. 可読性が向上: HTMLとJavaコードが混在しない
  2. 保守性向上: 表示ロジックとビジネスロジックの分離
  3. 再利用性向上: コンポーネント化が容易
  4. セキュリティ強化: スクリプトインジェクションリスク低減
  5. ツールサポート: IDEやツールのサポートが受けやすい
  1. ユーティリティメソッド定義
<%!
    public String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return sdf.format(date);
    }
%>

<%-- 使用例 --%>
<p>フォーマット済み日時: <%= formatDate(new Date()) %></p>
  1. 共通ヘッダー/フッターインクルード
<%-- ヘッダー --%>
<%@ include file="/WEB-INF/includes/header.jsp" %>

<%-- メインコンテンツ --%>
<div id="content">
    ...
</div>

<%-- フッター --%>
<%@ include file="/WEB-INF/includes/footer.jsp" %>
  1. JSPパフォーマンス向上方法
  1. スクリプトレットを最小限に: EL式やJSTLを使用
  2. 適切なinclude方法選択: 静的コンテンツはディレクティブ、動的コンテンツはアクション
  3. バッファリング活用: pageディレクティブでbufferサイズ設定
  4. セッション使用制御: 不要な場合はsession="false"
  5. プリコンパイル: 本番環境でJSPを事前コンパイル
  1. JSPとServletの役割分担

MVCアーキテクチャに基づく適切な役割分担: - Servlet (Controller): * リクエストの受信と処理 * ビジネスロジックの実行 * モデルデータの準備 * 適切なビュー(JSP)への転送 - JSP (View): * モデルデータの表示 * ユーザーインターフェースの構築 * 最小限の表示ロジックのみ保持 この分離により、変更に強くテスト容易な設計が実現できる。

  1. 大規模アプリケーションJSP管理
  1. モジュール化設計: - 共通部品を/WEB-INF/includes/下に配置 - テンプレートパターンを適用
  2. ディレクトリ構造の体系化: /WEB-INF/ /views/ /admin/ - 管理画面JSP /user/ - ユーザー画面JSP /shared/ - 共通コンポーネント
  3. 命名規則の統一: - 機能_役割.jsp (例: user_list.jsp, product_detail.jsp) - バージョン管理との連携
  4. ドキュメンテーション: - JSPごとの仕様書作成 - 依存関係の明記
  5. セキュリティ対策: - 直接アクセス不可なJSPは/WEB-INF/下に配置 - 入力値検証を徹底