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ử . và []
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ại | Toá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ỗng | empty | empty 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 đươngrequest.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>