本文示範在非 Maven 的傳統 Dynamic Web Project 中,手動管理 JAR 檔、採用 MVC 分層架構實作使用者登入功能,涵蓋 Entity、DAO、Service、Controller 完整流程。
src/ com.zr.model // 實體類 com.zr.dao // DAO 介面 com.zr.daoIm // DAO 實作 com.zr.service // Service 介面 com.zr.serviceIm // Service 實作 com.zr.controller // Servlet Controller JDBCUtil // 資料庫工具類 WebContent/ login.jsp, main.jsp WEB-INF/web.xml
package com.zr.model;
public class Teacher {
private int tid;
private String tname, tpsw;
// Getter/Setter、建構子略
}
<form action="login" method="post"> 用戶名: <input type="text" name="tname"> 密碼: <input type="password" name="tpsw"> <input type="submit" value="登入"> </form>
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.zr.controller.LoginController</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
package com.zr.controller;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import com.zr.model.Teacher;
import com.zr.service.valiDateService;
import com.zr.serviceIm.valiDateServiceImpl;
public class LoginController extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String tname = req.getParameter("tname");
String tpsw = req.getParameter("tpsw");
Teacher tc = new Teacher();
tc.setTname(tname);
tc.setTpsw(tpsw);
valiDateService vds = new valiDateServiceImpl();
Teacher t = vds.valiDateTeacher(tc);
HttpSession session = req.getSession();
if (t != null && t.getTid() != 0) {
session.setAttribute("teacher", t);
req.getRequestDispatcher("main.jsp").forward(req, resp);
} else {
resp.sendRedirect("login.jsp");
}
}
}
// TeacherDao.java
package com.zr.dao;
import com.zr.model.Teacher;
public interface TeacherDao {
Teacher validateTeacher(Teacher tc);
}
// TeacherDaoImpl.java
package com.zr.daoIm;
import java.sql.*;
import com.zr.dao.TeacherDao;
import com.zr.model.Teacher;
import JDBCUtil.JDBCUtil;
public class TeacherDaoImpl implements TeacherDao {
public Teacher validateTeacher(Teacher tc) {
Teacher teacher = new Teacher();
String sql = "SELECT * FROM teacher WHERE tname=? AND tpsw=?";
try (Connection con = JDBCUtil.getConnection();
PreparedStatement pst = con.prepareStatement(sql)) {
pst.setString(1, tc.getTname());
pst.setString(2, tc.getTpsw());
ResultSet rs = pst.executeQuery();
if (rs.next()) {
teacher = new Teacher(rs.getInt("tid"),
rs.getString("tname"),
rs.getString("tpsw"));
}
} catch (SQLException e) { e.printStackTrace(); }
return teacher;
}
}
package JDBCUtil;
import java.sql.*;
public class JDBCUtil {
private static final String URL = "jdbc:mysql://localhost:3306/student_crm?useUnicode=true&characterEncoding=UTF8";
private static final String USER = "root";
private static final String PASS = "root";
private static final String DRIVER = "com.mysql.jdbc.Driver";
public static Connection getConnection() {
try {
Class.forName(DRIVER);
return DriverManager.getConnection(URL, USER, PASS);
} catch (Exception e) { e.printStackTrace(); return null; }
}
public static void close(Statement st, Connection con) throws SQLException {
if (st != null) st.close();
if (con != null) con.close();
}
}
// valiDateService.java
package com.zr.service;
import com.zr.model.Teacher;
public interface valiDateService {
Teacher valiDateTeacher(Teacher tc);
}
// valiDateServiceImpl.java
package com.zr.serviceIm;
import com.zr.dao.TeacherDao;
import com.zr.daoIm.TeacherDaoImpl;
import com.zr.model.Teacher;
import com.zr.service.valiDateService;
public class valiDateServiceImpl implements valiDateService {
public Teacher valiDateTeacher(Teacher tc) {
TeacherDao dao = new TeacherDaoImpl();
return dao.validateTeacher(tc);
}
}
<body>
<h2>歡迎, ${teacher.tname} 老師!</h2>
<a href="selectStus">查看學生資料</a>
</body>
servlet-api.jar、mysql-connector-java.jar 等PreparedStatement 防止 SQL Injection
