hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API

Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 4/12: Tổ chức giao diện Thymeleaf · Bài 08/28 · Biên soạn tháng 10/2026.

← Bài 07 · Mục lục 12 chương · Bài 09 →

Mục lục

  • Mục tiêu bài học
  • Tránh sao chép phần đầu trang cho mọi template
  • th:replace khác th:insert
  • Đặt CSS ở đúng nơi
  • Menu và thao tác thay đổi trạng thái
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Tách phần giao diện dùng chung, tạo URL tài nguyên đúng và xây layout gọn để các trang nhất quán.

Tránh sao chép phần đầu trang cho mọi template

Danh sách, chi tiết và biểu mẫu đều cần charset, viewport, tiêu đề, CSS và thanh điều hướng. Nếu chép nguyên các phần đó vào từng tệp, một lần đổi menu sẽ phải sửa nhiều nơi và dễ bỏ sót. Thymeleaf fragment cho phép đặt phần dùng chung vào một tệp rồi tham chiếu từ các trang.

Mã mẫu dùng templates/fragments/layout.html với fragment head(title) và nav. Đây là cơ chế fragment có sẵn của Thymeleaf, không cần cài thêm layout dialect. Khi mới học, giữ ít thành phần dùng chung sẽ dễ hiểu hơn một hệ thống layout nhiều tầng.

<!-- templates/fragments/layout.html: phần khai báo fragment -->
<head th:fragment="head(title)">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title th:text="${title}">HVC Academy</title>
  <link rel="stylesheet" th:href="@{/css/app.css}">
</head>

<!-- Trong một trang dùng fragment -->
<head th:replace="~{fragments/layout :: head('Danh sách khóa học')}"></head>
<nav th:replace="~{fragments/layout :: nav}"></nav>

th:replace khác th:insert

th:replace thay chính phần tử hiện tại bằng fragment; th:insert chèn fragment vào bên trong phần tử. Dùng nhầm có thể tạo head lồng head hoặc nav lồng nav không cần thiết. Sau khi render, hãy xem DOM thực tế để kiểm tra cấu trúc, không chỉ nhìn tệp nguồn.

Tham số title giúp mỗi trang có tiêu đề riêng dù dùng chung phần head. Những phần có nội dung đặc thù vẫn đặt trong template của trang. Không biến mọi đoạn HTML ngắn thành fragment nếu việc đó làm khó tìm nội dung hơn.

Đặt CSS ở đúng nơi

Tệp src/main/resources/static/css/app.css được phục vụ qua URL /css/app.css. Không có /static trong URL công khai; static là tên thư mục quy ước trong nguồn. Template dùng @{/css/app.css} để xây URL phù hợp với context path của ứng dụng.

SecurityConfig cho phép /css/** truy cập công khai, nên trang đăng nhập hoặc người chưa đăng nhập cũng tải được giao diện. Nếu HTML hiện nhưng CSS 302 về /login, hãy kiểm tra Security và Network trước khi kết luận file CSS không tồn tại. Không bỏ bảo mật toàn ứng dụng để chữa một đường dẫn tài nguyên.

Menu và thao tác thay đổi trạng thái

Liên kết xem trang có thể dùng GET. Đăng xuất trong mẫu là form POST với th:action, vì nó làm thay đổi phiên đăng nhập và cần CSRF token. Không chuyển logout thành một đường dẫn GET chỉ để menu dễ bố trí. CSS có thể làm form nhỏ gọn mà vẫn giữ đúng phương thức HTTP.

Layout cũng cần dùng được trên màn hình nhỏ: viewport đúng, chiều rộng nội dung có giới hạn, input không tràn và bảng có cách xử lý khi nhiều cột. Bản mẫu dùng CSS tối giản để người học nhìn rõ cấu trúc; bạn có thể thay giao diện sau khi luồng dữ liệu ổn định. Luôn kiểm tra ít nhất trang danh sách, form và trang lỗi sau khi đổi fragment dùng chung.

Lỗi thường gặp và lưu ý

  • Không đặt CSS trong templates rồi chờ Spring phục vụ nó như tài nguyên tĩnh.
  • Cẩn thận cấu trúc HTML lồng sai khi dùng th:insert hoặc th:replace.

Ghi nhớ

Fragment giúp giao diện nhất quán; tài nguyên tĩnh có đường dẫn công khai rõ ràng và quy tắc Security riêng.

Tài liệu đối chiếu

  • Thymeleaf template layouts

← Bài 07 · Mục lục 12 chương · Bài 09 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway
Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API
Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×