HTTP-статус сервлета JSP 404 — не найден

Это мой первый пост. Я надеюсь, что кто-то может мне помочь =) Обычно я пытаюсь найти решение подобных проблем самостоятельно. Но эта проблема вызывает у меня головную боль...

С тегом действия в HTML-коде ниже я хочу запустить сервлет Java. К сожалению, я всегда получаю ошибку 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[jre1.8.0_201a] Библиотеки веб-приложений Драйвер MySQL JDBC EAR-библиотеки Юнит5 log4j-1.2.17.jar

Исходная папка: ps_18_gruppe09/src/main.

Полное сообщение об ошибке:

HTTP Status 404 – Not Found

Type Status Report

Message /ps_18_gruppe09/Login

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

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");;
                }
            }
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
708
2

Ответы 2

В подобном проекте я делаю так,

1 — я ничего не объявляю в классе Servlet, просто пусть так,

public class Margin extends HttpServlet { ... }

& я делаю все объявления сервлетов внутри моего web.xml,

<servlet>
    <servlet-name>Margin</servlet-name>
    <servlet-class>gr.thebexperts.servlets.Margin</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name>Margin</servlet-name>
     <url-pattern>/Margin</url-pattern>
</servlet-mapping>

Это, вероятно, не связано с вашей проблемой, но вы можете попробовать это аналогичным образом.

2 - Отличие, которое может вызвать проблему, заключается в том, что вы можете попытаться разместить свою страницу login.jsp на том же уровне, что и WEB-INF, то есть непосредственно под /WebContent, это, вероятно, будет работать.

Надеюсь, поможет!

Спасибо за помощь. К сожалению, проблема была в моей структуре каталогов. Я только что опубликовал ответ, если вам интересно =)

Valeria DR 09.03.2019 08:40

@ValeriaDR Рад, что ты нашел решение, молодец!

dZ. 09.03.2019 13:21

Мне удалось решить проблему. Я опубликую решение, может быть, это поможет кому-то с подобной проблемой.

Мне пришлось изменить структуру каталогов моего проекта. Моя проблема заключалась в том, что я назвал свои java-пакеты 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

Спасибо моему профессору, который помог мне выяснить, в чем проблема =)

Некоторые изображения, чтобы лучше показать мои изменения:

Directory structureDeployment_AssemblyBuild_path_sourceBuild_path_libraries

Другие вопросы по теме