| この記事の要点 |
|
エラー内容
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
Struts 1 系(1.2 / 1.3)を使った JSP を表示したときに発生し、画面には HTTP 500 エラーとスタックトレースが表示されます。Tomcat などのログには、どの JSP の何行目で例外が起きたかが出力されるので、まずその行のタグを確認します。
発生条件と原因
html:form タグの内側で使用すべきタグ(例: html:text)を、html:form の外側に記述したときに発生するエラーです。
なぜ html:form の外だとエラーになるのか
Struts 1 の <html:form> タグは、開始タグの処理で次のことを行います。
- action 属性のパスから struts-config.xml のアクション定義を探す
- そのアクションに紐づくフォーム Bean(ActionForm)をリクエストやセッションから取得し、無ければ生成する
- 取得したフォーム Bean を、org.apache.struts.taglib.html.BEAN という名前でリクエストスコープに格納する(終了タグ
</html:form>の処理で取り除かれる)
<html:text>、<html:password>、<html:checkbox>、<html:select> などのフォーム部品タグは、name 属性を省略すると、この「org.apache.struts.taglib.html.BEAN」を探して値を取り出します。<html:form> の外ではこの Bean がまだ置かれていない(または終了タグで取り除かれた)ため、「どのスコープにも見つからない」というエラーになります。
原因の一覧
| 原因 | 確認ポイント |
|---|---|
フォーム部品タグが <html:form> の外にある | エラー行のタグが </html:form> より後ろ、または <html:form> より前にないか |
| インクルードした JSP や Tiles のタイルにフォーム部品がある | そのタイル・インクルードが <html:form> の開始タグと終了タグの間で読み込まれているか(ヘッダーやサイドバーのタイルに入力欄を置くと範囲外になりやすい) |
| HTML の入れ子が崩れている | テーブルやカスタムタグの途中で </html:form> が閉じられていないか |
対処法
1. フォーム部品タグを html:form の中に移す
html:text のようなタグは、html:form タグの内側に記述します。
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!-- NG: html:form の外にある -->
<html:text property="userId" />
<html:form action="/login">
<html:password property="password" />
<html:submit value="ログイン" />
</html:form>
<!-- OK: すべて html:form の中 -->
<html:form action="/login">
<html:text property="userId" />
<html:password property="password" />
<html:submit value="ログイン" />
</html:form>
taglib の uri は Struts 1.3 の例です。1.2 以前では /WEB-INF/struts-html.tld のように TLD ファイルを指定している場合もあります。
2. 分割した JSP はフォームの範囲内で読み込む
入力欄を共通部品として別 JSP や Tiles のタイルに切り出している場合は、その読み込み(<jsp:include>、<tiles:insert> など)を <html:form> と </html:form> の間に置きます。フォーム全体をレイアウトの外に出すより、フォームを 1 つのタイルにまとめて、その中で入力欄を組み立てる方が構造が分かりやすくなります。
3. name 属性で Bean を明示する
どうしても <html:form> の外で値を表示したい場合は、name 属性でスコープ上の Bean の名前(struts-config.xml の form-bean の name)を明示します。こうすると BEAN キーではなく指定した名前の Bean を探します。この場合、その Bean がリクエストまたはセッションに存在している必要があります。
<html:text name="loginForm" property="userId" />
値を表示するだけで入力欄が不要なら、<bean:write name="loginForm" property="userId" /> を使う方が意図に合っています。
よく似たエラーとの見分け方
<html:form> 自体の設定に問題があるときは、このエラーではなく別のメッセージになります。エラーメッセージの文言で切り分けると原因に早くたどり着けます。
| メッセージ | 主な原因 |
|---|---|
| Cannot find bean org.apache.struts.taglib.html.BEAN in any scope | フォーム部品タグが <html:form> の範囲外にある(この記事) |
| Cannot retrieve mapping for action ... | <html:form> の action 属性のパスが struts-config.xml の action 定義に存在しない |
| Cannot retrieve definition for form bean ... | action 定義の name 属性で指定したフォーム Bean が form-beans に定義されていない |
| Cannot find bean ... in any scope(BEAN 以外の名前) | <bean:write> などの name 属性で指定した Bean がリクエストやセッションに無い。Action クラスで request.setAttribute() しているか確認する |
最後の行のように、BEAN 以外の名前が表示されている場合は「タグの位置」ではなく「Action 側で Bean を用意していない」ことが原因です。画面に直接アクセスした(.do を経由せず JSP の URL を開いた)ために Action が実行されていない、というケースもよくあります。
確認方法
- ログのスタックトレースで、エラーが出た JSP のファイル名と行番号を確認する
- その行のタグと、
<html:form>の開始・終了位置の関係を確認する(インクルード元・先の両方) - 修正後、アプリケーションサーバーを再起動するか JSP の再コンパイルを待ってから再表示する
- Tomcat の work ディレクトリに古いコンパイル結果が残っている場合は削除してから確認する
補足: Struts 1 の現状
Struts 1 は 2013 年にサポート終了(End of Life)が告知されており、セキュリティ修正は提供されていません。既存システムの保守でこのエラーに出会うことが多いはずですが、改修の機会があれば Spring MVC など保守されているフレームワークへの移行も検討してください。
関連
- Struts1 カスタムタグ (taglib) 完全ガイド (bean/html/logic/nested)
- Struts1 の ActionForm とは?
- struts-config.xml の説明
- JSP タグ一覧と使い方完全ガイド
- Struts JSP タグ完全リファレンス(Struts 1/2 + Spring MVC への移行)
子ページはありません
- createActionFormにてNullPointerException
- java.lang.NullPointerException: Module 'null' not found
- javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
- Description Resource Path Location Type cvc-complex-type.2.4.a: Invalid content was found starting with element 'X'
- パス ... に対するアクションのインスタンスがありません
- TLDによると、タグ form の属性 id は無効です
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- djangoのテンプレートの作成とヘッダー・フッターの共通化 2026-10-03 21:41:49
- テンプレートフラグメント(ヘッダー等の共有化) 2026-10-03 21:41:49
- reCAPTCHA v3 使い方(サンプル付き) 2026-10-03 21:37:05
- Content-Type一覧|MIMEタイプとはとHTTPでの主な使用場面 2026-10-03 21:37:05
- SpringにおけるAOPの使い方 2026-10-03 21:37:05
- X (Twitter) API でツイートできないがエラーが出ない問題の原因と対処 2026-10-03 11:33:01
- X (Twitter) API アプリケーション登録完全ガイド|v2・Bearer Token・OAuth 2.0 PKCE 2026-10-03 11:33:01
- X (Twitter) API 完全ガイド|従量課金の料金・単価(2026年10月)と v2 移行 2026-10-03 11:32:40
- Google DeepMind とは?Gemini・AlphaFold の開発元 2026-10-03 11:26:56
- Cursor とは?AI 統合型コードエディタの使い方・料金 2026-10-03 11:26:56
- Claude (Anthropic) とは?AIチャットの使い方・モデルファミリ・API 2026-10-03 11:26:56
- AIベンダー一覧:OpenAI・Anthropic・Google DeepMind・Microsoft・Meta 2026-10-03 11:26:56
- クラウド・インフラ完全ガイド — AWS/Azure/GCP/Kubernetes 2026-10-03 11:26:56
- テキストエディタ完全比較 (VS Code / Cursor / Vim / Emacs / IDE) 2026-10-03 11:26:56
- プログラミング学習プラットフォーム|Scratch・micro:bit ほか 2026-10-03 11:26:56