JSP
JSP (Jakarta Server Pages) là công nghệ Java được sử dụng để tạo ra các trang web động. JSP cho phép nhúng mã Java trực tiếp vào trong mã HTML.
Scriptlet
Scriptlet là nơi bạn có thể viết mã Java bên trong file JSP.
Cách 1
<% viết mã Java %>
Cách 2
<jsp:scriptlet>
viết mã Java
</jsp:scriptlet>
📌 Giải thích:
- Phần mã Java trong scriptlet sẽ được thực thi trên server.
- Không nên lạm dụng scriptlet, thay vào đó nên dùng JSTL và EL để giúp dễ nhìn và bảo trì.
Ví dụ
<%
int i = 0;
out.println("I is " + i);
%>
Declaration (Tuyên bố)
Declaration cho phép khai báo biến suốt vòng đời servlet hiện tại.
<%! int i = 0; %> <!-- Biến dùng chung -->
<%
i++; // Tăng giá trị biến i mỗi lần có request
out.println("Giá trị của i: " + i);
%>
📌 Chú ý:
- Dùng
<%! %>
khi thật sự cần biến dùng chung trên servlet hiện tại. - Nếu bạn restart server hoặc sửa file JSP, thì servlet sẽ được biên dịch lại và biến
i
sẽ reset về0
.
Expression
Expression được dùng để hiển thị giá trị ra trang web.
Today's date: <%= (new java.util.Date()).toLocaleString() %>
Comment
JSP Comment là phần chú thích không hiển thị ra HTML của trang.
<%-- This is JSP comment --%>
📌 Giải thích: Khác với HTML Comment <!-- -->
, JSP Comment không xuất hiện trong mã nguồn HTML trả về.
Directive
Directive dùng để cấu hình cách JSP engine xử lý trang JSP đó.
📌 Cú pháp chung của Directive:
<%@directiveName attributeName="value" %>
Có 3 loại directive chính trong JSP:
Tên Directive | Mục đích chính |
---|---|
page | Cấu hình cho toàn bộ trang JSP |
include | Nhúng nội dung file khác vào lúc biên dịch |
taglib | Khai báo thư viện thẻ (tag library – thường dùng với JSTL, custom tags) |
page
<%@page contentType="text/html" pageEncoding="UTF-8" %>
📌 Giải thích:
contentType
: kiểu nội dung (HTML, XML,...).pageEncoding
: mã hóa của trang (UTF-8, ISO,...).
include
<%@include file="file.jsp" %>
📌 Giải thích: Chèn nội dung file khác vào lúc biên dịch JSP, có chia sẻ biến khi chạy.
taglib
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
📌 Giải thích: Khai báo thư viện thẻ như JSTL để dùng các tag <c:if>
, <c:forEach>
,...
Action
Các action là các thẻ JSP dùng để thao tác hoặc điều khiển luồng trang JSP.
include
<jsp:include page="file.jsp" />
📌 Giải thích: Gọi file khác vào lúc thực thi (runtime), khác với include directive là tại compile time.
Cách truyền tham số:
<jsp:include page="product.jsp">
<jsp:param name="id" value="123" />
</jsp:include>
Trang product.jsp
sẽ nhận được tham số id
với giá trị "123"
giống như bạn truy cập URL sau:
product.jsp?id=123
Trong product.jsp
, bạn có thể lấy tham số bằng:
String id = request.getParameter("id");
Tình huống | Nên dùng |
---|---|
Giao diện chung, layout, footer, menu HTML cố định | <%@ include %> |
Nội dung thay đổi động theo thời gian (thời tiết, tin tức,...), người dùng (hồ sơ, giỏ hàng,...), request (kết quả tìm kiếm, chi tiết sản phẩm,...) | <jsp:include /> |
Implicit Objects (Các đối tượng ngầm định)
JSP cung cấp sẵn một số đối tượng để sử dụng trực tiếp mà không cần khai báo.
request
<%= request.getParameter("first_name") %>
📌 Giải thích: request
chứa thông tin từ HTTP request. Dùng để lấy dữ liệu từ form người dùng gửi lên.
response
<%
response.sendRedirect("https://tudienjp.com");
%>
📌 Giải thích: response
dùng để điều khiển phản hồi trả về trình duyệt. Ví dụ như chuyển hướng.
<%
// Set error code and reason.
response.sendError(407, "Need authentication!!!" );
%>
📌 Giải thích: Gửi mã lỗi HTTP và mô tả lỗi tới client.
out
<%
out.print("Hello")
%>
📌 Giải thích: out
là đối tượng để ghi dữ liệu ra trang HTML gửi về trình duyệt. Tương tự như System.out.print
nhưng dành cho jsp.
Điều kiện (Conditions)
if...else
trong Scriptlet
<% int x = 10; %>
<% if (x > 5) { %>
<p>x is greater than 5</p>
<% } else { %>
<p>x is not greater than 5</p>
<% } %>
📌 Giải thích: Dùng cú pháp Java thuần bên trong Scriptlet để xử lý điều kiện.
if...else
trong JSTL
<!-- code in JSTL -->
<c:set var="x" value="10" />
<c:if test="${x > 5}">
<p>x is greater than 5</p>
</c:if>
<c:if test="${x <= 5}">
<p>x is not greater than 5</p>
</c:if>
📌 Giải thích: JSTL (<c:if>
) dùng để kiểm tra điều kiện mà không cần dùng Java thuần, giúp mã rõ ràng hơn và tách biệt logic.
switch...case
trong Scriptlet
<p>
<%
switch(day) {
case 0:
out.println("Sunday");
break;
case 1:
out.println("Monday");
break;
...
default:
out.println("Saturday");
}
%>
</p>
📌 Giải thích: Sử dụng cú pháp Java switch...case
để kiểm tra nhiều giá trị.
switch...case
với JSTL
<p>
<c:choose>
<c:when test="${day == 0}">Sunday</c:when>
<c:when test="${day == 1}">Monday</c:when>
...
<c:otherwise>Saturday</c:otherwise>
</c:choose>
</p>
📌 Giải thích: c:choose
, c:when
, c:otherwise
là cú pháp JSTL tương đương với switch-case trong Java.
Loop (Vòng lặp)
for
trong Scriptlet
<%
String[] colors = {"red", "green", "blue"};
%>
<ul>
<% for (int i = 0; i < colors.length; i++) { %>
<li><%= colors[i] %></li>
<% } %>
</ul>
📌 Giải thích: Dùng vòng lặp for
trong mã Java để duyệt mảng colors
và hiển thị từng phần tử dưới dạng danh sách HTML.
forEach
trong JSTL
<ul>
<c:forEach var="color" items="${colors}">
<li>${color}</li>
</c:forEach>
</ul>
📌 Giải thích: c:forEach
là vòng lặp trong JSTL, giúp lặp qua mảng hoặc danh sách mà không cần dùng Java thuần, rõ ràng và dễ đọc hơn.
while
trong Scriptlet
<%
String[] colors = {"red", "green", "blue"};
int i = 0;
%>
<ul>
<% while (i < colors.length) { %>
<li><%= colors[i] %></li>
<% i++; %>
<% } %>
</ul>
📌 Giải thích: Vòng lặp while
trong Java để duyệt mảng colors
tương tự như for
, chỉ khác về cấu trúc.