java.lang.NoClassDefFoundError:loginpackage / LoginServlet(错误的名称:WEB-INF / classes / loginpackage / LoginServlet)

时间:2012-06-08 17:23:20

标签: java noclassdeffounderror

我会尝试尽可能具体,尽可能多地提供信息。

我的计算机上安装了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)

我认为一切都正确排列,所以我不确定为什么会出现这个错误。拜托,非常感谢任何帮助,但是我已经坚持了一天以上,并且需要让它继续工作以继续工作的下一部分工作。感谢。

3 个答案:

答案 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手动编译它们。