这是我的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.
请建议正确运行我的应用的方法...
答案 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)
按照以下步骤
答案 2 :(得分:0)
不建议使用默认包,总是将servlet和类放在某个包中。假设您有一个包com.practice
和HelloWorld
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)