0

我会尽量做到具体并提供尽可能多的信息。

我在 C:\myproject\tomcat 的计算机上安装了 tomcat 7

我在 C:\Program Files\java\jdk1.7.0_04 安装了 JDK 1.7.0_04

JRE_HOME = C:\Program Files\Java\jdk1.7.0_04

类路径 = 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-name>LoginServlet</servlet-name>
    <servlet-class>loginpackage.LoginServlet</servlet-class>
</servlet>

servlet 映射标记

<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 文件。在类文件夹中,我有一个 loginpackage 文件夹,其中有我的 LoginServlet.java 文件和 LoginServlet.class 文件。我使用 Eclipse IDE 编译它,它将 .class 文件放入文件夹 javawork/bin/WEB-INF/classes/loginpackage 文件夹中,并将 .class 文件移动到主 WEB-INF 文件夹结构中以位于同一目录中作为 .java 文件。

登录Servlet.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(u 和 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)

我认为一切都正确排列,所以我不确定为什么会出现此错误。拜托,任何帮助将不胜感激,因为我已经坚持了一天多,并且需要让它继续工作以继续我工作的下一部分。谢谢。

4

3 回答 3

2

你说:

在我的 C:\myproject\tomcat\conf\web.xml 文件中,我有标签...

好吧,据我所知,您必须mapping在项目中输入 servlet 的值,而web.xml不是位于您给出的路径中的值。

如果您还没有创建web.xmlinYourProject/WEB-INF/web.xml然后先创建它并输入值:

<servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>loginpackage.LoginServlet</servlet-class>
</servlet>

servlet 映射标记

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

在里面。(这是一个简单的web.xml文件)祝你好运!

于 2012-06-08T17:30:20.290 回答
1

您应该在项目的 C:\myproject\tomcat\webapps\javawo\WEB-INF\web.xml 文件中有 servlet 条目,而不是在 C:\myproject\tomcat\conf\web.xml 文件中。

于 2012-06-08T17:30:33.023 回答
0

我弄清楚了问题所在。

“我使用 Eclipse IDE 编译它,它将 .class 文件放入文件夹 javawork/bin/WEB-INF/classes/loginpackage 文件夹中,我将 .class 文件移动到主 WEB-INF 文件夹结构中以保持相同目录作为 .java 文件。”

当我在 Eclipse 中编译类并将 .class 文件放入指定的文件夹时,它会在类中的某处设置路径。因此,当我将文件移动到我需要它们所在的文件夹时,它不会找到它们,因为它正在它们编译到的文件夹中寻找它们。我必须在命令提示符下使用 javac 编译器将我的 .class 文件编译到与 .java 源文件相同的文件夹中。一旦我这样做了,我就可以运行我的代码了。

现在我只需要使用 Eclipse 来让它将我的文件编译到正确的文件夹中,因此我不必使用 javac 手动编译它们。

于 2012-06-13T17:36:19.737 回答