0

这是我的servlet的代码......

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

public class HelloWorld extends HttpServlet {
    private String message;

    public void init(){
        message="Hello World";
    }
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>"+message+"</h1>");
    }

    public void destroy(){
    }
}

我正在使用xampp的tomcat 7

这是我的 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_3_0.xsd"
  version="3.0"
 metadata-complete="true">

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

我的 web.xml 位于 %TOMCAT_HOME%/webapps/ROOT/WEB_INF 目录中,我的 HelloWorld.class 位于 %TOMCAT_HOME%/webapps/ROOT/WEB_INF/classes 目录中。

当我尝试从浏览器运行我的文件时,我输入

http://localhost:8080/HelloWorld

在地址栏中,出现以下 Servlet 异常

type Exception report

message

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

exception

javax.servlet.ServletException: Error instantiating servlet class HelloWorld
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:724)

root cause

java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/HelloWorld/HelloWorld)
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClass(ClassLoader.java:752)
    java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2820)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1150)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:724)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.21 logs.

请建议一种正确运行我的应用程序的方法...

4

5 回答 5

6

不要使用默认(空)包;而是给它一个名字......

package com.xyz;
...
public class HelloWorld extends HttpServlet

更新 web.xml 以反映新包...

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.xyz.HelloWorld</servlet-class>
</servlet>

确保 servlet 类文件位于...

WEB-INF/classes/com/xyz/HelloWorld.class
于 2013-07-02T04:23:09.577 回答
0

我不知道您为什么只是键入 servlet 映射 url 来调用您的 Web 应用程序,如下所示。 http://localhost:8080/HelloWorld

它应该采用以下格式

http://localhost:8080/your-web-application-name/url-pattern

例如,假设您在名为 MyWebApp 的 Web 应用程序上调用 HelloWorld url 映射。它应该被称为如下。

主机:端口/MyWebApp/HelloWorld

于 2013-07-02T07:23:13.473 回答
0

请按照以下步骤操作

  • 在 webapps 文件夹下,为您的 webapp 创建一个新文件夹。你好世界
  • 在 HelloWorld 下创建另一个名为 WEB-INF 的文件夹。
  • 在 WEB-INF 下,创建一个名为 classes 的文件夹。
  • 在 WEB-INF 下,放置您的 web.xml 。
  • 在 classes 文件夹下创建你的包结构 com/HelloWorld
  • 将您的类文件放在 classes/com/HelloWorld 文件夹下
  • 重启tomcat
于 2013-07-02T04:24:56.663 回答
0

不鼓励使用默认包,请始终将您的 servlet 和类放在某个包中。假设你有包com.practiceHelloWorldservlet 然后你web.xml就变成了

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.practice.HelloWorld</servlet-class>
</servlet>

如果您在com.practice包中定义 servlet,即路径应该是WEB-INF/classes/com/practice/HelloWorld

此外,如果您使用的是 tomcat 7,那么您根本不必在 web.xml 中使用 servlet 映射。您可以简单地使用注释。例如

@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
    private String message;

    public void init() {
        message = "Hello World";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>" + message + "</h1>");
    }

    public void destroy() {
    }
}

WebServlet是等同于在中定义servlet的注释,是web.xmlurl"/HelloWorld"模式

于 2013-07-02T04:25:15.337 回答
-1

我也面临同样的问题。我解决了这个问题如下。IDE Eclipse 光子

转到此路径:构建路径>配置构建路径>源

更改“默认输出文件夹”的路径:[项目名称]/WebContent/WEB-INF/classes

项目名称[]/WebContent/WEB-INF/classes

试试这个,有时它不会工作。如果它不起作用,请创建一个新的 Java 程序Public static void main(String[] args)并将该项目作为 Java 应用程序运行,以便您的项目将更新并创建一个新的 .class 文件:
将创建新的 .class 文件

于 2018-07-16T15:31:21.917 回答