Я пытаюсь сделать простую форму входа. Пользователь должен ввести адрес электронной почты и пароль, нажать кнопку входа и после этого он должен быть перенаправлен на домашнюю страницу. Веб-сайт 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 даже не запускается.
Да, но это только в коде, как это выглядит. При запуске программы сервлет не вызывается. Вы можете увидеть оператор печати в начале, чтобы проверить его. Это не напечатано. У меня тоже почти такая же страница "регистрации". И там сохраняется та же проблема.
Вы меняете URL-адрес на /login, но разве перед ним не должен стоять контекстный путь приложения?
Извините, изменить какой URL? Также я связал все (насколько я понимаю) в файле web.xml
Как вы пытались вызвать сервлет?
Разве сервлет не вызывается при загрузке страницы «/login»? На основе файла web.xml и аннотации @WebServlet в LoginServlet
Да, вызывается. Как ты это узнал?
Знаешь что? Всякий раз, когда я иду на веб-сайт входа, я ввожу адрес электронной почты и пароль, нажимаю кнопку «Войти», и ничего не происходит. И оператор тестовой печати даже не печатает. И перенаправления тоже не работают. Это означает, что веб-сайт загружается, но LoginServlet не вызывается.
Кнопка ничего не делает. Чтобы вызвать LoginServlet, вы должны опубликовать форму.
Я попробовал ответить на eis, но это не сработало. Вы об одном и том же?




В вашем сервлете входа есть метод 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 и выше.
Это не проблема. Разве это не ожидаемый рабочий процесс? Если вы нажали кнопку входа, она должна перейти на страницу входа.