首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JavaWeb 登錄功能完整實戰:JSP + Servlet + JDBC 從零構建

     編輯:Java 綜合教學

業務流程圖解

login.jsp(用戶輸入) → LoginServlet(請求處理) → UserDao(數據庫查詢) → index.jsp/error.jsp(結果頁)

頁面層實現

login.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 略
}

控制層:LoginServlet

@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 重定向:轉發服務端內部跳轉,重定向客戶端雙次請求。

數據訪問層:UserDao

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
);

部署驗證

  1. 將專案發布到 Tomcat
  2. 瀏覽器訪問 https://localhost:8080/專案名/login.jsp
  3. 輸入正確帳密 → 跳轉 index.jsp;錯誤 → 跳轉 error.jsp

架構升級建議

  • 引入連接池(Druid/HikariCP)替換直連
  • 分層解耦:Controller → Service → DAO
  • 密碼加密存儲(BCrypt)
  • 引入驗證框架(Shiro/Spring Security)

這只是入門級 Demo,實際開發需更精細的分層與安全考量。希望大家好好學習,天天向上!!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved