Tomcat 中的 Servlet 映射和部署
Servlet Mapping and deploying in Tomcat
我正在开发一个简单的基于 servlet 的 Web 应用程序。我没有使用任何 IDE。以下是我遵循的步骤。
文件夹结构:
MyAPP -> 包含 WEB-INF 文件夹和 index.html
WEB-INF 包含 2 个文件夹和 web.xml。
loginServlet.java 的路径:MyAPP\WEB-INF\classes\servletclass\loginServlet.java
WEB_INF 包含包含 servlet-api.jar
的 lib 文件夹
index.html 包含一个表单,表单的 action 属性包含 "login" 作为值。
MyAPP\WEB-INF\web.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>servletclass.loginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
使用命令提示符编译 loginServlet.java。它创建了一个 loginServlet.class 文件。
现在使用命令提示符构建一个 war 文件并将其部署到 Tomcat 服务器上。
现在,当我 运行 应用程序时,它会成功加载 index.html。但是一旦点击表单中的提交按钮就会显示以下错误:
java.lang.NoClassDefFoundError: servletclass/loginServlet (wrong name: loginServlet)
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(Unknown Source)
java.security.SecureClassLoader.defineClass(Unknown Source)
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2260)
org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:803)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1244)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1109)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:456)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1452)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Unknown Source)
Alan 说得对,你的 Java 文件中是否有以下声明?
package servletclass;
我正在开发一个简单的基于 servlet 的 Web 应用程序。我没有使用任何 IDE。以下是我遵循的步骤。
文件夹结构:
MyAPP -> 包含 WEB-INF 文件夹和 index.html
WEB-INF 包含 2 个文件夹和 web.xml。
loginServlet.java 的路径:MyAPP\WEB-INF\classes\servletclass\loginServlet.java
WEB_INF 包含包含 servlet-api.jar
的 lib 文件夹
index.html 包含一个表单,表单的 action 属性包含 "login" 作为值。
MyAPP\WEB-INF\web.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>servletclass.loginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> </web-app>
使用命令提示符编译 loginServlet.java。它创建了一个 loginServlet.class 文件。
现在使用命令提示符构建一个 war 文件并将其部署到 Tomcat 服务器上。
现在,当我 运行 应用程序时,它会成功加载 index.html。但是一旦点击表单中的提交按钮就会显示以下错误:
java.lang.NoClassDefFoundError: servletclass/loginServlet (wrong name: loginServlet) java.lang.ClassLoader.defineClass1(Native Method) java.lang.ClassLoader.defineClass(Unknown Source) java.security.SecureClassLoader.defineClass(Unknown Source) org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2260) org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:803) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1244) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1109) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:456) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1452) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Unknown Source)
Alan 说得对,你的 Java 文件中是否有以下声明?
package servletclass;