Làm thế nào để cài đặt JSTL? Uri tuyệt đối: http://java.sun.com/jstl/core không thể được giải quyết


134

Tôi không biết những gì tôi đã làm không chính xác, nhưng tôi không thể bao gồm JSTL. Tôi có jstl-1.2.jar, nhưng tiếc là tôi gặp ngoại lệ:

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)

Tôi có:

  • 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>
    

4
Tôi đã phải thêm sự phụ thuộc của taglibs bên cạnh jstl và chỉ hoạt động.
Christian Vielma

Câu trả lời:


193

org.apache.jasper.JasperException: Uri tuyệt đối: http://java.sun.com/jstl/core không thể được giải quyết trong tệp web.xml hoặc tệp jar được triển khai với ứng dụng này

URI đó dành cho JSTL 1.0, nhưng thực tế bạn đang sử dụng JSTL 1.2, sử dụng URI với một /jspđường dẫn bổ sung (vì JSTL, người đã phát minh ra các biểu thức EL, từ phiên bản 1.1 được tích hợp như một phần của JSP để chia sẻ / sử dụng lại logic EL trong Đồng bằng cũng vậy).

Vì vậy, hãy sửa URI taglib phù hợp dựa trên tài liệu JSTL :

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

Hơn nữa, bạn cần chắc chắn rằng bạn không ném nhiều tệp JSTL JARL phiên bản khác nhau vào đường dẫn lớp thời gian chạy. Đây là một lỗi khá phổ biến trong số người dùng Tomcat. Vấn đề với Tomcat là nó không cung cấp JSTL ngoài hộp và do đó bạn phải tự cài đặt nó. Điều này là không cần thiết trong các máy chủ Java EE bình thường. Xem thêm Chính xác Java EE là gì?

Trong trường hợp cụ thể của bạn, pom.xml của bạn về cơ bản cho bạn biết rằng bạn có jstl-1.2.jar và standard-1.1.2.jar cùng nhau. Cái này sai. Về cơ bản, bạn đang trộn JSTL 1.2 API + impl từ Oracle với JSTL 1.1 impl từ Apache. Bạn cần loại bỏ bất kỳ standard-xxx.jar. Chỉ duy nhất những jstl-1.2.jarlà đủ.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Người dùng không phải Maven có thể đạt được điều tương tự bằng cách thả tệp jstl-1.2.jar vật lý vào /WEB-INF/libthư mục của dự án ứng dụng web ( tuyệt đối không bỏ tập tin standard.jar hoặc bất kỳ tệp .tld lỏng lẻo nào trong đó!). Loại bỏ chúng nếu cần thiết.

Trong trường hợp bạn thực sự đang sử dụng một máy chủ Java EE bình thường như WildFly, Payara, v.v. thay vì một bộ điều khiển dịch vụ barebones như Tomcat, Jetty, v.v., thì bạn không cần phải cài đặt JSTL một cách rõ ràng. Các máy chủ Java EE thông thường đã cung cấp JSTL. Nói cách khác, bạn không cần thêm JSTL vào pom.xmlhoặc bỏ bất kỳ tệp JAR / TLD nào trong ứng dụng web. Hoàn toàn providedtọa độ Java EE có phạm vi là đủ:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version><!-- 8.0, 7.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

Hơn nữa, bạn cũng nên đảm bảo rằng bạn web.xmlđược tuyên bố tuân thủ ít nhất là Servlet 2.4 và do đó không phải là Servlet 2.3 trở lên. Nếu không, các biểu thức EL bên trong các thẻ JSTL sẽ không hoạt động. Chọn phiên bản cao nhất phù hợp với thùng chứa mục tiêu của bạn và đảm bảo rằng bạn không có <!DOCTYPE>nơi nào trong đó web.xml. Đây là một ví dụ tương thích với Servlet 4.0 (Tomcat 9):

<?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>

Xem thêm:


Tôi đã thay đổi đến / jsp và: org.apache.jasper.JasperException: Các uri tuyệt đối: java.sun.com/jsp/jstl/core không thể giải quyết trong một trong hai web.xml ....
lukastymo

4
Sau đó, classpath của bạn là một mớ hỗn độn. Dọn dẹp nó Tôi không biết maven đang làm gì và nó có thông minh không, nhưng đối với JSTL 1.2, bạn không cần standardtaglib. Đọc trang thông tin thẻ để biết thêm chi tiết.
BalusC

4
Tôi thực sự thích trang wiki JSTL mà bạn đặt cùng nhau. Tuy nhiên, vì câu hỏi này là câu trả lời hàng đầu từ Google cho thông báo lỗi cụ thể, tôi sẽ tự do chỉnh sửa nó và lưu ý rằng URI "không phải jsp" là từ JSTL 1.0.
kdgregory

2
@kdgregory: Cảm ơn bạn :)
BalusC

