我会尝试尽可能具体,尽可能多地提供信息。
我的计算机上安装了tomcat 7,位于C:\ myproject \ tomcat
我在C:\ Program Files \ java \ jdk1.7.0_04安装了JDK 1.7.0_04
JRE_HOME = C:\ Program Files \ Java \ jdk1.7.0_04
CLASSPATH = C:\ myproject \ tomcat \ bin \ bootstrap.jar; C:\ myproject \ tomcat \ bin \ tomcat-juli.jar
在jdk1.7.0_04 \ jre \ lib \ ext文件夹中,我有文件servlet-api.jar,我需要运行任何servlet。
在我的C:\ myproject \ tomcat \ conf \ web.xml文件中,我有标签
servlet标记
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>loginpackage.LoginServlet</servlet-class>
</servlet>
servlet-mapping标签
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
我认为这是必需的,因此可以找到localhost:9999 / javawork / LoginServlet。
我有一个名为javawork的网络应用程序位于C:\ myproject \ tomcat \ webapps \ javawork
在那里我有一个文件夹test_login,其中包含我的JSP文件,包括LoginPage.jsp:
<%@ page language="java" contentType="text/html; charset=windows-1256" pageEncoding="windows-1256"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
<title>Login Page</title>
</head>
<body>
<form action="../LoginServlet">
Please enter your username
<input type="text" name="un"/><br>
Please enter your password
<input type="password" name="pw"/>
<input type="submit" value="submit">
</form>
</body>
</html>
在javawork中我有一个带有lib和classes文件夹的WEB-INF文件夹,我在我的oracle驱动程序的lib文件夹中有几个jar文件。在classes文件夹中,我有一个loginpackage文件夹,在里面我有我的LoginServlet.java文件和LoginServlet.class文件。我使用Eclipse IDE编译它,它将.class文件放入文件夹javawork / bin / WEB-INF / classes / loginpackage文件夹中,然后将.class文件移动到主WEB-INF文件夹结构中,使其位于同一目录中作为.java文件。
LoginServlet.java:
package loginpackage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
try
{
UserBean user = new UserBean();
user.setUserName(request.getParameter("un"));
user.setPassword(request.getParameter("pw"));
user = UserDAO.login(user);
if (user.isValid())
{
HttpSession session = request.getSession(true);
session.setMaxInactiveInterval(60);
session.setAttribute("currentSessionUser",user);
session.setAttribute("sessUserName", user.getUsername());
session.setAttribute("userID",user.getUserID());
response.sendRedirect("userlogged.jsp"); //logged-in page
}
else
response.sendRedirect("invalidlogin.jsp"); //error page
}
catch (Throwable theException)
{
System.out.println(theException);
}
}//end doGet
}//End LoginServlet Class
我打开命令提示符并转到C:\ myproject \ tomcat \ bin并运行启动文件,以便运行tomcat服务器。
我转到http://localhost:9999/javawork/test_login/LoginPage.jsp
,加载很好。我在框中输入用户名和密码,然后单击“提交”按钮。它试图转到http://localhost:9999/javawork/LoginServlet?un=u&pw=p
(你和我输入的是p),我收到以下错误:
例外
java.lang.NoClassDefFoundError: loginpackage/LoginServlet (wrong name: WEB-INF/classes/loginpackage/LoginServlet)
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:791)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2889)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1170)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:461)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:309)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1812)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
java.lang.Thread.run(Thread.java:722)
我认为一切都正确排列,所以我不确定为什么会出现这个错误。拜托,非常感谢任何帮助,但是我已经坚持了一天以上,并且需要让它继续工作以继续工作的下一部分工作。感谢。
答案 0 :(得分:2)
你说:
在我的C:\ myproject \ tomcat \ conf \ web.xml文件中,我有标签......
据我所知,您必须在项目的mapping
中输入servlet的web.xml
值,而不是在您给出的路径中的值。
如果您尚未在web.xml
中创建YourProject/WEB-INF/web.xml
,请先创建它并输入值:
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>loginpackage.LoginServlet</servlet-class>
</servlet>
servlet-mapping标签
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
在里面。 (Here is a simple web.xml
file)祝你好运!
答案 1 :(得分:1)
您应该在项目的C:\ myproject \ tomcat \ webapps \ javawo \ WEB-INF \ web.xml文件中有servlet条目,而不是在C:\ myproject \ tomcat \ conf \ web.xml文件中。
答案 2 :(得分:0)
我弄清楚问题是什么。
“我使用Eclipse IDE编译它,它将.class文件放入文件夹javawork / bin / WEB-INF / classes / loginpackage文件夹中,然后将.class文件移动到主WEB-INF文件夹结构中与.java文件位于同一目录中。“
当我在Eclipse中编译类并且.class文件被放入指定的文件夹时,它在类中的某处设置路径。因此,当我将文件移动到我需要它们的文件夹时,它不会找到它们,因为它在它们编译到的文件夹中查找它们。我不得不在命令提示符下使用javac编译器将我的.class文件编译到与.java源文件相同的文件夹中。一旦我这样做,我就能运行我的代码。
现在我只需要使用Eclipse来使它将我的文件编译到正确的文件夹,所以我不必用javac手动编译它们。