运行 我的第一个 servlet 程序使用 netbeans 时出现内部 500 错误

Getting Internal 500 error while running my 1st servlet prog using netbeans

我正在尝试创建我的第一个 servlet 程序,但是当 运行 我的 servlet 时,我收到内部服务器 500 错误,说 Error instantiating servlet class and

异常:-

javax.servlet.ServletException: Error instantiating servlet class [com.servlets.MyFirstServlet]
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:844)

Root cause:-

java.lang.RuntimeException: 
    com.servlets.MyFirstServlet.<init>(MyFirstServlet.java:1)
    java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:844)

是否需要设置环境变量?如果是这样,请指导我如何做到这一点。这是我的目录。

enter image description here

这是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">
    
    <!--servlet defn-->
    <servlet>
        <servlet-name>First</servlet-name>
        <servlet-class>com.servlets.MyFirstServlet</servlet-class>
    </servlet>
    
    <!--servlet mapping--> 
    <servlet-mapping>
        <servlet-name>First</servlet-name>
        <url-pattern>/web</url-pattern>
    </servlet-mapping>
        
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

和我的 servlet class:-

package com.servlets;

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


public class MyFirstServlet implements Servlet {
    ServletConfig conf;
    
    @Override
    public void init(ServletConfig conf) throws ServletException {
        this.conf = conf;
        System.out.println("Creating servlet object ...Inside init method");
    }

    @Override
    public ServletConfig getServletConfig() {
    return this.conf;
    }

    @Override
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
        System.out.println("Inside Service Method...");
    }

    @Override
    public String getServletInfo() {
    return "This servlet is created by Ashish Raj...";
    }

    @Override
    public void destroy() {
        System.out.println("Inside Destroy method...going to destroy servlet");
    }
    
}

请与我合作,我是新手...:)

最终 Netbeans 不知道如何正确构建它。它正在尝试直接 运行 您的 Java 文件,但它无法做到这一点。

我可以推荐一个更简单的开始吗?我不确定您从哪里获得该 servlet 代码,但它很可能不是您想要的。您需要两个文件,放在非常特定的目录中。

首先,在这个项目的开发区域的根目录下,您需要一个名为 pom.xml 的文件。它包含:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.servlet</groupId>
    <artifactId>servlet-example</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

同样,这是您项目的根目录。接下来,您需要您的 servlet。它住在 src/main/java/com/example/servlet 并且有:

package com.example.servlet;

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

@WebServlet(name = "MyFirstServlet", urlPatterns = "/web")
public class MyFirstServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("in doPost()");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("in doGet()");
    }
}

最后,为了帮助您 IDE,您应该创建目录 src/main/webapp/WEB-INF。那里什么都没有,但它告诉 Netbeans 这是一个普通的网络应用程序。

因此您的整个目录将如下所示:

.
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── servlet
        │               └── MyFirstServlet.java
        └── webapp
            └── WEB-INF

将其导入 Netbeans。如果 Netbeans 要求,它是一个 Maven 项目。

当您 运行 这将在网络应用程序中。因此,例如,当我 运行 时,它 Tomcat 将其放入 servlet-example-1.0.0-SNAPSHOT webapp。这意味着要访问我必须去 http://localhost:8080/servlet-example-1.0.0-SNAPSHOT/web 的服务。 /web 部分在您的 servlet 中的 urlPatterns 参数中定义。请注意,servlet-example-1.0.0-SNAPSHOT 部分可能会有所不同,具体取决于 Netbeans 为您构建它的方式。