【问题标题】:Embedded Jetty Server - NO JSP Support for /, did not find org.apache.jasper.servlet.JspServletEmbedded Jetty Server - NO JSP Support for /,没有找到 org.apache.jasper.servlet.JspServlet
【发布时间】:2014-10-06 13:20:56
【问题描述】:

我有以下代码来使用嵌入式 Jetty 服务器以及一个简单的 servlet 和 .jsp 网页。但是,编译运行代码后:

javac -cp lib/servlet-api.jar:lib/jetty-all.jar com/test/MyServlet.java 
javac -cp lib/servlet-api.jar:lib/jetty-all.jar com/test/ServerMain.java 
java -cp .:lib/servlet-api.jar:lib/jetty-all.jar com/test/ServerMain

我收到一个错误:

INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet

导航到 /index.jsp 会出现 500 错误。

HTTP ERROR 500
Problem accessing /index.jsp. 
Reason:
JSP support not configured

我已阅读此post,但我认为该解决方案不适用于此处,因为我运行的是嵌入式 Jetty 而不是使用 start.jar。

如何解决此错误,以便服务器能够成功运行并提供 .jsp 页面?

ServerMain.java

package com.test;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

public class ServerMain {

    public static void main(String[] args) throws InterruptedException {

        Server server = new Server(8080);
        WebAppContext webApp = new WebAppContext();
        webApp.setDescriptor("web.xml");
        webApp.setResourceBase("");
        webApp.setParentLoaderPriority(true);
        server.setHandler(webApp);

        try {
            server.start();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
        server.join();
    }
}

MyServlet.java

package com.test;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        resp.setContentType("text/plain");
        resp.getWriter().println("Hello, this is a testing servlet. \n\n");
        Properties p = System.getProperties();
        p.list(resp.getWriter());

    }
}

web.xml

   <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC "-//Oracle Corporation//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.test.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

这是我的项目结构:

webapp
----com
    ----test
        ----MyServlet.java
        ----ServerMain.java
        ----index.jsp
        ----web.xml
----lib
    ----jetty-all.jar
    ----servlet-api.jar  

【问题讨论】:

  • 你需要用类名调用java,所以com.test.ServerMain而不是com/test/ServerMain(javac是正确的)
  • 感谢@msrd0,它实际上使用java com.test.ServerMainjava com/test/ServerMain 成功运行,但感谢您的提示。
  • 你确定你使用的库包含org.apache.jasper.servlet.JspServlet这个类吗? jar tf lib/servlet-api.jar 会有所帮助
  • 运行命令后,似乎在 lib/servlet-api.jar 或 lib/jetty-all.jar 中找不到 JspServlet 类。但是我在网上找到了一个包含该类的jar,在类路径中使用新jar重新编译,但错误仍然存​​在。
  • 你是否在运行时将它包含在类路径中?

标签: java jsp jetty embedded-jetty


【解决方案1】:

没有尝试过嵌入式 Jetty,但是在将 Jetty 9.3 作为服务运行时,您需要添加 JSP 支持。

cd $JETTY_BASE
$JAVA_HOME/bin/java -jar $JETTY_HOME/start.jar --add-to-startd=jsp

JETTY_BASE 是您部署应用程序的文件夹,它与JETTY_HOME 是分开的。所以我猜嵌入式 Jetty 需要类似的配置。

【讨论】:

  • 如何在 Java 代码中设置 JSP 支持?请问有样品吗?
  • JSP 可以正常工作。如果将 JSP 文件放在 webapps 根目录中的文件夹中,则可以直接运行它。然而,一些框架(如 Spring)可能需要一些额外的设置才能到达某个页面。
  • Nux,今晚你为我节省了很多时间。谢谢你。我不会怀疑像 JSP 这样的东西会是一个模块。 (码头新手)
  • --add-to-startd 已弃用!改为使用:--add-to-start=jsp
【解决方案2】:

您似乎缺少一个包含 org.apache.jasper.servlet.JspServlet 类的 JAR 文件。下载包含它的 JAR 文件(查看 here)并将其添加到您的类路径中。另外,附带说明一下,您应该将com/test/ServerMain 替换为真实的类名com.test.ServerMain。您的 java 语句应如下所示:

java -cp ".:lib/servlet-api.jar:lib/jetty-all.jar:lib/apache-jasper.jar" com.test.ServerMain

【讨论】:

  • 我应该把这个 JAR 放在哪里?
  • @HelpingHands 没关系,只要输入正确的路径作为 java 命令的类路径即可
【解决方案3】:

顺便说一句,有一个 github 项目,由 Jetty Project 维护,展示了 Jetty Embedded 中的 JSP 支持。

https://github.com/jetty-project/embedded-jetty-jsp

【讨论】:

  • 感谢@Joakim,环顾四周后,似乎需要许多 jar 文件依赖项才能让 jasper jsp 支持在码头内工作。我希望只有一个 jar 文件可供下载,以保持我的项目轻巧便携,但我找不到。最后决定 jsp 支持不值得额外的重量。
  • @Rob144 嘿,JSP 绝不是轻量级的。特别是如果您使用 Glassfish/Jasper 工件,则使用 Apache/Jasper 工件时会稍微少一些。
  • @Rob144 同样,jetty-all.jar 的使用是轻量级的对立面,它实际上包含了 Jetty 可用的所有东西和厨房水槽,其中大多数项目使用不到 30%。事实上,某些代码的结构方式,不可能在单个项目中使用 100% 的 jar(因为某些功能是可选的,一旦使用专门禁止使用其他功能)
  • @Rob144 jetty-all.jar 仅作为教具存在(在文档中引用),不适合生产使用。
【解决方案4】:

这里的所有答案都已弃用,这是您应该对 Jetty 11 执行的操作:

java -jar $JETTY_HOME/start.jar --add-module=jsp

【讨论】: