【问题标题】:Automatically Update servlet-class in web.xml自动更新 web.xml 中的 servlet-class
【发布时间】:2017-08-04 16:06:17
【问题描述】:

我在 Eclipse 中有一个动态 Web 项目。我在项目中创建了一些新包并移动了一些 servlet。现在 servlet 不工作了,因为 web.xml 文件中的路径没有更新。 它抛出以下异常

Mar 14, 2017 10:45:12 AM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet ServletName as unavailable
Mar 14, 2017 10:45:12 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ServletName
java.lang.ClassNotFoundException: com.package.database.ServletName
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1062)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:813)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at com.jamonapi.http.JAMonTomcatValve.invoke(JAMonTomcatValve.java:67)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

异常说明了一切,servlet 的 web.xml 文件中的 <servlet-class> 不正确。如果我更新路径,它会起作用,但我移动的 servlet 很少。

是否可以自动更新整个 web.xml 文件以修复所有 <servlet-class>

【问题讨论】:

  • 也许您将“路径名”与“类名”混淆了?完全不同的东西!
  • 已更新...<servlet-class> 这就是它在 web.xml 中的名称

标签: java eclipse servlets


【解决方案1】:

我不认为 eclipse 可以自动更新所有路径,但如果您使用的是 Tomcat 7.0,那么您有一个解决方法,如 here 所述

Tomcat 7 是一个与 Servlet 3.0 兼容的容器。从 Servlet 3.0 开始,可以通过类上的 @WebServlet 注解来配置 servlet,而无需 web.xml 配置条目。仔细查看您刚刚创建的 servlet 类,上面有一个 @WebServlet 注释,其中包含您在 New Servlet 向导中指定的所有信息。

实际上,这种配置 servlet 的新方法

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {}

与配置 servlet 的传统方式完全相同

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

如果低于 3.0,您必须在项目属性的 Project Facets 部分中将动态 Web 模块版本更改为 3.0。

【讨论】:

  • 我正在使用 Tomcat 7.0,但这又是一项大工作,因为我必须将 @WebServlet annotation 添加到每个 Servlet,我可能会手动更新 web.xml。无论如何感谢您的帮助
猜你喜欢
  • 2015-09-07
  • 1970-01-01
  • 2015-03-01
  • 2012-04-17
  • 2012-08-22
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多