我正在嘗試首先運行字符長度檢查,如果用戶通過它而不是想要呼叫將回傳該用戶登錄的 servlet。
<html>
<head><title>Login</title></head>
<link rel="stylesheet" href="css/style.css">
<body>
<div class="Welcome-division">
<div class="header-top"> <a href="/"><img class="logo" src="images/logo.png" alt="Hostel logo"></a>
<H1>Welcome to Arihant's hostel</H1>
</div>
<navbar class="horizontal-navbar">
<a href="Home.jsp">Home</a>
<a class="active" href="Login.jsp">Login</a>
<a href="Room details.jsp">Room Details</a>
<a href="Contact Us.jsp">Contact Us</a>
</navbar>
</div>
<div class="center-body">
<navbar class="Menu-option">
<a href="Home.jsp">Home</a>
<a class="active" href="Login.jsp">Login</a>
<a href="Room details.jsp">Room Details</a>
<a href="Contact Us.jsp">Contact Us</a>
</navbar>
<div class="Room-information">
<form class="loginForm" method=post action=LoginServlet>
<div>Room No: <input type="text" name="Roomno" id="Rno"><br></div><br>
<div>Password : <input type="password" name="password" id="pass"></div><br>
<input id="formSubmit" type="submit" value="SUBMIT">
</form>
</div>
</div>
<div class="Copyright-Information">
© Arihant graphics
</div>
<script>
const formSubmit = document.getElementById("formSubmit");
formSubmit.addEventListener("click", (e) => {
const Rno = document.getElementById("Rno").value;
const Password = document.getElementById("pass").value;
if (Rno == null || Rno == "" || Password.length < 7) {
alert("Please enter a Room No or your password is incorrect");
setTimeout(function () {
window.location.reload();
}, 5000);
}
e.preventDefault();
})
</script>
</body>
</html>
運行上面的 jsp 代碼后,它正在檢查密碼長度和 Rno 檢查是否正確,但在下面給出的之后沒有運行 servlet。
如果可能,我想在 doPost 中執行此操作。
并添加“else document.location.href = 'LoginServlet';” 在 javascript 部分回傳錯誤狀態 405 - 方法不允許
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","root");
int roomNo = Integer.parseInt(request.getParameter("Roomno"));
String password = request.getParameter("password");
PreparedStatement ps = con.prepareStatement("select * from login where roomNo=? and password=?");
ps.setInt(1, roomNo);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if(rs.next()) {
int userRoom = rs.getInt(1);
String userName = rs.getString(3);
out.println("RoomNo:" userRoom " is allocated to " userName);
con.close();
}
else
out.println("Failed to log in");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
uj5u.com熱心網友回復:
在 JSP 頁面中,您使用的 HTML<form>具有action將 URL 值系結到 servlet 的屬性。如果您在應用程式中至少使用 servlet 3.0 規范,則 servlet 會使用<servlet-mapping>通過或使用注釋創建的配置來公開自己。web.xml
要與 servlet 通信,您應該從瀏覽器發出 HTTP 請求。有很多方法可以從頁面發送 HTTP 請求,但您使用的是 HTML<form>標記,當您按下提交按鈕時,請求將發送到包含在標記action屬性中的 URL,該 URL 使用屬性中<form>使用的 HTTP 方法method。
如果您在表單的提交按鈕上系結特定的事件處理程式,那么在代碼中您應該允許函式繼續處理事件佇列。但是您的處理程式是這樣撰寫的,例如它不執行事件但還會重新加載頁面。這種方式從瀏覽器發出一個新的 HTTP 請求,它使用 servlet 未實作的 HTTP GET 方法。錯誤 405 被發送到瀏覽器,因為doGet()servlet 中沒有方法。
該問題的解決方案是洗掉重新加載頁面的代碼并preventDefault()僅在密碼不正確時使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529043.html
