login.jsp(用戶輸入) → LoginServlet(請求處理) → UserDao(數據庫查詢) → index.jsp/error.jsp(結果頁)
<%@ page pageEncoding="utf-8" %> <!-- 必須修改編碼,防止中文亂碼 -->
<form action="LoginServlet" method="post">
用戶名:<input type="text" name="userName"/>
密碼:<input type="password" name="password"/>
<input type="submit" value="提交"/>
</form>
index.jsp:登錄成功歡迎頁error.jsp:登錄失敗提示頁public class User {
private String userName;
private String password;
// getter/setter 略
}
@WebServlet("/LoginServlet") // 現代註解配置替代 web.xml
public class LoginServlet extends HttpServlet {
private UserDao userDao = new UserDao();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
boolean valid = userDao.getSelect(userName, password);
if (valid) {
// 轉發:地址欄不變,共享 request
request.getRequestDispatcher("index.jsp").forward(request, response);
} else {
// 重定向:地址欄改變,新 request
response.sendRedirect("error.jsp");
}
}
}
轉發 vs 重定向:轉發服務端內部跳轉,重定向客戶端雙次請求。
public class UserDao {
public Connection getCon() throws Exception {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "";
Class.forName(driver);
return DriverManager.getConnection(url, username, password);
}
public boolean getSelect(String userName, String password) {
String sql = "SELECT * FROM user WHERE userName=? AND password=?";
try (Connection conn = getCon();
PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setString(1, userName);
pst.setString(2, password);
try (ResultSet rs = pst.executeQuery()) {
return rs.next(); // 存在記錄返回 true
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
關鍵改進:使用 PreparedStatement 防 SQL 注入,try-with-resources 自動關閉資源。
CREATE TABLE user (
userName VARCHAR(50) PRIMARY KEY,
password VARCHAR(50) NOT NULL
);
https://localhost:8080/專案名/login.jsp這只是入門級 Demo,實際開發需更精細的分層與安全考量。希望大家好好學習,天天向上!!