Sử dụng Ngôn ngữ Biểu thức (EL) trong JSP để Truy cập Dữ liệu Động

Ngôn ngữ Biểu thức (Expression Language – EL) được giới thiệu từ phiên bản JSP 2.0 nhằm đơn giản hóa việc truy xuất dữ liệu trong các trang JSP. Thay vì sử dụng cú pháp Java thuần túy như <%= ... %>, EL cung cấp cú pháp ngắn gọn, dễ đọc và an toàn hơn khi làm việc với các đối tượng thuộc các phạm vi (scope) khác nhau.

Kích hoạt EL khi bị vô hiệu hóa

Nếu biểu thức như ${user.email} hiển thị nguyên văn thay vì giá trị thực tế, khả năng cao là EL đã bị tắt. Để bật lại, khai báo directive sau ở đầu tệp JSP:

<%@ page isELIgnored="false" %>

Cú pháp cơ bản

Mọi biểu thức EL đều bắt đầu bằng ký tự $ và bao quanh bởi dấu ngoặc nhọn:

${expression}

Truy cập thuộc tính: toán tử .[]

Hai toán tử này dùng để truy cập thành viên của đối tượng hoặc phần tử trong tập hợp:

  • Dùng . cho tên thuộc tính hợp lệ (chỉ chứa chữ, số, dấu gạch dưới): ${product.price}
  • Dùng [] khi tên có ký tự đặc biệt hoặc là biến động: ${config["db.url"]}, ${map[requestParam]}

Các toán tử hỗ trợ

LoạiToán tửTương đương
Số học+, -, *, /, %div, mod
So sánh==, !=, <, >, <=, >=eq, ne, lt, gt, le, ge
Logic&&, ||, !and, or, not
Kiểm tra rỗngemptyempty list, empty string, null

Đọc dữ liệu từ client

EL cung cấp các đối tượng ẩn để truy cập dữ liệu gửi từ phía người dùng:

  • ${param.username} → tương đương request.getParameter("username")
  • ${paramValues.hobby[0]} → lấy phần tử đầu tiên trong mảng tham số hobby
  • ${header["user-agent"]} → đọc giá trị header HTTP

Đọc dữ liệu từ server (các scope)

Khi viết ${userName}, JSP sẽ tìm lần lượt theo thứ tự: page → request → session → application. Nếu không tìm thấy, trả về chuỗi rỗng — không gây lỗi NullPointerException.

Ví dụ tích hợp với Spring MVC

Giả sử controller truyền dữ liệu qua Model:

@GetMapping("/dashboard")
public String showDashboard(Model model) {
    model.addAttribute("pageTitle", "Bảng điều khiển");
    model.addAttribute("activeUsers", userRepository.countActive());
    
    List<Employee> staff = employeeService.getTeam("engineering");
    model.addAttribute("teamMembers", staff);
    
    Department dept = departmentService.findById(5L);
    model.addAttribute("department", dept);
    
    return "dashboard/home";
}

Trong file JSP (home.jsp), sử dụng EL kết hợp JSTL:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<h1>${pageTitle}</h1>
<p>Số nhân viên đang hoạt động: ${activeUsers}</p>

<h2>Phòng ban: ${department.name} (ID: ${department.id})</h2>

<ul>
  <c:forEach var="member" items="${teamMembers}" varStatus="loop">
    <li>${loop.index + 1}. ${member.fullName} – ${member.role}</li>
  </c:forEach>
</ul>

Sử dụng giá trị EL trong JavaScript

Để đưa dữ liệu từ backend vào script, cần chú ý xử lý escape và kiểu dữ liệu:

<script>
// ✅ Đúng: Giá trị chuỗi được đặt trong dấu nháy kép
const deptName = "${department.name}";
const title = "${pageTitle}";

// ✅ Đúng: Số nguyên — không cần nháy nếu đảm bảo định dạng
const userCount = ${activeUsers};

// ⚠️ Cảnh báo: Không dùng trực tiếp cho danh sách — cần chuyển sang JSON
const teamData = ${teamMembers}; // Sai — gây lỗi cú pháp

// ✅ Đúng: Sử dụng JSTL để chuyển đổi an toàn
const teamJson = <c:out value="${teamMembers}" escapeXml="false"/>;
</script>

Thẻ: JSP EL JavaWeb SpringMVC JSTL

Đăng vào ngày 16 tháng 6 lúc 17:49