1
nếu bạn đang sử dụng Gradle, hãy thêm phần phụ thuộc này:compile('javax.servlet:jstl:1.2')
benscabbia

36

@BalusC hoàn toàn đúng, nhưng nếu bạn vẫn gặp phải ngoại lệ này, điều đó có nghĩa là bạn đã làm sai điều gì đó. Thông tin quan trọng nhất bạn sẽ tìm thấy là trên trang Thông tin thẻ SO JSTL .

Về cơ bản đây là một bản tóm tắt những gì bạn cần làm để đối phó với ngoại lệ này.

  1. Kiểm tra phiên bản servlet trong web.xml: <web-app version="2.5">

  2. Kiểm tra xem phiên bản JSTL có được hỗ trợ cho phiên bản servlet này không: Phiên bản Servlet 2.5 sử dụng JSTL 1.2 hoặc phiên bản Servlet 2.4 có sử dụng JSTL 1.1 không

  3. Container servlet của bạn phải có thư viện thích hợp hoặc bạn phải đưa nó vào ứng dụng theo cách thủ công. Ví dụ: JSTL 1.2 yêu cầu jstl-1.2.jar

Phải làm gì với Tomcat 5 hoặc 6:

Bạn cần đưa các jar thích hợp vào thư mục WEB-INF / lib của bạn (nó sẽ chỉ hoạt động cho ứng dụng của bạn) hoặc cho tomcat / lib (sẽ hoạt động trên toàn cầu cho tất cả các ứng dụng).

Điều cuối cùng là một taglib trong các tệp jsp của bạn. Đối với JSTL 1.2 đúng, đây là:

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

3
Tôi nhận thấy rằng câu hỏi này khá phổ biến (nhiều người xem). Vì vậy, đây là lý do tại sao tôi quyết định viết hướng dẫn ngắn về cách giải quyết vấn đề này
lukastymo

17

Tôi tìm thấy một lý do khác cho loại lỗi: trong trường hợp của tôi, ai đó thiết lập các conf/catalina.propertiesthiết lập tomcat.util.scan.StandardJarScanFilter.jarsToSkiptài sản cho *đến thông điệp cảnh báo tránh log, do đó bỏ qua quá trình quét cần thiết bởi Tomcat. Thay đổi này trở lại mặc định Tomcat và thêm một danh sách các lọ thích hợp để bỏ qua (không bao gồm jstl-1.2 hoặc spring-webmvc) đã giải quyết vấn đề.


Đúng!. Tôi cũng vậy. Một số người (= bản thân tôi) tại một số điểm đưa tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* vào catalina.propertiestệp trong một nỗ lực (hiểu lầm?) Để tăng tốc thời gian khởi động Tomcat. Arghh!
peterh

Tôi sử dụng tập lệnh sau để tạo danh sách jarsToSkip để tránh TLD và bình phân đoạn web: pastebin.com/3Bfm1u6K
Moreaki 17/07/18

1
Nếu bạn không muốn thay đổi jarsToSkipcài đặt của mình , bên dưới nó có jarsToScancài đặt ghi đè mọi thứ vào jarsToSkip. Chúng tôi đã kết thúc việc thêm taglibs*.jarvào jarsToScancác taglib của chúng tôi taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.jar.
jabe

1
Đây là câu trả lời làm việc cho tôi. Trong conf/catalina.properties, tôi đã thay đổi tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jarđến tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jarvà cố định nó.
Gary S.

15
jstl-1.2.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl-1.1.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

cũng vui lòng kiểm tra các lọ phụ thuộc mà bạn đã thêm javax.servlet.jarjavax.servlet.jsp.jstl-1.2.1.jarkhông có trong thư mục WEB-INF / lib của bạn. Trong trường hợp của tôi hai điều này đã giải quyết vấn đề.


