首页 > 解决方案 > JSP Servlet HTTP 状态 404 – 未找到

问题描述

这是我的第一篇文章。我希望有人可以帮助我=) 通常我会尝试自己找到解决此类问题的方法。但是这个问题让我很头疼...

使用下面 html 代码中的操作标记,我想启动 java servlet。可悲的是,我总是收到 HTTP 404 - Not found 错误。我已经尝试过编写/Login、../Login、Login(大写和小写)等等。

这是我的目录结构:

.
├── ps_18_gruppe09
│   └── src
│       ├── main
│       │   └── com.food42.servlet
│       │       └── LoginServelet.java
│       WebContent  
│       ├── html
│       │   └── login.jsp
│       └── WEB-INF
│           └── lib
│               └── web.xml

我已经尝试过在类似帖子上回答的解决方案,但遗憾的是它们没有帮助。

在我的 Java 构建路径中,我安装了以下库: Apache Tomcat v8.5 JRE System Library[jre1.8.0_201a] Web App Libraries MySQL JDBC Driver EAR Libraries JUnit5 log4j-1.2.17.jar

源文件夹是 ps_18_gruppe09/src/main

完整的错误信息:

HTTP 状态 404 – 未找到

类型状态报告

消息 /ps_18_gruppe09/登录

描述 源服务器没有找到目标资源的当前表示或不愿意透露存在的表示。

Apache Tomcat/8.5.35

提前感谢您的帮助 =)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletDBLog4j</display-name>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
   <context-param>
    <param-name>dbUser</param-name>
    <param-value>admin</param-value>
  </context-param>
  <context-param>
    <param-name>dbPassword</param-name>
    <param-value>Food42</param-value>
  </context-param>
  <context-param>
    <param-name>dbURL</param-name>
    <param-value>jdbc:mysql://localhost/</param-value>
  </context-param>
  <context-param>
    <param-name>log4j-config</param-name>
    <param-value>WEB-INF/lib/log4j.xml</param-value>
  </context-param>

  <error-page>
    <error-code>404</error-code>
    <location>/AppErrorHandler</location>
  </error-page>
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/AppErrorHandler</location>
  </error-page>

  <filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>com.food42.servlet.AuthenticationFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>
<%@ page contentType="text/html; charset=UTF-8" language="java" %>

<!DOCTYPE html>
<html lang="en">

<head>

<meta charset="utf-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">

<title>Food42 Login Page</title>

<!-- Bootstrap core CSS -->
<link href="../vendor/bootstrap/css/bootstrap.css" rel="stylesheet">

<!-- Custom fonts for this template -->
<link href="../vendor/fontawesome-free/css/all.min.css" rel="stylesheet"
    type="text/css">
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700"
    rel="stylesheet" type="text/css">
<link
    href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic"
    rel="stylesheet" type="text/css">

<!-- Plugin CSS -->
<link href="../vendor/magnific-popup/magnific-popup.css"
    rel="stylesheet" type="text/css">

<!-- Custom styles for this template -->
<link href="../css/freelancer.css" rel="stylesheet">

</head>

<body id="page-top">
    <!-- Navigation -->
    <nav
        class="navbar navbar-expand-lg bg-secondary fixed-top text-uppercase"
        id="mainNav">
        <div class="container">
            <a class="navbar-brand js-scroll-trigger" href="startseite.html">Food42</a>
            <button
                class="navbar-toggler navbar-toggler-right text-uppercase bg-primary text-white rounded"
                type="button" data-toggle="collapse" data-target="#navbarResponsive"
                aria-controls="navbarResponsive" aria-expanded="false"
                aria-label="Toggle navigation">
                Menu <i class="fas fa-bars"></i>
            </button>
            <div class="topnav">
                <input type="text" placeholder="Suchen...">
            </div>
            <form action="suchresultate.html">
                <input type="submit" value="Suchen" class="searchButton" />
            </form>
            <div class="collapse navbar-collapse" id="navbarResponsive">
                <ul class="navbar-nav ml-auto">
                    <li class="nav-item mx-0 mx-lg-1"><a
                        class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger"
                        href="register.html">Registrieren</a></li>
                </ul>
            </div>
        </div>
    </nav>

    <!-- Header -->
    <header class="masthead bg-primary text-white text-center"> </header>

    <!-- Portfolio Grid Section -->
    <section class="portfolio" id="portfolio">
        <div class="container">
            <h2 class="text-center text-uppercase text-secondary mb-0">Benutzer-Login</h2>
            <hr class="star-dark mb-5">
            <form action="${pageContext.request.contextPath}/Login" method="post">
                <h3 class="text-center">Bitte geben Sie Ihre Login-Daten ein:</h3>
                <fieldset class="container" style="width: 400px">
                    <table style="width: 400px">
                        <tr>
                            <th><label class="mt-2 mb-2" for="username">Username:</label></th>
                            <td><input type="text" id="username" name="username"
                                required autofocus /></td>
                        </tr>
                        <tr>
                            <th><label class="mt-2 mb-2" for="password">Password:</label></th>
                            <td><input type="password" id="password" name="password"
                                required /></td>
                        </tr>
                        <tr>
                            <th><label class="mt-2 mb-2" for="pwdconfirm">Best&auml;tigen:</label></th>
                            <td><input type="password" id="pwdconfirm" name="pwdconfirm"
                                required /></td>
                        </tr>
                        <tr>
                            <th><label class="mt-4 mb-3 " for="submit"></label> <input
                                type="submit" id="submit" name="submit" value="Login" /></th>
                        </tr>
                    </table>
                </fieldset>
            </form>
        </div>
    </section>

    <!-- Footer -->
    <footer class="footer text-center">
        <div class="container">
            <div class="row">
                <div class="col-md-4 mb-5 mb-lg-0">
                    <h4 class="text-uppercase mb-4">Location</h4>
                    <p class="lead mb-0">
                        ZHAW Winterthur <br>Technikum
                    </p>
                </div>
                <div class="col-md-4 mb-5 mb-lg-0">
                    <h4 class="text-uppercase mb-4">Around the Web</h4>
                    <ul class="list-inline mb-0">
                        <li class="list-inline-item"><a
                            class="btn btn-outline-light btn-social text-center rounded-circle"
                            href="https://www.facebook.com/Food42ch-954018978130563/?modal=admin_todo_tour">
                                <i class="fab fa-fw fa-facebook-f"></i>
                        </a></li>
                        <li class="list-inline-item"><a
                            class="btn btn-outline-light btn-social text-center rounded-circle"
                            href="https://twitter.com/Food42C?edit=true"> <i
                                class="fab fa-fw fa-twitter"></i>
                        </a></li>
                        <li class="list-inline-item"><a
                            class="btn btn-outline-light btn-social text-center rounded-circle"
                            href="https://www.linkedin.com/company/food42-ch/"> <i
                                class="fab fa-fw fa-linkedin-in"></i>
                        </a></li>
                    </ul>
                </div>
                <div class="col-md-4">
                    <h4 class="text-uppercase mb-4">Food42</h4>
                    <p class="lead mb-0">Share your food
                </div>
            </div>
        </div>
    </footer>

    <div class="copyright py-4 text-center text-white">
        <div class="container">
            <small>Copyright &copy; Food42 2018</small>
        </div>
    </div>

    <!-- Scroll to Top Button (Only visible on small and extra-small screen sizes) -->
    <div class="scroll-to-top d-lg-none position-fixed ">
        <a class="js-scroll-trigger d-block text-center text-white rounded"
            href="#page-top"> <i class="fa fa-chevron-up"></i>
        </a>
    </div>

    <!-- Bootstrap core JavaScript -->
    <script src="../vendor/jquery/jquery.min.js"></script>
    <script src="../vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

    <!-- Plugin JavaScript -->
    <script src="../vendor/jquery-easing/jquery.easing.min.js"></script>
    <script src="../vendor/magnific-popup/jquery.magnific-popup.min.js"></script>

    <!-- Contact Form JavaScript -->
    <script src="../js/jqBootstrapValidation.js"></script>
    <script src="../js/contact_me.js"></script>

    <!-- Custom scripts for this template -->
    <script src="../js/freelancer.min.js"></script>

</body>

</html>
package com.food42.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
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;

import org.apache.log4j.Logger;
import com.food42.util.User;

@WebServlet(name = "Login", urlPatterns = {"/Login"})
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    static Logger logger = Logger.getLogger(LoginServlet.class);

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String errorMsg = null;

        if(username == null || username.equals("")){
            errorMsg ="Username can't be null or empty";
        }

        if(password == null || password.equals("")){
            errorMsg = "Password can't be null or empty";
        }

        if(errorMsg != null){
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp");
            PrintWriter out= response.getWriter();
            out.println("<font color=red>"+errorMsg+"</font>");
            rd.include(request, response);
        } else {
        Connection con = (Connection) getServletContext().getAttribute("DBConnection");
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            ps = con.prepareStatement("select id, title, prename, lastname, dateofbirth, mail, signupdate from user where username=? and password=? limit 1");
            ps.setString(1, username);
            ps.setString(2, password);
            rs = ps.executeQuery();

            if(rs != null && rs.next()){

                User user = new User(rs.getString("lastName"), rs.getString("preName"), rs.getInt("id"), rs.getString("birthDate"), rs.getString("zip"), rs.getString("cityName"), rs.getString("street"), rs.getString("mail"), rs.getString("username"));
                logger.info("User found with details = " + user);
                HttpSession session = request.getSession();
                session.setAttribute("User", user);
                response.sendRedirect("/index.jsp");;
            } else {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp");
                PrintWriter out= response.getWriter();
                logger.error("User not found with username = " + username);
                out.println("<font color=red>No user found with given email id, please register first.</font>");
                rd.include(request, response);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            logger.error("Database connection problem");
            throw new ServletException("Database Connection problem.");
        } 
            finally{
                try {
                    rs.close();
                    ps.close();
                } catch (SQLException e) {
                    logger.error("SQLException in closing PreparedStatement or ResultSet");;
                }
            }
        }
    }
}

标签: javaxmljspservletsjakarta-ee

解决方案


我设法解决了这个问题。我会发布解决方案,也许它可以帮助有类似问题的人。

我不得不改变我的项目目录结构。我的问题是我将我的 java-packages 命名为com.example.test(在我的项目中com.food42.servlet),而不是为 com 创建一个目录,并在 com 目录中创建一个名为 example 的目录,依此类推。

前:

src
├── main
│   ├── com.food42.database
│   │   └── database.sql
│   ├── com.food42.servlet
│   │   ├── AuthenticationFilter.java
│   │   ├── LoginServlet.java
│   │   ├── LogoutServlet.java
│   │   └── RegisterServlet.java
│   ├── com.food42.servlet.errorhandler
│   │   └── AppErrorHandler.java
│   ├── com.food42.servlet.listeners
│   │   └── AppContextListener.java
│   └── com.food42.util
│       ├── DBConnectionManager.java
│       └── User.java
└── test
    └── TestLoginFilter.java

然后:

src
├── main
│   └── java
│       └── com
│           └── food42
│               ├── database
│               │   └── database.sql
│               ├── servlet
│               │   ├── AuthenticationFilter.java
│               │   ├── LoginServlet.java
│               │   ├── LogoutServlet.java
│               │   ├── RegisterServlet.java
│               │   ├── errorhandler
│               │   │   └── AppErrorHandler.java
│               │   └── listeners
│               │       └── AppContextListener.java
│               └── util
│                   ├── DBConnectionManager.java
│                   └── User.java
└── test
    └── TestLoginFilter.java

感谢我的教授帮助我找出问题所在=)

一些图像可以更好地显示我的更改:

目录结构 Deployment_Assembly Build_path_source Build_path_libraries


推荐阅读