无法在嵌入式 Jetty 服务器中加载 JSTL taglib

2022-09-03 12:21:19

我正在编写一个在嵌入式 Jetty 实例中运行的 Web 应用程序。

当我尝试执行 JSTL 语句时,我收到以下异常:

org.apache.jasper.JasperException: /index.jsp(1,63) PWC6188: Absolute uri: http://java.sun.com/jsp/jstl/core 无法在 web.xml 或与此应用程序一起部署的 jar 文件中解析

我在类路径上有以下jar

  • 蚂蚁-1.6.5.jar
  • 蚂蚁-1.7.1.jar
  • 蚂蚁发射器-1.7.1.jar
  • 酷睿-3.1.1.jar
  • 码头-6.1.22.jar
  • 码头-利用-6.1.22.jar
  • jsp-2.1-6.1.14.jar
  • jsp-api-2.1.jar
  • jstl-1.2.jar
  • servlet-api-2.5-20081211.jar
  • servlet-api-2.5-6.1.14.jar
  • 标准-1.1.2.jar

我的网页.xml看起来像这样:

<?xml version="1.0" encoding="ISO-8859-1"?>  
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee h77p://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  
    version="2.4">  
    <display-name>test</display-name>  
</web-app>

我的代码如下所示:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<html>  
    <body>  
        <h2>Hello World!</h2>  
        <%= new java.util.Date() %><br/>  
        ${1+2}<br/>  
        <c:out var="${5+9}"/><br/>  
    </body>  
</html>

我启动了我的嵌入式Jetty服务器,如下所示:

Server server = new Server(80);  
WebAppContext context = new WebAppContext("pig-1.0-SNAPSHOT.war","/");
server.addHandler(context);
server.start();

在过去的两天里,我尝试了jar文件,web.xml配置和标签库声明的各种组合,但无济于事。

如何在完全支持JSTL的情况下启动并运行嵌入式Jetty服务器?


答案 1

当您使用 jetty:run 时,Jetty 8.0 已作为默认值推送,它具有 servlet API 3.0。从该版本的标准开始,JSTL标准应该包括在内,并且这些taglib不能在webapp类路径中,只能位于标准类路径中。但是,8.0.0.M0 忘记包含它们。

指定 7.1.4.v20100610 对我很有帮助。


答案 2

jstl taglibs 必须位于服务器类路径上。在启动服务器之前,可以将类装入器添加到当前类装入器链中。这是启动时使用的原则.jar当它启动码头服务器时。

ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
URL urlTaglibs = new File(PATH_TO_TAGLIBS).toURI().toURL();
URLClassLoader newClassLoader = new URLClassLoader(new URL[]{urlTaglibs},currentClassLoader);
Thread.currentThread().setContextClassLoader(newClassLoader);

server.start();

您还应该将其添加到 java 启动命令行参数中。


推荐