タイトル: org.apache.jasper.JasperException: ...The jsp:param action must not be...
SEOタイトル: JSP「The jsp:param action must not be」エラーの原因と正しい使い方
| この記事の要点 |
|
このエラーの典型
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="${user.name}" のように EL が使えます。スクリプトレット <%= %> も可。
Q: include した子 JSP でセッション属性は共有される?
A: 同じリクエストなので ${sessionScope.xxx}, ${requestScope.xxx} は共有されます。jsp:param はリクエストパラメータに追加するもの。