Thymeleaf
Last updated
Was this helpful?
Last updated
Was this helpful?
Thymeleaf là một Java Template Engine. Có nhiệm vụ xử lý và generate ra các file HTML, XML, v.v..
Các file HMTL do Thymeleaf tạo ra là nhờ kết hợp dữ liệu và template + quy tắc để sinh ra một file HTML chứa đầy đủ thông tin.
Việc của bạn là cung cấp dữ liệu và quy định template như nào, còn việc dùng các thông tin đó để render ra HTML sẽ do Thymeleaf giải quyết.
Cú pháp của Thymeleaf sẽ là một attributes (Thuộc tính) của thẻ HTML và bắt đầu bằng chữ th:
.
Với cách tiếp cận này, bạn sẽ chỉ cần sử dụng các thẻ HTML cơ bản đã biết mà không cần bổ sung thêm syntax hay thẻ mới như JSP truyền thống.
Ví dụ:
Để truyền dữ liệu từ biến name
trong Java vào một thẻ H1
của HTML.
Chúng ta viết thẻ H1 như bình thường, nhưng không chứa bất cứ text nào trong thẻ. Mà sử dụng cú pháp th:text="${name}"
để Thymeleaf lấy thông tin từ biến name
và đưa vào thẻ H1
.
Kết quả khi render ra:
thuộc tính th:text
biến mất và giá trị biến name
được đưa vào trong thẻ H1
.
Đó là cách Thymeleaf hoạt động.
Trong bài trước, tôi đã demo cách sử dụng đối tượng Model
. Bây giờ tôi sẽ nói kĩ hơn một chút.
Model
là đối tượng lưu giữ thông tin và được sử dụng bởi Template Engine để generate ra webpage. Có thể hiểu nó là Context
của Thymeleaf
Model
lưu giữ thông tin dưới dạng key-value.
Trong template thymeleaf, để lấy các thông tin trong Model
. bạn sẽ sử dụng Thymeleaf Standard Expression
.
${...}
: Giá trị của một biến.
*{...}
: Giá trị của một biến được chỉ định (sẽ giải thích ở dưới)
Ngoài ra, để lấy thông tin đặc biệt hơn:
#{...}
: Lấy message
@{...}
: Lấy đường dẫn URL dựa theo context của server
Nói tới đây có lẽ hơi khó hiểu, chúng ta sẽ dùng ví dụ để hiểu rõ từng loại Expression.
Trên Controller bạn đưa vào một số giá trị:
Để lấy giá trị của biến today
, tôi sử dụng ${...}
Đoạn expression trên tương đương với:
*{...}
- Variables Expressions on selectionsDấu *
còn gọi là asterisk syntax
. Chức năng của nó giống với ${...}
là lấy giá trị của một biến.
Điểm khác biệt là nó sẽ lấy ra giá trị của một biến cho trước bởi th:object
Còn ${...}
sẽ lấy ra giá trị cục bộ trong Context
hay Model
.
Vậy đoạn code ở trên tương đương với:
#{...}
- Message ExpressionVí dụ, trong file config .properties
của tôi có một message chào người dùng bằng nhiều ngôn ngữ.
Thì cách lấy nó ra nhanh nhất là:
Đoạn text tiếng việt bên trong thẻ p
sẽ bị thay thế bởi thymeleaf khi render #{home.welcome}
.
@{...}
- URL Expression@{...}
xử lý và trả ra giá trị URL theo context của máy chủ cho chúng ta.
Ví dụ:
Nếu bắt dầu bằng dấu /
thì nó sẽ là Relative URL và sẽ tương ứng theo context của máy chủ của bạn.
Chúng ta sẽ tạo ra một trang web đơn giản để hiểu các loại Expression trong Thymeleaf.
pom.xml
Cấu trúc thư mục:
Cấu hình thymeleaf
Chúng ta sẽ cấu hình ứng dụng bằng file application.properties
.
application.properties
Chức năng messages
Các trang website hỗ trợ đã ngôn ngữ (i18n) thì các message sẽ được lưu dưới dạng key-value. Và tùy theo từng vùng địa lý mà chọn sử dụng value cho hợp lý.
Thymeleaf sẽ tự làm điều này cho chúng ta, vì ở trên chúng ta đã cấu hình cho nó vị trí lưu trũ các messages này rồi.
Ví dụ:
Tôi có một câu chào đơn giản cho 2 vùng và US và VN.
i18n/messages_vi.properties
i18n/messages_en.properties
Static & Templates
Làm Web thì không thể thiếu css
và javascript
. Các file này sẽ được lưu tại thư mục resources/static
.
File .html
là dạng template sử dụng để render ra webpage và trả về cho người dùng. Nó sẽ được lưu tại thư mục resources/templates
Thymleaf sẽ tự biết tìm đường tới những tài nguyên này.
index.html
index.html
sẽ là file mặc định mà Thymeleaf tìm đầu tiên và trả về mỗi khi người dùng vào địa chỉ /
hay https://localhost:8085/
mà chúng ta không cần config gì cả.
Trong index.html
tôi sẽ:
Gọi ra bootstrap.css
và bootstrap.js
trong thư mục resource/static
bằng expression @{...}
Hiển thị dòng chữ chào loda.hello
trong thư mục resource/i18n
bằng expression #{...}
index.html
Chạy thử 1.
Sau khi config và tạo ra file index.html
là chúng ta đã có một trang Web cơ bản rồi.
Hãy chạy thử ứng dụng Spring Boot của mình.
App.java
Truy cập vào địa chỉ http://localhost:8085/
Ứng dụng hiện ra dòng chữ chào mừng lấy từ messages
và button được trang trí nhờ bootstrap trong static
.
Thêm @Controller cho path /profile
Bây giờ chúng ta sẽ bổ sung thêm @Controller
để handle các request tới địa chỉ /profile
.
Tại đây, tôi có sử dụng Lombok, hãy dám chắc bạn biết nó trước khi lập trình Spring Boot
Info.java
WebController.java
Sau đó chúng ta tạo thêm template profile.html
để xử lý các thông tin trong Model
.
resources/templates/profile.html
Ở đây, chúng ta sử dụng:
${...}
để lấy giá trị của biến lodaProfile
trong Model
*{...}
để lấy giá trị của biến info
đã chỉ định,
Chạy thử lần 2.
Chúng ta chạy lại chương trình lần nữa và truy cập vào địa chỉ http://localhost:8085/
.
Click vào Button Loda Profile. Trình duyệt sẽ đi tới đại chỉ http://localhost:8085/profile
Hiển thị ra toàn bộ thông tin.
Vậy là chúng ta đã thành công. Một số demo thuộc tính cần dùng: