Tujuan Praktikum
Setelah praktikum ini, mahasiswa mampu:
- Membuat struktur file untuk CRUD data pegawai.
- Menampilkan daftar pegawai yang terhubung ke bagian.
- Menambah dan mengubah data pegawai.
- Menghapus data pegawai dari sistem.
Persiapan
Siapkan kebutuhan berikut:
- Project Java Web Starter
- Folder `src/java/controller`
- Folder `src/java/dao`
- Folder `src/java/model`
- Folder `web/WEB-INF/views/pegawai`
- File `src/java/dao/BagianDAO.java`
- File `web/WEB-INF/views/partials/sidebar.jsp`
- File `web/assets/css/style.css`
- Data bagian di database
Konsep Singkat
Data pegawai adalah data inti aplikasi presensi.
Alurnya seperti ini:
/pegawai -> PegawaiServlet.java -> PegawaiDAO.java -> pegawai/daftar.jsp atau pegawai/form.jsp
PegawaiServlet.java mengatur request daftar, form
tambah, form edit, simpan, dan hapus.
PegawaiDAO.java membaca data pegawai dan
menggabungkannya dengan data bagian.
BagianDAO.java dipakai untuk mengisi pilihan bagian
pada form.
Langkah 1 - Buat Folder dan File
Buat file berikut sesuai urutan ini:
src/java/model/Pegawai.java
src/java/dao/PegawaiDAO.java
src/java/controller/PegawaiServlet.java
web/WEB-INF/views/pegawai/daftar.jsp
web/WEB-INF/views/pegawai/form.jsp
Kalau folder pegawai belum ada, buat dulu di dalam
web/WEB-INF/views/.
1. src/java/model/Pegawai.java
package model;
public class Pegawai {
private int id;
private String nip;
private String namaPegawai;
private String jenisKelamin;
private String noHp;
private String alamat;
private int bagianId;
private String bagianNama;
private String statusPegawai;
public Pegawai() {
}
public Pegawai(int id, String nip, String namaPegawai, String jenisKelamin,
String noHp, String alamat, int bagianId, String bagianNama,
String statusPegawai) {
this.id = id;
this.nip = nip;
this.namaPegawai = namaPegawai;
this.jenisKelamin = jenisKelamin;
this.noHp = noHp;
this.alamat = alamat;
this.bagianId = bagianId;
this.bagianNama = bagianNama;
this.statusPegawai = statusPegawai;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNip() {
return nip;
}
public void setNip(String nip) {
this.nip = nip;
}
public String getNamaPegawai() {
return namaPegawai;
}
public void setNamaPegawai(String namaPegawai) {
this.namaPegawai = namaPegawai;
}
public String getJenisKelamin() {
return jenisKelamin;
}
public void setJenisKelamin(String jenisKelamin) {
this.jenisKelamin = jenisKelamin;
}
public String getNoHp() {
return noHp;
}
public void setNoHp(String noHp) {
this.noHp = noHp;
}
public String getAlamat() {
return alamat;
}
public void setAlamat(String alamat) {
this.alamat = alamat;
}
public int getBagianId() {
return bagianId;
}
public void setBagianId(int bagianId) {
this.bagianId = bagianId;
}
public String getBagianNama() {
return bagianNama;
}
public void setBagianNama(String bagianNama) {
this.bagianNama = bagianNama;
}
public String getStatusPegawai() {
return statusPegawai;
}
public void setStatusPegawai(String statusPegawai) {
this.statusPegawai = statusPegawai;
}
}
2. src/java/dao/PegawaiDAO.java
package dao;
import model.Pegawai;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class PegawaiDAO {
public List<Pegawai> findAll() throws SQLException {
String sql = "SELECT p.id_pegawai AS id, p.nip, p.nama_pegawai, p.jenis_kelamin, "
+ "p.no_hp, p.alamat, p.id_bagian AS bagian_id, p.status_pegawai, "
+ "b.nama_bagian "
+ "FROM pegawai p "
+ "INNER JOIN bagian b ON b.id_bagian = p.id_bagian "
+ "ORDER BY p.nama_pegawai ASC";
List<Pegawai> pegawaiList = new ArrayList<>();
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
pegawaiList.add(mapRow(rs));
}
}
return pegawaiList;
}
public Pegawai findById(int id) throws SQLException {
String sql = "SELECT p.id_pegawai AS id, p.nip, p.nama_pegawai, p.jenis_kelamin, "
+ "p.no_hp, p.alamat, p.id_bagian AS bagian_id, p.status_pegawai, "
+ "b.nama_bagian "
+ "FROM pegawai p "
+ "INNER JOIN bagian b ON b.id_bagian = p.id_bagian "
+ "WHERE p.id_pegawai = ?";
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, id);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return mapRow(rs);
}
}
}
return null;
}
public void insert(Pegawai pegawai) throws SQLException {
String sql = "INSERT INTO pegawai "
+ "(nip, nama_pegawai, jenis_kelamin, no_hp, alamat, id_bagian, status_pegawai) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?)";
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, pegawai.getNip());
ps.setString(2, pegawai.getNamaPegawai());
ps.setString(3, pegawai.getJenisKelamin());
ps.setString(4, pegawai.getNoHp());
ps.setString(5, pegawai.getAlamat());
ps.setInt(6, pegawai.getBagianId());
ps.setString(7, pegawai.getStatusPegawai());
ps.executeUpdate();
}
}
public void update(Pegawai pegawai) throws SQLException {
String sql = "UPDATE pegawai "
+ "SET nip = ?, nama_pegawai = ?, jenis_kelamin = ?, no_hp = ?, "
+ "alamat = ?, id_bagian = ?, status_pegawai = ? "
+ "WHERE id_pegawai = ?";
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, pegawai.getNip());
ps.setString(2, pegawai.getNamaPegawai());
ps.setString(3, pegawai.getJenisKelamin());
ps.setString(4, pegawai.getNoHp());
ps.setString(5, pegawai.getAlamat());
ps.setInt(6, pegawai.getBagianId());
ps.setString(7, pegawai.getStatusPegawai());
ps.setInt(8, pegawai.getId());
ps.executeUpdate();
}
}
public void delete(int id) throws SQLException {
String sql = "DELETE FROM pegawai WHERE id_pegawai = ?";
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, id);
ps.executeUpdate();
}
}
public int countByBagianId(int bagianId) throws SQLException {
String sql = "SELECT COUNT(*) FROM pegawai WHERE id_bagian = ?";
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, bagianId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getInt(1);
}
}
}
return 0;
}
public boolean existsNip(String nip, int excludeId) throws SQLException {
String sql = "SELECT COUNT(*) "
+ "FROM pegawai "
+ "WHERE LOWER(nip) = LOWER(?) "
+ "AND id_pegawai <> ?";
try (Connection conn = DBKoneksi.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, nip);
ps.setInt(2, excludeId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getInt(1) > 0;
}
}
}
return false;
}
private Pegawai mapRow(ResultSet rs) throws SQLException {
Pegawai pegawai = new Pegawai();
pegawai.setId(rs.getInt("id"));
pegawai.setNip(rs.getString("nip"));
pegawai.setNamaPegawai(rs.getString("nama_pegawai"));
pegawai.setJenisKelamin(rs.getString("jenis_kelamin"));
pegawai.setNoHp(rs.getString("no_hp"));
pegawai.setAlamat(rs.getString("alamat"));
pegawai.setBagianId(rs.getInt("bagian_id"));
pegawai.setStatusPegawai(rs.getString("status_pegawai"));
pegawai.setBagianNama(rs.getString("nama_bagian"));
return pegawai;
}
}
3. src/java/controller/PegawaiServlet.java
package controller;
import dao.BagianDAO;
import dao.PegawaiDAO;
import model.Bagian;
import model.Pegawai;
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;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@WebServlet(name = "PegawaiServlet", urlPatterns = {"/pegawai"})
public class PegawaiServlet extends HttpServlet {
private static final String LIST_PAGE = "/WEB-INF/views/pegawai/daftar.jsp";
private static final String FORM_PAGE = "/WEB-INF/views/pegawai/form.jsp";
private final PegawaiDAO pegawaiDAO = new PegawaiDAO();
private final BagianDAO bagianDAO = new BagianDAO();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = normalize(request.getParameter("action"));
switch (action) {
case "create" -> showForm(request, response, new Pegawai(), new LinkedHashMap<>());
case "edit" -> handleEdit(request, response);
default -> showList(request, response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String action = normalize(request.getParameter("action"));
if ("delete".equals(action)) {
handleDelete(request, response);
return;
}
handleSave(request, response);
}
private void showList(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
List<Pegawai> pegawaiList = pegawaiDAO.findAll();
request.setAttribute("activeMenu", "pegawai");
request.setAttribute("pegawaiList", pegawaiList);
forwardToLayout(request, response, LIST_PAGE);
} catch (SQLException e) {
throw new ServletException("Gagal mengambil data pegawai.", e);
}
}
private void handleEdit(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int id = parseInt(request.getParameter("id"));
if (id <= 0) {
redirectWithMessage(response, request, "/pegawai",
"Data pegawai tidak valid.", "error");
return;
}
try {
Pegawai pegawai = pegawaiDAO.findById(id);
if (pegawai == null) {
redirectWithMessage(response, request, "/pegawai",
"Data pegawai tidak ditemukan.", "error");
return;
}
showForm(request, response, pegawai, new LinkedHashMap<>());
} catch (SQLException e) {
throw new ServletException("Gagal membuka form pegawai.", e);
}
}
private void handleSave(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Pegawai pegawai = bind(request);
Map<String, String> errors = validate(pegawai);
if (!errors.isEmpty()) {
showForm(request, response, pegawai, errors);
return;
}
try {
if (pegawai.getId() > 0) {
pegawaiDAO.update(pegawai);
} else {
pegawaiDAO.insert(pegawai);
}
redirectWithMessage(response, request, "/pegawai",
"Data pegawai berhasil disimpan.", "success");
} catch (SQLException e) {
errors.put("general", "Gagal menyimpan data pegawai.");
showForm(request, response, pegawai, errors);
}
}
private void handleDelete(HttpServletRequest request, HttpServletResponse response)
throws IOException {
int id = parseInt(request.getParameter("id"));
if (id <= 0) {
redirectWithMessage(response, request, "/pegawai",
"Data pegawai tidak valid.", "error");
return;
}
try {
Pegawai pegawai = pegawaiDAO.findById(id);
if (pegawai == null) {
redirectWithMessage(response, request, "/pegawai",
"Data pegawai tidak ditemukan.", "error");
return;
}
pegawaiDAO.delete(id);
redirectWithMessage(response, request, "/pegawai",
"Data pegawai berhasil dihapus.", "success");
} catch (SQLException e) {
redirectWithMessage(response, request, "/pegawai",
"Gagal menghapus data pegawai.", "error");
}
}
private void showForm(HttpServletRequest request, HttpServletResponse response,
Pegawai pegawai, Map<String, String> errors)
throws ServletException, IOException {
try {
request.setAttribute("activeMenu", "pegawai");
request.setAttribute("pegawai", pegawai);
request.setAttribute("errors", errors);
request.setAttribute("bagianList", bagianDAO.findAll());
request.setAttribute("formTitle", pegawai.getId() > 0 ? "Edit Pegawai" : "Tambah Pegawai");
forwardToLayout(request, response, FORM_PAGE);
} catch (SQLException e) {
throw new ServletException("Gagal membuka form pegawai.", e);
}
}
private Pegawai bind(HttpServletRequest request) {
Pegawai pegawai = new Pegawai();
pegawai.setId(parseInt(request.getParameter("id")));
pegawai.setNip(trimToNull(request.getParameter("nip")));
pegawai.setNamaPegawai(trimToNull(request.getParameter("namaPegawai")));
pegawai.setJenisKelamin(trimToNull(request.getParameter("jenisKelamin")));
pegawai.setNoHp(trimToNull(request.getParameter("noHp")));
pegawai.setAlamat(trimToNull(request.getParameter("alamat")));
pegawai.setBagianId(parseInt(request.getParameter("bagianId")));
String statusPegawai = trimToNull(request.getParameter("statusPegawai"));
pegawai.setStatusPegawai(statusPegawai == null ? "Aktif" : statusPegawai);
return pegawai;
}
private Map<String, String> validate(Pegawai pegawai) {
Map<String, String> errors = new LinkedHashMap<>();
if (pegawai.getNip() == null || pegawai.getNip().isBlank()) {
errors.put("nip", "NIP wajib diisi.");
}
if (pegawai.getNamaPegawai() == null || pegawai.getNamaPegawai().isBlank()) {
errors.put("namaPegawai", "Nama pegawai wajib diisi.");
}
if (pegawai.getJenisKelamin() == null || pegawai.getJenisKelamin().isBlank()) {
errors.put("jenisKelamin", "Jenis kelamin wajib dipilih.");
} else if (!"L".equals(pegawai.getJenisKelamin()) && !"P".equals(pegawai.getJenisKelamin())) {
errors.put("jenisKelamin", "Jenis kelamin tidak valid.");
}
if (pegawai.getNoHp() != null && !pegawai.getNoHp().isBlank()
&& !pegawai.getNoHp().matches("^[0-9+\\-\\s]{7,20}$")) {
errors.put("noHp", "Nomor HP tidak valid.");
}
if (pegawai.getBagianId() <= 0) {
errors.put("bagianId", "Bagian wajib dipilih.");
} else {
try {
Bagian bagian = bagianDAO.findById(pegawai.getBagianId());
if (bagian == null) {
errors.put("bagianId", "Bagian yang dipilih tidak ditemukan.");
}
} catch (SQLException e) {
errors.put("general", "Gagal memeriksa data bagian.");
}
}
if (pegawai.getStatusPegawai() == null || pegawai.getStatusPegawai().isBlank()) {
errors.put("statusPegawai", "Status pegawai wajib dipilih.");
} else if (!"Aktif".equals(pegawai.getStatusPegawai())
&& !"Nonaktif".equals(pegawai.getStatusPegawai())) {
errors.put("statusPegawai", "Status pegawai tidak valid.");
}
if (!errors.containsKey("nip")) {
try {
if (pegawaiDAO.existsNip(pegawai.getNip(), pegawai.getId())) {
errors.put("nip", "NIP sudah digunakan.");
}
} catch (SQLException e) {
errors.put("general", "Gagal memeriksa NIP.");
}
}
return errors;
}
private void forwardToLayout(HttpServletRequest request, HttpServletResponse response,
String contentPage) throws ServletException, IOException {
request.setAttribute("contentPage", contentPage);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
private void redirectWithMessage(HttpServletResponse response, HttpServletRequest request,
String path, String message, String type) throws IOException {
String target = request.getContextPath() + path
+ "?message=" + URLEncoder.encode(message, StandardCharsets.UTF_8)
+ "&type=" + URLEncoder.encode(type, StandardCharsets.UTF_8);
response.sendRedirect(target);
}
private String normalize(String value) {
return value == null ? "" : value.trim().toLowerCase();
}
private int parseInt(String value) {
try {
return Integer.parseInt(value);
} catch (Exception e) {
return 0;
}
}
private String trimToNull(String value) {
if (value == null) {
return null;
}
String trimmed = value.trim();
return trimmed.isEmpty() ? null : trimmed;
}
}
4. web/WEB-INF/views/pegawai/daftar.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<div class="page-header">
<h2>Entry Data Pegawai</h2>
</div>
<c:if test="${not empty param.message}">
<div class="${param.type == 'error' ? 'error' : 'success'}">
<c:out value="${param.message}"/>
</div>
</c:if>
<div class="table-toolbar">
<a href="${pageContext.request.contextPath}/pegawai?action=create" class="btn btn-add">+ Tambah Pegawai</a>
</div>
<div class="card">
<c:choose>
<c:when test="${empty pegawaiList}">
<div class="info">Belum ada data pegawai. Silakan tambahkan data pertama.</div>
</c:when>
<c:otherwise>
<table>
<thead>
<tr>
<th>No</th>
<th>NIP</th>
<th>Nama</th>
<th>Jenis Kelamin</th>
<th>No HP</th>
<th>Bagian</th>
<th>Status</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
<c:forEach var="pegawai" items="${pegawaiList}" varStatus="loop">
<tr class="${loop.index % 2 == 1 ? 'genap' : ''}">
<td>${loop.index + 1}</td>
<td><c:out value="${pegawai.nip}"/></td>
<td><c:out value="${pegawai.namaPegawai}"/></td>
<td>
<c:choose>
<c:when test="${pegawai.jenisKelamin == 'L'}">Laki-laki</c:when>
<c:when test="${pegawai.jenisKelamin == 'P'}">Perempuan</c:when>
<c:otherwise><c:out value="${pegawai.jenisKelamin}"/></c:otherwise>
</c:choose>
</td>
<td><c:out value="${pegawai.noHp}" default="-"/></td>
<td><c:out value="${pegawai.bagianNama}"/></td>
<td><c:out value="${pegawai.statusPegawai}" default="Aktif"/></td>
<td>
<div class="table-actions">
<a class="btn btn-warning"
href="${pageContext.request.contextPath}/pegawai?action=edit&id=${pegawai.id}">
Edit
</a>
<form class="inline-form"
method="post"
action="${pageContext.request.contextPath}/pegawai"
onsubmit="return confirm('Hapus data pegawai ini?');">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="${pegawai.id}">
<button type="submit" class="btn btn-danger">Hapus</button>
</form>
</div>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:otherwise>
</c:choose>
</div>
5. web/WEB-INF/views/pegawai/form.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<div class="page-header">
<h2>Entry Data Pegawai</h2>
</div>
<div class="card">
<h3><c:out value="${formTitle}" default="Form Pegawai"/></h3>
<c:if test="${not empty errors.general}">
<div class="error"><c:out value="${errors.general}"/></div>
</c:if>
<c:if test="${empty bagianList}">
<div class="info">
Data bagian masih kosong. Silakan isi data bagian terlebih dahulu.
</div>
</c:if>
<form method="post" action="${pageContext.request.contextPath}/pegawai">
<input type="hidden" name="id" value="${pegawai.id}">
<div class="form-group">
<label for="nip">NIP</label>
<input type="text"
id="nip"
name="nip"
value="${pegawai.nip}"
placeholder="Contoh: 198801012016010001"
required>
<c:if test="${not empty errors.nip}">
<div class="error"><c:out value="${errors.nip}"/></div>
</c:if>
</div>
<div class="form-group">
<label for="namaPegawai">Nama Pegawai</label>
<input type="text"
id="namaPegawai"
name="namaPegawai"
value="${pegawai.namaPegawai}"
placeholder="Nama pegawai"
required>
<c:if test="${not empty errors.namaPegawai}">
<div class="error"><c:out value="${errors.namaPegawai}"/></div>
</c:if>
</div>
<div class="form-group">
<label for="jenisKelamin">Jenis Kelamin</label>
<select id="jenisKelamin" name="jenisKelamin" required>
<option value="">-- Pilih Jenis Kelamin --</option>
<option value="L" ${pegawai.jenisKelamin == 'L' ? 'selected' : ''}>Laki-laki</option>
<option value="P" ${pegawai.jenisKelamin == 'P' ? 'selected' : ''}>Perempuan</option>
</select>
<c:if test="${not empty errors.jenisKelamin}">
<div class="error"><c:out value="${errors.jenisKelamin}"/></div>
</c:if>
</div>
<div class="form-group">
<label for="noHp">No HP</label>
<input type="text"
id="noHp"
name="noHp"
value="${pegawai.noHp}"
placeholder="Contoh: 08123456789">
<c:if test="${not empty errors.noHp}">
<div class="error"><c:out value="${errors.noHp}"/></div>
</c:if>
</div>
<div class="form-group">
<label for="alamat">Alamat</label>
<textarea id="alamat"
name="alamat"
rows="4"
placeholder="Alamat pegawai"><c:out value="${pegawai.alamat}"/></textarea>
<c:if test="${not empty errors.alamat}">
<div class="error"><c:out value="${errors.alamat}"/></div>
</c:if>
</div>
<div class="form-group">
<label for="bagianId">Bagian</label>
<select id="bagianId" name="bagianId" required>
<option value="">-- Pilih Bagian --</option>
<c:forEach var="bagian" items="${bagianList}">
<option value="${bagian.id}"
${pegawai.bagianId == bagian.id ? 'selected' : ''}>
<c:out value="${bagian.namaBagian}"/>
</option>
</c:forEach>
</select>
<c:if test="${not empty errors.bagianId}">
<div class="error"><c:out value="${errors.bagianId}"/></div>
</c:if>
</div>
<div class="form-group">
<label for="statusPegawai">Status Pegawai</label>
<select id="statusPegawai" name="statusPegawai" required>
<option value="">-- Pilih Status --</option>
<option value="Aktif" ${pegawai.statusPegawai == 'Aktif' ? 'selected' : ''}>Aktif</option>
<option value="Nonaktif" ${pegawai.statusPegawai == 'Nonaktif' ? 'selected' : ''}>Nonaktif</option>
</select>
<c:if test="${not empty errors.statusPegawai}">
<div class="error"><c:out value="${errors.statusPegawai}"/></div>
</c:if>
</div>
<div class="form-actions">
<button type="submit" class="btn-primary" ${empty bagianList ? 'disabled' : ''}>
<c:choose>
<c:when test="${pegawai.id > 0}">Update</c:when>
<c:otherwise>Simpan</c:otherwise>
</c:choose>
</button>
<a href="${pageContext.request.contextPath}/pegawai" class="btn btn-secondary">Kembali</a>
</div>
</form>
</div>
Langkah 2 - Sambungkan ke Menu Admin
Setelah model, DAO, controller, dan view selesai, hubungkan halaman pegawai ke menu admin.
Hal yang perlu dicek:
- menu `Entry Data Pegawai` ada di `sidebar.jsp`
- route `/pegawai` bisa dibuka dari menu
- form pegawai mengambil data bagian dari `BagianDAO`
- tabel dan form tetap rapi dengan bantuan `style.css`
PegawaiServlet.java sudah menangani daftar, tambah,
edit, dan hapus. Jadi pada tahap ini fokusnya tinggal memastikan
halaman pegawai masuk ke navigasi admin dengan benar.
Pengujian
Lakukan pengujian berikut:
- Buka
/pegawai. - Tambahkan satu data pegawai baru.
- Edit data pegawai yang baru dibuat.
- Coba simpan NIP yang sama.
- Hapus satu data pegawai yang tidak dipakai lagi.
Troubleshooting
| Masalah | Penyebab | Solusi |
|---|---|---|
| Dropdown bagian kosong | Data bagian belum ada | Isi data bagian terlebih dahulu |
| NIP ditolak | NIP sudah dipakai pegawai lain | Gunakan NIP yang berbeda |
| Jenis kelamin tidak valid | Pilihan form tidak dipilih | Pilih L atau P |
| Data gagal disimpan | Ada field wajib yang kosong | Lengkapi semua field wajib |
Tugas Praktikum
- Buat folder dan file CRUD data pegawai.
- Tambahkan minimal 3 data pegawai baru.
-
Edit status salah satu pegawai menjadi
Nonaktif.
Kesimpulan
CRUD data pegawai dibangun dari servlet, DAO, model, dan dua view JSP. Data pegawai bisa langsung ditampilkan bersama nama bagian supaya daftar lebih mudah dibaca.