JSTL の導入で躓いたこと

Eclipse 2023-06 で,課題のソースコードを入力しても,動作しない問題が発生したので,備忘録も兼ねてこちらに書き残しておきます。私と同じ症状に悩む方の助けになれば幸いです。

まずは,この記述にエラーが出ました。

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

エラーの内容は,

Can not find the tag library descriptor for “http://java.sun.com/jstl/

core”

でした。この原因は,ほとんどの場合は WEB-INF/lib/ 内に,JavaServer Pages Standard Tag Library(JSTL)の 2 つの jar ファイル:

  • taglibs-standard-jstlel-1.2.5.jar
  • taglibs-standard-impl-1.2.5.jar

これらがコピーされていないことです。コピーすれば,エラーは消えるのですが,実行してみると,

HTTPステータス 500 – Internal Server Error


メッセージ java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator

説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。

例外

jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

というエラーを出力してしまいます。

これは,TOMCAT 10 以降の環境で,JavaServer Pages Standard Tag Library を実行しているために起こっているエラーだ,ということがわかるのに,丸 1 日かかりました。というのも,この記事を書いている時点では,おそらくほとんどの人がいまだ TOMCAT 9 環境で JavaServer Pages Standard Tag Library を利用しており,TOMCAT 10 以降の環境用に書き換える話題がネット上にほとんど上がっていなかったからです。これは,日本語圏・英語圏問わず同じ状況でした。

それで,どうすればよいかというと,JavaServer Pages Standard Tag Library の代わりに Jakarta Standard Tag Library を利用すればよい,とのことでした。ここで紛らわしいのは,両者ともに略称は JSTL であるという点です。そういうわけで JSTL の最新版を探すのですが,これがなかなかみつかりません。公式サイトにもダウンロードのリンクがありませんでした。散々探し回って,ようやく見つけたのが,以下のサイトでした。

このサイトのダウンロードリンクがどこにあるのか,わかりにくいです。ページ中央部の table 内の,Files 行に「jar」というボタンがあって,これをクリックするとダウンロードできる,ということに,丸 1 日ぐらい気づきませんでした。そもそも,JSTL の最新版のファイルなど使う人がまったくおらず,世の中に存在しているのかどうかすらはっきりとわからなかった,という事情もあり,10 回目ぐらいの訪問でようやく気づきまひた。これをプロジェクトの WEB-INF/lib/ フォルダにコピーして,コードをビルドすると,とりあえずは動作するようになりました。

c:forEach に,problem(「!」マーク)が表示されてしまうのですが,動作自体は問題ないようです。エラーの内容は,

Multiple annotations found at this line:
	- A problem was encountered using TagExtraInfo class org.apache.taglibs.standard.tei.ForEachTEI for 
	 'c:forEach'
	- A problem was encountered using TagExtraInfo class org.apache.taglibs.standard.tei.ForEachTEI for 
	 'c:forEach'

とのことなのですが,今のところ解決策はわかりません。JSTL を単体で導入するというのは,私のような学習途中の人間しかやらないことのようなので,そのうち学習がすすむと,何か大きなパッケージを導入するとともに,このあたりの問題は解消するのかもしれません。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

“JSTL の導入で躓いたこと” への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です