Сервлет Jakarta EE не вызывается

Я пытаюсь сделать простую форму входа. Пользователь должен ввести адрес электронной почты и пароль, нажать кнопку входа и после этого он должен быть перенаправлен на домашнюю страницу. Веб-сайт Login jsp загружается, но сервлет для этого веб-сайта не работает. Я не знаю, в чем причина этого. Я использую TomCat в качестве сервера.

Вот мой файл JSP - login.jsp

<%@ page contentType = "text/html;charset=UTF-8" language = "java" %>
<html lang = "en" >
<head>
    <meta charset = "UTF-8">
    <title>Login</title>
    <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Rubik:400,700'>
    <link rel = "stylesheet" href = "styleLogin.css">

</head>
<body>
<div class = "login-form">
    <form>
        <h1>Login</h1>
        <div class = "content">
            <div class = "input-field">
                <label>
                    <input type = "email" placeholder = "Email" autocomplete = "nope">
                </label>
            </div>
            <div class = "input-field">
                <label>
                    <input type = "password" placeholder = "Password" autocomplete = "new-password">
                </label>
            </div>
        </div>
        <div class = "action">
            <button>Sign in</button>
        </div>
    </form>
</div>
</body>
</html>

Вот LoginServlet (он должен работать на этом login.jsp)

package com.example.userbook.servlet;

import com.example.userbook.manager.UserManager;
import com.example.userbook.model.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    UserManager userManager = new UserManager();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DoPost triggered"); // Testing if the servlet even starts
        String email = req.getParameter("email");
        String password = req.getParameter("password");
        User user = userManager.getUserByEmailAndPassword(email, password);

        if (user == null) {
            req.getRequestDispatcher("/login").forward(req, resp);


        } else {
            req.getRequestDispatcher("/").forward(req, resp);
        }
    }
}


Вот файл web.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<web-app xmlns = "https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version = "5.0">

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.example.userbook.servlet.LoginServlet</servlet-class>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>

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

</web-app>

Вот index.jsp (первая страница загрузки, там есть только кнопка для перехода к login.jsp)

<%@ page contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello, please proceed to the login page" %>
</h1>
<br/>
<button onclick = "window.location.href='/login'">Login</button>
</body>
</html>

Я пытаюсь добиться этого, как только сервер запускается, он загружает этот index.jsp, и я нажимаю кнопку, которая переходит на веб-сайт для входа, и оттуда пользователь вводит свой адрес электронной почты и пароль. У меня есть база данных MySQL, подключенная к проекту, поэтому в LoginServlet вы можете увидеть некоторые ее части. Он в основном проверяет, существует ли пользователь или нет. Если нет, он снова перенаправляется на сайт входа в систему, чтобы повторить попытку, в противном случае он перенаправляется в начало (index.jsp).

Проблема в том, что всякий раз, когда я нажимаю кнопку «Войти» на веб-сайте index.jsp, я перенаправляюсь на login.jsp, но LoginServlet даже не запускается.

Это не проблема. Разве это не ожидаемый рабочий процесс? Если вы нажали кнопку входа, она должна перейти на страницу входа.

Roman C 20.08.2023 10:33

Да, но это только в коде, как это выглядит. При запуске программы сервлет не вызывается. Вы можете увидеть оператор печати в начале, чтобы проверить его. Это не напечатано. У меня тоже почти такая же страница "регистрации". И там сохраняется та же проблема.

Jack Cumber 20.08.2023 11:18

Вы меняете URL-адрес на /login, но разве перед ним не должен стоять контекстный путь приложения?

Rob Spoor 20.08.2023 14:18

Извините, изменить какой URL? Также я связал все (насколько я понимаю) в файле web.xml

Jack Cumber 20.08.2023 14:26

Как вы пытались вызвать сервлет?

Roman C 20.08.2023 14:39

Разве сервлет не вызывается при загрузке страницы «/login»? На основе файла web.xml и аннотации @WebServlet в LoginServlet

Jack Cumber 20.08.2023 14:46

Да, вызывается. Как ты это узнал?

Roman C 20.08.2023 16:52

Знаешь что? Всякий раз, когда я иду на веб-сайт входа, я ввожу адрес электронной почты и пароль, нажимаю кнопку «Войти», и ничего не происходит. И оператор тестовой печати даже не печатает. И перенаправления тоже не работают. Это означает, что веб-сайт загружается, но LoginServlet не вызывается.

Jack Cumber 20.08.2023 16:54

Кнопка ничего не делает. Чтобы вызвать LoginServlet, вы должны опубликовать форму.

Roman C 20.08.2023 21:03

Я попробовал ответить на eis, но это не сработало. Вы об одном и том же?

Jack Cumber 20.08.2023 22:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем сервлете входа есть метод doPost, но вы не выполняете POST-запрос со своей формой. Вам нужно будет изменить свой login.jsp, чтобы он содержал форму с методом публикации и кнопку отправки формы. Кроме того, вам нужно ввести параметр действия в форму, чтобы указать на ваш сервлет.

Что вам не хватает:

<form method = "post" action = "/login">
   <input type = "submit" value = "Login"/>
</form>
Ответ принят как подходящий

Проблема заключалась в том, что я использовал Tomcat версии 9 вместо Tomcat версии 10, которая является последней и поддерживает переход с Java EE на Jakarta EE. По сути, если вы используете Jakarta EE, вы должны использовать Tomcat версии 10 и выше.

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