Tomcat 5.5找不到我的Servlet

时间:2010-07-07 23:45:58

标签: java tomcat servlets

我已将源代码编译到类Files中,然后将其放在文件夹中:

Tomcat 5.5\WEB-INF\ROOT\classes\Files.class

并将其添加到web.xml文件中:

<servlet>
    <servlet-name>Files</servlet-name>
    <servlet-class>Files</servlet-class>
</servlet>

但是当我尝试访问URL http://localhost:8080/Files时,我从Tomcat收到此错误: Tomcat 5.5 404 Error http://img251.imageshack.us/img251/5042/tomcat404.png


更新:添加<servlet-mapping>后,我现在收到以下错误:

exception

javax.servlet.ServletException: Error allocating a servlet instance
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1287)
java.lang.Thread.run(Unknown Source)

root cause

java.lang.NoClassDefFoundError: IllegalName: /Files
java.lang.ClassLoader.preDefineClass(Unknown Source)
java.lang.ClassLoader.defineClassCond(Unknown Source)
java.lang.ClassLoader.defineClass(Unknown Source)
java.security.SecureClassLoader.defineClass(Unknown Source)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1960)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:931)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1405)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1284)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1287)
java.lang.Thread.run(Unknown Source)

4 个答案:

答案 0 :(得分:3)

您还需要定义

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

将url模式与servlet匹配

答案 1 :(得分:3)

您还需要servlet-mapping:

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

答案 2 :(得分:3)

root cause
java.lang.NoClassDefFoundError: IllegalName: /Files

这意味着无法找到给定的类定义,因为它具有非法名称/Files。这反过来意味着您已将<servlet-class>更改为/Files。这是错的。您基本上是在指示servletcontainer声明并实例化servlet,如下所示:

/Files Files = new /Files();

这还不会编译。完整的映射应如下所示:

<servlet>
    <servlet-name>instanceName</servlet-name>
    <servlet-class>com.example.ServletClass</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>instanceName</servlet-name>
    <url-pattern>/urlPattern</url-pattern>
</servlet-mapping>

将在原始Java代码中解释如下:

com.example.ServletClass instanceName = new com.example.ServletClass();

<servlet-class>应表示完全限定的类名,包括任何包。 <servlet-name>应表示唯一实例名称<url-pattern>应表示servletcontainer应调用此servlet的 URL模式

答案 3 :(得分:0)

此外,在WEB-INF下的类类文件夹中,请确保创建一个名称与类的包名称相同的文件夹,并将所有类放在该文件夹中。在web.xml中,使用

<servlet> <servlet-name>File</servlet-name> <servlet-class>package.File</servlet-class> </servlet>

引用类文件夹中的servlet