【问题标题】:Error: Wrapper cannot find servlet class com.HelloCedarville or a class it depends on错误:包装器找不到 servlet 类 com.HelloCedarville 或它依赖的类
【发布时间】:2014-04-21 08:42:45
【问题描述】:

所以我试图让一个简单的 Hello World 应用程序使用 Java servlet 工作。这是针对我正在学习的 Web Apps 课程的。我的问题是我不断收到一条错误消息,说找不到我的“HelloCedarville.class”文件。

我已经尝试了很多方法来让它发挥作用:

  1. 一开始我在没有java包的情况下尝试了这个,换句话说.class文件直接在/WEB-INF/classes下,但这不起作用。
  2. 接下来我尝试使用 java 包(因为许多类似问题的答案都建议使用 java 包)。我确保编译的java类“HelloCedarville.class”在/WEB-INF/classes/com下,并且那个“package com;”位于“HelloCedarville.java”的顶部。
  3. 我已多次检查我的“web.xml”文件,以确保我正确映射到 servlet。
  4. 我尝试重新编译java文件并重新测试,看看它是否能找到.class文件。
  5. 我尝试删除“HelloCedarville.java”和“HelloCedarville.class”并重新创建它们。

我只是不知道是什么导致了这个错误。这是完整的错误:

HTTP Status 500 - 

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Wrapper cannot find servlet class com.HelloCedarville or a class it depends on
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
    org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
    org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
    org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    java.lang.Thread.run(Thread.java:724)
root cause

java.lang.ClassNotFoundException: com.HelloCedarville
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
    org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
    org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
    org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    java.lang.Thread.run(Thread.java:724)

这是 web.xml 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <context-param>
     <param-name>driver</param-name>
     <param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  <context-param>
     <param-name>connection</param-name>
     <param-value>jdbc:mysql://john.cedarville.edu/cs4220</param-value>
  </context-param>
  <context-param>
     <param-name>username</param-name>
     <param-value>cs4220</param-value>
  </context-param>
  <context-param>
     <param-name>password</param-name>
     <param-value></param-value>
  </context-param>
   <servlet>
    <!-- Arbitrary servlet name -->
    <servlet-name>servlet2</servlet-name>
    <!-- The name of the class you want to run -->
   <servlet-class>com.HelloCedarville</servlet-class>
  </servlet>
  <servlet-mapping>
    <!-- Must match the same as above -->
    <servlet-name>servlet2</servlet-name>
    <!-- maps the servlet to a specific URL in this case it
    would be judah/<your login name>/servlet/RequestInfoExample -->
    <url-pattern>/HelloCedarville</url-pattern>
  </servlet-mapping>
  <servlet>
    <!-- Arbitrary servlet name -->
    <servlet-name>servlet</servlet-name>
    <!-- The name of the class you want to run -->
    <servlet-class>HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <!-- Must match the same as above -->
    <servlet-name>servlet</servlet-name>
    <!-- maps the servlet to a specific URL in this case it
    would be judah/<your login name>/servlet/RequestInfoExample -->
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>
</web-app>

这里是HelloCedarville.java的java代码:

package com;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloCedarville extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }   

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {

    doPost(request,response);
    }

    public void doPost(HttpServletRequest request, 
                                    HttpServletResponse response)
                    throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
                                      "Transitional //EN\">\n";
        out.println (docType + "<html>\n" + "<head><title>" + 
                           "Hello Cedarville</title></head>\n" + "<body>\n" +
                           "<h1>Hello Cedarville</h1>\n" + "</body></html>\n");
    }
}

【问题讨论】:

    标签: java spring http servlets


    【解决方案1】:

    您是否将其部署到 Tomcat?.. 编写 servlet 后,您需要将其部署到容器中,以便类加载器找到您的类。

    【讨论】:

    • 如何判断我是否将其部署到 Tomcat?那是我在 java 代码中做的事情吗?
    • 看来问题今天已经解决了。不知道发生了什么,但它现在有效,所以我很好。
    猜你喜欢
    • 2023-03-28
    • 2014-11-13
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多