JSTL・EL式・カスタムタグ – 課題30問

2025-08-04

初級問題 (9問)

  1. EL式(Expression Language)とは何か、その基本的な構文を説明してください。
  2. JSTL(JSP Standard Tag Library)のコアタグライブラリを使用するための宣言方法を説明してください。
  3. EL式でリクエスト属性にアクセスする方法を説明してください。
  4. <c:out>タグの役割と基本的な使い方を説明してください。
  5. <c:set>タグを使用して変数を定義する方法を説明してください。
  6. <c:if>タグを使用した条件分岐の基本構文を示してください。
  7. EL式でセッション属性にアクセスする方法を説明してください。
  8. <c:forEach>タグの基本的な使い方を説明してください。
  9. カスタムタグを使用するための基本的な手順を説明してください。

中級問題 (15問)

  1. EL式でJavaBeanのプロパティにアクセスする方法を説明してください。
  2. <c:choose>, <c:when>, <c:otherwise>を使用した多岐分岐の例を示してください。
  3. <c:forEach>タグでMapを反復処理する方法を説明してください。
  4. EL式で算術演算を行う方法を説明してください。
  5. EL式で論理演算(AND, OR, NOT)を行う方法を説明してください。
  6. <c:url><c:param>を組み合わせてURLを構築する例を示してください。
  7. EL式の暗黙オブジェクトを5つ挙げ、それぞれの用途を説明してください。
  8. <c:import>タグと<jsp:include>アクションの違いを説明してください。
  9. EL式で三項演算子を使用する方法を説明してください。
  10. <c:set>タグでプロパティを設定する方法を説明してください。
  11. JSTLのフォーマットタグライブラリを使用して日付をフォーマットする方法を説明してください。
  12. <c:catch>タグを使用した例外処理の例を示してください。
  13. EL式でコレクションや配列の要素にアクセスする方法を説明してください。
  14. カスタムタグで属性を定義する方法を説明してください。
  15. JSTLの関数タグライブラリを使用して文字列を操作する方法を説明してください。

上級問題 (6問)

  1. EL式で独自の関数を定義して使用する方法を説明してください。
  2. カスタムタグでタグボディを処理する方法を説明してください。
  3. JSTLとEL式のみを使用して、ネストしたJavaBeanのプロパティに安全にアクセスする方法を説明してください。
  4. 動的にカスタムタグの属性を決定する高度な実装例を示してください。
  5. JSTLのSQLタグライブラリを使用する際のベストプラクティスを説明してください。
  6. 大規模アプリケーションでのJSTLとカスタムタグの適切な使い分けについて説明してください。

解答例

初級問題解答

  1. EL式の基本
   EL(Expression Language)は、JSPでデータに簡単にアクセスするための言語です。
   基本構文: ${expression}
   例: ${user.name}
  1. JSTLコアタグ宣言
   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. リクエスト属性アクセス
   ${requestScope.attributeName}
   または
   ${attributeName} (暗黙的検索)
  1. <c:out>タグ
   <c:out value="${expression}" default="defaultValue" escapeXml="true"/>
   * value: 表示する値
   * default: valueがnullの場合のデフォルト値
   * escapeXml: XML特殊文字をエスケープするか
  1. <c:set>変数定義
   <c:set var="variableName" value="${expression}" scope="page|request|session|application"/>
  1. <c:if>条件分岐
<c:if test="${condition}">
    <!-- conditionがtrueの場合の表示内容 -->
</c:if>
  1. セッション属性アクセス
   ${sessionScope.attributeName}
   または
   ${attributeName} (暗黙的検索)
  1. <c:forEach>基本
<c:forEach items="${collection}" var="item">
    ${item.property}
</c:forEach>
  1. カスタムタグ基本手順
   1. タグハンドラクラスを作成
   2. TLD(タグライブラリ記述子)ファイルを作成
   3. JSPでタグライブラリを宣言
   4. カスタムタグを使用

中級問題解答

  1. JavaBeanプロパティアクセス
