我正在尝试制作一个简单的登录表单。用户必须输入电子邮件和密码,单击登录按钮,然后他必须被重定向到主页。 Login jsp 网站已加载,但该网站的 Servlet 不起作用。我不知道这是什么原因。 我使用 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甚至没有被触发。
您的登录 servlet 有一个 doPost 方法,但您没有对表单执行 POST 请求。您需要更改您的login.jsp 以包含带有post 方法的表单和表单提交按钮。此外,您需要在表单中引入操作参数以指向您的 servlet。
你缺少的东西:
<form method="post" action="/login">
<input type="submit" value="Login"/>
</form>
问题是,我使用的是 Tomcat 版本 9,而不是 Tomcat 版本 10,后者是最新的,并且支持从 Java EE 更改为 Jakarta EE。 基本上,如果您使用 Jakarta EE,则必须使用 Tomcat 版本 10 及更高版本。