如何安装jstl?绝对uri:http://java.sun.com/jstl/core 无法解析

zu0ti5jz  于 2021-06-29  发布在  Java
关注(0)|答案(16)|浏览(534)

我不知道我做错了什么,但我不能包括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 ```

javax.servlet
servlet-api
2.5
provided


javax.servlet.jsp
jsp-api
2.1
provided

cuxqih21

cuxqih211#

@巴鲁斯克是完全正确的,但如果你仍然遇到这个例外,这意味着你做错了什么。您将在so jstl tag info页面上找到最重要的信息。
基本上,这是您需要做什么来处理这个异常的摘要。
检查web.xml中的servlet版本: <web-app version="2.5"> 检查此servlet版本是否支持jstl版本:servlet版本2.5使用jstl 1.2,servlet版本2.4使用jstl 1.1
servlet容器必须具有适当的库,或者必须在应用程序中手动包含它。例如:jstl1.2需要jstl-1.2.jar
如何处理tomcat 5或6:
您需要将适当的jar包含到您的webinf/lib目录(它将只对您的应用程序有效)或tomcat/lib目录(将对所有应用程序全局有效)。
最后一件事是jsp文件中的taglib。对于jstl 1.2,正确的方法是:

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

nr7wwzry2#

我发现了这种错误的另一个原因:在我的例子中,有人设置了 conf/catalina.properties 设置 tomcat.util.scan.StandardJarScanFilter.jarsToSkip 属性到 * 避免日志警告消息,从而跳过tomcat的必要扫描。将其改回tomcat默认值并添加适当的jar跳过列表(不包括jstl-1.2或springwebmvc)解决了这个问题。

mi7gmzs6

mi7gmzs63#

我只是想添加我为这个问题找到的修复程序。我不知道为什么会这样。我有正确版本的jstl(1.2)和正确版本的ServletAPI(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>

我也有正确的地址,在我的网页上建议在这个线程,这是

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

解决这个问题的方法是从pom中的xml文件中删除jstl1.2依赖项的scope标记。同样,我不知道为什么会修复它,但是如果有人在pluralsight上用jpa和hibernate做spring教程,并且他们的pom是这样设置的,请尝试删除scope标记,看看是否修复了它。就像我说的对我有用。

bhmjp9jg

bhmjp9jg4#

2020年的答案

这个问题仍然很受欢迎,但所有的答案都严重过时了。所有javaee组件都被分割成了不同的jakarta项目,jstl也不例外。因此,以下是今天正确的maven依赖项:

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

是的,版本和groupid不匹配,但这是项目当前状态的一个怪癖。

vltsax25

vltsax255#

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" %>

另外,请检查您添加的依赖关系jar javax.servlet.jar 以及 javax.servlet.jsp.jstl-1.2.1.jar 或者不在web inf/lib文件夹中。就我而言,这两个人解决了问题。

h7appiyu

h7appiyu6#

我已经提到pom.xml中的maven依赖是错误的。应该是的

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

6uxekuva7#

这对我有用

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

0ejtzxu18#

添加 jstl-1.2.jar 进入 tomcat/lib 文件夹。
这样,依赖性错误将再次得到修复。

dgenwo3n

dgenwo3n9#

通过选择以下选项解决了ibm rad 7.5中的类似问题:
项目属性
项目方面
jstl复选框

ercv8c1e

ercv8c1e10#

我也遇到了同样的问题,我正在使用eclipse,以防其他人遇到同样的问题:
在eclipse中双击tomcat服务器,
停止服务器
取消勾选“不发布服务器模块”
启动服务器。

p1iqtdky

p1iqtdky11#

这个问题的所有答案都对我有所帮助,但我想我应该为后代补充一些额外的信息。
结果发现我对 gwt-test-utils 带来了 gwt-dev 包裹。不幸的是 gwt-dev 包含jetty、jsp、jstl等的完整副本,这些副本在类路径上的正确包之前。因此,即使我对JSTL1.2有适当的依赖关系,它也会将1.0版本加载到 gwt-dev . 发牢骚。
对我来说,解决方案是不使用测试范围运行,这样我就不会拿起 gwt-test-utils 运行时的包。卸下 gwt-dev 以其他方式从类路径得到的包也可以解决这个问题。

6mw9ycah

6mw9ycah12#

下载jstl-1.2.jar
将此指令添加到页面: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 将jar文件粘贴到webinf/lib文件夹中。这应该管用(这对我很有效。)

n6lpvg4x

n6lpvg4x13#

只是在eclipse中修复了类似的问题:

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

以前我在编辑pom.xml时被什么东西踢了出来
我有所有需要的jar文件,tagliburi和web.xml都可以

z18hc3ub

z18hc3ub14#

org.apache.jasper.jasperexception:绝对uri:http://java.sun.com/jstl/core 无法在web.xml或与此应用程序一起部署的jar文件中解析
这个uri是针对JSTL1.0的,但实际上您使用的是JSTL1.2,它使用带有附加uri的uri /jsp path(因为发明el表达式的jstl从1.1版开始就作为jsp的一部分进行集成,以便在普通jsp中共享/重用el逻辑)。
因此,根据jstl文档相应地修复taglib uri:

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

此外,还需要绝对确保不要将多个不同版本的jstljar文件一起抛出到运行时类路径中。这在tomcat用户中是一个非常常见的错误。tomcat的问题是它不提供现成的jstl,因此您必须手动安装它。这在普通javaee服务器中是不必要的。另请参见什么是javaee?
在您的特定案例中,pom.xml基本上告诉您jstl-1.2.jar和standard-1.1.2.jar一起存在。这是错误的。基本上是将oracle的JSTL1.2API+impl与apache的JSTL1.1impl混合在一起。你需要移除任何 standard-.jar . 只不过是 jstl-1.2.jar 足够了。

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

非maven用户可以通过将物理jstl-1.2.jar文件放到 /WEB-INF/lib web应用程序项目的文件夹(绝对不要将standard.jar或任何松散的.tld文件放在其中!)。必要时将其拆下。
如果您实际使用的是普通的javaee服务器,如wildfly、payara等,而不是像tomcat、jetty等这样的基本servletcontainer,那么您根本不需要显式安装jstl。普通的javaee服务器已经提供了现成的jstl。换句话说,您不需要将jstl添加到 pom.xml 也不能在webapp中删除任何jar/tld文件。唯一的 provided 范围足够:

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

此外,您还应该确保 web.xml 声明至少符合Servlet2.4,因此不是Servlet2.3或更早版本。否则jstl标记中的el表达式将无法工作。选择与目标容器匹配的最高版本,并确保没有 <!DOCTYPE> 你生活中的任何地方 web.xml . 下面是一个与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>

另请参见:

jstl核心taglib文档(用于正确的taglib uri)
jstl标签信息页(用于jstl下载链接和 web.xml (示例)

mbzjlibv

mbzjlibv15#

如果您使用Spring Boot,请考虑将其拆下 server.tomcat.additional-tld-skip-patterns=*.jarApplication.properties 如果有的话

相关问题