${bean.propertyName}
* beanはリクエスト・セッションなどの属性
* propertyNameはgetPropertyName()メソッドに対応
  1. 多岐分岐例
<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>
  1. Map反復処理
<c:forEach items="${map}" var="entry">
    Key: ${entry.key}, Value: ${entry.value}
</c:forEach>
  1. 算術演算
<div>
    加算: ${a + b} 減算: ${a - b} 乗算: ${a * b} 除算: ${a / b} または ${a div b} 剰余: ${a % b} または ${a mod b}
</div>
  1. 論理演算
AND: ${condition1 && condition2} または ${condition1 and condition2}
OR: ${condition1 || condition2} または ${condition1 or condition2}
NOT: ${!condition} または ${not condition}
  1. URL構築
<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>
  1. 暗黙オブジェクト
  1. pageContext: PageContextオブジェクト
  2. pageScope: pageスコープの属性マップ
  3. requestScope: requestスコープの属性マップ
  4. sessionScope: sessionスコープの属性マップ
  5. applicationScope: applicationスコープの属性マップ
  6. param: リクエストパラメータマップ
  7. paramValues: 複数値のリクエストパラメータマップ
  8. header: リクエストヘッダーマップ
  9. headerValues: 複数値のリクエストヘッダーマップ
  10. cookie: Cookieマップ
  11. initParam: コンテキスト初期化パラメータマップ
  1. <c:import>タグと<jsp:include>アクションの違い
<c:import>:
- 外部リソースも含めてインポート可能
- URLを変数に格納可能
- より柔軟な機能

<jsp:include>:
- 同じWebアプリケーション内のリソースのみ
- 実行時にインクルード
- シンプルなケース向け
  1. 三項演算子
${condition ? 'valueIfTrue' : 'valueIfFalse'}
例: ${user != null ? user.name : 'ゲスト'}
  1. プロパティ設定
<c:set target="${bean}" property="propertyName" value="${value}"/>
<!-- 
    * beanはターゲットオブジェクト
    * propertyNameはsetPropertyName()メソッドに対応 
-->
  1. 日付フォーマット
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
  1. 例外処理
<c:catch var="exception">
    <%-- 例外が発生する可能性のある処理 --%>
    ${1 / 0}
</c:catch>
<c:if test="${exception != null}">
    エラーが発生しました: ${exception.message}
</c:if>
  1. コレクション/配列アクセス
リスト: ${list[0]}
配列: ${array[0]}
Map: ${map['key']} または ${map.key}
  1. カスタムタグ属性
<!-- 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>
  1. 文字列操作関数
<%@ 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)}

上級問題解答

  1. ELカスタム関数
// 関数クラス
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')}
  1. タグボディ処理
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());
    }
}
  1. 安全なネストプロパティアクセス
${user?.address?.city}
<!-- * null安全なアクセス(JSP 2.3以降) -->

<c:if test="${not empty user and not empty user.address}">
    ${user.address.city}
</c:if>
  1. 動的属性決定
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を使用して動的処理
    }
}
  1. SQLタグベストプラクティス
  1. 本番環境では使用を避け、DAO層を利用する
  2. 使用する場合は必ずデータソースを利用
  3. SQLインジェクション対策として<c:param>を使用
  4. トランザクション管理を適切に行う
  5. 接続リソースを確実に解放
  1. JSTLとカスタムタグの使い分け

JSTLを使用するケース: – 標準的な表示ロジック(ループ、条件分岐など) – フォーマット処理 – 一般的な文字列操作 カスタムタグを使用するケース: – 複雑な再利用可能なUIコンポーネント – 特定のビジネスロジックをカプセル化 – 特殊な表示要件がある場合 – 複数のJSPで共通して使用する複雑なロジック ベストプラクティス: 1. まずJSTLで解決できないか検討 2. カスタムタグは本当に必要な場合のみ作成 3. タグライブラリは適切にドキュメント化 4. 単一責任の原則に従う