我的第一个servlet出了问题

时间:2013-07-02 04:10:40

标签: java servlets

这是我的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.

请建议正确运行我的应用的方法...

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

按照以下步骤

  • 在webapps文件夹下,为您的webapp创建一个新文件夹。 的HelloWorld
  • 在HelloWorld下创建另一个名为WEB-INF的文件夹。
  • 在WEB-INF下,创建一个名为classes的文件夹。
  • 在WEB-INF下,放入你的web.xml。
  • 在classes文件夹下创建包结构com / HelloWorld
  • 将您的类文件放在classes / com / HelloWorld文件夹
  • 重新启动tomcat

答案 2 :(得分:0)

不建议使用默认包,总是将servlet和类放在某个包中。假设您有一个包com.practiceHelloWorld servlet,然后您的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是与web.xml中定义servlet相同的注释,而"/HelloWorld"是url模式

答案 3 :(得分:0)

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

它应采用以下格式

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

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

主机:端口/ MyWebApp / HelloWorld的

答案 4 :(得分:-1)

我也面临同样的问题。我解决了以下问题。 IDE Eclipse Photon

转到此路径: 生成路径>配置生成路径>源

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

project name[]/WebContent/WEB-INF/classes

尝试一下,有时无法正常工作。 如果不起作用,请使用Public static void main(String[] args)创建一个新的Java程序,然后将该项目作为Java应用程序运行,这样您的项目将更新并创建一个新的.class文件:
new .class file will be created