จาก Blog ตอนที่ที่ได้สร้างเว็บที่มี CRUD ต่อกับฐานข้อมูลแล้ว แต่ยังพบปัญหาว่ามันยังมี Code ที่ซ้ำซ้อนในส่วนของ UI เช่น
- ไฟล์ index.html ครับ
- และไฟล์ editPerson.html เป็นต้น
พระเอกที่จะมาช่วยเราในครั้งนี้ คือ thymeleaf-layout-dialect
- ถ้าใครเคยเรียน Design Pattern มาสิ่งที่ thymeleaf ทำ คือ View แต่ละอันทำหน้าที่ของตัวเองพอ แสดง Content ในส่วนที่รับผิดชอบ ส่วนการจัดการพวกเมนู และอื่นๆ จะถูกเพิ่มความสามารถ(Declorate) เข้าไปจากตัว Layout ครับ
- ตัว Design Pattern ที่ผมหมายถึง คือ Decorator pattern ครับ
มาดูโจทย์กันก่อน
- เว็บจาก Blog ตอนที่แล้วครับ ที่ผมชี้จุดไปว่าเห้ยมันมี Code ซ้ำ
- ผมแยก 2 ส่วนนะครับ Header, Content และเพิ่ม Footer ตามรูปครับ
สิ่งที่ต้องมี
เว็บตัวอย่างแหละ ปกติผมจะอ้างอิงจาก Blog ตอนก่อน แต่จะสร้างใหม่ก็ได้นะ และมาตรวจสอบ Dependency ว่าจะต้องมีของดังนี้
- thymeleaf
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- thymeleaf-layout-dialect
<dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> </dependency>
Let's Refactoring
- สร้างโพลเดอร์ layouts ใน ก่อนครับ วางโครงสร้างไว้ก่อน เช่น แยก Layout ของหน้าจอ User กับ Admin ครับ
- สร้างไฟล์ในโพลเดอร์ layouts ชื่อ mainLayout.html ครับ
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"> <head th:replace="fragments/header :: header"> <title>Header</title> </head> <body> <div class="container" id="mainContent"> <div layout:fragment="content"></div> </div> <div th:replace="fragments/footer :: footer"></div> </body> </html>
จากไฟล์ mainLayout.html ครับ
- สังเกตุดีๆครับ ว่าในแท๊ก <html> ต้องมีการอ้างถึง xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout" ครับ เพื่อให้ Engine ของ Thymeleaf รู้ครับ
- ตรงแท๊ก <head> มีกำหนด header ไว้ครับ โดยจะอ้างอิงไฟล์ใน fragments/header ครับ
- ส่วนแท๊ก <div layout:fragment="content"> เป็นช่องว่างๆครับ เอาไว้นำ html จากหน้าจออื่นๆ เช่น มาเสียบแทนครับ
- ตรงแท๊ก <div> มีกำหนด footer ไว้ครับ โดยจะอ้างอิงไฟล์ใน fragments/footer ครับ
โครงสร้าง ณ ตอนนี้ครับ
resources -> static -> css - พวก CSS จะเก็บในนี้ -> bootstrap.xxx.css ใส่ไฟล์เกี่ยวกับ bootstrap -> person.css -> js - พวก javascript จะเก็บไว้ในนี้ -> bootstrap.xxx.js ใส่ไฟล์เกี่ยวกับ bootstrap -> templates -> fragments -> header.html -> footer.hmtl -> layouts -> mainLayout.html (เพิ่มเข้ามาใหม่) -> person -> persons.html -> editPerson.html -> viewPerson.html -> owner.html -> index.html
มาแก้ไขไฟล์อื่นๆครับ ยกตัวอย่างเฉพาะของ
- header อันนี้มีการเพิ่ม th:fragment="header" เพื่อบอก Script ภายใต้แท๊กที่สนใจถูกเอาไปแทนในไฟล์ mainLayout.html ครับ ในส่วน header
- footer อันนี้มีการเพิ่ม th:fragment="footer" เพื่อบอก Script ภายใต้แท๊กที่สนใจถูกเอาไปแทนในไฟล์ mainLayout.html ครับ ในส่วน footer
- editPerson มีการเพิ่ม layout:fragment="content" เพื่อบอก Script ภายใต้แท๊กที่สนใจถูกเอาไปแทนในไฟล์ mainLayout.html ครับ ในส่วน content
ไฟล์ที่เสร็จแล้วครับ เพิ่ม Layout >> https://naiwaen.debuggingsoft.com/2018/09/spring-%E0%… · pingkunga/LearnSpringBoot@95e8c29 (github.com)
Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.