この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:8
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: org.apache.jasper.JasperException: ...The jsp:param action must not be...
SEOタイトル: JSP「The jsp:param action must not be」エラーの原因と正しい使い方

この記事の要点
  • <jsp:param><jsp:include> / <jsp:forward> / <jsp:params>子要素としてのみ使える
  • メッセージ: The jsp:param action must not be used outside of jsp:include / jsp:forward / jsp:params
  • 原因: 単独で <jsp:param> を書いた / 別タグの中に書いた
  • 対処: 親 <jsp:include page="child.jsp">...</jsp:include> でラップ
  • 子 JSP では ${param.title} または request.getParameter() で受け取る
  • URL クエリパラメータ ?title=foo と同じ request.parameter に乗る

このエラーの典型

org.apache.jasper.JasperException: /index.jsp(15,4)
    The jsp:param action must not be used outside of jsp:include,
    jsp:forward or jsp:params.
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(...)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(...)
    ...

<jsp:param>他のアクションタグの内側でのみ意味を持ち、それ以外の場所で書くとコンパイル時に弾かれます。

NG パターン

<%-- ❌ NG: 単独で書いている --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
    <jsp:param name="title" value="Top" />  <%-- ← JasperException --%>
    <h1>${param.title}</h1>
</body>
</html>

<%-- ❌ NG: c:if などの内側に直接 --%>
<c:if test="${true}">
    <jsp:param name="x" value="y" />        <%-- ← JasperException --%>
</c:if>

<%-- ❌ NG: jsp:useBean の中 --%>
<jsp:useBean id="foo" class="com.example.Foo">
    <jsp:param name="x" value="y" />        <%-- ← JasperException --%>
</jsp:useBean>

正しい使い方: jsp:include の子要素

<%-- ✅ OK: jsp:include の子として --%>
<%-- parent.jsp --%>
<jsp:include page="header.jsp">
    <jsp:param name="title" value="トップページ" />
    <jsp:param name="lang"  value="ja" />
</jsp:include>

<h1>本文</h1>

<jsp:include page="footer.jsp">
    <jsp:param name="year" value="2026" />
</jsp:include>

子 JSP 側で受け取る:

<%-- header.jsp --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<header>
    <%-- EL で受ける(推奨) --%>
    <h2><c:out value="${param.title}" /></h2>
    <p>lang: ${param.lang}</p>

    <%-- スクリプトレットで受ける(非推奨) --%>
    <% String t = request.getParameter("title"); %>
</header>

正しい使い方: jsp:forward の子要素

<%-- ✅ OK: 別 JSP に転送する際にパラメータを付ける --%>
<c:if test="${user == null}">
    <jsp:forward page="/login.jsp">
        <jsp:param name="redirect" value="/mypage" />
        <jsp:param name="message"  value="ログインが必要です" />
    </jsp:forward>
</c:if>

使えるアクションタグ一覧

タグ用途jsp:param 可
<jsp:include>実行時に別 JSP を取り込み
<jsp:forward>別 JSP / Servlet に転送
<jsp:params><jsp:plugin> 用のパラメータ束
<jsp:useBean>JavaBeans 生成×
<jsp:setProperty>Bean プロパティ設定×
<%@ include %> (静的)コンパイル時取り込み×(属性で渡せない)

静的 include との違い

方式タイミングパラメータ
<%@ include file="header.jsp" %>コンパイル時(ソース合体)不可
<jsp:include page="header.jsp" />実行時(別リクエスト的)<jsp:param> で渡せる

受け取り側の注意点

<%-- ⚠️ XSS 対策で必ずエスケープ --%>
<%-- ❌ NG: 生で出す --%>
<h1>${param.title}</h1>

<%-- ✅ OK: c:out で HTML エスケープ --%>
<h1><c:out value="${param.title}" /></h1>

<%-- ✅ OK: fn:escapeXml --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<h1>${fn:escapeXml(param.title)}</h1>

同じ名前のパラメータを複数渡す

<%-- 同名複数 --%>
<jsp:include page="list.jsp">
    <jsp:param name="tag" value="java" />
    <jsp:param name="tag" value="spring" />
    <jsp:param name="tag" value="jsp" />
</jsp:include>

<%-- list.jsp 側 --%>
<c:forEach var="t" items="${paramValues.tag}">
    <li>${t}</li>
</c:forEach>

FAQ

Q: モダンな書き方は?
A: 2026 時点では JSP は新規プロジェクトで非推奨。Spring Boot + Thymeleaf / JSF / React + REST が主流。既存システム保守でのみ JSP を扱うのが現実的です。

Q: jsp:param の value に式を書ける?
A: value=&quot;${user.name}&quot; のように EL が使えます。スクリプトレット <%= %> も可。

Q: include した子 JSP でセッション属性は共有される?
A: 同じリクエストなので ${sessionScope.xxx}, ${requestScope.xxx} は共有されます。jsp:param はリクエストパラメータに追加するもの。