
JSP MVCモデルを使った模擬アプリ課題
以下に、Servlet、JSP、JDBC、フロントコントローラーパターンを活用した3つの課題を提案します。 課題1: 簡易タスク管理アプリケーション 要件 模範 […]
<c:out>
タグの役割と基本的な使い方を説明してください。<c:set>
タグを使用して変数を定義する方法を説明してください。<c:if>
タグを使用した条件分岐の基本構文を示してください。<c:forEach>
タグの基本的な使い方を説明してください。<c:choose>
, <c:when>
, <c:otherwise>
を使用した多岐分岐の例を示してください。<c:forEach>
タグでMapを反復処理する方法を説明してください。<c:url>
と<c:param>
を組み合わせてURLを構築する例を示してください。<c:import>
タグと<jsp:include>
アクションの違いを説明してください。<c:set>
タグでプロパティを設定する方法を説明してください。<c:catch>
タグを使用した例外処理の例を示してください。 EL(Expression Language)は、JSPでデータに簡単にアクセスするための言語です。
基本構文: ${expression}
例: ${user.name}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
${requestScope.attributeName}
または
${attributeName} (暗黙的検索)
<c:out>
タグ <c:out value="${expression}" default="defaultValue" escapeXml="true"/>
* value: 表示する値
* default: valueがnullの場合のデフォルト値
* escapeXml: XML特殊文字をエスケープするか
<c:set>
変数定義 <c:set var="variableName" value="${expression}" scope="page|request|session|application"/>
<c:if>
条件分岐<c:if test="${condition}">
<!-- conditionがtrueの場合の表示内容 -->
</c:if>
${sessionScope.attributeName}
または
${attributeName} (暗黙的検索)
<c:forEach>
基本<c:forEach items="${collection}" var="item">
${item.property}
</c:forEach>
1. タグハンドラクラスを作成
2. TLD(タグライブラリ記述子)ファイルを作成
3. JSPでタグライブラリを宣言
4. カスタムタグを使用
${bean.propertyName}
* beanはリクエスト・セッションなどの属性
* propertyNameはgetPropertyName()メソッドに対応
<c:choose>
<c:when test="${score >= 90}">A</c:when>
<c:when test="${score >= 80}">B</c:when>
<c:when test="${score >= 70}">C</c:when>
<c:otherwise>D</c:otherwise>
</c:choose>
<c:forEach items="${map}" var="entry">
Key: ${entry.key}, Value: ${entry.value}
</c:forEach>
<div>
加算: ${a + b} 減算: ${a - b} 乗算: ${a * b} 除算: ${a / b} または ${a div b} 剰余: ${a % b} または ${a mod b}
</div>
AND: ${condition1 && condition2} または ${condition1 and condition2}
OR: ${condition1 || condition2} または ${condition1 or condition2}
NOT: ${!condition} または ${not condition}
<c:url value="/product" var="productUrl">
<c:param name="id" value="${product.id}"/>
<c:param name="category" value="${product.category}"/>
</c:url>
<a href="${productUrl}">商品詳細</a>
pageContext: PageContextオブジェクト
pageScope: pageスコープの属性マップ
requestScope: requestスコープの属性マップ
sessionScope: sessionスコープの属性マップ
applicationScope: applicationスコープの属性マップ
param: リクエストパラメータマップ
paramValues: 複数値のリクエストパラメータマップ
header: リクエストヘッダーマップ
headerValues: 複数値のリクエストヘッダーマップ
cookie: Cookieマップ
initParam: コンテキスト初期化パラメータマップ
<c:import>
タグと<jsp:include>
アクションの違い<c:import>: - 外部リソースも含めてインポート可能 - URLを変数に格納可能 - より柔軟な機能 <jsp:include>: - 同じWebアプリケーション内のリソースのみ - 実行時にインクルード - シンプルなケース向け
${condition ? 'valueIfTrue' : 'valueIfFalse'}
例: ${user != null ? user.name : 'ゲスト'}
<c:set target="${bean}" property="propertyName" value="${value}"/>
<!--
* beanはターゲットオブジェクト
* propertyNameはsetPropertyName()メソッドに対応
-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
<c:catch var="exception">
<%-- 例外が発生する可能性のある処理 --%>
${1 / 0}
</c:catch>
<c:if test="${exception != null}">
エラーが発生しました: ${exception.message}
</c:if>
リスト: ${list[0]}
配列: ${array[0]}
Map: ${map['key']} または ${map.key}
<!-- TLDファイル -->
<tag>
<name>myTag</name>
<tag-class>com.example.MyTagHandler</tag-class>
<attribute>
<name>attributeName</name>
<required>true|false</required>
<rtexprvalue>true|false</rtexprvalue>
</attribute>
</tag>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
長さ: ${fn:length(string)}
分割: ${fn:split(string, delimiter)}
結合: ${fn:join(array, delimiter)}
含む: ${fn:contains(string, substring)}
// 関数クラス
public class MyFunctions {
public static String reverse(String input) {
return new StringBuilder(input).reverse().toString();
}
}
<!-- TLD定義 -->
<function>
<name>reverse</name>
<function-class>com.example.MyFunctions</function-class>
<function-signature>java.lang.String reverse(java.lang.String)</function-signature>
</function>
<!-- JSP使用 -->
${my:reverse('hello')}
public class MyTagHandler extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspFragment body = getJspBody();
StringWriter writer = new StringWriter();
body.invoke(writer);
String bodyContent = writer.toString();
// ボディ内容を加工
getJspContext().getOut().print(bodyContent.toUpperCase());
}
}
${user?.address?.city}
<!-- * null安全なアクセス(JSP 2.3以降) -->
<c:if test="${not empty user and not empty user.address}">
${user.address.city}
</c:if>
public class DynamicAttributeTag extends SimpleTagSupport implements DynamicAttributes {
private Map attrs = new HashMap<>();
public void setDynamicAttribute(String uri, String name, Object value) {
attrs.put(name, value);
}
public void doTag() throws JspException, IOException {
// attrsを使用して動的処理
}
}
本番環境では使用を避け、DAO層を利用する
使用する場合は必ずデータソースを利用
SQLインジェクション対策として<c:param>を使用
トランザクション管理を適切に行う
接続リソースを確実に解放
JSTLを使用するケース: – 標準的な表示ロジック(ループ、条件分岐など) – フォーマット処理 – 一般的な文字列操作 カスタムタグを使用するケース: – 複雑な再利用可能なUIコンポーネント – 特定のビジネスロジックをカプセル化 – 特殊な表示要件がある場合 – 複数のJSPで共通して使用する複雑なロジック ベストプラクティス: 1. まずJSTLで解決できないか検討 2. カスタムタグは本当に必要な場合のみ作成 3. タグライブラリは適切にドキュメント化 4. 単一責任の原則に従う