bạn có thể xin vui lòng có một cái nhìn tại các câu hỏi ở đây [ stackoverflow.com/questions/44039706/...
Kasun Siyambalapitiya

10
  1. Tải xuống jstl-1.2.jar
  2. Thêm chỉ thị này vào trang của bạn: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. Dán tệp JAR vào thư mục WEB-INF / lib của bạn. Điều này nên làm việc. (Nó làm việc cho tôi.)


9

Thêm jstl-1.2.jarvào tomcat/libthư mục.

Với điều này, lỗi phụ thuộc của bạn sẽ được sửa chữa một lần nữa.


3

Tôi đã đề cập rằng sự phụ thuộc Maven trong pom.xml là sai. Nó nên

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

Thật thú vị, khi tôi tìm kiếm jstl trong maven, tôi thấy mình ở: mvnreposective.com/artifact/javax.servlet.jsp.jstl/jstl/1.2 Làm thế nào bạn tìm thấy sự phụ thuộc này?
Koray Tugay

3

Tôi chỉ muốn thêm bản sửa lỗi tôi tìm thấy cho vấn đề này. Tôi không chắc tại sao điều này làm việc. Tôi đã có phiên bản chính xác của jstl (1.2) và cũng là phiên bản chính xác của servlet-api (2.5)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Tôi cũng đã có địa chỉ chính xác trong trang của mình như được đề xuất trong chủ đề này, đó là

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

Điều đã khắc phục vấn đề này đối với tôi là xóa thẻ phạm vi khỏi tệp xml của tôi trong pom cho phụ thuộc jstl 1.2 của tôi. Một lần nữa không chắc chắn tại sao điều đó đã sửa nó nhưng chỉ trong trường hợp ai đó đang thực hiện mùa xuân với hướng dẫn JPA và Hibernate về số nhiều và thiết lập pom của họ theo cách này, hãy thử xóa thẻ phạm vi và xem liệu có khắc phục được không. Giống như tôi đã nói nó làm việc cho tôi.


2

Tôi đã vô hiệu hóa hoàn toàn các công cụ MAVEN và Spring. Và tôi đã phải thêm các bình sau đây để làm cho môi trường của tôi hoạt động tốt.

  • mùa xuân-aop-4.0.3.RELEASE.jar
  • spring-bean-4.0.3.RELEASE.jar (khó tìm ra cách khắc phục này, org.springframework khác <3.versions> vừa không hoạt động.
  • mùa xuân-bối cảnh-4.0.3.RELEASE.jar
  • spring-core-4.0.3.RELEASE.jar
  • biểu thức mùa xuân-4.0.3.RELEASE.jar
  • mùa xuân-web-4.0.3.RELEASE.jar
  • mùa xuân-webmvc-4.0.3.RELEASE.jar
  • jstl-1.2.jar

Điều tồi tệ nhất trong tất cả là jstl-api-1.2.jarjavax-servlet.jsp.jst-api-1.2.1.jar. Họ chỉ không làm việc.

jstl-1.2.jar làm việc tốt.


1
+1 Sau khi đập đầu vào tường trong nhiều giờ, sử dụng jstl-1.2thay vì jstl-1.2.1làm việc cho tôi, và tôi không biết tại sao.
avojak

1

Nếu bạn sử dụng khởi động mùa xuân, xem xét để loại bỏ server.tomcat.additional-tld-skip-patterns=*.jartừ Application.propertiesnếu có bất kỳ


0

Tất cả các câu trả lời trong câu hỏi này đã giúp tôi nhưng tôi nghĩ tôi sẽ thêm một số thông tin bổ sung cho hậu thế.

Hóa ra tôi đã có một sự phụ thuộc thử nghiệm gwt-test-utilsmà nó mang lại trong gwt-devgói. Thật không may, gwt-devcó một bản sao đầy đủ của Jetty, JSP, JSTL, v.v. trước các gói thích hợp trên đường dẫn lớp. Vì vậy, mặc dù tôi có các phụ thuộc phù hợp vào JSTL 1.2, nó sẽ tải phiên bản 1.0 bên trong gwt-dev. Càu nhàu

Giải pháp cho tôi là không chạy với phạm vi thử nghiệm vì vậy tôi không nhận gwt-test-utilsgói khi chạy. Loại bỏ gwt-devgói khỏi đường dẫn theo một số cách khác cũng sẽ khắc phục vấn đề.


0

Đã có vấn đề tương tự trong Eclipse được khắc phục với:

rightclick on project->Properties->Deployment Assembly->add Maven Dependencies

một cái gì đó đã loại nó ra trước đó, trong khi tôi đang chỉnh sửa pom.xml của mình

Tôi đã có tất cả các tệp jar cần thiết, taglib uri và web.xml đều ổn


0

Câu trả lời cho năm 2020

Câu hỏi vẫn còn rất phổ biến, nhưng tất cả các câu trả lời đã lỗi thời nghiêm trọng. Tất cả các thành phần Java EE đã được tách ra thành các dự án khác nhau ở Jakarta và JSTL cũng không khác. Vì vậy, đây là các phụ thuộc Maven chính xác cho đến ngày hôm nay:

<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>1.2.7</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>1.2.6</version>
</dependency>

Đúng, các phiên bản và groupIds không khớp nhau, nhưng đó là một sự giải thích về tình trạng hiện tại của dự án .


-1

Điều này làm việc cho tôi

    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>

-1

Tôi gặp vấn đề tương tự, tôi đang sử dụng nhật thực, chỉ trong trường hợp những người khác gặp vấn đề tương tự:
Trong nhật thực, nhấp đúp vào máy chủ tomcat,
dừng máy chủ
bỏ chọn "mô-đun máy chủ mà không xuất bản"
khởi động máy chủ.

nhập mô tả hình ảnh ở đây


-2

Đã giải quyết vấn đề tương tự trong IBM RAD 7.5 bằng cách chọn:

  1. Dự án bất động sản
  2. Khía cạnh dự án
  3. Hộp kiểm JSTL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.