Saya tidak tahu apa yang saya lakukan salah, tetapi saya tidak bisa memasukkan JSTL. Saya memiliki jstl-1.2.jar, tapi sayangnya saya mendapatkan pengecualian:
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)
Saya sudah:
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>
Jawaban:
URI itu untuk JSTL 1.0, tetapi Anda sebenarnya menggunakan JSTL 1.2 yang menggunakan URI dengan
/jsp
jalur tambahan (karena JSTL, yang menemukan ekspresi EL, sejak versi 1.1 terintegrasi sebagai bagian dari JSP untuk berbagi / menggunakan kembali logika EL di JSP polos juga).Jadi, perbaiki URI taglib sesuai dengan dokumentasi JSTL :
Selanjutnya Anda perlu memastikan bahwa Anda tidak membuang beberapa file JSTL JAR yang berbeda berversi bersama ke dalam classpath runtime. Ini adalah kesalahan yang cukup umum di antara pengguna Tomcat. Masalah dengan Tomcat adalah bahwa ia tidak menawarkan JSTL di luar kotak dan dengan demikian Anda harus menginstalnya secara manual. Ini tidak perlu di server Java EE normal. Lihat juga Apa sebenarnya Java EE?
Dalam kasus spesifik Anda, pom.xml Anda pada dasarnya memberi tahu Anda bahwa Anda memiliki jstl-1.2.jar dan standard-1.1.2.jar bersama-sama. Ini salah. Anda pada dasarnya mencampur JSTL 1.2 API + impl dari Oracle dengan JSTL 1.1 impl dari Apache. Anda harus menghapus semua
standard-xxx.jar
. Hanya saja yangjstl-1.2.jar
cukup.Pengguna non-Maven dapat mencapai hal yang sama dengan menjatuhkan file fisik jstl-1.2.jar dalam
/WEB-INF/lib
folder proyek aplikasi web (jangan sekali-kali tidak menjatuhkan file standard.jar atau file .tld yang longgar di sana!). Hapus mereka jika perlu.Jika Anda benar-benar menggunakan server Java EE normal seperti WildFly, Payara, dll, bukannya servebcontainer barebones seperti Tomcat, Jetty, dll, maka Anda tidak perlu menginstal JSTL sama sekali secara eksplisit. Server Java EE yang normal sudah menyediakan JSTL di luar kotak. Dengan kata lain, Anda tidak perlu menambahkan JSTL ke
pom.xml
atau untuk menjatuhkan file JAR / TLD apa pun di webapp. Semata-mataprovided
koordinat Java EE yang mencukupi sudah cukup:Selanjutnya Anda juga harus memastikan bahwa Anda
web.xml
dinyatakan sesuai setidaknya Servlet 2.4 dan dengan demikian tidak servlet 2.3 atau lebih tua. Kalau tidak, ekspresi EL di dalam tag JSTL pada gilirannya akan gagal berfungsi. Pilih versi tertinggi yang cocok dengan wadah target Anda dan pastikan Anda tidak memiliki<!DOCTYPE>
tempat di mana punweb.xml
. Inilah contoh kompatibel Servlet 4.0 (Tomcat 9):Lihat juga:
web.xml
contoh unduhan JSTL )sumber
standard
taglib. Baca halaman info tag untuk detail lebih lanjut.compile('javax.servlet:jstl:1.2')
@ BalusC sepenuhnya benar, tetapi Jika Anda masih menemukan pengecualian ini, itu berarti bahwa Anda telah melakukan kesalahan. Informasi paling penting yang akan Anda temukan adalah pada halaman Info Tag SO JSTL .
Pada dasarnya ini adalah ringkasan dari apa yang perlu Anda lakukan untuk menghadapi pengecualian ini.
Periksa versi servlet di web.xml:
<web-app version="2.5">
Periksa apakah versi JSTL didukung untuk versi servlet ini: Servlet versi 2.5 menggunakan JSTL 1.2 atau Servlet versi 2.4 menggunakan JSTL 1.1
Wadah servlet Anda harus memiliki perpustakaan yang sesuai, atau Anda harus memasukkannya secara manual dalam aplikasi Anda. Sebagai contoh: JSTL 1.2 membutuhkan jstl-1.2.jar
Apa yang harus dilakukan dengan Tomcat 5 atau 6:
Anda perlu memasukkan toples yang sesuai ke dalam direktori WEB-INF / lib Anda (ini hanya akan berfungsi untuk aplikasi Anda) atau ke tomcat / lib (akan berfungsi secara global untuk semua aplikasi).
Hal terakhir adalah taglib di file jsp Anda. Untuk JSTL 1.2 yang benar adalah ini:
sumber
Saya menemukan alasan lain untuk jenis kesalahan ini: dalam kasus saya, seseorang mengatur properti
conf/catalina.properties
pengaturan untuk menghindari pesan peringatan log, sehingga melewatkan pemindaian yang diperlukan oleh Tomcat. Mengubah ini kembali ke default Tomcat dan menambahkan daftar toples yang tepat untuk dilewati (tidak termasuk jstl-1.2 atau spring-webmvc) menyelesaikan masalah.tomcat.util.scan.StandardJarScanFilter.jarsToSkip
*
sumber
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*
ke dalamcatalina.properties
file dalam upaya (disalahpahami?) Untuk mempercepat waktu mulai Tomcat. Arghh!jarsToSkip
pengaturan Anda , di bawahnya adajarsToScan
pengaturan yang menimpa apa pun dijarsToSkip
. Kami akhirnya menambahkantaglibs*.jar
ke kamijarsToScan
sebagai taglibs kamitaglibs-standard-impl-1.2.5.jar
dantaglibs-standard-spec-1.2.5.jar
.conf/catalina.properties
, saya berubahtomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar
menjaditomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar
dan memperbaikinya.periksa juga stoples ketergantungan yang telah Anda tambahkan
javax.servlet.jar
danjavax.servlet.jsp.jstl-1.2.1.jar
atau tidak di folder WEB-INF / lib Anda. Dalam kasus saya, keduanya memecahkan masalah.sumber
Tambahkan
jstl-1.2.jar
ke dalamtomcat/lib
folder.Dengan ini, kesalahan ketergantungan Anda akan diperbaiki lagi.
sumber
Tambahkan arahan ini ke halaman Anda:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Rekatkan file JAR di folder WEB-INF / lib Anda. Ini seharusnya bekerja. (Ini berhasil untuk saya.)
sumber
Saya telah menyebutkan bahwa ketergantungan Maven di pom.xml salah. Harus
sumber
Saya hanya ingin menambahkan perbaikan yang saya temukan untuk masalah ini. Saya tidak yakin mengapa ini berhasil. Saya memiliki versi jstl yang benar (1.2) dan juga versi servlet-api yang benar (2.5)
Saya juga memiliki alamat yang benar di halaman saya seperti yang disarankan di utas ini, yaitu
Apa yang memperbaiki masalah ini bagi saya adalah menghapus tag lingkup dari file xml saya di pom untuk ketergantungan jstl 1.2 saya. Sekali lagi tidak yakin mengapa itu memperbaikinya tetapi kalau-kalau ada orang yang melakukan pegas dengan JPA dan tutorial Hibernate pada pluralsight dan memiliki pengaturan pom mereka dengan cara ini, coba hapus tag lingkup dan lihat apakah itu memperbaikinya. Seperti yang saya katakan itu bekerja untuk saya.
sumber
Saya telah menonaktifkan sepenuhnya alat MAVEN dan Spring. Dan saya harus menambahkan tabung berikut untuk membuat lingkungan saya berfungsi dengan baik.
Yang terburuk dari semuanya adalah
jstl-api-1.2.jar
danjavax-servlet.jsp.jst-api-1.2.1.jar
. Mereka tidak bekerja.jstl-1.2.jar
bekerja dengan baik.sumber
jstl-1.2
bukannyajstl-1.2.1
bekerja untuk saya juga, dan saya tidak tahu mengapa.Jika Anda menggunakan boot Spring, pertimbangkan untuk menghapus
server.tomcat.additional-tld-skip-patterns=*.jar
dariApplication.properties
jika adasumber
Semua jawaban dalam pertanyaan ini membantu saya, tetapi saya pikir saya akan menambahkan beberapa informasi tambahan untuk keturunan.
Ternyata saya memiliki tes ketergantungan
gwt-test-utils
yang membawagwt-dev
paket. Sayangnyagwt-dev
berisi salinan lengkap Jetty, JSP, JSTL, dll. Yang berada di depan paket yang sesuai di classpath. Jadi meskipun saya memiliki dependensi yang tepat pada JSTL 1.2 itu akan memuat versi 1.0 ke internalgwt-dev
. Ngomel.Solusi bagi saya adalah tidak menjalankan dengan cakupan uji jadi saya tidak mengambil
gwt-test-utils
paket saat runtime. Menghapusgwt-dev
paket dari classpath dengan cara lain juga akan memperbaiki masalah.sumber
Baru saja mengalami masalah serupa di Eclipse diperbaiki dengan:
sesuatu menendang keluar sebelumnya, ketika saya sedang mengedit pom.xml saya
Saya membutuhkan semua file jar, taglib uri dan web.xml ok
sumber
Jawaban untuk tahun 2020
Pertanyaannya masih sangat populer, tetapi semua jawaban sudah usang. Semua komponen Java EE terpecah menjadi berbagai proyek di Jakarta dan JSTL tidak berbeda. Jadi di sini adalah dependensi Maven yang benar pada hari ini:
Ya, versi dan groupIds tidak cocok, tapi itu kekhasan kondisi proyek saat ini .
sumber
Ini berhasil bagi saya
sumber
Saya memiliki masalah yang sama, saya menggunakan eclipse, kalau-kalau ada orang lain yang mengalami masalah yang sama:
Dalam eclipse klik dua kali server kucing jantan,
hentikan server
membuka centang "modul server tanpa penerbitan"
mulai server.
sumber
Mengatasi masalah serupa di IBM RAD 7.5 dengan memilih:
sumber