[解決済み] JSTLをインストールするには?絶対 URI: http://java.sun.com/jstl/core は解決できません。
質問
何が悪かったのかわかりませんが、JSTLをインクルードできません。jstl-1.2.jarはあるのですが、残念ながら例外が発生してしまいます。
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:315)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:492)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1439)
at org.apache.jasper.compiler.Parser.parse(Parser.java:137)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:170)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
持っています。
-
pom.xml
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
-
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
-
index.jsp
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <html> <head></head> <body></body> </html>
解決方法は?
<ブロッククオートorg.apache.jasper.JasperException: 絶対URIが http://java.sun.com/jstl/core web.xml またはこのアプリケーションと共に配布された jar ファイルで解決できません。
このURIはJSTL 1.0用ですが、実際にはJSTL 1.2を使用しており、URIにさらに
/jsp
のパスが必要です(EL式を発明したJSTLは、プレーンなJSPでもELロジックを共有・再利用できるように、バージョン1.1からJSPの一部として統合されたからです)。
そこで、タグリブのURIを次のように修正します。 JSTL ドキュメント :
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
さらに 絶対確実 複数の異なるバージョンの JSTL JAR ファイルを一緒にランタイムのクラスパスに投げ込まないこと。これは、Tomcat ユーザーの間でかなりよくある間違いです。Tomcatの問題は、JSTLが最初から提供されていないため、手動でインストールしなければならないことです。これは、通常のJakarta EEサーバーでは必要ありません。以下もご参照ください。 Java EEとは一体何なのか?
あなたの場合、pom.xml は基本的に jstl-1.2.jar と standard-1.1.2.jar を一緒に持っていることを伝えています。これは間違っています。基本的に、Oracle の JSTL 1.2 API+impl と Apache の JSTL 1.1 impl を混ぜていることになります。JSTL の実装はひとつに絞るべきです。
Tomcat 10+にJSTLをインストールする
すでにTomcat 10またはそれ以降(Jakartifiedの最初のバージョン。
jakarta.*
パッケージの代わりに
javax.*
パッケージ)、JSTL 2.0 を使用するには、次のようにします。
単独
依存関係があります。
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
非Mavenユーザは、以下の2つの物理ファイルを
/WEB-INF/lib
フォルダを作成します。
絶対に
標準*.jarや緩い.tldファイルをそこに落とすこと!必要なら削除してください)。
- jakarta.servlet.jsp.jstl-2.0.0.jar (EE4JのJSTL 2.0インプリです。)
- jakarta.servlet.jsp.jstl-api-2.0.0.jar (これはJSTL 2.0 APIです)
Tomcat 9にJSTLをインストールする
Tomcat 10ではなく、Tomcat 9以前のバージョンをお使いの場合は、以下の手順でJSTL 1.2をご利用ください。 単独 依存関係 (これは Tomcat 9 / 8 / 7 / 6 / 5 と互換性がありますが、それ以前はありません)。
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>1.2.6</version>
</dependency>
非Mavenユーザは、以下の2つの物理ファイルを
/WEB-INF/lib
フォルダを作成します。
絶対に
標準*.jarや緩い.tldファイルをそこに落とすこと!必要なら削除してください)。
- jakarta.servlet.jsp.jstl-1.2.6.jar (EE4JのJSTL 1.2インプリです。)
- jakarta.servlet.jsp.jstl-api-1.2.7.jar (これはJSTL 1.2 のAPIです)
通常のJEEサーバーにJSTLをインストールする
Tomcat, Jetty, Undertow などのベアボーンサーブレットコンテナではなく、 WildFly, Payara, TomEE, GlassFish, WebSphere, OpenLiberty, WebLogic などの通常の Jakarta EE サーバを使っている場合は、明示的に JSTL をインストールする必要は全くありません。通常の Jakarta EE サーバー
すでに
は、JSTLをそのまま提供します。言い換えれば、JSTL を
pom.xml
また、JAR/TLDファイルをwebappにドロップする必要もありません。単に
provided
スコープされたJakarta EE座標で十分です。
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version><!-- 9.0.0, 8.0.0, etc depending on your server --></version>
<scope>provided</scope>
</dependency>
web.xmlのバージョンが正しいことを確認する
さらに
web.xml
はconformと宣言されています。
少なくとも
Servlet 2.4、つまりServlet 2.3以前のバージョンではありません。さもなければ、JSTLタグの中のEL式が動作しなくなります。ターゲットとなるコンテナにマッチする最も高いバージョンを選択し、その上で
<!DOCTYPE>
を、あなたのどこにでも
web.xml
. 以下は、Servlet 5.0 (Tomcat 10) 互換の例です。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<!-- Config here. -->
</web-app>
そして、Servlet4.0(Tomcat9)互換の例です。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- Config here. -->
</web-app>
こちらもご覧ください。
- JSTLコアタグライブのドキュメント (正しいタグリブのURIのために)
- JSPで評価されないEL式
- Tomcat 10+ または Tomcat 9- 用に pom.xml を設定する方法
関連
-
Serious: End event threw exception java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedM
-
java オープンソースフレームワーク統合 Context initialization failed の共通エラー。
-
[解決済み] JSPページでサーブレットを呼び出す方法
-
[解決済み] JSTLでのif-elseオプションの使用方法
-
[解決済み] クッキーとセッションの違い?
-
[解決済み] JSTLをインストールするには?絶対 URI: http://java.sun.com/jstl/core は解決できません。
-
[解決済み] 別のJSPファイルをインクルードする
-
[解決済み] jsp の出力から空白を取り除く
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Serious: End event threw exception java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedM
-
java オープンソースフレームワーク統合 Context initialization failed の共通エラー。
-
[解決済み] JSPページでサーブレットを呼び出す方法
-
[解決済み] JSTLでのif-elseオプションの使用方法
-
[解決済み] クッキーとセッションの違い?
-
[解決済み] JSTLをインストールするには?絶対 URI: http://java.sun.com/jstl/core は解決できません。
-
[解決済み] 別のJSPファイルをインクルードする
-
[解決済み] jsp の出力から空白を取り除く