
JSP MVCモデルを使った模擬アプリ課題
以下に、Servlet、JSP、JDBC、フロントコントローラーパターンを活用した3つの課題を提案します。 課題1: 簡易タスク管理アプリケーション 要件 模範 […]
<% %>
)の使い方を説明してください。<%= %>
)の使い方を説明してください。<%! %>
)の使い方を説明してください。<%@ page %>
)で設定できる主な属性を3つ挙げてください。include
ディレクティブとinclude
アクションの違いを説明してください。 JSP(JavaServer Pages)は、動的なWebページを作成するための技術で、内部的にはServletに変換されます。JSPはHTMLにJavaコードを埋め込む形で記述でき、表示ロジックに適しています。一方、ServletはJavaコード内にHTMLを埋め込む形で、制御ロジックに適しています。
<%@ 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>
<%
// Javaコードを記述
String message = "Hello JSP";
out.println(message);
%>
<p>現在時刻: <%= new java.util.Date() %></p>
<%!
// メンバ変数やメソッドを宣言
private int count = 0;
public void increment() {
count++;
}
%>
<%-- JSPコメント(クライアントに送信されない) --%>
<!-- HTMLコメント(クライアントに送信される) -->
<%@ page import="java.util.List,java.util.ArrayList" %>
または
<%@ page import="java.util.*" %>
<form action="MyServlet" method="post">
<input type="text" name="username">
<input type="submit">
</form>
// Servlet内
request.setAttribute("message", "Hello from Servlet");
request.getRequestDispatcher("/result.jsp").forward(request, response);
<!-- JSP内 -->
<p><%= request.getAttribute("message") %></p>
<% for (int i = 1; i <= 10; i++) { %>
<%= i %><br>
<% } %>
<p>現在日時: <%= new java.util.Date() %></p>
<%! private int counter = 0; %>
<% counter++; %>
<p>訪問回数: <%= counter %></p>
<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: スクリプトレット --%>
<% if (condition) { %>
<p>条件が真です</p>
<% } else { %>
<p>条件が偽です</p>
<% } %>
<%-- 方法2: 式 --%>
<%= (condition) ? "条件が真です" : "条件が偽です" %>
<%-- 方法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++; %>
<% } %>
<p>ユーザー名: <%= request.getAttribute("username") %></p>
<%-- JSPページで --%>
<%@ page errorPage="error.jsp" %>
<%-- web.xmlで全体設定 --%>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="java.util.*" %> <%@ page session="false" %>
<%-- ディレクティブ --%>
<%@ include file="header.jsp" %>
* コンパイル時にインクルード
* 静的コンテンツ向け
<%-- アクション --%>
<jsp:include page="header.jsp" />
* 実行時にインクルード
* 動的コンテンツ向け
<jsp:forward page="otherPage.jsp" />
または
<% request.getRequestDispatcher("otherPage.jsp").forward(request, response); %>
<%-- 方法1: try-catch --%>
<% try { %>
<%-- 処理 --%>
<% } catch (Exception e) { %>
<p>エラーが発生しました: <%= e.getMessage() %></p>
<% } %>
<%-- 方法2: エラーページ指定 --%>
<%@ page errorPage="error.jsp" %>
<% if ("GET".equals(request.getMethod())) { %>
<p>GETリクエストです</p>
<% } else if ("POST".equals(request.getMethod())) { %>
<p>POSTリクエストです</p>
<% } %>
<% session.invalidate(); %> セッションを無効化しました
可読性が向上: HTMLとJavaコードが混在しない
保守性向上: 表示ロジックとビジネスロジックの分離
再利用性向上: コンポーネント化が容易
セキュリティ強化: スクリプトインジェクションリスク低減
ツールサポート: IDEやツールのサポートが受けやすい
<%!
public String formatDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
return sdf.format(date);
}
%>
<%-- 使用例 --%>
<p>フォーマット済み日時: <%= formatDate(new Date()) %></p>
<%-- ヘッダー --%>
<%@ include file="/WEB-INF/includes/header.jsp" %>
<%-- メインコンテンツ --%>
<div id="content">
...
</div>
<%-- フッター --%>
<%@ include file="/WEB-INF/includes/footer.jsp" %>
スクリプトレットを最小限に: EL式やJSTLを使用
適切なinclude方法選択: 静的コンテンツはディレクティブ、動的コンテンツはアクション
バッファリング活用: pageディレクティブでbufferサイズ設定
セッション使用制御: 不要な場合はsession="false"
プリコンパイル: 本番環境でJSPを事前コンパイル
MVCアーキテクチャに基づく適切な役割分担: - Servlet (Controller): * リクエストの受信と処理 * ビジネスロジックの実行 * モデルデータの準備 * 適切なビュー(JSP)への転送 - JSP (View): * モデルデータの表示 * ユーザーインターフェースの構築 * 最小限の表示ロジックのみ保持 この分離により、変更に強くテスト容易な設計が実現できる。
モジュール化設計: - 共通部品を/WEB-INF/includes/下に配置 - テンプレートパターンを適用
ディレクトリ構造の体系化: /WEB-INF/ /views/ /admin/ - 管理画面JSP /user/ - ユーザー画面JSP /shared/ - 共通コンポーネント
命名規則の統一: - 機能_役割.jsp (例: user_list.jsp, product_detail.jsp) - バージョン管理との連携
ドキュメンテーション: - JSPごとの仕様書作成 - 依存関係の明記
セキュリティ対策: - 直接アクセス不可なJSPは/WEB-INF/下に配置 - 入力値検証を徹底